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()数据分析结论:
- 各省婚姻登记量差距巨大,最大值超 35 万对,最低仅 0.68 万对;
- 标准差数值偏高,人口基数差异造成地域分化明显。
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()趋势解读:
- 2010-2019 年全国结婚登记维持高位,2020 年后持续下滑;
- 离婚登记量长期缓慢上升,近年增速放缓;
- 结婚 / 离婚比值逐年下降,婚姻稳定性持续走低。
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. 数据处理技术总结
- 时序宽表必须通过
melt转为长表,才能完成分组、聚合、统计; matplotlib适合快速静态趋势对比,pyecharts擅长交互式地图、动态时间轮播,适合生成可视化报告;- 国内使用 pyecharts 务必替换 CDN 地址,否则导出 HTML 图表空白无法展示。
2. 业务分析结论
- 时间趋势:全国结婚登记规模持续下滑,离婚量长期缓慢上涨,婚恋稳定性逐年下降;
- 地域差异:人口大省结婚、离婚总量全国领先,西藏、青海、宁夏、海南等省份登记规模垫底;
- 区域婚恋特征:东部发达省份结婚离婚比值更低,离婚相对占比更高;中西部省份婚姻稳定性相对更高;
- 关键拐点:2020 年后全国结婚数据出现明显下滑,人口结构、婚恋观念变化是核心影响因素。
七、项目拓展优化方向
- 引入常住人口数据,计算千人结婚率、千人离婚率,消除人口基数干扰;
- 新增年度离婚率热力地图,直观展示分年份区域离婚差异;
- 增加多图表联动,实现地图点击跳转对应年份排行;
- 基于年份数据做简单线性预测,预判未来婚姻登记变化趋势。
八、常见报错解决
- matplotlib 中文方框乱码:必须配置
SimHei黑体字体; - pyecharts 导出 HTML 空白:替换国内 CDN 地址;
- melt 合并后数据错位:转换长表后统一按年份排序再合并;
- 地图省份无数据:省份名称必须与标准行政区名称完全一致。
