GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

SUUMO の中古物件情報を Tableau で分析してみる ~データ予測編~

さて、本日は 「SUUMO の中古物件情報を Tableau で分析してみる ~データ予測編~」です。データ収集編で SUUMO の情報をスクレイピング、データ分析編でその情報の分析をしましたが、今回は機械学習を使って販売価格の予測を行ってみようと思います。

なお、本シリーズは以下3エントリーにわたって SUUMO の中古物件情報を扱います。本エントリーはデータ予測編です。

  • データ収集編
    • 分析に必要なデータを収集します。
  • データ分析編
    • 収集したデータの分析を行います。
  • データ予測編
    • 機械学習を使用して物件価格の推論を行います。

使用する機械学習アルゴリズム

ランダムフォレストを使用します。以下エントリーでもランダムフォレストを使用していますが、この時は分類で使用しました。今回は回帰で使用します。

www.gis-py.com

関連エントリー

興味がある方はぜひ読んでみてください。

www.gis-py.com

www.gis-py.com

使用するデータ

データ を加工

処理の都合上、以下加工を行います。

  • ID 列追加
  • 販売価格列を一番最後に移動
  • ㎡ をを空白に置換(データ収集時に取り切れてなかったものがあったようです・・・)
  • 徒歩(分)、バス(分)が空白なレコードを削除
  • バルコニーが空白な場合、0に置換

f:id:sanvarie:20210522095137p:plain

フィールド

販売価格以外を学習に使用します。

フィールド名 説明
カテゴリ 中古マンション or 中古一戸建て
販売価格 販売価格
所在地 物件所在地
沿線 物件最寄沿線
最寄駅 物件最寄駅
徒歩(分) 物件から最寄駅までの徒歩時間。バスの場合は物件からバス停までの時間
バス(分) バス乗車時間。バスを使用しない場合は0
土地面積 土地面積。中古マンションは建物面積=土地面積とする
建物面積 中古一戸建てもしくは中古マンションの建物面積
バルコニー バルコニー面積。中古マンションのみ使用
間取り 物件の間取り
築年数 築年月から計算

予測するフィールド

販売価格を予測して、実際のデータと比較してみようと思います。

  • 販売価格

手順

  1. データ理解
  2. モデルの作成
  3. モデルの評価

環境

Windows10 64bit
Python3.8.5
Tableau Desktop Public Edition 2021.1.0

1.データ理解

販売価格を一億円以下に絞って確認します(その方がわかりやすいので)。

区ごとの販売価格分布

中古マンション

港北区の販売価格分布がやや高いことがわかります。

f:id:sanvarie:20210523075642p:plain

中古一戸建て

都筑区の販売価格分布が高いことがわかります。

f:id:sanvarie:20210523075749p:plain

建物面積と価格の散布図

中古マンション

あまり相関関係がないですね。 f:id:sanvarie:20210523075859p:plain

中古一戸建て

こちらもあまり相関関係がないですね。 f:id:sanvarie:20210523075953p:plain

築年数と価格の散布図

中古マンション

やや負の相関がありますね。 f:id:sanvarie:20210523080106p:plain

中古一戸建て

こちらはほとんど相関がないことがわかります。単純に築年数が高いと価格が安くなるとは言えないですね。

f:id:sanvarie:20210523080157p:plain

2.モデルの作成

以下のようにモデルを作成しました。

import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# データ読込
df = pd.read_csv(r"D:\data\csv\property.csv")

df = df.astype({'建物面積': 'float64'})

# 出力変数
y = df["販売価格"]

# 入力変数
x = df.iloc[:,0:-1]

# ダミー変数化
x = pd.get_dummies(x)
y = df["販売価格"]

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=50)

# モデル作成
rfr = RandomForestRegressor(n_estimators=100)
model = rfr.fit(x_train, y_train)

訓練データに対する精度とテストデータに対する精度を確認します。

print(model.score(x_train, y_train))
print(model.score(x_test, y_test))

訓練データ「0.9634692855923855」、テストデータ「0.9631908599251336」という結果でした。かなりいい感じだと思います。

f:id:sanvarie:20210523081050p:plain

予測値の計算

作成したモデルを使用して価格を推論します。

predict = model.predict(x)
predict = pd.DataFrame(predict, columns=["predict"])
predict.head()

このように価格が推論されました。

f:id:sanvarie:20210523083005p:plain

CSVを読み込んだデータフレームの右端に推論結果を追加します。

results = pd.concat([df,predict],axis=1)
results.head()

この結果をCSVで出力してTableau で確認します。

f:id:sanvarie:20210523083236p:plain

3.モデルの評価

予測値と実際の販売価格を比較して誤差の確認を行います。

「誤差」フィールド作成

f:id:sanvarie:20210523083926p:plain

推論値と実際の価格の散布図

推論値をX軸に、実際の価格をY軸にして散布図を書きます。おおむねY=Xの線上に分布しているようですね。これは推論が的中していることを示します。

中古マンション

f:id:sanvarie:20210523091059p:plain

中古一戸建て

f:id:sanvarie:20210523091142p:plain

区別誤差の分布

中古マンション

誤差の分布はかなり狭いですね。

f:id:sanvarie:20210523084319p:plain

しかし、一部のデータで大きく誤差が出ているものもあります。

f:id:sanvarie:20210523085009p:plain

f:id:sanvarie:20210523085055p:plain

中古一戸建て

こちらも誤差の分布はかなり狭く、中古マンションと同じように一部のデータで大きく誤差が出ていました。

f:id:sanvarie:20210523084841p:plain

沿線別誤差の分布

中古マンション

誤差の分布はかなり狭いですね。

f:id:sanvarie:20210523085722p:plain

中古一戸建て

こちらはみなとみらい線にやや大きな分布がみられますね。

f:id:sanvarie:20210523085759p:plain

さいごに

本シリーズ最後のエントリーでしたが、いかがでしたでしょうか。一部のデータを除き実際の価格と予測値の誤差はかなり小さい結果になりました(それでも数十万円~300万円くらいの誤差が出ているものも多かったですが)。学習に使用するデータをもう少し精査することによってより精度の高い結果が出るかと思いますが、その辺は色々勉強していきたいと思います。本日は以上です。