同じ「晴れ」が3通りある
レンタル自転車の店が、1年分の貸出の記録を書き出しました。天気の列には、「sunny」も「Sunny 」も「SUNNY」も入っています。
人には全部「晴れ」に見えます。でもコンピュータは3つの別の値として数えるので、集計がずれます。データのよごれを見つけて直すことを、データのクレンジングといいます。
このレッスンのゴール
メモ
汚れたデータの傷を見つけて、直すことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| クレンジング | データの傷を見つけて直す作業 | |
| 欠損値 | 値が入っていないセル | NaN |
| 重複 | 同じ行が2回以上あること | |
| 外れ値 | 他と大きくちがう値 | |
| 表記のゆれ | 同じ意味なのに、書き方がちがうこと |
学生が入力するセルは、このプレビューでは空白です。
直す前に、まず中身を見る
ラボの JupyterLab には、1年分の貸出の記録 hires.csv が入っています。365日で1日1行、列は7つです。
データを直す前に、きれいな元のデータを見ます。下の Run で、貸出台数の平均と最小、最大を一覧にします。
貸出台数の要約を見る
docker exec jupyter python3 steps/summary.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
データの傷はたいてい4種類
傷は、たいてい4種類です。値が欠けている。数のはずの列に文字が混じっている。行が重複している。ありえない値が入っている。
天気のような表記のゆれもあります。どの傷にも、短く確かめる方法があります。何かを変える前に、まず見ます。
例: 傷とその確かめ方
| 傷 | 見え方 | 確かめ方 |
|---|---|---|
| 欠損値 | セルに NaN | messy.isna().sum() |
| 型の違い | 数のはずが object | messy.dtypes |
| 重複 | 日数より行が多い | messy.duplicated().sum() |
| ありえない値 | ありえない最大値 | messy["temp_c"].max() |
| 表記のゆれ | Sunny と sunny が別 | messy["weather"].value_counts() |
学生が入力するセルは、このプレビューでは空白です。
傷つけたコピーを調べる
docker exec jupyter python3 steps/messy.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
文字の列は、数の問題を隠す
数の列に言葉が1つ混じると、列全体が文字として扱われます。平均も合計も出せません。
空白のついた「Sunny 」と「SUNNY」も、コンピュータには別の値です。数は isdigit で確かめ、言葉は strip と lower でそろえます。
試す: 言葉をそろえる
# 書き出したファイルにあった、3通りの「晴れ」です。
words = ["sunny", "Sunny ", "SUNNY"]
for word in words:
# 空白を取り、小文字にそろえます。
print(repr(word), "→", repr(word.strip().lower()))
試す: 台数を確かめる
# 貸出台数のはずの値を、1つずつ確かめます。
texts = ["318", "-3", "n/a", "250"]
good = []
for text in texts:
if text.isdigit():
good.append(int(text))
else:
print("直す前に確認:", text)
print("使える台数:", good)
# 最後の "250" を "2 5" に変えて、どうなるか試しましょう。
よくある間違い
注意
外れ値はすべて誤りだから消してよいと考えがちです。めずらしい値でも、本当のことがあります。487台の日は、実際にあった日です。消したり置きかえたりするのは、99.9度やマイナスの台数のように、ありえない値だけにします。
消す、直す、埋める、そして残す
救えない行は消します。台数が「unknown」の行がそうです。正しい値がはっきりしていれば直します。「Sunny 」を「sunny」にします。
推測でよい欠損は、中央値で埋めます。元のファイルは変えず、コピーをきれいにします。そうすれば、手順をもう一度実行できます。
例: きれいにする手順の順番
| 手順 | 残った行 | 理由 |
|---|---|---|
| messy.csv を読む | 367 | 書き出したままの状態 |
| 重複を消す | 365 | 2行が重複していた |
| 台数が0以上の行だけ残す | 363 | 「unknown」と -5 は台数でない |
| 45度を超える気温を欠損にする | 363 | 99.9 も欠損の仲間になる |
| 欠けた気温を中央値で埋める | 363 | ここでは空より推測がよい |
学生が入力するセルは、このプレビューでは空白です。
きれいにする手順を動かす
docker exec jupyter python3 steps/clean.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
さらに挑戦: ノートブックで確かめる
JupyterLab を開き、新しいセルで messy.csv を読み込んでみましょう。isna で欠けた行を、duplicated で重複した行を取り出せます。
消す前に、どの行が消えるのかを、自分の目で見てください。