# 基于清洗后的数据进行多维度分析
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from datetime import datetime

# 设置图表样式
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

colors = ['#2E86AB', '#A23B72', '#F18F01', '#C73E1D', '#7209B7', '#43AA8B', '#F8961E', '#90A959']
# 读取清洗后的数据
df = pd.read_csv('./order_data_cleaned.csv')
df.head()
# 重新转换日期时间格式
df['下单时间'] = pd.to_datetime(df['下单时间'])
df['付款时间'] = pd.to_datetime(df['付款时间'])
df['下单日期'] = pd.to_datetime(df['下单日期']).dt.date

销售业绩分析(时间维度)

1.1  月度销售趋势

monthly_sales = df.groupby('下单月份').agg({
    '订单号':'count',#订单数量
    '订单金额':'sum' #销售金额
}).round(2)
monthly_sales.columns = ['订单数量','销售金额']
monthly_sales

# 绘制月度销售趋势图
fig,(ax1,ax2)=plt.subplots(2,1,figsize=(12,10),sharex=True)

# 订单数量趋势
ax1.plot(monthly_sales.index, monthly_sales['订单数量'], 
         marker='o', linewidth=2.5, markersize=6, color=colors[0])
ax1.set_title('2021年月度订单数量趋势', fontsize=14, fontweight='bold', pad=20)
ax1.set_ylabel('订单数量', fontsize=12)
ax1.grid(True, alpha=0.3)
ax1.set_xticks(range(1, 13))
ax1.set_xticklabels([f'{i}月' for i in range(1, 13)])

# 销售金额趋势
ax2.plot(monthly_sales.index, monthly_sales['销售金额']/10000, 
         marker='s', linewidth=2.5, markersize=6, color=colors[1])
ax2.set_title('2021年月度销售金额趋势', fontsize=14, fontweight='bold', pad=20)
ax2.set_xlabel('月份', fontsize=12)
ax2.set_ylabel('销售金额(万元)', fontsize=12)
ax2.grid(True, alpha=0.3)
ax2.set_xticks(range(1, 13))
ax2.set_xticklabels([f'{i}月' for i in range(1, 13)])

plt.tight_layout()
plt.savefig('./monthly_sales_trend.png', dpi=300, bbox_inches='tight')

24小时订单分布分析

hourly_sales = df.groupby('下单小时').agg({
    '订单号': 'count',
    '付款金额': 'sum'
}).round(2)
hourly_sales.columns = ['订单数量', '销售金额']

peak_hour_orders = hourly_sales['订单数量'].idxmax()
peak_hour_sales = hourly_sales['销售金额'].idxmax()

print(f"订单高峰时段:{peak_hour_orders}:00-{peak_hour_orders+1}:00({hourly_sales['订单数量'].max()}单)")
print(f"销售高峰时段:{peak_hour_sales}:00-{peak_hour_sales+1}:00({hourly_sales['销售金额'].max():.2f}元)")
订单高峰时段:12:00-13:00(220单)
销售高峰时段:12:00-13:00(224683.44元)
# 绘制24小时订单分布图
fig, ax = plt.subplots(figsize=(14, 7))
bars = ax.bar(hourly_sales.index, hourly_sales['订单数量'], 
              color=colors[2], alpha=0.8, edgecolor='white', linewidth=0.5)
ax.set_title('24小时订单数量分布', fontsize=14, fontweight='bold', pad=30)
ax.set_xlabel('小时', fontsize=12)
ax.set_ylabel('订单数量', fontsize=12)
ax.set_xticks(range(0, 24))
ax.set_xticklabels([f'{i}:00' for i in range(0, 24)], rotation=45)
ax.grid(True, alpha=0.3, axis='y')

# 标注峰值
max_idx = hourly_sales['订单数量'].idxmax()
ax.annotate(f'{hourly_sales["订单数量"].max()}单', 
            xy=(max_idx, hourly_sales['订单数量'].max()),
            xytext=(max_idx, hourly_sales['订单数量'].max() + 20),
            ha='center', fontweight='bold',
            arrowprops=dict(arrowstyle='->', color='red'))

plt.tight_layout()
plt.savefig('hourly_sales_distribution.png', dpi=300, bbox_inches='tight')

print("24小时订单分布图已生成:hourly_sales_distribution.png")

渠道与平台效果分析

2.1  各渠道销售表现对比

channel_analysis = df.groupby('渠道编号').agg({
    '订单号': 'count',
    '付款金额': ['sum', 'mean'],
    '是否退款': lambda x: (x == '是').sum()
}).round(2)

channel_analysis.columns = ['订单量', '总销售额', '平均客单价', '退款数']
channel_analysis['退款率(%)'] = (channel_analysis['退款数'] / channel_analysis['订单量'] * 100).round(2)
channel_analysis = channel_analysis.sort_values('总销售额', ascending=False)

channel_analysis

# 绘制渠道对比双轴图
fig, ax1 = plt.subplots(figsize=(12, 8))

channels = channel_analysis.index
x_pos = np.arange(len(channels))

# 订单量柱状图
bars1 = ax1.bar(x_pos - 0.2, channel_analysis['订单量'], 0.4, 
                label='订单量', color=colors[0], alpha=0.8)
ax1.set_xlabel('渠道编号', fontsize=12)
ax1.set_ylabel('订单量', fontsize=12, color=colors[0])
ax1.tick_params(axis='y', labelcolor=colors[0])
ax1.set_xticks(x_pos)
ax1.set_xticklabels(channels)

# 平均客单价折线图
ax2 = ax1.twinx()
line1 = ax2.plot(x_pos + 0.2, channel_analysis['平均客单价'], 
                 marker='o', linewidth=3, markersize=8, 
                 label='平均客单价', color=colors[1])
ax2.set_ylabel('平均客单价(元)', fontsize=12, color=colors[1])
ax2.tick_params(axis='y', labelcolor=colors[1])

# 合并图例
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right')

plt.title('各渠道订单量与平均客单价对比', fontsize=14, fontweight='bold', pad=20)
plt.grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.savefig('channel_performance.png', dpi=300, bbox_inches='tight')
print("渠道表现对比图已生成:channel_performance.png")

2.2  各平台销售表现对比

platform_analysis = df.groupby('平台类型').agg({
    '订单号': 'count',
    '付款金额': ['sum', 'mean'],
    '是否退款': lambda x: (x == '是').sum()
}).round(2)

platform_analysis.columns = ['订单量', '总销售额', '平均客单价', '退款数']
platform_analysis['退款率(%)'] = (platform_analysis['退款数'] / platform_analysis['订单量'] * 100).round(2)
platform_analysis = platform_analysis.sort_values('总销售额', ascending=False)
platform_analysis

# 绘制平台占比饼图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 7))

# 订单量占比
sizes1 = platform_analysis['订单量']
colors_pie1 = colors[:len(sizes1)]
ax1.pie(sizes1, labels=platform_analysis.index, autopct='%1.1f%%',
        colors=colors_pie1, startangle=90)
ax1.set_title('各平台订单量占比', fontsize=14, fontweight='bold', pad=20)

# 销售额占比
sizes2 = platform_analysis['总销售额']
colors_pie2 = colors[3:3+len(sizes2)]
ax2.pie(sizes2, labels=platform_analysis.index, autopct='%1.1f%%',
        colors=colors_pie2, startangle=90)
ax2.set_title('各平台销售额占比', fontsize=14, fontweight='bold', pad=20)

plt.tight_layout()
plt.savefig('platform_performance.png', dpi=300, bbox_inches='tight')
print("平台表现占比图已生成:platform_performance.png")

3  用户行为与消费特征分析

3.1  用户分层分析(基于购买频次)

user_behavior = df[df['用户名'] != '未知用户'].groupby('用户名').agg({
    '订单号': 'count',
    '付款金额': ['sum', 'mean'],
    '支付延迟分钟': 'mean'
}).round(2)

user_behavior.columns = ['购买频次', '总消费额', '平均消费额', '平均支付延迟(分钟)']
user_behavior

# 定义用户分层规则
def user_segment(frequency):
    if frequency == 1:
        return '一次性用户'
    elif frequency <= 3:
        return '低频用户'
    elif frequency <= 5:
        return '中频用户'
    else:
        return '高频用户'

user_behavior['用户分层'] = user_behavior['购买频次'].apply(user_segment)
user_behavior

# 分层统计
user_segment_analysis = user_behavior.groupby('用户分层').agg({
    '购买频次': 'count',
    '总消费额': 'sum',
    '平均消费额': 'mean'
}).round(2)

