Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@nizu708

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

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

解析データの読込み
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
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
nizu708
統計学と機械学習が専門。何冊か本も書いてます。使用言語はR、C++がメイン。最近はパッケージ使ってRで機械学習頑張ってたが、いよいよ必要に迫られPythonを始めました。PythonはAnacondaで使ってたが使い勝手の悪さから今はVSCodeメインです。可愛がっている子達からの質問への回答記事が多いです。ご容赦ください。スパース推定(特にlasso)が好き。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?