使用tidycensus获取部分邮编女性占比异常为0的技术求助
问题:tidycensus获取邮编人口数据出现零值异常
使用tidycensus收集人口统计数据时,邮编39309、87040、78712的女性占比均为0,同时学士学位占比、年龄占比及人口密度也存在部分零值异常。免费Census API可通过Census官方开发者页面获取。
计算女性占比的代码
library(tidycensus) library(tidyverse) # 创建邮编数据框 zipcode_df <- data.frame(as.character(c(39309, 87040, 78712))) # 重命名列 colnames(zipcode_df)[1] <- "zipcode" print(zipcode_df) # 设置Census API密钥 census_api_key(mycensuskey) # 获取ZCTA的总人口和女性人口数据 population_gender <- get_acs( geography = "zcta", variables = c("total_population" = "B01003_001E", "female_population" = "B01001A_017"), year = 2021, survey = "acs5", output = "wide" ) |> mutate(zipcode = as.character(GEOID)) |> select(zipcode, total_population, female_populationE) |> rename(female_population = female_populationE) # 计算女性占比 percentage_female_population <- population_gender %>% mutate(percentage_female = (female_population / total_population) * 100) %>% select(zipcode, percentage_female) outcome <- zipcode_df |> left_join(percentage_female_population, by = "zipcode")
执行结果
> outcome zipcode percentage_female 1 39309 0 2 87040 0 3 78712 0
原因排查
变量代码错误:
- 你使用的
B01001A_017并非总女性人口数据,而是白人女性65-66岁年龄段的细分变量,这些ZCTA在该细分群体的人口为0,导致计算出的占比为0。 - 变量写法不规范:直接在变量代码后加
E(如B01003_001E)不符合tidycensus的使用习惯,应传入不带后缀的变量代码,由函数自动返回估计值(E)和边际误差(M)列。
- 你使用的
ZCTA与邮编的匹配问题:
少数USPS邮编可能没有对应的Census ZCTA,或ZCTA与邮编范围不完全重合,但这三个邮编均有对应ZCTA,因此不是主要原因。
解决方法
1. 修正女性人口变量
使用总女性人口的汇总变量B01001_026(对应ACS表B01001中的总女性人口行),同时修正变量代码的写法:
population_gender <- get_acs( geography = "zcta", variables = c( total_population = "B01003_001", # 总人口变量,不带E后缀 female_population = "B01001_026" # 总女性人口变量 ), year = 2021, survey = "acs5", output = "wide" ) |> mutate(zipcode = as.character(GEOID)) |> select(zipcode, total_populationE, female_populationE) |> rename( total_population = total_populationE, female_population = female_populationE )
2. 验证ZCTA存在性
如果仍有异常,可先确认目标邮编对应的ZCTA是否存在于Census数据中:
# 获取所有ZCTA的总人口数据 all_zctas <- get_acs(geography = "zcta", variables = "B01003_001", year = 2021) # 检查目标邮编是否在ZCTA列表中 target_zips <- c("39309", "87040", "78712") target_zips %in% all_zctas$GEOID
3. 其他指标的零值处理
对于学士学位、年龄占比等其他指标的零值,同样需要检查变量代码是否正确:
- 学士学位人口可使用
B15003_022至B15003_025(学士及以上学历的各性别汇总),或B15003_021(总学士及以上人口)。 - 年龄占比需确保使用对应年龄组的汇总变量,而非细分到过小群体的变量(避免因数据抑制出现零值)。
内容的提问来源于stack exchange,提问作者Fox in Summer
相关产品推荐
相关产品推荐

