都道府県別のワクチン接種率の計算の分母とする「住民基本台帳年齢階級別人口データ」は総務省が公表している総務省の住民基本台帳に基づく人口、人口動態及び世帯数 よりダウンロードできます。エクセルファイルで、6835 行x 26列 のサイズですのでEXCELでの操作でもさほどストレスはかかりませんが、エクセルからPythonへの一環として、フィルタリングや都道府県コードの生成から可視化までをPython で行い、その際のデータフレームと棒グラフの作成手順をまとめましたので、ご紹介いたします。
このブログでは、以下の図を最終的に作画するまでの説明を目標にしています。
元のエクセルファイルを図のようなエクセルでの操作をチートシートにあるPythonのコードによって行います。その結果データフレームを作成したいと思います。
ダウンロードした元ファイル
このブログで作成するデータフレームのイメージ
チートシート
手順をサマリしました。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)
を使う心掛けは保ちたいですね。