日々学び、感謝し、成長する

データとハートを活かす人事を目指した成長奮闘記(?)です

ピープル・アナリティクスケーススタディ:違う2グループの差をPythonで検証!

 f:id:millebon:20210321082614p:plain

今回のお題

ピープル・アナリティクスで統計を使って分析をしたいと考えても、どういう風に使えばいいのかがなかなか思いつきません。

 

今AIHRの”Statistics in HR”というオンライン講座で人事、ピープル・アナリティクスで活用できる統計を学んでいます。

 

この講座のいいところは、実際に実用できそうなケースが課題として与えられ、それに対する回答ビデオも用意されているところです。

 

ただ、若干難儀なのは、回答ビデオがSPSSかRを使ったもので、私が多少なりとも知識のあるPythonではないこと。。

 

Rをダウンロードしてやってみようとも思ったのですが、今後もPythonを使いたいと考えるとPythonで検証し、答え合わせや検証方法の参考としてビデオを見ることにしました。

 

今回のお題はこんな感じです。

  • 利用できるデータ(エクセル)に含まれている内容
  1. 社員同士でのやる気、イノベーションにつながる行動、知識共有、ネットワーキング活動などを社員同士で評価した調査結果
  2. 社員の属性(年齢、所属、在籍年数、性別、年齢、学歴。。)やパフォーマンスなどの人事データ
  • 人事マネージャーは「35歳未満の社員の方がイノベーションにつながる活動をより多くするので35歳未満の社員を採用する」ことを提案

 

  • 現場のマネージャーはその主張に懐疑的なため、統計的に結果を提示することが必要

 

です。

 

人事を経験された方であればイノベーションという活動でなくても、年齢などグループによる差が実際に起きているのかということを知りたい場面があるかと思います。

 

では実際にどうやったのかを見ていきましょう

 

注意:データはAIHRに帰属しているため、考え方及びPythonでのプログラミングのみをいかに記述していきます。

 

Pythonで結果はすぐ出ますが、その前提条件を確認するのが大事

このお題で調べたいことは

 

”35歳未満のグループ”と”35歳以上のグループ”でイノベーションに対する行動が違うのか?

 

ということです。

 

幸いデータには年齢と、社員同士で行ったイノベーションに対する行動の評価がありますので、今回は、これを利用します。

 

また、少し統計を勉強されたことがあるのであれば、「対応のないt検定で検証できるのでは?」というアイデアも浮かぶかと思います。

 

ただ、そのアイデアが浮かんでもそれでいいのか自信を持てなかったりするんですよね。。そういう点で実際課題を与えられて「対応のないt検定でやるといいですよ」といわれると、同じようなケースに適用してみようという自信になるかと思います!

 

対応のないt検定自体の結果自体を出すのはpythonでは全く難しくありません。

 注意:途中データの検証等行っていますが、そちらは今回省いています。

 

1)まずデータを読み込む(斜字がプログラミングです。'AIHR_Statistics_dataset_2018.xlsx'はデータセット名です)

  import pandas as pd

  data=pd.read_excel('AIHR_Statistics_dataset_2018.xlsx')

2)必要なデータセットのみ抜き出し、innov_1と命名('CLAGE'が年齢、’MEANINNOVATION'がイノベーションに対する行動評価の平均です)。

  innov_1=data.loc[:,["CLAGE","MEANINNOVATION"]]
  innov_1.head()

3)35歳未満(innov_y)、35歳以上の(innov_s)の2グループを作る。

  innov_y=innov_1.loc[innov_1['CLAGE']<35]

  innov_s=innov_1.loc[innov_1['CLAGE']>=35]

4)それぞれのグループのMEANINNOVATIONデータを取り出す。

  dataA=innov_y['MEANINNOVATION']
  dataB=innov_s['MEANINNOVATION']

5)scipyにあるstats.ttest_ind関数を用いて検証(equal_var=Falseとしてそれぞれの分散は等しくないとしています)

  from scipy.stats import ttest_ind

  ttest_ind(dataA, dataB,equal_var=False)

 

結果は以下の通りでP値が0.13と高いため、2つのグループでは差がないと判断できたということになります。

 

 Ttest_indResult(statistic=-1.5276548241734522, pvalue=0.13083247153227473)

 

ただ、こんなに簡単に出てくると”これでいいの??”と不安になります。

 

実はその前に、そもそも「対応のないt検定を使っていいのか」という前提を確認しないといけないんですね。

 

今回の課題で、その前提と前提の検証方法が明確になったので非常にすっきりしました。

 

前提に必要な条件を検証

回答ビデオによると検証しないといけないことは4つあります。

1.従属変数(=今回の場合イノベーションに対する評価の平均)が正規分布(Normally Distributed)かどうか

 こちらはヒストグラムを書いて確認します。Pythonのmatplotlibを使いました。(”innov”という変数は”MEANINNOVATION"の値だけを取り出すために作っています)

 import matplotlib.pyplot as plt

 innov=data.loc[:, ["MEANINNOVATION"]]

 innov.hist()

 

でてきたグラフはこんな感じで、(解説によると)ほぼ正規分布といえるということでした。

f:id:millebon:20210321092643p:plain

ほかの確認方法としては”尖度”を出すという方法です。グラフの左右へのゆがみを確認するというものですね。

 

Pythonでは以下のように実装しました。

 from scipy.stats import skew
 innov_skew = skew(innov)
 print(innov_skew)

 

結果は0.1722。解説によると、「正規分布といえる」としていいということです。

 

補足:正規性を検定方法で検出する方法を見つけましたので以下のブログをご参考にしてください。

millebon.hatenablog.com

 

2.従属変数が連続的な値かどうか

 こちらは1のヒストグラムを見ても連続的な値とわかるので特に検証する必要はありません。

 

3. 比較する2つの対象グループ分散は同一かどうか

 こちらはルビーン検定というものを用いました。ここで出たP値は0.102。帰無仮説「2グループ間の偏差の絶対値の平均はたがいに等しい(=分散が等しい)」という仮説を棄却できないP値なので、同一といえるということです。

 

 from scipy.stats import levene
 stat, p = levene(dataA, dataB, center='median')
 p

 

 ということは、

 前提の前のt検定で分散が等しくないと仮定していたのを修正しなきゃ!

 となりequal_var=True としてみました。

  ttest_ind(dataA, dataB,equal_var=True)

    としてもP値は0.102なので結局2つのグループの平均には差が認められないということになったんですけどね。

 

4.比較する2つの対象グループは独立しているかどうか

 今回のグループは35歳未満と35歳以上のグループなのでそもそも重ならないですよね。なので、お互いグループとして独立しているといえます。

 

参考リンク

t検定についてはハンバーガ統計学が役に立ちます。以前お世話になったサイトですが、今回また新たに参考にさせてもらいました。

  • どの検定手法を使うべきかは以下のサイト(英語ですが)が役に立ちます。残念ながらどのPythonコードを使うべきかはこちらにはないのですが。。(SAS, SPSS, Rを使う方にはいいのではないでしょうか)

stats.idre.ucla.edu


  • Pythonでの統計手法のCheat Sheeは別途見つけました。今回は過去勉強した内容などを探しながらコードを書きましたが、今後はこちらが参考になりそうです。