エンジニア

なんくるないさ

「このブログはアフィリエイト広告を利用しています」

データ分析初心者が家の値段予測(機械学習)をしてみた

とあるcsvを渡されてこれでpriceの推測してね。という課題をみつけたので、やってみる

前処理

まずはデータの中身をみるところから

import pandas as pd
df=pd.read_csv("Price.csv")
pd.set_option('display.max_columns', 100)
df.head(10)

f:id:jump1268:20190924221308p:plain f:id:jump1268:20190924221319p:plain

df.columns

→出力
Index(['id', 'date', 'price', 'bedrooms', 'bathrooms', 'sqft_living',
       'sqft_lot', 'floors', 'waterfront', 'view', 'condition', 'grade',
       'sqft_above', 'sqft_basement', 'yr_built', 'yr_renovated', 'zipcode',
       'lat', 'long', 'sqft_living15', 'sqft_lot15', 'date1'],
      dtype='object')

ん~よくわからん。
何がpriceに関係しているのかわからん

ということでみんな大好きヒートマップ相関係数をみてみることに

%matplotlib inline
df.corr()
import seaborn as sns
#sns.heatmap(df.corr(), vmax=1, vmin=-1, center=0, annot=True)
sns.heatmap(df.corr(), vmax=1, vmin=-1, center=0
           )

f:id:jump1268:20190924221806p:plain

ん~細かすぎてわからん。idが関係ないのはわかる(当たり前。)
しかしyr_builtとかの相関が0になっているのは全く理解できない。
あとdateが数字じゃないから相関が計算できてない。。

とりあえず、dateの月だけは残してみる。
(家の価格はさすがに月日に相関あるでしょ?、引っ越しシーズンは高くなりそう?)

df_date=[]
for i in range(len(df)):
    df_date.append(int(df["date"][i][4:6]))
df["date_int"]=df_date

これでdfをみると新しくdate_intというカラムができた
f:id:jump1268:20190924222853p:plain

このまま相関関係みるより、一回正規化したほうが良いのかと思い 正規化してみる

for i in range(len(df_.columns)):
    s = df_[df_.columns[i]]
    df_[df_.columns[i]] = (s - s.min()) / (s.max() - s.min())

これで全部のカラムを0~1に変換できる f:id:jump1268:20190924223240p:plain

改めてヒートマップ相関係数を見てみる

%matplotlib inline
df_.corr()
import seaborn as sns
#sns.heatmap(df.corr(), vmax=1, vmin=-1, center=0, annot=True)
sns.heatmap(df_.corr(), vmax=1, vmin=-1, center=0
           )

f:id:jump1268:20190924223423p:plain

f:id:jump1268:20190924224412p:plain

えぇ、date関係ないの?そんなことあるの?

まあ仕方ない 関係がありそうなカラムを見ていく

f:id:jump1268:20190924224817p:plain

ふ~ん(yr_builtとかzip_codeとか関係ありそうなのに?)

とりあえず0.3以上のやつだけでヒートマップつくる

df_before_2=df[["price","sqft_living","view","sqft_basement","bedrooms","lat","bathrooms","floors","grade","sqft_above","sqft_living15"]]
%matplotlib inline
df.corr()
import seaborn as sns
#sns.heatmap(df.corr(), vmax=1, vmin=-1, center=0, annot=True)
sns.heatmap(df_before_2.corr(), vmax=1, vmin=-1, center=0,annot=True
           )

f:id:jump1268:20190924225325p:plain

学習

train_df=df_before_2[:15000]
test_df = df_before_2[15000:]
train_x=train_df[["sqft_living","view","sqft_basement","bedrooms","lat","bathrooms","floors","grade","sqft_above","sqft_living15"]]
test_x=test_df[["sqft_living","view","sqft_basement","bedrooms","lat","bathrooms","floors","grade","sqft_above","sqft_living15"]]

train_y=train_df["price"]
test_y=test_df["price"]
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
lr = LinearRegression(normalize=True)
lr.fit(train_x,train_y)
pre_y=lr.predict(test_x)
import matplotlib.pyplot as plt 
plt.figure(figsize=(10,6),dpi=100)
plt.plot(test_y,c="r")
plt.plot(pre_y,c="b")
plt.show()

f:id:jump1268:20190924230504p:plain

!?!?!??

ん~なんだこれは 学習できているかわからんぞ

次回はもっとちゃんとやってみます