1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

都道府県別の隣接行列の作成 (ほぼGPT-4が仕事する)

Last updated at Posted at 2023-10-17

都道府県別の隣接行列の作成

字空間モデルなどを日本で当てはめる際に、県単位で取得されているデータなどに対しては、県ごとの隣接行列が必要となります。ここでは、それに使用するための隣接行列を作成しました。

データの取得

以下のサイトに、都道府県の隣接関係が記録されているので、これを参考にします。
これを隣接する都道府県に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!
こういうめんどくさい作業を丸投げできるのはマジで神です。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?