選擇統計方法

我會使用獨立樣本 t 檢定(independent sample t-test),因為這題要比較兩群「不同的人」(男生、女生)在一個連續變項(PV1MATH)上的平均數。每個學生只屬於其中一組,兩組之間沒有配對關係,所以不是成對樣本 t 檢定;母體標準差也不知道,只能用樣本去估,所以用 t 檢定。

研究假設如下。題目只問「是否有顯著差異」,沒有說哪一組比較高,所以用雙尾檢定,顯著水準 α = .05:

  • 虛無假設 H0:μ男 = μ女,臺灣男生和女生的 PISA 數學平均分數沒有差異。
  • 對立假設 H1:μ男 ≠ μ女,臺灣男生和女生的 PISA 數學平均分數有差異。

獨立樣本 t 檢定有兩個版本,要先看 Levene 變異數同質性檢定再決定:

  • Levene 不顯著(p ≥ .05):兩組變異數可以當作相等,用合併變異數的 Student’s t 檢定,自由度 = n1 + n2 − 2。
  • Levene 顯著(p < .05):兩組變異數不相等,改用 Welch’s t 檢定,它不假設變異數相等,自由度會用 Welch–Satterthwaite 公式調整,通常不是整數。

資料型態判斷

Gender 是類別變項(名義尺度),1 = Female、2 = Male,只有兩個類別,剛好當作分組變項。它不能算平均數,只能看各組人數。

PV1MATH 是 PISA 的數學成績,是用試題反應理論估出來的第 1 個「可能值」(plausible value),是可以有小數的連續分數,量尺以 OECD 平均約 500、標準差約 100 來定,可以算平均數和標準差,適合當依變項。

這兩個變項的特性決定了方法:「一個兩類別的分組變項 + 一個連續依變項,兩組是不同的人」,就對應到獨立樣本 t 檢定。另外 t 檢定還要求:

  1. 常態:每組人數都超過兩千,依中央極限定理,平均數的抽樣分布會接近常態;下面也會分組算偏態和峰度確認。
  2. 獨立:男生和女生是不同的學生,組間彼此獨立。不過 PISA 是先抽學校再抽學生,同校學生的成績會比較像,這次照題目只用一般 t 檢定,沒有加權,結果當成「這份樣本」的描述。
  3. 變異數同質:用 Levene 檢定判斷,結果會決定要用 Student’s t 還是 Welch’s t。

載入套件

haven 用來讀 SPSS 的 .sav。dplyr 用來挑欄位和分組摘要。knitr 的 kable() 把表排整齊。moments 算偏態和峰度。car 提供 leveneTest() 做變異數同質性檢定。t 檢定本身用 R 內建的 t.test()。

# 若尚未安裝 car,先執行 install.packages("car")
library(haven)
library(dplyr)
library(knitr)
library(moments)
library(car)

讀檔與資料整理

read_sav() 把 PISA_tawian2022_trimmed_lab.sav 讀進來。Gender 在 SPSS 裡有數值標籤(1 = Female、2 = Male,另有 5、7、8、9 等遺漏代碼),先用 as.numeric() 拿掉標籤,再用 factor() 只留下 1、2 兩類並給中文名稱,其他代碼會自動變成 NA。PV1MATH 一樣轉成一般數值。

# 讀入 PISA 2022 臺灣樣本
raw <- read_sav("PISA_tawian2022_trimmed_lab.sav")

# 先看 Gender 的數值標籤,確認 1、2 代表什麼
attr(raw$Gender, "labels")
##         Female           Male     Valid Skip Not Applicable        Invalid 
##              1              2              5              7              8 
##    No Response 
##              9
# 只留下性別與數學成績;性別轉成因子(1 = 女生、2 = 男生)
dat <- raw %>%
  transmute(
    gender = factor(as.numeric(Gender), levels = c(1, 2), labels = c("女生", "男生")),
    math   = as.numeric(PV1MATH)
  )

# 確認各組人數與遺漏
table(dat$gender, useNA = "always")
## 
## 女生 男生 <NA> 
## 2780 2819    0
cat("數學成績遺漏:", sum(is.na(dat$math)), "\n")
## 數學成績遺漏: 0
# 只保留兩個變項都有值的學生
dat <- dat %>% filter(!is.na(gender), !is.na(math))
cat("有效樣本:", nrow(dat), "\n")
## 有效樣本: 5599

不同性別的描述統計

