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
実際に開いた店を、モデルが上位10%に選んだマスがどれだけ捕まえたか。でたらめなら10%のところを75.1%捕まえた。
| 業態 | 検証に使った新店 | 倍率 | 95%信頼区間 |
|---|---|---|---|
| コンビニ | 1,236 | 7.5倍 | 7.3 〜 7.7 |
| ドラッグ・薬局 | 129 | 8.4倍 | 7.6 〜 8.9 |
| スーパー | 156 | 8.3倍 | 7.6 〜 8.8 |
ただし絶対値は小さい。上位10%に選ばれたマスでも、1年で店ができる確率は2.17%(全体は0.29%)。「ここに店ができる」ではなく「ここは平均の7.5倍できやすい」という道具である。
福岡県だけで学習した係数を他県にそのまま当てて、現地で学習した場合との差は最大 +0.031。秋田県では福岡で学習したほうが良かった(標本が大きいため)。県を1つずつ隠す46回の検証でも倍率の中央値7.2倍。
面白いのは係数は県で動くのに予測は動かないこと。log人口 の係数は福岡0.230/佐賀0.576/長崎0.111 と3倍違うが、特徴量どうしが相関しているので出てくる予測は一致する。係数を読んで意味を語るなら県ごとに見るべきだが、当てるだけなら1つでよい。
同じモデルでも問いの向きで結果が変わる。10業種・47県・74,507件の開店データで3通り測って、いずれも信号が無かった。
| 測り方 | 結果 |
|---|---|
| 県単位・二重中心化(県の差と業種の差を抜く) | r = +0.085(t = +1.5) |
| メッシュ単位・業種ごとのAUC | 平均 0.508 |
理由ははっきりしている。特徴量に業種を分ける情報が無い。人口・従業者・道路・駅・土地利用は、どの業種にも同じ向きに効く。コンビニに良いマスはドラッグにもレストランにも良い。
思いつく候補を順に足したが、動いたのは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)に対して小さすぎる。
Foursquareの website のドメインでチェーンを識別できる。新規開店2,148件を屋号で分け、周辺3×3の「コンビニのうち自社が占める割合」で自社の新店を他社の新店と見分けられるかを測った。
| チェーン | AUC | 全国シェア |
|---|---|---|
| ミニストップ | 0.934 | 2.9% |
| ファミリーマート | 0.706 | 24.5% |
| ローソン | 0.694 | 21.8% |
| セブン-イレブン | 0.569 | 33.2% |
全チェーンが自社の近くに出している。全国シェアが小さいチェーンほどはっきり出る(セブンはどこにでもあるので「自社シェア」という指標の情報量が小さくなる)。
同じ業種でも、開店を言い当てるのは正反対のほうだった(市街地AUC)。
| 業種 | 個店比率 | チェーン密度 | 個店密度 |
|---|---|---|---|
| コンビニ | 11.5% | 0.540 | 0.429 |
| パン屋 | 93.6% | 0.379 | 0.577 |
| 居酒屋・バー | 95.6% | 0.322 | 0.631 |
負けた側が0.5を下回るのが肝。新しい個店の居酒屋はチェーン居酒屋のある場所を避け、新しいコンビニは個店コンビニのある場所を避けている。2つの世界は互いに反発している。
門前町・城下町・港町・温泉街・アーケード商店街——どれも「昔からそこに人が集まる理由があった場所」だが、説明力はほとんど無かった。残差にはポアソンのばらつきが混ざるので、同じ見込みから作った乱数と分散を比べて「そもそも説明できる分」で割り直した値。
| 業種 | 説明できる分 | 地形・歴史+用途地域 | 隣のマス |
|---|---|---|---|
| 居酒屋・バー | 52% | 10% | 18% |
| 美容・理容 | 32% | 13% | 31% |
| カフェ | 29% | 14% | 31% |
土地の性質より「隣に何があるか」のほうが2倍以上説明力が大きく、それでも合計3割前後。その場所に先に誰かが店を出したという事実そのものが最大の説明変数だった。「なぜここに建てたのか」の答えは、土地を調べても出てこない。
| 沖縄 | 愛知 | 秋田 | 佐賀 | 長崎 | 福岡 | 宮崎 |
|---|---|---|---|---|---|---|
| 1,613 | 1,854 | 1,867 | 1,912 | 2,010 | 2,033 | 2,055 |
人口密度も車依存度も産業構造もまるで違う県で1.3倍の幅に収まる。閉店した711店から測った閾値(周辺の1店あたり人口が2,200人を割ると閉店率が跳ね上がる)は、特定の地域の事情ではなさそうだった。
date_closed は現実の閉店を測っていない——人口が減る県ほど閉店が多いはずなのに相関が +0.44 と符号が逆で、閉店年が2017-18年に山を作る(愛知の閉店の68.5%)。データ側の一括整理とみられる物差しは「まだ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倍という数字は標本の外で確認できているが、適用範囲の線引きは確認できていない。