■suumoの物件分析 #1 「関東の家賃偏差値を求めて地図上にヒートマップとして表示する」

スポンサーリンク
tech系(python)
スポンサーリンク

家賃偏差値のマップを検索すると県ごとに偏差値が求められているものが出てくる。

しかし、例えば東京に勤務地があるけど、東京だと高いから神奈川県や埼玉県や千葉県に住みたいって思う人だって当然いる。

だから、今回は関東全体の家賃偏差値をもとめることにした。

そして、その値を地図にヒートマップとして表示して可視化を行った。

参考にしたサイトはQiitaの以下の二つのサイト

📚【Python】市区町村レベルの塗り分け地図プロット

📚matplotlibのbarプロットでカラーバーをつける方法

今回はjupyter notebookでプログラムを書いた。

プログラムを書く前に

プログラムを書く前に以下のコマンドをanaconda promptを起動して実行しモジュールをインストールしておく。

conda install -c conda-forge geopandas

conda install descartes

QGISでマップを作る

可視化をするための基となる地図を用意しなければならない。

これをQGISで作る。

QGISをインストーラーをダウンロードする場所はここ

QGIS用の基となるmapはこちらに都道府県ごとに置いてある。

関東のデータをダウンロードしQGISに開く。

各都道府県毎のレイヤができるのでそれらを結合して、結合したデータをgeojsonファイルとしてエクスポートする。

QGISの画面として以下のような感じ。(ここら辺はググると説明しているサイトが色々あるので詳細はそちらを見た方が早いと思う)

プログラム

今回はsuumoのページの家賃の数値を使った。

例えば東京ならこちらのページの値を用いた。

今回使用するデータは2022年9月14日に更新されたデータを用いている。

条件はマンションのワンルームとした。

まずはプログラムの全体像を載せる。

import numpy as np
import pandas as pd
import geopandas as gpd
import matplotlib.colors
import matplotlib.pyplot as plt
import re
import statistics
import math

from matplotlib.colors import Normalize
from matplotlib.cm import ScalarMappable, get_cmap

### (1) データ側の処理
filename = "./kanto_map/kantou.geojson"
df_yachin = pd.read_excel('./kanto_manshon_oneroom.xlsx')

def return_yachine_value(v):
    if v != "-":
        return float(re.match("\d.\d", v).group())*10000
    elif v == "-":
        return "-"

def return_place(row):
    #print("test")
    if ( row['N03_003'] is not None ) and (re.match(".*郡",row['N03_003'])): # ●●郡の場合
        #print(row['N03_003'])
        return row['N03_003']
    elif ( row['N03_003'] is not None ) and (re.match(".*市",row['N03_003'])): # ●●市の場合
        return row['N03_003'] + row['N03_004']
    else:
        return row['N03_004']
    
def remove_specified_values(arr, value):
    while value in arr:
        arr.remove(value)
        
def get_hensa(yachine, average, pstdev):
    if yachine != "-":
        return 50 + 10*((yachine - average)/pstdev)
    elif yachine == "-":
        return "-"
    
df_yachin["yachin_value"] = df_yachin["家賃"].apply(return_yachine_value)
yachin_list = []
yachin_list = df_yachin["yachin_value"].values.tolist()

remove_specified_values(yachin_list, "-")

yachine_average = statistics.mean(yachin_list)
yachine_pstdev = statistics.pstdev(yachin_list)
df_yachin["家賃偏差値"] = df_yachin["yachin_value"].apply(get_hensa, average=yachine_average, pstdev=yachine_pstdev)

### (2) マップ側の処理
def colors_scale(arr):
    n_min = arr.min(skipna = True)
    n_max = arr.max(skipna = True)
    cmap = plt.cm.jet
    
    norm = Normalize(vmin=n_min, vmax=n_max)
    arr = [(1.0, 1.0, 1.0, 1.0) if np.isnan(r) else cmap(norm(r)) for r in arr]
    
    return arr, cmap, norm

df_map = gpd.read_file(filename, encoding='SHIFT-JIS')

map_hensa_list = []
df_map["place"] = df_map.apply(return_place,axis=1)

