暑さも和らぎ秋の行楽シーズンとなった。しかし、旅で気をつけたいのが交通事故だ。都道府県別の交通事故件数がオープンデータとして公開されているので、日本地図を事故数で塗り分けてみよう。

  • 交通事故数を日本地図に色分けして描画しよう

    交通事故数を日本地図に色分けして描画しよう

交通事故件数はオープンデータ

「オープンデータ(Open Data)」とは、誰もが自由にアクセスし、利用・再利用・再配布できる形で公開されたデータのことで政府や自治体、企業などがデータを公開している。

今回利用する「交通事故件数のデータ」もオープンデータとして公開されている。これを利用して、日本地図を都道府県別の事故数に基づいて色分けをしてみよう。交通事故の件数データは、こちらの警察庁から確認できる。なお、データ自体は、政府の統計の窓口(e-stat)からダウンロードできるようになっている。

今回は、こちらから、原稿執筆時点で最新の2023年の年間データから、「都道府県別交通事故発生状況」のCSVデータを利用する。

  • 交通事故件数データをダウンロードしよう

    交通事故件数データをダウンロードしよう

ダウンロードしたCSVファイルをExcelで開くと次のようなデータになっている。単純なCSVファイルではないので、ちょっと加工が必要なことも分かるだろう。

  • 都道府県別交通事故発生状況のCSVデータ

    都道府県別交通事故発生状況のCSVデータ

ダウンロードしたCSVファイル「表6-2.csv」を確認すると、都道府県名はC列に記述されており、D列に交通事故件数が記述されている。また、都道府県別のなのに、北海道だけ都市ごとに分かれている点にも注目しよう。そして、地域コードが割り振られている行が実際のデータであることも分かる。この点を基に、もっと単純な、都道府県と事故件数だけのフィールドを持つCSVファイルに変換するプログラムは次のようになる。

import csv
with open("表6-2.csv", "rt", encoding="Shift_JIS") as f:
    data = "都道府県,件数\n"
    reader = csv.reader(f)
    for i, row in enumerate(reader):
        code = row[0]
        if code == "" or code == "00" or i <= 3:
            continue # codeが空の行はスキップ
        name = row[2]
        value = row[3]
        if code == "01":
            name = "北海道"
        data += f"{name},{value}\n"
print(data)
open("data.csv", "wt", encoding="utf-8").write(data)

上記のプログラムを「makecsv.py」という名前で保存しよう。そして、プログラムを実行するには、次のようなコマンドを実行しよう。

# Windowsの場合
python makecsv.py
# macOSの場合
python3 makecsv.py

プログラムを実行すると「都道府県名,件数」のような分かりやすいCSVファイル「data.csv」が生成される。

  • CSVファイルを正規化しよう

    CSVファイルを正規化しよう

日本地図を色分けするjapanmapパッケージのインストール

次に、CSVを基にして、日本地図を色分けしよう。地図に手軽に色分けしたい場合には、japanmapというPythonのパッケージを利用すると簡単だ。

japanmapと必要なパッケージをインストールするには、ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、次のコマンドを実行しよう。

# Windowsの場合
python -m pip install japanmap pandas matplotlib
# macOSの場合
python3 -m pip install japanmap pandas matplotlib

日本地図を色分けするプログラム

それでは、CSVファイルを基にして、日本地図を色分けするプログラムを作ってみよう。以下のプログラムを「jiko_japan.py」という名前で保存しよう。

import matplotlib.pyplot as plt
import pandas as pd
import japanmap as jp

# データファイルを読み込む --- (*1)
df = pd.read_csv("data.csv", encoding="utf-8")
print("事故数ワースト10")
print(df.sort_values(by="件数", ascending=False)[0:10])
# 色分けのためのカラーマップを取得 --- (*2)
cmap = plt.get_cmap("Reds")
# 件数の最小値と最大値を取得して正規化 --- (*3)
x = df["件数"][0:48]
x = (x - min(x)) / (max(x) - min(x))
# 都道府県と件数の対応辞書を作る --- (*4)
d = {df["都道府県"][i]: cmap(x[i], bytes=True) for i in range(0, 47)}
plt.axis("off")  # 軸を描画しない
im = plt.imshow(jp.picture(d), cmap) # 描画
plt.colorbar(im, ticks=[]) # カラーバーを描画 --- (*5)
plt.show()

プログラムを実行するには下記のコマンドを実行しよう。

# Windowsの場合
python jiko_japan.py
# macOSの場合
python3 jiko_japan.py

プログラムを実行すると、次のように日本地図が表示される。また、ターミナルには事故数ワースト10を表示するようにしてみた。

  • 交通事故数を色分けして描画したところ

プログラムを確認してみよう。(*1)では先ほど作成した事故数のCSVファイルを読み込んでいる。(*2)では色分けのためのカラーマップを取得する。(*3)では最小値と最大値を得て正規化を行う。(*4)では辞書型で{都道府県名: 正規化した件数}のデータを作成する。ここでは、手軽にリストや辞書型を作る内包表記を利用した。(*5)ではカラーバーを描画する。

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら