戎易大数据 | 数据分析实操篇:电商618销售目标未达成的原因分析

本文来源公众号“戎易大数据”,仅用于学术分享,侵权删,干货满满。

原文链接:数据分析实操篇:电商618销售目标未达成的原因分析

背景

公司目标:公司希望在618期间将产品线销售额同比提升15%。

结果:618活动结束后,未达成该销售目标。

任务:分析未达成销售目标的原因,并提出可执行的改进建议。

数据概览

数据来源:2017-2021年某品牌的618期间订单数据,包括订单日期、商品类别、订单金额等。

数据结构:

BILLDATE: 订单日期

QTY: 商品数量

AMOUNTRETAIL: 零售金额

会员号: 用户标识

ClassI: 一级类别

ClassII: 二级类别

ProductName: 商品名称

订单金额: 实际订单金额

数据预处理

import pandas as pdimport numpy as npfrom datetime import datetimeimport warningsimport matplotlib.pyplot as plt
# 去除科学计数法# pd.set_option("display.float_format", lambda x: '%.3f' % x)
# 忽略警告warnings.filterwarnings('ignore')
# 遇到数据中有中文时,设置中文字体plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 使用黑体plt.rcParams['axes.unicode_minus'] = False    # 显示负号
# 设置标题标注和字体大小plt.rcParams.update({"font.size": 20})  # 改变标题字体大小
# 加载数据data_path = '/home/mw/input/6189643/箱包订单表.xlsx'df = pd.read_excel(data_path)
# 查看数据结构print(df.head())print(df.info())

输出:

             BILLDATE  QTY  AMOUNTRETAIL          会员号              订单号 ClassI  \0 2019-06-27 14:50:54  1.0        1698.0  14577169286  127912128711475     手袋   1 2019-06-27 14:50:54  1.0        1798.0  18670076440  120659496170284     手袋   2 2019-06-27 14:50:54  1.0        1198.0  15138684493  129806316702237     手袋   3 2019-06-27 14:50:29  1.0        1598.0  13529513483  123895732841134     手袋   4 2019-06-27 14:50:54  1.0        1298.0  15256290464  126270762692469     手袋   
  ClassII ProductName         产品号     订单金额  0     单肩包         信封包  Rn9Zev5P4a   473.88  1     双肩包          背包  Z4bYH2456W   532.74  2     斜挎包         方形包  pLn7774I4L   234.35  3     斜挎包         方形包  1i1hvhwm9Z  1666.49  4     斜挎包         贝壳包  bfTj1RbD5L   466.85  <class 'pandas.core.frame.DataFrame'>RangeIndex: 857135 entries, 0 to 857134Data columns (total 10 columns):BILLDATE        857135 non-null datetime64[ns]QTY             855399 non-null float64AMOUNTRETAIL    782040 non-null float64会员号             857135 non-null int64订单号             857135 non-null int64ClassI          730153 non-null objectClassII         730153 non-null objectProductName     730153 non-null object产品号             730153 non-null object订单金额            724895 non-null float64dtypes: datetime64[ns](1), float64(3), int64(2), object(4)memory usage: 65.4+ MBNone
df = df[df['ClassI']=='手袋']df = df[df['订单金额']>0] # 选取金额大于0的分析print(df.head())print(df.info())

输出:

             BILLDATE  QTY  AMOUNTRETAIL          会员号              订单号 ClassI  \0 2019-06-27 14:50:54  1.0        1698.0  14577169286  127912128711475     手袋   1 2019-06-27 14:50:54  1.0        1798.0  18670076440  120659496170284     手袋   2 2019-06-27 14:50:54  1.0        1198.0  15138684493  129806316702237     手袋   3 2019-06-27 14:50:29  1.0        1598.0  13529513483  123895732841134     手袋   4 2019-06-27 14:50:54  1.0        1298.0  15256290464  126270762692469     手袋   
  ClassII ProductName         产品号     订单金额  0     单肩包         信封包  Rn9Zev5P4a   473.88  1     双肩包          背包  Z4bYH2456W   532.74  2     斜挎包         方形包  pLn7774I4L   234.35  3     斜挎包         方形包  1i1hvhwm9Z  1666.49  4     斜挎包         贝壳包  bfTj1RbD5L   466.85  <class 'pandas.core.frame.DataFrame'>Int64Index: 451134 entries, 0 to 857133Data columns (total 10 columns):BILLDATE        451134 non-null datetime64[ns]QTY             451100 non-null float64AMOUNTRETAIL    403529 non-null float64会员号             451134 non-null int64订单号             451134 non-null int64ClassI          451134 non-null objectClassII         451134 non-null objectProductName     451134 non-null object产品号             451134 non-null object订单金额            451134 non-null float64dtypes: datetime64[ns](1), float64(3), int64(2), object(4)memory usage: 37.9+ MBNone

