我會使用獨立樣本 t 檢定(independent sample t-test),因為這題要比較兩群「不同的人」(男生、女生)在一個連續變項(PV1MATH)上的平均數。每個學生只屬於其中一組,兩組之間沒有配對關係,所以不是成對樣本 t 檢定;母體標準差也不知道,只能用樣本去估,所以用 t 檢定。
研究假設如下。題目只問「是否有顯著差異」,沒有說哪一組比較高,所以用雙尾檢定,顯著水準 α = .05:
獨立樣本 t 檢定有兩個版本,要先看 Levene 變異數同質性檢定再決定:
Gender 是類別變項(名義尺度),1 = Female、2 = Male,只有兩個類別,剛好當作分組變項。它不能算平均數,只能看各組人數。
PV1MATH 是 PISA 的數學成績,是用試題反應理論估出來的第 1 個「可能值」(plausible value),是可以有小數的連續分數,量尺以 OECD 平均約 500、標準差約 100 來定,可以算平均數和標準差,適合當依變項。
這兩個變項的特性決定了方法:「一個兩類別的分組變項 + 一個連續依變項,兩組是不同的人」,就對應到獨立樣本 t 檢定。另外 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 描述統計(小數兩位)"
)
| 性別 | 人數 | 平均數 | 標準差 | 標準誤 | 中位數 | 最小值 | 最大值 | 偏態 | 峰度 |
|---|---|---|---|---|---|---|---|---|---|
| 女生 | 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
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.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 檢定結果(雙尾)")
| 方法 | 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 個)並加權。