重回帰分析をやってみた感想

 

初めに


初投稿なので、書き方が下手くそなのはご容赦ください。

最近、機械学習の実装にはまりつつある駆け出しのデータ分析に従事するものなのですが

なかなか実務で使わないこともあり、本だけ読んだりしても学びになりきらないことが多いこの頃です。

そろそろ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)」

こんなエラーが出てました。

色々と調べてみた結果、以下の解決記事にたどり着きました。

stats.stackexchange.com

読み解いてみると、どうやら説明変数間の相関が強いことにより出るエラーっぽいです。
色々なことやってきましたが、初めて出ました。
ということなので、せっせと相関が強い説明変数を外していこうと思います、とほほ・・・


こういう場合皆さんこの後の流れはどうやられてるんですかね。
一応私は、説明変数間の相関を定性分析という形で見て、削っていこうと思ってます。
また、その結果一番高い組み合わせのモデルの精度を考えていこうと思ってます。


結構マルチコ(多重共線性のこと。以下、リンク詳細)の問題って難しい問題だと思っていて、
理論ではある程度分かってはいるもののこれをビジネス上で解決しようと思うと結構分析官の主観に基づいて意思決定されることが多いいのかなと思っています。


webbeginner.hatenablog.com



本来であればこのようなエラーは出ないのがほとんどだと思っていて、
VIF値とかを見ながら自分で多重共線性の可能性を探っていくものだと思っていたので
今回このようなエラーが出たのは一つ知識としてなりました。
今後も重回帰分析を多用していくと思うので、ここら辺はマスターしていきたいと思っています。


また、この結果が出たら出来る範囲でお話しできたらと思います~。



傾奇者の修業は続く・・・・