日本人口の玄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自動凊理の教科曞(マむナビ出版)」など。