【AI】機械学習 by Python:回帰分析編④~説明変数と目的変数~

AI・機械学習

 前回

の続き。

 今回は、回帰分析において主要な変数「説明変数」と「目的変数」について説明する。
 下記に、解説対象のプログラムの実装例とその出力例を示しておく。

 

実装例

# モジュールのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import sklearn
from sklearn.linear_model import LinearRegression

# データセットのインポート
file=pd.read_csv('apartment.csv',encoding='cp932')
#データセットのサイズ確認
print('データセットのサイズ:',file.shape)

# 説明変数
X=file.iloc[:,1:]
# 目的変数
Y=file.iloc[:,0]

# 説明変数Xと目的変数を、学習データ(8割)とテストデータ(2割)に分割(random_stateは0)
X_train, X_test, Y_train, Y_test = sklearn.model_selection.train_test_split(X, Y, test_size=0.2, random_state=0)
# 分割の確認
print('分割の確認:',X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)

# 回帰分析実行
# インスタンスの作成
model = LinearRegression()
# モデルの作成
model.fit(X_train, Y_train)

# 回帰直線の確認
# 切片
print('切片の値 = ', model.intercept_)
# 係数
print('係数の値 = ', model.coef_)

# 学習データからの予測値
pred_train = model.predict(X_train)
# テストデータからの予測値
pred_test = model.predict(X_test)

# 結果確認
print('学習データの平均二乗誤差: ', np.mean((Y_train - pred_train) ** 2))
print('テストデータの平均二乗誤差: ', np.mean((Y_test - pred_test) ** 2))
print('決定係数:',model.score(X_test,Y_test))

# モデルを使った計算
Xs=35 # 部屋の広さ[m^2]
Xt=10 # 駅から建物までの所要時間[min]
Xo=5 # 築年数[year]
price=model.intercept_+model.coef_[0]*Xs+model.coef_[1]*Xt+model.coef_[2]*Xo
print('部屋の広さ',Xs,'m^2、徒歩',Xt,'分、築',Xo,'年の建物の部屋の家賃は約',round(price,1),'万円である。')

出力例

データセットのサイズ: (100, 4)
分割の確認: (80, 3) (20, 3) (80,) (20,)
切片の値 =  7.506892589329363
係数の値 =  [ 0.15930654 -0.10031788 -0.14080724]
学習データの平均二乗誤差:  0.0006406930013219009
テストデータの平均二乗誤差:  0.0009590840329186921
決定係数: 0.999959366829125
部屋の広さ 35 m^2、徒歩 10 分、築 5 年の建物の部屋の家賃は約 11.4 万円である。

 実際にプログラムを実行したい場合は、下記ボタンよりcsvファイル「apartment.csv」をダウンロードしてプログラムの保存先に保存すること。

環境は下記を想定。
OS:Windows10(64bit版)
Pythonインストール環境:Anaconda3
Pythonバージョン:3.7
エディタ:Jupyter Notebook


3. 説明変数と目的変数 

 コード説明に入る前に、説明変数と目的変数ってそもそも何かという話から。
 と言っても大層な話ではなく、以前の概説記事

で示したモデル式

\begin{align}
Y=A_{s}X_{s}+A_{t}X_{t}+A_{o}X_{o}+B \tag{1}\label{juukaiki1}
\end{align}

における\(X_{s},X_{t},X_{o}\)が説明変数、\(Y\)が目的変数だ。

 すなわち、最終的に回帰分析を使って予測したい変数(目的とする変数)を目的変数、目的変数を特徴づける変数(説明する変数)を説明変数と呼ぶわけだ。
 (今回の場合は、面積、駅からの所要時間、築年数という説明変数から、家賃という目的変数を求めたい。)

 

 では改めてコードを見てみる。

# 説明変数
X=file.iloc[:,1:]
# 目的変数
Y=file.iloc[:,0]

 上のコードが実行しているのは、前回取り込んだデータセット「apartment.csv」の内、
・目的変数(家賃)に該当するデータ群を変数Y
・説明変数(面積、駅からの所要時間、築年数)に該当するデータ群を変数X
に代入する操作だ。

 

データセット名.iloc[行番号(範囲) , 列番号(範囲)]

は、あるデータセットから特定のデータまたはデータ群を抽出するコードである。

 

 ただし、行番号および列番号の指定の仕方が若干厄介で、

・カウントは「0」スタート。(1行目は0行目になる。)
・範囲指定時は、範囲終了となる行、列番号に1をプラスする。

というルールがある。

 

 上記ルールを踏まえた上で、各パターンにおけるデータの抽出の仕方をまとめる。

a,bを0から始まる整数値として、
.iloc[a , b] ⇒ a行b列目のデータを取り出す。
.iloc[a:c , b:d] ⇒ a行目からc-1行目かつb列目からd-1列目までのデータ群を取り出す。
.iloc[a , :] ⇒ a行目のデータを全て取り出す。
.iloc[: , b] ⇒ b列目のデータを全て取り出す。
.iloc[a: , b] ⇒ a行目から最後の行かつb列目のデータ群を取り出す。
.iloc[:a , b] ⇒ 0行目からa-1行目かつb列目のデータ群を取り出す。
.iloc[a , b:] ⇒ a行目かつb列目から最後の列までのデータ群を取り出す。
.iloc[a , :b] ⇒ a行目かつ0列目からb-1列目のデータ群を取り出す。

 

 以上を踏まえて、例のコードを詳しく見ていくと次のようになる。

X=file.iloc[:,1:]

⇒データセット「file」の中の、1列目から最後の列までのデータを全て取り出し、そのデータ群を説明変数Xに代入するコード。
 「file」にはデータセット「apartment.csv」が格納されており、1列目から最後の列(3列目)まではそれぞれ、面積、駅からの所要時間、築年数のデータが入っている。

 

Y=file.iloc[:,0]

⇒データセット「file」の中の、0列目のデータを全て取り出し、そのデータ群を目的変数Yに代入するコード。
 「file」にはデータセット「apartment.csv」が格納されており、0列目には家賃のデータが入っている。

次回予告

 行番号と列番号の指定の仕方はまだ全然慣れない。
 使っていくうちに覚えるしかないか…

 次回は抽出した説明変数Xと目的変数Yを分割する作業を見ていく。

 

 END

 

 ※追記
 データの分割について執筆。


コメント

タイトルとURLをコピーしました