欠損データの扱い方

library(imputeTS)na.random(mydata) # Random Imputation
na.locf(mydata, option = "locf") # Last Obs. Carried Forward
na.locf(mydata, option = "nocb") # Next Obs. Carried Backward
na.interpolation(mydata) # Linear Interpolation
na.seadec(mydata, algorithm = "interpolation") # Seasonal Adjustment then Linear Interpolation

平均値、中央値、最頻値

全体の平均値、中央値、最頻値を計算することは、非常に基本的な置換方法であり、時系列特性や変数間の関係を利用しない唯一の検定関数である。 非常に高速であるが、明確な欠点がある。

library(imputeTS)na.mean(mydata, option = "mean") # Mean Imputation
na.mean(mydata, option = "median") # Median Imputation
na.mean(mydata, option = "mode") # Mode ImputationIn Python
from sklearn.preprocessing import Imputer
values = mydata.values
imputer = Imputer(missing_values='NaN', strategy='mean')
transformed_values = imputer.fit_transform(values)# strategy can be changed to "median" and "most_frequent"

Linear Regression

最初に、欠損値を持つ変数のいくつかの予測変数が相関行列を使用して識別される。 最も良い予測変数が選択され、回帰式で独立変数として使用されます。 欠損値を持つ変数が従属変数として使用されます. 予測変数の完全なデータを持つケースが回帰式を生成するために使用され,その方程式は,次に不完全なケースの欠損値を予測するために使用される. 反復プロセスでは,欠損変数の値が挿入され,その後,従属変数を予測するためにすべてのケースが使用される. これらのステップは、1つのステップから次のステップへの予測値の差がほとんどなくなるまで、つまり収束するまで繰り返される。
これは「理論的には」欠測値に対して良い推定値を提供します。 しかし、このモデルにはいくつかの欠点があり、それは利点よりも大きい傾向があります。 まず、置き換えられた値が他の変数から予測されたものであるため、「うまく合いすぎる」傾向があり、そのため標準誤差が膨らんでしまうのです。 また、回帰式に使用される変数の間に線形関係がないと仮定しなければなりません。

Multiple Imputation

  1. Imputation(インプット)。 不完全なデータセットの欠損項目をm回(図ではm=3)インプットする。 インピュテーションされた値は、ある分布から引かれることに注意してください。 ランダムドローのシミュレーションでは、モデルパラメータの不確実性は含まれません。 より良いアプローチは、Markov Chain Monte Carlo (MCMC)シミュレーションを使用することです。 このステップでは、m個の完全なデータセットが得られます。 m個の完全なデータセットをそれぞれ解析する。
  2. Pooling。 m個の解析結果を最終結果に統合する

Source: http://www.stefvanbuuren.nl/publications/mice%20in%20r%20-%20draft.pdf
# We will be using mice library in r
library(mice)
# Deterministic regression imputation via mice
imp <- mice(mydata, method = "norm.predict", m = 1)
# Store data
data_imp <- complete(imp)# Multiple Imputation
imp <- mice(mydata, m = 5)#build predictive model
fit <- with(data = imp, lm(y ~ x + z))#combine results of all 5 models
combine <- pool(fit)

これは、以下の理由から、インピュテーションの方法として圧倒的に好ましいものです。
– 使いやすい
– バイアスがない(インピュテーションモデルが正しければ)

Imputation of Categorical Variables

  1. Mode imputationは一つの方法だが確実にバイアスがかかる
  2. 欠損値はそれ自体を別のカテゴリーとして扱えば良い。 欠損値に対して別のカテゴリーを作り、それを別のレベルとして使うことができる。 これは最もシンプルな方法です。
  3. 予測モデル。 ここでは、予測モデルを作成し、欠損データを代替する値を推定する。 この場合、データセットを2つのセットに分けます。 1つは変数の欠損値がないセット(トレーニング)、もう1つは欠損値があるセット(テスト)です。 予測にはロジスティック回帰やANOVAなどの手法が使える
  4. Multiple Imputation

KNN (K Nearest Neighbors)

データの置換にはXGBoostやRandom Forestなどの機械学習手法があるが、ここでは広く使われているKNNについて述べることにする。 この方法では、k個の近傍がある距離尺度に基づいて選ばれ、その平均がインピュテーションの推定値として使用されます。 この方法は、最近傍の数と距離尺度を選択する必要がある。 KNNは離散的属性(k個の最近傍の中で最も頻度の高い値)と連続的属性(k個の最近傍の中で平均値)の両方を予測できる。
距離メトリックはデータの種類によって異なる:
1. 連続的なデータ。 連続データでは、ユークリッド、マンハッタン、コサインがよく使われる距離指標である
2.カテゴリーデータ。 この場合、一般にハミング距離が使われる。 これはすべてのカテゴリ属性を取り、それぞれについて、2点間で値が同じでない場合は1カウントする。 ハミング距離は値が異なる属性の数に等しくなる。
KNNアルゴリズムの最も魅力的な特徴の1つは、理解しやすく、実装が容易なことである。 KNNのノンパラメトリックな性質は、データが非常に「異常」である可能性がある特定の設定で優位に立つ。
KNNアルゴリズムの明らかな欠点の1つは、データセット全体を通して類似のインスタンスを検索するため、大きなデータセットを分析するときに時間がかかるということである。 さらに、高次元データでは、最近傍と最遠傍の間にほとんど差がないため、KNNの精度は著しく低下します。

library(DMwR)
knnOutput <- knnImputation(mydata)In python
from fancyimpute import KNN
# Use 5 nearest rows which have a feature to fill in each row's missing features
knnOutput = KNN(k=5).complete(mydata)

上述したすべての方法の中で、多重代入とKNNは広く使われており、より単純な多重代入が一般的に好まれます。

この投稿について何か質問があればコメントで聞いていただければ、できる限りお答えします。

コメントを残す

メールアドレスが公開されることはありません。