Python电商平台数据分析实战:从数据提取到业务决策(附完整代码)
一、电商数据分析核心场景与技术栈选型
1.1 核心分析场景
用户分析:用户画像构建、留存率分析、复购率计算、用户行为路径挖掘(如浏览-加购-下单转化);
商品分析:销量TOP商品统计、品类分布分析、商品生命周期判断、库存预警分析;
订单分析:成交金额(GMV)趋势、支付方式占比、订单取消/退款原因分析、区域销售分布;
运营分析:营销活动效果评估(如优惠券使用转化率)、流量来源分析、页面跳转转化率。
1.2 核心技术栈选型
数据提取:SQL(从MySQL/PostgreSQL等电商数据库提取数据)、pandas(读取CSV/Excel等本地数据文件);
数据清洗与处理:pandas、numpy(处理缺失值、异常值、数据格式转换);
数据可视化:matplotlib、seaborn(基础图表)、pyecharts(交互式图表,适配CSDN在线展示);
进阶分析:scikit-learn(用户分群、销量预测等简单机器学习任务)。
pip install pandas numpy matplotlib seaborn pyecharts sqlalchemy二、实战:电商核心数据全流程分析
2.1 步骤1:数据获取(本地文件/数据库)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sqlalchemy import create_engine
# 设置中文字体(解决matplotlib中文乱码问题)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 方式1:读取本地CSV文件(适合小体量测试数据)
df_user = pd.read_csv("user.csv") # 用户表:user_id(用户ID)、register_time(注册时间)、gender(性别)、city(城市)
df_product = pd.read_csv("product.csv") # 商品表:product_id(商品ID)、category(品类)、price(单价)、stock(库存)
df_order = pd.read_csv("order.csv") # 订单表:order_id(订单ID)、user_id(用户ID)、product_id(商品ID)、order_time(下单时间)、pay_amount(支付金额)、pay_status(支付状态)
# 方式2:连接MySQL数据库读取数据(适合企业级海量数据)
# 1. 构建数据库连接
engine = create_engine("mysql+pymysql://用户名:密码@主机IP:端口号/电商数据库名?charset=utf8mb4")
# 2. 执行SQL查询提取数据
sql_user = "SELECT user_id, register_time, gender, city FROM user WHERE register_time > '2024-01-01'"
df_user = pd.read_sql_query(sql_user, engine)
sql_order = "SELECT order_id, user_id, product_id, order_time, pay_amount, pay_status FROM `order` WHERE pay_status = 1" # 只取已支付订单
df_order = pd.read_sql_query(sql_order, engine)2.2 步骤2:数据清洗(核心前置步骤)
def data_cleaning():
# 1. 查看数据基本信息(缺失值、数据类型)
print("订单表缺失值统计:")
print(df_order.isnull().sum())
print("\n订单表数据类型:")
print(df_order.dtypes)
# 2. 处理缺失值(根据业务场景:订单表核心字段缺失则删除,非核心字段填充)
df_order_clean = df_order.dropna(subset=["user_id", "order_time", "pay_amount"]) # 删除核心字段缺失的订单
df_user_clean = df_user.fillna({"gender": "未知", "city": "未知"}) # 填充用户表非核心字段缺失值
# 3. 处理异常值(如支付金额≤0、订单时间异常)
# 过滤支付金额异常订单(正常订单支付金额>0)
df_order_clean = df_order_clean[df_order_clean["pay_amount"] > 0]
# 转换订单时间格式,并过滤时间异常订单(如早于2024年1月1日的测试数据)
df_order_clean["order_time"] = pd.to_datetime(df_order_clean["order_time"])
df_order_clean = df_order_clean[df_order_clean["order_time"] > pd.to_datetime("2024-01-01")]
# 4. 数据格式统一(如用户ID转为字符串类型,避免数值型ID误判)
df_user_clean["user_id"] = df_user_clean["user_id"].astype(str)
df_order_clean["user_id"] = df_order_clean["user_id"].astype(str)
df_order_clean["product_id"] = df_order_clean["product_id"].astype(str)
# 5. 合并表数据(关联用户-订单-商品信息,便于后续分析)
df_merge = pd.merge(df_order_clean, df_user_clean, on="user_id", how="left")
df_merge = pd.merge(df_merge, df_product, on="product_id", how="left")
print(f"\n清洗前订单数:{len(df_order)}")
print(f"清洗后订单数:{len(df_order_clean)}")
return df_merge
# 执行数据清洗
df_analysis = data_cleaning()2.3 步骤3:核心场景分析(用户复购+商品销量)
3.3.1 场景1:用户复购率分析
def user_repurchase_analysis(df):
# 1. 统计每个用户的下单次数
user_order_count = df.groupby("user_id")["order_id"].nunique().reset_index()
user_order_count.columns = ["user_id", "order_count"]
# 2. 计算复购用户数和复购率
total_pay_user = len(user_order_count) # 总付费用户数
repurchase_user = len(user_order_count[user_order_count["order_count"] >= 2]) # 复购用户数
repurchase_rate = repurchase_user / total_pay_user * 100
print(f"总付费用户数:{total_pay_user}")
print(f"复购用户数:{repurchase_user}")
print(f"复购率:{repurchase_rate:.2f}%")
# 3. 按月份统计复购率趋势(分析复购率随时间变化)
df["order_month"] = df["order_time"].dt.to_period("M") # 提取订单月份
month_user_stats = []
for month in df["order_month"].unique():
month_df = df[df["order_month"] == month]
month_pay_user = len(month_df["user_id"].unique())
month_repurchase_user = len(month_df[month_df["user_id"].isin(repurchase_user_list)]["user_id"].unique())
month_repurchase_rate = month_repurchase_user / month_pay_user * 100 if month_pay_user > 0 else 0
month_user_stats.append({"月份": str(month), "付费用户数": month_pay_user, "复购用户数": month_repurchase_user, "复购率": month_repurchase_rate})
df_month_repurchase = pd.DataFrame(month_user_stats)
print("\n各月份复购率统计:")
print(df_month_repurchase)
return user_order_count, df_month_repurchase
# 提取复购用户列表(用于后续月份趋势分析)
user_order_count, df_month_repurchase = user_repurchase_analysis(df_analysis)
repurchase_user_list = user_order_count[user_order_count["order_count"] >= 2]["user_id"].tolist()3.3.2 场景2:商品销量与品类分析
def product_sales_analysis(df):
# 1. 统计各商品销量(按订单数统计,若需按实际销量需关联订单详情表的购买数量)
product_sales = df.groupby("product_id")["order_id"].nunique().reset_index()
product_sales.columns = ["product_id", "sales_count"]
# 关联商品信息,获取商品品类和单价
product_sales_detail = pd.merge(product_sales, df[["product_id", "category", "price"]].drop_duplicates(), on="product_id", how="left")
# 排序获取销量TOP10商品
top10_product = product_sales_detail.sort_values("sales_count", ascending=False).head(10)
print("销量TOP10商品:")
print(top10_product)
# 2. 统计各品类销量和销售额
category_stats = df.groupby("category").agg({
"order_id": "nunique", # 品类订单数
"pay_amount": "sum" # 品类销售额
}).reset_index()
category_stats.columns = ["品类", "订单数", "销售额"]
category_stats["销售额占比"] = category_stats["销售额"] / category_stats["销售额"].sum() * 100
print("\n各品类销量与销售额统计:")
print(category_stats)
return top10_product, category_stats
top10_product, category_stats = product_sales_analysis(df_analysis)2.4 步骤4:数据可视化(直观呈现分析结果)
def data_visualization(df_month_repurchase, top10_product, category_stats, df_analysis):
# 1. 复购率趋势图
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.plot(df_month_repurchase["月份"], df_month_repurchase["复购率"], marker="o", color="#1f77b4")
plt.title("2024年各月份复购率趋势", fontsize=12)
plt.xlabel("月份")
plt.ylabel("复购率(%)")
plt.xticks(rotation=45)
plt.grid(alpha=0.3)
# 2. 商品销量TOP10柱状图
plt.subplot(2, 2, 2)
plt.barh(top10_product["product_id"], top10_product["sales_count"], color="#ff7f0e")
plt.title("销量TOP10商品", fontsize=12)
plt.xlabel("销量(订单数)")
plt.ylabel("商品ID")
plt.grid(alpha=0.3, axis="x")
# 3. 品类销售额占比饼图
plt.subplot(2, 2, 3)
plt.pie(category_stats["销售额"], labels=category_stats["品类"], autopct="%1.1f%%", startangle=90, colors=["#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2"])
plt.title("各品类销售额占比", fontsize=12)
plt.axis("equal") # 保证饼图为正圆形
# 4. 用户城市分布柱状图(取TOP10城市)
city_user = df_analysis["city"].value_counts().head(10)
plt.subplot(2, 2, 4)
plt.bar(city_user.index, city_user.values, color="#bcbd22")
plt.title("付费用户TOP10城市分布", fontsize=12)
plt.xlabel("城市")
plt.ylabel("用户数")
plt.xticks(rotation=45)
plt.grid(alpha=0.3, axis="y")
# 调整子图间距,避免重叠
plt.tight_layout()
# 保存图片(可直接在CSDN文章中插入)
plt.savefig("ecommerce_analysis_charts.png", dpi=300, bbox_inches="tight")
plt.show()
# 执行可视化
data_visualization(df_month_repurchase, top10_product, category_stats, df_analysis)2.5 步骤5:分析结果解读与业务建议
复购率优化:若某月份复购率偏低(如2月份),可针对该月付费用户推送专属优惠券、会员积分翻倍等活动,提升用户复购意愿;
商品运营:销量TOP10商品可重点保障库存,设置“爆款专区”提升曝光;销售额占比低的品类可优化商品选型或开展促销活动;
用户运营:付费用户集中的TOP10城市可重点布局本地仓储,提升物流时效;针对“未知”性别/城市的用户,可通过APP弹窗引导完善个人信息,精准推送商品;
库存优化:结合销量趋势预测,提前备货爆款商品,避免缺货;对销量低迷的商品及时清仓,减少库存积压。
三、电商数据分析关键注意事项
3.1 数据口径统一是前提
3.2 重视数据时效性与安全性
3.3 避免“唯数据论”,结合业务场景解读
3.4 海量数据的性能优化
四、进阶学习方向
用户画像与精准营销:结合RFM模型(最近消费、消费频率、消费金额)对用户分群,针对性推送营销活动;
销量预测:使用时间序列模型(ARIMA、LSTM)预测商品销量,优化库存管理;
实时数据分析:基于Flink/Spark Streaming构建实时分析平台,监控订单、流量等核心指标;
AB测试:针对营销活动、页面设计等开展AB测试,量化不同方案的效果。


