![見出し画像](https://assets.st-note.com/production/uploads/images/94633751/rectangle_large_type_2_d26f46c220725e69efc605e6f5407c84.jpeg?width=800)
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行を表示させて、うまくインポートできたか見ます。
![](https://assets.st-note.com/img/1672563556622-tEyOfYUqmJ.png?width=800)
Pandasのデータ型
pandasのデータが使用に都合のいい型になっているか、確認します。
Pandasの代表的な型は下記の表の通り。
![](https://assets.st-note.com/img/1672563826086-HQdP6WtjE2.png?width=800)
df.dtypes # dfに入っているデータの型を確認
![](https://assets.st-note.com/img/1672563995702-d5iMama91c.png?width=800)
各都道府県の新規養成者数がint64型で入っていることがわかりました。グラフを描きたいので、整数型で入っていることがわかり、このまま使えそうです!厚生労働省さんありがとう!!
欠損値NaNをやっつけろ!
欠損値があってはいけないですよね。
とりあえず各列に欠損値があるかどうかを知りたいので、
1)isnull関数とany関数の組み合わせ→欠損値のある列にTrueが返される
2)notnull関数とall関数の組み合わせ→欠損値のある列にFalseが返される
の、パターンから1)を使ってみます。
df.isnull().any()
![](https://assets.st-note.com/img/1672570371300-xWdSsZ4xjS.png?width=800)
欠損値はなさそう。なんて使いやすいデータなんだ。ありがとう厚生労働省さん(2度目)
datetimeで期間集計しておこう
この後グラフにしたい。でも日にちごとで増減されると流石に動きが見にくいので、datetimeを使って、週、月、四半期、年の集計データを作っておくことにします。
import datetime # 標準ライブラリ
df_W = df.resample('W').sum() # 週ごとに合計
df_W.head(5)
![](https://assets.st-note.com/img/1672570839629-5s4TBULCki.png?width=800)
df_M = df.resample('M').sum() # 月別で集計
df_M.head(2)
![](https://assets.st-note.com/img/1672570977565-O6jD03O3Q1.png?width=800)
df_Q = df.resample('Q').sum() # 四半期ごとの集計
df_Q.head(3)
![](https://assets.st-note.com/img/1672571061130-gIGwqMinNT.png?width=800)
df_Y = df.resample('Y').sum() # 年ごとに集計
df_Y
![](https://assets.st-note.com/img/1672571116350-reudGUzwXC.png?width=800)
まとめ
これを使ってそれぞれのグラフを描いていきたいと思います。
欠損値がなく、データ型の変換もいらないのでかなり使いやすいデータが元から提供されいて勉強用にはとても助かりました。
追記
(欠損値の扱い)
厚生労働省さんの提供データが素敵すぎて、
データ前処理で欠損値を取り扱わなくて良かったのですが、欠損値が出た場合はどうしましょうか。
今回は、時系列での増減を見たい、かつ、ある程度の期間でまとめてみようとしているので、欠損行は丸ごと削除しようと思ってました。
df = df.dropna() # 欠損値が一つでも含まれる行が削除
df.isnull().sum() # 行・列ごとに欠損値NaNの個数をカウント
![](https://assets.st-note.com/img/1672732720585-WenTDGIaJP.png?width=800)
欠損値の行列削除に合わせて、
実行結果後に欠損値はないことも確認できました。
ここまでのコードまとめ
# ファイル読み込みのために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
よろしければサポートお願いいたします。いただいたサポートは勉強のための書籍購入費に使う予定です。