この記事に書いてある内容は、私が所属する会社とは一切関係がありません。
また近くにコードレビューしてくれる方も、見せる人もいないのでFBなどくださるとありがたいです。
目的
社員を便宜的にハイパフォーマーとローパフォーマーに分類し、SPIの言語・非言語スコアや性格特性に有意な差があるかをPythonのscipy.stats.ttest_indを用いて調べました。
結論
ハイパフォーマーの定義によりますが、有意な差がある項目がいくつか現れました。以下のようなoutputが得られます。
Column Name: imagination, T Value=[1.46385011], P Value=[0.2394426]
Column Name: introvert, T Value=[-3.91918359], P Value=[0.02954136]
Column Name: nonverbal_score, T Value=[4.79319137], P Value=[0.01727471]
Column Name: verbal_score, T Value=[0.77459667], P Value=[0.49502535]
架空のデータセットですが、outputを見ると内向性と非言語スコアは有意な差がありそうです。
実施方法
環境
- windows
- 会社のpcなので詳しくは調べていません
- Anaconda 5.2
ライブラリは以下をimportしておきます。
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import scipy.stats as stats
ダミーデータを用意する
まずは架空のデータセットを作り、ハイパフォーマー(hp)とローパフォーマー(lp)にデータフレームに分割します。
data = {
'hp': [0, 0, 0, 1, 1],
'verbal_score': [53, 54, 53, 53, 55],
'nonverbal_score': [53, 54, 53, 60, 65],
'imagination': [50, 51, 51, 52, 51],
'introvert': [53, 50, 51, 45, 47]
}
spi_frame = DataFrame(data)
# dataframeを分割する
hp = spi_frame[spi_frame.hp == 1]
lp = spi_frame[spi_frame.hp == 0]
一列ごとにt検定を行う
ttest_result = stats.ttest_ind(hp.nonverbal_score, lp.nonverbal_score)
ttest_result
# output
Ttest_indResult(statistic=4.793191373636545, pvalue=0.017274707950747335)
全てのColumnで一度にt検定を行う
上記の方法でもt検定を行えますが、全ての結果を一列ずつt検定するのは疲れるのでfor文で一気に行います。そのコードが以下です。
for i in range(1, len(spi_frame.columns)):
t, p = stats.ttest_ind(hp.iloc[:, [i]], lp.iloc[:, [i]])
name = spi_frame.columns.values[i]
print('Column Name: {}, T Value={}, P Value={}'.format(name, t, p))
# output
Column Name: imagination, T Value=[1.46385011], P Value=[0.2394426]
Column Name: introvert, T Value=[-3.91918359], P Value=[0.02954136]
Column Name: nonverbal_score, T Value=[4.79319137], P Value=[0.01727471]
Column Name: verbal_score, T Value=[0.77459667], P Value=[0.49502535]
補足
差が有意にある項目だけ知りたい場合は、if文を使ってp < 0.05とかにしておけば見やすくなります。