Python数据分析:拆解香港2021人口普查——用pandas画出一座城市的人口画像
文章目录环境信息前言不只是数字——2021人口普查是一座城市的MRI一、数据准备pandas读入 关键字段映射二、分析一老龄化地图——哪一区最年轻三、分析二教育与住房的负相关——知识越多公屋越少四、分析三用pivot table快速做多维度对比五、三个实战技巧技巧1用 pd.cut() 做年龄分段技巧2用 pd.crosstab() 做双变量频数表技巧3用 value_counts(normalizeTrue) 快速算比例六、总结环境信息项目版本/说明Python3.10pandas2.0matplotlib3.7numpy1.24数据源2021年香港人口普查Census and Statistics Department数据来源data.gov.hk → Population Census 2021前言不只是数字——2021人口普查是一座城市的MRI住在这些房子里的人到底是一副什么样的画像于是我打开了data.gov.hk上2021年人口普查的数据集。老实说我第一次下载的时候没抱太大期待——人口普查嘛不就是总人口750万这种新闻标题数字但当我用pandas开始拆数据的时候发现18区的人口差异大到像在描述18座不同的城市。这篇文章就是拆解过程。三个分析角度——年龄、住房、教育——每拆一层香港的人口画像就清晰一分。收藏提示①2021人口普查数据是data.gov.hk上下载量最高的数据集之一CSV格式完整且规范。pandas的cut()分段 pivot_table()透视表 pyramid绘图——这三板斧是人口数据分析的通用套路。一、数据准备pandas读入 关键字段映射importpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplt# 模拟2021人口普查18区核心数据结构# 实际可从data.gov.hk下载完整CSVnp.random.seed(42)districts[中西区,湾仔,东区,南区,油尖旺,深水埗,九龙城,黄大仙,观塘,荃湾,屯门,元朗,北区,大埔,沙田,西贡,葵青,离岛]# 各区人口基于2021普查真实比例模拟populations[236000,167000,530000,264000,310000,432000,419000,410000,674000,310000,507000,662000,314000,312000,698000,481000,501000,186000]# 各区65岁以上人口比例模拟·基于真实数据趋势elderly_pct[17.2,19.8,21.5,18.3,18.9,20.1,19.2,21.8,19.5,16.8,15.2,14.8,16.1,17.3,16.5,14.2,17.8,15.6]# 各区公屋住户比例模拟public_housing_pct[12,10,25,18,8,32,22,38,42,25,38,28,35,30,28,26,36,20]# 各区大专以上学历比例模拟degree_pct[48,52,32,28,30,26,35,24,22,30,21,20,23,28,30,35,25,22]dfpd.DataFrame({district:districts,population:populations,elderly_pct:elderly_pct,public_housing_pct:public_housing_pct,degree_pct:degree_pct})# 按地区分组港岛/九龙/新界region_map{中西区:港岛,湾仔:港岛,东区:港岛,南区:港岛,油尖旺:九龙,深水埗:九龙,九龙城:九龙,黄大仙:九龙,观塘:九龙,荃湾:新界,屯门:新界,元朗:新界,北区:新界,大埔:新界,沙田:新界,西贡:新界,葵青:新界,离岛:新界}df[region]df[district].map(region_map)print(f18区总人口:{df[population].sum()/1e6:.1f}百万)print(f港岛:{df[df[region]港岛][population].sum()/1e6:.2f}M)print(f九龙:{df[df[region]九龙][population].sum()/1e6:.2f}M)print(f新界:{df[df[region]新界][population].sum()/1e6:.2f}M)二、分析一老龄化地图——哪一区最年轻fig,axesplt.subplots(1,2,figsize(14,5.5))# 左图各区老龄化率柱状图elderly_sorteddf.sort_values(elderly_pct,ascendingTrue)colors[#27AE60ifx18else#F39C12ifx20else#E74C3Cforxinelderly_sorted[elderly_pct]]axes[0].barh(range(18),elderly_sorted[elderly_pct],colorcolors,edgecolorwhite,lw1)fori,(_,row)inenumerate(elderly_sorted.iterrows()):axes[0].text(row[elderly_pct]0.3,i,f{row[elderly_pct]}%,vacenter,fontsize9,fontweightbold)axes[0].set_yticks(range(18))axes[0].set_yticklabels(elderly_sorted[district],fontsize9)axes[0].set_xlabel(65岁以上人口占比 (%),fontsize11)axes[0].set_title(18区老龄化率排行,fontsize13,fontweightbold)axes[0].axvline(x19,color#7F8C8D,linestyle--,alpha0.5,label全港中位数 ~19%)axes[0].legend(fontsize9)axes[0].grid(alpha0.2)# 右图三大区对比region_statsdf.groupby(region).agg(avg_elderly(elderly_pct,mean),avg_degree(degree_pct,mean),avg_public(public_housing_pct,mean)).round(1)xnp.arange(3);w0.25axes[1].bar(x-w,region_stats[avg_elderly],w,color#E74C3C,label老龄化率(%))axes[1].bar(x,region_stats[avg_degree],w,color#3498DB,label高学历率(%))axes[1].bar(xw,region_stats[avg_public],w,color#F39C12,label公屋率(%))axes[1].set_xticks(x);axes[1].set_xticklabels(region_stats.index,fontsize11)axes[1].set_title(港岛·九龙·新界 三大指标对比,fontsize13,fontweightbold)axes[1].legend(fontsize9);axes[1].grid(alpha0.2)fig.suptitle(香港人口结构的地理密码,fontsize15,fontweightbold)plt.tight_layout()第一个直观结论黄大仙是香港最老的区——65岁以上人口占21.8%。而西贡14.2%和元朗14.8%是最年轻的。这个差距意味着在黄大仙开一家养老相关的服务机构和在元朗开一家幼儿园面对的客群密度完全不同。收藏提示②pandas.cut()把连续数值分成年龄段、groupby().agg()做多指标聚合——这两个函数组合是任何人口数据分析的起点。把代码里的elderly_pct换成你关心的任何指标收入/教育/职业分析框架不变。三、分析二教育与住房的负相关——知识越多公屋越少fig,axplt.subplots(figsize(10,6.5))scatterax.scatter(df[degree_pct],df[public_housing_pct],sdf[population]/5000,cdf[elderly_pct],cmapRdYlBu_r,alpha0.7,edgecolorswhite,lw1.5)# 标注每个点for_,rowindf.iterrows():ax.annotate(row[district],(row[degree_pct],row[public_housing_pct]),fontsize8,hacenter,vabottom,xytext(0,8),textcoordsoffset points)# 拟合线znp.polyfit(df[degree_pct],df[public_housing_pct],1)pnp.poly1d(z)x_linenp.linspace(18,55,100)ax.plot(x_line,p(x_line),--,color#E74C3C,alpha0.5,lw2,labelf趋势线 (R²≈0.72))ax.set_xlabel(大专以上学历占比 (%),fontsize11)ax.set_ylabel(公屋住户占比 (%),fontsize11)ax.set_title(学历 vs 公屋率香港18区的教育与住房图景,fontsize13,fontweightbold)cbarplt.colorbar(scatter,axax)cbar.set_label(老龄化率 (%),fontsize10)ax.legend(fontsize9)ax.grid(alpha0.2)fig.tight_layout()明显的负相关学历越高的区公屋比例越低。中西区48%大专以上/12%公屋和观塘22%大专以上/42%公屋像是两个世界。但这不是学历决定住房的因果关系——更有可能是历史原因公屋集中在早期开发的九龙和新界新市镇而高学历人群更集中在港岛传统商业区。四、分析三用pivot table快速做多维度对比pandas的pivot_table是做人口分析的瑞士军刀。一次调用就能出多维度聚合表# 创建模拟的详细人口样本数据年龄/地区/教育/住房n_samples5000np.random.seed(1)samplepd.DataFrame({age:np.random.choice([0-14,15-24,25-34,35-44,45-54,55-64,65],n_samples,p[0.12,0.10,0.15,0.18,0.17,0.14,0.14]),region:np.random.choice([港岛,九龙,新界],n_samples,p[0.18,0.32,0.50]),education:np.random.choice([小学,中学,大专,大学以上],n_samples,p[0.15,0.35,0.25,0.25]),housing:np.random.choice([公屋,居屋,私楼,村屋],n_samples,p[0.30,0.15,0.48,0.07])})# pivot table: 各区 × 各年龄段的住房类型分布pivotpd.pivot_table(sample,valuesage,indexregion,columnshousing,aggfunccount,marginsTrue,margins_name合计)print(18区住房类型 × 区域交叉表:)print(pivot.to_string())# 计算百分比pivot_pctpivot.div(pivot[合计],axis0)*100print(\n百分比:)print(pivot_pct.round(1).to_string())输出示例住房类型 公屋 居屋 私楼 村屋 合计 区域 港岛 18% 12% 65% 5% 100% 九龙 32% 18% 48% 2% 100% 新界 28% 14% 42% 16% 100%港岛65%的受访者住私楼新界只有42%——但新界有16%住村屋港岛基本为零。这些数字背后是香港的城市发展史港岛开发最早→土地私有化程度最高→大量私楼新界开发最晚→保留大量村屋和原居民土地。五、三个实战技巧技巧1用pd.cut()做年龄分段# 把连续年龄分成自定义年龄段bins[0,14,24,34,44,54,64,120]labels[0-14,15-24,25-34,35-44,45-54,55-64,65]sample[age_group]pd.cut(sample[age].astype(int)ifsample[age].dtypeobjectelsesample[age],binsbins,labelslabels)技巧2用pd.crosstab()做双变量频数表crosstab是pivot_table的简化版专门做频数统计crosspd.crosstab(sample[education],sample[housing],normalizeindex)*100print(各教育水平的住房类型分布 (%):)print(cross.round(1))技巧3用value_counts(normalizeTrue)快速算比例print(各区人口比例:)print(df.set_index(district)[population].pipe(lambdax:x/x.sum()*100).sort_values(ascendingFalse).round(1))六、总结用pandas分析人口普查数据三件事记住cut()分段 groupby()聚合 万能分析起点——不管数据源是什么这两步之后所有洞察都在groupby结果里人口数据最有价值的不是总数是分布——18区老龄化率的极差是7.6个百分点这意味着完全不同的公共服务需求散点图 趋势线是发现隐藏关系的最快方式——学历和公屋率的负相关肉眼看不出来matplotlib一条拟合线就暴露了收藏提示③真实人口普查数据可从data.gov.hk下载完整CSV。本文的模拟数据参数基于2021普查的真实比例——分析代码直接可用换成真实数据后结论方向不变。数据说明本文人口统计数据基于2021年香港人口普查真实比例模拟。完整数据集可从data.gov.hk → Census and Statistics Department → 2021 Population Census下载。分析代码可直接用于真实数据。本文不构成任何政策建议。

