本文へスキップ
ひもとくAI

データを確かめる:出典・欠損・分布・おかしな値

レッスン 2/6

データを確かめる(1):どこから来た、どんなデータか

モデルを作る前に、データそのものを確かめます。ここでの見落としは、後でどんなに良いモデルを使っても取り戻せません。「ゴミを入れれば、ゴミが出てくる」(Garbage in, garbage out)と言われるほどです。

出典と、使ってよいか

確かめること例
出典誰が、いつ、どうやって集めたデータか
ライセンス・利用規約商用で使ってよいか、出典の表示が必要か(第9章で使った乳がんのデータは CC BY 4.0)
同意と目的人に関するデータなら、集めたときに伝えた目的の範囲の中で使うか
個人情報氏名・住所・メールアドレスなど、予測に必要のない情報が入っていないか。入っていたら、最初に取り除く

この章のデータは、運営が作った架空のデータなので、ライセンスや同意の問題はありません。実際のデータでは、ここで使えないと分かることもあります。

データは、現実の一部しか映していない

データを集めた方法によって、現実とずれることがあります。

  • 集め方の偏り: 例えば、アンケートに答えてくれた人だけのデータは、「アンケートに答える人」に偏っている。ネットの調査なら、ネットを使わない人がいない
  • 時期の違い: 去年のデータで作ったモデルが、今年も同じように当たるとは限らない(利用者の年代が変わった、講座の内容が変わった、など)
  • 記録の仕方: 同じ「学習時間」でも、「画面を開いていた時間」か「問題を解いていた時間」かで、意味が違う。列の意味を、データを作った人に確かめる

この章のデータの列

列意味
受講者ID受講者ごとの番号
端末主に使った端末(PC・スマホ・タブレット)
申し込みの経路講座を知ったきっかけ(検索・SNS・紹介)
年代10代・20代・30代・40代以上
最初の週の学習時間最初の1週間の学習時間(分)
最初の週のレッスン数・正解数最初の1週間に終えたレッスンの数と、正解した問題の数
ヒントを見た割合問題のうち、ヒントを見た割合(0〜1)
連続学習日数最初の1週間で、続けて学習した日数の最大(0〜7)
修了証までの日数修了証が発行されるまでの日数
途中でやめた正解。1: 途中でやめた、0: 最後まで続いた

3000人分、11列のデータです。次のスライドで、Python を使って中身を確かめます。

データを確かめる(2):欠損・分布・おかしな値

まず、数と形を見る

import pandas as pd

df = pd.read_csv("/data/course-completion.csv")   # 演習の中では、このファイルが用意されている
print(df.shape)            # → (3000, 11)
print(df.head())           # 最初の5行
print(df.isna().sum())     # 列ごとの欠損(空欄)の数

欠損の数は、次のとおりでした(0の列は省略)。

列欠損の数
最初の週の学習時間242(約8%)
修了証までの日数1841(約61%)

「修了証までの日数」の欠損は、何を表しているか

「修了証までの日数」が空欄の人を、正解ごとに数えました。

途中でやめた(1)最後まで続いた(0)
空欄の人18410
値がある人01159

空欄の人は全員「途中でやめた」、値がある人は全員「最後まで続いた」でした。修了証は、最後まで続いた人にしか発行されないからです。この列を使えば、どんなモデルでも正解率1.0になります。しかし、予測を使う「最初の1週間が終わった時点」では、修了証が出るかはまだ分かりません。レッスン1で見た、使ってはいけない列(データリーク) です。

このように、「欠損しているかどうか」が正解と強く結び付いている列は、リークを疑う手がかりになります。

分布を見る:平均と中央値が大きく違う

print(df["最初の週の学習時間"].describe())
数平均標準偏差最小中央値最大
2758660.37347.829899999

中央値は98分なのに、平均は660.3分と、6倍以上になっています。最大の99999分は、約69日分です。1週間は 7 × 24 × 60 = 10080分 なので、これはありえない値(入力の誤り)です。このような値が15件あり、平均を大きく引き上げていました。取り除くと、平均は117.1分になります。

平均と中央値が大きく違うときや、最大・最小がありえない値のときは、入力の誤りや、特別な意味の値(例えば「不明」を 99999 で表している)を疑います。

グループごとに見る

端末人数途中でやめた割合
PC14970.589
スマホ11880.649
タブレット3150.597

全体では61.4%の人が途中でやめていました。タブレットの人は315人と少なく、グループごとの評価(レッスン6)では、結果のぶれが大きくなりやすいことを覚えておきます。

データの点検のまとめ、よくある誤解と振り返り

データの点検表

モデルを作る前に、毎回この順で確かめます。

  1. 出典・ライセンス・同意: 使ってよいデータか
  2. 個人情報: 予測に必要のない個人情報を取り除いたか
  3. 形: 行と列の数、各列の意味と単位
  4. 欠損: 列ごとの欠損の数。欠損が正解と結び付いていないか(リークの手がかり)
  5. 分布: 平均・中央値・最小・最大。ありえない値や、特別な意味の値がないか
  6. 正解の割合: 全体と、グループごと。不均衡か、数の少ないグループはないか
  7. 使える時点: 各列は、予測を使う時点で手に入るか

現実のデータで、ほかによくあること

この章のデータは架空なので、きれいに整っています。現実のデータでは、次のようなことも起こります。

  • 同じ人の記録が、何行も重複している(第9章のリーク)
  • 「東京都」「東京」「とうきょう」のように、同じものの書き方がばらばら
  • 途中で記録の仕方が変わり、ある日から単位が「分」から「秒」になっている
  • 日付の書き方が、行によって違う

よくある誤解

  • 「欠損している行は、全部消せばよい」: 学習時間の欠損は約8%でしたが、ほかの列も欠損していれば、消すたびにデータが減ります。また、欠損していることに意味がある場合もあります(修了証の例)。次のレッスンで、埋め方を学びます
  • 「平均を見れば、データの様子が分かる」: ありえない値が15件あるだけで、平均は117.1分から660.3分にふくらみました。中央値や最大・最小も一緒に見ます
  • 「データが多ければ、偏っていても問題ない」: 集め方が偏っていれば、どれだけ多くても、偏りはなくなりません

振り返り

  • データの出典・ライセンス・同意・個人情報を、最初に確かめる
  • 欠損の数と、欠損が正解と結び付いていないかを確かめる。空欄かどうかだけで正解が分かる列は、リークを疑う
  • 平均と中央値、最小と最大を比べて、ありえない値を見つける
  • 正解の割合を、全体とグループごとに確かめる

演習

演習を読み込んでいます…