R の欠損値 (NA) を置換する方法: na.omit と na.rm
データ サイエンスにおける欠損値は、観測値がデータ フレームの列で欠落している場合、または数値の代わりに文字値が含まれている場合に発生します。 データから正しい結論を引き出すには、欠損値を削除するか置き換える必要があります。
このチュートリアルでは、dplyr ライブラリを使用して欠損値を処理する方法を学習します。dplyr ライブラリは、データ分析を実現するためのエコシステムの一部です。
このチュートリアルでは、
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() を使用して、欠損値を自動的に検索し、平均/中央値で置き換えます | 短いコードと高速な | 代入値がわからない |