wevoxのサーベイデータを機械学習的な手段で分析してみた

どうも、Atraeのデータサイエンティスト杉山です。

今日は軽めに、機械学習をやってみましたというお話です。
<strike>と言っても、ほとんど回帰分析ですが。。。</strike>


## やりたいこと
非説明変数 $y$ があり、説明変数 $\boldsymbol{x} = {}^t (x_1, x_2, \dots , x_n)$ がありました。
で、 $x_j$ たちは、頑張ると操作できる値です。
で、 $y$ は増やしたいもの。

しかし、リソースは有限なので、全ての $x_j$ たちを上げに行くことは出来ません。
じゃあ結局、どの $x_j$ を増やせばいいの〜？というのを分析から出したいというお話です。

（ビジネスでデータ分析やってたら無限に生じる課題ではないでしょうか。）

## やったこと
- 相関係数の計算
- LASSOによる回帰分析
- stepwise Ridge regression

## 今回のデータセット
今回はwevoxの質問項目とwork engagementについて行いました。
（へーしゃの人々の回答データです。）
簡単に言うと、

work engagement：前のめりに仕事できている状態
（ソシャゲとか、誰にも言われていないのに本気で全力で調べてやっちゃいますよね。それっす。それ。）
wevoxの質問項目:仕事に関係する各質問。「仕事仲間との関係」とか、「職務内容への満足度」とか、それについて1〜7点で答えるというアンケートを取っております。それが質問項目数×対象人数分のデータがあります。

work engagementを高めたい！
となったときに、じゃあ何に改善を走らせるかを決めないと動けないですよね。（質問項目自体は40くらいあるので、、、）
「仕事仲間との関係」を改善しに行くのと「職務内容への満足度」を改善しに行くのとではやるべきこと全然違いますし。
というわけで、どれを改善すればwork engagementが改善するんや！というのを分析からも出せるのが理想なのです。

## SEMやれよ
ごめんなさいSEMはなう勉強中なので今日は無しでm(__)m

※ちなみに、SEMはSearch Engine Marketingではなく、Structural Equation Modellingです。僕、根がマーケターなので、、、。誤解なきよう！

## 相関係数の計算
相関高いってことは因果もあるやろ（ヘラヘラ
的なお気持ちで、とりあえず、どういう序列になるか見てみるということをやりました。

一定のしきい値を設け、それ以上なら影響大ということにして、見てみました。

<img width="384" alt="スクリーンショット 2017-12-23 14.32.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/4fab1e82-96b9-628f-f16e-5467db60b7bc.png">

相関係数のhistgramを書いたのですが。。。
相関高すぎワロタｗ
使えないので、別の手法を選びましょう。

※work engagementに対して、各質問項目とwork engagementの相関は、項目反応理論（テストの性能を測る理論）で信頼性係数と呼ばれるもので、これが高いことそれ自身はいいことではあります。

## 重回帰しようぜ！
重回帰分析をすることは物理的には可能なのですが、さっき見たことからも察せられると思いますが互いにベッタベタに相関しています。
多重共線性の祭り！
正しい結果が得られるとは到底思えません。
何らかの方法で、多重共線性の作用を殺す必要がありました。
てなかんじで、LASSOとstepwise Ridge regresionをやりましたのです。

