1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rでデータ分析] 因子を含んだ説明変数で回帰

Last updated at Posted at 2020-05-31

回帰分析をする機会は結構あるが、アウトカム(目的変数)の出力値が何なのかについて使い分けるのはもちろん重要だが、今回はそっちではなく、説明変数の値にアンケート項目の回答などのように数値として扱えないときにどう分析するのかを。

解析データの読込み
score <- c(49,37,56,40,46,65,40,15,92,58)
evalfac <- c("B","C","B","C","C","A","B","D","A","A")

のような仮想データでやってみる。
scoreはある試験(100点満点)の得点として、evalfacは試験後の自己評価としてみる。Aであると自己評価が高く、そこから順に評価が低くなるとする。このとき、自己評価と試験の得点の関係性をモデル化したい。
このとき説明変数evalfacは数値データではなく評価項目となっている。こういう場合には各評価項目に対するダミー変数(該当するものに1を対応させて該当しない場合には0とする変数)を作る必要がある。
ちなみに上のコードの<-はRでの代入演算子で他の言語だと=を使う事が多いと思う。次のコードでわかるようにRはどちらでも大丈夫だが。

B項目ダミーの作り方例
Bdam <- numeric() # numeric()で数字の入る空の箱を用意
for(i in 1:length(evalfac)){ # 1:length(evalfac)でfor文の範囲を指定
  if(evalfac[i] == "B"){
    Bdam[i] = 1 # 評価項目がBなら1を
  }else{
    Bdam[i] = 0 # 評価項目がBでないなら0を
  }
}

仮に上のコードで作ったダミー変数を「Bダミー」と呼ぶと、これを他の項目に対しても作成していくがその際には合計4項目なので3つのダミーを作ればよい。なぜか?
以下の表で説明する。

評価項目 Bダミー Cダミー Dダミー
A 0 0 0
B 1 0 0
C 0 1 0
D 0 0 1
のように、ダミー変数は3つ作れば他の一つは自動的に表現されることになる。この結果作成した3つのダミー変数を「Bdam」「Cdam」「Ddam」とすると、線形回帰モデルを作成するコードは
ダミー変数を用いた線形回帰モデル
result <- lm(score ~ Bdam + Cdam + Ddam)

として実行できる。lmは「linear model(線形モデル)」の略だと思う。
結果を確認する際には

summary(result)

のようにすれば結果を確認できる。
とまぁ、しっかりやればこうなるが、Rにはこういうときのための便利な機能がある。実はダミーを作成しないでも以下のように実行すればいい。

ダミー変数を用いた線形回帰モデル(ver.R)
result <- lm(score ~ evalfac)

え?
そうなの。ダミー変数作らなくても自動的に作成してくれるのよ。Rは。
まぁ、これやってくれる関数は限られているから両方出来るようにね。少なくともlmは大丈夫。

とはいえ、今の場合は自己評価項目がアルファベットだったからよかったけど、これを数字で答えさせる状況もあるよね。よかったら4、よくなかったら1みたいな感じで。それが次のデータ。

評価項目(数字版)
score <- c(49,37,56,40,46,65,40,15,92,58)
evalnum <- c(3,2,3,2,2,4,3,1,4,4)

この場合はどうだろうか?

ダメな解析
result <- lm(score ~ evalnum)

とするとこれはダメ。さっきダミー作ったのと同じ結果にならなきゃダメなのに違う結果になったよね?これは本当は数字じゃないのに、Rさんは数字に見えるから自己評価の1~4を数字だと認識しているの。でもこの1と2の差と2と3の差って同じ?というとおそらく違うよね。なのでこういう場合は数字に見えるけど数字じゃないんだよ!ってRさんに教えてあげればいい。
やり方は簡単でデータを読み込んだ後に

正しい解析
evalnum <- as.factor(evalnum)
result <- lm(score ~ evalnum)

とすればいい。as.factorでこれは「これは因子(factor)なんだよ!」って教えているのです。これさえクリアすればあとはさっきの話からこれで解析は問題ないことがわかるね。
これは因子以外にもas.numeric()(数値)、as.character()(文字列)、as.matrix()(行列)などもある。
扱ってる変数がこれだよってコンピュータに教えてあげるのはとても重要なんだね。こういうのを変数の型といってどの言語を使っても意識することではあります。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?