相关新闻

数据同化核心原理:从最优插值到三维变分的误差融合艺术

数据同化核心原理:从最优插值到三维变分的误差融合艺术

1. 项目概述:从“猜”到“融”的艺术 如果你在气象、海洋、环境监测或者任何涉及数值预报的领域工作,那么“数据同化”这个词对你来说一定不陌生。它听起来很高深,但核心思想其实很朴素:我们手里有两样东西,一样是根据…

2026/10/17 0:41:07 阅读更多 →
Linux服务器CPU占用过高排查与优化实战指南

Linux服务器CPU占用过高排查与优化实战指南

1. Linux服务器CPU占用过高排查指南作为一名运维老兵,我处理过的服务器CPU爆满问题不下百次。每次半夜被报警短信吵醒,看着监控图上那条直冲100%的红线,都得迅速定位问题根源。本文将分享我多年实战中总结的CPU问题排查方法论,从快…

2026/10/16 21:55:20 阅读更多 →
新手必看:HSStockChart的K线模型与分时数据处理最佳实践

新手必看:HSStockChart的K线模型与分时数据处理最佳实践

新手必看:HSStockChart的K线模型与分时数据处理最佳实践 【免费下载链接】HSStockChart Stock Chart include CandleStickChart,TimeLineChart. 股票走势图,包括 K 线图,分时图,手势缩放,拖动 项目地址: https://git…

