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をコピーしました