pandasのdataframe内の各要素の値を、例えば、死亡者数から総数に対する割合を表わす百分率に変換するにはどうすればいいのだろうか?という非常に素朴な疑問が生じたので、鉄は熱いうちに打て、善は急げということで早速調べてみることにしました。
from pandas import *
df = read_csv('caraccident.csv',encoding='shift_jis')
df.head(2)
df = df.set_index(['年齢(5歳階級)'])
df.drop(['表章項目','死因年次推移分類','性別','/時間軸(年次)'],axis=1,inplace=True)
df = df.apply(to_numeric, errors="coerce").astype(float)
df.head(2)
値を百分率に変換してプロットする¶
列の年数を抽出します。
years = df.filter(regex="\d{4}(?!\d)").columns.values
years = years.tolist()
各年数列の年齢(5歳階級)の値を合計してそれを分母にして年齢層別に割っていきます。
for i in (range(len(years))):
df[years[i]][1:22]=df[years[i]][1:22]/df[years[i]][0]*100
from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams
style.use('ggplot')
fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "20"
fig, ax = subplots(figsize=(25,12))
df[1:22].T.plot(kind='barh',ax=ax,stacked=True)
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5));
年齢区分を若年、中年、高年、超高年に分ける¶
年齢区分を若年(0〜34歳)、中年(35歳〜59歳)、高年(60〜79歳)、超高年(80歳以上)の4つに分けて、交通事故死亡数を百分率に変換します。
df.reset_index(inplace=True)
df1 = df[:8][1:].groupby(np.arange(len(df[:8][1:]))//7).sum()
df1.index = df[:8][1:].loc[1::7, '年齢(5歳階級)']
df2 = df[:13][8:].groupby(np.arange(len(df[:13][8:]))//5).sum()
df2.index = df[:13][8:].loc[1::5, '年齢(5歳階級)']
df3 = df[:17][13:].groupby(np.arange(len(df[:17][13:]))//4).sum()
df3.index = df[:17][13:].loc[1::4, '年齢(5歳階級)']
df4 = df[:22][17:].groupby(np.arange(len(df[:22][17:]))//5).sum()
df4.index = df[:22][17:].loc[1::5, '年齢(5歳階級)']
df5 = concat([df1,df2,df3,df4], axis=0)
df5.rename(index={'0〜4歳':'0〜34歳','35〜39歳':'35〜59歳','60〜64歳':'60〜79歳','80〜84歳':'80歳〜'},inplace=True)
#df5.reset_index(inplace=True)
df5
for i in (range(len(years))):
df5[years[i]]=df5[years[i]]/df5[years[i]].sum()*100
from matplotlib.ticker import FuncFormatter
rcParams["font.size"] = "22"
fig, ax = subplots(figsize=(25,20))
df5.T.plot(kind='barh',ax=ax,stacked=True,alpha=1,width=.8)
ax,legend(bbox_to_anchor=(0,1.02,1,0.2),loc="lower left",mode="None",\
borderaxespad=0,ncol=4,prop={'size': 26})
formatter = FuncFormatter(lambda y, pos: "%d%%" % (y))
ax.xaxis.set_major_formatter(formatter)
for p in ax.patches:
left, bottom, width, height = p.get_bbox().bounds
ax.annotate(str('{:.1f}'.format(width))+"%", xy=(left+width/2, bottom+height/2),
ha='center', va='center',size=25,color='w');
全体の何パーセントなのかでグラフ化した方が見やすいような気がします。2017年の60歳未満世代の死亡者数は、全交通事故死亡者数の36%でしかありません。これに対して1950年の事故の被害者は60歳未満世代が9割近かったことを考えると、こういった数字も日本の高齢化社会を象徴していると言えるかと思います。
from pandas import *
df6 = read_csv('caraccidentdeath.csv',encoding='cp932')
df6.head(2)
df6 = df6.set_index(['年齢(5歳階級)'])
df6.drop(['表章項目','死因年次推移分類','性別','/時間軸(年次)'],axis=1,inplace=True)
df6 = df6.apply(to_numeric, errors="coerce").astype(float)
df6.head(2)
df6.reset_index(inplace=True)
df.reset_index(inplace=True)
2017年の交通事故死亡数を100で割ってグラフを見やすくします。
from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams
import matplotlib.patches as mpatches
style.use('ggplot')
fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "22"
a = mpatches.Patch(color='blue', label='死亡数')
b = mpatches.Patch(color='red', label='死亡率')
fig, ax = subplots(figsize=(25,20))
df[['年齢(5歳階級)','2017年']][1:23].set_index('年齢(5歳階級)').plot(kind='barh',\
ax=ax,color='b')
df6[['年齢(5歳階級)','2017年']][1:23].set_index('年齢(5歳階級)').plot(kind='barh',\
ax=ax,alpha=.5,color='r')
ax.legend(handles=[a,b],loc='upper right',fancybox=True,framealpha=0.5,prop={'size': 26});
85歳以上の死亡率が死亡数に比べて極端に高いことが分かります。この世代が交通弱者であることを物語っていると思われます。
1947年〜2018年の出生数と婚姻・離婚件数の推移をプロット
1950年〜2017年の日本人女性の年代別出産数推移をグラフ化
1908年〜2017年の平均婚姻年齢(初婚・全婚姻)をグラフ化
若年・中年・高年・超高年層死亡数推移(1950年〜2017年)
日本の右肩下がりの出生数と右肩上がりの死亡者数をグラフ化する
Python:国籍別に在留外国人数の多い市町村を抽出する
Python:在留資格別外国人数を国籍別に棒グラフ化する
Python:在留外国人の詳細を円グラフで表示する
Python:在留外国人比率の高い市町村を条件別に抽出する
Python:日本人の年代別・性別死亡数を視覚化して考察する
Python:日本人の年齢別死亡者数の推移をプロットして考察する
Python:1950年〜2017年の年齢別自殺数推移を棒グラフ化する
Python:結婚適齢期女性が最も余っている都市を探し出す