user_segment_analysis.columns = ['用户数量', '消费总额', '平均消费额']
user_segment_analysis['用户占比(%)'] = (user_segment_analysis['用户数量'] / user_segment_analysis['用户数量'].sum() * 100).round(2)
user_segment_analysis['消费占比(%)'] = (user_segment_analysis['消费总额'] / user_segment_analysis['消费总额'].sum() * 100).round(2)
user_segment_analysis

# 绘制用户分层分析图
fig, ax = plt.subplots(figsize=(12, 8))
x_pos = np.arange(len(user_segment_analysis))
width = 0.35

# 用户数量柱状图
bars1 = ax.bar(x_pos - width/2, user_segment_analysis['用户数量'], width, 
               label='用户数量', color=colors[2], alpha=0.8)
ax.set_xlabel('用户分层', fontsize=12)
ax.set_ylabel('用户数量', fontsize=12, color=colors[2])
ax.tick_params(axis='y', labelcolor=colors[2])

# 消费总额双轴
ax2 = ax.twinx()
bars2 = ax2.bar(x_pos + width/2, user_segment_analysis['消费总额']/10000, width, 
                label='消费总额', color=colors[3], alpha=0.8)
ax2.set_ylabel('消费总额(万元)', fontsize=12, color=colors[3])
ax2.tick_params(axis='y', labelcolor=colors[3])

# 添加数值标签
for bar in bars1:
    height = bar.get_height()
    ax.text(bar.get_x() + bar.get_width()/2., height + 5,
            f'{int(height)}', ha='center', va='bottom')

for bar in bars2:
    height = bar.get_height()
    ax2.text(bar.get_x() + bar.get_width()/2., height + 1,
            f'{height:.1f}', ha='center', va='bottom')

# 合并图例
lines1, labels1 = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax.legend(lines1 + lines2, labels1 + labels2, loc='upper left')

plt.title('用户分层与消费贡献分析', fontsize=14, fontweight='bold', pad=20)
ax.set_xticks(x_pos)
ax.set_xticklabels(user_segment_analysis.index)
plt.grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.savefig('user_segment_analysis.png', dpi=300, bbox_inches='tight')
print("用户分层分析图已生成:user_segment_analysis.png")

3.2  退款情况分析

refund_analysis = df.groupby('是否退款').agg({
    '订单号': 'count',
    '付款金额': 'sum'
}).round(2)

refund_analysis.columns = ['订单数量', '涉及金额']
refund_analysis['订单占比(%)'] = (refund_analysis['订单数量'] / refund_analysis['订单数量'].sum() * 100).round(2)
refund_analysis

# 绘制退款情况饼图
fig, ax = plt.subplots(figsize=(10, 8))
sizes = refund_analysis['订单数量']
colors_refund = ['#FF6B6B', '#4ECDC4', '#45B7D1'][:len(sizes)]
ax.pie(sizes, labels=refund_analysis.index, autopct='%1.1f%%',
       colors=colors_refund, startangle=90, textprops={'fontsize': 12})
ax.set_title('订单退款情况分布', fontsize=14, fontweight='bold', pad=20)
plt.tight_layout()
plt.savefig('refund_analysis.png', dpi=300, bbox_inches='tight')
print("退款情况分析图已生成:refund_analysis.png")

核心发现与业务建议

1.关键发现 销售趋势:5 月份销售表现最佳(475 单,49.15 万元),整体销售较为平稳 时段特征:21:00-22:00 是订单高峰(249 单),12:00-13:00 是销售金额高峰 渠道效果: 渠道 8 表现最优(580 单,58.43 万元) 渠道 1 退款率最低(2.24%),渠道 2 退款率最高(5.30%) 平台分布: APP、web 网站、微信公众号三大平台表现均衡 微信公众号平均客单价最高(1022.17 元) 用户特征: 一次性用户占比 98.79%,用户复购率极低 整体退款率 3.81%,处于合理水平

2.业务建议 运营优化:在 21:00 前后加强营销推广,抓住订单高峰期 渠道管理:重点投入渠道 8,优化渠道 2 的退款问题,推广渠道 1 的成功经验 用户运营:设计复购激励机制,提升一次性用户的转化 平台策略:强化微信公众号的高客单价优势,优化 APP 用户体验

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