PandasでCSVファイルの読み込みってどうやるんだろう?
こんな疑問を解決します。
- Pythonによるデータ分析の入り口
- PandasでCSVファイルを読み込む
- グラフ描画ライブラリで読み込んだデータをグラフにしてみる
こんにちは。
先日、このブログのMySQLにPythonで接続する方法を検証してみましたが、データが少なくいい解析ができそうにありませんでした。
そこでまとまったテストデータがないか調べてみたところ、「e-Stat 統計で見る日本 」というサイトを見つけました。
e-Statは、日本の統計情報がCSV形式でダウンロードすることができ、練習には最適じゃないかということで使ってみることにしました!
データのフォーマーットがCSV形式だったのでPythonのライブラリPandasを使って触ってみたときの備忘です。
PandasでCSVファイル読み込み
今回e-Statから「年齢(各歳),男女別人口及び人口性比-総人口,日本人人口」の情報を取得し、Pandasに取り込みます。
CSVファイルを読み込むには Pandas の read_csv を使います。
import pandas as pd
df = pd.read_csv('./population_data.csv')
print(df)
プリントすると次のような結果が出力されました。
全国 コード 全国 時間軸(年月日現在) コード 時間軸(年月日現在) 年齢各歳 コード 年齢各歳 /男女別・性比 \
0 0 全国 1201 2019年10月1日現在 1000 総数 NaN
1 0 全国 1201 2019年10月1日現在 1001 0歳 NaN
2 0 全国 1201 2019年10月1日現在 1002 1歳 NaN
3 0 全国 1201 2019年10月1日現在 1003 2歳 NaN
4 0 全国 1201 2019年10月1日現在 1004 3歳 NaN
.. ... .. ... ... ... ... ...
97 0 全国 1201 2019年10月1日現在 1097 96歳 NaN
98 0 全国 1201 2019年10月1日現在 1098 97歳 NaN
99 0 全国 1201 2019年10月1日現在 1099 98歳 NaN
100 0 全国 1201 2019年10月1日現在 1100 99歳 NaN
101 0 全国 1201 2019年10月1日現在 1101 100歳以上 NaN
男女計【千人】 男【千人】 女【千人】 人口性比【女性=100】 男女計【千人】.1 男【千人】.1 女【千人】.1 \
0 126,167 61,411 64,756 94.8 123,731 60,208 63,523
1 894 458 436 105.2 877 450 427
2 941 482 459 105.1 925 474 451
3 962 493 469 105.1 946 484 461
4 1,001 514 487 105.6 985 506 479
.. ... ... ... ... ... ... ...
97 126 23 103 22.2 126 23 103
98 84 14 70 19.7 84 14 70
99 59 9 50 18.2 59 9 50
100 44 6 37 16.6 43 6 37
101 69 9 60 14.9 69 9 60
人口性比【女性=100】.1
0 94.8
1 105.2
2 105.1
3 105.0
4 105.6
.. ...
97 22.2
98 19.7
99 18.1
100 16.6
101 14.8
[102 rows x 15 columns]
CSVファイルが読み込みされたことを確認できました。
さて、読み込みまでできたので少しデータをいじってみたいと思います。
カラム名(列の見出し)の変更などのデータの前処理
カラム名が日本語のままだとちょっぴし扱いづらいので、英語に置換します。
データフレームの置換には rename を使います。
df.rename(columns = {"男【千人】":"man"}, inplace = True)
df.rename(columns = {"女【千人】":"woman"}, inplace = True)
df.rename(columns = {"年齢各歳":"age"}, inplace = True)
さらにデータ内の日本語や余計な文字列などを前処理します。
age = df['age'].str.replace('歳', '').str.replace('以上', '')
man = df['man'].str.replace(',', '')
woman = df['woman'].str.replace(',', '')
age = np.array(age, dtype=np.int64)
man = np.array(man, dtype=np.int64)
woman = np.array(woman, dtype=np.int64)
上の例では、年齢のカラムに「歳」や「以上」という言葉が含まれていたのでデータから取り除き、数字のデータだけにしました。
また、人口データには1,000などのように「, 」 が含まれているため、こちらも削除しました。
最後に、文字列だったデータを「dtype=np.int64」と指定し型を変換しました。
人口推移を表示してみる
Pythonのグラフ表示ライブラリはMatplotlibが有名です。
Matplotlibを使ってグラフに表示してみます。
plt.figure(figsize=(10,5))
plt.plot(age, man, label="Man")
plt.plot(age, woman, label="Woman")
plt.ylabel('population[10^3]')
plt.xlabel('age')
plt.title('population_data Oct, 2019')
plt.legend()
plt.yticks(np.arange(0, 1200 + 1, 100))
plt.xticks(np.arange(0, 100 + 1, 5))
plt.show()
日本の人口のボリュームゾーンは70才前後に集中しているという結果がわかりました。
あと53才ほどのときに一気に人口が減っているので時代背景が気になりました。
的なことがグラフにするとより具体的にわかりますね。
まとめ
- PandasでCSVファイルを取り込むには read_csv を使う
- データのグラフにするにはMatplotlibを使う
- データ分析には前処理がとても重要