0. 神奈川県下の中古マンション市場を分析してみる データ収集編
こんなblogを見つけました。
なるほど、面白そうだ。。。。。。
よし。最近、不動産テック(ReTech:Real Estate Tech)なんて言葉もあるくらいだし、いっちょ分析してみようじゃありませんか。
しかし同じことをやってもダメです。
ならば、スピンオフという名の下で、似て非なることをやってみようと思い立ちました。
で、思いついたのが
- 神奈川県下で
- 中古マンション市場で
お得な物件を分析してみよう、と思ったわけです。自分が賃貸を探すことはなさそうだし、都内は高いし、まぁ職場は都内じゃないし。。。。
ということで、それでは早速、手を動かして見ることにしましょう。
1. データの収集
分析するためには、何はともあれデータが必要です。そこで、今回は引用元サイトに倣って、suumoさんを選択させてもらいました。
1.1 利用規約を確認
こういうことをやってみる時は、大事なことです。利用規約のページから、一部抜粋した内容を以下に示します。
第2条 著作権等
1. ユーザーは、本サイトを通じて提供されるすべてのコンテンツについて、当社の事前の承諾なく著作権法で定めるユーザー個人の私的利用の範囲を超える使用をしてはならないものとします。
2. ユーザーは、本サイトの利用に関して、次の事項を行わないものとします。
- (7) 商業目的で利用する行為(当社が認める場合を除く)
私的利用には違いないか。ただ、
- 統計的にどういった物件がお得かどうか、明らかにした場合
- さらにそれを他の誰かが検索できるように(例えばwebサービス)した場合
黒とはいかなくてもグレーゾーンでしょうか。。。。
(有料サービスは考えていませんが、blogに書いた時点で広告が表示されちゃうし)
少なくとも、前者のお得物件の判断までは個人の見解に過ぎないので、こちらは問題ないと判断させていただくことにします。
後者の検索についても、世の中の誰でも使えるようにするのは問題でしょう。しかし、結果を第三者に評価してもらう目的で、限定された人だけがアクセスできる仕組みを備えていれば、私的利用の範疇だと判断させていただくことにします。
この先どうするかは、まだ何も考えていません
。でも、一応はこうしたことを頭に入れておくことにします。
1.2 いよいよデータの収集
pythonでスクレイピングすることにします。
suumoさんのサイトから、「中古マンション」のサイトのリンクをクリックして、神奈川県の物件情報にアクセスします。
すると、路線を選択する画面に遷移するので、すべての路線を選択することにします。
2018年8月4日現在、神奈川県下で公開されている中古マンション市場では、12,121件の物件が公開されていました。
ここから、スクレイピングで情報を取得していきます。
pythonによるスクレイピングのcodeの一部が以下となります。
#必要なライブラリをインポート
from bs4 import BeautifulSoup
import requests
#URL(神奈川県の全路線の中古マンション情報ページの1ページ目)
url = 'https://suumo.jp/jj/bukken/ichiran/JJ010FJ001/?ar=030&bs=011&ra=030014&jspIdFlg=patternEnsen&ohf=0&rn=0215&rn=0220&rn=0230&rn=0225&rn=0205&rn=0120&rn=0125&rn=0130&rn=0135&rn=0160&rn=0165&rn=0185&rn=0190&rn=0195&rn=0305&rn=7580&rn=7585&rn=0155&rn=0290&rn=0095&rn=0105&rn=0110&rn=0115&rn=0240&rn=0245&rn=0250&rn=0255&rn=0175&rn=0180&rn=0170&rn=0645&rn=0140&rn=0150&rn=0145&rn=0260&rn=0262&rn=0735&kb=1&kt=9999999&mb=0&mt=9999999&ekTjCd=&ekTjNm=&tj=0&cnb=0&cn=9999999'
#データ取得
result = requests.get(url)
c = result.content
#HTMLを元に、オブジェクトを作る
soup = BeautifulSoup(c, 'lxml')
#物件リストの部分を切り出し
summary = soup.find("div",{'id':'js-bukkenList'})
#ページ数を取得
body = soup.find("body")
pages = body.find_all("div",{'class':'pagination pagination_set-nav'})
pages_text = str(pages)
pages_split = pages_text.split('</a></li>\n</ol>')
pages_split0 = pages_split[0]
pages_split1 = pages_split0[-3:]
pages_split2 = pages_split1.replace('>','')
pages_split3 = int(pages_split2)
import re
def extMeg(pat, mlist):
return [ pat.search(str(m)).group(1) for m in mlist ]
# 総物件数
num = body.find("div",{'class':'pagination_set-hit'})
num = str(num).replace("\r\n\t\t\t\t\t\t\t\t\t\t","")
num = extMeg( re.compile('<div class="pagination_set-hit">(.+)<span>件</span>\n</div>'), [num])
num = int(num[0].replace(",",""))
print("総物件数: {}".format(num))
各物件の詳細は、物件ごとに用意されたページから情報を取得する必要があります。
物件のどれか一つクリックして、 「物件概要」 タブをクリックすると、物件の詳細情報が表示されます。
すべての物件について、このページの情報を収集することで、分析用のデータとすることにします。
1.3 データは前処理が必要
上記のようにデータを収集して、pandasのdataframeにした先頭5件のデータが、以下のような感じになります。
管理費の部分を見てもらうと分かりますが、このままでは分析するには扱えない形となっています。
2500円/月(自主管理)
欲しいのは、管理費が 2500
円という情報だけです。なので、他の情報は不要です。
また、最も重要な価格についても
550万円
となっています。万円
は不要ですので、除外してint型ないしfloat型に変換しておく必要があります。
こうした情報の前処理をして、最終的に分析に使いやすい形に変えてやる必要があります。最終的には、こんなイメージにしてやることが目的となります。
前処理については、次の記事で紹介することにします。