Python 数据分析实战|2001-2024 全国婚姻登记数据完整挖掘(Pandas+Matplotlib+Pyecharts)
一、前言
大家好,本文分享大一数据分析课程完整实战项目:基于国家统计局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
更多推荐
所有评论(0)