第4次500m地域メッシュの区画
Δlatitude = 15 / 3600 度
Δlongitude = 22.5 / 3600 度
Center = (南西端 + 北東端) / 2- Δlatitude / Δlongitude
- 1区画の緯度/経度幅。
- Center
- 実境界の中心座標。緯度経度の中点です。
第3次を縦横2分割する「2分の1地域メッシュ」。境界ファイルの取得ではなく、統計局の区画定義から駅周辺81区画を生成しています。人口統計は未導入です。
AI上の見つかりやすさから、商圏の次の一手を見つける。
「どう計算したか」を、現在の値・変数の意味・SQLと一緒に確認できます。標準モデルの応用とHALL AI独自式を区別し、独自の重みを統計的に実証済みとは扱いません。
PUBLIC STATISTICSは区分の説明です。人口統計は現在未導入で、Population: DEMOです。計算済みのDERIVED値でも入力がDEMOなら結果はSIMULATEDです。
REALは実在の基本情報、PUBLIC STATISTICSは公的統計、DERIVEDは計算した値、SIMULATEDは営業デモです。計算済みだから実測とは限りません。現在のAI Visibility 72、Headline 81、Alert +18ptはデモ入力です。
確認済みの固定fixtureと実在地理。台数は公開参考値で、オーシャンスロット182/192の差は要再確認。
地理院タイルとJIS区画定義による実在地理です。タイル障害時の格子は実街路ではありません。
現在未導入。公的人口統計を取得済みとは表示しません。計算に使うPopulation IndexはSIMULATEDです。
固定した実座標と区画定義から計算。道路移動時間ではありません。未検証追加店舗の座標を使う場合は入力もDEMOです。
営業デモ用の入力や例。実店舗の実測評価や実AI観測ではありません。
式で計算した派生値でも、入力にDEMOを含むため結果もSIMULATEDです。実ユーザー動線・実来店人数を表しません。
Δlatitude = 15 / 3600 度
Δlongitude = 22.5 / 3600 度
Center = (南西端 + 北東端) / 2第3次を縦横2分割する「2分の1地域メッシュ」。境界ファイルの取得ではなく、統計局の区画定義から駅周辺81区画を生成しています。人口統計は未導入です。
a = sin²(Δφ / 2) + cos(φ1) × cos(φ2) × sin²(Δλ / 2)
D = 2 × 6371 × asin(√clamp(a, 0, 1))道路上の距離や徒歩・車の所要時間ではありません。現実装の地球半径は6371kmです。実座標からの距離はDERIVEDですが、これを使った需要・FlowはSIMULATEDです。
本システムの商圏Flowは、店舗魅力度と距離、比較店舗との相対関係から選択確率を求めるHuff Modelの考え方を参考にしています。店舗魅力度の構成要素や重みは本システム独自です。
W(m,h) = (A(h) / 100)^α ÷ max(D(m,h), 0.2)^β
P(m,h) = W(m,h) ÷ Σj W(m,j)Huffの考え方を参考にしていますが、魅力度の構成・係数・最低距離はHALL AIのPoC設定です。重み合計0の場合は確率0とし、0除算を避けます。
A = 0.40 × AI + 0.25 × Information + 0.20 × Scale + 0.15 × Freshness40%・25%・20%・15%は営業PoCの独自設定で、Huffの標準値でも統計的に実証済みの固定値でもありません。本番では実績を使って校正します。
| 店舗 | 魅力度・デモ | 距離km | Weight | 選択確率 | Flow指数 |
|---|---|---|---|---|---|
| マルハン大山店 | 76.900 | 0.333698 | 5.12469162 | 12.4121% | 14.779778 |
| 楽園 ハッピーロード大山 | 88.350 | 0.172681 | 15.42462193 | 37.3588% | 44.485114 |
| 大山オーシャンパチンコ専門館 | 69.400 | 0.103530 | 11.26972502 | 27.2956% | 32.502256 |
| 大山オーシャンスロット専門館 | 60.700 | 0.069365 | 9.46872070 | 22.9335% | 27.308100 |
Flow(m,h) = PopulationIndex(m) × P(m,h)
FlowShare(h) = Σm Flow(m,h) ÷ Σm,j Flow(m,j) × 100
ParticleRate(i) = ParticleBudget × Flow(i) ÷ TotalFlow粒子は人・GPS・来店を表しません。乱数は演出だけです。経路ごとの発生数は期待値であり、上限・停止・乱数により毎分同じ個数になる保証はありません。
SELECT hall_id, distance_km, raw_weight, choice_probability, flow_index FROM mesh_hall_flows WHERE area_mesh_id = 41 ORDER BY hall_id;ターミナルの sqlite3 database/database.sqlite で上のSELECTを実行できます。設定値を変更した場合は、専用デモDBでSeederを再実行して分析値を揃えてください。
計算してみる:大山駅周辺でおすすめのパチンコ店を教えて / OpenAI (SIMULATED)。この行の掲載順は1、引用はなしです。
| 店舗・区分 | 重み付き回答点の合計 | SOV |
|---|---|---|
| 楽園 ハッピーロード大山 | 31.800000 | 31.80% |
| マルハン大山店 | 24.600000 | 24.60% |
| 大山オーシャンパチンコ専門館 | 18.900000 | 18.90% |
| 大山オーシャンスロット専門館 | 13.100000 | 13.10% |
| Others | 11.600000 | 11.60% |
RankScore = position > 0 ? 1 / position : 0
Score = Mentionあり ? (0.5 + 0.3 × RankScore + 0.2 × Citation) : 0
Visibility(h) = Σq Score(h,q) × PromptWeight(q) × CalibrationWeight(h)
SOV(h) = Visibility(h) ÷ Σj Visibility(j) × 100業界で確立した共通のAI Visibility式ではなく本システム独自です。回答・引用・順位もSIMULATED。合計点0ならSOV0です。
CitationShare(domain) = 引用元domainの件数 ÷ 全引用件数 × 100現在はSample Citationで、実際のAI回答で観測した出典ではありません。引用0件なら割合0とします。
SELECT m.entity, SUM(m.total_score * p.weight * m.calibration_weight) AS visibility FROM ai_mentions m JOIN ai_observations o ON o.id=m.ai_observation_id JOIN prompts p ON p.id=o.prompt_id GROUP BY m.entity;ターミナルの sqlite3 database/database.sqlite で上のSELECTを実行できます。設定値を変更した場合は、専用デモDBでSeederを再実行して分析値を揃えてください。
現在の最大Opportunityのメッシュ 533945963 を使います。
PopulationNorm(m) = PopulationIndex(m) ÷ max PopulationIndex
Gap(m) = max(0, P_topCompetitor(m) − P_focus(m))
Recoverability = Σf max(0, −FeatureGap(f)) × Controllability(f) ÷ Σf max(0, −FeatureGap(f))
Raw(m) = PopulationNorm(m) × Gap(m) × Recoverability
Opportunity(m) = Raw(m) ÷ max Raw × 1000〜100の相対指標であり、改善による来店数・効果の保証ではありません。最大Raw・人口・負のGap合計が0なら該当値を0にします。係数は本番で校正予定です。
SELECT area_mesh_id, gap, recoverability, raw, score FROM mesh_opportunities ORDER BY score DESC;ターミナルの sqlite3 database/database.sqlite で上のSELECTを実行できます。設定値を変更した場合は、専用デモDBでSeederを再実行して分析値を揃えてください。
FeatureGap(f) = FocusScore(f) − CompetitorScore(f)マイナスが大きいほど説明情報の差が大きい想定です。実店舗を実測評価した結果ではありません。本番では情報の存在・具体性・更新日・構造・根拠をルール化し、人が確認します。
SELECT hall_id, feature, score, controllability FROM hall_features WHERE hall_id IN (1, 2) ORDER BY feature, hall_id;ターミナルの sqlite3 database/database.sqlite で上のSELECTを実行できます。設定値を変更した場合は、専用デモDBでSeederを再実行して分析値を揃えてください。
駐車場・アクセス情報を改善
Priority = 100 × clamp(Demand, 0, 1) × clamp(Gap, 0, 1) × clamp(Evidence, 0, 1) × clamp(Controllability, 0, 1)現在は係数の積×100で、候補間の最大値正規化はしていません。93点は1×1×0.93×1×100から出ます。AI APIは使わずテンプレートで説明し、将来も優先順位の数値計算とLLMによる説明文生成を分離する方針です。
SELECT title, demand, gap, evidence, controllability, priority FROM recommendations ORDER BY priority DESC;ターミナルの sqlite3 database/database.sqlite で上のSELECTを実行できます。設定値を変更した場合は、専用デモDBでSeederを再実行して分析値を揃えてください。
入力を差し替えるためのService境界があります。デモ補正を外し、同じ数式でも係数の校正・検証を行います。
将来のAI観測はProvider・Model・日時・Prompt版を保存し、複数回・複数Provider・時系列で確認します。現時点で外部AI/GBP等へ接続していません。
AIは人向けの説明文を作る役割とし、数値の順位計算をLLMへ自由に任せる設計にはしません。