国勢調査から2重棒グラフを作成する
/
国勢調査から2重棒グラフを作成します.
# ファイル構成
project_dir
├── ./data/tblT000848C04.txt
└── plot_2bar.ipynb <- 実行用ノートブック
# データのダウンロード
下記のサイトから宮城県 国勢調査(txtファイル)をダウンロードします。
e-stat 宮城県 国勢調査(txt) (opens new window)
# 2重棒グラフの作成
# pandasでテキストファイルを読み込む
import pandas as pd
# データの読み込み
# T000848001 T000848002 T000848003 T000848004
# 人口総数 男 女 世帯総数
df_gender = pd.read_table("./data/tblT000848C04.txt", encoding='SJIS', sep=',')
df_gender = df_gender[1:].reset_index(drop=True) # 最初の数行は削除
df_gender.head()
# データの加工と整理
下記のコードで以下のことを実施します。
- T000848001等のカラム名を変更
- 市郡の名前を整理
- 総人口の算出
- 世帯数0の箇所は削除する(過剰に人口を集計することを防ぐ)
# 数値型に変換_T000848001(人口総数)
df_gender = df_gender.rename(columns={'T000848001': 'population'})
df_gender['population'] = df_gender['population'].replace(['-', 0]).astype(int)
# 数値型に変換_T000848002(男)
df_gender = df_gender.rename(columns={'T000848002': 'male'})
df_gender['male'] = df_gender['male'].replace(['-', 0]).astype(int)
# 数値型に変換_T000848003(女)
df_gender = df_gender.rename(columns={'T000848003': 'female'})
df_gender['female'] = df_gender['female'].replace(['-', 0]).astype(int)
# 'GST_NAME'追加
# GST_NAME:郡市・特別区・政令指定都市名
df_gender['GST_NAME'] = df_gender['CITYNAME']
for idx in range(len(df_gender)):
GST_TEXT = df_gender['GST_NAME'][idx]
if '市' in GST_TEXT:
GST_TEXT = GST_TEXT.split('市')[0] + '市'
if '郡' in GST_TEXT:
GST_TEXT = GST_TEXT.split('郡')[0] + '郡'
# if '廿日市' in GST_TEXT:
# GST_TEXT = '廿日市市'
df_gender['GST_NAME'][idx] = GST_TEXT
# 各CITYNAMEの総人口を抽出
df_gender = df_gender[df_gender['NAME'].isnull()]
# 世帯数なしを消去
df_gender = df_gender[df_gender['T000848004']!='-']
# 可視化
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import font_manager
from matplotlib.ticker import ScalarFormatter
# 日本語のフォント設定
f = "ipag.ttf"
font_manager.fontManager.addfont(f) # フォントの追加
font_name = plt.matplotlib.font_manager.FontProperties(fname = f).get_name() # 追加フォント名
matplotlib.rc('font', family=font_name) # 追加フォントの設定
# GST_NAME別で集計
# GST_NAME:郡市・特別区・政令指定都市名
df_gender_sum = df_gender.groupby('GST_NAME').sum()
# JINKO(人口)でソートしプロット
ax = df_gender_sum.sort_values(by = 'population', ascending = False).plot(kind='bar', y = ['male', 'female'], figsize = (25,10), fontsize = 20)
# 判例
plt.legend(loc='upper right', fontsize=20)
# x軸のラベル
plt.xlabel("市町村郡", fontsize=20)
# y軸のラベル
plt.ylabel("人口(百万人)", fontsize=20)
# y軸べき数
ax.yaxis.set_major_formatter(ScalarFormatter(useMathText=True))
ax.ticklabel_format(style="sci", axis="y", scilimits=(6, 6))
ax.yaxis.offsetText.set_fontsize(20)
# まとめ
国勢調査から2重棒グラフを作成しました.