この記事は shoken-model v1.0.0 に対応します(DOI 10.5281/zenodo.21989890)。

全国 500mメッシュ / 店舗立地

どこかは当たる、何かは当たらない

「何人いればその地域で商売が成り立つか」を業界の目安ではなく実データから測ろうとして、当てられることと当てられないことの境界に行き着いた記録。すべて公的統計と再配布可能なデータで、スクレイピングは使っていない。

全国471,024メッシュ・1億2,532万人 / 30業種 / 実際の開店74,507件で前向きに検証

コードと集計済みデータ github.com/allfestaboss/shoken-model / DOI 10.5281/zenodo.21989889

7.5倍空きマスの順位づけ
46県移転を確認した数
0.508「何の店か」のAUC
1つ効いた特徴量

1まだ1店も無いマスの順位づけは当たる

実際に開いた店を、モデルが上位10%に選んだマスがどれだけ捕まえたか。でたらめなら10%のところを75.1%捕まえた。

業態検証に使った新店倍率95%信頼区間
コンビニ1,2367.5倍7.3 〜 7.7
ドラッグ・薬局1298.4倍7.6 〜 8.9
スーパー1568.3倍7.6 〜 8.8

ただし絶対値は小さい。上位10%に選ばれたマスでも、1年で店ができる確率は2.17%(全体は0.29%)。「ここに店ができる」ではなく「ここは平均の7.5倍できやすい」という道具である。

2全国1つのモデルで足りる

福岡県だけで学習した係数を他県にそのまま当てて、現地で学習した場合との差は最大 +0.031。秋田県では福岡で学習したほうが良かった(標本が大きいため)。県を1つずつ隠す46回の検証でも倍率の中央値7.2倍。

面白いのは係数は県で動くのに予測は動かないこと。log人口 の係数は福岡0.230/佐賀0.576/長崎0.111 と3倍違うが、特徴量どうしが相関しているので出てくる予測は一致する。係数を読んで意味を語るなら県ごとに見るべきだが、当てるだけなら1つでよい。

3「この地域には何の店ができるか」は当てられない

同じモデルでも問いの向きで結果が変わる。10業種・47県・74,507件の開店データで3通り測って、いずれも信号が無かった。

測り方結果
県単位・二重中心化(県の差と業種の差を抜く)r = +0.085(t = +1.5)
メッシュ単位・業種ごとのAUC平均 0.508

理由ははっきりしている。特徴量に業種を分ける情報が無い。人口・従業者・道路・駅・土地利用は、どの業種にも同じ向きに効く。コンビニに良いマスはドラッグにもレストランにも良い。

4効いたのは従業者数だけだった

思いつく候補を順に足したが、動いたのは1つだけ(市街地に絞ったAUCの差)。

足した情報コンビニドラッグスーパー
年齢構成+0.006±0.000−0.001
他業態の集積+0.004+0.015+0.008
地価(1,840地点を内挿)+0.006+0.005+0.009
建物数+0.001−0.001+0.001
従業者数(経済センサス500mメッシュ)+0.035+0.039+0.057

従業者数を入れると地価も他業態の集積も効かなくなる。どちらも昼間の需要の代理だった。駅の乗降客数(全国10,482駅)も同じく吸収される。

年齢は全業種で効かない。保育園(0-4歳)・学習塾(5-19歳)・病院(高齢)でも動かない。年齢別人口は総人口と対数で r=0.98〜0.99 あり、独立な情報を持っていないため。500m四方では年齢構成のばらつき(変動係数0.32)が人口そのもののばらつき(0.97)に対して小さすぎる。

5集積の正体はドミナント出店だった

Foursquareの website のドメインでチェーンを識別できる。新規開店2,148件を屋号で分け、周辺3×3の「コンビニのうち自社が占める割合」で自社の新店を他社の新店と見分けられるかを測った。

チェーンAUC全国シェア
ミニストップ0.9342.9%
ファミリーマート0.70624.5%
ローソン0.69421.8%
セブン-イレブン0.56933.2%

全チェーンが自社の近くに出している。全国シェアが小さいチェーンほどはっきり出る(セブンはどこにでもあるので「自社シェア」という指標の情報量が小さくなる)。

6チェーンと個店は反発する

同じ業種でも、開店を言い当てるのは正反対のほうだった(市街地AUC)。

業種個店比率チェーン密度個店密度
コンビニ11.5%0.5400.429
パン屋93.6%0.3790.577
居酒屋・バー95.6%0.3220.631