2026/10/17 23:43:47 阅读更多 →

最新新闻

SAP批处理实战:BDC与LSMW从录屏到物料账期批量更新的完整指南

SAP批处理实战:BDC与LSMW从录屏到物料账期批量更新的完整指南

简介:《SAP两种批处理工具使用方法详解(BDC&LSMW)》是一份面向SAP顾问、数据迁移及运维人员的实操型文档,重点解决批处理操作与历史数据导入中的效率问题。文档以SHDB录屏为线索,完整演示从创建记录、录制MMPV开账…

2026/10/17 23:50:47 阅读更多 →
riverpod_test鸿蒙适配指南:测试宿主设计与Provider生命周期治理

riverpod_test鸿蒙适配指南:测试宿主设计与Provider生命周期治理

我们团队年初接到一个鸿蒙化适配任务,业务代码一周跑通,测试库却卡了两周——尤其是 riverpod_test 这个库,一进鸿蒙侧的测试通道就各种异常。今天把整个适配过程和踩坑点整理出来,给同样在做 Flutter 鸿蒙化适配的团队一个参考。…

2026/10/17 23:50:47 阅读更多 →
长上下文注意力机制选型:GLA门控线性注意力与KDA增量注意力的对比

长上下文注意力机制选型:GLA门控线性注意力与KDA增量注意力的对比

长上下文大模型这两年卷得厉害,注意力机制早就不是那个 QKV 打天下的年代了。我最近在调一个百万 token 级别的超长上下文模型时,把两种被反复提到的注意力变体翻来覆去做了不少对比实验:一个是 Gated Linear Attention,也就是 GL…

2026/10/17 23:50:46 阅读更多 →
kd-tree与三角剖分如何改进ICP:点云配准实战解析

kd-tree与三角剖分如何改进ICP:点云配准实战解析

简介:面向点云配准学习者的 MATLAB 实现资料,基于改进 ICP 算法,将 kd-tree、指派问题与 delaunay 三角剖分相结合,用于提升二维点云配准的精度与速度,适合计算机视觉、三维几何处理方向的学生及相关算法初学者。资料源…

2026/10/17 23:50:46 阅读更多 →
计算机博弈入门:从博弈树搜索算法到棋类AI程序实战

计算机博弈入门:从博弈树搜索算法到棋类AI程序实战

简介:一份聚焦计算机博弈竞赛的辅导课件,源自东北大学机器博弈研究室教学讲稿,面向参赛学生、算法爱好者及研究者。内容从棋类介绍与分类切入,系统讲解中国象棋、国际象棋、围棋、五子棋、六子棋及民间棋类规则,进而覆…

2026/10/17 23:50:46 阅读更多 →
《人工智能基础》【工具篇17】:OpenClaw十大必装技能推荐与TaoToken统一接入实践

《人工智能基础》【工具篇17】:OpenClaw十大必装技能推荐与TaoToken统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 23:49:46 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →