クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

汚れたデータを見つけて直す

このレッスンのあとで: 汚れたデータの傷を見つけて、直すことができる。

45分のレッスンコマンド3件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

同じ「晴れ」が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種類です。値が欠けている。数のはずの列に文字が混じっている。行が重複している。ありえない値が入っている。

天気のような表記のゆれもあります。どの傷にも、短く確かめる方法があります。何かを変える前に、まず見ます。

例: 傷とその確かめ方

傷見え方確かめ方
欠損値セルに NaNmessy.isna().sum()
型の違い数のはずが objectmessy.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 でそろえます。

試す: 言葉をそろえる

コード: python
# 書き出したファイルにあった、3通りの「晴れ」です。
words = ["sunny", "Sunny ", "SUNNY"]
for word in words:
    # 空白を取り、小文字にそろえます。
    print(repr(word), "→", repr(word.strip().lower()))

試す: 台数を確かめる

コード: python
# 貸出台数のはずの値を、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書き出したままの状態
重複を消す3652行が重複していた
台数が0以上の行だけ残す363「unknown」と -5 は台数でない
45度を超える気温を欠損にする36399.9 も欠損の仲間になる
欠けた気温を中央値で埋める363ここでは空より推測がよい

学生が入力するセルは、このプレビューでは空白です。

きれいにする手順を動かす

コマンド
docker exec jupyter python3 steps/clean.py

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

さらに挑戦: ノートブックで確かめる

JupyterLab を開き、新しいセルで messy.csv を読み込んでみましょう。isna で欠けた行を、duplicated で重複した行を取り出せます。

消す前に、どの行が消えるのかを、自分の目で見てください。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。