group_by(gender) 依性別分組,再用 summarise() 算各組的人數、平均數、標準差、標準誤、中位數、最小值、最大值、偏態和峰度。偏態接近 0 表示左右大致對稱;moments::kurtosis() 算的峰度,常態分布是 3。fmt2() 只負責把數字四捨五入成小數兩位顯示,計算時仍用完整數字。

# 小數兩位的顯示函式(只用來顯示,不拿來計算)
fmt2 <- function(x) sprintf("%.2f", round(as.numeric(x), 2))

# 依性別分組的描述統計
desc <- dat %>%
  group_by(性別 = gender) %>%
  summarise(
    人數 = n(),
    平均數 = mean(math),
    標準差 = sd(math),
    標準誤 = sd(math) / sqrt(n()),
    中位數 = median(math),
    最小值 = min(math),
    最大值 = max(math),
    偏態 = moments::skewness(math),
    峰度 = moments::kurtosis(math)
  )

kable(
  desc %>% mutate(across(-c(性別, 人數), \(x) fmt2(x))),
  caption = "不同性別 PV1MATH 描述統計(小數兩位)"
)
不同性別 PV1MATH 描述統計(小數兩位)
性別 人數 平均數 標準差 標準誤 中位數 最小值 最大值 偏態 峰度
女生 2780 535.84 102.26 1.94 538.56 227.79 821.56 -0.11 2.60
男生 2819 539.78 116.62 2.20 546.54 219.06 917.38 -0.10 2.49
# 取出兩組數字,方便後面引用
f <- desc %>% filter(性別 == "女生")
m <- desc %>% filter(性別 == "男生")

# 兩組變異數比,粗略看變異數差多少
cat("變異數比(男 / 女):", fmt2(m$標準差^2 / f$標準差^2), "\n")
## 變異數比(男 / 女): 1.30

變異數同質性檢定(Levene’s Test)

leveneTest(math ~ gender, data = dat, center = mean) 檢定兩組的變異數是否相等。H0 是兩組變異數相等。center = mean 是以各組平均數為中心,也就是傳統的 Levene 檢定,和 SPSS 預設的結果一致;car 套件預設的 center = median 是 Brown–Forsythe 版本,這裡也一併列出對照。

# Levene 檢定(以平均數為中心,傳統版本,作為主要依據)
lev <- leveneTest(math ~ gender, data = dat, center = mean)
lev
## Levene's Test for Homogeneity of Variance (center = mean)
##         Df F value    Pr(>F)    
## group    1  59.342 1.557e-14 ***
##       5597                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 對照:以中位數為中心(Brown-Forsythe 版本,car 的預設)
leveneTest(math ~ gender, data = dat, center = median)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value    Pr(>F)    
## group    1  57.771 3.432e-14 ***
##       5597                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 取出 F 值、自由度與 p 值
lev_F  <- lev$`F value`[1]
lev_df1 <- lev$Df[1]
lev_df2 <- lev$Df[2]
lev_p  <- lev$`Pr(>F)`[1]

# 依 Levene 結果決定是否假設變異數相等
equal_var <- lev_p >= .05
cat("Levene p 值 =", format.pval(lev_p, digits = 3),
    "→", ifelse(equal_var, "變異數同質,使用 Student's t 檢定",
                            "變異數不同質,使用 Welch's t 檢定"), "\n")
## Levene p 值 = 1.56e-14 → 變異數不同質,使用 Welch's t 檢定

獨立樣本 t 檢定

t.test(math ~ gender, data = dat, var.equal = equal_var) 做獨立樣本 t 檢定。var.equal 直接接上一段 Levene 的判斷:變異數同質就是 TRUE(Student’s t),不同質就是 FALSE(Welch’s t)。alternative = "two.sided" 是雙尾檢定,conf.level = 0.95 是 95% 信賴區間。

R 會依因子順序計算「女生 − 男生」的平均差,所以 t 值是負的表示女生平均比較低。正負號只代表方向,不影響顯著與否。

# 主要結果:依 Levene 結果選擇的 t 檢定
tt <- t.test(math ~ gender, data = dat,
             var.equal = equal_var,
             alternative = "two.sided", conf.level = 0.95)
