平均、分散が不明な母集団の平均を推定する。とはいえ十分大きなサイズの標本を取得することができない。言い換えると、少数のサンプルから得られる情報に基づいて、規模や回数のより大きな母集団の状況を予測する、そのような場合に用いるのがt検定だ。例えば、次のような場面で活用することができる。
- 過去に経験した障害の復旧時間から、必要と思われる復旧時間を求める。
- ある部門を構成する人員の生産性から、全社員の生産性を求める。
- 少数の初回ロット品の状態から、将来を含む出荷品全体の状態を予測する。
与えられたデータに基づく点推定ではなく、あくまでも統計的に区間推定で必要な情報を推定する。与えられたデータが統計的に信頼できるサイズではないとなれば、あくまでもデータが正規分布するという前提で、t検定を用いてみると良い。
まず演習問題をこなした上で、t分布、t検定に触れる。
演習問題
github.com
与えられた資料は、職員が製品を組み立てるまでの時間の一覧だ。次の問いに対応せよ。
1. Get Interval (Low and High value) at 95% confidence level for mean ASM hours
2. Estimate the unit price of this toy for sales planning
Asuumptions:
hourly rate 15 Yen/min
material costs 500 Yen per unit
Pack&ship 100 Yen per unit
SG and A 300 Yen per unit
D% allowance 30% Maximum from break even
SG&AとはSelling, General, and Administrative costsで、諸々の雑費を表している。
まず与えられたExcelを読み込む。ASM hoursだけをベクトルxに代入している。
library(readxl) data <- read_excel("data.xlsx") x = data$`ASM hours (Min)`
95%の信頼区間での最低、最大、平均ASM時間を求めるに際し、t検定を用いずに信頼区間を求めてみる。
標本平均±1.96×標本標準偏差÷√標本数
> mean(x) > sd(x) > min = mean(x) - 1.96 * sd(x) / sqrt(length(x)) > max = mean(x) + 1.96 * sd(x) / sqrt(length(x)) mean 19.9166667 sd 5.7339839 min 18.0435653 max 21.7897681
xは平均19.92、標準偏差5.73の正規分布で、95%信頼区間は18.04~21.79となる。
次にt検定で値を求めてみる。t.test関数を利用する。
表示結果の意味、関数のリファレンスを、エントリ末尾にまとめている。
> ret = t.test(x, conf.level = 0.95) > print(ret) One Sample t-test data: x t = 20.841, df = 35, p-value < 2.2e-16 alternative hypothesis: true mean is not equal to 0 95 percent confidence interval: 17.97657 21.85677 sample estimates: mean of x 19.91667
値が若干異なっているのが分かる。
ちなみにt.testの返り値はリストで返される。リストの中身などを調べてみる。
> mode(ret) [1] "list" > summary(ret) Length Class Mode statistic 1 -none- numeric parameter 1 -none- numeric p.value 1 -none- numeric conf.int 2 -none- numeric estimate 1 -none- numeric null.value 1 -none- numeric alternative 1 -none- character method 1 -none- character data.name 1 -none- character
信頼区間の最小値、最大値はconf.intに、平均値はestimateに格納されている。conf.intは同じくリストであり、conf.intにインデックスを指定することで最小値、最大値を参照できる。
estimateに格納されている平均値はret[5]、ret$estimate、ret[5]$estimate、いずれの呼び出し方でも参照できる。
> print(ret[4]) $conf.int [1] 17.97657 21.85677 attr(,"conf.level") [1] 0.95 > > ret[4]$conf.int[1] [1] 17.97657 > ret[4]$conf.int[2] [1] 21.85677 > > print(ret[5]) $estimate mean of x 19.91667 > > ret[5]$estimate mean of x 19.91667
必要な値を取得できたので、売価を計算してみる。
計算ロジックを関数にして、最小、平均、最大組み立て時間毎の売価を求める。
> calc = function(val){ + hrate = 15 + material = 500 + shipping = 100 + sga = 300 + + return(hrate * val + material + shipping + sga) + } > > minprice = calc(ret[4]$conf.int[1]) > avgprice = calc(ret[5]$estimate) > maxprice = calc(ret[4]$conf.int[2]) min price 1169.6484845 avg price 1198.75 max price 1227.8515155
損益分岐点から最大30%の割引が許容されている。生産性最大(組み立て時間最小)に基づいた価格設定だと、生産性が悪化した場合に損失が生じるため、割引設定にはリスクがある。生産性最小(組み立て時間最大)に基づいた価格設定だと、生産性が良化した場合には利益が生じるため、割引余地がある。
ここでは売価から30%割引したときに、平均組み立て時間に基づいた価格になるようにする。
> avgprice / 0.7 mean of x 1712.5
計算では求める価格は1712.5円だが、実際には1700円、1715円など、切りの良い数字に仕立てるだろう。
t分布、t検定、t.testの出力結果
t分布
中心極限定理 | 標本数が大きいほど、標本平均の分布は正規分布に近づく。 |
標本数が統計的に信頼できるサイズでなければ、標本平均は母集団の平均からのズレが大きいため、真の平均(母集団の平均)を求めるのが難しい。
t分布とは統計量tの分布だ。標本数の少なさによるバラツキを考慮した「正規分布のような」分布で、統計量tが大きくなるほど、t分布は正規分布に近づく。
t検定
t検定とは、t分布を用いて、母平均に対する検定を行う。言い換えると、帰無仮説「母平均は**である」を検定することになる。このとき対立仮設は「母平均は**ではない」となる。検定結果により求められるP値が有意水準未満であれば帰無仮説は棄却され、対立仮説が採用される。
今回の演習問題の場合でいうと、次のようになる。
有意水準 | 0.05 = 1 - 95% |
帰無仮説 | 母平均は0である。 |
対立仮説 | 母平均は0ではない。 |
t.testの出力結果。
今回の演習問題の結果を読み解くと、次のようになる。
data: x | 標本 x |
t = 20.841 | 統計量t 20.841 |
df = 35 | 自由度 (Degree of Freedom) 35 |
p-value < 2.2e-16 | P値 2.2 * (1/10)^16 |
alternative hypothesis: true mean is not equal to 0 | 対立仮説 母集団の平均は0ではない。 |
95 percent confidence interval: 17.97657 21.85677 |
95%信頼区間 17.97657 21.85677 |
sample estimates: mean of x 19.91667 |
標本平均 19.91667 |
P値が優位水準未満なので、帰無仮説が棄却され、対立仮説「母平均は0ではない」が採用されている。
そもそも論だが、信頼区間に0が含まれていないため、帰無仮説は成り立ちようがない。