Python

【Python】所得の貧困線未満の世帯人員数の割合のグラフ化

今回は政府が提供する全国家計構造調査をもとに、データを加工してみました。

データの中身は、「資産面から見た貧困に関する指標」というもので、住宅ローン残高の有無や年齢階級(20区分)別資産面からみた貧困に関する数値が格納されています。データの量や条件が膨大なため、一部データを抽出し、所得の貧困線未満の等価可処分所得がある世帯人員数の割合を年齢階級別にグラフ化してみます。

データのグラフ化

■No.1,2
使用するライブラリをインポートします。

ダウンロードした元データからは、必要なカラムのみを取得しました。
また、文字コードを指定しないと下記エラーが出力されるため、"SHIFT-JIS"で指定しています。
エラー:「'utf-8' codec can't decode byte 0x8e in position 1: invalid start byte」
参考情報:https://qiita.com/Louis23fc/items/e41733416957408c93fb

No.1
import pandas as pd
import plotly.express as px
import numpy as np

No.2
df_data = pd.read_csv('asset_poverty.csv', usecols=[11,16,17], encoding="SHIFT-JIS")

■No.3~5
今回は「年齢階級20区分」「世帯人員数」「所得の貧困線未満の等価可処分所得がある世帯人員数」の3カラムを取得しました。
データを取得できているか確認すると、下記のようなデータになっています。年齢階級区分ごとの世帯人員数と、そのうちの所得の貧困線未満の等価処分所得がある世帯人員数があります。

■No.6
No.5で分かる通り、年齢階級がある条件によって複数の階級区分があるため、今回閲覧するデータの行を指定して抽出しました。

#No.6
poor_house = df_data[1:9] # indexで取得する行を指定

■No.7
ここでは、階級別の世帯人数のうち、貧困線未満の世帯人数を計算し、新たなカラムとして追加しました。
計算するためにreplaceでカンマを取り除いています。さらに、計算結果をappendで追加しています。
これで割合を出すことができました。

#No.7
ratio = []
for n in range(1, len(poor_house) + 1):
  x = poor_house["所得の貧困線未満の等価可処分所得がある世帯人員数"][n].replace(",","")
  y = poor_house["世帯人員数"][n].replace(",","")
  z = int(x) / int(y) * 100
  ratio.append(z)

print(ratio)
>>[10.11392058835994, 11.377000012053308, 6.77149576723326, 7.778423402695944, 10.03073601148848, 10.77027917338978, 11.314133306805418, 17.634681566493075]

■No.8
No.7で計算した割合を実際に表に追加していきます。
元データにカラム名を指定して格納することで、簡単にカラムを追加したデータを作成できます。

#No.8
poor_house['所得の貧困線未満の等価可処分所得がある世帯人員数の割合'] = ratio

■No.9
この後の処理でグラフ化するときに、データの構造によってはグラフ化できないため、事前に必要なデータを抽出して、加工しておきます。
ここでは年齢階級区分と計算した割合を取得し、1次元になるよう加工しています。

#No.9
df_data_circle = pd.Series(poor_house['所得の貧困線未満の等価可処分所得がある世帯人員数の割合'].values,
                           index=poor_house["年齢階級20区分"]) # 1次元化

>>出力結果
年齢階級20区分
18歳未満   10.113921
18〜24     11.377000
25〜34     6.771496
35〜44     7.778423
45〜54     10.030736
55〜64     10.770279
65〜74     11.314133
75〜84     17.634682
dtype: float64

■No.10
最後はNo.9のデータをグラフ化しています。それぞれX軸とY軸となるデータを入れ、グラフの色やホバー時の挙動を設定しています。
またレイアウトに当たるラベルやカラーバーの表示有無も設定しました。
これで、年齢階級別の所得の貧困線未満の等価可処分所得がある世帯人員数の割合がわかるグラフが完成しました。
今回はシンプルなグラフを作成したかったため、対象のデータは少ないですが、より多くの条件を加味すると、より複雑なデータを分析することもできるでしょう。

#No.10
bar = px.bar(x=df_data_circle.index,          # X軸のデータを設定
             y=df_data_circle.values,         # Y軸のデータを設定
             title='年齢別割合',               # グラフのタイトル
             hover_name=df_data_circle.index,  # グラフホバー時にデータ内容を表記
             color=df_data_circle.values,      # 色をつけるデータの設定
             color_continuous_scale='Agsunset' # カラースケールの設定。グラデーションになる
         )  

bar.update_layout(xaxis_title='年齢',                     # X軸のラベルを設定
                  yaxis_title='割合(%)',                     # Y軸のラベルを設定
                  coloraxis_showscale=False)                  # カラーバーの非表示

bar.show()

若い年齢の割合が他の年代に比べて高いことに驚きましたが、子ども家庭庁の議論があるというのもこういった背景があるからなのでしょう。
出ているとは思いますが、この割合が過去とどれくらい推移しているのかを調べてみるのも面白いでしょう。

まとめ

今回は政府が出している全国家計構造調査から、一部データを取り出して加工してみました。
グラフ化までのデータ加工は手間ではありますが、グラフ化するためには欠かせない作業です。計算するためにカラムを取ったり、新しく列を追加したりと、細かく作業ですが、意外と簡単にできるものもあります。是非参考にしてみてください。

Google広告