基于 Python 的商品销售数据可视化分析
·
一、数据预处理:为分析打好基础
在进行可视化分析前,我们需要先对原始数据进行预处理,将其转化为便于分析的格式。本次分析的核心数据包括商品标题、店名、销量、销售额等信息,预处理主要涉及文本分词和类别标注两个关键步骤。
商品标题中包含了丰富的信息(如品类、适用人群等),但原始标题是连续的字符串,无法直接用于分析。我们使用 jieba 分词库的 “搜索引擎模式” 对标题进行分词,将长文本拆分为独立的词语:
python
import jieba
subtitle = []
# 遍历所有标题,用搜索引擎模式分词(更细粒度,适合提取关键词)
for each in data['title']:
k = jieba.lcut_for_search(each)
subtitle.append(k)
data['subtitle'] = subtitle # 新增“分词结果”列
例如,“男士保湿面霜” 会被拆分为 ["男士", "保湿", "面霜", "保湿面霜"],为后续的类别标注和人群定位提供了关键词基础。
为了分析不同品类的销售表现,我们需要给商品标注 “大类” 和 “小类”。这里通过预设的分类字典(dcatg)实现自动标注 —— 字典键为分词后的关键词,值为对应的(大类,小类):
python
# 假设dcatg是提前构建的分类字典,例如:{"面霜": ("护肤品", "面部护理"), ...}
sub_type = [] # 小类
main_type = [] # 大类
for i in range(len(data)):
exist = False
# 遍历标题分词结果,匹配分类字典
for j in data['subtitle'][i]:
if j in dcatg:
sub_type.append(dcatg[j][1])
main_type.append(dcatg[j][0])
exist = True
break # 取第一个匹配的类别
if not exist:
sub_type.append('其他') # 未匹配到的归为“其他”
main_type.append('其他')
data['sub_type'] = sub_type
data['main_type'] = main_type
二、多维度可视化分析
1. 品牌表现分析:谁是市场 “优等生”?
品牌是消费者选择商品的重要参考,我们从 “商品数量”“总销量”“总销售额” 和 “平均单价” 四个指标对比不同品牌的表现:python
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.figure(figsize=(12, 10))
# 子图1:各品牌商品数量(反映品牌丰富度)
plt.subplot(2,2,1)
data['店名'].value_counts().sort_values().plot.bar()
plt.title('各品牌商品数')
# 子图2:各品牌总销量(反映市场接受度)
plt.subplot(2,2,2)
data.groupby('店名').sale_count.sum().sort_values().plot.bar()
plt.title('各品牌总销量')
# 子图3:各品牌总销售额(反映营收能力)
plt.subplot(2,2,3)
data.groupby('店名')['销售额'].sum().sort_values().plot.bar()
plt.title('各品牌总销售额')
# 子图4:各品牌平均单价(反映定价策略)
plt.subplot(2,2,4)
avg_price = data.groupby('店名')['销售额'].sum() / data.groupby('店名').sale_count.sum()
avg_price.sort_values().plot.bar()
plt.title('各品牌平均单价')
plt.tight_layout() # 自动调整布局
2. 品类分布分析:哪些品类更受欢迎?
品类是连接商品和消费者的核心纽带,我们从 “大类” 和 “小类” 两个层级,分析不同品类的销量和销售额占比:
python
# 大类与小类的销量、销售额占比(饼图)
plt.figure(figsize=(12, 12))
# 大类销量占比
plt.subplot(2,2,1)
data.groupby('main_type').sale_count.sum().plot.pie(autopct='%0f%%', title='各大类销售量占比')
# 大类销售额占比
plt.subplot(2,2,2)
data.groupby('main_type')['销售额'].sum().plot.pie(autopct='%0f%%', title='各大类销售额占比')
# 小类销量占比
plt.subplot(2,2,3)
data.groupby('sub_type').sale_count.sum().plot.pie(autopct='%0f%%', title='各小类销售量占比')
# 小类销售额占比
plt.subplot(2,2,4)
data.groupby('sub_type')['销售额'].sum().plot.pie(autopct='%0f%%', title='各小类销售额占比')
plt.tight_layout()
价格是影响购买决策的核心因素,我们将品牌按平均单价分为 “0-100 元”“100-200 元”“200-300 元”“300 元以上” 四个区间,分析不同价格带的销售表现:
python
# 划分价格区间
A = avg_price[(avg_price <= 100) & (avg_price > 0)].index # 0-100元
B = avg_price[(avg_price <= 200) & (avg_price > 100)].index # 100-200元
C = avg_price[(avg_price <= 300) & (avg_price > 200)].index # 200-300元
D = avg_price[avg_price > 300].index # 300元以上
# 可视化:各价格区间的销售额占比与平均单店销售额
plt.figure(figsize=(16, 8))
# 左图:各品牌销售额占比(按价格区间着色)
plt.subplot(1,2,1)
sum_sale_byprice = sum_sale[A].sort_values().append(sum_sale[B].sort_values()).append(sum_sale[C].sort_values()).append(sum_sale[D].sort_values())
plt.pie(x=sum_sale_byprice, labels=sum_sale_byprice.index,
colors=['grey']*len(A)+['g']*len(B)+['y']*len(C)+['m']*len(D),
autopct='%0f%%')
# 右图:各价格区间的平均单店销售额
plt.subplot(1,2,2)
plt.bar('0-100元', np.mean(sum_sale[A]), color='grey')
plt.bar('100-200元', np.mean(sum_sale[B]), color='g')
plt.bar('200-300元', np.mean(sum_sale[C]), color='y')
plt.bar('300元以上', np.mean(sum_sale[D]), color='m')
plt.title('不同价格区间的平均单店销售额')
python
# 男士与非男士专用商品的销量、销售额占比
plt.figure(figsize=(16, 16))
# 男士专用商品中小类销量占比
plt.subplot(2,2,1)
data.loc[data['是否男士专用'] == '是'].groupby('sub_type').sale_count.sum().plot.pie(autopct='%0f%%', title='男士各小类销售量占比')
# 非男士专用商品中小类销量占比
plt.subplot(2,2,2)
data.loc[data['是否男士专用'] == '否'].groupby('sub_type').sale_count.sum().plot.pie(autopct='%0f%%', title='非男士专用各小类销售量占比')
# 男士专用商品销量占总销量比例
plt.subplot(2,2,3)
data.groupby('是否男士专用').sale_count.sum().plot.pie(autopct='%0f%%', title='男士专用销售量占比')
# 男士专用商品销售额占总销售额比例
plt.subplot(2,2,4)
data.groupby('是否男士专用')['销售额'].sum().plot.pie(autopct='%0f%%', title='男士专用销售额占比')
下期再见
更多推荐
所有评论(0)