Python:1950年〜2017年の年齢別自殺数推移を棒グラフ化する

1950年〜2017年の年齢別自殺者数の推移をプロットする。日本の自殺者数が減っているのは、ただ単に自殺者を変死者としてカウントする統計上のマジックに過ぎないという批判もあるが、自殺者が減ったと国民を欺くことで、自殺を思い止まる人間がいるかもしれないので、それはそれでいいのかもしれない。

スポンサーリンク

データの下準備

先ず、このサイトから必要なデータを入手する。

from pandas import *

df = read_csv('suicide.csv',encoding='cp932')
df.head(2)
表章項目 死因年次推移分類 性別 年齢(5歳階級) /時間軸(年次) 2017年 2016年 2015年 2014年 2010年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
0 死亡数【人】 Hi16_自殺 総数 総数 NaN 20465 21017 23152 24417 29554 21420 20088 23383 20542 19975 15728 14444 20143 22477 16311
1 死亡数【人】 Hi16_自殺 総数 0~4歳 NaN

2 rows × 22 columns

df.drop(['表章項目','死因年次推移分類','性別','/時間軸(年次)'],axis=1,inplace=True)
df.head(4)
年齢(5歳階級) 2017年 2016年 2015年 2014年 2010年 2005年 2000年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
0 総数 20465 21017 23152 24417 29554 30553 30251 21420 20088 23383 20542 19975 15728 14444 20143 22477 16311
1 0~4歳
2 5~9歳 1 2 1 4 2 1 1 3
3 10~14歳 100 71 89 100 63 44 74 66 47 81 53 88 55 46 62 88 2
df = df.convert_objects(convert_numeric=True)
/root/.pyenv/versions/miniconda3-latest/envs/py368/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: convert_objects is deprecated.  To re-infer data dtypes for object columns, use DataFrame.infer_objects()
For all other conversions use the data-type specific converters pd.to_datetime, pd.to_timedelta and pd.to_numeric.
  """Entry point for launching an IPython kernel.

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,20))
df[:23][1:].set_index('年齢(5歳階級)').T.plot(kind='barh',ax=ax,stacked=True)
ax.legend(loc='upper right', fancybox=True, framealpha=0.5);
xticks(np.arange(0,3.4e4,1e4/5),
    ['{}万'.format(float(x/1e4)) if x > 0 else 0 for x in np.arange(0,3.4e4,1e4/5)]);

0〜9歳では自殺者はいないと言っても過言ではないくらい極端に少ない。ここ最近自殺者数が減少しているのは、何でも有りの安倍政権お得意の統計上のマジックだと言われているが、真偽の程は定かではない。

若年層の自殺者数の推移を考察する

年齢層を、0〜19歳、20〜39歳、40〜59歳、60歳以上に分けて、若年層と中年層の自殺者数の推移に焦点を当てる。

df1 = df[:5][1:].groupby(np.arange(len(df[:5][1:]))//4).sum()
df1.index = df[:5][1:].loc[1::4, '年齢(5歳階級)']
df1.head()
2017年 2016年 2015年 2014年 2010年 2005年 2000年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
年齢(5歳階級)
0~4歳 560.0 501.0 537.0 536.0 514.0 556.0 547.0 489.0 428.0 538.0 654.0 857.0 757.0 852.0 2280.0 2826.0 1312.0
df2 = df[:9][5:].groupby(np.arange(len(df[:9][5:]))//4).sum()
df2.index = df[:9][5:].loc[1::4, '年齢(5歳階級)']
df2.head()
2017年 2016年 2015年 2014年 2010年 2005年 2000年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
年齢(5歳階級)
20~24歳 4749.0 4864.0 5257.0 5883.0 7267.0 7474.0 6528.0 4638.0 4366.0 5896.0 6809.0 7487.0 6070.0 5746.0 9549.0 11098.0 6406.0
df3 = df[:13][9:].groupby(np.arange(len(df[:13][9:]))//4).sum()
df3.index = df[:13][9:].loc[1::4, '年齢(5歳階級)']
df3.head()
2017年 2016年 2015年 2014年 2010年 2005年 2000年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
年齢(5歳階級)
40~44歳 6973.0 7164.0 7779.0 8098.0 10345.0 12006.0 12392.0 8552.0 7665.0 9749.0 6849.0 5443.0 3792.0 3318.0 3873.0 4201.0 4019.0
df4 = df[:22][13:].groupby(np.arange(len(df[:22][13:]))//9).sum()
df4.index = df[:22][13:].loc[1::9, '年齢(5歳階級)']
df4.head()
2017年 2016年 2015年 2014年 2010年 2005年 2000年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
年齢(5歳階級)
60~64歳 8135.0 8428.0 9511.0 9828.0 11275.0 10329.0 10517.0 7564.0 7543.0 7074.0 6104.0 6052.0 4983.0 4520.0 4430.0 4337.0 4464.0
df5 = concat([df1,df2,df3,df4], axis=0)
df5.head()
2017年 2016年 2015年 2014年 2010年 2005年 2000年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
年齢(5歳階級)
0~4歳 560.0 501.0 537.0 536.0 514.0 556.0 547.0 489.0 428.0 538.0 654.0 857.0 757.0 852.0 2280.0 2826.0 1312.0
20~24歳 4749.0 4864.0 5257.0 5883.0 7267.0 7474.0 6528.0 4638.0 4366.0 5896.0 6809.0 7487.0 6070.0 5746.0 9549.0 11098.0 6406.0
40~44歳 6973.0 7164.0 7779.0 8098.0 10345.0 12006.0 12392.0 8552.0 7665.0 9749.0 6849.0 5443.0 3792.0 3318.0 3873.0 4201.0 4019.0
60~64歳 8135.0 8428.0 9511.0 9828.0 11275.0 10329.0 10517.0 7564.0 7543.0 7074.0 6104.0 6052.0 4983.0 4520.0 4430.0 4337.0 4464.0
df5.rename(index={'0~4歳':'0〜19歳','20~24歳':'20〜39歳','40~44歳':'40〜59歳','60~64歳':'60歳〜'},inplace=True)
df5.head()
2017年 2016年 2015年 2014年 2010年 2005年 2000年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
年齢(5歳階級)
0〜19歳 560.0 501.0 537.0 536.0 514.0 556.0 547.0 489.0 428.0 538.0 654.0 857.0 757.0 852.0 2280.0 2826.0 1312.0
20〜39歳 4749.0 4864.0 5257.0 5883.0 7267.0 7474.0 6528.0 4638.0 4366.0 5896.0 6809.0 7487.0 6070.0 5746.0 9549.0 11098.0 6406.0
40〜59歳 6973.0 7164.0 7779.0 8098.0 10345.0 12006.0 12392.0 8552.0 7665.0 9749.0 6849.0 5443.0 3792.0 3318.0 3873.0 4201.0 4019.0
60歳〜 8135.0 8428.0 9511.0 9828.0 11275.0 10329.0 10517.0 7564.0 7543.0 7074.0 6104.0 6052.0 4983.0 4520.0 4430.0 4337.0 4464.0
df5.reset_index(inplace=True)
style.use('fivethirtyeight')

fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "18"
fig, ax = subplots(figsize=(18,10))
df5.set_index('年齢(5歳階級)').T.plot(kind='barh',ax=ax,stacked=True)
ax.legend(loc='upper right',fancybox=True,framealpha=0.5,prop={'size': 26})
xticks(np.arange(0,3.31e4,1e4/5),
   ['{}万'.format(float(x/1e3)) if x > 0 else 0 for x in np.arange(0,3.31e3,1e3/5)]);

1990年の0〜19歳の自殺者数が少ないが、この時は2017年に比べて20歳未満人口は1000万人ぐらい多かったと思われるので驚異的な少なさと言えるだろう。1990年と言えばバブルの絶頂期で1億総中流社会と言われたぐらい日本の黄金期だったので、自殺を考える若者も少なかったのかもしれない、俺はと言えば、この時は19〜20歳の過渡期で、生まれて初めて海外旅行に行った年でもある。パリがあまりにも素晴らしかったので、この年は2度パリに行っている。それぐらい良い年であったということだ。55年と60年で未成年自殺が多いのは、アメリカ(連合軍)からの独立間もない混沌とした時代だったからだと思われる。全体的に自殺者数は減っているが、未成年者の自殺者数が増加傾向にあるのは気になるところではある。考えられる原因として、ここ30年で子供に対して不寛容な国になってしまったというのがある。まぁ、5才児でも死にたくなるような国だから仕方ないのだろう。