订单数据分析和聚类

一、数据准备与预处理

1.1 数据加载与初步查看

首先,我们需要加载订单数据并进行初步查看,了解数据的基本结构和内容。这里我们使用 pandas 库来读取 Excel 格式的订单数据:

python

运行

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt
import matplotlib as mpl
from pyecharts.charts import *
from pyecharts import options as opts

import warnings
warnings.filterwarnings('ignore') # 忽略警告信息
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 加载订单数据
df = pd.read_excel('order2021kmeans.xlsx')
print("数据基本信息:")
df.info()

# 查看数据前几行
print("\n数据前5行内容:")
df.head()

通过上述代码,我们加载了订单数据并查看了数据的基本信息,包括各字段的数据类型、非空值数量等,同时也查看了数据的前几行内容,对数据有了一个初步的认识。

1.2 数据清洗与预处理

在进行深入分析之前,我们需要对数据进行必要的清洗和预处理,确保数据质量。这包括处理重复值、异常值等:

python

运行

# 删除重复值
duplicate_count = df.duplicated().sum()
print(f"重复值数量:{duplicate_count}")

# 去除列名中的空格
df.columns = df.columns.str.strip()

# 查看数据分布
print("数据描述性统计:")
df.describe().T

# 筛选未退款订单
data = df[df['是否退款'] == '否']

# 处理异常值:付款金额小于0的情况
negative_payment = len(data[data['付款金额'] < 0])
print(f"付款金额为负值的订单数量:{negative_payment}")

# 将付款金额转换为正值
data['付款金额'] = data['付款金额'].abs()
negative_payment_after = len(data[data['付款金额'] < 0])
print(f"处理后付款金额为负值的订单数量:{negative_payment_after}")

在订单数据中,付款金额出现负值可能是数据录入错误或系统异常导致的。我们通过绝对值转换将这些异常值修正为正值,确保后续分析的准确性。

二、探索性数据分析

探索性数据分析 (EDA) 是数据分析的重要环节,通过描述性统计方法,我们可以快速了解数据的分布特征和基本规律。

2.1 关键指标描述性统计

通过计算关键指标的描述性统计量,我们可以了解订单数据的整体分布情况:

python

运行

# 查看关键指标的描述性统计
print("订单数据关键指标描述性统计:")
key_metrics = ['付款金额', '商品数量', '客户评分']  # 假设这些是关键指标
data[key_metrics].describe()

描述性统计结果将为我们提供诸如订单金额的平均值、中位数、标准差、最小值和最大值等重要信息,帮助我们了解订单金额的整体水平和离散程度。

三、可视化分析:多维度透视订单数据

可视化分析能够以直观的方式呈现数据背后的规律,帮助我们更好地理解和解读数据。下面我们将从渠道、时间等多个维度对订单数据进行可视化分析。

3.1 不同渠道收益分析

渠道表现是企业关注的重要指标,通过分析不同渠道的收益情况,企业可以优化渠道资源配置:

python

运行

# 统计不同渠道付款总额,并降序排列
channel_revenue = data.groupby('渠道编号')['付款金额'].sum().sort_values(ascending=False).reset_index()

# 绘制柱状图
plt.figure(figsize=(12, 4))
plt.title("不同渠道的总收益", fontsize=16)
plt.bar(channel_revenue['渠道编号'], channel_revenue['付款金额'])
plt.xlabel("渠道编号")
plt.ylabel("渠道收益")
plt.xticks(rotation=45)
plt.tight_layout()  # 自动调整子图布局
plt.show()

通过渠道收益柱状图,我们可以清晰地看到各个渠道的销售贡献度,识别出高价值渠道和需要优化的渠道。

3.2 月度收益分析

了解销售数据的时间分布规律对于企业制定销售计划和库存管理具有重要意义:

python

运行

# 提取付款月份和月份名称
data['付款月份'] = data['付款时间'].dt.month  # 提取月份
data['付款月份名称'] = data['付款时间'].dt.month_name()  # 提取月份名称

# 按月份统计总收益
month_revenue = data.groupby(['付款月份', '付款月份名称'])['付款金额'].sum().reset_index()

# 绘制柱状图
plt.figure(figsize=(12, 4))
plt.title("Total Revenue by month", fontsize=16)
plt.bar(month_revenue["付款月份名称"], month_revenue["付款金额"])
plt.ylabel("Total Revenue", fontsize=12)
plt.xticks(rotation=45, fontsize=10)
plt.yticks(fontsize=10)
plt.tight_layout()
plt.show()

