R の欠損値 (NA) を置換する方法: na.omit と na.rm

データ サイエンスにおける欠損値は、観測値がデータ フレームの列で欠落している場合、または数値の代わりに文字値が含まれている場合に発生します。 データから正しい結論を引き出すには、欠損値を削除するか置き換える必要があります。

このチュートリアルでは、dplyr ライブラリを使用して欠損値を処理する方法を学習します。dplyr ライブラリは、データ分析を実現するためのエコシステムの一部です。

R の欠損値を置換する

このチュートリアルでは、

mutate()

の XNUMX 番目の動詞は、 dplyr ライブラリ 新しい変数を作成したり、既存の変数の値を変更したりするのに役立ちます。

XNUMX部構成で進めていきます。 次の方法を学習します。

  • データフレームから欠損値を除外する
  • 欠損値を平均値と中央値で代入する

動詞 mutate() の使い方は非常に簡単です。次の構文に従って新しい変数を作成できます。

mutate(df, name_variable_1 = condition, ...)
arguments:
-df: Data frame used to create a new variable
-name_variable_1: Name and the formula to create the new variable
-...: No limit constraint. Possibility to create more than one variable inside mutate()

欠損値を除外する (NA)

dplyrライブラリのna.omit()メソッドは、欠損値を除外する簡単な方法です。データからすべてのNAを削除するのは簡単ですが、それが最もエレガントな解決策であるとは限りません。分析中は、欠損値に対処するためにさまざまな方法を使用するのが賢明です。

観測値の欠落の問題に取り組むために、titanic データセットを使用します。 このデータセットでは、悲劇の際に乗っていた乗客の情報にアクセスできます。 このデータセットには、注意が必要な NA が多数あります。

インターネットから csv ファイルをアップロードし、どの列に NA があるかを確認します。欠落データのある列を返すには、次のコードを使用できます。

データをアップロードして、不足しているデータを確認してみましょう。

PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv"
df_titanic <- read.csv(PATH, sep = ",")
# Return the column names containing missing observations
list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]
list_na

出力:

## [1] "age"  "fare"

ここでは、

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

データのない列の名前を指定します。

列の年齢と運賃には値が欠落しています。

na.omit() を使用してそれらを削除できます。

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

出力:

## [1] 1045   13

新しいデータセットには 1045 行が含まれていますが、元のデータセットには 1309 行が含まれています。

欠損値を除外する

欠損データを平均値と中央値で補う

欠損値を中央値または平均値で代入(代入)することもできます。 平均値と中央値に対して XNUMX つの別々の変数を作成することをお勧めします。 作成したら、欠損値を新しく形成された変数に置き換えることができます。

apply メソッドを使用して、NA の列の平均を計算します。 例を見てみましょう

ステップ1) チュートリアルの前半で、欠損値を含む列名を list_na というリストに保存しました。 このリストを使用します

ステップ2) 次に、引数 na.rm = TRUE を使用して平均を計算する必要があります。 列にデータが欠落しており、R にそれらを無視するよう指示するため、この引数は必須です。

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

コードの説明:

apply メソッドで 4 つの引数を渡します。

  • df: df_titanic[,colnames(df_titanic) %in% list_na]。 このコードは、list_na オブジェクトから列名 (つまり、「年齢」と「運賃」) を返します。
  • 2: 列の関数を計算します。
  • 平均: 平均を計算します
  • na.rm = TRUE: 欠損値を無視します。

出力:

##      age     fare 
## 29.88113 33.29548

欠落している観測値を含む列の平均を正常に作成できました。 これら XNUMX つの値は、欠落している観測値を置き換えるために使用されます。

ステップ3) NA 値を置き換える

dplyr ライブラリの動詞 mutate は、新しい変数を作成する場合に便利です。 NA なしで新しい変数を作成できるように、必ずしも元の列を変更する必要はありません。 mutate は使いやすく、変数名を選択し、この変数の作成方法を定義するだけです。 完全なコードは次のとおりです

# Create a new variable with the mean and median
df_titanic_replace <- df_titanic %>%
   mutate(replace_mean_age  = ifelse(is.na(age), average_missing[1], age),
   replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))

コードの説明:

次のように、replace_mean_age と replace_mean_fare という XNUMX つの変数を作成します。

  • replace_mean_age = ifelse(is.na(年齢), 平均欠損[1], 年齢)
  • replace_mean_fare = ifelse(is.na(運賃), Average_missing[2],fare)

列 age に欠損値がある場合は、average_missing (年齢の平均) の最初の要素で置き換えます。それ以外の場合は、元の値を保持します。 運賃についても同じロジック

sum(is.na(df_titanic_replace$age))

出力:

## [1] 263

交換を実行します

sum(is.na(df_titanic_replace$replace_mean_age))

出力:

## [1] 0

元の列 age には 263 個の欠損値がありますが、新しく作成された変数はそれらを変数 age の平均値に置き換えます。

ステップ4) 欠落している観測値を中央値に置き換えることもできます。

median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      median,
      na.rm =  TRUE)
df_titanic_replace <- df_titanic %>%
            mutate(replace_median_age  = ifelse(is.na(age), median_missing[1], age), 
            replace_median_fare = ifelse(is.na(fare), median_missing[2], fare))
head(df_titanic_replace)

出力:

欠損データを平均値と中央値で補う

ステップ5) 大きなデータ セットには欠損値が多数含まれる可能性があり、上記の方法は面倒になる可能性があります。 sapply() メソッドを使用すると、上記のすべての手順を XNUMX 行のコードで実行できます。 ただし、平均値と中央値の値はわかりません。

sapply は作成しません データフレームしたがって、sapply() 関数を data.frame() 内にラップしてデータ フレーム オブジェクトを作成できます。

# Quick code to replace missing values with the mean
df_titanic_impute_mean < -data.frame(
    sapply(
        df_titanic,
        function(x) ifelse(is.na(x),
            mean(x, na.rm = TRUE),
            x)))

まとめ

欠損値に対処する方法は XNUMX つあります。

  • 欠落している観測値をすべて除外する
  • 平均値を代入する
  • 中央値を代入する

次の表は、欠落している観測値をすべて削除する方法をまとめたものである。

図書室へようこそ DevOps Tools Engineer試験のObjective Code
ベース 欠落している観測値をリストする
colnames(df)[apply(df, 2, anyNA)]
dplyr すべての欠損値を削除します
na.omit(df)

平均値または中央値による代入は XNUMX つの方法で実行できます

  • 適用の使用
  • 適用の使用
方法 詳細 Advantages デメリット
適用によるステップバイステップ 欠損のある列をチェックし、平均/中央値を計算し、値を保存し、mutate() で置換します。 平均値/中央値の値を知っている 実行時間が長くなります。 大きなデータセットでは遅くなる可能性がある
sapplyを使った簡単な方法 sapply() と data.frame() を使用して、欠損値を自動的に検索し、平均/中央値で置き換えます 短いコードと高速な 代入値がわからない