Pandasでセンター試験の男女の都道府県別平均寿命の散布図作成

blog.goo.ne.jp

oku.edu.mie-u.ac.jp

ダウンロード

!wget "https://www.mhlw.go.jp/toukei/saikin/hw/life/tdfk15/dl/tdfk15-09.xls" -O data.xls

プログラム

import pandas as pd

dfs = []

for i, sex in zip([1, 2], ["男", "女"]):

    df1_tmp = pd.read_excel(
        "data.xls", sheet_name=f"表5-{i}", header=None, na_values=["…", " ", " "]
    )

    df2_tmp = df1_tmp.loc[
        df1_tmp.notnull().sum(axis=1) > 2, df1_tmp.notnull().sum() > 2
    ].copy()

    _, col = df2_tmp.shape

    for n in range(0, col, 3):

        df3_tmp = df2_tmp.iloc[:, n : n + 3].copy()

        df3_tmp.columns = ["順位", "都道府県", "平均寿命"]

        # 年追加
        df3_tmp["年"] = df3_tmp.iat[0, 1]

        # 性別追加
        df3_tmp["性別"] = sex

        df3_tmp.dropna(inplace=True)

        df3_tmp["平均寿命"] = df3_tmp["平均寿命"].astype(float)

        dfs.append(df3_tmp)

df = pd.concat(dfs)

# 都道府県の空白を除去
df["都道府県"] = df["都道府県"].str.replace("\s", "")

# 和暦を西暦に置換
df["年"] = (
    df["年"]
    .replace(
        {
            "昭和40年": 1965,
            "昭和50年": 1975,
            "昭和60年": 1985,
            "平成7年": 1995,
            "平成17年": 2005,
            "平成22年": 2010,
            "平成27年": 2015,
        }
    )
    .astype(int)
)

pv = df.pivot_table(index="都道府県", columns=["年", "性別"], values="平均寿命", aggfunc="sum")

グラフ

import seaborn as sns
import japanize_matplotlib
import matplotlib.pyplot as plt
import numpy as np

pv_2015 = pv[2015].copy()
pv_2015.plot.scatter(
    x="男", y="女", grid=True, xlim=(78.5, 82), ylim=(85.5, 88), figsize=(8, 6)
)
plt.savefig("scatter.png")

f:id:imabari_ehime:20200125143444p:plain

pv_2015["差"] = pv_2015["女"] - pv_2015["男"]

edges = np.arange(5.5, 8, 0.25)

pv_2015["差"].plot.hist(figsize=(8, 6), bins=edges)
plt.savefig("hist.png")

f:id:imabari_ehime:20200125143455p:plain

文字だけ表示しようとしたら終わらないのでポイント追加

plt.figure(figsize=(8, 6))

for k, v in pv_2015.iterrows():
    plt.plot(v[1], v[0], "o")
    plt.annotate(k, xy=(v[1], v[0]), size=12)

plt.savefig("pref.png")

f:id:imabari_ehime:20200125150758p:plain