每年618差距分析

# 确保 BILLDATE 为 datetime 格式df['BILLDATE'] = pd.to_datetime(df['BILLDATE'])
# 过滤出 618 的订单(每年6月18日)df_618 = df[df['BILLDATE'].dt.month == 6]  # 筛选6月份的数据df_618 = df_618[df_618['BILLDATE'].dt.day == 18]  # 筛选6月18日的数据
# 按年份统计每年618的销售额df_618['year'] = df_618['BILLDATE'].dt.yearsales_by_year = df_618.groupby('year')['订单金额'].sum().reset_index()sales_by_year.columns = ['Year', 'Sales']
# 展示数据print(sales_by_year)

输出如下:

   Year       Sales0  2017  1222162.431  2018     1731.612  2019   102173.913  2020   772919.464  2021   575882.00

分析:2018年的有效数据似乎非常少,2017年的数据似乎过多,我们自从2019-2021年开始分析

import matplotlib.pyplot as plt# 只保留2019年到2021年的数据sales_by_year['Target'] = sales_by_year['Sales'].shift(1) * 1.15sales_by_year['Target'].fillna(0, inplace=True)  # 填充第一个目标为空的值sales_by_year['Gap'] = sales_by_year['Sales'] - sales_by_year['Target']sales_by_year['Achieved'] = sales_by_year['Sales'] >= sales_by_year['Target']
sales_by_year_filtered = sales_by_year[sales_by_year['Year'] >= 2019]# 绘制销售额和目标对比图plt.figure(figsize=(10, 6))plt.bar(sales_by_year_filtered['Year'], sales_by_year_filtered['Sales'], color='skyblue', label='销售额')plt.plot(sales_by_year_filtered['Year'], sales_by_year_filtered['Target'], color='red', marker='o', linestyle='-', label='目标 (15% 增长)')
# 图表设置plt.title('618销售额与目标对比(2019-2021)', fontsize=16)plt.xlabel('年份', fontsize=12)plt.ylabel('销售额(元)', fontsize=12)plt.legend()plt.xticks(sales_by_year_filtered['Year'])plt.show()

​​​​​​​

# 将日期字段转化为年份df_618['Year'] = df_618['BILLDATE'].dt.year
# 过滤需要的年份 2019-2021 年df_618 = df_618[df_618['Year'].isin([2019, 2020, 2021])]
# 计算每年的关键指标annual_data = df_618.groupby('Year').agg({    '订单金额': 'sum',         # 总销售额    'QTY': 'sum',              # 总购买数量    '会员号': pd.Series.nunique, # 每年唯一的消费人数    '订单号': pd.Series.nunique  # 每年唯一的订单数}).reset_index()
# 重命名列annual_data.rename(columns={'订单金额': 'total_sales', 'QTY': 'total_qty', '会员号': 'consumer_count', '订单号': 'order_count'}, inplace=True)
# 计算同比数据 (YoY)annual_data['sales_yoy'] = annual_data['total_sales'].pct_change() * 100  # 订单金额同比annual_data['qty_yoy'] = annual_data['total_qty'].pct_change() * 100      # 购买数量同比annual_data['consumer_yoy'] = annual_data['consumer_count'].pct_change() * 100  # 消费人数同比annual_data['order_yoy'] = annual_data['order_count'].pct_change() * 100  # 订单数同比
print(annual_data.to_string(index=False))

​​​​​​​输出如下:

