見出し画像

Python.01 データ前処理

勝手に自由研究でのPython、備忘録含め、誰かの役に立ったら嬉しいなということで、データ前処理について書きます。(この記事はこの後のグラフ作成に続く予定です)

使用データ

厚生労働省さんのデータからわかる-新型コロナウイルス感染症情報-から、新規陽性者数の推移(日別)のオープンデータ(CSV形式)を使わせてもらいました。ファイル名は「newly_confirmed_cases_daily.csv」
※ Macはそのままいけますが、Windowsの方は、一旦メモ帳で開いて、
テキストエンコーディングUTF-8にして保存し直してください。

CSVファイル読み込み

ファイル「newly_confirmed_cases_daily.csv」を、フォルダ「data」の下に保存。Pythonのファイル名を新規作成しましょう。
日付を横軸にしてグラフで使いたいので、読み込む際に、日付の型を指定します。
0列目(日付)をインデックスに、日付をdatetime型に変換して読み込ませます。

# ファイル読み込みのためにpandasを宣言
import pandas as pd

# 0列目(日付)をインデックスに、日付を datetime型 に変換して読み込み
df = pd.read_csv('./data/newly_confirmed_cases_daily.csv', index_col=0, parse_dates=True)
df.tail(3)

全部表示させるとすごい量なので、末尾3行を表示させて、うまくインポートできたか見ます。

pd.read_csvの実行結果

Pandasのデータ型

pandasのデータが使用に都合のいい型になっているか、確認します。
Pandasの代表的な型は下記の表の通り。

引用元:https://pbpython.com/pandas_dtypes.html
df.dtypes   # dfに入っているデータの型を確認
dtypesの実行結果

各都道府県の新規養成者数がint64型で入っていることがわかりました。グラフを描きたいので、整数型で入っていることがわかり、このまま使えそうです!厚生労働省さんありがとう!!

欠損値NaNをやっつけろ!

欠損値があってはいけないですよね。
とりあえず各列に欠損値があるかどうかを知りたいので、
1)isnull関数とany関数の組み合わせ→欠損値のある列にTrueが返される
2)notnull関数とall関数の組み合わせ→欠損値のある列にFalseが返される
の、パターンから1)を使ってみます。

df.isnull().any()
isnullの実行結果

欠損値はなさそう。なんて使いやすいデータなんだ。ありがとう厚生労働省さん(2度目)

datetimeで期間集計しておこう

この後グラフにしたい。でも日にちごとで増減されると流石に動きが見にくいので、datetimeを使って、週、月、四半期、年の集計データを作っておくことにします。

import datetime # 標準ライブラリ
df_W = df.resample('W').sum() # 週ごとに合計
df_W.head(5)
resample('W').sum()を使って週で集計した結果
df_M = df.resample('M').sum() # 月別で集計
df_M.head(2)
resample('M').sum()を使って月で集計した結果
df_Q = df.resample('Q').sum() # 四半期ごとの集計
df_Q.head(3)
resample('Q').sum()を使って四半期で集計した結果
df_Y = df.resample('Y').sum() # 年ごとに集計
df_Y
resample('Y').sum()を使って年で集計した結果

まとめ

これを使ってそれぞれのグラフを描いていきたいと思います。
欠損値がなく、データ型の変換もいらないのでかなり使いやすいデータが元から提供されいて勉強用にはとても助かりました。


追記

(欠損値の扱い)

厚生労働省さんの提供データが素敵すぎて、
データ前処理で欠損値を取り扱わなくて良かったのですが、欠損値が出た場合はどうしましょうか。
今回は、時系列での増減を見たい、かつ、ある程度の期間でまとめてみようとしているので、欠損行は丸ごと削除しようと思ってました。

df = df.dropna()   # 欠損値が一つでも含まれる行が削除
df.isnull().sum()  # 行・列ごとに欠損値NaNの個数をカウント
実行結果

欠損値の行列削除に合わせて、
実行結果後に欠損値はないことも確認できました。


ここまでのコードまとめ

# ファイル読み込みのためにpandasを宣言
import pandas as pd

# 0列目(日付)をindexにして読み込み、日付はdatetime型に変換指定
df = pd.read_csv('./data/newly_confirmed_cases_daily.csv', index_col=0, parse_dates=True)

# dfに入っているデータの型を確認
df.dtypes

# 欠損値がないか確認
df.isnull().any()

# 期間ごとの合計を作る
import datetime
df_W = df.resample('W').sum() # 週別に合計
df_M = df.resample('M').sum() # 月別で集計
df_Q = df.resample('Q').sum() # 四半期ごとの集計
df_Y = df.resample('Y').sum() # 年ごとに集計

欠損がないから期間合計でよかったけど、欠損値があったら、期間ごとに平均値の方が良かったなと
これを作りながら、気がつきました。OMG

よろしければサポートお願いいたします。いただいたサポートは勉強のための書籍購入費に使う予定です。