この内容は山田、杉澤、村井(2008)「R」によるやさしい統計学を参考にしています。
この講義では、「統計的仮説検定」をとりあげます。 これは、統計的仮説検定の手順の理解と用語の習熟がねらいです。 また、代表的な統計的仮説検定、つまり標準正規分布を用いた検定、t分布を用いた検定、無相関検定、カイ二乗検定について学びます。
学習項目です:
下の散布図を見てください(青色の円は、点の分布の状態を表すために描いたものです):
これをみると、この2つの変数 a と bの間には相関関係がないようにみえます。実際
$corrcoef(a,b)= -0.034$なので相関なしといえます。
ところが、a, bそれぞれから30点ずつ無作為抽出したデータ xa, xb (下にその散布図を示す)は、
ときに 0.378 という『弱い相関』を示すことがあります。
参考: 無相関の母集団から相関するデータを作る
次が無相関の母集団から相関するデータを作った方法です:
help(plt.Circle)
import matplotlib.pyplot as plt
import numpy.random as random
import matplotlib.patches as patches
%matplotlib inline
fig = plt.figure()
ax = plt.axes()
a = random.normal(50,10,500)
b = random.normal(50,10,500)
plt.scatter(a, b, s=20, c='k',alpha=0.4)
plt.xlabel('a')
plt.ylabel('b')
# 中心(50,50)で半径25の円を描画
circle=patches.Circle((50,50),25, fill=False, color='b')
ax.add_patch(circle)
aspect = (ax.get_xlim()[1] - ax.get_xlim()[0]) / (ax.get_ylim()[1] - ax.get_ylim()[0])
ax.set_aspect(aspect) # 縦横の縮尺を調整
plt.show()
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
a = random.normal(50,10,500)
b = random.normal(50,10,500)
for _ in range(100):
xa = random.choice(a,30)
xb = random.choice(b,30)
if (abs(np.corrcoef(xa,xb)[0,1]) > 0.30):
break
plt.scatter(xa, xb)
plt.xlabel('xa')
plt.ylabel('xb')
x = np.linspace(10, 90, 10000)
lm = np.polyfit(xa, xb, 1)
plt.plot(x, lm[0]*x+lm[1],"g")
print(np.corrcoef(xa,xb)[0,1])
これは、実際には作為的に作られたデータです。しかし、あなたが発明した機器の有効性を示す論文や、あなたが作った薬品の効果を示す論文において、都合の良いデータだけを集めたのではないか、もしくは作為がないとしても、このデータは本当に偶然の結果であって多数のデータを取ればこのようなグラフにはならないのではないか、という疑いがかけられることがあります。
そのような疑いや批判には、(前の章で学んだように)『標本抽出が無作為抽出であること』(都合の良いデータを集めたわけではない)、そして(本章で学ぶように)『母集団に全く相関がないとしたら、抽出した標本からこのような結果が得られる可能性が非常に小さいということ』(多数のデータを集めても同じような結果が得られる確率が高い)を示さなければなりません。そして、 統計的仮説検定は確率に基づき、後者の主張を行うための方法です。(前者の「無作為抽出」は、統計による分析の大前提です)
統計的仮説検定の一般的な手順を次の表に示します。ここで取り上げる検定は、標本が正規分布に従う母集団から無作為に抽出されたものであることを仮定し、それを前提として行われます。なお「正規分布に従う母集団」のことを正規母集団と呼びます。
手順 | やること |
---|---|
1 | 母集団に関する帰無仮説と対立仮説を設定 |
2 | 検定統計量を選択 |
3 | 有意水準 αの値を決定 |
4 | データを収集した後、データから検定統計量の実現値を求める |
5 | 結論: 検定統計量の実現値が棄却域に入れば帰無仮説を棄却し、対立仮説を採択する。そうでなければ、帰無仮説を採択する |
対立仮説の設定により、検定は次のどちらかで行う(両側検定の方がより厳しい条件であり、普通は両側検定 で行う):
帰無仮説が正しいものとして分析を行う
実際に得られたデータから計算された検定統計量の値によって採択を判断する。
検定統計量の実現値は、対立仮説に合うほど 0から離れた値を示す
対立仮説を採択するか決定するときに基準になるのが有意水準(αで表されます)
有意水準は5%または1%(α=0.05またはα=0.01)に設定することが多い(つまり、標本が100回に5回(5%の場合)以下にしか現れないデータであった---こんなことは偶然では起こりえない---、だから帰無仮説が成り立たないと考えて良いのではないか、という判断基準)
帰無仮説が正しいものとして考えた時の標本分布を帰無分布という---帰無分布に基づいて確率計算される
帰無仮説のもとで、非常に生じにくい検定統計量の値の範囲を棄却域という---帰無仮説が棄却される領域(だから、この範囲に入るのが『望ましい』)
![]() |
正規分布を帰無分布とした時の棄却域 |
検定統計量の実現値が棄却域に入った場合、「差がない」という帰無仮説を棄却し、 「差がある」という対立仮説を採択する。
あなたはランダムに配置された対象物(例えば地雷や石油や埋蔵金など)を衛星からのセンサーデータを元に限定された時間(例えば1時間)内に検出する機器を作成した。100個のデータに対し検出率は0.70であった。そして、その性能が従来の製品(検出率は0.60と宣伝されている)よりも優れていることを統計的仮説検定の手法により示したい。
どのような帰無仮説と対立仮説をたてればよいか、また検定方法は片側か両側か、有意水準はどのくらいに設定したらよいか、考えを述べよ。
回答欄:
p値:帰無仮説が正しいという仮定のもとで、標本から計算した検定統計量の実現値以上の値が得られる確率
p値が有意水準より小さい時に帰無仮説を棄却する
[参考: p値が小さいことの意味] p値の大きさが対立仮説を採択する(帰無仮説を棄却する)決め手となります。p値が小さいということは、 『帰無仮説が正しいとすると』確率的にほとんど起こりえないことが起きた(有意水準が5%なら100回中5回以下、 1%なら100回中1回以下)ということを意味します。逆にp値が大きいということは、確率的にはよくあることが起きた(だから、この結果では差があるとはいえない)、 ということになります。
検定力:帰無仮説が偽の場合、全体の確率1から第2種の誤りの確率(1 - β)を引いた確率
「第2種の誤りを犯さない確率」ともいう、つまり間違っている帰無仮説を正しく棄却できる確率のこと
中心極限定理
正規分布$N(\mu, \sigma^2)$
$\chi^2$分布
$t$分布
$F$分布
正規母集団 $N(\mu, \sigma^2)$ から無作為に$n$個の標本を抽出する(このとき「標本サイズは$n$である」という)と
回答欄:
import numpy as np
SampleData = np.array([13,14,7,12,10,6,8,15,4,14,9,6,10,12,5,12,8,8,12,15])
次のステップで行う:
# SampleDataに標本データがあることが前提
mu=12.0 # 帰無仮説:平均=12
var=10.0 # 母分散
n=len(SampleData)
sampleMean =np.mean(SampleData)
z = (sampleMean - mu) / (var/n)**0.5 # 検定統計量
print("検定統計量の実現値=",z)
import scipy.stats as st
st.norm.ppf(0.025) # 下側確率0.05/2 = 0.025となるzの値を求める
# 下側確率であるから、この値よりもZ値が小さければ棄却される
# 上側確率 1 - 0.05/2 = 0.975となるzの値を求める
st.norm.ppf(0.975)
# 上側確率であるから、この値よりもZ値が大きければ棄却される
# 参考
help(st.norm.ppf)
この結果、棄却域は $Z < -1.959964$ または $Z > 1.959964$となるので、$Z$の値は棄却域に入る。 よって、結論「有意水準5%において、指導法データは心理学テスト(という母集団)から無作為抽出した標本とはいえない」。
なお、関数cdfを用いて、直接p値を求めることもできる:
st.norm.cdf(z) # 下側確率 前に求めた値:z=-2.828427
# 下側確率とすれば、p値は0.0023という小さな値(< 0.05)
st.norm.cdf(-z) # 上側確率
# 両側検定なので2倍する
2*st.norm.cdf(-z)
# 両側検定であるから2倍したp値は0.0047という小さな値(< 0.05)
# 参考
help(st.norm.cdf)
課題4-3
ある食品メーカーの同じ種類の缶詰めから無作為抽出した缶詰9個の内容量を測定したところ、平均が$49.4$であった。この缶詰は$N(50.0,1.44)$に従う母集団から無作為抽出した標本と考えてよいかどうかを有意水準5%で検定せよ。(別な言い方をすれば、母分散が正しいとして、母平均は50.0と考えてよいかどうかの検定)
正規母集団からの無作為標本であっても、母分散σ2がわからない場合、 先の方法が使えません---先の検定で用いた検定統計量が計算できないからです
そこで母分散の平方根σ の代わりに、標本から求められる不偏分散の平方根$\hat{\sigma}$を使い、
$ t = \frac{\bar{X}-\mu}{\hat{\sigma}/\sqrt{n}} $
を検定統計量とする。
これは自由度(df) $n-1$ のt分布に従う
(参考:母分散が未知のときの母平均の区間推定)
課題4-4 母分散が未知の場合の検定の考え方の確認
st.t.ppf(0.025,19) # df=19、下側確率0.05/2 = 0.025となるtの値を求める(scipy.stats.tモジュールのppf関数
⇒ -2.0930240544082634
# 下側確率であるから、この値よりもt値が小さければ棄却される)
st.t.ppf(0.975,19) # df=19、上側確率1-0.05/2 = 0.975となるtの値を求める(scipy.stats.tモジュールのppf関数
# 上側確率であるから、この値よりもt値が大きければ棄却される
⇒ 2.093024054408263
この結果、棄却域は $t < -2.093024$ または $t > 2.093024$となるので、$t$の値は棄却域に入る。
関数 cdf を用いて、直接p値を求めることもできる:
st.t.cdf(t) # 下側確率 (scipy.stats.tモジュールのcdf関数) t=-2.616648,19
# 下側確率とすれば、p値は0.0085 という小さな値(< 0.05)
⇒ 0.0084854604500293768
print(st.t.cdf(-t,19)) # 上側確率
⇒ 0.99151453955
print(2*st.t.cdf(t,19)) # 両側検定なので2倍する
⇒ 0.0169709209001
# 両側検定より2倍したp値は0.017という小さな値(< 0.05)
# 以上の実行
# 前の例題のデータをここでも使うことにする
import numpy as np
SampleData = np.array([13,14,7,12,10,6,8,15,4,14,9,6,10,12,5,12,8,8,12,15])
mu=12.0 # 帰無仮説:平均=12
# var=10.0 # 母分散は未知とする
n=len(SampleData)
sampleMean =np.mean(SampleData)
unbiasedVar = np.var(SampleData, ddof=1)
t = (sampleMean - mu) / (unbiasedVar/n)**0.5 # 検定統計量
print("検定統計量の実現値 = %f" % t)
import scipy.stats as st
st.t.ppf(0.025,19) # df=19、下側確率0.05/2 = 0.025となるtの値を求める(scipy.stats.tモジュールのppf関数
# 下側確率であるから、この値よりもt値が小さければ棄却される)
st.t.ppf(0.975,19) # df=19、上側確率1-0.05/2 = 0.975となるtの値を求める(scipy.stats.tモジュールのppf関数
# 上側確率であるから、この値よりもt値が大きければ棄却される
st.t.cdf(t,19) # 下側確率 (scipy.stats.tモジュールのcdf関数)
# 下側確率とすれば、p値は0.0085 という小さな値(< 0.05)
print(st.t.cdf(-t,19)) # 上側確率
print(2*st.t.cdf(t,19)) # 両側検定なので2倍する
# 両側検定より2倍したp値は0.017という小さな値(< 0.05)
これにより、結論p値は0.017 < 0.05 であるので、有意水準5%において帰無仮説が棄却、対立仮説が採択された。
ところで、この場合の対立仮説とはなんでしたっけ?それをちゃんと書くようにしましょう。
?st.t.ppf
?st.t.cdf
Pythonでt検定するための関数:
以上のことをすべてやってくれる関数がscipy.statsモジュールのttest_1samp関数である。
注意: これが使えるのは標本データセットがある場合に限る。データセットが与えられていない場合は、「標本平均、不偏分散、標本サイズ」によって上記の方法により検定する
import scipy.stats as st
?st.ttest_1samp
「指導法データ」 (SampleData) を用いてその使い方を示す:
# 以上の実行
# 前の例題のデータをここでも使うことにする
import numpy as np
SampleData = np.array([13,14,7,12,10,6,8,15,4,14,9,6,10,12,5,12,8,8,12,15])
import scipy.stats as st
mu=12.0
st.ttest_1samp(SampleData,mu)
この表示から、t値が-2.617、p値が0.017 (両側検定)であることが得られる。
注意:関数を実行して値を出して終わりではない. 次のような結論を書くこと
$p < 0.05$であることから、帰無仮説は棄却された。つまり、有意水準5%において、指導法データは心理学テスト(という母集団)から無作為抽出した標本とはいえない。
課題4-5
ある食品メーカーの同じ種類の缶詰めから無作為抽出した缶詰「9個」の内容量を測定したところ、平均が49.4、不偏分散が1.0であった。この缶詰全体は正規分布に従うとするとき、母平均が$50.0$であるという仮説を有意水準5%で検定せよ。
# 解答、計算用
無相関検定:「母集団において相関が0である」と設定して行う検定
母集団相関係数(母相関)に関する検定を行うときは、標本相関係数rから次を求めて検定統計量とする:
$t = \frac{r\sqrt{n-2}}{\sqrt{1-r^2}}$
例題:以下で与えられる「統計学テスト1」(StatTest1)と「統計学テスト2」(StatTest2)の得点の相関係数の検定を行え。有意水準は5%とする。
import numpy as np
StatTest1 = np.array([6,10,6,10,5,3,5,9,3,3,11,6,11,9,7,5,8,7,7,9])
StatTest2 = np.array([10,13,8,15,8,6,9,10,7,3,18,14,18,11,12,5,7,12,7,7])
次のステップで行う:
SampleCorr = np.corrcoef(StatTest1, StatTest2)[0,1]
print("Sample Correlation = %f" % SampleCorr) # 標本相関
⇒ Sample Correlation = 0.749659
SampleSize = len(StatTest1)
tDividend = SampleCorr * (SampleSize - 2.0)**0.5
tDivider = (1.0 - SampleCorr**2)**0.5
t = tDividend/tDivider
⇒ t statistics = 4.805707
import scipy.stats as st
print(st.t.ppf(0.025,18)) # df=18、下側確率0.05/2 = 0.025となるtの値を求める
⇒ -2.10092204024
# 下側確率であるから、この値よりもt値が小さければ棄却される
print(st.t.ppf(0.975,18)) # df=18、上側確率 1 - 0.05/2 = 0.975となるtの値を求める
⇒ 2.10092204024
# 上側確率であるから、この値よりもt値が大きければ棄却される
# 忘れる人がいるのでデータを再度提示する
import numpy as np
StatTest1 = np.array([6,10,6,10,5,3,5,9,3,3,11,6,11,9,7,5,8,7,7,9])
StatTest2 = np.array([10,13,8,15,8,6,9,10,7,3,18,14,18,11,12,5,7,12,7,7])
# ここから分析
SampleCorr = np.corrcoef(StatTest1, StatTest2)[0,1]
print("Sample Correlation = %f" % SampleCorr) # 標本相関
SampleSize = len(StatTest1)
tDividend = SampleCorr * (SampleSize - 2.0)**0.5
tDivider = (1.0 - SampleCorr**2)**0.5
t = tDividend/tDivider # 検定統計量
print("検定統計量の実現値 = %f" % t)
import scipy.stats as st
print(st.t.ppf(0.025,18)) # df=18、下側確率0.05/2 = 0.025となるtの値を求める
# 下側確率であるから、この値よりもt値が小さければ棄却される
print(st.t.ppf(0.975,18)) # df=18、上側確率 1 - 0.05/2 = 0.975となるtの値を求める
# 上側確率であるから、この値よりもt値が大きければ棄却される
なおscipy.stats.tモジュールのcdf関数を用いて、直接p値を求めることもできる:
import scipy.stats as st
print(st.t.cdf(t,18)) # 上側確率
print( (1.0 - st.t.cdf(t,18))*2.0 ) # 両側検定なので2倍する
# 両側検定により2倍したp値は0.00014という小さな値(< 0.05)
print("相関係数=",st.pearsonr(StatTest1, StatTest2)[0])
この場合の結論は次のようになる。結論を明記することを忘れないようにしよう
p値は0.00014でありこれは0.05よりも小さな値なので、「相関がない」という帰無仮説が棄却される。ゆえに、有意水準5%において、StatTest1とStatTest2には相関があると考えられ、その相関係数は0.75であり、「強い相関」が認められる
Pythonで無相関検定するための関数: scipy.stat.pearsonr
import scipy.stats as st
# help(st.pearsonr)
import scipy.stats as st
SampleCorr = st.pearsonr(StatTest1, StatTest2)
print(SampleCorr)
pearsonr関数の出力の第一要素は標本相関係数(0.75)、第二要素は両側検定によるp値である。
注: numpyをnp, numpy.randomを random、 matplotlib.pyplotをplt、pandasをpd、scipy.statsをstと略記する
目的 | 関数名とモジュール | 使い方 |
---|---|---|
指定された範囲からランダム抽出 | random.choice(配列,個数) | random.choice(range(10),5) |
標準正規分布で下側確率に対応する確率分布関数の値 | st.norm.ppf(p) | st.norm.ppf(0.025) # $Prob(Z < q)=0.025$となるqの値 |
標準正規分布で下側確率(p値)を求める | st.norm.cdf(z) | st.norm.cdf(1.96) # $Prob(Z < 1.96)$の値(p値) |
t分布で下側確率に対応する確率分布関数の値 | st.t.ppf(p,自由度) | st.t.ppf(0.025,19) # 自由度19のt分布で$Prob(Z < q)=0.025$となるqの値 |
t分布で下側確率(p値)を求める | st.t.cdf(p,df) | st.t.cdf(1.96,19) # 自由度19のt分布で$Prob(Z < 1.96)$の値(p値) |
t検定を行う | st.ttest_1samp(データ,$\mu$) | st.ttest_1samp(np.array([13,14,7,12,10,6,8,15,4,14,9,6,8,8,12,15]),12.0) # $\mu=12$の検定 |
無相関検定を行う | st.pearsonr(データ1,データ2) | st.pearsonr(StatTest1, StatTest2) # 出力の第一要素は標本相関係数、第二要素は両側検定によるp値 |
import numpy as np
Height = np.array([165,150,170,168,159,170,167,178,155,159,161,162,166,171,155,160,168,172,155,167])
解答:帰無仮説を「Heightデータは分散33.7, 平均170cmの正規分布に従う20歳男性の身長データを母集団とし、そこからの無作為抽出である」とする。対立仮説はその否定、すなわち「Heightデータは分散33.7, 平均170cmの正規分布に従う20歳男性の身長データを母集団としていない(無作為抽出ではない)」。有意水準5%、両側検定を行う。
mu=170 # 帰無仮説:平均=12
var=33.7 # 母分散
n=len(Height)
HeightMean =np.mean(Height)
z = (HeightMean - mu) / (var/n)**0.5 # 検定統計量
print("検定統計量の実現値=",z)
# t<0なので下側確率を用いる
import scipy.stats as st
print("p値=%e" % (st.norm.cdf(z)*2)) # 下側確率*2
print("p値=%f" % (st.norm.cdf(z)*2)) # 別な表現
p値が$2.61 \times 10^{-6}$であり有意水準$5 \%$より小さい。 ゆえに帰無仮説は棄却され、対立仮説が採択される。 つまり所与のデータは有意水準5%において「20歳男性の身長の母集団からの無作為抽出」とは考えられない。
20歳男性の身長(単位はcm)は 平均170cmの正規分布に従うことが知られているとする。ここで演習問題1との違いは、「分散が未知」であることである。 演習問題1のデータは、それを母集団とした無作為抽出と考えてよいかどうかを検定せよ。
解答:帰無仮説を「Heightデータは平均170cmの正規分布に従うデータを母集団とし、そこからの無作為抽出である」とする。対立仮説はその否定、すなわち「Heightデータは平均170cmの正規分布に従うデータを母集団としていない(無作為抽出ではない)」。有意水準5%、両側検定を行う。
mu=170 # 帰無仮説
var=np.var(Height,ddof=1) # 母分散は未知とする
n=len(Height)
HeightMean =np.mean(Height)
t = (HeightMean - mu) / (var/n)**0.5 # 検定統計量
print("検定統計量の実現値 = %f" % t)
print("不偏分散=%5.2f, データサイズ= %d" %(var, n))
import scipy.stats as st
#下側確率 両側検定なので×2
print("p値 = %e" % (st.t.cdf(t, n-1)*2))
print("p値 = %f" % (st.t.cdf(t, n-1)*2)) # 別な表現
p値が0.001であり有意水準5%より小さい。ゆえに帰無仮説は棄却され、対立仮説が採択される。 つまり所与のデータは有意水準5%とすると「平均170cmの正規母集団から無作為抽出した標本とは考えられない」。
参考:ttest_1sampを使うと簡単!
st.ttest_1samp(Height,170)
最初の数値(-3.85)が検定統計量の実現値、2番めの数値(0.00108)がp値。これは与えられた標本データが平均$\mu$(この例では170)かつ母分散が未知の正規母集団からの無作為抽出かどうかを検定するのに用いられる。(分散が既知の場合と比べると、p値が高くなりやすいことに注意)
次のそれぞれのデータについて無相関検定を行え。結論を明記することを忘れないように。
#3-1
import numpy as np
Kokugo = np.array([60,40,30,70,55])
Shakai = np.array([80,25,35,70,50])
解答:pearsonr関数を使えばすぐに求まるが、ひとまず正攻法で解いてみる。帰無仮説は「KokugoとShakaiに相関がない」、対立仮説は「KokugoとShakaiは相関がある」。有意水準を5%とし、両側検定する。
SampleCorr = np.corrcoef(Kokugo,Shakai)[0,1]
print("Sample Correlation = %f" % SampleCorr) # 標本相関
SampleSize = len(Kokugo)
tDividend = SampleCorr * (SampleSize - 2.0)**0.5
tDivider = (1.0 - SampleCorr**2)**0.5
t = tDividend/tDivider # 検定統計量
print("検定統計量の実現値 = %f" % t)
alpha=0.05
print("下側の棄却域の値=%f"%st.t.ppf(alpha/2, SampleSize-2))
print("上側の棄却域の値=%f"%st.t.ppf(1.0-alpha/2, SampleSize-2))
# t > 0 であるからt.cdfをそのまま求めると大きな値になる。そのため1から引き算する。
print("p値=%f"%( (1-st.t.cdf(t,SampleSize-2))*2 ))
参考:st.perasonrを使う: 1番目の数値が相関係数、2番めの数値がp値
import scipy.stats as st
SampleCorr = st.pearsonr(Kokugo, Shakai)
print(SampleCorr)
p値は0.074でありこれは有意水準の0.05よりも大きい。 ゆえに「KokugoとShakaiには相関がない」という帰無仮説が棄却されない。 従って、有意水準5%において、KokugoとShakaiには相関がない。
参考:「相関がない」とはしたものの、p値はかなり小さな値である。p値が0.10よりも小さい場合「(有意な差はないものの)有意傾向にある」と言うことがある。
#3-2 --- 単純に上記(3-1)のデータを2回繰り返したもの
# 結論が変わることに気づくであろう。 データを捏造するとこうなる、という例
Kokugo2 = np.array([60,40,30,70,55,60,40,30,70,55])
Shakai2 = np.array([80,25,35,70,50,80,25,35,70,50])
解答:帰無仮説は「Kokugo2とShakai2に相関がない」、対立仮説は「Kokugo2とShakai2は相関がある」。有意水準を5%とし、両側検定する。
import scipy.stats as st
SampleCorr = st.pearsonr(Kokugo2, Shakai2)
print(SampleCorr)
p値は$0.023$でありこれは$5\%$よりも小さい。 ゆえに「Kokugo2とShakai2は相関がない」という帰無仮説が棄却される。 従って、有意水準5%において、Kokugo2とShakai2には、相関係数0.84という強い相関がある。
# 参考:正攻法で解いてみる
SampleCorr = np.corrcoef(Kokugo2,Shakai2)[0,1]
print("Sample Correlation = %f" % SampleCorr) # 標本相関
SampleSize = len(Kokugo2)
tDividend = SampleCorr * (SampleSize - 2.0)**0.5
tDivider = (1.0 - SampleCorr**2)**0.5
t = tDividend/tDivider # 検定統計量
print("検定統計量の実現値 = %f" % t)
alpha=0.05
print("下側の棄却域の値=%f"%st.t.ppf(alpha/2, SampleSize-2))
print("上側の棄却域の値=%f"%st.t.ppf(1.0-alpha/2, SampleSize-2))
# t > 0 であるからt.cdfをそのまま求めると大きな値になる。そのため1から引き算する。
print("p値=%f"%( (1-st.t.cdf(t,SampleSize-2))*2 ))