Year  total_sales  total_qty  consumer_count  order_count   sales_yoy     qty_yoy  consumer_yoy   order_yoy 2019    102173.91      187.0             134          142         NaN         NaN           NaN         NaN 2020    772919.46     1344.0            1246         1296  656.474388  618.716578    829.850746  812.676056 2021    575882.00     1081.0            1016         1044  -25.492625  -19.568452    -18.459069  -19.444444

2020年的销售表现非常出色,超出了目标,但2021年则出现了下滑,未能达成目标。

为了了解618销售未达成的具体原因,公司需要进一步深入分析以下几个方面:

用户活跃度:2021年是否有较少的用户参与活动?购买行为是否减少?

促销力度:2021年的促销活动是否足够吸引力?

市场竞争:是否有更多竞争者加入,导致市场份额下降?

产品表现:2021年产品的销售是否集中于某些类别,哪些类别表现不佳?

人货场角度分析

人(用户分析)

要解决销售额未达成的问题,需要通过分析DAU(每天活跃用户数)、DPU(每天支付用户数)和Install(每个用户首次购买时间)的数据。这些数据将帮助了解销售额的构成,深入分析用户的行为特征。​​​​​​​

# 计算每天活跃用户数(DAU)# DAU是每天至少来访1次的用户。通过订单数据的BILLDATE字段,可以统计每天有多少用户进行了购买。df_618['BILLDATE'] = pd.to_datetime(df_618['BILLDATE'])df_618['date'] = df_618['BILLDATE'].dt.date
# 统计每一天有多少独立的用户dau = df_618.groupby('date')['会员号'].nunique().reset_index(name='DAU')print(dau)
         date   DAU0  2019-06-18   1341  2020-06-18  12462  2021-06-18  1016​​​​​​
# DPU是指每天至少消费1元的用户数。可以通过过滤订单金额大于1元的记录来计算每天的DPU。# 计算每天支付用户数(DPU),即订单金额大于1的用户dpu = df_618[df_618['订单金额'] > 1].groupby('date')['会员号'].nunique().reset_index(name='DPU')print(dpu)

​​​​​​​输出:

         date   DPU0  2019-06-18   1341  2020-06-18  12462  2021-06-18  1013​​​​​​
# 计算每个用户的首次购买时间install = df_618.groupby('会员号')['BILLDATE'].min().reset_index(name='首次购买时间')# print(install)
# 计算每天的销售额daily_sales = df_618.groupby('date')['订单金额'].sum().reset_index(name='销售额')# 将DAU、DPU、销售额等数据合并到一起summary = dau.merge(dpu, on='date').merge(daily_sales, on='date')print(summary.head())

​​​​​​​输出如下:

        date   DAU   DPU        销售额0  2019-06-18   134   134  102173.911  2020-06-18  1246  1246  772919.462  2021-06-18  1016  1013  575882.00​​​​​​
# 可视化DAU、DPU和销售额的趋势plt.figure(figsize=(18, 6))  # 宽18,高6
# DAU趋势plt.subplot(1, 3, 1)plt.plot(summary['date'], summary['DAU'], label='DAU', color='blue')plt.title('DAU趋势')plt.xlabel('日期')plt.ylabel('活跃用户数')
# DPU趋势plt.subplot(1, 3, 2)plt.plot(summary['date'], summary['DPU'], label='DPU', color='green')plt.title('DPU趋势')plt.xlabel('日期')plt.ylabel('支付用户数')
# 销售额趋势plt.subplot(1, 3, 3)plt.plot(summary['date'], summary['销售额'], label='销售额', color='red')plt.title('销售额趋势')plt.xlabel('日期')plt.ylabel('销售额')
plt.tight_layout()plt.show()

​​​​​​​

# 计算 DPU/DAU 比率summary['DPU_DAU_ratio'] = summary['DPU'] / summary['DAU']
# 绘制 DAU 和 DPU 趋势图plt.figure(figsize=(10, 6))plt.plot(summary['date'], summary['DAU'], label='DAU', marker='o')plt.plot(summary['date'], summary['DPU'], label='DPU', marker='o')plt.xlabel('Date')plt.ylabel('Users')plt.title('DAU and DPU Trends Over Time')plt.legend()plt.show()
# 绘制付费转化率趋势图plt.figure(figsize=(10, 6))plt.plot(summary['date'], summary['DPU_DAU_ratio'], label='DPU/DAU Ratio', marker='o')plt.xlabel('Date')plt.ylabel('DPU/DAU Ratio')plt.title('Conversion Rate Over Time')plt.legend()plt.show()