月度收益分析可以帮助我们发现销售的季节性规律,比如哪些月份是销售旺季,哪些月份是销售淡季,为企业的季节性运营策略提供依据。

3.3 每日每小时收益分析

进一步细化时间维度,分析每日每小时的收益情况,可以帮助企业优化运营时间安排:

python

运行

# 提取付款时间的小时和天数信息
data['付款小时'] = data['付款时间'].dt.hour  # 获取小时
data['付款天数'] = data['付款时间'].dt.day  # 获取天数
data['付款天数名称'] = data['付款时间'].dt.day_name()  # 获取星期几的名称

# 按天数和小时统计收益
hourly_sales = data.groupby(['付款天数名称', '付款小时'])['付款金额'].sum().reset_index()
hourly_sales = hourly_sales.rename(columns={'付款金额': 'TotalValue'}) 

# 数据切分,以便绘制多系列折线图
split_dfs = []
num_groups = len(hourly_sales) // 24  # 假设每天24小时

for i in range(num_groups):
    start_index = i * 24
    end_index = start_index + 24
    split_df = hourly_sales.iloc[start_index:end_index]
    split_dfs.append(split_df)

# 使用pyecharts绘制交互式折线图
from pyecharts.charts import Line
from pyecharts import options as opts

# 创建折线图
line = (
    Line()
    .add_xaxis(split_dfs[0]['付款小时'].astype(str).tolist())  # X轴为小时
    .set_global_opts(
        title_opts={"text": "每日每小时收益总额"},
        legend_opts=opts.LegendOpts(
            is_show=True,  # 显示图例
            orient='vertical',  # 垂直显示
            pos_top='5%',  # 图例位置
            pos_right='5%'
        )
    )
)

# 添加各天的数据系列
day_names = hourly_sales['付款天数名称'].unique()
for i in range(num_groups): 
    line.add_yaxis(day_names[i], split_dfs[i]['TotalValue'].tolist(), label_opts=opts.LabelOpts(is_show=False))

# 渲染图表
line.render_notebook()

每日每小时的收益分析可以帮助企业了解客户的购买时间偏好,比如一天中的哪个时间段是购买高峰,一周中的哪几天销量较高,从而优化客服排班、营销活动时间等。

四、客户聚类分析:识别不同类型的客户群体

4.1 聚类分析简介

聚类分析是一种无监督学习方法,它可以将数据集中相似的数据点归为一类,使得同一类内的数据点相似度较高,不同类之间的相似度较低。在订单数据分析中,聚类分析可以帮助我们识别不同类型的客户群体,为精准营销提供依据。

4.2 特征工程:准备聚类所需的特征

在进行聚类分析之前,我们需要准备适合的特征。RFM 模型是客户分析中常用的模型,它包含三个关键指标:

  • R (Recency): 最近购买时间
  • F (Frequency): 购买频率
  • M (Monetary): 购买金额

下面我们来计算 RFM 指标:

python

运行

# 假设数据中包含客户ID和付款时间等信息
# 计算最近购买时间(Recency)
recent_date = data['付款时间'].max()
rfm_data = data.groupby('客户ID').agg({
    '付款时间': lambda x: (recent_date - x.max()).days,  # 最近购买时间间隔
    '订单编号': 'count',  # 购买频率
    '付款金额': 'sum'  # 购买金额
}).reset_index()

# 重命名列名
rfm_data.columns = ['客户ID', 'Recency', 'Frequency', 'Monetary']

# 查看RFM数据
rfm_data.head()

4.3 数据标准化

由于不同指标的量纲不同,我们需要对数据进行标准化处理:

python

运行

from sklearn.preprocessing import StandardScaler

# 提取特征
X = rfm_data[['Recency', 'Frequency', 'Monetary']]

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 转换为DataFrame
X_scaled_df = pd.DataFrame(X_scaled, columns=['Recency', 'Frequency', 'Monetary'], index=rfm_data['客户ID'])
X_scaled_df.head()

4.4 确定最佳聚类数量

使用肘部法则 (Elbow Method) 确定最佳聚类数量:

python

运行

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 计算不同k值下的SSE
sse = []
k_range = range(1, 11)

for k in k_range:
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(X_scaled_df)
    sse.append(kmeans.inertia_)

