医mportブログ

雑記っき

機械学習で家の値段の決定要因を調べてみた

こんにちは。

今回は、機械学習プログラムを用いて重回帰分析を実際にやってみました。
こういうのって一度それなりのプログラム書けばあとはおんなじようなプログラムでマイナーチェンジで済むので財産としてローカルに残しておく次第です。

さて、今回はKaggleにあるDatasetsのうちのこちらを用いました

www.kaggle.com

CSVファイルをダウンロードして、いざスタート。


その都度プログラムを確認したかったので今回はJupyter Notebookを使って一行一行確認しながらやっていきました。


ひとまずデータの中身を確認しましょう

import pandas as pd
house = pd.read_csv('train.csv'
                   )
house.head()

すると、

f:id:doinakadoctor:20190830174714p:plain

こんな具合でどんなデータが揃ってるか見れます。

次に、こんな便利な関数があることも記しておきます。

house.describe()

なんとこの一言だけで平均、最大最小、標準偏差などなど一気に出してくれます。

f:id:doinakadoctor:20190830175311p:plain

とりあえず必要なモジュールをインポート

import pandas as pd 
import matplotlib.pyplot as plt 
from sklearn.cross_validation import train_test_split 
from sklearn import linear_model 
from sklearn.metrics import r2_score 
import warnings 
warnings.filterwarnings('ignore') 

%matplotlib inline

データを訓練用と検証用にわける

path = 'train.csv' 
house= pd.read_csv(path)

# 目的変数と説明変数を作成
y = house['SalePrice']


X = house[['OverallQual', 'YearBuilt', 'TotalBsmtSF', 'GrLivArea']]

# 学習用、検証用データに分割
(X_train, X_test, y_train, y_test) = train_test_split(X, y, test_size = 0.2, random_state = 5)

今回のデータでは、全部の項目を上げると煩わしいので
目的変数はSalePriceとして、
説明変数は
'OverallQual':Overall material and finish quality
'YearBuilt' :Original construction date
'GarageCars':Size of garage in car capacity
'GrLivArea':Above grade (ground) living area square feet

の4要素を説明変数としてみて、どれが一番家の値段を引き上げる要因なのかを検討してみました。

#回帰モデル
model = linear_model.LinearRegression()

#モデルの学習
model.fit(X_train, y_train)

fit関数でサクッと学習です

ではどの要素が相関が強いかみてみましょう

print(pd.DataFrame({"Name":['OverallQual', 'YearBuilt', 'GarageCars', 'GrLivArea'],"Coefficients":model.coef_}).sort_values(by = 'Coefficients').round(4))

この表示結果がこちら

f:id:doinakadoctor:20190831084701p:plain

どうやらOverallQual:Overall material and finish qualityが主要因で、今回選択した中だとGrLivArea:Above grade (ground) living area square feetが家の値段引き上げ要因にはもっともならないという結論に至りました

ちなみにバリデーションデータとの比較を最後にきちっとやって

#予測値の算出
y_train_pred = model.predict(X_train) 
y_test_pred = model.predict(X_test) 

#決定係数を表示
print('R2(Train) : % 0.3f' % r2_score(y_train,  y_train_pred))
print('R2(Test) : % 0.3f' % r2_score(y_test, y_test_pred))

#グラフを描画する
plt.scatter(y_train, y_train_pred)
plt.scatter(y_test, y_test_pred)
plt.show()

f:id:doinakadoctor:20190831090208p:plain

レーニングデータと検証用データでそんなに相違はないようです

こんな感じで重回帰分析をぶん回して今後も遊んでいこうと思います!