# 计算ARPUsummary['ARPU'] = summary['销售额'] / summary['DPU']
# 绘制销售额和用户增长的关系plt.figure(figsize=(10, 6))plt.plot(summary['date'], summary['销售额'], label='Sales', marker='o', color='blue')plt.plot(summary['date'], summary['DPU'], label='DPU', marker='o', color='green')plt.xlabel('Date')plt.ylabel('Sales and DPU')plt.title('Sales and DPU Trends Over Time')plt.legend()plt.show()
# 绘制ARPU 的变化趋势plt.figure(figsize=(10, 6))plt.plot(summary['date'], summary['ARPU'], label='ARPU', marker='o', color='orange')plt.xlabel('Date')plt.ylabel('ARPU')plt.title('ARPU (Average Revenue Per User) Over Time')plt.legend()plt.show()

2021年618的表现不如2020年,可能的原因包括:

促销力度不够:2021年可能没有提供足够吸引力的折扣和活动,导致用户和销售额减少。

用户流失或兴趣下降:活动的吸引力不如前一年,可能导致了用户的流失或部分用户的消费热情下降。

市场竞争增加:2021年可能有其他电商平台的强力竞争,使得部分用户转向其他平台消费。​​​​​​​

# import matplotlib.font_manager# fonts = [f.name for f in matplotlib.font_manager.fontManager.ttflist]# print("Available Fonts:", fonts)​​​​​​
# 提取年份并创建新的列df['日期']= df['BILLDATE'].dt.datedf['年份'] = df['BILLDATE'].dt.yeardf['日期']= df['日期'].astype('datetime64')
# 查看结果print(df[['BILLDATE', '年份']].head())
# 计算第 n 次消费df['第n次消费'] = df.groupby(by='会员号')['日期'].rank(ascending=True, method='dense')
# 标记新老客df.loc[(~df['年份'].isnull()) & (df['第n次消费'] == 1), '新老客'] = '新客'df.loc[(~df['年份'].isnull()) & (df['第n次消费'] > 1), '新老客'] = '老客'
# 查看结果print(df[['会员号', '日期', '第n次消费', '新老客']].head())
# 618已购的老客vip_618 = df[(df['年份']==2021.0)&(df['新老客']=='老客')][['会员号']].drop_duplicates()
# 筛选出未在 618 活动中消费的老客户vip_no_618 = (    df[(df['BILLDATE'] < '2021-06-12') & (df['第n次消费'] > 1) & (~df['会员号'].isin(vip_618['会员号']))]    [['会员号']]    .drop_duplicates()    .sample(n=len(vip_618)))
# 筛选老订单old_orders = df[(df['BILLDATE'] < '2021-06-12') & (df['会员号'].isin(vip_618['会员号'].append(vip_no_618['会员号'])))]
# 计算累计消费金额和最近消费日期rfm = old_orders.groupby(by='会员号').agg({'订单金额': 'sum', 'BILLDATE': 'max'}).rename(columns={'订单金额': '累计消费金额', 'BILLDATE': '最近消费日期'})
# 计算消费频次f = old_orders.groupby(by='会员号').agg({'BILLDATE': pd.Series.nunique}).rename(columns={'BILLDATE': '消费频次'})
# 合并累计消费金额、最近消费日期和消费频次rfm = pd.concat([rfm, f], axis=1)
# 计算最近消费间隔rfm['最近消费间隔'] = (datetime(2021, 6, 1) - rfm['最近消费日期']).dt.days
# 设置“消费”列,根据会员号是否在指定列表中进行标记rfm.loc[rfm.index.isin(vip_618['会员号']), '消费'] = 1rfm.loc[rfm.index.isin(vip_no_618['会员号']), '消费'] = 0
# 重置索引rfm = rfm.reset_index()
# 确保“消费”列为整数类型rfm['消费'] = rfm['消费'].astype(int)
# 检查 RFM 数据的类型print(rfm.dtypes)print(rfm.head())
​​​​

