統計学と言えばt検定が有名かと思います
しかしt検定にはいくつか種類があり、かけるt検定によって、結果の解釈がかわってきます
今回はt検定の選び方とPythonでt検定をかける方法について解説をしていきたいと思います
これまでの【Pythonで統計学】シリーズ同様に、csvから読み込んだデータをt検定にかけていきたいと思います
pythonで統計学を学ぶ流れは以下の記事を参考にしてください
Contents
t検定とは
t検定とは、パラメトリック検定の一種で、データの対応の有無に応じて、統計手法がかわります
pythonではt検定を行う場合にはscipyを使用します
- stats.ttest_rel:対応のある2標本t検定
- stats.ttest_ind:対応のないt検定
と大きくわけると、2種類のt検定があります
まずはそれぞれの特徴について確認していきます
対応のある2標本t検定
対応のある2標本t検定は、2つのデータが対応しており、正規分布している場合に用います
データが対応しているのというのは、同一人物からデータを複数回測定する、ということです
例えば、ダイエットを始めたAさんのダイエットを始めた日の体重とダイエットを始めて1ヶ月後のデータを比較したい場合や、
薬を飲み始めた日の血圧と薬を飲み始めてから1ヶ月後の血圧の変化を比較したい場合などが、対応のあるデータになります
対応のある2標本t検定をかける手順
対応のある2標本t検定をかける前提として、
- 2群が対応している
- 正規分布している
という必要があります
正規分布については、以下の記事を参考にしてください
pythonで対応のある2標本t検定をかけてみる
では実際に対応のある2標本t検定をかけていきたいと思います
scipyのstats.ttest_relを使用します
scipy.stats.ttest_rel(a, b, axis=0, nan_policy='propagate', alternative='two-sided')
「 alternative=’two-sided’」は両側検定の意味になります
片側検定を行う場合には、 alternative=’less’もしくは’greater’を使用すれば行うことができます
「nan-policy」は欠損値(NaN)がある場合に、どういった処理を行うかを設定します
- propagate:nanを返す
- raise:エラーをスルーする
- omit:nan:値を無視して計算を実行
pythonでは欠損値があっても、統計をかけることが可能ですが、データ前処理の段階で欠損値はどうにかしておくべきだと思います
a,bにはそれぞれの値を入力します
今回はcsvから取り込んだデータをa,bに入力していきます
サンプルコードは以下になります
今回はe-statで無料配布されているcsvデータを利用して統計処理を行なっていきたいと思います
下から2行は不要なので、あらかじめ削除してから統計処理を行なっていきます
def twottest():
type = [("all file","*")] # 読み取るファイルをcsvに絞り込む。
file_path_stastics = filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())
stasticsdata = pd.read_csv(file_path_stastics, engine="python",index_col=None)
A_list=stasticsdata.iloc[:,2]
A=list(A_list)
B_list=stasticsdata.iloc[:,3]
B=list(B_list)
result=stats.ttest_rel(A, B, axis=0, nan_policy='propagate', alternative='two-sided')
text.insert(tk.END,stasticsdata.describe())
listbox1.insert(tk.END,"p=%.3f" %(result.pvalue))
iloc[:,2]で2列目のデータを
iloc[:,3]で3列目のデータをA,Bに代入しています
ilocの数値を変えることで、好きな列のデータを統計処理にかけることができます
これでcsvから読み込んだ好きな列のデータを対応のある2標本t検定にかけることができます
対応のないt検定
対応のないt検定とは独立している2つのデータに差があるかどうかを比較するものです
- 例えば、BMIが20以下の人と21以上の人で、血圧に違いがあるか?
- 運動をしている人としていない人で血圧に差があるか?
などを比較する場合に、対応のないt検定を用います
一つ注意しておくのが、対応のないt検定には2種類あります
- スチューデントのt検定
- ウェルチのt検定
両者の違いは分散が等しいかどうか(等分散を仮定できる・できない)の違いになります
等分散の確認はF検定、ルビーンの検定で確認することができます
詳細は以下の記事を確認してください
等分散が仮定できる場合には、スチューデントのt検定を
等分散が仮定できない場合には、ウェルチのt検定を用います
対応のないt検定をかける手順
対応のないt検定をかける場合には、
- 正規分布している
- 2つのデータが独立している(別々の人たちから測定している)
- 等分散している→スチューデントのt検定
- 等分散していない→ウェルチのt検定
という流れになります
スチューデントのt検定をかけてみる
では実際にスチューデントのt検定をかけていきます
コードは以下のようになります
scipy.stats.ttest_ind(a, b, axis=0, equal_var=True, nan_policy='propagate', permutations=None, random_state=None, alternative='two-sided', trim=0)
対応のある2標本t検定と同様、
「 alternative=’two-sided’」は両側検定の意味になります
片側検定を行う場合には、 alternative=’less’もしくは’greater’を使用すれば行うことができます
- less:片側検定(少ないor低い)
- greater:片側検定(大きいor高い)
「nan-policy」は欠損値(NaN)がある場合に、どういった処理を行うかを設定します
- propagate:nanを返す
- raise:エラーをスルーする
- omit:nan:値を無視して計算を実行
ではcsvデータを取り込んで、対応のないt検定(スチューデントのt検定)をかけていきます
def ttest():
type = [("all file","*")] # 読み取るファイルをcsvに絞り込む。
file_path_stastics = filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())
stasticsdata = pd.read_csv(file_path_stastics, engine="python",index_col=None)
A_list=stasticsdata.iloc[:,2]
A=list(A_list)
B_list=stasticsdata.iloc[:,3]
B=list(B_list)
result=stats.ttest_ind(A, B, alternative='two-sided')
text.insert(tk.END,stasticsdata.describe())
listbox1.insert(tk.END,"p=%.3f" %(result.pvalue))
「equal_var=True」はデフォルトでTrueになっているので、Trueの場合は記載しなくてもOKです
ウェルチのt検定をかけてみる
次に等分散が等しくないと仮定した場合のウェルチのt検定をかけていきます
基本的にはスチューデントのt検定を同じ流れになります
サンプルコードはこちらです
def welchtest():
type = [("all file","*")] # 読み取るファイルをcsvに絞り込む。
file_path_stastics = filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())
stasticsdata = pd.read_csv(file_path_stastics, engine="python",index_col=None)
A_list=stasticsdata.iloc[:,2]
A=list(A_list)
B_list=stasticsdata.iloc[:,3]
B=list(B_list)
result=stats.ttest_ind(A, B, alternative='two-sided',equal_var=False)
text.insert(tk.END,stasticsdata.describe())
listbox1.insert(tk.END,"p=%.3f" %(result.pvalue))
スチューデントのt検定とウェルチのt検定の違いは「equal_var=True」か「equal_var=False」かです
equal_varを変えるだけで、対応のないt検定を2種類使うことが可能です
まとめ
- t検定にはいくつか種類がある
- 対応のある2標本検定はstats.ttest_relを使用する
- 対応がなく等分散を仮定できる場合にはstats.ttest_ind
- 対応がなく等分散を仮定できない場合にはstats.ttest_ind(equal_var=False)とする