レッスン1 / 1問目

『欠損値の処理』

このレッスンでは欠損値を処理する方法について学習していきましょう。

これまでのレッスンでは当サイトで用意したデータを用いてPandasを学習してきましたが、現実で扱うデータには欠落データが存在します。

ここでは欠落データ(欠損値)を処理する方法について以下の手順で見ていきます。

  1. 欠損値とは
  2. 欠損値が含まれているかの確認
  3. 欠損値の削除
  4. 欠損値を別の値で置き換える

ではこれらについて見ていきましょう。

欠損値とは

冒頭で述べた通り、欠損値とはデータが欠落している個所です。現実のデータではこのような欠損値がデータに含まれているため、機械学習やデータ分析において適切な結果を得るためにはこの欠損値について適切な処理を施さなければなりません。

ではどのようなデータが欠損値となるのか、具体的に見ていきましょう。

例えば以下のcsvファイルではデータが空白の個所があります。この空白の個所が欠損値となります。

ファイルパス:"/sample7.csv"

"広告費","来店者数","売上" 500000,150,2000000 300000,100,    350000,130,1350000 380000,  ,1200000 420000,130,1500000    ,180,1800000

このcsvファイルをread_csv()を用いてDataFrameで読み込むと以下のように欠損値がNanで表示されます。

  1. df = pd.read_csv("/sample7.csv")
  2. print(df)
広告費 来店者数 売上 0 500000.0 150.0 2000000.0 1 300000.0 100.0 NaN 2 350000.0 130.0 1350000.0 3 380000.0 NaN 1200000.0 4 420000.0 130.0 1500000.0 5 NaN 180.0 1800000.0

Nanは「Not a Number」つまり非数のことです。

このレッスンではこのNanに対する処理を学習し、Nanを含むデータを削除したり、他の値に置き換えるなどして適切に処理をすることが目的となります。

欠損値が含まれているかの確認

ではここからは関数の使い方を見ていきます。

まずはDataFrame内に欠損値が含まれているか確認する方法を見ていきます。

DataFrame内に欠損値が含まれているか確認するにはisnull()を使います。

以下のようにDataFrameに続けてisnull()を記述するとNullの個所をTrueとし、正常な個所をFalseとするデータが返されます。

  1. print(df.isnull())
広告費 来店者数 売上 0 False False False 1 False False True 2 False False False 3 False True False 4 False False False 5 True False False

上記のように欠損値の個所がTrueで表示されます。

欠損値を削除

では次は欠損値が含まれるデータを削除する方法について見ていきましょう。それにはdropna()を使います。

df.dropna()

では以下のデータから欠損値が含まれるデータを削除してみましょう。

広告費 来店者数 売上 0 False False False 1 False False True 2 False False False 3 False True False 4 False False False 5 True False False

上記のデータでは欠損値が含まれる1, 3, 5行目が削除されます。

  1. df2 = df.dropna()    # 欠損値を含む行を削除
  2. print(df2)
広告費 来店者数 売上 0 500000.0 150.0 2000000.0    # 1,3,5行目が削除される 2 350000.0 130.0 1350000.0 4 420000.0 130.0 1500000.0

dropna()で欠損値を含む行を削除することができました。

また、注意点ですがdropna()は欠損値を削除した新たなDataFrameを返します。
そのため元のDataFrameには影響がないという点に注意しましょう。

元のDataFrameを直接変更したい場合には以下のようにdropna()の引数にinplace=Trueと記述します。

  1. df = pd.read_csv("/sample7.csv")
  2. df.dropna(inplace=True)    # inplace=Trueを指定
  3. print(df)
広告費 来店者数 売上 0 500000.0 150.0 2000000.0    # 元のdfに変更が加えられる 2 350000.0 130.0 1350000.0 4 420000.0 130.0 1500000.0

inplace=Trueを指定することで元のDataFrameオブジェクトが変更されたことがわかります。

欠損値の置き換え

では次は欠損値を置き換える方法について見ていきましょう。欠損値を指定の値に置き換えるにはfillna()を使います。

df.fillna(指定の値)

df.fillna()を用いて以下のデータの欠損値を指定した値に置き換えていきましょう。

広告費 来店者数 売上 0 False False False 1 False False True 2 False False False 3 False True False 4 False False False 5 True False False

上記データのNan値を0に置き換えます。

  1. df = pd.read_csv("/sample7.csv")
  2. df2 = df.fillna(0)    # Nan値を0に置き換える
  3. print(df2)
広告費 来店者数 売上 0 500000.0 150.0 2000000.0 1 300000.0 100.0 0.0 2 350000.0 130.0 1350000.0 3 380000.0 0.0 1200000.0 4 420000.0 130.0 1500000.0 5 0.0 180.0 1800000.0

df.fillna()により欠損値を0に置き換えることができました。

ここでは欠損値を0に置き換えましたが、実際には平均値や中央値に置き換えるなど様々な方法がありますので、そのデータに適した値で置き換えを行うようにしましょう。

また、df.dropna()と同様にdf.fillna()も置換を行った新たなDataFrameオブジェクトを返します。そのため元のDataFrameオブジェクトには影響はなく、もし元のDataFrameオブジェクトを直接変更したい場合はdf.fillna()の引数にinplace=Trueを指定します。

df.fillna(0, inplace=True)

まとめ

このレッスンでは以下の内容について学習しました。

  • 欠損値処理の概要
  • df.isnull()
  • df.dropna()
  • df.fillna()

これらの各内容を以下にまとめます。

  • 欠損値とはデータが欠落している個所
  • 適切な結果を得るために機械学習やデータ分析では欠損値について適切な処理を行わなければならない
  • df.isnull()は欠損値の個所をTrueで返す。
  • df.dropna()は欠損値を含む行を削除する
  • df.fillna()は欠損値を指定した値に置き換える

ではレッスンは以上となります。演習課題にチャレンジしましょう。

Lesson1

dfには以下のデータが格納されています。

ファイルパス:"/sample7.csv"

広告費 来店者数 売上 0 500000.0 150.0 2000000.0 1 300000.0 100.0 NaN 2 350000.0 130.0 1350000.0 3 380000.0 NaN 1200000.0 4 420000.0 130.0 1500000.0 5 NaN 180.0 1800000.0

dfから欠損値を削除し、欠損値を削除したDataFrameオブジェクトをdf2に代入してください。

Lesson2

dfの欠損値を0に置き換え、欠損値を置換したDataFrameオブジェクトをdf3に代入してください。

なお、判定はdf2, df3に格納された値を判定します。

Last updated:2019/11/9

広告費   来店者数         売上
0  500000.0  150.0  2000000.0
2  350000.0  130.0  1350000.0
4  420000.0  130.0  1500000.0
        広告費   来店者数         売上
0  500000.0  150.0  2000000.0
1  300000.0  100.0        0.0
2  350000.0  130.0  1350000.0
3  380000.0    0.0  1200000.0
4  420000.0  130.0  1500000.0
5       0.0  180.0  1800000.0
  1. import pandas as pd

  2. df = pd.read_csv("/sample7.csv")

  3. # 1. dfの欠損値を削除しdf2に代入してください

  4. df2 = df.dropna()
  5. print(df2)

  6. # 2. dfの欠損値を0に置き換えdf3に代入してください

  7. df3 = df.fillna(0)
  8. print(df3)
main.py
設定
g
n
i
d
a
o
L