输出: 

             BILLDATE    年份0 2019-06-27 14:50:54  20191 2019-06-27 14:50:54  20192 2019-06-27 14:50:54  20193 2019-06-27 14:50:29  20194 2019-06-27 14:50:54  2019           会员号         日期  第n次消费 新老客0  14577169286 2019-06-27    1.0  新客1  18670076440 2019-06-27    1.0  新客2  15138684493 2019-06-27    1.0  新客3  13529513483 2019-06-27    1.0  新客4  15256290464 2019-06-27    1.0  新客会员号                int64累计消费金额           float64最近消费日期    datetime64[ns]消费频次               int64最近消费间隔             int64消费                 int64dtype: object           会员号   累计消费金额              最近消费日期  消费频次  最近消费间隔  消费0  13010069876   843.42 2020-11-03 21:02:44     2     209   01  13010389927   629.95 2021-05-10 16:37:06     1      21   12  13010766215  1917.51 2018-07-02 03:58:23     2    1064   03  13011771547  4052.62 2019-09-10 13:25:07     4     629   04  13011814453   269.53 2021-06-08 00:45:21     1      -8   1​​​​​​
# 对 RFM 进行评分(假设 R、F、M 各分为 5 级)rfm['R_Score'] = pd.qcut(rfm['最近消费间隔'], 5, labels=[5, 4, 3, 2, 1]).astype(int)rfm['F_Score'] = pd.qcut(rfm['消费频次'], 2, labels=[1, 5], duplicates='drop').astype(int)rfm['M_Score'] = pd.qcut(rfm['累计消费金额'], 5, labels=[1, 2, 3, 4, 5], duplicates='drop').astype(int)

# 计算 RFM 总分rfm['RFM_Score'] = rfm['R_Score'] + rfm['F_Score'] + rfm['M_Score']
# RFM 分类规则(示例分类规则,可根据实际情况调整)def classify_rfm(row):    if row['R_Score'] >= 4 and row['F_Score'] >= 4 and row['M_Score'] >= 4:        return '重要价值客户'    elif row['R_Score'] >= 4 and row['F_Score'] >= 4:        return '重要发展客户'    elif row['R_Score'] >= 3 and row['F_Score'] >= 3:        return '重要保持客户'    elif row['R_Score'] == 1:        return '重要挽留客户'    else:        return '一般客户'
rfm['客户分类'] = rfm.apply(classify_rfm, axis=1)
# print(rfm[['会员号', '累计消费金额', '最近消费日期', '消费频次', '最近消费间隔', '消费', 'R_Score', 'F_Score', 'M_Score', 'RFM_Score', '客户分类']])

​​​​​​​开始绘图。

import matplotlib.pyplot as plt
# 统计不同客户类型的数量customer_type_counts = rfm['客户分类'].value_counts()
# 绘制饼图plt.figure(figsize=(8, 6))customer_type_counts.plot(kind='pie', autopct='%1.1f%%', startangle=90, colors=['#ff9999','#66b3ff','#99ff99','#ffcc99'])plt.title('客户类型分布')plt.ylabel('')plt.show()

一般客户和重要挽留客户占比较大。

货(商品分析)​​​​​​​

# 商品分类销量和销售额统计class_sales = df.groupby(['ClassI', 'ClassII']).agg({    'QTY': 'sum',    'AMOUNTRETAIL': 'sum'}).reset_index()
# 显示结果print(class_sales)

输出: 

ClassI ClassII       QTY  AMOUNTRETAIL0     手袋     单肩包   96600.0  1.255087e+081     手袋     双肩包   57608.0  8.221095e+072     手袋     手拿包     804.0  2.987113e+053     手袋     手提包   43367.0  6.257863e+074     手袋     斜挎包  252337.0  2.870787e+085     手袋      腰包    5046.0  5.065502e+06​​​​​​
# 将BILLDATE转换为日期df['date'] = df['BILLDATE'].dt.date
# 按日期统计销量和销售额sales_trend = df.groupby('date').agg({    'QTY': 'sum',    'AMOUNTRETAIL': 'sum'}).reset_index()
# 绘制销售趋势图plt.figure(figsize=(12, 6))plt.plot(sales_trend['date'], sales_trend['AMOUNTRETAIL'], label='销售额', color='red')plt.xlabel('日期')plt.ylabel('销售额')plt.title('每日销售额趋势')plt.legend()plt.show()

