都道府県別のワクチン接種率の計算の分母とする「住民基本台帳年齢階級別人口データ」は総務省が公表している総務省の住民基本台帳に基づく人口、人口動態及び世帯数 よりダウンロードできます。エクセルファイルで、6835 行x 26列 のサイズですのでEXCELでの操作でもさほどストレスはかかりませんが、エクセルからPythonへの一環として、フィルタリングや都道府県コードの生成から可視化までをPython で行い、その際のデータフレームと棒グラフの作成手順をまとめましたので、ご紹介いたします。

このブログでは、以下の図を最終的に作画するまでの説明を目標にしています。

img_0708_1

元のエクセルファイルを図のようなエクセルでの操作をチートシートにあるPythonのコードによって行います。その結果データフレームを作成したいと思います。

ダウンロードした元ファイル

japan_population_sheet

このブログで作成するデータフレームのイメージ

japan_population_sheet


チートシート

手順をサマリしました。Jupyter Notebook でのコードを想定しています。 表にする都合上、関数の定義等で必要なインデントが省略されています。


やりたいこと 方法
カレントディレクトリ配下のファイルエクステンションが
*.xlsのリストを取得する。
該当ファイル(000701583.xls)は予めダウンロード、
カレントディレクトリに移動させておきます。
import glob, os # globとosモジュールをインポートする
# (インデントは省いています)
FILE_NAME_EXTENSION= '*.xls'
for gb in glob.glob(FILE_NAME_EXTENSION, recursive=True):
print(gb)
==> 000701583.xls
該当ファイル(000701583.xls)を
データフレーム(df)として読み込む
xls = pd.ExcelFile('000701583.xls')
df = pd.read_excel(xls, '年齢別人口(市区町村別)【総計】', index_col=None, header=1)
‘都道府県名’の列内の
‘合計’とされている行を除く
前後にデータフレームのシェイプ
をプリントし削減行数の変化を調べる
print('Before df', df.shape)

df = df[df['都道府県名'] != '合計']

print('After df', df.shape)
‘市区町村名’の列内の
NaNとされている行を残す
前後にデータフレームのシェイプ
をプリントし削減行数の変化を調べる
print('Before df', df.shape)

df = df[df['市区町村名'].isnull() == True]

print('After df_follow', df.shape)
‘性別’の列内の
‘計’とされている行を残す
前後にデータフレームのシェイプ
をプリントし削減行数の変化を調べる
print('Before df', df.shape)

df = df[df['性別'] == '計']

print('After df_follow', df.shape)
‘団体コード’の列内の値を
整数にして小数点以下を除く
‘団体コード’の列内の値を文字列にする
df['団体コード']= df['団体コード'].astype('int')

df['団体コード']=df['団体コード'].astype(str)
‘団体コード’の列内の値を
6桁に統一する
5桁しかない(エクセルが最初の0を省かれた)
‘団体コード’の列内の値に0を再度追加する
#関数を定義する (インデントは省いています)
def zfill(z):
z = z.zfill(6)
return z

df['団体コード'] = df['団体コード'].apply(zfill)
‘団体コード’の列内の値のうち、上二けたを残す。 df['団体コード'] = df['団体コード'].str[:2]
seabornを使って、人口データフレーム(df)の
都道府県名をx軸、人口をy軸にした
棒グラフを作図する
日本語を表示させる
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib
sns.set(font='IPAGothic')
plt.rcParams['font.family'] = 'IPAexGothic'

sns.barplot(x='都道府県名', y='人口', data = df)
plt.xlabel('都道府県')
plt.ylabel('人口(万人)')
plt.xticks(rotation=90)
plt.title('令和2年1月1日住民基本台帳による総人口(都道府県別)', pad=20, fontsize=20)
plt.savefig("img_0708_1.png")

棒グラフのコードです。seabornとmatplotlib を使っています。

日本語化については、日本語対応した_matplotlib_2軸グラフを参照してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 前処理
# seabornモジュールをインポート
import seaborn as sns
# スタイルのセットをする
sns.set_style('whitegrid')
import matplotlib.pyplot as plt 
from pylab import rcParams
%matplotlib inline
rcParams['figure.figsize'] = 16,9
# 日本語タイトルのため、japanizeをインポートする
import japanize_matplotlib
# フォントをIPAGothicをセットする
sns.set(font='IPAGothic')
plt.rcParams['font.family'] = 'IPAexGothic'

# 作図部分
sns.barplot(x='都道府県名', y='人口', data = df)
plt.xlabel('都道府県')
plt.ylabel('人口(万人)')
plt.xticks(rotation=90)
plt.title('令和2年1月1日住民基本台帳による総人口(都道府県別)', pad=20, fontsize=20)
plt.savefig("img_0708_1.png")

ひとこと

日常的にExcelで行う方が少なくないと思いますが、今回ご紹介したサンプルのように、基本Pythonを使ってデータの操作を行うよう心掛けるとが目指すPython の達人に一歩ずつ近づいていくと思います。後半ご紹介したbarplotは直感的に作画できるExcel の方がストレスも無く、かつ痒い所に手が届く使い勝手ですが、Python(Seaborn, Matplotlib) を使う心掛けは保ちたいですね。