
第十一章 项目实践
本文通过一个完整的 Pandas 项目实践案例,从 数据加载 → 清洗 → 探索 → 分析 → 可视化 → 输出结论,全流程掌握 Pandas 在真实场景中的应用。
目标:理解用户购买行为 识别高价值用户 分析产品销售趋势 提出运营建议
我们有两张表:
users.csv — 用户基本信息user_id | gender | age | city |
|---|---|---|---|
U001 | 男 | 28 | 北京 |
U002 | 女 | 35 | 上海 |
orders.csv — 订单记录order_id | user_id | product | category | price | quantity | order_date |
|---|---|---|---|---|---|---|
O001 | U001 | 手机 | 电子产品 | 5999 | 1 | 2024-03-15 |
O002 | U002 | 连衣裙 | 服装 | 299 | 2 | 2024-03-16 |
💡 数据量:约 10,000 行订单 + 2,000 用户(适合 Pandas 处理)
# ==============================
# 1. 导入库 & 设置
# ==============================
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 中文支持 & 图表样式
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
sns.set_style("whitegrid")
# ==============================
# 2. 数据加载
# ==============================
users = pd.read_csv('users.csv')
orders = pd.read_csv('orders.csv')
print("用户表形状:", users.shape)
print("订单表形状:", orders.shape)
# ==============================
# 3. 数据清洗
# ==============================
# --- 3.1 检查缺失值 ---
print("\n【缺失值检查】")
print("用户表:\n", users.isnull().sum())
print("订单表:\n", orders.isnull().sum())
# 假设少量年龄缺失,用中位数填充
users['age'].fillna(users['age'].median(), inplace=True)
# --- 3.2 类型转换 ---
orders['order_date'] = pd.to_datetime(orders['order_date'])
users['age'] = users['age'].astype('Int16') # 支持缺失的整型
# --- 3.3 异常值处理 ---
# 过滤价格 <= 0 或数量 <= 0 的订单
orders = orders[(orders['price'] > 0) & (orders['quantity'] > 0)]
# --- 3.4 合并数据 ---
df = pd.merge(orders, users, on='user_id', how='left')
df['total_amount'] = df['price'] * df['quantity'] # 新增总金额
print("\n合并后数据形状:", df.shape)
print(df.head())
# ==============================
# 4. 探索性数据分析(EDA)
# ==============================
# --- 4.1 整体销售概览 ---
total_revenue = df['total_amount'].sum()
total_orders = df['order_id'].nunique()
total_users = df['user_id'].nunique()
print(f"\n【销售概览】")
print(f"总销售额: ¥{total_revenue:,.0f}")
print(f"总订单数: {total_orders:,}")
print(f"活跃用户数: {total_users:,}")
print(f"客单价: ¥{total_revenue / total_users:,.0f}")
# --- 4.2 用户画像 ---
print("\n【用户画像】")
print("性别分布:")
print(df['gender'].value_counts(normalize=True))
print("\n年龄分布:")
df['age_group'] = pd.cut(df['age'], bins=[0, 18, 30, 50, 100], labels=['青少年', '青年', '中年', '老年'])
print(df['age_group'].value_counts())
# --- 4.3 商品分析 ---
print("\n【热销品类】")
top_categories = df.groupby('category')['total_amount'].sum().sort_values(ascending=False)
print(top_categories.head())
# --- 4.4 时间趋势 ---
df['order_month'] = df['order_date'].dt.to_period('M')
monthly_sales = df.groupby('order_month')['total_amount'].sum()
# 绘制月度销售趋势
plt.figure(figsize=(10, 5))
monthly_sales.plot(kind='line', marker='o')
plt.title('月度销售额趋势')
plt.ylabel('销售额(元)')
plt.xlabel('月份')
plt.grid(True)
plt.tight_layout()
plt.show()
# ==============================
# 5. 高价值用户分析(RFM 模型简化版)
# ==============================
# Recency: 最近一次购买距今天数
today = df['order_date'].max()
rfm = df.groupby('user_id').agg({
'order_date': lambda x: (today - x.max()).days, # R
'order_id': 'count', # F
'total_amount': 'sum' # M
}).rename(columns={
'order_date': 'Recency',
'order_id': 'Frequency',
'total_amount': 'Monetary'
})
# 简单分层(可替换为分位数)
rfm['R_score'] = pd.cut(rfm['Recency'], bins=3, labels=[3, 2, 1]) # 越近分数越高
rfm['F_score'] = pd.cut(rfm['Frequency'], bins=3, labels=[1, 2, 3])
rfm['M_score'] = pd.cut(rfm['Monetary'], bins=3, labels=[1, 2, 3])
# 高价值用户:R/F/M 均 ≥2
high_value = rfm[(rfm['R_score'] >= 2) & (rfm['F_score'] >= 2) & (rfm['M_score'] >= 2)]
print(f"\n高价值用户数: {len(high_value)} ({len(high_value)/len(rfm)*100:.1f}%)")
# ==============================
# 6. 关键洞察与建议
# ==============================
insights = f"""
【核心洞察】
1. 销售主力:{top_categories.index[0]} 贡献最大(¥{top_categories.iloc[0]:,.0f})
2. 核心人群:{df['age_group'].value_counts().index[0]} 用户占比最高
3. 趋势:销售额在 {monthly_sales.idxmax()} 达到峰值
4. 用户价值:{len(high_value)} 名高价值用户(占 {len(high_value)/len(rfm)*100:.1f}%),贡献显著
【运营建议】
✅ 针对“青年”群体加大 {top_categories.index[0]} 类目营销
✅ 对高价值用户推送专属优惠券,提升复购
✅ 在销售低谷期(如 {monthly_sales.idxmin()})策划促销活动
"""
print(insights)
# ==============================
# 7. 输出结果
# ==============================
# 保存清洗后数据
df.to_csv('cleaned_ecommerce_data.csv', index=False)
# 保存高价值用户列表
high_value_users = pd.merge(high_value.reset_index(), users, on='user_id')
high_value_users.to_excel('high_value_users.xlsx', index=False)
print("\n✅ 分析完成!结果已保存。")步骤 | 使用的 Pandas 功能 |
|---|---|
数据加载 |
|
缺失值处理 |
|
类型优化 |
|
异常值过滤 | 布尔索引 |
数据合并 |
|
特征工程 | 新增列 |
分组聚合 |
|
分箱离散化 |
|
时间序列 |
|
RFM 分析 | 自定义分组 + 分箱打分 |
结果输出 |
|
mlxtend)ecommerce_analysis/
├── data/
│ ├── users.csv
│ └── orders.csv
├── src/
│ └── analysis.py # 主分析脚本
├── output/
│ ├── cleaned_ecommerce_data.csv
│ └── high_value_users.xlsx
└── README.md # 项目说明💡 提示:你可以用 Kaggle 的电商数据集 替换模拟数据,获得更真实的体验!
python过渡项目部分代码已经上传至gitee,后续会逐步更新。
公众号:咚咚王
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。