一、前言
大家好,本文分享大一数据分析课程完整实战项目:基于国家统计局2001-2024 全国 31 省份结婚、离婚登记面板数据,从数据清洗、宽表转长表、时序趋势、地域空间可视化、离结比深度分析、动态时间轮播图全流程落地,完整覆盖Pandas数据预处理、Matplotlib静态绘图、Pyecharts交互式地图 / 玫瑰图 / Timeline 动态排行,适合数据分析入门练手、课程作业、课程设计参考。
项目基础信息
- 适用人群:计算机 / 大数据 / 经管大一学生
- 技术栈:Python Pandas / Matplotlib / Pyecharts
- 数据来源:国家统计局公开分省婚姻登记数据
- 数据范围:2001-2024 年 31 省结婚、离婚登记(单位:万对)
- 项目周期:4 学时课堂 + 课外自主实践
- 核心能力点:宽长表转换
melt、分组聚合、时空多维分析、交互式地理可视化、动态时序图表
二、项目背景与分析目标
婚姻登记数据是反映人口结构、社会观念、经济发展的核心 “社会晴雨表”。通过 24 年分省数据,我们完成三层目标:
- 技能目标:熟练掌握 Pandas 数据清洗、melt 宽表转长表、groupby 分组聚合;掌握静态 + 动态双可视化方案。
- 思维目标:建立时间 + 空间二维分析框架,挖掘婚姻数据长期趋势、地域差异拐点。
- 拓展目标:结合社会学、经济学交叉解读数据,用数据解读当代婚姻变迁。
三、数据集说明
1. 文件结构
两份 CSV 宽表文件:
结婚登记(万对).csv:行 = 省份,列 = 2001-2024 年份,数值为当年结婚对数离婚登记(万对).csv:结构同上,数值为当年离婚对数
2. 数据特征
- 31 个省 / 自治区 / 直辖市,无缺失值,全部为浮点数值
- 原生宽表结构,不利于时序分组,必须通过
melt逆透视转为长表才能分析 - 字段:地区、2001 年~2024 年共 24 个年份数值列
四、完整代码分步实现
步骤 1:环境导入与全局配置
解决中文乱码、负号显示、过滤警告
python
运行
import numpy as np import matplotlib.pyplot as plt import pandas as pd import warnings warnings.filterwarnings('ignore') # Matplotlib中文显示配置 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False步骤 2:读取数据 + 数据初探(质量体检)
读取两份 CSV,查看样本、数据结构、描述性统计
python
运行
# 读取数据 marriage_df = pd.read_csv('结婚登记(万对).csv', encoding='gbk') divorce_df = pd.read_csv('离婚登记(万对).csv', encoding='gbk') # 查看前5行样本 print("结婚数据预览:") print(marriage_df.head()) # 查看数据类型、缺失值 print("\n数据信息:") print(marriage_df.info()) # 描述性统计(均值、极值、分位数) print("\n离婚数据统计分布:") print(divorce_df.describe()) # 基础静态折线图:各省份历年结婚/离婚分布 plt.figure(figsize=(20,6)) marriage_df.plot(kind='line', title="各地区历年结婚登记分布") plt.xticks(marriage_df.index, marriage_df['地区'], rotation=45) plt.show() plt.figure(figsize=(20,6)) divorce_df.plot(kind='line', title="各地区历年离婚登记分布") plt.xticks(divorce_df.index, divorce_df['地区'], rotation=45) plt.show()数据体检结论:31 省份无缺失值,数值分布差异巨大;人口大省(河南、山东、广东)登记数远高于西部、东北小型省份,数据存在明显地域分层。
步骤 3:核心预处理 —— 宽表转长表 melt
原生宽表年份为列,无法按年份分组,使用melt逆透视重构数据结构
python
运行
# 结婚宽表转长表 marriage_long = marriage_df.melt( id_vars=['地区'], # 保留不变标识列 var_name='年份', # 原年份列转为“年份”字段 value_name='结婚登记数' # 单元格数值命名 ).sort_values(by='年份').reset_index(drop=True) # 离婚宽表转长表 divorce_long = divorce_df.melt( id_vars=['地区'], var_name='年份', value_name='离婚登记数' ).sort_values(by='年份').reset_index(drop=True) # 合并两张表,统一数据集 df = marriage_long.copy() df['离婚登记数'] = divorce_long['离婚登记数'] print("合并后标准长表:") print(df.head())转换后数据结构:地区、年份、结婚登记数、离婚登记数,一行代表某省某一年婚姻数据,完美适配分组、时序、空间分析。
步骤 4:时间维度趋势分析(全国 + 单省)
4.1 全国历年结婚、离婚总量趋势
python
运行
# 按年份聚合全国总和 year_total = df.groupby('年份')[['结婚登记数','离婚登记数']].sum().reset_index() plt.figure(figsize=(16,6)) plt.plot(year_total['年份'], year_total['结婚登记数'], marker='*', label='结婚登记') plt.plot(year_total['年份'], year_total['离婚登记数'], marker='o', label='离婚登记') plt.title("2001-2024全国每年结婚&离婚登记总量(万对)") plt.legend() plt.xticks(rotation=45) plt.grid(alpha=0.3) plt.show()趋势解读:
- 2013 年全国结婚登记达到历史峰值,此后持续逐年下滑;
- 离婚登记长期稳步上行,2020 年小幅冲高(疫情集中办理),2022 年后回落;
- 一升一降形成剪刀差,婚姻稳定性持续走低。
4.2 单省案例:广西壮族自治区时序分析
python
运行
gx_df = df[df['地区'] == '广西壮族自治区'].groupby('年份')[['结婚登记数','离婚登记数']].sum().reset_index() plt.figure(figsize=(16,6)) plt.plot(gx_df['年份'], gx_df['结婚登记数'], marker='*', label='结婚') plt.plot(gx_df['年份'], gx_df['离婚登记数'], marker='o', label='离婚') plt.title("广西2001-2024结婚离婚登记趋势") plt.legend() plt.xticks(rotation=45) plt.show()4.3 离结比时序 & 分省对比
离结比 = 结婚总数 / 离婚总数,比值越低代表离婚相对越多
python
运行
# 全国年度离结比 year_ratio = df.groupby('年份')['结婚登记数'].sum() / df.groupby('年份')['离婚登记数'].sum() plt.figure(figsize=(12,5)) year_ratio.plot(kind='line', marker='*', title="全国历年离结比变化") plt.grid() plt.show() # 各省份累计离结比柱状图 prov_ratio = df.groupby('地区')['结婚登记数'].sum() / df.groupby('地区')['离婚登记数'].sum() plt.figure(figsize=(16,6)) prov_ratio.plot(kind='bar', title="全国各省累计离结比") plt.xticks(rotation=45) plt.grid(axis='y') plt.show()关键结论:东北三省、京津冀直辖市离结比显著偏低,离婚相对占比更高;西部人口大省离结比更高,婚姻稳定性更强。
步骤 5:空间维度可视化(Pyecharts 地图 + 玫瑰图)
5.1 全国分省累计结婚 / 离婚热力地图
python
运行
from pyecharts.charts import Map from pyecharts import options as opts # 结婚地图 prov_mar = df.groupby('地区')['结婚登记数'].sum() mar_data = [list(z) for z in zip(prov_mar.index.tolist(), prov_mar.values.tolist())] map_mar = ( Map() .add("累计结婚登记(万对)", mar_data, "china") .set_global_opts( title_opts=opts.TitleOpts(title="2001-2024各省累计结婚登记热力图"), visualmap_opts=opts.VisualMapOpts(max_=1000, min_=10) ) ) map_mar.render("各省结婚热力图.html") # 离婚地图 prov_div = df.groupby('地区')['离婚登记数'].sum() div_data = [list(z) for z in zip(prov_div.index.tolist(), prov_div.values.tolist())] map_div = ( Map() .add("累计离婚登记(万对)", div_data, "china") .set_global_opts( title_opts=opts.TitleOpts(title="2001-2024各省累计离婚登记热力图"), visualmap_opts=opts.VisualMapOpts(max_=700, min_=10) ) ) map_div.render("各省离婚热力图.html")5.2 南丁格尔玫瑰图:结婚 TOP10、离婚 TOP10 省份
python
运行
from pyecharts.charts import Pie # 结婚总量前十玫瑰图 top_mar = df.groupby('地区')['结婚登记数'].sum().sort_values(ascending=False).head(10) pie_mar = ( Pie() .add("结婚登记前十", [list(z) for z in zip(top_mar.index, top_mar.values)], radius=["25%", "60%"], rosetype="radius") .set_global_opts(title_opts=opts.TitleOpts("累计结婚登记TOP10省份")) ) pie_mar.render("结婚前十玫瑰图.html") # 离婚总量前十玫瑰图 top_div = df.groupby('地区')['离婚登记数'].sum().sort_values(ascending=False).head(10) pie_div = ( Pie() .add("离婚登记前十", [list(z) for z in zip(top_div.index, top_div.values)], radius=["25%", "60%"], rosetype="radius") .set_global_opts(title_opts=opts.TitleOpts("累计离婚登记TOP10省份")) ) pie_div.render("离婚前十玫瑰图.html")步骤 6:进阶可视化 ——Timeline 动态年份排行榜
实现 2001-2024 每年各省结婚数量动态轮播柱状图,自动播放
python
运行
from pyecharts.charts import Bar, Timeline from pyecharts.globals import CurrentConfig, ThemeType from pyecharts.commons.utils import JsCode # 修复国内CDN空白问题 CurrentConfig.ONLINE_HOST = "https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/" year_list = df["年份"].unique().tolist() # 自定义颜色 color_js = JsCode("""function(params){let c = ['#ff4757','#ffa502','#fffa65','#2ed573','#1e90ff','#3742fa'];return c[params.dataIndex % c.length];}""") timeline = Timeline(init_opts=opts.InitOpts(width="1600px", height="850px")) for year in year_list: year_df = df[df["年份"]==year].sort_values("结婚登记数", ascending=True) bar = ( Bar() .add_xaxis(year_df["地区"].tolist()) .add_yaxis("结婚登记数", year_df["结婚登记数"].tolist(), itemstyle_opts=opts.ItemStyleOpts(color=color_js), label_opts=opts.LabelOpts(is_show=True, position="right")) .reversal_axis() .set_global_opts(title_opts=opts.TitleOpts(f"{year}年各省结婚登记排行")) ) timeline.add(bar, str(year)) # 时间轴自动播放配置 timeline.add_schema( is_auto_play=True, is_loop_play=True, play_interval=800, pos_left="center", width="95%" ) timeline.render("结婚动态年度排行.html")步骤 7:拓展交叉分析思路(课程思考题)
- 相关性验证:引入各省城镇化率、人均 GDP,计算与离结比皮尔逊相关系数,验证 “城镇化越高离婚相对越多” 假设;
- 东北高离结比成因:青年人口持续外流,适婚人口(结婚分母)持续萎缩,离婚存量人口沉淀,直接拉高离结比;
- 政策影响分析:2021 离婚冷静期、2023 疫情补偿性结婚、2024 结婚创新低等政策 / 事件拐点解读。
五、核心数据分析结论
1. 时间维度
- 全国结婚登记 2013 年触顶后连续下跌,2024 年创近 24 年最低;
- 离婚登记长期上行,仅疫情、政策年份短期波动;
- 离结比持续走低,婚姻稳定性整体逐年下降。
2. 空间地域维度
- 人口大省(广东、河南、山东、四川)结婚、离婚总量常年位居全国前列;
- 东部沿海、直辖市、东北三省离结比偏低,离婚相对比例更高;中西部内陆省份婚姻稳定性更强;
- 数据分布符合胡焕庸线特征:线东南婚姻登记总量远高于西北。
3. 社会学解读
- 城市化:城市女性经济独立、婚姻观念多元化,离婚意愿提升;
- 人口结构:晚婚、少子化、青年外流双重挤压结婚基数;
- 社会包容度:社会对离婚接纳度提升,不再单纯维持形式婚姻;
- 经济压力:购房、育儿成本拉高结婚门槛,年轻人推迟或放弃结婚。
六、项目局限性
- 仅使用分省总量数据,无年龄、性别、初婚 / 再婚细分维度;
- 未区分城乡差异,无法细化城镇、农村婚姻分化;
- 缺少人均收入、出生率、房价等外部面板数据深度回归;
- 未区分协议离婚、诉讼离婚,无法分析离婚类型结构。
七、学习总结
本项目完整覆盖数据分析全链路:数据读取→质量体检→宽长表结构重塑→分组聚合→静态可视化→交互式地图 / 动态时序图表→交叉社科解读。
melt是处理年度宽表的万能工具,完美解决多年份列拆解;- Pyecharts 适合地域、动态可视化,输出 HTML 交互式图表,汇报效果远优于静态 Matplotlib;
- 单纯绘图无意义,数据分析核心是数据 + 行业背景交叉解读,本项目结合人口、社会学完成多维挖掘,适合课程作业、数据分析入门练手。
八、完整项目文件清单
plaintext
婚姻登记分析/ ├── 结婚登记(万对).csv ├── 离婚登记(万对).csv ├── 婚姻数据分析.ipynb # 完整代码notebook ├── 各省结婚热力图.html ├── 各省离婚热力图.html ├── 结婚前十玫瑰图.html ├── 离婚前十玫瑰图.html ├── 结婚动态年度排行.html └── 婚姻登记数据分析报告.md标签:#Python 数据分析 #Pandas 实战 #Pyecharts 地图 #婚姻数据挖掘 #大一课程设计 #宽表转长表 melt