news 2026/6/26 10:05:46

Python 数据分析实战|2001-2024 全国婚姻登记数据完整挖掘(Pandas+Matplotlib+Pyecharts)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 数据分析实战|2001-2024 全国婚姻登记数据完整挖掘(Pandas+Matplotlib+Pyecharts)

一、前言

大家好,本文分享大一数据分析课程完整实战项目:基于国家统计局2001-2024 全国 31 省份结婚、离婚登记面板数据,从数据清洗、宽表转长表、时序趋势、地域空间可视化、离结比深度分析、动态时间轮播图全流程落地,完整覆盖Pandas数据预处理、Matplotlib静态绘图、Pyecharts交互式地图 / 玫瑰图 / Timeline 动态排行,适合数据分析入门练手、课程作业、课程设计参考。

项目基础信息

  • 适用人群:计算机 / 大数据 / 经管大一学生
  • 技术栈:Python Pandas / Matplotlib / Pyecharts
  • 数据来源:国家统计局公开分省婚姻登记数据
  • 数据范围:2001-2024 年 31 省结婚、离婚登记(单位:万对)
  • 项目周期:4 学时课堂 + 课外自主实践
  • 核心能力点:宽长表转换melt、分组聚合、时空多维分析、交互式地理可视化、动态时序图表

二、项目背景与分析目标

婚姻登记数据是反映人口结构、社会观念、经济发展的核心 “社会晴雨表”。通过 24 年分省数据,我们完成三层目标:

  1. 技能目标:熟练掌握 Pandas 数据清洗、melt 宽表转长表、groupby 分组聚合;掌握静态 + 动态双可视化方案。
  2. 思维目标:建立时间 + 空间二维分析框架,挖掘婚姻数据长期趋势、地域差异拐点。
  3. 拓展目标:结合社会学、经济学交叉解读数据,用数据解读当代婚姻变迁。

三、数据集说明

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()

趋势解读

  1. 2013 年全国结婚登记达到历史峰值,此后持续逐年下滑;
  2. 离婚登记长期稳步上行,2020 年小幅冲高(疫情集中办理),2022 年后回落;
  3. 一升一降形成剪刀差,婚姻稳定性持续走低。
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:拓展交叉分析思路(课程思考题)

  1. 相关性验证:引入各省城镇化率、人均 GDP,计算与离结比皮尔逊相关系数,验证 “城镇化越高离婚相对越多” 假设;
  2. 东北高离结比成因:青年人口持续外流,适婚人口(结婚分母)持续萎缩,离婚存量人口沉淀,直接拉高离结比;
  3. 政策影响分析:2021 离婚冷静期、2023 疫情补偿性结婚、2024 结婚创新低等政策 / 事件拐点解读。

五、核心数据分析结论

1. 时间维度

  1. 全国结婚登记 2013 年触顶后连续下跌,2024 年创近 24 年最低;
  2. 离婚登记长期上行,仅疫情、政策年份短期波动;
  3. 离结比持续走低,婚姻稳定性整体逐年下降。

2. 空间地域维度

  1. 人口大省(广东、河南、山东、四川)结婚、离婚总量常年位居全国前列;
  2. 东部沿海、直辖市、东北三省离结比偏低,离婚相对比例更高;中西部内陆省份婚姻稳定性更强;
  3. 数据分布符合胡焕庸线特征:线东南婚姻登记总量远高于西北。

3. 社会学解读

  1. 城市化:城市女性经济独立、婚姻观念多元化,离婚意愿提升;
  2. 人口结构:晚婚、少子化、青年外流双重挤压结婚基数;
  3. 社会包容度:社会对离婚接纳度提升,不再单纯维持形式婚姻;
  4. 经济压力:购房、育儿成本拉高结婚门槛,年轻人推迟或放弃结婚。

六、项目局限性

  1. 仅使用分省总量数据,无年龄、性别、初婚 / 再婚细分维度;
  2. 未区分城乡差异,无法细化城镇、农村婚姻分化;
  3. 缺少人均收入、出生率、房价等外部面板数据深度回归;
  4. 未区分协议离婚、诉讼离婚,无法分析离婚类型结构。

七、学习总结

本项目完整覆盖数据分析全链路:数据读取→质量体检→宽长表结构重塑→分组聚合→静态可视化→交互式地图 / 动态时序图表→交叉社科解读

  1. melt是处理年度宽表的万能工具,完美解决多年份列拆解;
  2. Pyecharts 适合地域、动态可视化,输出 HTML 交互式图表,汇报效果远优于静态 Matplotlib;
  3. 单纯绘图无意义,数据分析核心是数据 + 行业背景交叉解读,本项目结合人口、社会学完成多维挖掘,适合课程作业、数据分析入门练手。

八、完整项目文件清单

plaintext

婚姻登记分析/ ├── 结婚登记(万对).csv ├── 离婚登记(万对).csv ├── 婚姻数据分析.ipynb # 完整代码notebook ├── 各省结婚热力图.html ├── 各省离婚热力图.html ├── 结婚前十玫瑰图.html ├── 离婚前十玫瑰图.html ├── 结婚动态年度排行.html └── 婚姻登记数据分析报告.md

标签:#Python 数据分析 #Pandas 实战 #Pyecharts 地图 #婚姻数据挖掘 #大一课程设计 #宽表转长表 melt

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 10:05:48

智能字幕生成器终极指南:3分钟打造专业级滚动歌词的完整方案

智能字幕生成器终极指南:3分钟打造专业级滚动歌词的完整方案 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为视频字幕制作而烦恼?LRC …

作者头像 李华
网站建设 2026/6/26 10:04:24

网易云音乐双语歌词下载难题的优雅解决方案:LrcHelper深度解析

网易云音乐双语歌词下载难题的优雅解决方案:LrcHelper深度解析 【免费下载链接】LrcHelper 从网易云音乐下载带翻译的歌词 Walkman 适配 项目地址: https://gitcode.com/gh_mirrors/lr/LrcHelper 在音乐欣赏和外语学习的交叉点上,有一个长期困扰用…

作者头像 李华
网站建设 2026/6/26 10:03:50

DO-380标准解析:基于模型的航空软件开发与验证实践指南

1. 项目概述:从DO-178C到DO-380,机载软件验证的范式演进如果你在航空电子或高安全等级嵌入式软件领域工作,那么“RTCA DO-178C”这个名字一定如雷贯耳。它被誉为机载软件适航审定的“圣经”,定义了从A级(灾难级&#x…

作者头像 李华
网站建设 2026/6/26 10:03:42

DigiJoystick实战

DigiJoystick实战 (转载自我的gitee,原仓库见DigiJoystick) >附件:源代码下载< 介绍 基于digispark(与ATtiny84)实现的低成本游戏摇杆,为Digispark自身可用引脚数量不足的解决方法提供理论存在性 Digispark零售价10元左右,一个劣质的摇杆模块5元左右,ATtiny84零售价15…

作者头像 李华
网站建设 2026/6/26 9:57:04

为什么两个 size_t相减时始终是正数

在第20篇博客中非常精准地指出了 C 语言编程中一个经典且危险的陷阱&#xff1a;无符号整数&#xff08;size_t&#xff09;的减法运算。 以下是对这段描述的深度解析、逻辑修正以及更准确的表述方式&#xff0c;帮助你彻底理解这个问题。 核心问题&#xff1a;隐式类型转换与…

作者头像 李华