for index_1, row_1 in df_map.iterrows():
    match_flag = 0
    for index_2, row_2 in df_yachin.iterrows():
        if row_2['市区町村'] == row_1['place']:
            if row_2['家賃偏差値'] != "-":
                #print(row_1['市区町村'])
                map_hensa_list.append(row_2['家賃偏差値'])
                match_flag = 1
                #print(map_hensa_list)
            elif row_2['家賃偏差値'] == "-":
                map_hensa_list.append(np.nan)
                match_flag = 1
    if match_flag == 0: ## N03_004の市町村がsuumo側の市町村に無かった場合
        map_hensa_list.append(np.nan)
        
df_map["家賃偏差値"] = map_hensa_list

target_color, cmap, norm = colors_scale(df_map["家賃偏差値"])

fig, ax = plt.subplots(figsize=(20,12))
df_map.plot(ax=ax, color=target_color, edgecolor='black')
plt.xlim([138,141])
plt.ylim([34.8,37.3])

sm = ScalarMappable(cmap=cmap, norm=norm)
sm._A = []
cbar = plt.colorbar(sm)

ticks = np.linspace(norm.vmin, norm.vmax, 10)
cbar.set_ticks(ticks)
cbar.ax.set_yticklabels([str(int(s)) for s in ticks])

plt.xticks([])
plt.yticks([])
plt.show()

プログラムは上記コードのコメントアウト部分にも書いてある通り、

(1) データ側の処理 と、

(2) マップ側の処理

に分かれている。

(1) データ側の処理 のポイント

kantou.geojsonで読み込んだデータのdataframeは郡と朝が分かれていたり、市と区が分かれていたりと、suumo内からとってきた表記と異なっているので、suumoからとってきたデータと比較するために加工する。

これをしているのが、

def return_place(row):

という関数。

(2)マップ側の処理 のポイント

ヒートマップの色を偏差値から決める処理は以下のところ。

arr = [(1.0, 1.0, 1.0, 1.0) if np.isnan(r) else cmap(norm(r)) for r in arr]

値がNaNの場合は「白色」(1.0, 1.0, 1.0, 1.0)になるようにしてある。

また、東京は小笠原諸島があり、地図全体が小さくなってしまうので、表示する範囲を以下で指定している。

plt.xlim([138,141])
plt.ylim([34.8,37.3])

結果

偏差値一覧

偏差値一覧は以下のようになった。

偏差値が65以上のところには赤いマーカー、40以下のところには青いマーカーを引いてある

