日本人口の約3人に1人が高齢者です。世はまさに高齢化の時代ですが、高齢者が安心して楽しく過ごせる都道府県はどこでしょうか。今回は、Pythonで日本の高齢者の割合を地図に色分けして描画してみましょう。そこから、何かポジティブに暮らすヒントが見えてくるでしょうか。

  • 高齢者の割合の多い都道府県はどこ?Pythonで地図を塗り分けよう

    高齢者の割合の多い都道府県はどこ?Pythonで地図を塗り分けよう

今回使う「都道府県:年齢データ」について

今回使うデータは、2024年10月のデータに基づいた「都道府県:年齢データ」です。総務省統計局(こちら)からデータをダウンロードしましょう。このページからは、いろいろなデータがダウンロードできるのですが、今回は、高齢者の分布図を作りたいので、ページ末尾の「第3表 都道府県、年齢(3区分)、男女別人口―総人口(2024年10月1日現在)」のExcelファイルをダウンロードして利用してみましょう。

このファイルを開くと、都道府県別に「15才未満」「15〜64歳」「64歳以上」…のように区分されたデータが記載されています。次のようなExcelの表です。

  • 都道府県別に高齢者の人数が分かるExcel表になっている

    都道府県別に高齢者の人数が分かるExcel表になっている

Excel表から必要なデータを抽出しよう

この表から都道府県別の「15才未満」「15〜64歳」「64歳以上」「うち75才以上」の人数を取り出して、CSVファイルに保存しましょう。具体的には、セルのB14からH60を抽出してCSV形式で保存しましょう。Excelのセルを選択してコピーすると、クリップボードにタブ区切りのテキストが取得できるので、これをテキストファイル「area_population.txt」に保存しましょう。この際、Pythonから扱いやすいように、文字エンコーディングをUTF-8にしておきましょう。

すると、次のように、都道府県コード・都道府県名・空白・15歳未満・15〜64歳・65歳以上・うち75才以上の7列のタブ区切りテキストとなります。

  • 抽出した area_population.txt

    抽出した area_population.txt

なお、ここで作成したデータは、こちらのGistからダウンロードできるようにしました。

「japanmap」で日本地図を色分けしよう

日本地図を手軽に色分けするには、Pythonのライブラリ「japanmap」が便利です。都道府県コードを指定して、自動的に色を塗り分けることができます。

今回も、Pythonを手軽に実行できるクラウドサービス「Google Colab」こちらを利用して、プログラムを実行してみましょう。Colabは、Googleアカウントさえあれば、気軽にPythonを実行できるサービスです。有料プランもありますが、ちょっとグラフを描画するくらいなら、無料の範囲で十分です。

最初に、Colabの新規ノートブックを作成したら、必要なライブラリをインストールしましょう。また、先ほど作成してGistにアップロードしたテキストファイルをダウンロードしましょう。

Colabのセルに以下のコードを貼り付けて実行してみましょう。

# japanmapのインストール
! pip install japanmap

# 都道府県の年齢データのダウンロード
! wget https://gist.githubusercontent.com/kujirahand/c59913050edc3b0bc8cd80646f18550c/raw/08700edfd99e2c1108eb0bd980669311de24ec39/area_population.txt

すると、Colabのクラウドマシン上に、「area_population.txt」というテキストファイルがダウンロードされます。このファイルをPythonのメモリに読み込んでみましょう。以下のプログラムを実行すると、テキストファイルを読み込んで、データを変数resultに格納します。

# データを読み出して変数resultに格納する
import csv
result = []
with open("area_population.txt", "r", encoding="utf-8") as f:
  data = csv.reader(f, delimiter="\t")
  for row in data:
    no = int(row[0]) # 都道府県コード
    name = row[1].replace("\u3000", "").strip() # 都道府県名
    u15 = int(row[3].replace(",", "")) # 15才未満
    u64 = int(row[4].replace(",", "")) # 15〜64才
    o65 = int(row[5].replace(",", "")) # 65才以上
    o75 = int(row[6].replace(",", "")) # うち75才以上
    print(f"{no},{name},{u15},{u64},{o65},{o75}")
    result.append([no, name, u15, u64, o65, o75])
  • 変数resultにデータを読み込んだところ

    変数resultにデータを読み込んだところ

高齢者の割合を計算して地図に描画してみよう

続いて、高齢者の割合を計算して、地図に描画してみましょう。japanmapを使うと、都道府県コードを指定して、簡単に色分けした地図を描画できます。以下のコードを実行してみましょう。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm, colors
from japanmap import picture

# {都道府県コード(1-47): 指標値} の辞書データを作る
values = {}
for row in result:
  code, name, u15, u64, o65, o75 = row
  values[code] = o65 / (u15 + u64 + o65) # 割合を出す --- (※1)