負けた側が0.5を下回るのが肝。新しい個店の居酒屋はチェーン居酒屋のある場所を避け、新しいコンビニは個店コンビニのある場所を避けている。2つの世界は互いに反発している。

7個店の集積は土地の性質では説明できない

門前町・城下町・港町・温泉街・アーケード商店街——どれも「昔からそこに人が集まる理由があった場所」だが、説明力はほとんど無かった。残差にはポアソンのばらつきが混ざるので、同じ見込みから作った乱数と分散を比べて「そもそも説明できる分」で割り直した値。

業種説明できる分地形・歴史+用途地域隣のマス
居酒屋・バー52%10%18%
美容・理容32%13%31%
カフェ29%14%31%

土地の性質より「隣に何があるか」のほうが2倍以上説明力が大きく、それでも合計3割前後。その場所に先に誰かが店を出したという事実そのものが最大の説明変数だった。「なぜここに建てたのか」の答えは、土地を調べても出てこない。

81店あたり人口は全国でほぼ同じ

コンビニ1店あたりの人口(人)
沖縄愛知秋田佐賀長崎福岡宮崎
1,6131,8541,8671,9122,0102,0332,055

人口密度も車依存度も産業構造もまるで違う県で1.3倍の幅に収まる。閉店した711店から測った閾値(周辺の1店あたり人口が2,200人を割ると閉店率が跳ね上がる)は、特定の地域の事情ではなさそうだった。

できないこと

  • 閉店は予測できない(AUC 0.61)。しかも多変量が単変量に負ける。さらに Foursquare の date_closed は現実の閉店を測っていない——人口が減る県ほど閉店が多いはずなのに相関が +0.44 と符号が逆で、閉店年が2017-18年に山を作る(愛知の閉店の68.5%)。データ側の一括整理とみられる
  • 大都市圏のコンビニは当たらない。周辺人口密度で 5.7倍(500人/km²未満)から 2.3倍(6,000人/km²以上)まで単調に落ちる。密集地だけで学習し直しても直らない。ただしスーパーは都心でも4.7倍を保つので、一律に大都市圏を外すのは誤り
  • 飲食では素朴な対抗馬に勝てない。「既存店舗数で並べるだけ」と互角。飲食の新店は85.5%が既に店のある場所に出るので、何で並べても当たるため
  • 7.5倍には「都市と田舎を分ける」ぶんが入っている。密集度をそろえて測ると2.5〜4.6倍。1つの街の中で場所を選ぶ用途ならこちらが実力

測り方

物差しは「まだ1店も無いマスの中での順位づけ」に定めた。「どこに店があるか」は既存店舗数で並べるだけで当たるのでモデルの仕事ではない。まだ1店も無いマスでは対抗馬が全マス0で並ぶため原理的に順位をつけられず、そこがモデルの持ち場になる。

全メッシュのAUCは「田んぼの真ん中に店は無い」という自明な当たりで水増しされる(0.87)。判断が要る市街地(周辺人口3,000人以上)に絞ると 0.77〜0.82 に落ちる。以後こちらを使った。

検証はすべて空間ホールドアウト(県を丸ごと隠して学習)と、実際の新規開店による前向き検証(新店を差し引いてから学習し直した汚染ゼロの条件)。倍率を出すときは必ず素朴な対抗馬を並記する。でたらめ(1.0倍)は対抗馬ではない。「今すでにそこにある量」で並べたものが最低限の対抗馬になる。実際、飲食ではその対抗馬に負けた。置かなければ「8倍で当たる」と書いて終わっていた。

物差しをいつ決めたか

この研究の一番弱いところなので明記する。物差しは、結果を見たあとに3回変えている。

いつ何をなぜ変えたか
当初全メッシュのAUC
1回目市街地に限定0.87の大半が「田んぼに店は無い」で稼がれていた
2回目まだ1店も無いマスに限定素朴な対抗馬に飲食で負けたため
3回目コンビニは人口密度1,500人/km²未満密集地で倍率が2.3倍まで落ちるため

答案を見てから採点器を直すのは、測ろうとしている差より改訂のほうが大きく点数を動かす危険がある。この研究では次のように切り分けた。

1回目と2回目は福岡県のデータ(開店143件)を見ながら決め、そのあと物差しを変えずに他46県(開店2,548件)で測った。福岡7.2倍・全国7.5倍で一致している。物差しを決めた標本と、確かめた標本が別になっている。

3回目(密度1,500人/km²)は全国のデータを見て決めており、独立に確かめていない。この閾値だけは「当てはめた値」であって「検証した値」ではない。7.5倍という数字は標本の外で確認できているが、適用範囲の線引きは確認できていない。