Python scikit-learn2  線形回帰(単回帰)分析

はじめに

数量などの連続値をとる目的変数を予測するのに役立つのが回帰分析です。この記事では、目的変数と説明変数の関係をモデル化する線形回帰をScikit-learnライブラリを使って行う方法を解説します。  

線形回帰

線形回帰は、連続値をとる説明変数 xと目的変数 y と説明変数 xの関係をモデル化するものです。説明変数が一つの場合は単回帰と呼びます。この場合変数xと変数yの関係をモデル化する線形モデルは以下の式で定義されます。 y=a0+a1y ここで、重みa0は切片、重みa1は説明変数の係数を表します。この式のように、目的変数が説明変数の一次式で表現されるとき、線形回帰の目的は説明変数と目的変数の散布図で、データの分布の仕方を最もよく表現している一次式を見つけることです。  

線形回帰モデル

scikit-learnで線形回帰をするには、linear_modelのLinearRegressionモデルを使います。fitメソッド、predictメソッド、scoreメソッドを利用します。

  • fitメソッド:線形モデルの重みを学習
  • predictメソッド:線形モデルから目的変数を予測

データを読み込む

scikit-learnには、学習用のデータセットがいくつか用意されています。今回はボストン市郊外の地域別住宅価格データを用いて分析してみます。データセットを読み込んで、PandasのDataFrameに変換し、単回帰分析を行います。panndas、matplotlibのライブラリの読み込み、インライン表示コマンドを入力し、ボストンのデータをロードします。

ロードしたデータの概要を見てみましょう。

以下のように表示されます。

・データセットを読み込んで、PandasのDataFrameに変換します。(8行目) ・目的変数(boston.target)をDataFrameに’MEDV(住宅価格)’として追加します。(9行目)

データの先頭5行を表示します。


boston.jpg   RM(平均部屋数)とMEDV(住宅価格)の関係を分析します。 ・plt.scatterコマンドでRMとMEDVの散布図をプロットします。マーカ色は赤(11行目) ・plt.titleコマンドで図のタイトルを指定します。 ・plt.xlabel、ylabelコマンドでx軸、y軸のラベルを指定します。 ・plt.grid()でグリッド表示を有効にします。 ・plt.show()グラフを表示します。

RMとMEDVの散布図が作成されました。これをみると正の相関があるように見受けられます。ではこれを分析して相関係数を算出してみましょう。  

Corr()メソッドで算出係数を求める

・Pandasのcorr()メソッドで平均部屋数と住宅価格の相関係数をもとめます。

corr.jpg 相関係数は0.67で正の相関があることがわかりました。 以降では、目的変数y(MEDV)と説明変数y(RM)の関係を説明する線形回帰モデルを立ててみましょう。

線形回帰モデルをたてる

fitメソッドで重みを算出し線形回帰モデルを立てます。構築します。説明変数xと目的変数yはNumpyの配列を利用します。values属性の説明変数と目的変数の列からNumpyの配列を取り出します。 ・LinearRegressionモジュールをインポートします。(18行) ・lrオブジェクトにLinearRegressionモジュールを割り当てます。(20行) ・XにDataFrameからRMの値を抽出します。(21行) ・YにDataFrameからMEDVの値を抽出します。(22行) ・lrモジュールにfitメソッドを適用します。(23行) ・説明変数xの係数coefficientを出力します。(24行) ・切片interceptを出力します。(25行)

結果が出力されました。

説明変数の係数は9.10、切片は-34.67が得られました。

得られた係数、切片を用いて散布図上に回帰直線をオーバーレイします。回帰直線のプロットにはモデルに説明変数を与えたときの目的変数の値が必要になりますが、これはpredictメソッドを用いることで可能になります。 ・y=ir.predict(x)コマンドで回帰直線をプロットします。グラフ描画指示はplt.plotコマンドを使用してください。(29行)

まとめ

scikit-learnライブラリにあるサンプルデータを用いて線形回帰(単回帰)分析する方法について解説しました。たてたモデルが正しいかどうかを検証する方法についてはまた別のページで解説する予定です。