さて、改めて今回の目的を確認しておくと、機械学習を使って東京都23区のお買い得賃貸物件を発見しよう、というものです。前回までの記事で、お買い得賃貸物件を発見するためのデータを収集し、分析にかけられるよう前処理してきました。
今回の記事では、いよいよ機械学習を使って分析していきましょう。前回まではPythonを使っていましたが、この分析ではRを用いています。なお、コードはGitHub(https://github.com/ShoKosaka/Suumo)に上げておきますので興味ある方は参照ください。
最初に、データの中身をざっくり見ていきます。具体的には、分析のキーになるポイントをグラフにしながら、賃貸物件の現状や変数同士の関係性を把握していきます。
データ探索
まず、23区の中でどこが物件数が多いのかを見ていきます。
一番は世田谷区で20,000件強、杉並区、練馬区と住宅地のイメージのある区が続きます。逆に最下位は丸の内のある千代田区です。なるほど納得感があります。
自然な疑問として、物件数は人口と相関があるんじゃなかろうか、と考えます。23区別の人口(https://mansionmarket-lab.com/tokyo-23city-ranking-population)を拝借して、相関図をプロットしてみました。
あー、綺麗な相関ですねー。杉並区は人口の割に物件数が多いので、マンションがガンガン立って人を増やそうとしているのかもしれません。 人が出て行って空き家が増えているという可能性もありますが、おそらく前者でしょう。ちなみに相関係数は0.91でした。
今回一番興味があるのは家賃です。前回の記事でも触れましたが、管理費は毎月支払うもので、実質的には家賃と考えられるので、今回は賃料+管理費を家賃としてみなしています。
23区別に家賃をボックスプロットしたのが下図です。
左のほうにあるちっこい箱の中の縦線が中央値です。見にくいですね。後で拡大します。○は外れ値(アウトライヤー)で、つまり、めちゃくちゃ高い物件を表しています。最も高い物件だと、350万円くらいですね。。念のため確認しておきますが、これ賃貸物件の毎月の家賃です。
ここで留意しておくべきことは、家賃100万円以上の物件が、そこそこあるなぁという点です。これは後でモデルを作るときに関係してきます。
先ほどのグラフでは中央値の差が見えなかったので、横軸の上限を40万円で切り、ついでに外れ値も非表示にして見ましょう。
港区、中央区、千代田区と、高そうなエリアが上位に名を連ねています。高級エリアになるほど分散も大きくなっていくのが見て取れます。また、台東区については、中央値は5番目に高いですが、20万円超の物件は比較的少ない、ということなんかも分かります。
分布の形も見ておきましょう。全部プロットすると見にくいので、真ん中くらいの世田谷区、一番高い港区、 一番安い葛飾区の3つをプロットします。
物件の総数が違うので山の高さに差がありますが、葛飾区、世田谷区、港区と順に山頂が右にシフトしているのが見えます。上の図でも見たように、家賃が高い区の方が分散が大きいこともグラフ形状から分かります。
グラフだといまいち地理的関係がイメージしにくいので、マッピングして見てみることにします。
港区を中心に、距離が遠いほど家賃も下がっていくのが分かります。そんなの知ってたよ、とは言わないようにしましょう。この図を作るのに3時間以上もかかって超大変でした。一見当たり前の結果ですが、統計分析の結果というのは概してそういうものです。当たり前の事象を数字で確認することに意義があります。また、これを見ると、港区から物件までの距離を変数にして予測モデルを作ることもできそうです。
他には、部屋数も家賃を決定する重要な要素だと予想されます。家賃と部屋数の関係をジッタープロット(jitter plot)に表しています。
意外と、家賃が200万円を超えるような超高級マンションは部屋数が2〜5個と少なめですが、青線の回帰直線を見ると、やはり部屋数に応じて家賃も上がっているようです。
10部屋の物件が2つありますが、一つ家賃が安すぎる物件がありますね。ちょっと確認しておきましょう。
入力ミスや!!
明らかに、1DKであるべきところが10Kになっています。なんと約20万件もの物件データから、こんな入力ミスを発見することができました。これは素晴らしいですね。分析を回す前にデータ探索をすることは、このような入力ミスをあらかじめ発見して除外するためにも大切です。
その他、家賃とは直接関係ありませんが、興味深いチャートをいくつか紹介します。まずは、最寄り3駅からの距離です。
Suumoさんでは、最大で3つまで、最寄り駅とそこからの距離(徒歩〜分)を表示しています。グラフを見ると明らかに、徒歩14分にピークがあります。現実的に、徒歩14分の場所に物件が多いことは考えにくいので、駅近物件と見せかけるために徒歩15分強のところを徒歩14分としていると予想できます。早歩きで14分だったよと。同じようなピークが徒歩19分にも見られます。出会い系サイトには29歳の女性や身長170cmの男性が異常に多いことと同じ現象ですね。
築年数も見ておきます。
中央値が最も高いのは下町のイメージの強い江戸川区、葛飾区。墨田区、江東区、台東区の築年数が浅いのは意外です。地理的には墨田区を中心に隣接したエリアなので、もしかしたら、東京スカイツリーの影響で住宅が増えているのかもしれません。港区、千代田区、中央区は、上記3区よりも中央値は高いですが、破線部分を見ると、築年数が30年を超える物件はほとんど無いので、家賃が高いエリアだということを考えると、おそらく古い物件は取り壊されているのでしょう。また、家賃とは違い、築年数は中央値が大きいほど分散が大きいというわけではないようです。
予測モデル作成
ある程度概観も掴めたところで、実際の分析に移ります。今回は以下の流れで進めます。
1. データを学習データとテストデータに分ける
2. 扱うモデルは重回帰分析とランダムフォレスト
3. 学習データを使って予測モデルを作成
4. 予測モデルとテストデータで予測
5. 残差平方和で性能比較し、精度の高いモデルを使用
6. 予測家賃と実際の家賃の差が大きいほどお買い得なはず!
回帰問題のため、重回帰分析とランダムフォレストの2つをモデルとして試します。精度の比較のために、あらかじめ学習データとテストデータを8:2の比率で分けておきます。精度の判定方法には残差平方和を用い、実際のデータとのズレが小さい方を性能の良いモデルとします。学習させた予測モデルが弾き出す家賃は、「東京23区の賃貸市場では、この条件であればこのくらいの家賃になるだろう」という予測であるため、これよりも実際の家賃が安ければ、お買い得物件と見なすことができるはずです。予測家賃と実際の家賃の差異には、今回考慮できていない要因の影響も含まれますが、市場価格との差異、つまり「お買い得感」も含まれるはずです。手法としては少し怪しいところもありますが、実際に感覚値としてお買い得と感じる物件が炙り出されれば成功とします。とにかくやってみましょう。
まずは重回帰分析です。今回、応答変数は家賃(賃料+管理費)、説明変数として使えそうなのは区、部屋数、床面積、DK有無、K有無、L有無、S有無、築年数、建物高さ、階数、最寄駅からの距離、です。これらのうちどれを使うかを決めるために、変数同士の相関係数を見ておきます。説明変数同士の相関が高すぎると、多重共線性(multicollinearity)により偏回帰係数が不安定になり、適切に求められません。
上図を見ると、部屋数(rooms)と床面積(area)の相関係数が0.74、DK有無とK有無が-0.69、建物高さ(height)と階数(order)が0.78と高い相関を見せています。床面積は他の変数とも相関しているので、部屋数を残します。DK(ダイニングキッチン)がある部屋には通常K(キッチン)がないため、この二つの相関が強いのは当然の結果です。他変数との相関係数を見て、K有無を残してDK有無を取り除きます。建物高さと階数はどちらを残してもいい感じがしますが、今回は建物高さを残します。
このように選んだ説明変数でまわした重回帰分析の結果がこちらです。
Call: lm(formula = rent_adm ~ ward + rooms + K + L + S + age + height + distance1, data = train) Residuals: Min 1Q Median 3Q Max -371992 -14867 -984 11853 3183274 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 50055.03 600.25 83.390 < 0.0000000000000002 *** ward中央区 5762.24 992.26 5.807 0.00000000636494220 *** ward中野区 -7093.45 714.54 -9.927 < 0.0000000000000002 *** ward北区 -12368.37 766.18 -16.143 < 0.0000000000000002 *** ward千代田区 40235.81 1403.77 28.663 < 0.0000000000000002 *** ward台東区 -7512.34 951.72 -7.893 0.00000000000000296 *** ward品川区 5682.46 753.99 7.537 0.00000000000004851 *** ward大田区 -9853.70 637.80 -15.450 < 0.0000000000000002 *** ward文京区 3762.18 911.34 4.128 0.00003657751420970 *** ward新宿区 7479.28 718.61 10.408 < 0.0000000000000002 *** ward杉並区 -6740.65 602.93 -11.180 < 0.0000000000000002 *** ward板橋区 -22474.89 634.20 -35.438 < 0.0000000000000002 *** ward江戸川区 -28949.53 680.59 -42.536 < 0.0000000000000002 *** ward江東区 -10232.66 738.05 -13.864 < 0.0000000000000002 *** ward渋谷区 49367.22 809.95 60.951 < 0.0000000000000002 *** ward港区 66886.99 854.63 78.264 < 0.0000000000000002 *** ward目黒区 24174.52 819.59 29.496 < 0.0000000000000002 *** ward練馬区 -25470.31 606.30 -42.009 < 0.0000000000000002 *** ward荒川区 -16593.12 1072.54 -15.471 < 0.0000000000000002 *** ward葛飾区 -31240.52 776.17 -40.250 < 0.0000000000000002 *** ward豊島区 -5739.73 793.08 -7.237 0.00000000000045990 *** ward足立区 -34095.98 655.24 -52.036 < 0.0000000000000002 *** ward墨田区 -13580.54 852.49 -15.931 < 0.0000000000000002 *** rooms 42890.89 235.49 182.133 < 0.0000000000000002 *** K1 -1593.95 296.73 -5.372 0.00000007808390548 *** L1 50089.86 381.66 131.243 < 0.0000000000000002 *** S1 47491.88 1060.75 44.772 < 0.0000000000000002 *** age -909.23 9.79 -92.870 < 0.0000000000000002 *** height 2556.84 26.95 94.887 < 0.0000000000000002 *** distance1 -685.59 28.78 -23.823 < 0.0000000000000002 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 51490 on 165752 degrees of freedom (1 observation deleted due to missingness) Multiple R-squared: 0.5162, Adjusted R-squared: 0.5161 F-statistic: 6098 on 29 and 165752 DF, p-value: < 0.00000000000000022
決定係数(multiple R-squared)が0.516、各変数のp値(p-value)も十分に小さいようなので、良さそうです。偏回帰係数(coefficients)を見てみると、どの区にあるかが重要なようです。同じ条件であっても、港区と足立区では家賃が100,983円(66,887 + 34,096)違うという結果になっています。また、部屋数を見ると、1部屋増えるごとに家賃が42,890円高くなっていることが分かります。築年数は1年ごとに909.2円安くなっていくので、新築と築10年の物件では9,092円の家賃差があると解釈できます。全体的には、それほど感覚値からかけ離れている感じはしないので、そこそこ妥当な結果だと言えそうです。
良いモデルができたようですね。安心です。それではQ-Qプロットを確認しておきましょう。
、、、あかんがな!
ビックリして関西弁が出てしまいました。これはあかんですね。回帰分析は分散が正規分布しており、均一であるという前提を置いており、前提が正しければこのQ-Qプロットは直線になるはずです。しかし、ここでは後半でプロットが上昇しており、この前提条件が満たされていないことを示しています。
どうやら、全ての家賃を一つの回帰分析モデルで説明するのは無理があるようです。例えばデータを家賃50万円以下と以上に分けるなどして、別々のモデルを作る必要があるでしょう。考えてみれば、そもそも家賃50万円以上の物件に住む人の金銭感覚は通常とは違うはずで、線形で回帰しようとしてもうまくいくはずがありません。
ただ、データの分布を見ると、家賃50万円以下の物件数の方が圧倒的に多いため、超高級物件の影響はそれほど大きくなく、50万円以下の物件を説明するためのモデルとしてはそこそこ使えそうです。これを庶民モデルと名付けましょう。
次に、ランダムフォレストを試します。いよいよ機械学習っぽくなってきました。先ほどの結果から、線形回帰では特に高級物件を予測するのに無理がありそうだったので、その辺りに期待して学習を回します。
さて、それでは学習がサチュってるかどうか確認しておきましょう。
決定木の数はデフォルトの500で学習させました。どうやらtrees = 100くらいでエラーが一定になっているようです。今回学習に16時間ほどかかりましたが、次回からはtrees = 100とすれば時短できそうですね。
ランダムフォレストのいいところは変数の重要度が見れる点です。以下の図で、上から順に重要度が高い変数が並んでいます。だいたい、重回帰分析で見たのと同じで、やはり、区(ward)、部屋数(rooms)が大きな要因のようです。
では、テストデータに対して、重回帰分析で得た庶民モデルとランダムフォレストモデルを使って家賃を予測しましょう。
下図がテストデータです。
テストデータは、全てのデータから20%をランダムに抜き出したもので、予測モデルの学習には使っていないデータです。家賃の安い物件からindexを振り直していて、物件数は約42,000件あります。ほとんどが250,000円以下ですが、一部1,000,000円の物件もあります。これを予測できているかどうか、見てみます。
以下が重回帰モデルの予測値とテストデータを比較したグラフです。
まぁ大外しはしていませんが、ブレも大きいですし、何よりも500,000円以上の高級物件については全く予測できていません。あぁ、こりゃダメだ。。
重回帰モデルがいまいちだったから、多分ランダムフォレストもあんまり良くないんだろうなぁ。残念だなぁ。でも一応精度を確認しておくかぁ。
ええやん!
これはええですね。全体的にブレも重回帰に比べて小さいですし、高級マンションの家賃も予測することができています。家賃が高くなるにつれブレも大きくなっているのが気になりますが、致し方ありません。
パッと見でもランダムフォレストの方が予測精度が高そうな感じはしますが、一応数字で確認しておきましょう。予測精度が高い方が、テストデータの実際の家賃と予測家賃の残差平方和が小さくなるはずです。結果は以下の通り。やはりランダムフォレストの方が性能が良いことが分かります。
まだ終わりません。
お買い得物件探索
これからが本番です。ここまでで、家賃の予測をするためのモデルをランダムフォレストを用いて作成しました。次は、このモデルを使って、実際の家賃が分かっている物件全てについて家賃の予測をします。このモデルは東京都23区の賃貸市場全体から作成したものなので、実際の家賃が予測値よりも安ければ、お買い得、ということになるはずです。とにかく今回の目的はお買い得物件を見つけることなので、実際にやってみて、お買い得だなと思える物件が浮かび上がって来れば成功だとします。
以下の表が、上記の手法で求めたお買い得物件TOP30です。なお、この物件データは2017年11月6日に取得しております。
ランキング | 物件 | 住所 | 間取り | 家賃 | 予測家賃 | 差異 | 築年数 | 建物高さ | 階数 | 床面積 | 最寄路線 | 最寄駅 | 徒歩〜分 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | ブランズ代々木 | 東京都渋谷区代々木1 | 3LDK | 350,000 | 930,923 | 580,923 | 2 | 12 | 13 | 66.65 | JR山手線 | 代々木駅 | 1 |
2 | 笹塚3丁目戸建て | 東京都渋谷区笹塚3 | 5LDK | 250,000 | 825,186 | 575,186 | 15 | 3 | 3 | 128.06 | 京王線 | 笹塚駅 | 7 |
3 | JR山手線 代々木駅 14階建 築2年 | 東京都渋谷区代々木1 | 3LDK | 350,000 | 912,108 | 562,108 | 2 | 14 | 13 | 66.65 | JR山手線 | 代々木駅 | 1 |
4 | リモーネ恵比寿 | 東京都渋谷区恵比寿2 | 4LDK | 205,000 | 608,359 | 403,359 | 9 | 2 | 2 | 72.6 | 東京メトロ日比谷線 | 広尾駅 | 7 |
5 | 上原戸建 | 東京都渋谷区上原3 | 4LDK | 500,000 | 900,987 | 400,987 | 6 | 3 | 1 | 118.02 | 小田急線 | 東北沢駅 | 5 |
6 | 上原戸建 | 東京都渋谷区上原3 | 4LDK | 500,000 | 900,987 | 400,987 | 6 | 3 | 1 | 118.02 | 小田急線 | 東北沢駅 | 5 |
7 | 東京メトロ千代田線 代々木上原駅 3階建 築6年 | 東京都渋谷区上原3 | 4LDK | 500,000 | 900,987 | 400,987 | 6 | 3 | 1 | 118.02 | 東京メトロ千代田線 | 代々木上原駅 | 5 |
8 | ラ・トゥール三田 | 東京都港区三田3 | 4LDK | 1,075,000 | 1,443,515 | 368,515 | 12 | 43 | 40 | 175.92 | 都営三田線 | 三田駅 | 4 |
9 | セザール白金 | 東京都港区白金3 | 4LDK | 278,000 | 645,323 | 367,323 | 22 | 7 | 7 | 66.52 | 東京メトロ南北線 | 白金高輪駅 | 9 |
10 | JR山手線 恵比寿駅 2階建 築9年 | 東京都渋谷区恵比寿2 | 4LDK | 205,000 | 560,713 | 355,713 | 9 | 2 | 2 | 72.6 | JR山手線 | 恵比寿駅 | 10 |
11 | KDXレジデンス西原 | 東京都渋谷区西原1 | 3LDK | 252,000 | 571,991 | 319,991 | 14 | 6 | 2 | 80.41 | 京王新線 | 幡ヶ谷駅 | 6 |
12 | ロジマンエイト | 東京都渋谷区本町2 | 3LDK | 192,000 | 504,273 | 312,273 | 27 | 3 | 3 | 66.81 | 京王新線 | 初台駅 | 6 |
13 | ワテラスタワーレジデンス | 東京都千代田区神田淡路町2 | 4LDK | 650,000 | 959,967 | 309,967 | 5 | 41 | 37 | 108.75 | 東京メトロ千代田線 | 新御茶ノ水駅 | 3 |
14 | 代々木パークマナー | 東京都渋谷区代々木5 | 4LDK | 1,100,000 | 1,389,275 | 289,275 | 14 | 4 | 2 | 238.55 | 東京メトロ千代田線 | 代々木公園駅 | 4 |
15 | 東急東横線 都立大学駅 地下1地上2階建 築5年 | 東京都目黒区八雲2 | 2SLDK | 230,000 | 515,294 | 285,294 | 5 | 2 | 1 | 92.09 | 東急東横線 | 都立大学駅 | 10 |
16 | レキシントンスクエア白金高輪 | 東京都港区高輪1 | 3LDK | 361,000 | 641,261 | 280,261 | 12 | 22 | 17 | 71.51 | 東京メトロ南北線 | 白金高輪駅 | 1 |
17 | 東京メトロ南北線 白金高輪駅 地下1地上22階建 築12年 | 東京都港区高輪1 | 3LDK | 361,000 | 641,261 | 280,261 | 12 | 22 | 17 | 71.51 | 東京メトロ南北線 | 白金高輪駅 | 1 |
18 | アーベント幡ヶ谷 | 東京都渋谷区幡ヶ谷2 | 2SLDK | 250,000 | 528,211 | 278,211 | 12 | 4 | 3 | 80 | 京王新線 | 幡ヶ谷駅 | 2 |
19 | 東京メトロ南北線 白金台駅 7階建 築48年 | 東京都港区白金4 | 3LDK | 150,000 | 427,715 | 277,715 | 48 | 7 | 2 | 50.36 | 東京メトロ南北線 | 白金台駅 | 8 |
20 | エスハウス | 東京都渋谷区幡ヶ谷3 | 3LDK | 210,000 | 482,218 | 272,218 | 6 | 3 | 1 | 71.37 | 京王新線 | 幡ヶ谷駅 | 7 |
21 | 京王新線 幡ヶ谷駅 3階建 築14年 | 東京都渋谷区幡ヶ谷3 | 1SLDK | 132,000 | 400,918 | 268,918 | 14 | 3 | 1 | 48.79 | 京王新線 | 幡ヶ谷駅 | 9 |
22 | 目黒本町3丁目戸建 | 東京都目黒区目黒本町3 | 4LDK | 320,000 | 580,343 | 260,343 | 20 | 3 | 1 | 122.27 | 東急目黒線 | 武蔵小山駅 | 8 |
23 | 東京メトロ千代田線 代々木公園駅 4階建 築29年 | 東京都渋谷区富ヶ谷1 | 3LDK | 180,000 | 439,212 | 259,212 | 29 | 4 | 4 | 63.5 | 東京メトロ千代田線 | 代々木公園駅 | 5 |
24 | ホワイトタワー浜松町 | 東京都港区浜松町1 | 3LDK | 309,000 | 563,183 | 254,183 | 10 | 24 | 16 | 75.54 | JR山手線 | 浜松町駅 | 3 |
25 | 幡ヶ谷3丁目一戸建 | 東京都渋谷区幡ヶ谷3 | 3SLDK | 300,000 | 549,728 | 249,728 | 9 | 3 | 1 | 103.64 | 京王新線 | 幡ヶ谷駅 | 9 |
26 | JR山手線 田町駅 地下1地上14階建 築15年 | 東京都港区芝2 | 2SLDK | 220,000 | 462,107 | 242,107 | 15 | 14 | 2 | 56.84 | JR山手線 | 田町駅 | 9 |
27 | 小田急線 代々木上原駅 平屋 築17年 | 東京都渋谷区西原3 | 3SLDK | 400,000 | 622,376 | 222,376 | 17 | 1 | -1 | 119.06 | 小田急線 | 代々木上原駅 | 5 |
28 | レジディア芝浦 | 東京都港区芝浦4 | 3LDK | 205,000 | 426,362 | 221,362 | 27 | 15 | 14 | 62.9 | JR山手線 | 田町駅 | 12 |
29 | 東急東横線 都立大学駅 3階建 築14年 | 東京都目黒区柿の木坂1 | 4LDK | 220,000 | 440,584 | 220,584 | 14 | 3 | 1 | 95.13 | 東急東横線 | 都立大学駅 | 7 |
30 | メゾン白金 | 東京都港区白金3 | 3LDK | 218,000 | 438,558 | 220,558 | 27 | 5 | 3 | 71.03 | 東京メトロ南北線 | 白金高輪駅 | 10 |
表を眺めてもあまりイメージできないので、いくつか実際に覗いてみましょう。
まず、最もお買い得な物件に選ばれたのはこれ!
ブランズ代々木!
どうですか。お買い得感ありますか?代々木駅1分、3LDK、築2年で35万円。お買い得感あるんじゃないですか?ありますよね。でもそもそも35万円が高すぎてお得なのかどうかいまいちピンと来ません。
次はどうでしょうか。
第二位!
これは安いんじゃないですか?!
笹塚駅(新宿から2駅)7分、なんと一戸建て5LDKで25万円ですよ!築年数も15年と悪くない感じです。どうですか。機械学習のパワーどうですか。こんな物件が計算で浮かび上がってくるのすごいですよね。
でもまだ高い。毎月25万円は出せない。もうちょい手が届きそうな物件が欲しい。そうですよね。
ありますよ。いい物件。
それでは見ていただきましょう。第19位にランクインした物件はこちら!
白金台!3LDKで15万円!
これは安いでしょう。築48年と少し古めですが、この立地、間取りで15万円はかなりお買い得です。15万円でこれであなたもシロガネーゼです。
手法に怪しさは残りますが、結果的にはそれなりにお買い得感のある物件がきちんと抽出されたのではないでしょうか。ただ、全体的にランクインした物件を細かく見ていくと、一部、お風呂が少し古そうだったりするものもありますので、今回使った変数だけでは説明できない物件価値もありそうです。
まとめ
機械学習を使って東京都23区のお買い得賃貸物件を探してみました。個人的には、期待通りの結果になったのではないかと思います。途中、統計的な手法である重回帰分析よりも機械学習の手法であるランダムフォレストの方が精度が高いことも確認することができました。課題としては、通常、物件の写真を見て感じる「清潔感」が今回のモデルでは加味できていなかった点が挙げられます。写真をディープラーニングで学習させて清潔感を数値化するというアプローチが考えられますが、これは大変そうなのでまた気が向いた時にでもやりましょう。