都道府県別の隣接行列の作成
字空間モデルなどを日本で当てはめる際に、県単位で取得されているデータなどに対しては、県ごとの隣接行列が必要となります。ここでは、それに使用するための隣接行列を作成しました。
データの取得
以下のサイトに、都道府県の隣接関係が記録されているので、これを参考にします。
これを隣接する都道府県に1, 隣接しない都道府県に0を立てた行列を作成します
Advanced data analysis (旧Code Interpreter)
まずこれをCode interpreterに投げ込み、Pythonが読み込める形に整形してもらいましょう。HPをドラッグして、コピペします。HTMLで読み込ませると、いらない情報までついてきて非常に厄介なので、このほうがおすすめです。少し形がおかしいところは手動で変形しましょう。
あとは以下のようにして、コードを使って隣接行列に変形します(Python, Rの両方を用意しました。好きなほうを使ってください)。
Pythonで実行するだけ
adjacency_matrix.py
# 都道府県と隣接している都道府県のデータを定義します。
prefectures_data = {
"北海道": ["青森県"],
"青森県": ["北海道", "岩手県", "秋田県"],
"岩手県": ["青森県", "宮城県", "秋田県"],
"宮城県": ["岩手県", "秋田県", "山形県", "福島県"],
"秋田県": ["青森県", "岩手県", "宮城県", "山形県"],
"山形県": ["宮城県", "秋田県", "福島県", "新潟県"],
"福島県": ["宮城県", "山形県", "茨城県", "栃木県", "群馬県", "新潟県"],
"茨城県": ["福島県", "栃木県", "埼玉県", "千葉県"],
"栃木県": ["福島県", "茨城県", "群馬県", "埼玉県"],
"群馬県": ["福島県", "栃木県", "埼玉県", "新潟県", "長野県"],
"埼玉県": ["茨城県", "栃木県", "群馬県", "千葉県", "東京都", "長野県", "山梨県"],
"千葉県": ["茨城県", "埼玉県", "東京都", "神奈川県"],
"東京都": ["埼玉県", "千葉県", "神奈川県", "山梨県"],
"神奈川県": ["千葉県", "東京都", "山梨県", "静岡県"],
"新潟県": ["山形県", "福島県", "群馬県", "富山県", "長野県"],
"富山県": ["新潟県", "石川県", "長野県", "岐阜県"],
"石川県": ["富山県", "福井県", "岐阜県"],
"福井県": ["石川県", "岐阜県", "滋賀県", "京都府"],
"山梨県": ["埼玉県", "東京都", "神奈川県", "長野県", "静岡県"],
"長野県": ["群馬県", "埼玉県", "新潟県", "富山県", "山梨県", "岐阜県", "静岡県", "愛知県"],
"岐阜県": ["富山県", "石川県", "福井県", "長野県", "愛知県", "三重県", "滋賀県"],
"静岡県": ["神奈川県", "山梨県", "長野県", "愛知県"],
"愛知県": ["長野県", "岐阜県", "静岡県", "三重県"],
"三重県": ["岐阜県", "愛知県", "滋賀県", "京都府", "奈良県", "和歌山県"],
"滋賀県": ["福井県", "岐阜県", "三重県", "京都府"],
"京都府": ["福井県", "三重県", "滋賀県", "大阪府", "兵庫県", "奈良県"],
"大阪府": ["京都府", "兵庫県", "奈良県", "和歌山県"],
"兵庫県": ["京都府", "大阪府", "鳥取県", "岡山県", "徳島県"],
"奈良県": ["三重県", "京都府", "大阪府", "和歌山県"],
"和歌山県": ["三重県", "大阪府", "奈良県"],
"鳥取県": ["兵庫県", "島根県", "岡山県", "広島県"],
"島根県": ["鳥取県", "広島県", "山口県"],
"岡山県": ["兵庫県", "鳥取県", "広島県", "香川県"],
"広島県": ["鳥取県", "島根県", "岡山県", "山口県", "愛媛県"],
"山口県": ["島根県", "広島県", "福岡県"],
"徳島県": ["兵庫県", "香川県", "愛媛県", "高知県"],
"香川県": ["岡山県", "徳島県", "愛媛県"],
"愛媛県": ["広島県", "徳島県", "香川県", "高知県"],
"高知県": ["徳島県", "愛媛県"],
"福岡県": ["山口県", "佐賀県", "熊本県", "大分県"],
"佐賀県": ["福岡県", "長崎県"],
"長崎県": ["佐賀県"],
"熊本県": ["福岡県", "大分県", "宮崎県", "鹿児島県"],
"大分県": ["福岡県", "熊本県", "宮崎県"],
"宮崎県": ["熊本県", "大分県", "鹿児島県"],
"鹿児島県": ["熊本県", "宮崎県"],
"沖縄県": [], # 沖縄県は他の都道府県と隣接していない
}
# Creating a list of prefectures based on the order provided in the data (dictionary insertion order)
prefectures_list_ordered = list(prefectures_data.keys())
# Initializing an adjacency matrix with zeros, based on the new order
adjacency_matrix_ordered = np.zeros((len(prefectures_list_ordered), len(prefectures_list_ordered)), dtype=int)
# Filling the adjacency matrix based on the provided order
for i, prefecture1 in enumerate(prefectures_list_ordered):
for j, prefecture2 in enumerate(prefectures_list_ordered):
if prefecture2 in prefectures_data[prefecture1]:
adjacency_matrix_ordered[i, j] = 1 # There is a connection
prefectures_list_ordered, adjacency_matrix_ordered.tolist() # Returning the list of prefectures and the generated adjacency matrix
おわり。
Rのコードも欲しいですよね。わかります。
adjacency_matrix.R
# 都道府県と隣接している都道府県のデータを定義します。
prefectures_data = list(
"北海道"=c("青森県"),
"青森県"=c("北海道", "岩手県", "秋田県"),
"岩手県"=c("青森県", "宮城県", "秋田県"),
"宮城県"=c("岩手県", "秋田県", "山形県", "福島県"),
"秋田県"=c("青森県", "岩手県", "宮城県", "山形県"),
"山形県"=c("宮城県", "秋田県", "福島県", "新潟県"),
"福島県"=c("宮城県", "山形県", "茨城県", "栃木県", "群馬県", "新潟県"),
"茨城県"=c("福島県", "栃木県", "埼玉県", "千葉県"),
"栃木県"=c("福島県", "茨城県", "群馬県", "埼玉県"),
"群馬県"=c("福島県", "栃木県", "埼玉県", "新潟県", "長野県"),
"埼玉県"=c("茨城県", "栃木県", "群馬県", "千葉県", "東京都", "長野県", "山梨県"),
"千葉県"=c("茨城県", "埼玉県", "東京都", "神奈川県"),
"東京都"=c("埼玉県", "千葉県", "神奈川県", "山梨県"),
"神奈川県"=c("千葉県", "東京都", "山梨県", "静岡県"),
"新潟県"=c("山形県", "福島県", "群馬県", "富山県", "長野県"),
"富山県"=c("新潟県", "石川県", "長野県", "岐阜県"),
"石川県"=c("富山県", "福井県", "岐阜県"),
"福井県"=c("石川県", "岐阜県", "滋賀県", "京都府"),
"山梨県"=c("埼玉県", "東京都", "神奈川県", "長野県", "静岡県"),
"長野県"=c("群馬県", "埼玉県", "新潟県", "富山県", "山梨県", "岐阜県", "静岡県", "愛知県"),
"岐阜県"=c("富山県", "石川県", "福井県", "長野県", "愛知県", "三重県", "滋賀県"),
"静岡県"=c("神奈川県", "山梨県", "長野県", "愛知県"),
"愛知県"=c("長野県", "岐阜県", "静岡県", "三重県"),
"三重県"=c("岐阜県", "愛知県", "滋賀県", "京都府", "奈良県", "和歌山県"),
"滋賀県"=c("福井県", "岐阜県", "三重県", "京都府"),
"京都府"=c("福井県", "三重県", "滋賀県", "大阪府", "兵庫県", "奈良県"),
"大阪府"=c("京都府", "兵庫県", "奈良県", "和歌山県"),
"兵庫県"=c("京都府", "大阪府", "鳥取県", "岡山県", "徳島県"),
"奈良県"=c("三重県", "京都府", "大阪府", "和歌山県"),
"和歌山県"=c("三重県", "大阪府", "奈良県"),
"鳥取県"=c("兵庫県", "島根県", "岡山県", "広島県"),
"島根県"=c("鳥取県", "広島県", "山口県"),
"岡山県"=c("兵庫県", "鳥取県", "広島県", "香川県"),
"広島県"=c("鳥取県", "島根県", "岡山県", "山口県", "愛媛県"),
"山口県"=c("島根県", "広島県", "福岡県"),
"徳島県"=c("兵庫県", "香川県", "愛媛県", "高知県"),
"香川県"=c("岡山県", "徳島県", "愛媛県"),
"愛媛県"=c("広島県", "徳島県", "香川県", "高知県"),
"高知県"=c("徳島県", "愛媛県"),
"福岡県"=c("山口県", "佐賀県", "熊本県", "大分県"),
"佐賀県"=c("福岡県", "長崎県"),
"長崎県"=c("佐賀県"),
"熊本県"=c("福岡県", "大分県", "宮崎県", "鹿児島県"),
"大分県"=c("福岡県", "熊本県", "宮崎県"),
"宮崎県"=c("熊本県", "大分県", "鹿児島県"),
"鹿児島県"=c("熊本県", "宮崎県"),
"沖縄県"= character(0) # 沖縄県は他の都道府県と隣接していない
)
# 都道府県のリストを作成します。
prefectures_list_ordered <- names(prefectures_data)
# 接隣行列を初期化します。
adjacency_matrix_ordered <- matrix(0, nrow=length(prefectures_list_ordered), ncol=length(prefectures_list_ordered))
# 接隣行列を埋めます。
for (i in 1:length(prefectures_list_ordered)) {
for (j in 1:length(prefectures_list_ordered)) {
if (prefectures_list_ordered[j] %in% prefectures_data[[i]]) {
adjacency_matrix_ordered[i, j] <- 1 # 接続がある
}
}
}
# 都道府県のリストと生成された接隣行列を返します。
list(prefectures_list_ordered, adjacency_matrix_ordered)
まとめ
隣接行列が生成されました。
あとは、この行列でこことここのつながりはないに等しいなど1つ1つ条件に合うように変更すれば使い物にはなるかなと思います。
結論ありがとう!ChatGPT!
こういうめんどくさい作業を丸投げできるのはマジで神です。