def draw_map(values):
  # ---- valuesを正規化 ----
  arr = np.array(list(values.values()), dtype=float)
  vmin = np.nanmin(arr) if arr.size else 0.0
  vmax = np.nanmax(arr) if arr.size else 1.0
  norm = colors.Normalize(vmin=vmin, vmax=vmax)

  # ---- 連続カラーマップでRGB(0-255)へ ----
  cmap = plt.get_cmap("YlOrRd")  # 見分けやすい黄色→赤
  def to_rgb255(x):
      r, g, b, _ = cmap(norm(x))
      return (int(r*255), int(g*255), int(b*255))

  # ---- 都道府県ごとの色辞書(未指定県は薄灰)----
  base_gray = (230, 230, 230)
  color_map = {code: base_gray for code in range(1, 48)}
  for k, val in values.items():
      if val is not None and not np.isnan(val):
          color_map[k] = to_rgb255(val)

  # ---- 地図画像の描画 ----
  img = picture(color_map)
  fig, ax = plt.subplots(figsize=(6, 7))
  ax.imshow(img)
  ax.axis("off")

  # --- カラーバーの描画 ---
  sm = cm.ScalarMappable(cmap=cmap, norm=norm)
  sm.set_array([])  # ダミー
  cbar = plt.colorbar(sm, ax=ax, fraction=0.03, pad=0.02)

  plt.tight_layout()
  plt.show()

draw_map(values)

プログラムのポイントは、(*1)の部分です。ここで、高齢者(65才以上)の人数を、総人口(15才未満+15〜64才+65才以上)で割って、高齢者の割合を計算しています。この割合を、japanmapに渡すことで、都道府県ごとに色分けした地図が描画します。

実際に実行してみると、次のような日本地図が描画されます。高齢者の割合が高い都道府県を赤で、低い地域を黄色に塗り分けます。

  • 高齢者の割合が高い都道府県を示す地図

    高齢者の割合が高い都道府県を示す地図

念のため、プログラム中で割り出した高齢者の割合を表す変数valuesの上位5件を表示させてみました。

# valuesをソートして上位10件をランキング形式で表示
import operator
names = {row[0]:row[1] for row in result}
sorted_values = sorted(values.items(), key=operator.itemgetter(1), reverse=True)
for i, (k, v) in enumerate(sorted_values[:5]):
  print(f"{i+1:2}位 {names[k]}\t{v}")

すると、次のように表示されます。先ほど描画した地図と一致することが分かります。

 1位 秋田県 0.3950892857142857
 2位 高知県 0.366412213740458
 3位 徳島県 0.35766423357664234
 4位 青森県 0.35738831615120276
 5位 山形県 0.3560830860534125

なお、高齢者のうち75才以上の割合を、同様の方法に計算してみると、次のような結果となりました。上位2件は全く同じで、似た顔ぶれが並びました。

 1位 秋田県 0.22098214285714285
 2位 高知県 0.216793893129771
 3位 山口県 0.20843091334894615
 4位 島根県 0.20404984423676012
 5位 徳島県 0.20145985401459854

高齢者の割合が高い地域の特徴は?

こうして地図やベスト5のランキングを見ると、いずれも、若年層の都市部流出が進んでいる都道府県が上位に来ていることが分かります。

しかし、これらの地域について、改めて調べてみると、マイナス要素ばかりではないようです。例えば、高知県は、人口当たりの病院病床数が多いとのことです。厚生労働省が公開している医療施設(静態・動態)調査・病院報告(こちら)を見ると、高知県が最も多く、秋田・徳島・青森・山形は、全国平均を上回っています。そのため、高齢者にとって安心して住める地域とも言えます。

また、田舎暮らしを特集した宝島社のアンケートでは、秋田市が「シニア世代が住みたいまち」として、1位に選ばれたこともあります(朝日新聞の記事)。自然が豊かで高齢者に対する行政サービスが行き届いていることなどが理由ということです。

こうした点を考えると、高齢者の割合が多い地域は、高齢者のための施設が充実する傾向があり、住みやすい地域になっているということが分かりました。

まとめ

以上、今回は、Pythonで高齢者の割合が多い都道府県マップを作成してみました。結果を元にして、その地域を調べて見ると、単に高齢者が多いだけでなく、高齢者のための施設や楽しみが多い地域であることも見えてきました。

今回は、日本地図に対して、単に割合に応じた色を塗っただけでしたが、先ほど紹介した厚生労働省の医療施設データなどを組み合わせてみると、さらに意義深い真実が見えてきそうです。

本稿で紹介したように、Pythonなら比較的簡単に実現できますので、ぜひ皆さんも挑戦してみてください。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。これまで50冊以上の技術書を執筆した。直近では、「大規模言語モデルを使いこなすためのプロンプトエンジニアリングの教科書(マイナビ出版)」「Pythonでつくるデスクトップアプリ(ソシム)」「実践力を身につける Pythonの教科書 第2版」「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」など。