🐈
【アンケート分析】Rで簡単に複数回答列をワンホットエンコーディング(OHE)するコードを全て公開します【R, データ分析】
はじめに
アンケートデータの処理では、以下のような複数回答可能な列(例: カンマ区切りで複数の値が含まれる列)を分解し, ワンホットエンコーディング(OHE)する場合がよくあります。
ID | 理由1 | 理由2 |
---|---|---|
1 | A,B | X |
2 | A | X, Y |
ID | 理由1_A | 理由1_B | 理由2_X | 理由2_Y |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
2 | 1 | 0 | 1 | 1 |
単一回答列のOHEを行うライブラリは多数存在しますが(fastDummies
, model.matrix
, caret
, mltools
)、しかし、上記の表のような複数回答列に対するライブラリはなかなか使いやすいものが見当たらないのが悩みでした。
もちろん現時点で存在するライブラリやデータ処理を組み合わせれば簡単に関数は作れるのですが、毎回この関数を作るのも面倒なので、今回は弊社が作成した複数回答列を簡単にOHEする関数のコードを全て公開します。
また, この関数をさらに便利に使えるようにGitHubで公開されたライブラリとしても提供しおります。すぐに実装したい方は以下のリンクをご覧ください。
GitHubリポジトリはこちら
GitHubでの使い方
今回紹介した関数はGitHub上でライブラリとして公開しており, 以下の手順で簡単にインストールして使用することができます。
1. インストール
GitHubから直接インストールできます。
# devtoolsパッケージが必要です
install.packages("devtools")
devtools::install_github("TakashiNotomi/easySurvey")
2. 使用例
インストール後, 以下のように利用できます。
library(easySurvey)
# サンプルデータ
library(tibble)
data <- tibble(
ID = 1:5,
理由1 = c("A,B", "A", "B,C", "C", "A,B,C"),
理由2 = c("X,Y", "X", "Y", "X,Y,Z", "Z")
)
# ワンホットエンコーディング
encoded_data <- ohe_multi_multiple(data, c("理由1", "理由2"))
print(encoded_data)
関数の紹介
サンプルデータ
先ほど上記で少し使用しましたが, 以下のようなアンケートデータがあると仮定します。このデータには複数回答可能な列(理由1
や理由2
)が含まれています。
# サンプルデータ
library(tidyverse)
data <- tibble(
ID = 1:5,
理由1 = c("A,B", "A", "B,C", "C", "A,B,C"),
理由2 = c("X,Y", "X", "Y", "X,Y,Z", "Z")
)
data
結果:
ID | 理由1 | 理由2 |
---|---|---|
1 | A,B | X,Y |
2 | A | X |
3 | B,C | Y |
4 | C | X,Y,Z |
5 | A,B,C | Z |
ワンホットエンコーディング(OHE)の関数
以下の関数を使用することで, 複数回答列を簡単にワンホットエンコーディングできます。
# ワンホットエンコーディング用の関数
ohe_multi_simple <- function(data, column_name) {
# 対象列のユニークな値を取得
unique_values <- data[[column_name]] |>
str_split(",\\s*|,\\s*") |> # カンマまたは全角カンマ区切りを分割
unlist() |>
unique()
# ワンホットエンコーディングを作成
ohe_df <- as.data.frame(
map(unique_values, ~ as.integer(str_detect(data[[column_name]], .x)))
) |>
# 列名を「列名_ユニーク値」の形式に変更
setNames(paste0(column_name, "_", unique_values))
# 元のデータにバインドして返す
bind_cols(data, ohe_df)
}
# 一括適用用関数
ohe_multi_multiple <- function(data, columns) {
reduce(columns, function(df, col) ohe_multi_simple(df, col), .init = data)
}
-
ohe_multi_simple
:- 指定した列を分解し, ユニークな値ごとにOHEを実行する
- 列名は自動的に「元の列名_ユニークな値」の形式になる
-
ohe_multi_multiple
:- 複数列に対して,
ohe_multi_simple
を一括で適用する
- 複数列に対して,
実際に適用してみる
以下のコードで, 理由1
と理由2
にOHEを適用します。
# ワンホットエンコーディングの実行
encoded_data <- ohe_multi_multiple(data, c("理由1", "理由2"))
encoded_data
すると以下のような出力が得られます。
ID | 理由1 | 理由2 | 理由1_A | 理由1_B | 理由1_C | 理由2_X | 理由2_Y | 理由2_Z |
---|---|---|---|---|---|---|---|---|
1 | A,B | X,Y | 1 | 1 | 0 | 1 | 1 | 0 |
2 | A | X | 1 | 0 | 0 | 1 | 0 | 0 |
3 | B,C | Y | 0 | 1 | 1 | 0 | 1 | 0 |
4 | C | X,Y,Z | 0 | 0 | 1 | 1 | 1 | 1 |
5 | A,B,C | Z | 1 | 1 | 1 | 0 | 0 | 1 |
まとめ
今回の関数を使えば, 複数回答可能な列に対するOHEを効率的に行うことができます。また一括適用の関数を使用することで, 複数列の処理も簡単に実現できます。
Discussion