#0.要約
「晴海フラッグ」は、オリンピックの選手村跡地にできる都心の大規模マンション。最寄り駅から徒歩20分ということで、立地条件面での前例が少ない物件。価格設定がリーズナブルか否か、疑問に思っていたので、Pythonで重回帰分析してみた。
結論から言えば「ベースとなる価格設定は類似物件比、リーズナブル」ということになった。だから、基本的には損しない物件と言えるのだろう。但し、眺望が良い棟の価格プレミアムは高い。眺望の良さを気に入って、その価格に納得できるのなら良い物件と言える。
#1.前口上
いよいよ今年、オリンピックが東京で開催される。バドミントンを始め、選手の活躍を楽しみにしている。
オリンピック関連で色んな話題がある。個人的に興味があるのは、選手村跡地に出来る晴海フラッグ。都心での一大プロジェクトということで、とっても興味がある。しかし、最寄りの勝どき駅から徒歩20分程度と距離がある。郊外なら、ともかく、都心で徒歩20分の大規模開発って、価格設定は一体、どうなっているのだろうか。
分からないので、データ分析してみることにした。
#2.データ分析の流れ
データ分析は、以下の流れで行った。(分析後、検証も行った。)
(1)データ収集(スクレイピング)
(2)データ前処理
(3)データ分析
#3.データ収集
データ収集は、スーモさんのサイトでスクレイピングさせて頂いた。スーモさん、ありがとう!
本当は新築マンションの価格を使いたかったけど、価格未定が多く、入手できるデータが少ないので、中古マンションの価格を使った。
最初は東京湾に面している港区や品川区なども対象にした。しかし、麻布や大崎などのマンションも対象になってしまい、対象イメージの異なる物件が含まれてしまった。そこで、結局、江東区だけを対象にした。
晴海フラッグは20階に満たないのだけれど、高層マンションのイメージがあったので20階以上の物件、および、大規模開発を対象にしたかったので全体の戸数100戸以上の物件を選んだ。間取りは2LDKから4LDK(LDKにはK、DKを含む)。
条件検索の結果、対象となったデータは全部で438件。もっと多い方が良いが、このデータ数で収集してみた。
スクレイピングは、参考になる記事が沢山ある。有名な記事を参考までに記載する。
[機械学習を使って東京23区のお買い得賃貸物件を探してみた]
(http://www.analyze-world.com/entry/2017/11/09/061023)
なお、サイトの作りは結構、頻繁に更新される。スーモさんのデータはdottable dottable--cassetteクラスに格納されていたので、以下のようにすると良い。
result = requests.get(url)
c = result.content
soup = BeautifulSoup(c, "html.parser")
summary = soup.find("div",{'id':'js-bukkenList'})
cassetteitems = summary.find_all("div",{'class':'dottable dottable--cassette'})
#4.データ前処理
今回は、面積、駅からの距離(徒歩での何分かかるか)、築年数を説明変数にした。間取りを説明変数に採用すると、面積とマルチコ(多重共線性:同じような説明変数を用いると、説明変数間に強い相関が生じるため、分析が上手くいかない)しそうなので対象外とした。
目的変数は、もちろん価格(万円)。
データの前処理がデータ分析に係る一連の作業で、最も地味だが大切と言われている。しかし、ハッキリ言って、面白くない。
スーモさんの記事は欠損値が少ないから、取り扱いは楽だけど、築年数は加工して月数に変換した。
本来なら、データを正規化(平均を0に、標準偏差を1に、加工)するのが良いのかもしれない。しかし、例えば、駅から1分遠くなると、どんな影響が価格にあるのかを見たかったので、今回は正規化しないこととした。
データの前処理も分かりやすい記事があるので、参考にしてほしい。
[不動産データ分析事例【pythonデータ前処理編】]
(https://sinyblog.com/python/real_estate_analysis_002/)
[Pythonによる不動産情報のデータ取得&分析(5)【売却物件/データ前処理編】]
(https://akatak.hatenadiary.jp/entry/2018/09/15/090032)
#5.データ分析
スクレイピング後、前処理したデータをpandasのデータフレームDFに入れる。今回、使用するのは、以下の4つのデータのみ。
df=df.loc[:,['築年月数','所要時間(分)','面積','価格(万円)']]
df.head()でデータの中身を確認してみると以下の通り。
築年月数 所要時間(分) 面積(㎡) 価格(万円)
0 183 3 64.79 4780
1 61 8 55.92 5190
2 61 8 65.88 5190
3 61 8 55.38 5440
4 143 8 78.70 5480
築年月数、所要時間(分)が同じで、面積に違いがあるのに、価格が同じ物件がある。ちょっと変だなと思って調べたら、マンション自体の面積の狭い物件の方がバルコニー面積(分析対象外)が広く、そのことが同じ価格になった原因らしい。まあ、今回は細かいことは気にせず、分析しよう。
1種類のデータ、例えば、面積、から価格を求めたいときは、単回帰分析になる。その場合は、面積が説明変数、価格が目的変数、になる。
今回、説明変数が3種類(築年月数、所要時間(分)、面積(㎡))あるので、重回帰分析になる。目的変数は価格だ。重回帰分析には、機械学習で定番のsklearnを使うことにする。
from sklearn import linear_model
clf = linear_model.LinearRegression()
# 説明変数に 価格(万円)以外を利用
df2 = df.drop('価格(万円)', axis=1)
X = df2.as_matrix()
# 目的変数に価格(万円)を利用
Y = df['価格(万円)'].as_matrix()
# 予測モデルを作成
clf.fit(X, Y)
# 偏回帰係数
print(pd.DataFrame({"Name":df2.columns,
"Coefficients":clf.coef_}).sort_values(by='Coefficients') )
# 切片 (誤差)
print(clf.intercept_)
結果を式で表すと、以下の通り。
価格(万円)=所要時間(分)*(-144.791875)+
築年月数*(-11.745408)+
面積(㎡)*90.448675+
2205.2165149154216
要するに、今回のデータ分析から言えることは、
(1)駅から1分、遠くなると、価格は約150万円、下がる。
(2)新築から1か月、経過するごとに、価格は約12万円、下がる。
(3)面積が1㎡、広くなると、価格は約90万円、上がる。
#6.検証
重回帰分析の結果を当てはめてみよう。なお、新築物件だから、築年月数は当然、ゼロになる。当てはめ対象の物件は、中位階(18階建てなら、9階)としよう。
晴海フラッグの価格は既に一部が公表されている。公表されているのは、PARK VILLAGEのA棟からF棟の一部ほかである。検証結果は以下の順で説明する。
(1)重回帰式の当てはまりが良い物件
(2)重回帰式の当てはまりが悪い物件
(3)なぜ、重回帰式の当てはまりに差が出るのか?
###(1)重回帰式の当てはまりが良い物件
PARK VILLAGEのB棟、C棟は、重回帰式が比較的良く当てはまる。
例えば、B棟の75.46㎡の物件。B棟までの距離は駅から徒歩20分だから、重回帰式で計算すると、
20(分)*(-144.791875)+75.46(㎡)*90.448675+2205.2165149154216=6,135万円
となる。売出価格は6,130万円だから、回帰式の結果と、ほぼ一致。
それから、C棟の78.56㎡の物件。C棟までの距離は駅から徒歩19分だから、重回帰式で計算すると、
19(分)*(-144.791875)+78.56(㎡)*90.448675+2205.2165149154216=6,560万円
となる。売出価格は6,560万円だから、回帰式の結果と完全に一致。
探せば、重回帰式で求めた価格比、お得な物件もある。例えば、C棟の87.43㎡の物件。重回帰式で計算すると、
19(分)*(-144.791875)+87.43(㎡)*90.448675+2205.2165149154216=7,362万円
となる。売出価格は6,490万円だから、回帰式の結果より、お得な価格設定になっている。
###(2)重回帰式の当てはまりが悪い物件
一方、当てはまりが悪いというか、重回帰式の結果よりも高く価格設定されているのが、A棟やF棟。
例えば、A棟の86.55㎡の物件。A棟までの距離は駅から徒歩21分だから、重回帰式で計算すると、
21(分)*(-144.791875)+86.55(㎡)*90.448675+2205.2165149154216=6,993万円
となる。売出価格は10,100万円だから、回帰式よりも3千万円も高い。
それから、F棟の81.76㎡の物件。F棟までの距離も駅から徒歩21分だから、重回帰式で計算すると、
21(分)*(-144.791875)+81.76(㎡)*90.448675+2205.2165149154216=6,560万円
となる。売出価格は7,200万円だから、回帰式よりも640万円高い。
しかし、F棟はA棟ほどは、上振れ幅が大きくない。A棟の売出価格が、重回帰式の結果と乖離している大きさにはビックリ。
乖離幅が大きい順に記載すると以下の通りとなる。
A棟>F棟>B棟、C棟
###(3)なぜ、重回帰式の当てはまりに差が出るのか?
重回帰式と売出価格の差について、当初、ハード面の違いが原因かなと思っていた。それでも、具体的なハード面での違いが分からないままだった。
価格差の原因が分からないまま、晴海フラッグの地図を見ていて、やっと気付いた。価格差は眺望の違いで生じているものだった。
以下の記事には、各棟の特徴が明確に記載されている。
[【HARUMI FLAG】SEAとPARK VILLAGEの第一期価格表が公開される]
(https://wangantower.com/?p=16436)
上記の記事に記載されている各棟の特徴を要約すると、以下の通りとなる。
・レインボーブリッジを最前列で毎日見たい→A棟
・レインボーブリッジ見たいけど、A棟ほど出せない→F棟
・総額控えめな方がいい、眺望はある程度妥協する→B・C棟
つまり、レインボーブリッジが見えるか、見えないかの差だ。
B棟やC棟は、レインボーブリッジが見えないから、データ分析で求めた重回帰式の結果と大きく乖離しない売出価格になっている。つまり、ベースの価格としてはリーズナブルな価格設定になっている、と言えると思う。
一方、A棟やF棟は、晴海フラッグのセールスポイントである「眺めの良さ」が価格プレミアムとして、重回帰式で求めた結果に加算されている、ということらしい。
そう言えば、「鹿児島では桜島が見えるか、見えないかで、家の価格に差が出る」と聞いたことがある。
晴海フラッグの価格差の原因は、レインボーブリッジが見えるか、見えないかの「眺望」の差だった
#7.感想
前例が少ない⇒データが少ない⇒まともなデータ分析ができない
みたいな流れで、メチャクチャな結果になったら、どうしようと思っていた。データ数は、それほど多くなかったが、個人的には、まずまずの結果かなと思っている。
それにしても、データ分析をしてみて、毎度、思うのは、データ分析だけで真実に近づくのは限界があるということだ。今回も、何が原因で価格差が生じるのか、最初は、よく分からなかった。眺めの良いマンションが高いのは分かるけど、これほどプレミアムが載っているとは正直、驚き。実は、坪単価≒建設費用だと思っていた。まあ、買える人が羨ましい。
#8.教訓
疑問が生じたらデータ分析で検証できないか、考えよう。
但し、データ分析だけで、真の原因が分かるほど、世の中は甘くない。
#9.最後に
スーモ様はじめ、参考にさせて頂いたサイトの方々に感謝します。
また、ご意見などがあれば、ぜひ、お聞かせください。