# 找出销量最高的前10个产品top_products = df.groupby('ProductName').agg({    'QTY': 'sum',    'AMOUNTRETAIL': 'sum'}).reset_index().sort_values(by='QTY', ascending=False).head(10)
print(top_products)
​​​​

输出如下:

  ProductName       QTY  AMOUNTRETAIL7          方形包  155481.0  1.880299e+088           桶包   68153.0  8.192661e+0713          背包   57575.0  8.210963e+070          信封包   39331.0  4.367825e+0711        波士顿包   27291.0  3.289634e+0717         购物袋   25864.0  3.114452e+0719         饺子包   15829.0  1.619862e+0716         贝壳包   15307.0  1.707305e+071          公事包   10398.0  1.797838e+072          剑桥包    7391.0  6.979334e+06

结论:

方形包销量最高,销售额也最大,显示出很高的市场需求。这可能是因为它的款式或功能符合大部分消费者的需求。

桶包和背包也有很高的销量和销售额,这些产品可能是主力产品,在消费者群体中接受度较高。

购物袋、饺子包、贝壳包等产品的销量相对较低,但销售额相对较高,说明这些产品单价较高。​​​​​​​

# 价格区间分组df['价格区间'] = pd.cut(df['订单金额'], bins=[0, 500, 1000, 1500, 2000, np.inf], labels=['0-500', '500-1000', '1000-1500', '1500-2000', '2000以上'])price_sensitivity = df.groupby('价格区间').agg({    'QTY': 'sum',    'AMOUNTRETAIL': 'sum'}).reset_index()
print(price_sensitivity)

输出: 

        价格区间       QTY  AMOUNTRETAIL0      0-500  212729.0  2.332865e+081   500-1000  191541.0  2.550952e+082  1000-1500   41221.0  5.966882e+073  1500-2000    7849.0  1.074455e+074     2000以上    2422.0  3.946177e+06

0-500元和500-1000元的产品是销售的主力,这两个价格区间的销量和销售额最高。这可能表明顾客更倾向于购买价格较低的商品,这类商品符合大众消费的需求。

场(渠道分析)​​​​​​​

# 按月汇总销售数据df['YearMonth'] = df['BILLDATE'].dt.to_period('M')monthly_sales = df.groupby('YearMonth')['订单金额'].sum().reset_index()plt.figure(figsize=(12, 6))plt.plot(monthly_sales['YearMonth'].astype(str), monthly_sales['订单金额'], color='b', marker='o')plt.xlabel('年月')plt.ylabel('月度销售额')plt.title('月度销售趋势分析')plt.xticks(rotation=45)plt.show()

​​​​​​​

# 计算每位客户的累计消费金额和订单数量customer_sales = df.groupby('会员号').agg({    '订单金额': 'sum',    '订单号': 'nunique'}).rename(columns={'订单金额': '累计消费金额', '订单号': '订单数量'})# print(customer_sales)​​​​​​
# 产品偏好分析product_sales = df.groupby(['ClassI', 'ClassII'])['订单金额'].sum().reset_index()top_products = product_sales.sort_values(by='订单金额', ascending=False).head(5)
plt.figure(figsize=(12, 6))plt.barh(top_products['ClassI'] + ' ' + top_products['ClassII'], top_products['订单金额'], color='skyblue')plt.xlabel('销售额')plt.ylabel('产品分类')plt.title('前5热销产品分类分析')plt.gca().invert_yaxis()plt.show()

斜挎包销售更好。​​​​​​​

# 计算每个订单的订单金额和数量order_analysis = df.groupby('订单号').agg({    '订单金额': 'sum',    'QTY': 'sum'}).rename(columns={'订单金额': '订单总金额', 'QTY': '总购买量'})​​​​​​
plt.figure(figsize=(12, 6))
# 绘制月度销售趋势图plt.plot(monthly_sales['YearMonth'].astype(str), monthly_sales['订单金额'], color='b', marker='o')plt.xlabel('年月', fontsize=12)plt.ylabel('月度销售额', fontsize=12)plt.title('月度销售趋势图', fontsize=14)plt.xticks(rotation=45)  # 横坐标倾斜45度,便于阅读
plt.tight_layout()  # 自动调整子图参数,填充图像区域plt.show()

