クソ診断紹介4「関東地方ダーツの旅」

この記事は、クソ診断 Advent Calendar 2019 の23日目の記事です。

1. はじめに

皆さんこんばんは。4週間にわたり続けたクソ診断紹介も最終回となってしまいました。今回は、「旅に出たいものの行先が思いつかない」といったときに使える(?)診断「関東地方ダーツの旅」を紹介したいと思います。
この診断では、関東地方全域から1つの地点をランダムに抽選し、その場所を示すGoogle Mapのリンクが表示されます。
診断テキストには、東京駅を基準とした東西方向および南北方向の距離が表示されるので、大まかな場所の予想を立てた後でGoogle Mapを確認してみるのも面白いかと思います。
まだこの診断を回したことがない方は、さっそく以下のリンクから挑戦してみましょう。

shindanmaker.com

行き先のない旅

皆様は、旅行を思い立ったとき、事前にどれだけ下調べを行うでしょうか。
旅行の目的が明確な場合、その達成のために観光地の営業時間や交通機関の時刻表を調べるといった事前計画は重要です。一方、綿密に計画を立てた旅行は、計画を消化する「流れ作業」に終始する傾向にあることも否めません。
旅に出たいものの具体的な行き先は思いつかない、または事前計画を立てず感性の赴くまま自由に行動したい場合、行き先がランダムに決定された方がかえって好都合なことも多いように思えます。

行き先を定めない旅行に対する需要を汲み取ってか、数多くの旅行会社が、出発当日まで行き先が明かされない「ミステリーツアー」を企画しています。また、日本航空では、4つの行き先候補地が提示された状態で特典航空券を申し込み、後日最終的な行き先がランダムに決まる「どこかにマイル」サービスを提供しています。

ご予約の際に、4つの行き先候補地をJALからご提案。そのなかからお申し込みから3日以内に、決定した行き先をお知らせします。いつもとは違うワクワクする旅の出会いや、偶然が生み出す発見の旅をお楽しみください。

どこかにマイル - JALマイレージバンク

テレビ番組内での旅行企画

いくつかのバラエティ番組では、サイコロやダーツを使い、行き先を偶然性に任せて決める旅行企画が度々行われ、人気を博しています。

  • 「サイコロの旅」(水曜どうでしょう)
    各サイコロの目に交通機関と行き先の組み合わせが割り当てられます。乗り継ぎのたび、サイコロを振って出た目に対応する交通機関への乗車を繰り返すことで、スタートの東京からゴールの札幌を目指す企画です。

  • 「日本列島ダーツの旅」(1億人の大質問!?笑ってコラえて!)
    区画ごとに分けられた日本地図にダーツの矢を投げ、当たった区画内の町村を実際に訪問する企画です。 区画の多くは南北約30km、東西約40kmの長方形となっている為、比較的行先の融通が利きやすそうにみえます。

「関東地方ダーツの旅」は、この「日本列島ダーツの旅」から着想を得て作成した診断となりますが、以下の点において着想元の企画とは異なります。

  • 対象範囲が関東地方に限定されること
  • 行先が区画ではなく、ピンポイントで指定されること

2. 「ダーツの的」を作る

この章では、「ダーツの的」に相当するデータの作成方法について、試行錯誤の過程を踏まえながら説明していきます。
より良い診断結果を得るため、以下の3点を目標として設定しました。

  • 目標1: 結果が他ユーザと被らないようパターン数を十分多くすること
  • 目標2: 他地方や海域を出力しないこと
  • 目標3: 可能な限り多くのエリアを結果候補に含めること

さて、診断メーカーのシステムでは、リストに以下の厳しい制約条件が課せられています。

  • リストの数は最大10個
  • 各リストに入れられる最大の値の数は999個

果たして、制約条件の範囲内で目標1~目標3を全て満たすような「ダーツの的」を作成することはできるのでしょうか。

試行錯誤の過程

以降、X および Y はそれぞれ診断結果の東西方向および南北方向の座標を表すものとします。

手法1: リストに格納した X および Y をそのまま結果表示に用いる

関東地方の内部の点をリストに格納するだけの最もシンプルな方法です。しかしこれでは、リストの制約条件より結果パターンの最大数は9990通りにしかならず、結果が他ユーザと容易に被ってしまいます

