当前位置: 首页 > news >正文

Python 数据分析实战:2001-2024 全国婚姻登记数据可视化(时序趋势 + 地域地图 + 动态时间轮播)

一、项目简介

本次基于全国 31 省市 2001-2024 年结婚、离婚登记数据集,完整完成数据读取、数据清洗重塑、时序趋势分析、地域空间可视化、动态交互图表全流程实战。 工具栈:pandas数据处理、matplotlib静态绘图、pyecharts交互式地图 / 玫瑰饼图 / 时间线轮播图。 适合数据分析课程作业、Python 可视化练手项目,完整代码可直接运行。

环境依赖安装

bash

运行

pip install pandas numpy matplotlib pyecharts

二、阶段一:数据初探与质量体检

1. 导入基础库与全局配置

python

运行

import pandas as pd import numpy as np import matplotlib.pyplot as plt # 解决matplotlib中文乱码 plt.rcParams['font.sans-serif'] =['SimHei'] # 解决负号显示异常 plt.rcParams['axes.unicode_minus']=False # 屏蔽无关警告 import warnings warnings.filterwarnings('ignore')

2. 读取结婚、离婚原始数据

原始数据为宽表结构:每行代表省份,每一列对应一个年份登记数量。

python

运行

# 读取结婚数据 merrige_df=pd.read_csv('结婚登记(万对).csv',encoding='gbk') # 读取离婚数据 divorce_df=pd.read_csv('离婚登记(万对).csv',encoding='gbk') # 查看前5行 merrige_df.head()

数据集说明:

  • 共 31 行:全国 31 个省、自治区、直辖市;
  • 25 列:地区名称 + 2001~2024 共 24 个年份登记数据;
  • 数值列无缺失值,数据类型统一为 float64,无需缺失填充。

3. 数据基础信息探查

python

运行

# 查看字段、行数、数据类型 divorce_df.info() # 统计均值、标准差、最大最小值等分布指标 divorce_df.describe()

数据分析结论:

  1. 各省婚姻登记量差距巨大,最大值超 35 万对,最低仅 0.68 万对;
  2. 标准差数值偏高,人口基数差异造成地域分化明显。

4. 原始宽表预览折线图

直接对原始宽表绘图,直观观察各省份历年波动:

python

运行

plt.figure(figsize=(20,6)) merrige_df.plot(kind='line',title="每年结婚登记地区分布") plt.xticks(merrige_df.index,merrige_df['地区'],rotation=45) plt.show()

存在缺陷:宽表结构无法按年份分组统计,可读性差,必须通过melt完成宽表转长表标准化。

三、阶段二:数据清洗重塑(核心步骤)

1. 结婚数据宽表转长表

python

运行

