0. 神奈川県下の中古マンション市場を分析してみる 分析・可視化編その2
前回、可視化と分析を進めてみました。
今回は、住所からgeocodingした緯度経度をもとに、地図上で可視化をしていきたいと思います。
可視化にはいろいろ方法はありますが、今回こだわりたかった点は
- 手間がかからない
- いろんな数値をカラーコンターで地図に重ねて描画できる
- 自治体の境界が表示できる
- 鉄道路線と駅名が表示できる
こんな感じでした。pythonのライブラリを駆使する方法もあったのですが、手間がかなりかかるので却下。
最終的にはELK (Elasticsearch + Logstash + Kibana)スタックで実装することにしました。
全世界リアルタイム麺活監視システムと同じノリですね。
なお、今回のELKスタックで使用したバージョンは、すべて6.3.2です。
1. ELKスタックの構築
1.1 ダウンロード
このサイトから、ElasticSearch、Logstash、Kibanaそれぞれをダウンロードします。動かしたいOSに合わせて、それぞれダウンロードしてください。
今回は、私はwindowsでやってみます。
注意点としては、ElasticSearch、Logstash、Kibanaはすべてバージョンを合わせてください。異なると、動かないことが多いです。
1.2 解凍
ダウンロードしたファイルを解凍しましょう。
基本的に、解凍されたファイル中にあるバッチファイルを実行するだけで動かせます。
この辺の動作については、何か問題あっても自分で解決できるような方が読者と思い、細かいことには触れないことにします。
1.3 起動
起動します。起動する順序は、
- ElasticSearch
- bin\elasticsearch.exeを実行
- Kibana
- bin\kibana.exeを実行
です。Logstashは、実際にデータの投入時まで起動させる必要はありません。
問題なく起動したと思ったら、Kibanaから状態を確認しましょう。
ブラウザからアクセスしてみます。
http://localhost:5601/
ブラウザ <– port:5601 –> Kibana <– port:9200 –> ElasticSearch
で、接続できていればこのような画面となるはずです。Kibanaはもちろん、ElasticSearchも起動し、状態が確認できていますよね。
2. データ投入
それでは、ElasticSearchにデータを投入してみましょう。
そのためには事前にElasticSearchにmappingを設定しておく必要があります。
RDBでいうところのスキーマ定義ですね。
2.1 ElasticSearchのmapping定義
結論というか、使用したmapping定義を以下に示します。
{
"index_patterns": "realestate-*",
"order": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"entry": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
いろいろなfieldにいろんな値を突っ込むのですが、緯度経度をもとにした位置情報は、事前に位置情報が入ることをElasticSearchに教えておいてあげないといけません。
そこで、location
というfield名がgeo_point形式であることを教えておきます。
これを、ElasticSearchに突っ込みます。
いろいろと面倒などで、KibanaのDev toolで突っ込むことにしましょう。
DELETE /realestate-*
DELETE /_template/realestate
PUT /_template/realestate
{
"index_patterns": "realestate-*",
"order": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas" : 0
},
"mappings": {
"doc": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
実際の画面はこちら。
最初に、対象のindexで登録されているdocumentをすべて削除。
そのあとに、すでにmapping定義がされている場合に備えてこれを削除。
最後に、新しいmapping定義を登録します。
2.2 Logstashの設定
ElasticSearchにmapping定義を作成したので、Logstashからデータを流し込みましょう。
以下が、logsashで不動産のcsv(厳密にはtsvですが)を読み込んでElasticSearchへ投入するためのconfファイルの中身です。
詳しい解説は面倒なのでしません。が、location
というfieldの子要素に、lon
そしてlat
というfieldを用意して、そこに緯度経度を設定させます。
なお、以下の内容をconf\realestate.json
というpathと名前で保存します。
input {
file {
sincedb_path => "/path_to/since_file"
path => "/path_to/tsv_data_file"
start_position => "beginning"
#codec => "UTF-8"
}
}
filter {
csv {
separator => " " # <-- tabが指定されている
columns => ["no", "name", "cost", "managecost", "tumitate", "area", "built", "floor", "address", "homecount", "url", "age", "structure", "height", "manage_cycle", "manage_type", "manage_type2", "barcony_area", "barcony_cost", "garden_area", "garden_cost", "roof_garden_area", "roof_area_cost", "terras_area", "terras_cost", "N", "NE", "NW", "S", "SE", "SW", "E", "W", "right", "rem_right", "parking", "parking_useful", "parking_lcost", "parking_ucost", "reform", "access0_1", "access0_2", "access0_3", "access0_4", "access0_5", "access0_6", "access1_1", "access1_2", "access1_3", "access1_4", "access1_5", "access1_6", "access2_1", "access2_2", "access2_3", "access2_4", "access2_5", "access2_6", "areatype01", "areatype02", "areatype03", "areatype04", "areatype05", "areatype06", "areatype07", "areatype08", "areatype09", "areatype10", "areatype11", "areatype12", "areatype13", "areatype14", "areatype15", "areatype16", "areatype17", "num_of_room", "roomS", "roomD", "roomK", "roomL", "lon", "lat"]
convert => {
"built" => "date"
"cost" => "integer"
" floor" => "integer"
"height" => "integer"
"num_of_room" => "integer"
"managecost" => "integer"
"area" => "float"
"age" => "float"
"access0_4" => "float"
"access1_4" => "float"
"access2_4" => "float"
}
}
mutate {
add_field => {
"[location][lat]" => "%{lat}"
}
add_field => {
"[location][lon]" => "%{lon}"
}
}
mutate {
convert => {
"[location][lat]" => "float"
"[location][lon]" => "float"
}
}
mutate {
convert => {
"latitude" => "float"
"longitude" => "float"
}
}
date {
match => [
"built", "YYYY-MM-DD", "YYYY/MM/dd HH:mm:ss", "YYYY/MM/dd"
]
}
mutate {
remove_field => [ "message", "path" ]
}
}
output {
elasticsearch {
index => "realestate-%{+YYYY.MM.dd}"
}
file {
path => "/path_to/logs/suumo_kanagawa.log"
}
stdout { codec => json }
}
2.3 いざ投入!
それでは実際に投入しましょう。
logstashを回答したディレク理に移動して、以下のコマンドをたたけば2.2節で示した設定ファイルに従ってログがElasticSearchへ流し込めます。
\bin\logstash.bat -f \conf\realestate.json --config.reload.automatic
--config.reload.automatic
オプションを付けることで、設定ファイルに更新があったときに自動的にそれを読み込むことができます。
3. 地図での可視化
投入したデータを、早速可視化していくことにしましょう。
3.1 デフォルト地図
まずは結果です。
visualizeからCoodinate Mapを選び。。。。。。
geohashのfieldにlocationを選び、描画対象のパラメタをCount(デフォルト)を指定すると。。。。。
売り出し中の物件数の分布を書いてみたものが以下となります。
川崎市全域と、横浜市の南西部を除いた地域で、物件数が多いことがよくわかりますね。加えて、藤沢駅周辺も物件件数が比較的多いエリアということがわかりますね。
3.2 WMSの変更
地図上にHeatMapを描画することができました。しかし、この地図にはいくつか改善点があります。
- 自治体の境界がわからない
- 鉄道路線がわからない
- 鉄道駅がわからない
日本の物件は、鉄道駅からの距離に強く関係することがわかっています。
こうした情報を描画できるようにしたいと思います。
そこで、WMS(Web Map Service)を、デフォルトのものから変更することにします。
KibanaのWMS map server
の設定を、デフォルトから上記の情報を表示できるサービスに変更しましょう。
国立研究開発法人農業・食品産業技術総合研究機構 西日本農業研究センター 営農生産体系研究領域がサービス提供している、地図画像配信サービスを利用させてもらうことにします。
こちらのサービスの利用条件を確認したところ、商用利用含めて無償で利用できると明記されていましたので、安心して使わせてもらうことにします。
使用できるパラメタはこちらに具体的に書いてありますが、以下のように設定しました。
パラメタ | 設定内容 | 補足 |
---|---|---|
WMS url | http://www.finds.jp/ws/wms.php? | |
WMS layers | AdmArea,PrefSmpl,MncplName,RailCL,stationname | 行政区画, 都道府県区画, 市区, 町村名, 軌道中心線, 駅名 |
WMS version | 1.3.0 | |
WMS format | image/png |
うん、意図通りに、自治体名や鉄道路線、鉄道駅などが表示できています。
3.3 調整と確認
もう少し確認してみましょう。
エリア平均価格をカラーコンターで描画した結果が以下となります。
ほほう、、、、やはり東京都と接しているエリアの価格が高い傾向にありそうですね。
次に、価格が高いエリアの一つである、武蔵小杉駅周辺を拡大してみましょう。
- 東急東横線 日吉駅~綱島駅にかけて
- 横浜市営地下鉄 センター北と仲町台
二子玉ヤバイ
4. 可視化分析
いろいろと可視化してみましょう。
4.1 億ションエリア
億ションがどんなところにあるのか見てみましょう。
うーん、やはり横浜駅周辺と山手、そして藤沢と江の島ですね。
一部、世田谷区にもありますね、最寄り駅の路線から物件を検索しているので、県境当たりの物件は東京都の物件も検索されたのでしょう。
もうちょっと敷居を下げて、5,000万円以上の物件があるエリアを見てみましょう。
武蔵小杉駅も二子玉川駅、そして川崎駅がそうしたエリアのようです。
4.2 お買い得エリア!?
それではお買い得!?と思われるエリアを探してみましょう。
条件として
access0_3:歩 AND access0_4 < 5 AND cost < 2000 AND area > 75
- 徒歩5分圏内
- 専有面積75m2以上
- 2,000万円以下
で検索してみました。
ほほう。ぱらぱらとありますね。
物件がいくつか集まっていそうな、町田駅周辺と久里浜駅周辺を拡大してみましょう。
町田周辺 | 久里浜周辺 |
---|---|
なるほど。
町田駅や相模大野駅といった、乗り換えもできる大きなターミナル駅というより、
そこから1~2駅移動した林間、つきみ野、相武台前、かしわ台といった駅にお得な物件があるということかもしれません。
5. 分析のまとめ
地図上で可視化することで、条件としてお得な物件がどこにあるのか、検索できました。
ただ、お得な物件とは、これだけじゃないですよね。
とある地域で、周辺の相場よりお得
であることが大事ですよね。
このことを踏まえてお得な物件を探す方法を、次回以降に模索していきたいと思います。
X. 参考情報
WMSサービス提供元: 農研機構 (https://www.finds.jp/)