Rで欠損値の処理 ーna.omit, is.na, na.rm, 欠損値含むダミーデータ作成ー

Rでプレゼンテーション

データ解析を行うデータを確認すると、データの抜け、いわゆる「欠損値」があることがあります。
欠損値があると、データの解析やモデリングが適切に行えない可能性があります。
この記事では、Rでの欠損値の処理方法について解説します。

1. 欠損値の種類
欠損値の特徴を知ることは重要です。
考えられる原因に基づいて、欠損値が生じるメカニズムが3つの異なるタイプに分類されています※1 。

・完全にランダムな欠損値(MCAR:missing completely at random):欠損値が観測された他の変数やデータの特性と関係なくランダムに発生する場合。
・ランダムな欠損値(MAR:missing at random):欠損値の発生が観測された他の変数にのみ依存する場合。
・ランダムでない欠損値(MNAR:missing not at random):欠損値の発生が観測されないデータに依存する場合。

MNARのように要因が明らかにできていない欠損値については、補完を行うのは難しいといわれています。




2. 欠損値を含むダミーデータ作成
欠損値の処理方法を確認していくために、欠損値を含むダミーデータを作成してみます。

set.seed(123) # 乱数のシードを設定
n <- 100 # データの行数
p <- 5 # データの列数
data <- matrix(rnorm(n * p), ncol = p) # 標準正規分布からの乱数によるダミーデータの生成
#   [,1] [,2] [,3] [,4] [,5]
#[1,] -0.56047565 -0.71040656 2.1988103 -0.7152422 -0.07355602
#[2,] -0.23017749 0.25688371 1.3124130 -0.7526890 -1.16865142
#[3,] 1.55870831 -0.24669188 -0.2651451 -0.9385387 -0.63474826
#[4,] 0.07050839 -0.34754260 0.5431941 -1.0525133 -0.02884155
#[5,] 0.12928774 -0.95161857 -0.4143399 -0.4371595 0.67069597
#[6,] 1.71506499 -0.04502772 -0.4762469 0.3311792 -1.65054654

missing_prop <- 0.1 # 欠損値の割合
missing_index <- sample(1:(n*p), size = round(n*p*missing_prop)) # 欠損値が入るインデックスの選択(ランダム)
data[missing_index] <- NA # 欠損値を設定
head(data) #5列×100行のデータ
#   [,1] [,2] [,3] [,4] [,5]
#[1,] -0.56047565 -0.71040656 2.1988103 -0.7152422 -0.07355602
#[2,] -0.23017749 0.25688371 1.3124130 -0.7526890 -1.16865142
#[3,] 1.55870831 -0.24669188 -0.2651451 -0.9385387 -0.63474826
#[4,] 0.07050839 -0.34754260 0.5431941 -1.0525133 -0.02884155
#[5,] 0.12928774 -0.95161857 -0.4143399 -0.4371595 0.67069597
#[6,] 1.71506499 -0.04502772 NA NA -1.65054654

欠損値をランダムにいれたdataが生成され、head(data)を確認すると、NA(欠損値)が入っていることが確認できました。
こちらのダミーデータは、完全なランダムな欠損でMCARに該当すると考えられます。以下、こちらのダミーデータを使用していきます。

3. 欠損値の削除(na.omit)
欠損値を含む行を削除する方法です。
data1<- na.omit(data) # 欠損値を含む行を削除
head(data1) #5列×61行のデータに(列:ncol(data1)と行:nrow(data1)で確認)
#     [,1] [,2] [,3] [,4] [,5]
#[1,] -0.56047565 -0.7104066 2.1988103 -0.7152422 -0.07355602
#[2,] -0.23017749 0.2568837 1.3124130 -0.7526890 -1.16865142
#[3,] 1.55870831 -0.2466919 -0.2651451 -0.9385387 -0.63474826
#[4,] 0.07050839 -0.3475426 0.5431941 -1.0525133 -0.02884155
#[5,] 0.12928774 -0.9516186 -0.4143399 -0.4371595 0.67069597
#[6,] 0.46091621 -0.7849045 -0.7886028 -2.0142105 -0.34975424

これは最も簡単な方法ですが、データの有益な情報を失う可能性があります。
本ダミーデータは、全データの1割の欠損値としましたが、欠損値を含む行を削除すると、6割程度までの情報に削減されてしまいました。

4. 欠損値の補完(is.na, na.rm, 平均値代入法の紹介)
欠損値に、その変数(列)の平均値を代入します。

for (i in 1:ncol(data)) {           
  col_mean <- mean(data[, i], na.rm = TRUE)  #1 列の平均値を計算、na.rm=TRUEで欠損値を無視
  data[is.na(data[, i]), i] <- col_mean     # is.naで欠損値を平均値で置き換え
}
head(data)
            [,1]        [,2]       [,3]        [,4]        [,5]
[1,] -0.56047565 -0.71040656  2.1988103 -0.71524219 -0.07355602
[2,] -0.23017749  0.25688371  1.3124130 -0.75268897 -1.16865142
[3,]  1.55870831 -0.24669188 -0.2651451 -0.93853870 -0.63474826
[4,]  0.07050839 -0.34754260  0.5431941 -1.05251328 -0.02884155
[5,]  0.12928774 -0.95161857 -0.4143399 -0.43715953  0.67069597
[6,]  1.71506499 -0.04502772  0.1683519 -0.08064404 -1.65054654

#1 na.rm=TRUEで欠損値を無視するというコード。欠損値があるとmeanの計算できないため。

本ダミーデータは、MACRと考えられるため、平均値代入法を使用しますが、多くの欠損値補完においては、使用の注意が必要です。
そのほかにも、回帰代入法や多重代入法などの欠損値補完方法があります。

5. 欠損値の処理の注意点
データセットの性質や目的に応じて、適切な欠損値の処理方法を選択することが重要です。
また、欠損値の処理はデータのバイアスや分析結果に影響を与える可能性があるため、慎重に行う必要があります。




コメント

タイトルとURLをコピーしました