R でダミー変数を作成して解釈する
この記事では、R で fastDummies
パッケージの dummy_cols()
関数を使用してダミー変数を作成する方法を説明します。ダミー変数とダミー列という言葉は同じ意味で使用されます。
R に fastDummys
パッケージをインストールする
fastDummies
パッケージをインストールしてロードする必要があります。
コード例:
# Install the fastDummies package.
install.packages("fastDummies")
# Load the fastDummies package.
library(fastDummies)
ここで、カテゴリ変数を含む小さなデータ フレームを作成します。
コード例:
# Vectors.
cv = c("Bd", "Ba", "F", NA, "F", "F", "Ba")
nv = seq(1:7)
# Data Frame
orig_datf = data.frame(Num_V = nv,Cat_V=as.factor(cv))
# View the data frame.
orig_datf
str(orig_datf)
出力:
> str(orig_datf)
'data.frame': 7 obs. of 2 variables:
$ Num_V: int 1 2 3 4 5 6 7
$ Cat_V: Factor w/ 3 levels "Ba","Bd","F": 2 1 3 NA 3 3 1
表示されているように、データ フレームには 3 因子レベルのカテゴリ変数があります。
R は、アルファベット順に基づいて因子レベルを割り当てます。 この詳細は、ダミー変数を作成するときに重要です。
dummy_cols()
関数を使用して R でダミー列を作成する
ダミー変数を作成する列を指定しない場合、関数はすべての因子または文字型の列からダミー列を作成します。
コード例:
new_datf_default_all = dummy_cols(orig_datf)
new_datf_default_all
names(new_datf_default_all)
出力:
> names(new_datf_default_all)
[1] "Num_V" "Cat_V" "Cat_V_Ba" "Cat_V_Bd" "Cat_V_F" "Cat_V_NA"
列のリストで次のことを確認します。
- カテゴリ変数には 3つのカテゴリがあったため、3つの新しい列が表示されます。
- categorical 列には欠損値 (NA) があったため、値 1 の NA を示す 1つの列もあります。他のすべてのダミー列には NA がありますが、元の列には NA がありました。
R で選択した列からダミー変数を作成する
選択した列のみからダミー変数を作成するには、select_columns
引数を使用できます。 単一の列名を文字列として、複数の列をベクトルとして渡すことができます。
コード例:
# Pass a single column.
new_datf_select_cols = dummy_cols(orig_datf, select_columns = "Cat_V")
# Pass multiple columns using a vector.
new_datf_select_cols = dummy_cols(orig_datf, select_columns = c("Cat_V"))
R で多重共線性を回避するために 1つの列を削除する
因子列のすべてのレベルを使用してダミー変数を作成すると、新しい列は線形従属になります。 つまり、各行について、他のすべての列の値が与えられれば、最後の列の値を予測できます。
これは、統計分析 (線形回帰など) の結果に影響します。 したがって、ダミー変数を作成する元の列ごとに、ダミー列の 1つを削除する必要があります。
dummy_cols()
関数は 2つのオプションを提供します。 remove_first_dummy = TRUE
または remove_most_frequent_dummy = TRUE
のいずれかに設定できます。
次のコードは、両方のオプションを調べます。
コード例:
# Remove first.
new_datf_remove_first = dummy_cols(orig_datf, remove_first_dummy = TRUE)
# After removing first.
names(new_datf_remove_first)
# Remove most frequent.
new_datf_remove_most_frequent = dummy_cols(orig_datf, remove_most_frequent_dummy = TRUE)
# After removing most frequent
names(new_datf_remove_most_frequent)
出力:
> # After removing first.
> names(new_datf_remove_first)
[1] "Num_V" "Cat_V" "Cat_V_Bd" "Cat_V_F" "Cat_V_NA"
> # After removing most frequent
> names(new_datf_remove_most_frequent)
[1] "Num_V" "Cat_V" "Cat_V_Ba" "Cat_V_Bd"
2つのコマンドの出力で、次の点に注意してください。
-
引数
remove_first_dummy = TRUE
は、因子の最初のレベルに対応する列を削除しました。 -
引数
remove_most_frequent_dummy = TRUE
は、元の列で最も頻繁に出現するレベルに対応する列を削除しました。ただし、NA がどこにあるかを示す列を削除する効果もありました。
ignore_na = FALSE
を設定しても、出力には影響しませんでした。
NA 列を保持し、最も頻度の高い因子を削除する場合は、次の回避策を使用できます。
- まず、
relevel()
関数を使用して因子列をrelevel
します。 最も頻度の高い値を第 1 レベルにします。 - 次に、
remove_first_dummy = TRUE
を使用します。
コード例:
releveled_datf = orig_datf
# Relevel the desired column manually.
releveled_datf$Cat_V = relevel(releveled_datf$Cat_V, ref = "F")
# View the new levels.
levels(releveled_datf$Cat_V)
# NOW, remove first.
releveled_datf_remove_first = dummy_cols(releveled_datf, remove_first_dummy = TRUE)
# After removing first.
names(releveled_datf_remove_first)
出力:
> levels(releveled_datf$Cat_V)
[1] "F" "Ba" "Bd"
> # After removing first.
> names(releveled_datf_remove_first)
[1] "Num_V" "Cat_V" "Cat_V_Ba" "Cat_V_Bd" "Cat_V_NA"
ダミー変数の解釈
線形回帰の設定では、切片係数には、元の列のベース レベル (または削除されたレベル) の効果が含まれていると言われています。 ダミー列を作成したときに 1つの列を削除したことを思い出してください。
削除された係数は、同じ元の列から作成されたすべてのダミー列の値が 0 であると解釈されます。 したがって、その効果は切片に含まれます。
各ダミー列の係数は、基準水準と比較したその因子水準によって生じる差に対応します。 これは、この係数の値に応じて、ベースラインと比較して正または負の効果になる可能性があります。
この解釈のため、最も頻度の高い要因に対応する列を削除すると便利です。