みなさん,こんにちは。
シンノユウキ(shinno1993)です。
今回はデータ分析などの際に問題となる”欠損”について、データ処理の段階できる処理:除外・置き換えについて、Pythonを用いて紹介します。
”欠損”について
欠損を起こさないのが大前提
今回は、データ処理の段階での欠損を扱いますが、重要なのは、そもそも欠損を発生させないこと。アンケートの仕組みや調査デザインをしっかりと検討することでそれらを最小限にすることができます。起きてしまった欠損は仕方ない(今回はそれを扱う)ですが、それを起こさないのが大前提ですので、欠損を後から統計処理でどうにかするというのは大きな間違いです。
欠損の扱い方は主に2つ
欠損の扱い方は、主に2つです。除外するか他の値で置き換えるか、です。
今回は、Pythonを用いて、それらを行う方法を紹介します。
対象のデータはこちら
まずは今回分析対象とするデータを紹介します。
このデータは、こちらからDLできますので、よろしければご活用ください。
import pandas as pd df = pd.read_csv('test.csv',index_col='番号') df.head()
最初の5行だけ示しています。
性別と年齢、身長、体重が入力されています。
年齢(歳) | 身長(cm) | 体重(kg) | |
---|---|---|---|
番号 | |||
1 | 36.0 | 166 | 62.0 |
2 | 47.0 | 157 | 68.0 |
3 | 27.0 | 172 | 65.0 |
4 | 20.0 | 175 | 69.0 |
5 | 39.0 | 174 | 72.0 |
このデータには、あらかじめ欠損を発生させています。
df.count()
結果:
年齢(歳) 46 身長(cm) 50 体重(kg) 47 dtype: int64
データ数50なので、身長以外は欠損があるデータがあるということになりますね。
方法1:欠損値のあるデータを除外する
まず紹介するのは、欠損のあるデータを除外する方法です。
サンプルサイズは小さくなってしまいますが、そのデータの重要性が大きい場合など、除外するのが適切な場合は多くあります。
ライブラリ:Pandasを利用
これらの処理をするにあたって、データ分析には必須とも言えるPandasを利用します。以下のコードでインポートできます。
import pandas as pd
欠損値が1つでもある行を除外
欠損値が1つでもある場合ぶ、その行を除外する方法を紹介します。これには、pandasのDataFrame.dropna()を用います。
df1 = df.dropna() df1.count()
結果:
年齢(歳) 44 身長(cm) 44 体重(kg) 44 dtype: int64
全部で50あったデータ数が44にまで減りました。
欠損でない項目が○個未満なら除外
少しなら欠損値が含まれていても構わない。ただし、欠損でない値が○個未満なら除外する、っていうのが次のコードです。
df2 = df.dropna(thresh=3) df2.count()
結果:
欠損値が1つでもある列を削除
行だけでなく、欠損値を含む列を削除することもできます。
df3 = df.dropna(axis=1) df3.head()
結果:
身長(cm) | |
---|---|
番号 | |
1 | 166 |
2 | 157 |
3 | 172 |
4 | 175 |
5 | 174 |
今回のデータでは、身長以外の列には欠損がありましたので、身長だけが残りました。
方法2:他の値で置き換える
欠損を処理する方法には、除外だけでなく、他の値で置き換える方法もあります。実際に測定されたデータでないため、扱い方や解釈には注意が必要ですが、うまく使うことでサンプルサイズを小さくせずに済むかもしれません。
ライブラリ:scikit-learnのImputerクラスを活用
この方法では、Pythonの機械学習ライブラリ:scikit-learnのpreprocessingのImputerクラスを活用します。これは、機械学習に用いるためのデータを、事前処理するために活用します。今回は、それを使ってみましょう。インポートは以下のコードで行えます。
from sklearn.preprocessing import Imputer
平均値
まずは、欠損値をその列の平均値で置き換える方法を紹介します、コードは以下の通りです。
imp = Imputer(missing_values="NaN", strategy="mean") values = imp.fit_transform(df[["体重(kg)"]]) df[["体重(kg)"]] = values
imputerのmissing_valuesで置換する項目を指定し、strategyで平均値を示すmeanを指定します。
このimpは、NaNに平均値を補完するimputerオブジェクトです。
imp.fit_transformで欠損値の含まれる、平均値で保管したいデータを渡すと、平均値で保管されたデータが返ってきます。
それを実際のデータに代入すると保管できます。
中央値
中央値は、先ほどの平均値のコードのmeanをmedianに変えるだけで実装できます。
imp = Imputer(missing_values="NaN", strategy="median") values = imp.fit_transform(df[["体重(kg)"]]) df[["体重(kg)"]] = values
最頻値
最頻値についても、strategyをmost_frequentにするだけで大丈夫です。
imp = Imputer(missing_values="NaN", strategy="most_frequent") values = imp.fit_transform(df[["体重(kg)"]]) df[["体重(kg)"]] = values
まとめ
今回は、データ分析の際に問題となる”欠損”について、データ解析の段階でできる処理について紹介しました。ご活用いただければと思います。