# 绘制肘部法则图
plt.figure(figsize=(10, 6))
plt.plot(k_range, sse, 'o-')
plt.title('肘部法则确定最佳聚类数量')
plt.xlabel('聚类数量(k)')
plt.ylabel('SSE')
plt.grid(True)
plt.show()

4.5 执行 K-means 聚类

根据肘部法则确定的最佳聚类数量,执行 K-means 聚类:

python

运行

# 假设最佳聚类数量为3
kmeans = KMeans(n_clusters=3, random_state=42)
rfm_data['Cluster'] = kmeans.fit_predict(X_scaled_df)

# 查看聚类结果
print("客户聚类结果:")
rfm_data.groupby('Cluster')[['Recency', 'Frequency', 'Monetary']].mean()

4.6 聚类结果分析与可视化

对聚类结果进行分析,并可视化展示不同客户群体的特征:

python

运行

# 计算各聚类的RFM均值
cluster_stats = rfm_data.groupby('Cluster')[['Recency', 'Frequency', 'Monetary']].mean()

# 绘制雷达图展示不同客户群体特征
from pyecharts import options as opts
from pyecharts.charts import Radar

# 雷达图数据准备
categories = ['最近购买时间', '购买频率', '购买金额']
data = []

for i in cluster_stats.index:
    data.append(
        {
            "name": f"客户群体{i+1}",
            "value": cluster_stats.loc[i].tolist(),
        }
    )

# 创建雷达图
(
    Radar()
    .add_schema(
        schema=[
            opts.RadarIndicatorItem(name=categories[0], max_=cluster_stats['Recency'].max() * 1.1),
            opts.RadarIndicatorItem(name=categories[1], max_=cluster_stats['Frequency'].max() * 1.1),
            opts.RadarIndicatorItem(name=categories[2], max_=cluster_stats['Monetary'].max() * 1.1),
        ],
        center=["50%", "50%"],
    )
    .add("客户群体", data)
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="不同客户群体RFM特征雷达图"),
        legend_opts=opts.LegendOpts(is_show=True),
    )
    .render_notebook()
)

通过聚类分析,我们可以将客户分为不同的群体,比如:

  • 高价值客户:最近购买时间近、购买频率高、购买金额大
  • 活跃客户:最近购买时间近、购买频率高,但购买金额中等
  • 沉睡客户:最近购买时间远、购买频率低、购买金额小

针对不同的客户群体,企业可以制定差异化的营销策略,提高营销效果和客户满意度。

五、结论与展望

5.1 分析结论总结

通过对订单数据的全面分析,我们获得了以下重要结论:

  1. 渠道表现:识别出了高收益渠道和低收益渠道,为渠道优化提供了依据
  2. 时间规律:发现了销售的月度和每日时间分布规律,有助于优化运营时间安排
  3. 客户分群:通过 RFM 模型和 K-means 聚类,将客户分为不同的群体,为精准营销奠定了基础

5.2 进一步分析方向

本次分析还可以在以下方面进一步深入:

  1. 结合客户属性:如果有客户年龄、性别、地域等属性数据,可以分析不同属性客户的购买行为差异
  2. 产品关联分析:分析不同产品的购买关联关系,为产品推荐和组合销售提供依据
  3. 预测分析:建立预测模型,预测未来销售趋势和客户购买行为
  4. 退款订单分析:本文只分析了未退款订单,还可以对退款订单进行专门分析,找出退款原因

5.3 数据分析对业务的价值

通过订单数据分析和客户聚类,企业可以实现:

  1. 精准营销:针对不同客户群体制定个性化营销策略,提高营销 ROI
  2. 运营优化:根据销售时间规律优化库存管理、人员排班等运营活动
  3. 渠道优化:合理分配渠道资源,提高整体销售业绩
  4. 客户保留:识别高价值客户和潜在流失客户,制定针对性的客户保留策略

结语

订单数据分析是企业数据驱动决策的重要环节,通过深入挖掘订单数据背后的规律和洞察,企业可以更好地理解客户需求,优化运营策略,提升竞争力。本文介绍的分析方法和流程可以应用于各种电商和零售场景,帮助企业从数据中获取商业价值。

在实际应用中,数据分析不是一次性的工作,而是需要持续进行的过程。随着业务的发展和数据的积累,我们需要不断优化分析模型和方法,以适应新的业务需求和市场变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值