都道府県市区町村家賃家賃偏差値
東京都千代田区10.4万円90.8934
東京都中央区9.5万円84.74108
東京都港区10.9万円94.31136
東京都新宿区7.9万円73.80362
東京都文京区8.0万円74.48721
東京都台東区8.1万円75.17081
東京都墨田区7.9万円73.80362
東京都江東区8.2万円75.8544
東京都品川区8.0万円74.48721
東京都目黒区8.8万円79.95594
東京都大田区7.0万円67.6513
東京都世田谷区7.1万円68.33489
東京都渋谷区9.5万円84.74108
東京都中野区6.9万円66.96771
東京都杉並区6.5万円64.23335
東京都豊島区7.2万円69.01848
東京都北区6.8万円66.28412
東京都荒川区7.0万円67.6513
東京都板橋区6.4万円63.54975
東京都練馬区6.3万円62.86616
東京都足立区6.3万円62.86616
東京都葛飾区5.6万円58.08102
東京都江戸川区5.9万円60.1318
東京都八王子市3.7万円45.09279
東京都立川市4.8万円52.6123
東京都武蔵野市6.1万円61.49898
東京都三鷹市6.1万円61.49898
東京都青梅市3.0万円40.30765
東京都府中市4.7万円51.9287
東京都昭島市4.4万円49.87793
東京都調布市5.5万円57.39743
東京都町田市4.6万円51.24511
東京都小金井市5.8万円59.44821
東京都小平市4.2万円48.51075
東京都日野市3.9万円46.45997
東京都東村山市3.9万円46.45997
東京都国分寺市5.3万円56.03025
東京都国立市5.2万円55.34666
東京都福生市3.5万円43.72561
東京都狛江市5.4万円56.71384
東京都東大和市4.5万円50.56152
東京都清瀬市4.3万円49.19434
東京都東久留米市4.9万円53.29589
東京都武蔵村山市3.8万円45.77638
東京都多摩市4.3万円49.19434
東京都稲城市4.0万円47.14357
東京都羽村市3.8万円45.77638
東京都あきる野市3.9万円46.45997
東京都西東京市5.2万円55.34666
東京都西多摩郡2.9万円39.62406
東京都大島支庁
東京都大島町
東京都利島村
東京都新島村
東京都神津島村
東京都三宅支庁
東京都三宅島三宅村
東京都御蔵島村
東京都八丈支庁
東京都八丈島八丈町
東京都青ヶ島村
東京都小笠原支庁
東京都小笠原村
神奈川県横浜市鶴見区5.6万円58.08102
神奈川県横浜市神奈川区5.6万円58.08102
神奈川県横浜市西区6.4万円63.54975
神奈川県横浜市中区6.3万円62.86616
神奈川県横浜市南区5.0万円53.97948
神奈川県横浜市保土ケ谷区4.5万円50.56152
神奈川県横浜市磯子区4.0万円47.14357
神奈川県横浜市金沢区4.8万円52.6123
神奈川県横浜市港北区6.2万円62.18257
神奈川県横浜市戸塚区5.0万円53.97948
神奈川県横浜市港南区5.0万円53.97948
神奈川県横浜市旭区4.7万円51.9287
神奈川県横浜市緑区5.3万円56.03025
神奈川県横浜市瀬谷区3.4万円43.04202
神奈川県横浜市栄区5.1万円54.66307
神奈川県横浜市泉区5.6万円58.08102
神奈川県横浜市青葉区5.5万円57.39743
神奈川県横浜市都筑区6.9万円66.96771
神奈川県川崎市川崎区6.5万円64.23335
神奈川県川崎市幸区6.9万円66.96771
神奈川県川崎市中原区6.2万円62.18257
神奈川県川崎市高津区6.7万円65.60053
神奈川県川崎市多摩区5.0万円53.97948
神奈川県川崎市宮前区5.7万円58.76462
神奈川県川崎市麻生区4.6万円51.24511
神奈川県相模原市緑区4.0万円47.14357
神奈川県相模原市中央区3.3万円42.35843
神奈川県相模原市南区4.2万円48.51075
神奈川県横須賀市4.5万円50.56152
神奈川県平塚市5.5万円57.39743
神奈川県鎌倉市7.0万円67.6513
神奈川県藤沢市5.7万円58.76462
神奈川県小田原市4.7万円51.9287
神奈川県茅ヶ崎市5.8万円59.44821
神奈川県逗子市5.8万円59.44821
神奈川県三浦市5.1万円54.66307
神奈川県秦野市3.1万円40.99124
神奈川県厚木市4.5万円50.56152
神奈川県大和市3.8万円45.77638
神奈川県伊勢原市4.5万円50.56152
神奈川県海老名市4.5万円50.56152
神奈川県座間市3.5万円43.72561
神奈川県南足柄市3.1万円40.99124
神奈川県綾瀬市4.8万円52.6123
神奈川県三浦郡葉山町6.0万円60.81539
神奈川県高座郡5.1万円54.66307
神奈川県中郡2.9万円39.62406
神奈川県足柄上郡3.5万円43.72561
神奈川県愛甲郡3.6万円44.4092
神奈川県足柄下郡4.8万円52.6123
千葉県千葉市中央区5.2万円55.34666
千葉県千葉市花見川区4.5万円50.56152
千葉県千葉市稲毛区4.6万円51.24511
千葉県千葉市若葉区4.4万円49.87793
千葉県千葉市緑区4.2万円48.51075
千葉県千葉市美浜区5.6万円58.08102
千葉県銚子市2.8万円38.94047
千葉県市川市5.5万円57.39743
千葉県船橋市5.5万円57.39743
千葉県館山市5.8万円59.44821
千葉県木更津市4.5万円50.56152
千葉県松戸市4.9万円53.29589
千葉県野田市3.5万円43.72561
千葉県茂原市2.6万円37.57329
千葉県成田市5.5万円57.39743
千葉県佐倉市3.5万円43.72561
千葉県東金市2.7万円38.25688
千葉県旭市2.7万円38.25688
千葉県習志野市4.8万円52.6123
千葉県柏市4.8万円52.6123
千葉県勝浦市3.3万円42.35843
千葉県市原市5.0万円53.97948
千葉県流山市5.0万円53.97948
千葉県八千代市4.0万円47.14357
千葉県我孫子市3.8万円45.77638
千葉県鴨川市3.6万円44.4092
千葉県鎌ケ谷市4.3万円49.19434
千葉県君津市4.3万円49.19434
千葉県富津市5.0万円53.97948
千葉県浦安市5.4万円56.71384
千葉県四街道市5.0万円53.97948
千葉県袖ケ浦市4.9万円53.29589
千葉県八街市3.5万円43.72561
千葉県印西市4.5万円50.56152
千葉県白井市4.5万円50.56152
千葉県富里市4.4万円49.87793
千葉県南房総市3.6万円44.4092
千葉県匝瑳市3.0万円40.30765
千葉県香取市3.5万円43.72561
千葉県山武市2.4万円36.20611
千葉県いすみ市3.5万円43.72561
千葉県大網白里市4.8万円52.6123
千葉県印旛郡3.3万円42.35843
千葉県香取郡3.4万円43.04202
千葉県山武郡3.2万円41.67484
千葉県長生郡2.1万円34.15533
千葉県夷隅郡3.6万円44.4092
千葉県安房郡3.6万円44.4092
埼玉県さいたま市西区5.1万円54.66307
埼玉県さいたま市北区4.2万円48.51075
埼玉県さいたま市大宮区6.5万円64.23335
埼玉県さいたま市見沼区4.5万円50.56152
埼玉県さいたま市中央区5.6万円58.08102
埼玉県さいたま市桜区3.8万円45.77638
埼玉県さいたま市浦和区5.4万円56.71384
埼玉県さいたま市南区4.9万円53.29589
埼玉県さいたま市緑区5.0万円53.97948
埼玉県さいたま市岩槻区3.9万円46.45997
埼玉県川越市4.3万円49.19434
埼玉県熊谷市3.8万円45.77638
埼玉県川口市5.4万円56.71384
埼玉県行田市3.0万円40.30765
埼玉県秩父市3.6万円44.4092
埼玉県所沢市3.8万円45.77638
埼玉県飯能市3.7万円45.09279
埼玉県加須市3.0万円40.30765
埼玉県本庄市3.2万円41.67484
埼玉県東松山市4.1万円47.82716
埼玉県春日部市4.3万円49.19434
埼玉県狭山市3.0万円40.30765
埼玉県羽生市3.8万円45.77638
埼玉県鴻巣市3.4万円43.04202
埼玉県深谷市4.4万円49.87793
埼玉県上尾市5.4万円56.71384
埼玉県草加市4.4万円49.87793
埼玉県越谷市4.8万円52.6123
埼玉県蕨市5.2万円55.34666
埼玉県戸田市5.0万円53.97948
埼玉県入間市3.2万円41.67484
埼玉県朝霞市4.4万円49.87793
埼玉県志木市4.8万円52.6123
埼玉県和光市5.5万円57.39743
埼玉県新座市4.8万円52.6123
埼玉県桶川市3.7万円45.09279
埼玉県久喜市3.9万円46.45997
埼玉県北本市4.2万円48.51075
埼玉県八潮市5.5万円57.39743
埼玉県富士見市4.1万円47.82716
埼玉県三郷市4.6万円51.24511
埼玉県蓮田市4.9万円53.29589
埼玉県坂戸市3.8万円45.77638
埼玉県幸手市3.6万円44.4092
埼玉県鶴ヶ島市2.9万円39.62406
埼玉県日高市3.8万円45.77638
埼玉県吉川市5.3万円56.03025
埼玉県ふじみ野市3.9万円46.45997
埼玉県白岡市5.5万円57.39743
埼玉県北足立郡4.6万円51.24511
埼玉県入間郡3.1万円40.99124
埼玉県比企郡4.4万円49.87793
埼玉県秩父郡3.6万円44.4092
埼玉県児玉郡2.3万円35.52251
埼玉県大里郡2.3万円35.52251
埼玉県南埼玉郡3.3万円42.35843
埼玉県北葛飾郡3.0万円40.30765
茨城県水戸市3.6万円44.4092
茨城県日立市3.5万円43.72561
茨城県土浦市3.5万円43.72561
茨城県古河市
茨城県石岡市2.8万円38.94047
茨城県結城市4.1万円47.82716
茨城県龍ケ崎市2.9万円39.62406
茨城県下妻市2.1万円34.15533
茨城県常総市4.1万円47.82716
茨城県常陸太田市3.3万円42.35843
茨城県高萩市3.8万円45.77638
茨城県北茨城市2.4万円36.20611
茨城県笠間市2.9万円39.62406
茨城県取手市3.2万円41.67484
茨城県牛久市4.9万円53.29589
茨城県つくば市4.5万円50.56152
茨城県ひたちなか市4.4万円49.87793
茨城県鹿嶋市4.4万円49.87793
茨城県潮来市2.4万円36.20611
茨城県守谷市3.6万円44.4092
茨城県常陸大宮市1.8万円32.10456
茨城県那珂市2.9万円39.62406
茨城県筑西市3.0万円40.30765
茨城県坂東市2.5万円36.8897
茨城県稲敷市3.5万円43.72561
茨城県かすみがうら市2.5万円36.8897
茨城県桜川市3.2万円41.67484
茨城県神栖市4.5万円50.56152
茨城県行方市3.6万円44.4092
茨城県鉾田市4.4万円49.87793
茨城県つくばみらい市5.1万円54.66307
茨城県小美玉市2.4万円36.20611
茨城県東茨城郡2.3万円35.52251
茨城県那珂郡4.9万円53.29589
茨城県久慈郡3.6万円44.4092
茨城県稲敷郡2.9万円39.62406
茨城県結城郡3.6万円44.4092
茨城県猿島郡3.3万円42.35843
茨城県北相馬郡3.6万円44.4092
栃木県宇都宮市4.3万円49.19434
栃木県足利市1.9万円32.78815
栃木県栃木市3.9万円46.45997
栃木県佐野市3.3万円42.35843
栃木県鹿沼市3.5万円43.72561
栃木県日光市3.0万円40.30765
栃木県小山市3.0万円40.30765
栃木県真岡市2.7万円38.25688
栃木県大田原市3.4万円43.04202
栃木県矢板市2.3万円35.52251
栃木県那須塩原市3.7万円45.09279
栃木県さくら市4.0万円47.14357
栃木県那須烏山市3.2万円41.67484
栃木県下野市2.4万円36.20611
栃木県河内郡4.1万円47.82716
栃木県芳賀郡3.1万円40.99124
栃木県下都賀郡3.0万円40.30765
栃木県塩谷郡4.2万円48.51075
栃木県那須郡3.4万円43.04202
群馬県前橋市3.3万円42.35843
群馬県高崎市3.9万円46.45997
群馬県桐生市2.7万円38.25688
群馬県伊勢崎市3.6万円44.4092
群馬県太田市4.0万円47.14357
群馬県沼田市3.6万円44.4092
群馬県館林市1.5万円30.05378
群馬県渋川市2.9万円39.62406
群馬県藤岡市3.5万円43.72561
群馬県富岡市3.7万円45.09279
群馬県安中市3.0万円40.30765
群馬県みどり市3.0万円40.30765
群馬県北群馬郡3.0万円40.30765
群馬県多野郡
群馬県甘楽郡3.6万円44.4092
群馬県吾妻郡4.2万円48.51075
群馬県利根郡3.6万円44.4092
群馬県佐波郡3.3万円42.35843
群馬県邑楽郡2.9万円39.62406

実際、東京の家賃と神奈川の家賃のような県をまたいだ比較はあまり見かけることが無い。

だが実際見てみると、神奈川もそれなりに高いところがあることが分かる。

これは注意が必要だ。

東京でないから、家賃が安いと思ってしまいると実は東京の方が家賃が安くて住めるところがあるかもしれないからだ。

にしても、千代田区と港区の家賃偏差値は高すぎる...。関東全体で見ると90を超えている...。

ヒートマップ

ヒートマップの出力結果は以下のようになっている。

このヒートマップをみると、周りは家賃偏差値が低いのにそこだけ突然高くなっている箇所もあることが分かる。

隣の市にしておけばもっと安かったのにってことになりかねない。

また、県境がいまいちわかりにくいので都道府県の境界入りも作った。

これはプログラムではなく手で線を書いた(笑)。

さて、これまでを踏まえて例えば勤務地が「池袋(豊島区)」だとすると、東京の豊島区に住むより、少しの通勤時間を妥協し、少し上の川口市に住む方が妥当に思える。

偏差値としては豊島区は69で、川口市は56であるからだ。

住む場所をどうするかの参考になれば幸いである。

これからも暮らしに役立つ、コスパのための分析をしていきたい。


タイトルとURLをコピーしました