## LASSOしようぜ！
LASSOとは、つまり、パラメタに $L^1$-罰則項がついたエラー関数を最小化する重回帰分析です。
数式はこちら→[LASSO, Ridge regression, erastic netをRで実行 - Qiita](https://qiita.com/sugiyama34/items/2512e7a1edce277fa93f)

これをやると、説明変数に対する説明力が弱い変数の係数がバサっと0になります。
それが、LASSOというか、 $L^1$-罰則項のいいところなのです。

実際に、sklearn.linear_model.LASSOとか使ってやってみると、アウトプットはこんな感じ。

```
[0.0,
 0.03977252132398991,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.3044550458818364,
 0.016853261857383565,
 0.028215416697807635,
 0.0,
 0.2565481083035009,
 0.0,
 0.14506862490839317,
 0.053860705604508924,
 0.0,
 0.1018111943701152,
 0.0,
 0.0]
```

回帰分析結果の係数なのですが、ほぼ0になっていますね。
これが non-zero のものから順に、 work engagementに重要な影響があるのだろうと思って、これから組織改善していくのもありですね。

## stepwise Ridge regression
これは、基本的にstepwise regressionをやるのだけれども、回帰分析する部分はRidge regressionを使うものです。
モデル選択ではAICを使いました。

結果はこれ。

```
[0,
 0.11054317032895673,
 -0.12476721521464272,
 0,
 0,
 0.07627609978095617,
 0,
 -0.043064244993170325,
 0,
 0,
 -0.15088205090258217,
 0,
 0,
 0,
 -0.08550389113446391,
 0,
 0,
 0,
 0,
 0,
 0,
 -0.05671730303477239,
 0.2992227047981473,
 0,
 0.1755587698567591,
 -0.0930760108209781,
 0.2341828061828774,
 0.05745040084204903,
 0.28780050326094225,
 0.13772967947933137,
 0,
 0.2098554304822922,
 0,
 0]
```

2つの分析を比較してみるとこんな感じ。

|  | LASSO | stepwise Ridge regression |
|--:|--:|--:|
| 0 | 0 | 0 |
| 1 | 0.039773 | 0.110543 |
| 2 | 0 | -0.124767 |
| 3 | 0 | 0 |
| 4 | 0 | 0 |
| 5 | 0 | 0.076276 |
| 6 | 0 | 0 |
| 7 | 0 | -0.043064 |
| 8 | 0 | 0 |
| 9 | 0 | 0 |
| 10 | 0 | -0.150882 |
| 11 | 0 | 0 |
| 12 | 0 | 0 |
| 13 | 0 | 0 |
| 14 | 0 | -0.085504 |
| 15 | 0 | 0 |
| 16 | 0 | 0 |
| 17 | 0 | 0 |
| 18 | 0 | 0 |
| 19 | 0 | 0 |
| 20 | 0 | 0 |
| 21 | 0 | -0.056717 |
| 22 | 0.304455 | 0.299223 |
| 23 | 0.016853 | 0 |
| 24 | 0.028215 | 0.175559 |
| 25 | 0 | -0.093076 |
| 26 | 0.256548 | 0.234183 |
| 27 | 0 | 0.05745 |
| 28 | 0.145069 | 0.287801 |
| 29 | 0.053861 | 0.13773 |
| 30 | 0 | 0 |
| 31 | 0.101811 | 0.209855 |
| 32 | 0 | 0 |
| 33 | 0 | 0 |

- 大体似たものを取ってきている。
- stepwise Ridge regressionの方が多めに選ぶ傾向がある

って感じでしょうか。

## Ridge regressionとは
LASSOでは $L^1$-罰則項を用いていましたが、Ridge regressionは $L^2$-罰則項を用いたものです。
数式はこちら→[LASSO, Ridge regression, erastic netをRで実行 - Qiita](https://qiita.com/sugiyama34/items/2512e7a1edce277fa93f)

過学習殺すとか、ベイズ推定とか、そういう文脈で死ぬほど語れるのですが、今日はやめときます。

## stepwise regressionとは
stepwise regressionは、モデルを変更していきながら説明力の高いモデルを選ぶ方法です。
モデルの集合として、説明に使う変数を変えたものを用意すると、実質的には変数選択をやることになります。

説明力が高いモデルを選ぶには、説明力を測定する必要があります。
今回はAIC(Akaike Information Criterion)を使いました。
AICは有名なので、知らない人はぐぐってみてください。

stepwise regressionの手順はだいたい以下：
- model 0 で回帰分析し、AICの値を計算
- model 0 に似たモデルたちを用意し、それらで回帰分析＆AICの値を計算
- model 0 と、似た人々のAICを比較し、最も小さいAICを持つモデルを model 1 とする。
- model 0 = model 1 ならここで終了
- model 0 $\neq$ model 1であれば、　model 1 に似たモデルたちを用意し、それらで回帰分析＆AICの値を計算
- model 1 と、似た人々のAICを比較し、最も小さいAICを持つモデルを model 2 とする。
- model 1 = model 2 ならここで終了
- model 1 $\neq$ model 2であれば、　この作業を繰り返す

これでいい感じに選ばれるのです。

## Ridge regressionを使う理由
端的に言って、多重共線性を殺すために入れました。
ですが、(データ数) $\leq$ (説明変数数)の場合にすごい効果を発揮してくれました。
（※説明変数数 = 質問数 $\sim$ 40、で、データ数 = 集計対象のグループの人数なので、余裕で(データ数) $\leq$ (説明変数数)のときもあるのです。）
この場合、stepwise regressionをした時に、全データ点を通るモデルが選択され、$\textrm{AIC} = - \infty$ となって異常終了する時があります。
過学習とか、多重共線性がいやで変数選択しているのにコレになったら最悪ですよね。

Ridge regressionは多重共線性を殺す役割で入れたのですが、 $\textrm{AIC} = - \infty$ パターンを殺してくれるというのは思わぬ副産物でした。
言われてみれば当たり前だけどびっくり。今後も使おｗ

※簡単のため、バイアス項も説明変数に数えました（てへぺろ

## まとめ
こんな感じで、ちょっと罰則項をいれた回帰分析で変数選択をするというお話でした。
これで、データと言う観点から、重要な要素を選択できるので、一意見として結構いいかなと思っています。

## 宣伝
こんな感じで、wevoxの質問項目のうちwork engagementと密接な関係にあるのはどれ？という分析をかけることが出来ました。
質問疑問をお寄せいただいたユーザーの皆様、お待たせしました。

この3種の分析に加えもう3種の分析を足し、その結果をいい感じのNeural Networkに通して、最終的に重要度を推定する技術を開発しました。

こんな分析で大丈夫か？

と思うと思いますが、

大丈夫だ、問題ない。

です。
手元で検証走らせた限り、適当な検定を用いて、 $p<.00001$ くらいの精度で重要度をちゃんと分析できたよって感じになってます。
（まぁ、p値なんて所詮"統計的"有意なので、本当に俺達にとって有意なのかよってところが疑問かと思いますが、充分有意なレベルであったことは申し添えておきます）
いいでしょ〜。そのうちサービスにも公開できるかもしれません。しばしお待ちを！

## 宣伝 of the 宣伝
という感じで、いい感じに、組織状態の定量的計測と、データ分析を通して組織課題を抽出する事ができるサービスがwevoxです。
組織改善系のサービスは最近色々流行りがありますが、うちの走っていく方向の1つがデータ分析からのインサイト獲得です。
興味湧いたでしょ？
是非お問い合わせを！ｗ→[「組織力を見える化し、成長を加速させる」組織改善プラットフォーム | wevox](https://wevox.io/)

## 宣伝 of the 宣伝 of the 宣伝
データサイエンティストを目指したい貴方！一緒に働きませんか！？（どストレート←）
宛先はこちら！→[ぼくのTwitterです。気軽にDM下さい](https://twitter.com/sugi3_34)
（※あ、応募とかじゃなくても、データ分析か数学か物理の面白い話が大好物なので、そういうのでぜんぜんいいですｗ　ぼく時間はあるので、誰か友だちになって下さいｗ）