手法2: X および Y に値域を設定し、その範囲内で独立に抽選を行う

このとき、診断結果の座標が取りうる範囲の軌跡は長方形または正方形となります。

また、結果パターン数は(Xがとりうる値の場合の数) × (Yがとりうる値の場合の数)となり、手法1と比較して格段に結果パターン数を増加させることができます。

例えば、あるリストにkm単位での座標の整数部分(-100km~+99km, 1km間隔)を、別のリストに小数部分(5m~995m, 10m間隔)を格納し抽選に利用すると、XおよびYがとりうる値の場合の数はそれぞれ2万通りとなるため、約4億通りの結果パターンを得ることができます。これだけの結果パターンがあれば、診断結果が他ユーザと被る可能性を心配する必要はないでしょう。

診断作成当時(2016/09/24)はこの手法が採用されており、東京駅を中心とした一辺200kmの正方形の内部を抽選対象領域としていました。しかし、この手法は高確率で関東地方以外の場所が抽選されるという問題を抱えていました。

診断作成当時の抽選対象領域と関東地方の位置関係について、図1に示します。 抽選対象領域40,000km^{2}16,483km^{2}は関東地方外(山梨県静岡県、または海域)となっており、抽選結果が関東地方内に収まる確率は58.8%ほどしかありませんでした。

また、北関東3県の一部地域は東京駅から北に100km以上離れていることもあり、関東地方32,420km^{2}のうち抽選対象領域がカバーする面積は23,517km^{2}と、割合にして72.5%に過ぎませんでした。

f:id:yryrrrrryryr:20191223234220p:plain:w400
図1 手法2における抽選対象領域と関東地方との位置関係

なお、関東地方外が抽選対象となる問題については、診断結果の座標が取りうる範囲の軌跡が関東地方の領域内に収まるよう X および Y の値域を調整することで解決が可能です。しかし、単一の正方形領域のみで抽選対象領域を表現しようとした場合、「抽選結果が関東地方内に収まる確率」と「抽選対象領域がカバーする面積の割合」はトレードオフの関係となってしまいます。

手法3: 合同な正方形を、関東地方の領域内に敷き詰める

本手法では、抽選対象領域を複数の正方形領域に拡張することを考えます。具体的には、図2のように合同な正方形(以下、グリッド)を関東地方の領域内にすき間なく敷き詰めていきます。このとき、抽選対象領域は関東地方の領域の内部にあるため、出力される抽選結果は関東地方の領域内であることが保証されます

f:id:yryrrrrryryr:20191224013043p:plain:w400
図2 2kmグリッドで構成された抽選対象領域

なお、グリッドの作成には、QGISというオープンソースの地理情報空間システムソフトウェアを使用しました。
https://www.qgis.org/ja/site/about/index.html

手法3における抽選方法の概要について、図3に示します。 グリッドの絶対位置→グリッド内の相対位置 の順番で抽選が行われます。

f:id:yryrrrrryryr:20191224010153p:plain:w400
図3 手法3における抽選方法の概要

最初に、グリッドリストからグリッドを1つ抽選し、その中心座標(X_0,Y_0)を取得します。

次に、グリッド内の位置を抽選するため、(-1,1)の範囲をとる一様乱数リストを作成し、そこから2つの独立した値(p,q)を抽選します。

グリッドの辺長をLとしたとき、求める(X,Y)は、

 \large X = X_0 + p×\frac{L}{2}

 \large Y = Y_0 + q×\frac{L}{2}

となります。

しかし、リストの制約条件から、最大でも8,991個のグリッドデータ(乱数抽選用リストを除いたリスト9個分)しか格納できないことに注意が必要です。

関東地方の面積は 32,420km^{2}、また格納可能なグリッドデータの総面積は8,991L^{2} なので、関東地方全体をグリッドデータで表現するためにはおおむねL≧1.9kmに設定する必要があります。

例えば、図2のように2kmグリッドで抽選対象領域を構成した場合、グリッドデータの数は7,621個、総面積は30,484km^{2}となります。抽選対象領域の関東地方面積カバー率は94.0%と、手法2と比較して大幅に改善しているものの、他地方との境界線付近および沿岸部での取りこぼしが多いことが課題として残ります。

