ダウンロード
!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")
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")
文字だけ表示しようとしたら終わらないのでポイント追加
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")