社会调查数据分析
社会调查数据分析要让图表、相关和回归回答调查原先提出的问题,同时保留抽样设计。若不同年级抽取比例不同,直接把所有回答合并成普通独立样本,可能把年级人数较少但抽得较多的一组放大。
先核对每一列记录
仍看虚构的高中生周活动时长调查。一行代表一名学生;年级是类别,周活动时长是非负数值,成绩若收集还要说明量表和取得方式。先检查重复学号、时长是否超过合理的七天总小时、0 与未回答是否混淆。类别计数可用条形图,时长分布可用直方图和箱线图;比较时先写出分母。例如“参加者占比”若把拒答当作未参加,比例就会被压低。
下面是可以在 R 中独立运行的微型演示数据;它用每个年级 4 人展示加权计算,和分层随机抽样中 60、40、20 人的数值例子不是同一份实际样本。设三个年级总体人数为 600、400、200,演示样本各 4 人。每条记录的设计权重依次为 。年级均值依次是 5、6、8 小时,因此总体均值估计仍是 小时。
grade <- rep(c("G1", "G2", "G3"), each = 4)
hours <- c(4, 5, 5, 6, 4, 6, 6, 8, 5, 7, 9, 11)
score <- c(60, 62, 65, 64, 61, 64, 67, 68, 62, 65, 69, 70)
N_h <- c(G1 = 600, G2 = 400, G3 = 200)
dat <- data.frame(grade, hours, score)
dat$weight <- unname(N_h[dat$grade]) / 4
tapply(dat$hours, dat$grade, mean) # 5, 6, 8
weighted.mean(dat$hours, dat$weight) # 5.833333
plot(dat$hours, dat$score, pch = 19,
xlab = "每周活动时长(小时)", ylab = "分数")
cor(dat$hours, dat$score)
fit <- lm(score ~ hours, data = dat, weights = weight)
coef(fit)weighted.mean 使用每人代表的总体人数,把四位一年级学生各看作代表 150 人,而四位三年级学生各代表 50 人。代码里的相关系数 cor 和回归系数 lm 只是这 12 条演示记录的描述:小时和分数即便呈正相关,也不能说明参加活动提高成绩。家庭背景、课程安排等可能同时影响两者;还有测量误差和时间顺序问题。
相关、回归与调查设计
散点图先检查一两个极端点是否主导趋势。相关系数度量线性配对关系;最小二乘法与线性模型给出拟合直线,残差分析检查曲线性与异方差。若自变量是类别,需以明确的基准组编码;若响应是“是否参加”,可考虑Logistic回归。这些模型能描述条件关系,但因果解释还需要研究设计和论证。
上例用设计权重进行加权拟合,lm 输出的默认标准误不会自动处理分层、整群及无回答调整,不能当作正式调查的设计标准误。正式推断应使用能声明层、初级抽样单位和权重的复杂抽样方法,并在报告中写出采用的方差估计。若样本量仅十余人,也不宜把图形中的每一段弯曲都解释成稳定规律。
多个变量时先区分任务
有已知标签、想为新对象预测类别,是判别分析等监督方法的问题;没有标签、只想探索记录是否形成相似组,是聚类分析。两者都不能替代抽样代表性:即使模型在样本内分组清楚,样本框外的人仍可能分布不同。社会调查报告应从描述性结果开始,再逐层说明加权、模型和局限。