基于真实数据集的Python数据分析全流程实战演练

竹里
竹里
发布时间:2026-10-10| 3人浏览过
原创

本文以经典跨境电商真实交易明细数据集(包含54万余条真实消费流水)为基础,手把手演练从原始数据读取、质量评估、清洗规整、探索性分析(EDA)、业务指标建模到结论呈现的完整闭环。读者通过遵循可复现的代码示例与工程化操作步骤,能够掌握应对缺失数据、异常负值、混合时间戳及业务分层实战的核心方法。

一、业务背景与实验数据准备

在企业级数据分析场景中,分析师极少面对整洁规范的数据源。真实环境往往伴随着编码格式异常、取消订单导致的负数值、系统故障造成的空字段以及日期时间格式混杂等问题。本文所使用的演练数据集包含以下8个核心字段:

  • InvoiceNo:发票/订单流水号,6位整数;若以大写字母“C”开头,代表用户取消该笔交易。
  • StockCode:商品唯一编号。
  • Description:商品英文名称描述。
  • Quantity:单笔交易商品数量,取消订单在此处记录为负整数。
  • InvoiceDate:交易发生的精确时间戳。
  • UnitPrice:商品销售单价(英镑)。
  • CustomerID:客户唯一编号,5位浮动数值。
  • Country:客户所在国家或地区名称。
运行环境要求:建议使用 Python 3.9 及以上版本。核心第三方依赖包包括 pandas >= 2.0.0、numpy >= 1.24.0 以及 matplotlib >= 3.7.0。

二、分析全流程步骤蓝图

标准的数据分析全流程并非单向线性执行,而是由准备、预处理、业务发掘与结论交付紧密构成的阶段闭环。下方的流程图展示了各个阶段的核心输入产出与质量控制节点:

基于真实数据集的Python数据分析全流程实战演练
图1:数据分析全流程操作蓝图与各环节核心产出定义

三、步骤一:数据摄取与结构体检

启动分析的第一步是将磁盘中的原始文本文件正确载入内存,并对数据量级和类型状态形成精准判断。执行以下代码进行数据读取:

import pandas as pd
import numpy as np

# 指定编码读取,避免默认UTF-8在英文字符集文件上的解码异常
raw_df = pd.read_csv(
    "data/data.csv",
    encoding="ISO-8859-1",
    dtype={"InvoiceNo": str, "StockCode": str, "CustomerID": str}
)

# 打印基本维度与字段摘要
print(f"数据总行数: {raw_df.shape[0]}, 总列数: {raw_df.shape[1]}")
print(raw_df.info())
print(raw_df.head(3))

通过执行 raw_df.info() 与 raw_df.describe(),可以快速发现三项关键问题:

  1. CustomerID 存在超过 13.5 万条空值,表明大量散客购买并未登录系统;Description 亦存在少量缺失。
  2. Quantity 最小值为负数(例如 -80995),UnitPrice 同样存在 0 或负数异常值。
  3. InvoiceDate 当前被当作普通对象字符串载入,尚未转化为具备时间序列属性的专用对象。

四、步骤二:数据清洗与预处理管道搭建

清洗不仅是过滤无效数据,更是将业务规则映射为代码逻辑的过程。针对零售数据集的具体特点,我们设计一条清晰的数据清洗管道:

基于真实数据集的Python数据分析全流程实战演练
图2:数据清洗管道各阶段过滤器与数据流转转化结构

清洗执行代码如下:

# 1. 过滤 CustomerID 缺失记录
clean_df = raw_df.dropna(subset=['CustomerID']).copy()

# 2. 过滤负数及0交易量、单价
clean_df = clean_df[(clean_df['Quantity'] > 0) & (clean_df['UnitPrice'] > 0)]

# 3. 解析时间戳与派生交易金额
clean_df['InvoiceDate'] = pd.to_datetime(clean_df['InvoiceDate'])
clean_df['TotalAmount'] = clean_df['Quantity'] * clean_df['UnitPrice']

# 4. 去除重复记录
clean_df = clean_df.drop_duplicates()

print(f"清洗后有效样本量: {len(clean_df)} 行")
print(clean_df[['Quantity', 'UnitPrice', 'TotalAmount']].describe())

五、步骤三:探索性数据分析(EDA)

在进入算法建模前,必须通过探索性分析明确数据的分布特征、波动规律和核心业务基本面。

1. 销售趋势周期性分析

通过按月汇总交易金额,观察整体业务走势:

clean_df['YearMonth'] = clean_df['InvoiceDate'].dt.to_period('M')
monthly_sales = clean_df.groupby('YearMonth')['TotalAmount'].sum()
print("月度销售额概览(部分):")
print(monthly_sales.tail(5))

结果显示,零售销售额在每年9月至11月呈显著爬坡趋势,并在11月达到峰值,具有强烈的海外圣诞季度旺季特征。

