在数据分析、机器学习建模或编程学习中,我们常常需要高质量的模拟数据来测试算法、验证逻辑或演示功能。今天就来分享一个实用案例——用 Python 的 Pandas、NumPy 库生成真实感十足的电商用户购买数据集,全程代码简洁易懂,适合编程学习者和数据初学者上手。
一、核心工具介绍
本次实战用到的核心库:
- Pandas:Python 数据分析利器,用于数据存储、清洗和结构化展示(核心是 DataFrame 数据结构)。
- NumPy:用于生成高效的随机数据(如正态分布的购买金额)。
- datetime:处理日期时间,生成近90天的购买日期。
- random:辅助生成随机天数、随机选择类别数据。
无需复杂环境配置,安装基础库即可开始:
bash
pip install pandas numpy
二、完整代码实现(带详细注释)
python
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import random
# 1. 设置随机种子(保证每次运行生成相同数据,便于复现和调试)
np.random.seed(42)
random.seed(42)
# 2. 定义数据维度(可按需修改参数,生成不同规模/类别的数据)
user_ids = [f"U{str(i).zfill(4)}" for i in range(1001, 1051)] # 50个用户ID(U1001-U1050)
genders = ["男", "女", "未知"]
age_groups = ["18-25", "26-35", "36-45", "46-55", "55+"] # 常见年龄分段
cities = ["北京", "上海", "广州", "深圳", "杭州", "成都", "武汉", "西安"] # 一线+新一线城市
categories = ["电子产品", "服装鞋帽", "家居用品", "美妆护肤", "食品饮料", "图书文具"] # 电商核心品类
payment_methods = ["支付宝", "微信支付", "银行卡", "货到付款"] # 主流支付方式
# 3. 生成核心数据(用随机选择+分布控制,让数据更真实)
data = {
"用户ID": user_ids,
"性别": np.random.choice(genders, size=50, p=[0.45, 0.45, 0.1]), # 男女各45%,未知10%
"年龄组": np.random.choice(age_groups, size=50), # 均匀分布选择年龄组
"所在城市": np.random.choice(cities, size=50), # 均匀分布选择城市
"购买日期": [datetime.now() - timedelta(days=random.randint(1, 90)) for _ in range(50)], # 近90天内随机购买
"商品类别": np.random.choice(categories, size=50), # 均匀分布选择商品类别
"购买金额(元)": np.round(np.random.normal(loc=300, scale=150, size=50), 2), # 正态分布(均值300,标准差150)
"支付方式": np.random.choice(payment_methods, size=50, p=[0.5, 0.4, 0.08, 0.02]), # 支付宝50%、微信40%
"是否退货": np.random.choice([True, False], size=50, p=[0.08, 0.92]) # 8%退货率(符合电商常见水平)
}
# 4. 创建DataFrame并清理异常值(数据质量保障)
df = pd.DataFrame(data)
df["购买金额(元)"] = df["购买金额(元)"].apply(lambda x: max(x, 10)) # 过滤负金额,设置最低消费10元
df["购买日期"] = pd.to_datetime(df["购买日期"]).dt.date # 格式化日期为"年-月-日"纯日期格式
# 5. 数据基本信息查看(验证数据是否符合预期)
print("数据形状(行数×列数):", df.shape)
print("\n前5行数据:")
print(df.head())
print("\n数据类型:")
print(df.dtypes)
print("\n购买金额描述性统计:")
print(df["购买金额(元)"].describe())
三、代码关键逻辑解析
1. 随机数据生成的技巧
- 固定随机种子: np.random.seed(42) 和 random.seed(42) 保证每次运行代码生成完全相同的数据,方便调试和复用。
- 带权重的随机选择:用 np.random.choice() 的 p 参数控制分布(如性别、支付方式),让数据更贴近真实业务场景(比如支付宝、微信支付占比更高)。
- 正态分布金额: np.random.normal(loc=300, scale=150) 生成均值300元、标准差150元的购买金额,符合电商“大部分用户消费中等,少数人高消费/低消费”的规律。
2. 数据清洗的必要性
生成随机数据后,必须处理异常值:
- 购买金额可能因正态分布出现负值,用 lambda x: max(x, 10) 过滤,同时设置最低消费10元(避免0元订单的不合理情况)。
- 日期格式统一为纯日期(去掉时分秒),让数据更整洁,便于后续按日期统计分析。
3. 数据验证方法
通过 df.shape 、 df.head() 、 df.describe() 快速验证数据:
- 确认数据行数/列数是否符合预期(本例50行×9列)。
- 查看前5行数据,检查字段值是否合理(如用户ID格式、日期范围)。
- 对数值型字段(购买金额)做描述性统计,确认均值、最小值、最大值是否在合理区间。
四、运行结果展示
1. 数据基本信息
plaintext
数据形状(行数×列数): (50, 9)
前5行数据:
用户ID 性别 年龄组 所在城市 购买日期 商品类别 购买金额(元) 支付方式 是否退货
0 U1001 男 36-45 杭州 2024-09-15 家居用品 447.99 支付宝 False
1 U1002 女 26-35 北京 2024-08-23 食品饮料 295.68 微信支付 False
2 U1003 女 18-25 深圳 2024-07-10 美妆护肤 317.57 支付宝 False
3 U1004 男 55+ 成都 2024-09-02 电子产品 134.89 微信支付 False
4 U1005 未知 46-55 武汉 2024-08-15 图书文具 386.62 支付宝 False
购买金额描述性统计:
count 50.000000
mean 312.671400
std 142.307208
min 10.000000
25% 207.415000
50% 303.935000
75% 406.227500
max 638.760000
2. 结果解读
- 数据维度:50个用户的9个核心字段,覆盖“用户属性(性别、年龄、城市)+ 交易属性(日期、品类、金额、支付方式、退货状态)”,满足电商数据分析的基础需求。
- 购买金额:均值312.67元,最小值10元,最大值638.76元,分布合理,无异常值。
- 字段格式:日期、数值、布尔值等类型正确,可直接用于后续分析(如按年龄组统计消费金额、按商品类别统计销量)。
五、灵活扩展方向
这个基础代码可以根据需求快速调整,比如:
1. 增加数据量:修改 user_ids 的范围(如 range(1001, 2001) 生成1000个用户)。
2. 新增字段:比如“购买数量”“会员等级”“优惠券使用情况”等(参考现有字段的生成逻辑)。
3. 调整分布:比如提高“36-45岁”年龄组的占比,或增加“电子产品”的购买概率。
4. 导出数据:用 df.to_csv("电商购买数据.csv", index=False) 导出为CSV文件,用于Excel分析或其他工具调用。
六、学习总结
通过这个案例,我们不仅掌握了 Pandas、NumPy 的基础用法,还理解了“模拟数据生成→数据清洗→数据验证”的完整流程。这类模拟数据在编程学习中非常实用——比如后续可以用它练习数据筛选、分组统计、可视化图表制作等技能,也可以用于机器学习模型的入门训练(如预测用户是否会退货)。
如果需要进一步优化代码(比如生成更复杂的用户行为序列)或基于这份数据做深度分析(如绘制消费金额分布图),可以随时交流~
Pandas生成电商模拟数据

被折叠的 条评论
为什么被折叠?



