Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

scikit-learnの回帰分析でマンション価格を予測する

scikit-learnの回帰分析で緯度、標高から気温を予測すると同じく、scikit-learnで重回帰分析を行います。海浜幕張駅の中古マンション価格を題材に、説明変数として駅からの徒歩時間、広さ、築年数、目的変数としてマンション価格を用います。
すなわち説明変数x1,x2,x3をそれぞれ徒歩時間(分)、広さ(m2)、築年数(年)とし、目的変数yをマンション価格(万円)として以下式
y=ax1+bx2+cx3+d
の係数a,b,c、切片dを重回帰分析により求め、適当な説明変数x1,x2,x3を与えた時に、マンション価格yを予測できるようにします。

準備

海浜幕張駅の中古マンション38件の情報をインターネット上から入手、徒歩時間(分)、広さ(m2)、築年数(年)、マンション価格(万円)の順にデータを並べ一csvファイルとし、ファイル名 'apartment.csv' でjupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • scikit-learn 0.19.2
コード

学習用csvファイルを読み出し重回帰分析を実施し、係数・切片・決定係数(R2)を表示します。また説明変数として以下を与えた際のマンション価格を予測します。

徒歩時間 5分、広さ120m2、築年数 3年
徒歩時間10分、広さ 80m2、築年数10年
徒歩時間15分、広さ 30m2、築年数20年

import numpy as np
from sklearn import linear_model

data = np.loadtxt('apartment.csv', delimiter=',',dtype=float) #学習データのCSVファイル読み込み
x1_x2_x3 = data[:, 0:3]  # 説明変数(駅からの時間、面積、築年数)
y = data[:, 3:4]  # 目的変数(物件価格)

model = linear_model.LinearRegression()  # 学習モデルとして最小二乗法を用いる
model.fit(x1_x2_x3,y)  # 説明変数(駅からの時間、面積、築年数) vs 目的変数(物件価格)で学習
print(model.coef_)  # 線形回帰式の係数の表示
print(model.intercept_)  # 線形回帰式の切片の表示
print(model.score(x1_x2_x3,y))  # 線形回帰式の決定係数の表示

x1_x2_x3_predict = [[5,120,3],[10,80,10],[15,30,20]]  #徒歩5分100平米築3年、徒歩10分80平米築10年、徒歩15分30平米築20年の説明変数
predict_result = model.predict(x1_x2_x3_predict)  #予測の実施
print(predict_result)  #予測結果の表示
実行結果

[ -52.62951061 50.2204353 -102.00007442]
[2036.88939788]
0.5199453414982327
[[7494.19385799]
[4508.22837184]
[ 714.05830939]]

求めた線形回帰式の係数より、各説明変数と目的変数の関係が分かります。すなわち
徒歩1分増える   価格は 53万円下がる
広さ1平米増える  価格は 50万円上がる
築年数が1年増える 価格は102万円下がる
また、決定係数は0.52であり、あまり良い当てはまりではありません。学習データの数を38個から増やす、もしくは駅からの時間・面積・築年数以外のパラメーターを考える必要があるかもしれません。
説明変数を与えた際の予測結果は以下の通りでそれっぽいマンション価格が返されています。
徒歩時間 5分、広さ120m2、築年数 3年 --> 7494万円
徒歩時間10分、広さ 80m2、築年数10年 --> 4508万円
徒歩時間15分、広さ 30m2、築年数20年 --> 714万円

以下のサイトを参考にさせていただきました

Python でデータサイエンス>>scikit-learn で線形回帰 (単回帰分析・重回帰分析)
Scikit-learn で線形回帰

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村