merrige_df=merrige_df.melt( id_vars=['地区'], # 保留不变维度 var_name='年份', # 年份列重命名 value_name='结婚登记数' # 登记数值列命名 ).sort_values(by='年份').reset_index(drop=True) merrige_df.head()

转换后标准结构:地区、年份、结婚登记数,一行代表某省份单一年份数据。

2. 离婚数据同步转换

python

运行

divorce_df=divorce_df.melt( id_vars=['地区'], var_name='年份', value_name='离婚登记数' ).sort_values(by='年份').reset_index(drop=True) divorce_df.head()

3. 结婚、离婚数据合并

python

运行

# 合并两套数据 merrige_df['离婚登记数']=divorce_df['离婚登记数'] df=merrige_df.copy() df.head()

最终数据集字段:地区、年份、结婚登记数、离婚登记数,后续全部分析基于该表。

四、阶段三:时间维度趋势与拐点分析

1. 全国历年结婚离婚总量趋势

按年份聚合全国总登记量,绘制对比折线图,观察长期变化趋势:

python

运行

# 按年份分组求和 year_count=df.groupby('年份')[['结婚登记数','离婚登记数']].sum().reset_index() # 绘图 plt.figure(figsize=(16,6)) plt.plot(year_count['年份'],year_count['结婚登记数'],marker='*',label='结婚登记') plt.plot(year_count['年份'],year_count['离婚登记数'],marker='o',label='离婚登记') plt.title("2001-2024每年结婚和离婚登记总量(万对)") plt.legend() plt.show()

趋势解读:

  1. 2010-2019 年全国结婚登记维持高位,2020 年后持续下滑;
  2. 离婚登记量长期缓慢上升,近年增速放缓;
  3. 结婚 / 离婚比值逐年下降,婚姻稳定性持续走低。

2. 各省份结婚离婚比率柱状图

计算各省 24 年总结婚数 / 总离婚数,比值越高代表当地离婚占比越低:

python

运行

# 分组聚合计算比率 ratio=df.groupby('地区')['结婚登记数'].sum()/df.groupby('地区')['离婚登记数'].sum() # 绘制柱状图 plt.figure(figsize=(16,6)) ratio.plot(kind='bar',title="各地区结婚离婚比率") plt.xticks(rotation=45) plt.grid(axis='y') plt.show()

五、阶段四:空间维度地域差异可视化(Pyecharts 交互式图表)

前置配置:修复国内 CDN 空白问题

python

运行

from pyecharts.charts import Map,Pie,Bar,Timeline from pyecharts import options as opts from pyecharts.globals import CurrentConfig from pyecharts.commons.utils import JsCode # 国内环境必须替换CDN,否则导出HTML无图表 CurrentConfig.ONLINE_HOST = "https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/"

1. 全国累计结婚登记地图

python

运行

# 按地区聚合总结婚数 provice_marrige=df.groupby('地区')['结婚登记数'].sum() # 组装地图所需数据格式 map_data=[list(z) for z in zip(provice_marrige.index.astype(str), provice_marrige)] # 绘制地图 m=( Map() .add('累计结婚登记数(万对)',map_data) .set_global_opts( title_opts=opts.TitleOpts(title="全国各地区累计结婚登记数"), visualmap_opts=opts.VisualMapOpts(is_show=True,max_=1800,min_=10) ) ) m.render_notebook() # 导出独立html文件 # m.render("结婚登记地图.html")

地图结论:广东、山东、江苏等人口大省结婚总量遥遥领先;西部偏远省份登记量偏低。

2. 全国累计离婚登记地图

python

运行

provice_divorce=df.groupby('地区')['离婚登记数'].sum() map_data=[list(z) for z in zip(provice_divorce.index.astype(str), provice_divorce)] m=( Map() .add('累计离婚登记数(万对)',map_data) .set_global_opts( title_opts=opts.TitleOpts(title="全国各地区累计离婚登记数"), visualmap_opts=opts.VisualMapOpts(is_show=True,max_=1800, min_=10) ) ) m.render_notebook()

3. 结婚登记 TOP10 省份玫瑰饼图

python

运行

# 降序取前十省份 provice_marrige=df.groupby('地区')['结婚登记数'].sum().sort_values(ascending=False).head(10) pie_data=[list(z) for z in zip(provice_marrige.index.astype(str),provice_marrige)] pie=( Pie() .add('结婚登记前十省份', pie_data,radius=['25%','60%'],rosetype='radius') .set_global_opts(title_opts=opts.TitleOpts(title="结婚人数前十省份玫瑰图")) ) pie.render_notebook()

4. 结婚登记最少 10 省份玫瑰饼图

python

运行

provice_marrige=df.groupby('地区')['结婚登记数'].sum().sort_values(ascending=True).head(10) pie_data=[list(z) for z in zip(provice_marrige.index.astype(str),provice_marrige)] pie=( Pie() .add('结婚登记最少十省份', pie_data,radius=['25%','60%'],rosetype='radius') .set_global_opts(title_opts=opts.TitleOpts(title="结婚人数最少前十省份玫瑰图")) ) pie.render_notebook()

5. 离婚登记 TOP10 省份玫瑰饼图

python

运行

provice_divorce=df.groupby('地区')['离婚登记数'].sum().sort_values(ascending=False).head(10) pie_data=[list(z) for z in zip(provice_divorce.index.astype(str),provice_divorce)] pie=( Pie() .add('离婚登记前十省份', pie_data,radius=['25%','60%'],rosetype='radius') .set_global_opts(title_opts=opts.TitleOpts(title="离婚人数前十省份玫瑰图")) ) pie.render_notebook()

6. 年度动态轮播横向柱状图(Timeline 时间线)

实现 2001-2024 逐年省份结婚排行,自动轮播切换年份,交互式动态图表:

python

运行

# 获取全部年份列表 year_list=df["年份"].unique().tolist() # 自定义循环配色 color_js = JsCode(""" function(params){ let c=['#ff4757','#ffa502','#fffa65','#2ed573','#1e90ff','#3742fa','#a55eea']; return c[params.dataIndex%c.length]; } """) # 初始化时间线容器 timeline_final = Timeline(init_opts=opts.InitOpts(width="1600px", height="850px")) # 循环年份生成柱状图 for year in year_list: year_df = df[df['年份']==year] year_df = year_df.sort_values('结婚登记数',ascending=True) province = year_df['地区'].tolist() count = year_df['结婚登记数'].tolist() bar=( Bar() .add_xaxis(province) .add_yaxis("结婚登记数",count, itemstyle_opts=opts.ItemStyleOpts(color=color_js,opacity=0.85), label_opts=opts.LabelOpts(is_show=True,position="right")) .reversal_axis() # 横向柱状图 .set_global_opts( title_opts=opts.TitleOpts(title=f"{year}年中国结婚登记数省份排行"), xaxis_opts=opts.AxisOpts(name="登记万对"), yaxis_opts=opts.AxisOpts(name="省份"), tooltip_opts=opts.TooltipOpts(trigger="axis") ) ) timeline_final.add(bar,str(year)) # 配置时间轮播参数 timeline_final.add_schema( is_auto_play=True, is_loop_play=True, play_interval=800, pos_left="center", width="95%" ) # 导出网页文件 timeline_final.render("结婚登记数动态排行.html") timeline_final.render_notebook()

六、项目整体分析结论

1. 数据处理技术总结

  1. 时序宽表必须通过melt转为长表,才能完成分组、聚合、统计;
  2. matplotlib适合快速静态趋势对比,pyecharts擅长交互式地图、动态时间轮播,适合生成可视化报告;
  3. 国内使用 pyecharts 务必替换 CDN 地址,否则导出 HTML 图表空白无法展示。

2. 业务分析结论

  1. 时间趋势:全国结婚登记规模持续下滑,离婚量长期缓慢上涨,婚恋稳定性逐年下降;
  2. 地域差异:人口大省结婚、离婚总量全国领先,西藏、青海、宁夏、海南等省份登记规模垫底;
  3. 区域婚恋特征:东部发达省份结婚离婚比值更低,离婚相对占比更高;中西部省份婚姻稳定性相对更高;
  4. 关键拐点:2020 年后全国结婚数据出现明显下滑,人口结构、婚恋观念变化是核心影响因素。

七、项目拓展优化方向

  1. 引入常住人口数据,计算千人结婚率、千人离婚率,消除人口基数干扰;
  2. 新增年度离婚率热力地图,直观展示分年份区域离婚差异;
  3. 增加多图表联动,实现地图点击跳转对应年份排行;
  4. 基于年份数据做简单线性预测,预判未来婚姻登记变化趋势。

八、常见报错解决

  1. matplotlib 中文方框乱码:必须配置SimHei黑体字体;
  2. pyecharts 导出 HTML 空白:替换国内 CDN 地址;
  3. melt 合并后数据错位:转换长表后统一按年份排序再合并;
  4. 地图省份无数据:省份名称必须与标准行政区名称完全一致。
http://www.cnnetsun.cn/news/3014505.html

相关文章:

  • 夏日胶原保卫战!三招锁住肌肤弹力,越热越要补!
  • 移动Linux开发调试利器:JTAG与i.MX处理器实战指南
  • 从拉菲看二次元手游角色养成:情感联结与社区生态构建
  • 小程序毕设选题推荐:基于微信小程序的高校社团考勤与活动发布系统设计与实现 SpringBoot 框架下校园社团资源管理系统设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 一站式考证+就业机构——君展教育
  • 告别人工质检漏洞,AI相机筑牢服装标签品控防线
  • 微信小程序毕设项目:基于 SpringBoot 的儿童疫苗接种数据管理系统设计与实现 数字化妇幼背景下儿童疫苗服务小程序设计与实现(源码+文档,讲解,调试运行,定制等)
  • 大模型应用-筑基期【02:大模型核心概念入门】
  • 外部区域特殊拉格朗日方程Dirichlet问题:渐近行为与数值求解
  • 终极语音修复指南:5个简单步骤让任何音频重获清晰
  • GraphRAG 实战:从工具接入到项目提效
  • 我开了 3 年美容院,终于把收银系统的账算清楚了
  • 模型微调方法:从通用到专用为什么 Text2SQL 准确率如此重要?
  • 成都/攀枝花水泥厂回转窑硬齿面减速机怎么选型?符合JC/T878.3标准
  • 在树莓派的Hailo8L芯片部署自己的YOLOV8模型
  • 大模型应用-筑基期【06:Prompt调试与迭代方法】
  • 工业机器人自动化改造实战:CNC 上下料场景技术选型与落地指南
  • PCF80空间单细胞蛋白组适合做什么?从肿瘤微环境到治疗响应研究
  • 2026 多款免费去水印工具稳定性打分,自媒体素材采集参考|博主自用无广实测
  • 【计算机毕设】基于Spring Boot的生产设备保养与维修智能管理系统的设计与实现
  • 基于51单片机智能电表插座交流电压流Proteus仿真资料设计24-392-1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_可以扫码
  • 云腾五洲TE100边缘计算盒子:工业物联网的智能中枢,一台更比六台强!
  • OpenAI有6650亿美元表外负债,企业如何采取多模型策略
  • 数位DP:从“穷举数字”到“逐位拆解”
  • Calico IPIP CrossSubnet 与 IPIP 默认模式对比模式介
  • 货运物流系统源码:支持多仓库管理
  • 如何用AI防爆摄像机实现港口船舶零漏报偏航监测?
  • 超长型材拉弯加工,实测数据与效果差异几何?
  • 航空DIC变形测量技术
  • Claude Code 连续修复后台 Agent,开发团队该补哪些防线