1 課程目標

  • 當我們想要了解兩個母體平均數有無差異時,可以檢驗母體平均數是否相等的假設,包括獨立兩母體平均數的檢定、成對兩母體檢定、兩母體比例差異的估計與檢定。如果我們想要檢驗三個或者以上的母體平均數是否相等,則使用變異數分析。
  • 例如我們想知道不同種族的平均薪資是否有差異:
  • m1 <- aov(wage ~ race, data=ISLR::Wage )
    summary(m1)
    ##               Df  Sum Sq Mean Sq F value  Pr(>F)    
    ## race           3   63212   21071    12.2 5.9e-08 ***
    ## Residuals   2996 5158874    1722                    
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • 結果顯示不同種族的平均薪資有統計上的顯著差異。我們也可以畫圖1.1顯示每個類別的薪資分佈以及相關的統計數字:
  • # plot
    ggstatsplot::ggbetweenstats(
      data = ISLR::Wage,
      x = race,
      y = wage,
      xlab = "Race",
      ylab = "Wage",
      Bayes=F)
    不同種族的薪資

    Figure 1.1: 不同種族的薪資

    1.1 兩個獨立母體之樣本檢定

    • 我們經常需要知道兩套樣本的差異是否達到統計上的顯著水準,例如兩種教學方法的成績、兩個餐廳的評價、兩個國家人民對於民主的滿意程度等等。

    • 從兩個獨立母體抽樣,樣本的平均數差異(\(\bar{X_{1}}-\bar{X_{2}}\))的抽樣分配趨近於常態分配。

    • 如果母體的變異數未知,只有樣本的變異數,我們可以用樣本變異數做為母體變藝術的估計。

    • 那麼如何計算兩套樣本的標準誤?公式為:

    \(SE(\bar{X_{1}}-\bar{X_{2}})=\sqrt{\frac{s_{1}^{2}}{n_{1}}+\frac{s_{1}^{2}}{n_{1}}}\)

    如果\(n_{1}=n_{2}=n\)\(SE(\bar{X_{1}}-\bar{X_{2}})=\sqrt{\frac{s_{1}^{2}+s_{2}^{2}}{n}}\)

    如果兩者樣本數不相等, \(SE(\bar{X_{1}}-\bar{X_{2}})=\frac{s_{1}+s_{2}}{2}\sqrt{\frac{1}{n_{1}}+\frac{1}{n_{2}}}\)

    • \(T\)值的公式為:

    \(T=\frac{\bar{X_{1}}-\bar{X_{2}}}{SE(\bar{X_{1}}-\bar{X_{2}})}\)

    • 自由度:\(n_{1}+n_{2}-2\)

    1.1.1 範例

    • 假設有兩種油漆,我們想知道這兩種油漆的效果是不是相似。兩種油漆的資料如下,
    sample1<-c(19.7475, 30.5562, 11.0734, 18.1730, 19.8387, 
               14.5291, 19.4998, 18.8374, 12.6873, 14.7627,
               18.3869, 17.9287, 17.6973, 14.3439, 10.7374, 
               15.3563, 19.0878, 12.5745, 18.0030, 18.6004)
    
    sample2<-c(17.4715, 9.8613, 23.4827, 13.6029, 20.0386, 
               19.6289, 24.9357, 17.8812, 12.6012, 9.7741, 
               19.9265, 16.4178, 20.4401, 15.1119, 7.9955,
               5.1385, 22.4969, 17.4448, 17.6675, 7.0984)
    • 先用箱形圖顯示兩套樣本的分佈,可以看出第一套樣本比較集中,第二套比較分散,如圖1.2
    
    dt=data.frame(sample1, sample2)
    dt.m <- melt(dt) %>%
    ggplot(aes(x=variable, y=value)) +
      geom_boxplot()  +
       labs(x="Groups", y='') +
      stat_summary(fun.y=mean, geom="point", shape=16, size=2, col='red') 
    dt.m
    兩套樣本的盒型圖

    Figure 1.2: 兩套樣本的盒型圖

    • 以t.test()檢定假設:兩筆資料的平均數相等,或者是相減等於0?
     t.test(sample1, sample2, var.equal = T)
    ## 
    ##  Two Sample t-test
    ## 
    ## data:  sample1 and sample2
    ## t = 0.73, df = 38, p-value = 0.5
    ## alternative hypothesis: true difference in means is not equal to 0
    ## 95 percent confidence interval:
    ##  -2.054  4.394
    ## sample estimates:
    ## mean of x mean of y 
    ##     17.12     15.95
    • 由以上的結果可以看出,\(p>0.05\),因此我們無法拒斥兩筆資料的平均數相等的假設。結論是兩種油漆的效果非常相近。

    • 根據以上公式,我們再驗算一次:

    n1<-length(sample1); n2<-length(sample2)
    s1<-sd(sample1); s2<-sd(sample2)
    se <-((s1+s2)/2)*(sqrt(n1^-1+n2^-1))
    T=(mean(sample1)-mean(sample2))/se
    cat('t =',T, '\n')
    ## t = 0.7414
    pvalue=(1-pt(0.74, n1+n2-2))*2
    cat('p value =', pvalue)
    ## p value = 0.4638
    • 除了檢驗兩個樣本有相同的平均值,也可以檢驗一個大於另一個平均值。以上面資料為例,
     t.test(sample1, sample2, var.equal = T, alternative = 'less')
    ## 
    ##  Two Sample t-test
    ## 
    ## data:  sample1 and sample2
    ## t = 0.73, df = 38, p-value = 0.8
    ## alternative hypothesis: true difference in means is less than 0
    ## 95 percent confidence interval:
    ##   -Inf 3.855
    ## sample estimates:
    ## mean of x mean of y 
    ##     17.12     15.95
    • 可以看出\(p\geq 0.05\)。我們不拒斥第一套樣本等於第二套樣本的平均數的假設。

    • 又或者用隨機抽樣的資料驗證第一套樣本平均值小於第二套樣本平均值。

    set.seed(29393091)
    x=rnorm(30)
    set.seed(116)
    y=rnorm(100, sqrt(2), 1)
    t.test(x, y, alternative = 'greater')
    ## 
    ##  Welch Two Sample t-test
    ## 
    ## data:  x and y
    ## t = -5.4, df = 50, p-value = 1
    ## alternative hypothesis: true difference in means is greater than 0
    ## 95 percent confidence interval:
    ##  -1.433    Inf
    ## sample estimates:
    ## mean of x mean of y 
    ##    0.2474    1.3422
    • 結果顯示\(p>0.05\),因此以\(\alpha=0.05\)的標準,我們不拒斥第一套樣本平均值小於第二套樣本平均值的假設。

    1.2 雙樣本的比例檢定

    • 如果兩個樣本都是來自二項分布,那麼我們可以檢驗比例是否相同,也就是檢驗以下的虛無假設:

    \[H_{0}:\mu_{1}-\mu_{2}=0\]

    • 如果把0換成任意數,等於是檢驗母體比例的差異是否達到某個程度。寫成:

    \[H_{0}:\mu_{1}-\mu_{2}=D_{0}\]

    • 以上的雙尾檢定可以改為單尾檢定。

    1.2.1 範例

    • 有一輛捷運,第一節車廂有50名乘客,第二節車廂有61人,第一節車廂有20位男性,第二節則有13位男性,請問兩節車廂有相同的男性比例嗎?用R計算如下:
    x1=20; n1=50; x2=13; n2=61
    prop.test(c(x1,x2), c(n1, n2))
    ## 
    ##  2-sample test for equality of proportions with continuity correction
    ## 
    ## data:  c(x1, x2) out of c(n1, n2)
    ## X-squared = 3.7, df = 1, p-value = 0.05
    ## alternative hypothesis: two.sided
    ## 95 percent confidence interval:
    ##  -0.001604  0.375375
    ## sample estimates:
    ## prop 1 prop 2 
    ## 0.4000 0.2131
    • 結果顯示,兩節車廂各有0.4以及0.21比例的男性。因為\(p>0.05\),因此以\(\alpha=0.05\)的標準,我們接受兩節車廂有一樣男性比例的假設。

    1.3 成對樣本檢定

    • 前面的雙樣本檢定假定兩套樣本互相獨立,但是有不同的平均值與標準差。如果是想要確定兩個變數來自於同一套樣本,兩次測量的平均值相等,則是進行成對樣本檢定。

    • 例如病患服用藥物前後的病況、選手接受訓練前後的表現等等,適合進行成對樣本檢定。

    • R的t.test函數,可設定paired=T,進行成對樣本檢定,虛無假設為兩次測量的平均值相等。

    • 例如比較民進黨候選人在台北市第2選區在2016年的立委選舉與2019年的立委補選的各里的平均得票率是否相同:

    filetaipei<-here::here('data','taipei201619.csv')
    taipei<-read.csv(filetaipei, header=T, fileEncoding = 'BIG5')
    library(dplyr)
    taipei<-taipei %>% 
      mutate(DPP2016.p=100*DPP2016/total2016, DPP2019.p=100*DPP2019/total2019)
    with(taipei, t.test(DPP2016.p, DPP2019.p, paired = T))
    ## 
    ##  Paired t-test
    ## 
    ## data:  DPP2016.p and DPP2019.p
    ## t = 26, df = 196, p-value <2e-16
    ## alternative hypothesis: true difference in means is not equal to 0
    ## 95 percent confidence interval:
    ##  11.07 12.90
    ## sample estimates:
    ## mean of the differences 
    ##                   11.98
    • 結果顯示兩者有很大的差異,拒斥兩次選舉的平均值相減等於0的假設。

    • 為了確認這個檢定結果,我們可以畫圖顯示兩次選舉的平均值。先整理成為長資料:

    dat<- taipei %>% 
           select('2016'='DPP2016.p', '2019'='DPP2019.p')
    dat.new <- melt(dat, variable.name = "election", value.name = "DPP") 
    dat.new <- dat.new %>% 
               group_by(election) %>%
               mutate(grp.mean=mean(DPP)) %>%
               mutate(Year=as.factor(election))
    • 然後使用ggplot2畫分佈圖:
    ggplot(dat.new, aes(x=DPP, color=Year)) +
      geom_density(position="identity", alpha=.4) +
      geom_vline(data=dat.new, aes(xintercept=grp.mean, color=Year),
                 linetype="dashed") +
      labs(x="DPP's Vote Share", y="")
    民進黨2016大選及2019補選得票率

    Figure 1.3: 民進黨2016大選及2019補選得票率

    • 1.3 顯示發現民進黨候選人在台北市第二選區的兩次選舉的得票率,的確有相當不同的分佈以及集中趨勢。

    2 變異數分析

  • 變異數分析的功能是檢驗一個類別變數與其它連續變數(continuous variable)之間的關係,可運用One-way Anova(單因子變異數分析),分析類別之間是否存在平均值的差異。
    1. 類別變數與連續變數互相獨立
    2. 每一個類別內的連續變數呈常態分佈
    3. 每一個類別內的連續變數的變異數相同

    \(SSB=\sum n_{k}(\bar{x_{k}}-\bar{x})^2\)

    \(SSW=\sum_{k}\sum (x_{ki}-\bar{x_{k}})^2\)

    \(MSB=SSB/df(B) \hspace{.4cm} df(B)=k-1\)

    \(MSW=SSW/df(W) \hspace{.4cm} df(W)=n-1-(k-1)=n-k\)

    \(F=\frac{MSB}{MSW}\)

    curve(df(x, df1=1, df2=2), from=0, to=5, ylab='')
    三種F分佈

    Figure 2.1: 三種F分佈

    curve(df(x, df1=5, df2=6), from=0, to=5, col='red', add=T)
    三種F分佈

    Figure 2.2: 三種F分佈

    curve(df(x, df1=20, df2=30), from=0, to=5, col='blue2', add=T)
    abline(v=1, lwd=1.5, lty=2, col='green2')
    legend('topright', c('df=1;df=2','df=5;df=6',
                         'df=20;df=30'),
                col=c('black',"red", "blue2"),
                lty=c(1,1,1))
    三種F分佈

    Figure 2.3: 三種F分佈

    Orange$tree<-factor(Orange$Tree, levels=c("1","2", "3", "4","5"))
    library(dplyr)
    mydata <- Orange %>%
              group_by (tree) %>%
              summarize(
             count = n(),
             avg = mean(circumference, na.rm = TRUE),
             sd = sd(circumference, na.rm = TRUE)
      ) 
    kable(mydata) %>%
      kable_styling(bootstrap_options = "striped", full_width = F)
    tree count avg sd
    1 7 99.57 43.29
    2 7 135.29 66.32
    3 7 94.00 42.98
    4 7 139.29 71.90
    5 7 111.14 58.86
    p=ggplot(Orange, aes(x=tree, y=circumference)) 
    p+geom_boxplot(data=Orange, aes(color=tree)) +
      theme_bw()
    五種樹的樹圍

    Figure 2.4: 五種樹的樹圍

    G=ggplot(Orange, aes(x=circumference, fill=tree, alpha=0.2))
    G+geom_density() +
       xlim(c(0, 300)) +
       theme_bw()
    箱型圖與機率密度

    Figure 2.5: 箱型圖與機率密度

    res.aov <- aov(circumference ~ tree, data = Orange)
    # Summary of the analysis
    summary(res.aov)
    ##             Df Sum Sq Mean Sq F value Pr(>F)
    ## tree         4  11841    2960    0.88   0.49
    ## Residuals   30 100525    3351
    plot(res.aov, 1, cex=1.5, lwd=1.5)
    變異數圖形

    Figure 2.6: 變異數圖形

    bartlett.test(circumference ~ tree, data = Orange)
    ## 
    ##  Bartlett test of homogeneity of variances
    ## 
    ## data:  circumference by tree
    ## Bartlett's K-squared = 2.5, df = 4, p-value = 0.7
    library(car)
    leveneTest(circumference ~ tree, data = Orange)
    ## Levene's Test for Homogeneity of Variance (center = median)
    ##       Df F value Pr(>F)
    ## group  4    0.59   0.67
    ##       30
    TukeyHSD(res.aov)
    ##   Tukey multiple comparisons of means
    ##     95% family-wise confidence level
    ## 
    ## Fit: aov(formula = circumference ~ tree, data = Orange)
    ## 
    ## $tree
    ##        diff     lwr    upr  p adj
    ## 2-1  35.714  -54.04 125.46 0.7766
    ## 3-1  -5.571  -95.32  84.18 0.9998
    ## 4-1  39.714  -50.04 129.46 0.7030
    ## 5-1  11.571  -78.18 101.32 0.9956
    ## 3-2 -41.286 -131.04  48.46 0.6726
    ## 4-2   4.000  -85.75  93.75 0.9999
    ## 5-2 -24.143 -113.89  65.61 0.9343
    ## 4-3  45.286  -44.46 135.04 0.5930
    ## 5-3  17.143  -72.61 106.89 0.9806
    ## 5-4 -28.143 -117.89  61.61 0.8910

    3 指令整理

    alpha=0.01; cat("conf=0.99, mean=0, sd=1, Z=", qnorm(1-(alpha/2), 0, 1),"\n")
    ## conf=0.99, mean=0, sd=1, Z= 2.576
    alpha=0.05; cat("conf=0.95, mean=0, sd=1, Z=", qnorm(1-alpha/2),"\n")
    ## conf=0.95, mean=0, sd=1, Z= 1.96
    alpha=0.1; cat("conf=0.90, mean=0, sd=1, Z=", qnorm(1-alpha/2),"\n")
    ## conf=0.90, mean=0, sd=1, Z= 1.645
    alpha=0.05; cat("conf=0.95, mean=1, sd=1, Z=", qnorm(1-alpha/2, 1, 1),"\n")
    ## conf=0.95, mean=1, sd=1, Z= 2.96
    信賴區間0.95常態分佈圖

    Figure 3.1: 信賴區間0.95常態分佈圖

    cat("z=1.99, mean=0, sd=1, p=", pnorm(1.99, 0, 1, lower.tail = TRUE),"\n")
    ## z=1.99, mean=0, sd=1, p= 0.9767
    cat("z=1.96, mean=0, sd=1, p=", pnorm(1.96, 0, 1, lower.tail = TRUE),"\n")
    ## z=1.96, mean=0, sd=1, p= 0.975
    cat("z=1.68, mean=0, sd=1, p=", pnorm(1.68, 0, 1, lower.tail = TRUE),"\n")
    ## z=1.68, mean=0, sd=1, p= 0.9535
    左尾累積機率圖

    Figure 3.2: 左尾累積機率圖

    cat("z=1.99, mean=0, sd=1, p=", pnorm(1.99, 0, 1, lower.tail = FALSE),"\n")
    ## z=1.99, mean=0, sd=1, p= 0.0233
    cat("z=1.96, mean=0, sd=1, p=", pnorm(1.96, 0, 1, lower.tail = FALSE),"\n")
    ## z=1.96, mean=0, sd=1, p= 0.025
    cat("z=1.68, mean=0, sd=1, p=", pnorm(1.68, 0, 1, lower.tail = FALSE),"\n")
    ## z=1.68, mean=0, sd=1, p= 0.04648
    右尾累積機率圖

    Figure 3.3: 右尾累積機率圖

    n=10; alpha=0.01; cat("conf=0.99, n=10, T=", qt(1-alpha/2, n-1),"\n")
    ## conf=0.99, n=10, T= 3.25
    n=10; alpha=0.05; cat("conf=0.95, n=10, T=", qt(1-alpha/2, n-1),"\n")
    ## conf=0.95, n=10, T= 2.262
    n=10; alpha=0.1; cat("conf=0.90,  n=10, T=", qt(1-alpha/2, n-1),"\n")
    ## conf=0.90,  n=10, T= 1.833
    n=30; alpha=0.05; cat("conf=0.95, n=30, T=", qt(1-alpha/2, n-1),"\n")
    ## conf=0.95, n=30, T= 2.045
    n=10; alpha=0.01;cat("t=1.99, n=10, p=", pt(1.99, n-1),"\n")
    ## t=1.99, n=10, p= 0.9611
    n=10; alpha=0.05;cat("t=1.96, n=10, p=", pt(1.96, n-1),"\n")
    ## t=1.96, n=10, p= 0.9592
    n=10; alpha=0.1;cat("t=1.68, n=10, p=", pt(1.68, n-1),"\n")
    ## t=1.68, n=10, p= 0.9364
    n=30; alpha=0.05;cat("t=1.68, n=30, p=", pt(1.68, n-1),"\n")
    ## t=1.68, n=30, p= 0.9481
    n=10; alpha=0.01;cat("t=1.99, n=10, p=", pt(1.99, n-1, lower.tail = FALSE),"\n")
    ## t=1.99, n=10, p= 0.0389
    n=10; alpha=0.05;cat("t=1.96, n=10, p=", pt(1.96, n-1, lower.tail = FALSE),"\n")
    ## t=1.96, n=10, p= 0.04082
    n=10; alpha=0.1;cat("t=1.68, n=10, p=", pt(1.68, n-1, lower.tail = FALSE),"\n")
    ## t=1.68, n=10, p= 0.06363
    n=30; alpha=0.05;cat("t=1.68, n=30, p=", pt(1.68, n-1, lower.tail = FALSE),"\n")
    ## t=1.68, n=30, p= 0.05185
    set.seed(02138)
    X<-rnorm(100, 0, 1)
    t.test(X, conf.level=0.95)
    ## 
    ##  One Sample t-test
    ## 
    ## data:  X
    ## t = -0.81, df = 99, p-value = 0.4
    ## alternative hypothesis: true mean is not equal to 0
    ## 95 percent confidence interval:
    ##  -0.2795  0.1168
    ## sample estimates:
    ## mean of x 
    ##  -0.08133
    #manual computing
    n=length(X)
    mean.x<-mean(X)
    SD <- sqrt(var(X)/n)
    alpha=0.05
    zstar<-qnorm(1-alpha/2)
    
    cat("conf=0.95, interval estimate=[", mean.x-zstar*SD, ",", 
             mean.x+zstar*SD,"]")
    ## conf=0.95, interval estimate=[ -0.277 , 0.1144 ]
    set.seed(02138)
    X<-rbinom(100, 1, 0.5)#randomly drawing samples from binomial distribution
    n=length(X)
    s<-length(X[X==1])
    prop.test(s, n, conf.level = 0.95)
    ## 
    ##  1-sample proportions test with continuity correction
    ## 
    ## data:  s out of n, null probability 0.5
    ## X-squared = 0.49, df = 1, p-value = 0.5
    ## alternative hypothesis: true p is not equal to 0.5
    ## 95 percent confidence interval:
    ##  0.3609 0.5622
    ## sample estimates:
    ##    p 
    ## 0.46
    #manual computing
    phat<-mean(X)
    SE <- sqrt(phat*(1-phat)/n)
    alpha=0.05
    tstar<-qt(1-alpha/2, df=n-1)
    
    cat("conf=0.95, interval estimate=[", phat-tstar*SE, ",", 
             phat+tstar*SE,"]")
    ## conf=0.95, interval estimate=[ 0.3611 , 0.5589 ]
    set.seed(02138)
    X<-rbinom(100, 1, 0.5)#randomly drawing samples from binomial distribution
    n=length(X)
    s<-length(X[X==1])
    binom.test(s, n, conf.level = 0.95)
    ## 
    ##  Exact binomial test
    ## 
    ## data:  s and n
    ## number of successes = 46, number of trials = 100, p-value = 0.5
    ## alternative hypothesis: true probability of success is not equal to 0.5
    ## 95 percent confidence interval:
    ##  0.3598 0.5626
    ## sample estimates:
    ## probability of success 
    ##                   0.46

    4 作業

    4.1 雙母體統計估計

    1. 請回答現代統計學二版的第11.4題。

    2. 請回答現代統計學二版的第11.6題。

    3. 請回答現代統計學二版的第11.11題,但是三個職業的樣本數各為100。

    4. 某一調查中,18位受訪者對2位候選人的表現打成績如下表,老師想知道這兩位候選人得到的成績是否相同,請問如何檢定?

    Respondent Candidate.1 Candidate.2
    1 75 66
    2 80 74
    3 86 74
    4 70 74
    5 80 89
    6 69 79
    7 59 83
    8 86 85
    9 74 80
    10 80 80
    11 88 60
    12 88 59
    13 76 49
    14 90 42
    15 91 30
    16 70 72
    17 68 60
    18 55 88

    5. 請用Moodle上面的「立委-A05-2(台北市).ods」資料以及「候選人在各投開票所得票數一覽表」,整理台北市第二選區國民黨候選人在2016立委選舉以及2019補選的資料,然後先畫圖比較國民黨候選人在台北市第2選區在2016年的立委選舉與2019年的立委補選的各里的分佈,最後檢驗平均得票率是否相同。

    4.2 變異數分析

    1. 請回答現代統計學二版的第9.10題。 1. 請回答現代統計學二版的第9.10題。 1. 請回答現代統計學二版的第9.10題。 1. 請回答現代統計學二版的第9.10題。 5. 請建立以下的模擬資料,然後檢驗各組的平均數是否相等。如果不相等,請找出哪兩組有不同的平均數。

    set.seed(377)
    DV<-rnorm(1000, 0, 3)
    X.1<-round(runif(1000, 1, 4))
    X <- as.factor(X.1)

    5 更新內容日期

    ## 最後更新日期 04/14/2021