手法4: 異なる大きさの正方形を、関東地方の領域内に敷き詰める(最終的に採用)

手法3では、格納可能なグリッドデータ数の制約から、グリッドの辺長Lを大きく設定せざるを得ないことが問題となりました。手法4では、複数のサイズのグリッドを用意し、内陸部には大きいグリッドを、沿岸部や他地方との境界では小さなグリッドを使うことで、グリッドデータ数を節約しつつ面積カバー率の改善を目指します。

今回は、辺長がそれぞれ5.4km, 1.8km, 0.9km, 0.6km, 0.3kmである5種類のグリッドを用意しました。図4に、グリッドの作成順序を伊豆大島を例に示します。大きいグリッドから優先的に領域を埋めていき、なお空いている部分に対してより小さなグリッドが使われるようにしています。また、作成した関東地方(島しょ部除く)全域のグリッドマップを図5に示します。最も大きな5.4kmグリッドが面積のほとんどを占めており、辺長が1.8km以下のグリッドは沿岸部や他地方との境界に対し補助的に使われていることがわかると思います。

f:id:yryrrrrryryr:20191224025539p:plain:w400
図4 グリッドの作成順序

f:id:yryrrrrryryr:20191222224611p:plain:w400
図5 関東地方(島しょ部除く)全域のグリッドマップ

以下に、グリッドサイズ別のグリッド数、総面積、および抽選対象領域の累積面積カバー率を示します。大きなグリッドと小さなグリッドを併用することにより、面積カバー率を98.85%まで改善することができました。

辺長(km) グリッド当り面積(km^{2}) グリッド数 総面積(km^{2}) 累積カバー率
5.4 29.16 961 28,023 86.44%
1.8 3.24 799 2,589 94.42%
0.9 0.81 990 802 96.90%
0.6 0.36 904 325 97.90%
0.3 0.09 3439 310 98.85%

また、このときのグリッドデータの総数は7,093個であり、グリッドサイズ抽選用リスト、乱数抽選用リストを除いた使用可能なリスト8個以内にデータを収めることが可能です。

3. 診断メーカーに実装してみる

抽選方法の概要

この診断における抽選方法の概要を図6に示します。グリッドサイズ→グリッドの絶対位置→グリッド内の相対位置 の順番で抽選を行います。

f:id:yryrrrrryryr:20191222201139p:plain:w400
図6 本診断における抽選方法の概要

また、各リストはそれぞれ以下の用途で使われています。

リスト名 リストの説明
[LIST1] グリッドサイズの抽選用
[LIST2] グリッド内の相対位置の抽選用
[LIST3][LIST10] グリッドの絶対位置の抽選用

Step 1 : グリッドサイズの抽選

Step 1では、5種類のサイズのグリッドの中からどれを選ぶか抽選します。[LIST3][LIST10]には、グリッドサイズにより異なる番号のリストにグリッドの絶対位置が格納されています。[LIST1]は、[LIST3][LIST10]のうち1つだけを参照し、グリッドサイズの抽選を行うための「くじ」の役割を果たします。

ここで、各リストの値の数は999以下に制限されているため、0.3kmグリッドは[LIST3][LIST6]に4分割して格納しました。
また、各場所が選択される確率を一様にするため、リストの抽選割合は、各リスト中に含まれるグリッドの総面積に比例させる必要があります。そこで、[LIST1]中の出現回数は、[LIST3][LIST6] (0.3kmグリッド) を各2回とし、残りは面積占有率に比例するよう設定しました。

リスト番号 辺長(km) グリッド数 面積占有率 [LIST1]中の出現回数
[LIST3] 0.3 860 0.24% 2
[LIST4] 0.3 860 0.24% 2
[LIST5] 0.3 860 0.24% 2
[LIST6] 0.3 859 0.24% 2
[LIST7] 0.6 904 1.02% 8
[LIST8] 0.9 990 2.50% 21
[LIST9] 1.8 799 8.08% 67
[LIST10] 5.4 799 87.44% 724

Step 2 : 具体的なグリッドの抽選

