問い
UrbanAgents のシミュレーションは、入力を変えずに繰り返すと結果がどれだけ変わるか。また、施策の有無を比べる「シナリオ比較」は、同じ入力で繰り返すと差がどれだけ変わるか。
方法
- 製品と画面:UrbanAgents の
/app。 - 通常のシミュレーション:画面に表示された既定の分析対象(「新宿区」)、エージェント数 10、シナリオなしで、同じ入力のまま 3 回実行した。分析対象は利用者が選ぶものではなく、製品が返す範囲である。
- シナリオ比較:施策「公園」、経度 139.700、緯度 35.695、影響範囲 800 m(既定値)、エージェント数 10 で、同じ入力のまま 2 回実行した。
- 記録:実行ごとに画面の表示を記録し、各実行の CSV をダウンロードした(合計 7 件)。シナリオ比較の各実行の CSV は、「過去のシミュレーション」からその実行を開いてダウンロードした。
- CSV から計算した値:次元別の平均は画面に数値で表示されないため、CSV の各次元の列(空欄を除く)の平均として計算した。 満足度の帯ごとの人数も画面では棒の長さでしか示されないため、CSV の満足度の列から、製品と同じ区分で数えた。 CSV に含まれる文章の列は使っていない。
- 比較の画面の数値:差の表示は、ベースラインとシナリオの二つの百分率の差である。 「次元別比較」の数値は、次元ごとの平均の差(シナリオからベースラインを引いた値)を百倍して表示したものである。 画面はベースラインとシナリオの差に「%」を付けて表示するが、本ノートではこの差をポイントと書き、画面の表示を括弧内に示す。
- 測定日と本番リビジョン:2026-10-13。Cloud Run リビジョン
urbanagents-00014-b62(コミットb880022)。測定の前後でリビジョンは同じだった。結果はこの時点の本番リビジョンの出力である。
仕組みは、上のコミットのコードを読んで確認した。
- 住民は実行のたびに生成される:年齢、収入、世帯人数、職業、6 次元の重みを乱数で決める。重みには平均 0、標準偏差 0.15 の正規乱数を加える。乱数の種は入力から決まらない。
- 居住地の選択に加わる乱数:住民ごと・候補地ごとに、平均 0、標準偏差 0.05 の正規乱数を評価に加えて、最も高い候補地を選ぶ。
- 記録される満足度:選ばれた候補地の、乱数を加える前の評価値である。乱数が変えるのは「どこを選ぶか」であり、候補地の評価値そのものではない。
- 評価値:データがある次元だけを使い、住民の重みで加重平均する。データがない次元は中立の値で埋めずに除く。
- 平均満足度:住民の満足度の平均。
- シナリオ比較は別々の住民で行う:比較は「ベースライン」と「シナリオ」の 2 回のシミュレーションからなり、それぞれが住民を新たに生成し、選択の乱数も別に引く。同じ住民に施策の前後を尋ねる設計ではない。
- 比較の範囲は固定:比較の実行は、通常のシミュレーションとは別の、コードに書かれた固定の範囲(経度 139.68 から 139.72、緯度 35.68 から 35.71)で行う。このため、通常のシミュレーションの値と比較のベースラインの値は直接には比べられない。
- 公園の効果:影響範囲の内側の候補地で、密度の適合を +0.15、建物の適合を +0.1(いずれも上限 1.0)だけ上げる。距離による減衰はない。
- 文章生成は数値に影響しない:言語モデルが作るのは住民ごとの説明文だけで、満足度と次元別の値は文章生成の前に確定する。 本ノートは生成された文章を引用しない。
- 家賃の次元に値があるかどうか:候補地のセルの地価は、そのセルに重なる地価のデータ点の平均で、データ点がないセルでは空のままになる。 家賃の次元は地価があるセルでだけ計算され、ないセルではこの次元が除かれる。 住民には選んだセルの値が記録され、CSV にはその値が出力される。 このため、地価のデータ点がないセルを選んだ住民では、CSV の家賃の欄が空になる。
結果
通常のシミュレーション(同一入力)。
| 実行 | 平均満足度 | 最低 | 最高 | 平均年齢 | 平均年収 |
|---|---|---|---|---|---|
| 1 | 96.0% | 90.0% | 99.9% | 40.3歳 | 621万円 |
| 2 | 93.8% | 88.5% | 99.6% | 31.2歳 | 609万円 |
| 3 | 96.1% | 86.3% | 99.8% | 45.5歳 | 809万円 |
通常のシミュレーションの次元別平均(各実行の CSV から計算。括弧内は値のある住民の数。CSV の列は左から順に affordability、commute、safety、density_fit、building_fit、zoning_fit)。
| 実行 | 家賃 | 通勤 | 安全 | 密度 | 建物 | 用途 |
|---|---|---|---|---|---|---|
| 1 | 0.8382(3) | 0.9884(10) | 0.8500(10) | 値なし(0) | 1.0000(10) | 1.0000(10) |
| 2 | 0.9491(5) | 0.9632(10) | 0.7750(10) | 値なし(0) | 1.0000(10) | 1.0000(10) |
| 3 | 値なし(0) | 0.9662(10) | 0.9000(10) | 値なし(0) | 1.0000(10) | 0.9400(10) |
満足度の帯ごとの人数(各実行の CSV から、製品と同じ区分で計算)。
| 実行 | 0-20 | 20-40 | 40-60 | 60-80 | 80-100 |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 0 | 10 |
| 2 | 0 | 0 | 0 | 0 | 10 |
| 3 | 0 | 0 | 0 | 0 | 10 |
シナリオ比較(同一入力)。差の単位はポイント(二つの百分率の差)で、括弧内は画面の表示である。
| 比較 | ベースライン | シナリオ | 差(シナリオ − ベースライン) |
|---|---|---|---|
| 1 | 90.4% | 91.2% | +0.76 ポイント(画面表示「+0.76%」) |
| 2 | 91.3% | 90.7% | -0.59 ポイント(画面表示「-0.59%」) |
シナリオ比較の次元別の差(画面の表示)。
| 比較 | 家賃 | 通勤 | 安全 | 密度 | 建物 | 用途 |
|---|---|---|---|---|---|---|
| 1 | +4.7 | +1.5 | -5.0 | — | 0.0 | 0.0 |
| 2 | +0.6 | -3.9 | -2.5 | — | 0.0 | 0.0 |
シナリオ比較の各実行の次元別平均(各実行の CSV から計算。括弧内は値のある住民の数。列は上の次元別平均の表と同じ)。
| 比較 | 実行 | 家賃 | 通勤 | 安全 | 密度 | 建物 | 用途 |
|---|---|---|---|---|---|---|---|
| 1 | ベースライン | 0.7999(6) | 0.9518(10) | 0.7500(10) | 値なし(0) | 1.0000(10) | 1.0000(10) |
| 1 | シナリオ | 0.8465(7) | 0.9665(10) | 0.7000(10) | 値なし(0) | 1.0000(10) | 1.0000(10) |
| 2 | ベースライン | 0.8764(5) | 0.9790(10) | 0.7500(10) | 値なし(0) | 1.0000(10) | 1.0000(10) |
| 2 | シナリオ | 0.8823(7) | 0.9400(10) | 0.7250(10) | 値なし(0) | 1.0000(10) | 1.0000(10) |
読み方
- 同じ入力での平均満足度:3 回の表示は 93.8% から 96.1% で、最小と最大の差は 2.3 ポイントだった。「最低」は 86.3% から 90.0%、「最高」は 99.6% から 99.9% だった。
- 住民の属性:平均年齢と平均年収の表示も実行ごとに異なった。住民は実行のたびに新たに生成される。
- 次元別の平均:CSV から計算した平均は、通勤が 0.9632 から 0.9884、安全が 0.7750 から 0.9000、用途が 0.9400 から 1.0000 だった。建物は 3 回とも 1.0000 だった。家賃の次元に値がある住民は、実行の順に 3、5、0 人で、平均を計算できたのは 2 回だった。上記のとおり、値があるかどうかは住民が選んだ地点で決まる。7 件の CSV に現れた 25 地点のうち、家賃の値が常にあるのは 14 地点、常にないのは 11 地点で、値の有無が食い違う地点は 0 だった。実行 3 では、10 人全員が値のない地点を選んでいた。
- 評価に使われた次元:すべての実行で「5 / 6 次元で評価 — 人口統計データは未整備のため対象外です。」と表示された。CSV の密度の列は、7 件すべてで空欄だった。
- 満足度の帯:7 件の実行すべてで、全員が最も高い帯に入った。
- シナリオ比較:同じ入力で 2 回実行した差は +0.76 ポイント(画面表示「+0.76%」)、-0.59 ポイント(画面表示「-0.59%」)で、プラスが 1 回、マイナスが 1 回だった。ベースラインは 90.4%、91.3%、シナリオは 91.2%、90.7% と表示された。
- 次元別の表示:建物の次元の差は 2 回とも「0.0」、密度の次元は「—」と表示された。CSV では、建物の次元の平均はベースラインとシナリオの 4 件すべてで 1.0000 だった。公園による建物の次元への加点には上限がある。 差の数値が表示されたのは、家賃、通勤、安全の次元だった。
- 差の読み方:シナリオ比較のベースラインとシナリオは、別々に生成された住民で実行される。 同じ住民について施策の前後を比べた値ではないため、各回の差には、施策の効果があればその効果と、住民を生成し直したことによる違いの両方が含まれる。今回の 2 回の記録から、施策の効果の有無や大きさを切り分けることはできない。
限界
- 繰り返しは通常のシミュレーション 3 回、シナリオ比較 2 回であり、ばらつきの分布を推定できる回数ではない。上の幅は今回の実行の最小と最大の差である。
- エージェント数はすべて 10 である。エージェント数を変えたときのばらつきは測定していない。
- 分析対象と評価に使われた次元は、測定時点の本番環境に入っているデータに依存する。
- 結果は仮想の住民についての計算であり、実際の居住者の意向や将来の人口移動を示すものではない。
再現手順
- UrbanAgents にサインインし、
/appを開く。 - エージェント数を確認して「シミュレーション開始」を押す。完了後、結果欄の表示を読み、「CSV」を押す。同じ入力で繰り返す。
- シナリオ比較の欄で施策、経度、緯度を入力し、比較を実行する。表示を読み、「過去のシミュレーション」からベースラインとシナリオの各実行を開いて「CSV」を押す。同じ入力で繰り返す。
データの帰属表記
UrbanAgents が候補地の評価に使うデータは、コード上、次のとおりである。今回の測定では、画面の表示のとおり人口統計のデータは未整備で、密度の次元は評価に使われていない。本ノートに掲載した値は、これらを UrbanAgents が加工した結果であり、各データの提供者が作成・保証したものではない。
- 建物:出典:国土交通省 PLATEAUウェブサイト(https://www.mlit.go.jp/plateau/)。PLATEAU の 3D都市モデルを加工して作成。
- 用途地域、地価公示、鉄道、洪水浸水想定区域、土砂災害警戒区域:出典:国土交通省国土数値情報ダウンロードサイト(https://nlftp.mlit.go.jp/ksj/)。「国土数値情報」(国土交通省)の各データを加工して作成。
- 人口:出典:政府統計の総合窓口(e-Stat)(https://www.e-stat.go.jp/)。国勢調査(総務省統計局)のメッシュ統計を加工して作成。
- UrbanAgents の使い方はUrbanAgents の使い方に、DXA Labs が各製品で使うデータの出所はデータの出所と測定にまとめている。