You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

原因排查

  1. 变量代码错误:

    • 你使用的B01001A_017并非总女性人口数据,而是白人女性65-66岁年龄段的细分变量,这些ZCTA在该细分群体的人口为0,导致计算出的占比为0。
    • 变量写法不规范:直接在变量代码后加E(如B01003_001E)不符合tidycensus的使用习惯,应传入不带后缀的变量代码,由函数自动返回估计值(E)和边际误差(M)列。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:22:16