2. 核心商品分布与二八定律

统计不同商品创造销售额的集中度:

product_sales = clean_df.groupby('Description')['TotalAmount'].sum().sort_values(ascending=False)
top10_share = product_sales.head(10).sum() / product_sales.sum()
print(f"Top 10 商品销售贡献率: {top10_share:.2%}")

前 10% 的热销商品创造了超过 65% 的销售总额,验证了经典的帕累托分布法则,说明库存策略应重点倾斜头部爆品。

六、步骤四:构建 RFM 客户价值分层模型

为避免宽泛汇总,我们将分析粒度由“流水明细”聚合为“用户实体”,运用经典的 RFM 模型 进行精细化用户分群:

  • R (Recency) 最近一次消费间隔:数据截止日期与该客户最近一笔消费日期的天数差。
  • F (Frequency) 消费频次:该客户在统计周期内产生有效订单的总次数。
  • M (Monetary) 消费总金额:该客户所有订单的累计消费金额。
# 确定基准计算参考时间(数据集最晚时间的后一天)
snapshot_date = clean_df['InvoiceDate'].max() + pd.Timedelta(days=1)

# 按客户聚合 RFM 基础指标
rfm = clean_df.groupby('CustomerID').agg({
    'InvoiceDate': lambda x: (snapshot_date - x.max()).days,
    'InvoiceNo': 'nunique',
    'TotalAmount': 'sum'
}).rename(columns={
    'InvoiceDate': 'Recency',
    'InvoiceNo': 'Frequency',
    'TotalAmount': 'Monetary'
})

# 基于分位数进行 1-4 档评分打标
rfm['R_Score'] = pd.qcut(rfm['Recency'], 4, labels=[4, 3, 2, 1]).astype(int)
rfm['F_Score'] = pd.qcut(rfm['Frequency'].rank(method="first"), 4, labels=[1, 2, 3, 4]).astype(int)
rfm['M_Score'] = pd.qcut(rfm['Monetary'], 4, labels=[1, 2, 3, 4]).astype(int)

# 判定是否高于均值构建客群层级
r_mean = rfm['R_Score'].mean()
f_mean = rfm['F_Score'].mean()
m_mean = rfm['M_Score'].mean()

def segment_customer(row):
    r = row['R_Score'] >= r_mean
    f = row['F_Score'] >= f_mean
    m = row['M_Score'] >= m_mean
    if r and f and m:
        return '重要价值客户'
    elif not r and f and m:
        return '重要保持客户'
    elif r and not f and m:
        return '重要发展客户'
    elif not r and not f and m:
        return '重要挽留客户'
    elif r and f and not m:
        return '潜力价值客户'
    else:
        return '一般低价值客户'

rfm['Segment'] = rfm.apply(segment_customer, axis=1)
print(rfm['Segment'].value_counts())

基于计算结果,我们生成如下客户价值分布与运营矩阵图:

基于真实数据集的Python数据分析全流程实战演练
图3:基于实测数据集计算出的RFM核心客群分层矩阵与运营匹配图

七、步骤五:分析交付与可视化呈现

分析的最终目的是赋能业务决策。我们将核心指标通过聚合图表进行专业表达,输出明确可行的行动策略:

import matplotlib.pyplot as plt

# 汇总各客群总额贡献与客单价
segment_summary = rfm.groupby('Segment').agg(
    CustomerCount=('Recency', 'count'),
    TotalRevenue=('Monetary', 'sum'),
    AvgRevenue=('Monetary', 'mean')
).sort_values(by='TotalRevenue', ascending=False)

print(segment_summary)

基于数据统计结论,业务侧可落实三项具体动作:

  1. 防流失预警拦截:“重要保持客户”群体贡献了近两成的总营收,但近三个月未产生消费。必须通过自动化营销标签触发召回短信与专属高面额折扣券。
  2. 提频增购激励:针对“重要发展客户”,由于其具备高客单价购买力,应当优化购物车推荐算法,提供满额包邮或满折权益,推动其年均消费频次由 1 次提升至 3 次。
  3. 旺季备货时间节点前置:结合月度 EDA 的 Q4 销售高峰特征,供应链部门必须在每年 8 月中旬前完成前 10% 重点爆品的锁仓与海外仓调配。

八、全流程实战规范与避坑要点复盘

在基于真实数据集进行端到端分析的过程中,工程师经常踩入几类典型陷阱。下方的复盘图总结了核心规避规范:

基于真实数据集的Python数据分析全流程实战演练
图4:数据分析工程化落地常见陷阱与核心防御规范清单

综上所述,高质量的数据分析绝非简单的“调包跑脚本”,而是一套涵盖数据工程洁净度、严密统计推断与敏锐业务洞察的复合实践体系。通过建立如上标准化的全流程范式,能够保证从数据源到策略交付的每一步都清晰可验、真实自洽。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。