同じ条件で繰り返すと UrbanAgents の結果はどれだけ動くか

UrbanAgents で同一条件のシミュレーションと施策比較を繰り返し、平均満足度や次元別の平均が実行ごとにどれだけ変わるかを記録した。

問い

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 が各製品で使うデータの出所はデータの出所と測定にまとめている。

出典

  1. PLATEAU サイトポリシー(国土交通省) (参照日 2026.10.11)
  2. 国土数値情報ダウンロードサイト 利用規約(国土交通省) (参照日 2026.10.11)
  3. 国土数値情報 用途地域データ(国土交通省) (参照日 2026.10.11)
  4. 国土数値情報 地価公示データ(国土交通省) (参照日 2026.10.11)
  5. 国土数値情報 鉄道データ(国土交通省) (参照日 2026.10.11)
  6. 国土数値情報 洪水浸水想定区域データ(河川単位)(国土交通省) (参照日 2026.10.11)
  7. 国土数値情報 土砂災害警戒区域データ(国土交通省) (参照日 2026.10.11)
  8. 政府統計の総合窓口(e-Stat)利用規約 (参照日 2026.10.11)
  9. UrbanAgents の使い方(DXA Labs) (参照日 2026.10.11)
  10. データの出所と測定(DXA Labs) (参照日 2026.10.11)