Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9304

1サンプル t-検定のお気持ちと実装

$
0
0

t-検定の数理的な面は この記事が詳しい。ここでは t-検定が良さそうだというお気持ちと実装、数値検証を載せた。

1サンプルの t 検定のお気持ち

母集団の平均値が $\mu_0$ と等しいことを帰無仮説とする。サンプル数 $N$ が非常に多い場合、t-検定の統計量がどのように振る舞うかを考える。なお数学的には厳密ではない、あくまでお気持ち計算である。
確率変数 $X_i\ (i=1, ..., N)$ ($N$ はサンプル数) が平均 $\mu$ 標準偏差 $\sigma$ を持つ場合に、以下の t-検定の統計量 $t$

\begin{align}
t &:= \frac{\sqrt{N}\left(\bar X - \mu_0\right)}{s}\\
\bar X &:= \frac{1}{N}\sum_{i=1}^N X_i\\
s^2 &:= \frac{1}{N-1}\sum_{i=1}^N\left(X_i-\bar X\right)^2
\end{align}

を考える。サンプル数のリーディングオーダーのみを考える。サンプル数が非常に大きい場合、$E[s^2] = \sigma^2$, $Var[s^2] = o\left(\frac{1}{N}\right)$ (分散の導出はこちら) となる。サンプル数のリーディングオーダーのみを見れば中心極限定理より

t \approx \sqrt{N} \frac{\bar X - \mu_0}{\sigma} \sim N\left(\sqrt{N} (\mu - \mu_0), 1\right)

となる。帰無仮説が正しい場合 $t$ は平均0の正規分布に漸近的に従うが、正しくない場合は平均値が0から大きく乖離する。そのため帰無仮説が正しいとして統計量 $t$ を評価すれば、その帰無仮説がどの程度正しいのか正しくないのかを評価することができる。もちろん上記の計算では確率変数を正しく扱ってはいなく、サンプル数が非常に大きい場合は真の平均、分散にほぼ等しいから定数として置いたりなどがあるため厳密には正しくないが、サンプル数が非常に大きい場合は近似的に正しいはず。

サンプル数が十分に多くない場合は上の議論は使えない。しかし各サンプルが正規分布に従っている場合 $t$ はt-分布に従う。

C# による実装

t-検定を C# でスクラッチで実装し、テストをおこないました。。。

publicpartialclassParametric{publicstaticStatisticalTestResultTTestOneSample(TTestOneSampleNullHypothesisnullHypothesis){varn=nullHypothesis.Samples.Count();varsampleMean=nullHypothesis.Samples.Average();varsampleStandardDeviation=nullHypothesis.Samples.StadardDeviation()*Math.Sqrt(n/(n-1.0));varstatistics=(sampleMean-nullHypothesis.PopulationMean)/(sampleStandardDeviation/Math.Sqrt(n));vartDist=newProbability.Distribution.T();vartCdf=tDist.GetCumulativeDistributionFunction(newProbability.Parameter.T(0,1,n-1));varpValue=1-Math.Abs(tCdf(statistics)-0.5)*2;returnnewStatisticalTestResult(statistics:statistics,pValue:pValue);}}
[TestMethod]publicvoidTTestOneSample(){// following data from https://tanuhack.com/ttest-one-sample/varsamples=newdouble[]{210.9,195.4,202.1,211.3,195.5,212.9,210.9,198.3,202.1,215.6,204.7,212.2,200.7,206.1,195.8};varpopMean=200;varexpectedStatistics=2.751076959309973;varexpectedPValue=0.015611934395473872;varresult=Statistics.StatisticalTest.Parametric.TTestOneSample(newStatistics.StatisticalTest.NullHypothesis.TTestOneSampleNullHypothesis(samples,popMean));Assert.AreEqual(expectedStatistics,result.Statistics,1.0e-10);Assert.AreEqual(expectedPValue,result.PValue,1.0e-10);}

Viewing all articles
Browse latest Browse all 9304

Trending Articles