はじめに
単回帰分析のお勉強がてら, Kaggleのチュートリアル House Prices をやっていきます.
House Prices
https://www.kaggle.com/c/house-prices-advanced-regression-techniques
コンペ内容
導入
住宅購入者に地下の天井の高さとかから説明しないよね?
だけど, このデータセットを使えば寝室の数とかフェンスのあるなしよりも価格交渉にはるかに影響を与えていることがわかるよ.(要翻訳
目標
エイムズというアイオワ州にある都市の住宅のデータが与えられる.
それらを利用して各住宅の最終価格を予測する.
やってみる
ライブラリのインポート
入っているデータ内容の確認
# データの読み込み
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
# データの内容の確認
print(train.columns)
いっぱいありますね。。(79種類あるみたい
サイトのデータタブには各データの説明が書かれています.
ここから気になるデータを一つ選んで単回帰してみたいと思います.
予測するのは SalePrice なので一番それに関係ありそうなデータを選んでみます.
ザーッと見た感じ OverallQualが一番関係ありそうですね..
OverallQual:全体的な素材と仕上げの品質(google翻訳)
この値で単回帰してみます.
データの分析
とりあえず, OverallQual と SalePrice のデータを取り出します.
OverallQual = train['OverallQual']
SalePrice = train['SalePrice']
print(OverallQual)
print(SalePrice)
print(type(OverallQual))
print(type(SalePrice))
DataFrame型のtrainからそれぞれ一列取り出したのでSeries型になっています.
2つの値の相関行列を見てみましょう.
相関行列はDataFrame型じゃないと見れないので2つの値をくっつけてDataFrame型にします.
df = pd.concat([OverallQual, SalePrice], axis=1)
print(df)
concatメソッドを使うとSeries型をくっつけてDataFrame型にしてくれます.
axis=1は横方向につなげるための引数です.
print(df.corr())
相関係数は0.79ぐらいですね.
正の相関が強いみたいです.
単回帰分析
sklearnのLinearRegressionモデルを使って単回帰分析します.
LinearRegression
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
X = train[['OverallQual']].values
y = train['SalePrice'].values
reg = LinearRegression()
reg.fit(X, y)
X が [[]]
になっているのはLinearRegressionの引数の形に合わせるためです.
LinearRegressionインスタンスを生成し, fitメソッドで学習させます.
# 散布図の表示
plt.scatter(X, y)
# 予測した結果を追加
plt.plot(X, reg.predict(X), color='red')
# グラフの表示
plt.show()
matplotlibを使って学習結果を確認します.
scatterメソッドでデータの散布図を表示しています.
plotメソッドでは LinearRegressionのpredictメソッドで予測させ, その結果を表示しています.
reg.score(X, y)
scoreメソッドで決定係数を確認できます.
決定係数はデータに対して予測された回帰式の当てはまりの度合いを表し, 0~1の値です.
1に近いほどデータに当てはまっているということです.
今回は 0.625 でした.
X_test = test[['OverallQual']].values
y_pred = reg.predict(X_test)
print(y_pred)
testデータの OverallQual を使って SalePrice を予測します.
predictメソッドで予測し y_pred には予測結果が入っています.
test['SalePrice'] = y_pred
test[['Id','SalePrice']].to_csv('submission.csv',index=False)
最後に予測結果をtestデータに挿入して, IdとSalePriceだけを取り出しcsvファイルにします.
そして提出!
scoreは1.16083でした.
順位は大体4600位ぐらいですね.
このコンテストはscoreは小さいほうが良いです.
1位は0.00000..?? って感じですね。。
終わりに
一つの説明変数だけを使う単回帰分析をやってみました.
簡単にするためにかなり雑な解析ですが, 全体的な流れはつかめたと思います.
特にデータの型をあわせたり引数の形に合わせるように変形したりするので僕は最初つまづいたので, そこらへんを重点的に説明しました.
次は重回帰分析などをやってみたいと思います.