【运营数据分析-基础篇】电商运营数据基础分析实例
【理论讲解】
有了数据处理和可视化的能力,我们现在可以开始进行真正的电商数据分析了。本章将学习如何运用描述性统计量来概括数据特征,并通过一个订单数据的综合案例,将前面所学融会贯通,产出初步的运营洞察。
- 描述性统计: 通过计算均值、中位数、众数、标准差等,来理解数据的中心趋势、离散程度和分布形态。
- 分位数与箱线图: 帮助我们了解数据的分布范围和异常值。
- 订单数据概览: 实际操作,计算关键指标,并用图表展示分析结果。
【提供数据集】
继续使用 ecommerce_orders.csv。
【代码实例与电商场景案例】
python
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
# 加载电商订单数据
df_orders = pd.read_csv('ecommerce_orders.csv')
df_orders['order_date'] = pd.to_datetime(df_orders['order_date'])
df_orders['total_amount'] = df_orders['price'] * df_orders['quantity']
print("用于基础分析的订单数据预览:\n", df_orders.head())
# --- 4.1 描述性统计分析 ---
print("\n--- 描述性统计分析 ---")
# 电商场景:查看订单总金额的统计摘要
print("\n订单总金额 (total_amount) 的描述性统计:\n", df_orders['total_amount'].describe())
# 解释:
# count: 订单数量
# mean: 平均订单金额
# std: 订单金额的标准差 (衡量波动性)
# min: 最小订单金额
# 25%, 50%, 75%: 四分位数 (50%是中位数)
# max: 最大订单金额
# 电商场景:查看商品价格的分布
print("\n商品单价 (price) 的描述性统计:\n", df_orders['price'].describe())
# 众数 (最常见的值)
print("\n最常见的商品类别:", df_orders['category'].mode()[0])
print("最常见的支付方式:", df_orders['payment_method'].mode()[0])
# 可视化分布:直方图和箱线图
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1) # 绘制第一个子图
sns.histplot(df_orders['total_amount'], bins=10, kde=True) # 直方图,kde显示核密度估计
plt.title('订单总金额分布直方图')
plt.xlabel('订单总金额 (元)')
plt.ylabel('订单数量')
plt.subplot(1, 2, 2) # 绘制第二个子图
sns.boxplot(y=df_orders['total_amount']) # 箱线图
plt.title('订单总金额箱线图')
plt.ylabel('订单总金额 (元)')
plt.tight_layout()
plt.show()
# 解释箱线图:中间的线是中位数,箱子的上下边界是25%和75%分位数,
# 须(线)的末端表示数据的大致范围,超出须的点通常被认为是异常值。
# --- 4.2 案例分析:订单数据概览 ---
print("\n\n--- 案例分析:订单数据概览 ---")
# 1. 计算总销售额、总订单量、平均订单金额
total_sales = df_orders['total_amount'].sum()
total_orders = df_orders['order_id'].nunique() # 统计不重复的订单ID
avg_order_value = total_sales / total_orders
print(f"\n总销售额: {total_sales:.2f} 元")
print(f"总订单量: {total_orders} 单")
print(f"平均订单金额: {avg_order_value:.2f} 元")
# 2. 按时间维度统计销售趋势 (日、周)
# 每日销售额
daily_sales_trend = df_orders.groupby('order_date')['total_amount'].sum()
# 添加周数,按周统计销售额
df_orders['order_week'] = df_orders['order_date'].dt.isocalendar().week.astype(int) # 获取周数
weekly_sales_trend = df_orders.groupby('order_week')['total_amount'].sum()
plt.figure(figsize=(15, 6))
plt.subplot(1, 2, 1)
sns.lineplot(x=daily_sales_trend.index, y=daily_sales_trend.values, marker='o')
plt.title('每日销售额趋势')
plt.xlabel('日期')
plt.ylabel('销售额 (元)')
plt.xticks(rotation=45)
plt.subplot(1, 2, 2)
sns.barplot(x=weekly_sales_trend.index, y=weekly_sales_trend.values)
plt.title('每周销售额趋势')
plt.xlabel('周数')
plt.ylabel('销售额 (元)')
plt.tight_layout()
plt.show()
# 3. 商品销售量/额 Top N 分析
# Top 5 畅销商品 (按销量)
top_selling_products_qty = df_orders.groupby('product_name')['quantity'].sum().nlargest(5)
print("\nTop 5 畅销商品 (按销量):\n", top_selling_products_qty)
# Top 5 畅销商品 (按销售额)
top_selling_products_revenue = df_orders.groupby('product_name')['total_amount'].sum().nlargest(5)
print("\nTop 5 畅销商品 (按销售额):\n", top_selling_products_revenue)
plt.figure(figsize=(15, 6))
plt.subplot(1, 2, 1)
sns.barplot(x=top_selling_products_qty.index, y=top_selling_products_qty.values, palette='viridis')
plt.title('Top 5 畅销商品 (按销量)')
plt.xlabel('商品名称')
plt.ylabel('总销量')
plt.xticks(rotation=45, ha='right')
plt.subplot(1, 2, 2)
sns.barplot(x=top_selling_products_revenue.index, y=top_selling_products_revenue.values, palette='magma')
plt.title('Top 5 畅销商品 (按销售额)')
plt.xlabel('商品名称')
plt.ylabel('总销售额 (元)')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()
# 4. 用户消费金额分布
# 统计每个用户的总消费金额
user_total_spent = df_orders.groupby('user_id')['total_amount'].sum().sort_values(ascending=False)
print("\nTop 10 消费用户:\n", user_total_spent.head(10))
plt.figure(figsize=(10, 6))
sns.histplot(user_total_spent, bins=10, kde=True)
plt.title('用户总消费金额分布')
plt.xlabel('用户总消费金额 (元)')
plt.ylabel('用户数量')
plt.show()
# 5. 各城市销售额对比
city_sales = df_orders.groupby('shipping_city')['total_amount'].sum().sort_values(ascending=False)
print("\n各城市总销售额:\n", city_sales)
plt.figure(figsize=(10, 6))
sns.barplot(x=city_sales.index, y=city_sales.values, palette='rocket')
plt.title('各城市总销售额')
plt.xlabel('城市')
plt.ylabel('总销售额 (元)')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()
【互动问答】
- 在电商运营中,哪些描述性统计量对你最有价值?为什么?
- 直方图和箱线图在分析订单金额分布时各有什么优缺点?
- 如何根据每日销售额趋势图,发现可能的销售高峰或低谷?
- Top N 商品分析对运营决策有什么指导意义?
- 如果发现某个城市的销售额异常高或低,你下一步会怎么做?
- 如何计算用户的平均购买频率(即多少天购买一次)?