# 促销力度分析df['Discount'] = (df['AMOUNTRETAIL'] - df['订单金额']) / df['AMOUNTRETAIL']avg_discount = df.groupby('YearMonth')['Discount'].mean()
plt.figure(figsize=(10, 6))plt.plot(avg_discount.index.astype(str), avg_discount.values, marker='o', color='purple', label='平均折扣率')plt.title('月度平均折扣率趋势')plt.xlabel('月份')plt.ylabel('平均折扣率')plt.xticks(rotation=45)  # 横坐标倾斜45度,便于阅读plt.legend()plt.show()

618的折扣力度越来越小。​​​​​​​

# 按产品名称和年份统计每年618期间的销量和销售额product_analysis = df_618.groupby(['year', 'ProductName']).agg({'QTY': 'sum', 'AMOUNTRETAIL': 'sum'}).reset_index()# print("各年618期间不同产品销量和销售额数据:")# print(product_analysis)
import seaborn as sns
plt.figure(figsize=(12, 8))sns.barplot(x='year', y='QTY', hue='ProductName', data=product_analysis)plt.title('各年618期间不同产品销量对比')plt.xlabel('年份')plt.ylabel('销量')plt.xticks(rotation=45)plt.legend(title='产品名称')plt.show()
# 销售额对比plt.figure(figsize=(12, 8))sns.barplot(x='year', y='AMOUNTRETAIL', hue='ProductName', data=product_analysis)plt.title('各年618期间不同产品销售额对比')plt.xlabel('年份')plt.ylabel('销售额')plt.xticks(rotation=45)plt.legend(title='产品名称')plt.show()

图片

结论:

从2019年到2021年,可以看到一些新产品(如化妆包、圆形包、医生包等)在销量和销售额上表现较好,特别是2020年。产品种类的多样化可能吸引了更多消费者。

方形包和桶包在销量和销售额上显著增长,尤其是在2020年。这可能反映出消费者的购买偏好发生了变化,或是由于促销活动或市场趋势的推动。

背包在2020年销量和销售额较高,但在2021年有所下降,表明市场对背包的需求减少,可能是由于产品同质化或消费趋势的变化。​​​​​​​

# 添加价格区间字段df_618['price_range'] = pd.cut(df_618['AMOUNTRETAIL'], bins=[0, 500, 1000, 1500, 2000, float('inf')], labels=['0-500', '500-1000', '1000-1500', '1500-2000', '2000以上'])
# 按年份和价格区间统计销量和销售额price_analysis = df_618.groupby(['year', 'price_range']).agg({'QTY': 'sum', 'AMOUNTRETAIL': 'sum'}).reset_index()# print("各年618期间不同价格区间的销量和销售额数据:")# print(price_analysis)# 绘制价格区间对比图plt.figure(figsize=(12, 8))sns.barplot(x='year', y='QTY', hue='price_range', data=price_analysis)plt.title('各年618期间不同价格区间的销量对比')plt.xlabel('年份')plt.ylabel('销量')plt.xticks(rotation=45)plt.legend(title='价格区间')plt.show()

结论:2020年和2021年,许多消费者选择了更高价格区间的产品,可能是由于促销活动的影响,或者市场上出现了更多具有吸引力的中高端产品。

给出建议

结论:

618销售下降,原因:

人:用户购买力度不够,一般客户占比太高,日活跃用户和付费用户数都有所下降。

货:商品结构发生了一些改变。

场:618商品的折扣力度少了。

业务建议:

随着时间推移,消费者的购买偏好逐渐向中高价区间产品倾斜,并且整体的市场需求有所增长。

可以考虑加强对热销产品(如方形包、桶包等)的推广,并且关注新兴市场需求(如化妆包、圆形包等)。

在促销力度、用户活跃提升和吸引新用户方面做出调整,以达到更好的营销效果。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值