重回帰分析をやってみた感想
初めに
初投稿なので、書き方が下手くそなのはご容赦ください。
最近、機械学習の実装にはまりつつある駆け出しのデータ分析に従事するものなのですが
なかなか実務で使わないこともあり、本だけ読んだりしても学びになりきらないことが多いこの頃です。
そろそろkaggleにチャレンジしようか考えてはいるものの、その前に英語の壁が・・・
諦めて英語をちゃんと学ぼうと思っているそんな日常を送っております。
今回のお題
社内の満足度調査におけるデータ分析をしている中で重回帰分析をやってみたので
その際に思ったことをつらつら書いてきたいと思います。
今回重回帰分析を行った目的としては、影響を与えている説明変数がどれなのかを知りたくて
やってみました。
説明変数が100オーバーあるのでこのままだと表現するのが難しいと思ったためです。
今回の分析の流れ
①データ読み込み
#CSVデータ読み込み >raw <-read.table("mid.csv", sep=",", skip=0, header=T)
②データ型確認
モデル構築や、その前の前処理等々を行う上で、毎回データ型は確認するようにしています。
#変数型確認 >str(raw) data.frame': 67 obs. of 86 variables: $ col3 : int 4 5 3 4 3 5 3 5 5 4 ... $ col4 : int 4 4 3 4 3 5 4 5 5 2 ... $ col5 : int 4 4 4 4 2 4 4 1 5 5 ... $ col6 : int 4 5 4 4 2 5 4 1 5 4 ... $ col7 : int 5 5 4 4 4 4 2 1 5 5 ... $ col8 : int 5 5 4 4 3 3 2 1 5 4 ... $ col9 : int 2 5 4 4 3 4 3 1 5 4 ... $ col10: int 4 4 2 4 2 4 3 1 5 5 ... $ col11: int 4 5 2 4 4 3 2 3 5 4 ... $ col12: int 5 5 4 4 4 5 4 1 5 5 ... $ col13: int 4 4 3 4 3 4 3 1 5 4 ... $ col14: int 5 5 3 5 2 4 3 4 5 5 ... $ col15: int 2 2 3 4 3 3 4 1 4 4 ... $ col16: int 4 5 3 4 2 5 4 1 5 5 ... $ col17: int 5 5 1 4 5 5 5 5 5 5 ... $ col18: int 5 5 3 4 5 3 4 3 4 5 ... $ col19: int 5 4 3 4 2 4 4 3 5 5 ... $ col20: int 2 1 3 2 3 4 2 1 5 4 ... $ col21: int 5 4 2 4 3 5 4 1 5 5 ... $ col22: int 3 2 2 2 3 4 2 1 5 5 ... $ col23: int 4 4 1 4 2 4 5 4 5 5 ... $ col24: int 5 4 4 3 1 4 4 5 5 5 ... $ col25: int 5 4 4 2 2 5 4 5 5 5 ... $ col26: int 5 4 4 4 4 5 5 5 5 5 ... $ col27: int 5 5 4 3 1 4 4 5 5 4 ... $ col28: int 5 5 4 4 3 5 4 5 5 4 ... $ col29: int 5 5 4 3 1 3 3 2 3 3 ... $ col30: int 5 5 4 3 1 4 5 1 5 4 ... $ col31: int 5 5 4 4 4 5 4 5 5 5 ... $ col32: int 5 5 4 4 3 5 5 5 5 4 ... $ col33: int 5 5 4 4 2 5 5 5 5 4 ... $ col34: int 5 5 4 3 2 4 3 5 5 4 ... $ col35: int 5 5 4 4 3 5 3 5 5 4 ... $ col36: int 2 2 3 4 5 5 4 5 5 5 ... $ col37: int 2 1 1 2 3 3 5 1 3 4 ... $ col38: int 4 4 1 4 3 4 3 5 5 5 ... $ col39: int 2 2 1 2 2 3 1 1 3 3 ... $ col40: int 3 2 3 3 2 2 1 1 3 4 ... $ col41: int 2 1 3 3 1 2 1 5 1 3 ... $ col42: int 5 2 3 5 4 3 3 5 5 5 ... $ col43: int 3 2 3 3 2 4 3 5 1 4 ... $ col44: int 4 4 1 2 2 3 3 1 3 5 ... $ col45: int 4 2 1 4 4 4 5 3 4 5 ... $ col46: int 2 1 1 3 1 4 2 1 1 4 ... $ col47: int 3 4 1 4 4 2 4 1 3 5 ... $ col48: int 5 5 1 4 4 4 4 1 3 4 ... $ col49: int 4 4 1 4 2 4 4 3 5 4 ... $ col50: int 3 4 1 3 4 4 4 5 2 5 ... $ col51: int 3 1 1 3 1 4 3 3 3 5 ... $ col52: int 4 5 1 4 3 4 1 2 5 4 ... $ col53: int 4 5 1 4 2 5 3 5 5 5 ... $ col54: int 2 2 1 3 3 5 2 5 5 4 ... $ col55: int 3 2 1 3 2 3 3 1 5 4 ... $ col56: int 4 1 3 3 1 2 1 1 5 3 ... $ col57: int 4 1 3 3 3 4 1 1 5 4 ... $ col58: int 5 4 4 4 3 5 2 3 2 4 ... $ col59: int 5 5 4 4 4 5 1 5 5 5 ... $ col60: int 4 4 2 4 2 5 4 3 5 4 ... $ col61: int 3 5 2 4 1 4 5 5 5 3 ... $ col62: int 1 1 3 3 2 1 1 1 1 3 ... $ col63: int 5 4 1 4 2 3 1 1 5 5 ... $ col64: int 5 2 3 3 3 3 3 3 3 5 ... $ col65: int 3 4 1 3 3 3 5 1 2 4 ... $ col66: int 3 4 2 3 3 2 3 3 3 4 ... $ col67: int 2 2 3 3 4 4 3 1 5 4 ... $ col68: int 4 2 3 3 2 4 3 1 3 4 ... $ col69: int 4 2 3 3 4 4 3 1 3 4 ... $ col70: int 5 4 1 4 4 4 3 3 5 5 ... $ col71: int 4 4 2 4 2 4 3 3 3 5 ... $ col72: int 4 4 3 4 4 4 5 3 5 5 ... $ col73: int 4 2 1 3 4 4 3 2 5 5 ... $ col74: int 4 4 1 4 4 4 3 5 5 5 ... $ col75: int 4 4 4 3 4 3 3 1 5 5 ... $ col76: int 2 4 3 4 3 4 3 1 3 5 ... $ col77: int 4 2 3 3 1 3 5 3 4 5 ... $ col78: int 1 1 3 1 1 1 2 2 1 1 ... $ col79: int 3 3 1 3 3 3 4 1 3 3 ... $ col80: int 4 5 3 4 1 4 3 1 5 5 ... $ col81: int 2 2 1 4 2 2 3 1 2 5 ... $ col82: int 4 5 3 4 4 2 4 2 2 5 ... $ col83: int 3 4 3 3 2 3 2 1 3 5 ... $ col84: int 3 4 1 3 2 2 1 2 3 5 ... $ col85: int 5 5 1 4 4 5 3 3 5 5 ... $ col86: int 5 5 1 4 3 4 5 1 4 5 ... $ col87: num 95 90 50 80 65 65 100 50 75 99 ... $ col88: int 5 5 1 4 2 4 5 4 5 5 ...
③相関係数算出
#目的変数だけ削除(説明変数間の相関を知りたいため) >raw$col87 <- NULL #相関係数算出(今回すべてカテゴリカルデータなのでスピアマンを選択) >cor(raw, method="s") #上位100個だけ表示 var1 var2 相関係数 col86 col85 0.839680573 col57 col56 0.833263361 col80 col10 0.80771083 col33 col32 0.783367001 col88 col60 0.76990517 col88 col23 0.769412805 col35 col28 0.732420905 col60 col23 0.722527101 col28 col27 0.721938157 col69 col68 0.717220106 col44 col19 0.716338064 col40 col39 0.711849849 col26 col25 0.704318995 col19 col13 0.703527606 col77 col23 0.701144923 col33 col26 0.700488152 col35 col33 0.700301945 col38 col23 0.697158019 col84 col83 0.696358591 col51 col46 0.690544937 col11 col7 0.685979872 col86 col23 0.684983949 col28 col26 0.684860782 col43 col41 0.684228214 col35 col34 0.679980141 col85 col23 0.678404372 col28 col25 0.676722951 col86 col88 0.673168273 col34 col28 0.6655166 col50 col48 0.663774834 col32 col26 0.65840195 col76 col48 0.655878385 col34 col33 0.65259469 col48 col45 0.650525832 col35 col32 0.647262669 col76 col71 0.64121364 col77 col75 0.640823515 col30 col13 0.638062012 col10 col7 0.634665477 col48 col23 0.634524189 col60 col52 0.63382728 col60 col48 0.633726987 col77 col51 0.631853274 col88 col85 0.631246945 col13 col12 0.62957851 col8 col7 0.629533971 col86 col44 0.627085566 col76 col45 0.626751154 col53 col52 0.625406834 col77 col71 0.624227193 col71 col23 0.623029445 col76 col50 0.621601661 col10 col5 0.621555655 col35 col31 0.621088094 col30 col29 0.621036428 col6 col5 0.619796478 col52 col48 0.618194467 col34 col32 0.618189026 col19 col14 0.616934941 col11 col8 0.615898497 col77 col76 0.614846786 col80 col22 0.614353565 col60 col53 0.611961339 col32 col25 0.611174771 col27 col12 0.608684679 col32 col30 0.60766982 col88 col38 0.607342046 col28 col12 0.606922027 col50 col45 0.606417828 col22 col20 0.606157202 col77 col45 0.606145753 col72 col38 0.603307992 col28 col13 0.603239561 col80 col12 0.603212453 col35 col25 0.602872863 col86 col19 0.60254579 col30 col25 0.602475514 col86 col12 0.602145245 col60 col55 0.601338223 col32 col28 0.59948099 col85 col38 0.597622095 col48 col47 0.597011258 col86 col80 0.595569495 col83 col80 0.595435686 col30 col16 0.594567926 col74 col23 0.594228736 col9 col5 0.594121285 col14 col13 0.593352369 col77 col60 0.590792606 col33 col30 0.590053764 col86 col82 0.58987068 col77 col69 0.589825241 col16 col14 0.589578792 col23 col19 0.586099454 col34 col30 0.585682769 col88 col77 0.585088422 col27 col25 0.584962782 col50 col23 0.581675317 col44 col13 0.581587025
④重回帰にかける
#全ての変数を標準化 >lm_data$z1<-(lm_data$col3-mean(lm_data$col3))/sd(lm_data$col3) #重回帰分析をかけてみた >summary(lm( col87 ~ . , lm_data )) Call: lm(formula = col87 ~ ., data = lm_data) Residuals: ALL 67 residuals are 0: no residual degrees of freedom! Coefficients: (19 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) 47.981 NA NA NA z1 13.178 NA NA NA z2 28.898 NA NA NA z3 16.946 NA NA NA z4 24.980 NA NA NA z5 -38.788 NA NA NA z6 -13.948 NA NA NA z7 -10.864 NA NA NA z8 24.261 NA NA NA z9 -57.778 NA NA NA z10 19.212 NA NA NA z11 13.774 NA NA NA z12 24.831 NA NA NA z13 -28.720 NA NA NA z14 -7.831 NA NA NA z15 15.910 NA NA NA z16 4.889 NA NA NA z17 -4.727 NA NA NA z18 -29.249 NA NA NA z19 -21.361 NA NA NA z20 24.183 NA NA NA z21 57.694 NA NA NA z22 -41.417 NA NA NA z23 -3.885 NA NA NA z24 -2.771 NA NA NA z25 38.135 NA NA NA z26 6.904 NA NA NA z27 2.798 NA NA NA z28 -19.399 NA NA NA z29 0.161 NA NA NA z30 -60.951 NA NA NA z31 13.257 NA NA NA z32 15.902 NA NA NA z33 19.086 NA NA NA z34 2.294 NA NA NA z35 10.647 NA NA NA z36 -8.412 NA NA NA z37 4.487 NA NA NA z38 25.297 NA NA NA z39 -49.436 NA NA NA z40 12.038 NA NA NA z41 -9.866 NA NA NA z42 -53.166 NA NA NA z43 -2.123 NA NA NA z44 9.790 NA NA NA z45 16.601 NA NA NA z46 34.261 NA NA NA z47 -18.339 NA NA NA z48 5.316 NA NA NA z49 -15.007 NA NA NA z50 -4.955 NA NA NA z51 -5.740 NA NA NA z52 14.021 NA NA NA z53 -7.792 NA NA NA z54 -6.165 NA NA NA z55 -1.722 NA NA NA z56 22.000 NA NA NA z57 1.849 NA NA NA z58 -5.152 NA NA NA z59 -31.258 NA NA NA z60 16.960 NA NA NA z61 2.908 NA NA NA z62 -6.269 NA NA NA z63 -37.403 NA NA NA z64 12.321 NA NA NA z65 -8.842 NA NA NA z66 12.431 NA NA NA z67 NA NA NA NA z68 NA NA NA NA z69 NA NA NA NA z70 NA NA NA NA z71 NA NA NA NA z72 NA NA NA NA z73 NA NA NA NA z74 NA NA NA NA z75 NA NA NA NA z76 NA NA NA NA z77 NA NA NA NA z78 NA NA NA NA z79 NA NA NA NA z80 NA NA NA NA z81 NA NA NA NA z82 NA NA NA NA z83 NA NA NA NA z84 NA NA NA NA z86 NA NA NA NA Residual standard error: NaN on 0 degrees of freedom Multiple R-squared: 1, Adjusted R-squared: NaN F-statistic: NaN on 66 and 0 DF, p-value: NA
何かおかしいぞ。
出るはずの値が出てこない・・・
「Coefficients: (19 not defined because of singularities)」
こんなエラーが出てました。
色々と調べてみた結果、以下の解決記事にたどり着きました。
読み解いてみると、どうやら説明変数間の相関が強いことにより出るエラーっぽいです。
色々なことやってきましたが、初めて出ました。
ということなので、せっせと相関が強い説明変数を外していこうと思います、とほほ・・・
こういう場合皆さんこの後の流れはどうやられてるんですかね。
一応私は、説明変数間の相関を定性分析という形で見て、削っていこうと思ってます。
また、その結果一番高い組み合わせのモデルの精度を考えていこうと思ってます。
結構マルチコ(多重共線性のこと。以下、リンク詳細)の問題って難しい問題だと思っていて、
理論ではある程度分かってはいるもののこれをビジネス上で解決しようと思うと結構分析官の主観に基づいて意思決定されることが多いいのかなと思っています。
本来であればこのようなエラーは出ないのがほとんどだと思っていて、
VIF値とかを見ながら自分で多重共線性の可能性を探っていくものだと思っていたので
今回このようなエラーが出たのは一つ知識としてなりました。
今後も重回帰分析を多用していくと思うので、ここら辺はマスターしていきたいと思っています。
また、この結果が出たら出来る範囲でお話しできたらと思います~。
傾奇者の修業は続く・・・・