機械学習アルゴリズムの効果的な実装や、データセットのデータ解析を行う場合にも、クリーンなデータが必要です。
データによる数値モデリングについて、「Trash in Trash out」という有名な言葉がありますが、データがクリーンでなければ、まともな結果は期待できません。
この記事では、pandasライブラリを使ってデータをきれいにするための一般的なテクニックを探ります。
この記事もチェック:知っておきたいPythonの機械学習アルゴリズムTOP5
Common Data Cleaning Checks
以下に基づいてデータをクリーニングします。
- 欠測値
- 外れ値
- 重複する値
1. 欠測値
Pandasでは、欠損値は通常 NaN で表されます。
PandasはNumPyパッケージをベースにしているので、NumPy特有の浮動小数点型のNaN値ということになります。
この記事で使用したデータセットはこちらで確認できます。
欠測値の検出
まず、データ中に欠損値があるかどうかを調べる方法を説明します。
アプローチ1:視覚的に
import pandas as pd
import seaborn as sb
import matplotlib.pyplot as plt
#importing Datasetdf = pd.read_csv('IMDB-Movie-Data.csv')
#Creating the heatmapplt.figure(figsize = (8,6))
sb.heatmap(df.isnull(), cbar=False , cmap = 'magma')
|
import pandas as pd
#importing datasetdf = pd.read_csv('IMDB-Movie-Data.csv')
df.isnull().sum()
|
.isnull() メソッドは、データ中に欠損値があるかどうかを示す真偽値を返す。
しかし、この処理は中規模から小規模のデータセットに限られる可能性があります。
アプローチ2
.isnull()を適用した後に.sum()` メソッドを使用すると、データフレーム内の各列の欠損値の合計を返すことができます。
#imporing pandasimport pandas as pd
#Importing datasetdf = pd.read_csv('IMDB-Movie-Data.csv')
#Size of original datasetprint(df.shape)
#Dropping the missing rows.df_dropped = df.dropna(how = 'any')
|
import pandas as pd
#importing the datasetdf = pd.read_csv('IMDB-Movie-Data.csv')
#Creating a copy of dataframedf_new = df
df_new['Metascore'] = df_new['Metascore'].fillna((df_new['Metascore'].mean()))
#printing the dataframes after replacing null valuesprint(df_new.isna().sum())
print(df.isna().sum())
|
データから欠損値を除去する
私たちのデータセットには、いくつかの欠測値があることがわかりました。
私たちは、欠測値を含む行や列を削除するか、欠測値を適切な量(例えば、平均値、中央値、最頻値)に置き換えることができます。
-
- 欠損値を削除する
#importing required modulesimport pandas as pd
import numpy as np
from scipy import stats
#importing datasetdf = pd.read_csv('IMDB-Movie-Data.csv')
#filtering outliersdf_new = df[(np.abs(stats.zscore(df.Votes)) < 3)]
|
上記のコードでは、データフレームから欠損値を持つ行を削除します。
それでは、.dropna() メソッドを詳しく見ていきましょう。
- df.dropna() – NaN 値を持つすべての行を削除します。
- df.dropna(how=’all’) – すべての列がNaNである場合のみドロップします。
- df.dropna(thresh=2) – NaNでない値が2つ以上ない場合に行を削除します。
- df.dropna(subset=[1]) – 特定の列にNaNがある場合のみドロップします。
欠損値の削除を検討する場合、データセットの品質に影響を与える可能性があるため、注意が必要です。
- 欠損値の置き換え
#importing required modulesimport pandas as pd
import numpy as np
from scipy import stats
#importing datasetdf = pd.read_csv('IMDB-Movie-Data.csv')
#Selecting limitsq_low = df["Votes"].quantile(0.01)
q_hi = df["Votes"].quantile(0.99)
#filtering outliersdf_filtered = df[(df["Votes"] < q_hi) & (df["Votes"] > q_low)]
|
#Import the required modulesimport pandas as pd
import numpy as np
#importing and appending similar rows to of the dataframedf = pd.read_csv('IMDB-Movie-Data.csv')
df1 = df.append(df.iloc[20:30,:])
df1.duplicated().sum()
|
pandas には .fillna() メソッドがあり、NaN 値の代わりに置き換えたい値を受け取ることができます。
ここでは、列の平均を計算し、それを fillna() メソッドの入力引数として渡しました。
この記事もチェック:Pythonで欠損値を埋め込む方法|平均値、中央値、KNNの3つの方法を解説
2. 外れ値への対応
外れ値は、予測全体の流れを変える可能性があるため、外れ値を検出し、除去することが重要です。
Z-Scoreの使用
データセットのVotes列で外れ値を検出し、Zスコアを使用して外れ値をフィルタリングしてみましょう。
この方法の背後にある考え方は、平均から3標準偏差離れたところにある値を外れ値と呼ぶという事実にある。
#Importing the required modules#Import the required modulesimport pandas as pd
import numpy as np
#importing and appending similar rows to of the dataframedf = pd.read_csv('IMDB-Movie-Data.csv')
df1 = df.append(df.iloc[20:30,:])
#dropping the duplicatesdf1 = df1.drop_duplicates()
#checking the duplicates df1.duplicated().sum()
|
この方法が適用される列は、カテゴリ変数ではなく、数値変数でなければなりません。
分数の使用
この方法では、系列内の0.01分位未満、0.99分位以上の値がフィルタリングされます。

3. 重複したエントリの処理
DataFrameの重複をチェックするには、 .duplicated() メソッドを使用します。
これは、DataFrameではなく、PandasのSeriesを返します。
特定の列の重複をチェックするには、.duplicated( )メソッドの入力引数として列名を指定することができます。
これを実際に見てみましょう。
幸いなことに、私たちのデータフレームには重複する値がないので、データフレーム自体からいくつかの値を追加して、重複する値を作成します。

Output:
10
ここで、 .drop_duplicates() メソッドを使用して、データフレームから重複する値を削除します。

output:
0
おわりに
この記事は、Pandasを使用して、乱雑なデータセットに対して実行する必要がある基本的なデータクリーニング操作について学習するためのものでした。
それでは、よい学習を