[LIST3][LIST10]の値には、各グリッドの中心位置における「東京駅からの東西および南北方向距離(それぞれ東と北が正方向)」、「経度緯度」、「経度1度あたり距離」が格納されています。

項目 値の例
東京駅からの東西方向距離 X_0 (km) -122.177
東京駅からの南北方向距離 Y_0 (km) 91.006
経度 λ_0 (deg) 138.40186
緯度 φ_0 (deg) 36.49298
経度1度あたり距離 (km/deg) 89.236

Step 3 : グリッド内の位置の抽選

最後に、グリッド内での東西方向の相対位置( \large p×\frac{L}{2})、および南北方向の相対位置( \large q×\frac{L}{2})を求めるため、pおよびqについてそれぞれ独立した抽選を行います。

[LIST2]には、pおよびqに代入する為の一様乱数が500個(-0.998から+0.998まで0.004刻み)格納されています。

東京駅からの東西方向距離 X および 南北方向距離 Y は、それぞれ以下の式にて計算されます。

 \large X = X_0 + p×\frac{L}{2}

 \large Y = Y_0 + q×\frac{L}{2}

このとき、抽選されうる場所同士の間隔は、最も小さい0.3kmグリッドで 0.6m、最も大きい5.4kmグリッドでも 10.8m となり、地理的に密な抽選結果を得ることができます。

また、Google Mapへのリンク生成時に用いられる 緯度 φ および 経度 λ は、それぞれ以下の式にて計算されます。

 \large φ = φ_0 + q×\frac{L}{2×111}

 \large λ = λ_0 + p×\frac{L}{2×111×cosφ}

診断結果例

2019/12/22に診断を回してみた結果、埼玉県秩父市の山奥を提示されました。
最寄駅である三峰口駅からは30kmほど離れた場所にあり、公共交通機関のみを用いて到達するのは極めて困難な場所といえるでしょう。

赤きちさんは、東京駅から西に88 km、北に31.53 km 離れたこの場所に行ってらっしゃい!
www.google.co.jp/maps/place/35.96117,138.78988

4. おわりに

今回は、「結果パターン数を十分多くする」「他地方や海域を出力しない」「可能な限り多くのエリアを結果候補に含める」の3点を目標とし、関東地方全域から1つの地点をランダムに抽選する診断を作りました。結果として、他地方や海域を出力させることなく、関東地方の98.85%のエリアを抽選対象領域に含めた診断を作ることができました。

この診断は一見すると実用的な部類に入りそうですが、作者としてはこの診断は手間をかけただけのクソ診断に過ぎないという認識でいます。診断結果例でも示したとおり、公共交通機関で到達困難な場所が診断結果となることも非常に多く、安易な「実用」は危険を伴います。

この診断で選ばれた場所に「実際に行ってみた」といったコメント等は歓迎しますが、私有地や立入禁止区域に入ることは現に謹んでください。また、遭難等のトラブルに巻き込まれないよう、身の安全を優先して行動してください。当然ですが、湖沼や河川等が診断結果に表示された場合でも、決して入水しようと思わないでください

以上にて私のクソ診断紹介を終了したいと思います。ここまで読んでくださった皆様に、深く感謝申し上げます。

(参考1) 島しょ部の出現確率について

グリッドデータには、伊豆諸島および小笠原諸島のものも含まれています。これら島しょ部の面積の合計は359.10km^{2}であり、関東地方の面積の約1.11%を占めています。ただし、島しょ部は単位面積あたりの沿岸距離が長くなり、グリッドによる面積カバー率が相対的に低下することから、診断メーカー上での出現確率は約1.02%と若干低くなっています。

地域 実際の面積(km^{2}) カバー率 グリッドの総面積(km^{2})
関東全域 32,420 98.85% 32,048
島しょ部 359.1 91.10% 327.2

また、診断上での最南端は「南硫黄島」であり、診断メーカー上での出現確率は約0.007%となっています。(日本最南端の沖ノ鳥島は本診断では残念ながら出現しません)
暇があったら是非離島が出るまで診断を回し続けてみてください。

(参考2) 本診断の姉妹版

(参考3) ソースコード

診断に使用した基本診断テキストおよび各リストをgithubに公開したので、興味のある人はご覧ください。 github.com