2次元のデータに対して単回帰分析を行う。
データ取得
必要なモジュールのインポート
1 2 3 4 5 6 7 8 9 10 |
import matplotlib.pyplot as plt from sklearn.datasets import load_boston import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression %matplotlib inline |
データのロード
1 2 3 4 5 |
#LSTATと住宅価格の中央値の相関の可視化 X=pd.DataFrame(boston.data[:,:], columns=boston.feature_names) y=boston.target[:] |
カラムの説明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
CR:人口1人当たりの犯罪発生数 ZN:25,000平方フィート以上の住居区画の占める割合 INDUS:小売業以外の商業が占める面積の割合 CHAS:チャールズ川によるダミー変数 (1: 川の周辺, 0: それ以外) NOX:NOxの濃度 RM:住居の平均部屋数 AGE:1940年より前に建てられた物件の割合 DIS:5つのボストン市の雇用施設からの距離 RAD:環状高速道路へのアクセスしやすさ TAX:$10,000ドルあたりの不動産税率の総計 PTRATIO:町毎の児童と教師の比率 B:町毎の黒人(Bk)の比率を次の式で表したもの。 LSTAT:給与の低い職業に従事する人口の割合 target:住宅価格の中央値 |
1 2 3 |
X.head() |
CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.00632 | 18.0 | 2.31 | 0.0 | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 396.90 | 4.98 |
1 | 0.02731 | 0.0 | 7.07 | 0.0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 396.90 | 9.14 |
2 | 0.02729 | 0.0 | 7.07 | 0.0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2.0 | 242.0 | 17.8 | 392.83 | 4.03 |
3 | 0.03237 | 0.0 | 2.18 | 0.0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 394.63 | 2.94 |
4 | 0.06905 | 0.0 | 2.18 | 0.0 | 0.458 | 7.147 | 54.2 | 6.0622 | 3.0 | 222.0 | 18.7 | 396.90 | 5.33 |
メソッド
- LinearRegression:回帰分析用モジュール
- train_test_split:学習データとテストデータに分割するモジュール
可視化
- x, y : x軸、y軸のデータ
- s : サイズ
- c : 色
- mark : マーカーの形()
- cmap : カラーマップ(cがfloatのときのみ有効)
- alpha : 透明度(0-1)
- linewidth : 枠線の太さ
- edgecolors : 枠線の太さ
1 2 3 4 5 |
x = X['LSTAT'] plt.scatter(x, y, s=10, c="blue", alpha=0.5, marker="*", linewidths="1",edgecolors="black"); |

学習データとテストデータに分割
1 2 3 |
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0) |
1 2 3 4 5 6 7 8 9 10 11 12 |
#各データのサイズを表示 print('x_train.shape : {}'.format(x_train[:,None].shape)) print('y_train.shape : {}'.format(y_train.shape)) print('x_test.shape : {}'.format(x_test[:,None].shape)) print('y_test.shape : {}'.format(y_test.shape)) #x_train.shape : (404, 1) #y_train.shape : (404,) #x_test.shape : (102, 1) #y_test.shape : (102,) |
単回帰分析
scikit learnでは、引数を行列で受けとることを想定しているのでx_train[:,None]とする
1 2 3 4 5 |
#単回帰の実行 lin_1d = LinearRegression() lin_1d.fit(x_train[:,None], y_train) |
結果のプロット
回帰直線を作る。
np.newaxis は,添え字指定の表記の中に用いる。
元の配列の大きさを維持する次元には : を指定し,新たに大きさが 1 の次元を追加するところには np.newaxis を指定する
1 2 3 4 5 6 7 |
px = np.arange(min(x_train), max(x_train),0.1)[:,np.newaxis] py = lin_1d.predict(px) #回帰結果のプロット plt.scatter(x,y) plt.plot(px,py,color='red'); |

決定係数の算出
学習データとテストデータに対して決定係数を算出し、回帰分析の結果を評価する。
1 2 3 4 5 6 7 8 9 |
score_1d_train = lin_1d.score(x_train[:,None],y_train) score_1d_test = lin_1d.score(x_test[:,None],y_test) print("train:%.2f"%(score_1d_train)) print("test:%.2f"%(score_1d_test)) # train:0.57 # test:0.43 |