【pandas】データの確認と前処理まとめ

データ分析や機械学習を行うとき,データの確認や前処理が必要になることが多いと思います.

この記事では,国税調査のデータ「男女別人口-全国,都道府県(大正9年~平成27年)」を拝借して,データの確認や前処理によく使うpandasの基本的な操作を実行結果とともにまとめていきます.

スポンサーリンク

実行環境

  • Windows 11
  • Python 3.8.3
  • Jupyter Notebook 6.0.3
  • pandas 1.4.2

pandasのインポートとデータの読み込み

まずは,e-Statのデータをダウンロードします.

国勢調査 時系列データ CSV形式による主要時系列データ 1 男女別人口-全国,都道府県(大正9年~平成27年) | ファイル | 統計データを探す | 政府統計の総合窓口
 国勢調査は、日本に住んでいるすべての人と世帯を対象とする国の最も重要な統計調査で、5年ごとに実施されます。国勢調査から得られる日本の人口や世帯の実態は、国や地方公共団体の行政において利用されることはもとより、民間企業や研究機関でも広く利用され、そのような利用を通じて国民生活に役立てられています。  国勢調査では、年齢...
pandasのインポート
import pandas as pd
csvファイルの読み込み
df = pd.read_csv('c01.csv', encoding='shift-jis')

データの確認

先頭の行を表示
# 先頭の10行を表示
df.head(10)
末尾の行を表示
# 末尾の10行を表示
df.tail(10)
行数・列数の確認
df.shape
# 実行結果
(982, 9) 
indexの確認
df.index
# 実行結果
RangeIndex(start=0, stop=982, step=1)
columnの確認
df.columns
# 実行結果
Index(['都道府県コード', '都道府県名', '元号', '和暦(年)', '西暦(年)', '注', '人口(総数)', '人口(男)', '人口(女)'], dtype='object')
データ型の確認
df.dtypes
# 実行結果
都道府県コード     object
都道府県名       object
元号          object
和暦(年)      float64
西暦(年)      float64
注           object
人口(総数)      object
人口(男)       object
人口(女)       object
dtype: object
欠損値の確認
# 列ごとに欠損値をひとつでも含むときTrueを返す
df.isnull().any()
# 実行結果
都道府県コード    False
都道府県名       True
元号          True
和暦(年)       True
西暦(年)       True
注           True
人口(総数)      True
人口(男)       True
人口(女)       True
dtype: bool
欠損値の件数の確認
# 列ごとに欠損値の数を表示
df.isnull().sum()
# 実行結果
都道府県コード      0
都道府県名        2
元号           2
和暦(年)        2
西暦(年)        2
注          886
人口(総数)       2
人口(男)        2
人口(女)        2
dtype: int64

データの整形

欠損値を含む行を消去

最後の2行は「注」の説明なので,最後の2行を消去し,df_dとします.

df_d = df[:-2]
int型に変更

「人口(総数)」「人口(男)」「人口(女)」は数値なので,それぞれint型に変更します.

df_d['人口(総数)'] = df_d['人口(総数)'].astype('int')
df_d['人口(男)'] = df_d['人口(男)'].astype('int')
df_d['人口(女)'] = df_d['人口(女)'].astype('int')
# 実行結果
### 省略 #########
ValueError: invalid literal for int() with base 10: '-'

「ハイフン(-)」が混ざっていたのでエラーが出ました.

「ハイフン(-)」が混ざっている行を確認します.

print(df_d[df_d['人口(総数)'] == '-'])
print(df_d[df_d['人口(男)'] == '-'])
print(df_d[df_d['人口(女)'] == '-'])
# 実行結果
    都道府県コード 都道府県名  元号  和暦(年)   西暦(年)   注 人口(総数) 人口(男) 人口(女)
287      47   沖縄県  昭和   20.0  1945.0  1)      -     -     -
    都道府県コード 都道府県名  元号  和暦(年)   西暦(年)   注 人口(総数) 人口(男) 人口(女)
287      47   沖縄県  昭和   20.0  1945.0  1)      -     -     -
    都道府県コード 都道府県名  元号  和暦(年)   西暦(年)   注 人口(総数) 人口(男) 人口(女)
287      47   沖縄県  昭和   20.0  1945.0  1)     

「ハイフン(-)」を含むのは287行目のみなので,この一行は消去し,新たにdf_d2 とします.

df_d2 = df_d.drop(287)

消去出来たら,「人口(総数)」「人口(男)」「人口(女)」をint型に変更します.

df_d2['人口(総数)'] = df_d2['人口(総数)'].astype('int')
df_d2['人口(男)'] = df_d2['人口(男)'].astype('int')
df_d2['人口(女)'] = df_d2['人口(女)'].astype('int')

確認すると,int32型に変更できたことが分かります.

df_d2.dtypes
# 実行結果
都道府県コード     object
都道府県名       object
元号          object
和暦(年)      float64
西暦(年)      float64
注           object
人口(総数)       int32
人口(男)        int32
人口(女)        int32
dtype: object
並び替え
# 「人口(総数)」の昇順で並び替え(ascending=Trueで降順)
df_d2.sort_values(by='人口(総数)', ascending=False)

要約統計量と相関

要約統計量

列ごとの要約統計量を表示します.表示できるのは以下の値です.

  • count: 要素の個数
  • mean: 算術平均
  • std: 標準偏差
  • min: 最小値
  • 25%: 第一四分位数
  • 50%: 中央値
  • 75%: 第三四分位数
  • max: 最大値
df_d2.describe()
グループ化

グループ化して,平均値などを算出することも可能です.

都道府県別に「人口(総数)」のデータ数,平均,最小値,最大値を表示します.

df_d2[['都道府県名', '人口(総数)']].groupby(['都道府県名']).agg(['count', 'mean', 'min', 'max'])
相関係数

各列間の相関係数を算出します.

df_d2.corr()

seabornライブラリを利用すれば,ヒートマップも簡単に作成できます.

import seaborn as sns
corr = df_d2.corr()
sns.heatmap(corr)

ダミー変数

機械学習などで,質的変数を説明変数として使うときに,ダミー変数化を行うことがあります.

今回は,「元号」をダミー変数に変換してみます.

pd.get_dummies(df_d2['元号'])

「元号」が「大正」「昭和」「平成」の3つに分割され,ダミー変数化出来ていることが分かります.

おわりに

この記事では,データの確認や前処理によく使うpandasの基本的な操作をまとめました.

今回紹介したのはpandasの機能のほんの一部なので,他の機能が気になる方は公式のAPIリファレンスなどを参考にしてみてください.

API reference — pandas 2.0.2 documentation