tt
## 
##  Welch Two Sample t-test
## 
## data:  math by gender
## t = -1.3461, df = 5521.6, p-value = 0.1783
## alternative hypothesis: true difference in means between group 女生 and group 男生 is not equal to 0
## 95 percent confidence interval:
##  -9.688443  1.799944
## sample estimates:
## mean in group 女生 mean in group 男生 
##           535.8361           539.7803
# 對照:另一個版本(只是比較用,不作為回報依據)
t.test(math ~ gender, data = dat, var.equal = !equal_var)
## 
##  Two Sample t-test
## 
## data:  math by gender
## t = -1.3449, df = 5597, p-value = 0.1787
## alternative hypothesis: true difference in means between group 女生 and group 男生 is not equal to 0
## 95 percent confidence interval:
##  -9.693658  1.805158
## sample estimates:
## mean in group 女生 mean in group 男生 
##           535.8361           539.7803
# 效果量 Cohen's d:(男生平均 - 女生平均) / 合併標準差
sp <- sqrt(((f$人數 - 1) * f$標準差^2 + (m$人數 - 1) * m$標準差^2) /
           (f$人數 + m$人數 - 2))
cohen_d <- (m$平均數 - f$平均數) / sp

# 整理要回報的數字(小數兩位)
t_result <- tibble(
  方法 = ifelse(equal_var, "Student's t", "Welch's t"),
  `Levene F` = fmt2(lev_F),
  `Levene p` = ifelse(lev_p < .001, "< .001", fmt2(lev_p)),
  t值 = fmt2(tt$statistic),
  自由度 = fmt2(tt$parameter),
  p值 = fmt2(tt$p.value),
  `平均差(女 − 男)` = fmt2(f$平均數 - m$平均數),
  `95%信賴區間` = paste0("[", fmt2(tt$conf.int[1]), ", ", fmt2(tt$conf.int[2]), "]"),
  `Cohen's d` = fmt2(cohen_d)
)

kable(t_result, caption = "獨立樣本 t 檢定結果(雙尾)")
獨立樣本 t 檢定結果(雙尾)
方法 Levene F Levene p t值 自由度 p值 平均差(女 − 男) 95%信賴區間 Cohen’s d
Welch’s t 59.34 < .001 -1.35 5521.60 0.18 -3.94 [-9.69, 1.80] 0.04

圖表繪製說明

略。

資料分析摘要

有效樣本共 5599 人,沒有遺漏,其中女生 2780 人、男生 2819 人。女生數學平均 535.84 分(SD = 102.26),男生數學平均 539.78 分(SD = 116.62)。兩組偏態分別為 -0.11 和 -0.10,都接近 0,分布大致對稱。

Levene 變異數同質性檢定:F(1, 5597) = 59.34,p < .001(小數兩位為 0.00),達顯著,兩組變異數不同質(男生分數比較分散),所以不能用合併變異數的 t 檢定,改用 Welch’s t 檢定。

Welch’s t 檢定結果:t = -1.35,自由度 df = 5521.60,p 值 = 0.18,大於 .05,未達顯著。女生平均比男生低 3.94 分,平均差的 95% 信賴區間為 [-9.69, 1.80],包含 0。Cohen’s d = 0.04,遠小於 0.2,差距非常小。

完整最終回答

這題想知道臺灣男生與女生的 PISA 數學平均分數是否不同。Gender 是只有兩類的分組變項,PV1MATH 是連續分數,男女是兩群彼此獨立的學生,母體標準差未知,所以使用獨立樣本 t 檢定。虛無假設是男女數學平均相等(H0:μ男 = μ女),對立假設是不相等(H1:μ男 ≠ μ女),採雙尾檢定,α = .05。

PISA 2022 臺灣樣本共 5599 位學生,女生 2780 人,平均 535.84 分(SD = 102.26);男生 2819 人,平均 539.78 分(SD = 116.62)。兩組分布大致對稱,人數也很多,常態的前提沒有明顯問題。

Levene 檢定 F(1, 5597) = 59.34,p < .001,表示兩組變異數不相等,男生的分數比女生更分散,因此改用不假設變異數相等的 Welch’s t 檢定。結果 t(5521.60) = -1.35,p = 0.18,大於 .05,所以不拒絕虛無假設。平均差的 95% 信賴區間 [-9.69, 1.80] 包含 0,Cohen’s d 只有 0.04。

也就是說,臺灣男生的數學平均雖然比女生高約 3.94 分,但這個差距在統計上不顯著,實際上也非常小,不能說臺灣男生和女生的數學平均成績有差異。比較明顯的性別差異反而在「分散程度」:男生的標準差較大,表示男生在高分和低分兩端的人都比較多,女生的分數比較集中。要注意的是,這裡只用了第一個可能值,也沒有使用抽樣權重,所以結果是描述這份樣本;正式推論到全臺灣學生時,還要依 PISA 的建議合併所有可能值(PISA 2022 有 10 個)並加權。