数据分析案例(2)
电商双11美妆数据分析
一、data.groupby('店名').sale_count.sum() 按店名对销售数量进行分组求和。
data.groupby('店名').sale_count.sum()[data.groupby('店名').sale_count.sum() == 0].index 筛选出总销量为0的店铺名称索引。
data[data['店名']].isin(...) 找出原始数据中店名在上述总销量为0的店铺名称列表中的行。
最后 data.drop(index = ...) 删除这些行,得到处理后的数据 data1。
库导入与图形初始化
import seaborn as sns:导入 seaborn 库,用于创建美观的统计图形。
plt.figure(figsize = (16,12)):创建一个 matplotlib 图形对象,设置图形大小为宽度16单位,高度12单位。
plt.subplot(2,1,1):创建一个2行1列的子图布局,并定位到第1个子图,后续在此子图绘制各店铺各大类销售量图。
plt.tick_params(labelsize = 10):设置子图刻度标签的字体大小为10。
绘制销售量柱状图
sns.barplot(x = '店名', y ='sale_count', hue ='main_type', estimator=np.sum, data = data1, ci = 0):
x = '店名':指定横坐标为店铺名称。
y ='sale_count':指定纵坐标为销售数量。
hue ='main_type':按商品大类区分柱子颜色。
estimator=np.sum:对每个 x(店名)和 hue(大类)组合下的 y(销售数量)进行求和计算。
data = data1:指定使用的数据为之前处理过的 data1。
ci = 0:不显示置信区间。
后续 plt.title、plt.ylabel 分别设置子图标题和纵轴标签及字体大小。
绘制销售额柱状图
plt.subplot(2,1,2):定位到2行1列子图布局的第2个子图,用于绘制各店铺各大类销售额图。
下面的 plt.tick_params、sns.barplot、plt.title、plt.ylabel 与绘制销售量图类似,只是 y 轴数据变为 销售额 。
plt.tight_layout():自动调整子图间距,防止标签等重叠。
图形初始化与子图设置
plt.figure(figsize = (16,12)):创建一个 matplotlib 图形对象,设置其大小为宽16单位、高12单位 ,为后续绘图提供空间。
plt.subplot(2,1,1):将图形划分为2行1列的子图布局,并定位到第1个子图位置,准备绘制各店铺中小类销售量的图表。
plt.tick_params(labelsize = 10):设置子图刻度标签的字体大小为10,使刻度标签显示更合适。
绘制各店铺中小类销售量柱状图
sns.barplot(x = '店名', y ='sale_count', hue ='sub_type', estimator=np.sum, data = data1, ci = 0):
x = '店名':指定横坐标为店铺名称,用于区分不同店铺。
y ='sale_count':指定纵坐标为销售数量,展示每个店铺下不同小类的销售数量情况。
hue ='sub_type':依据商品小类区分柱子颜色,便于直观区分同一店铺下不同小类商品的销售情况。
estimator=np.sum:表示针对每个 x(店名)和 hue(小类)组合,对 y(销售数量)进行求和计算,统计每个店铺下各小类的总销售数量。
data = data1:指定使用经过前期处理(去除总销量为0的店铺等操作)的数据 data1 进行绘图。
ci = 0:不显示置信区间,使图表更简洁。
plt.title('各店铺中各小类的销售量', fontsize = 20):设置子图标题为“各店铺中各小类的销售量”,字体大小为20,突出图表主题。
plt.ylabel('销量', fontsize = 15):设置纵轴标签为“销量”,字体大小为15,明确纵轴代表的含义。
绘制各店铺中小类销售额柱状图
plt.subplot(2,1,2):定位到2行1列子图布局中的第2个子图,为绘制销售额图表做准备。
后续的 plt.tick_params、sns.barplot、plt.title、plt.ylabel 操作与绘制销售量图表类似,只是 y 轴数据变为“销售额” ,用于展示各店铺下不同小类商品的销售金额情况。
plt.tight_layout():自动调整子图间距,防止子图之间的标签、标题等元素相互重叠,使整个图形展示更美观、清晰。
事实上可以看出相宜本草在面霜、乳液、精华、补水、化妆水、眼部护理以及防晒类中都是销量最高的。美宝莲在口红、眼部彩妆也都是卖的最好的。而妮维雅在清洁类中一骑绝尘。在这里我们就可以用上之前提取出的新特征-是否男性专用。因为清洁类显然是有男性市场的。
二、关于性别
- 设置图形大小
划分子图布局
子图绘制
男士的销量基本来自于清洁类,其次是补水类。而这两类正是总销量中占比最高的两类。
非男士专用中,补水类成为了销量最高的类别,清洁类降到了第二位。
男士专用的销量以及销售额占比都比较低。
显然,在没有区分性别的情况下,由于清洁类是男性女性通用,所以占得销量最高是理所应当的。而非男士专用中,女性消费者较多,所以补水类一跃成为最高销量。尽管就整个销量而言,男士专用的占比不高,但是这也说明男性市场是一个值得发展急需拓宽的点。如果增加更多关于男性护肤品的推广,有可能会吸引更多的男性消费者从而增加销量。所以进一步分析,各个店铺的男性专用商品的销量。
2.
数据筛选
male_data = data1.loc[data1['是否男士专用'] == '是']:从经过前期处理的数据 data1 中筛选出“是否男士专用” 这一列值为“是” 的数据,即只保留男士专用商品的数据,存储在 male_data 中。
图形绘制
plt.figure(figsize = (12,8)):创建一个 matplotlib 图形对象,设置图形大小为宽度12单位,高度8单位。
sns.barplot(x = '店名', y ='sale_count', hue ='main_type', estimator=np.sum, data = male_data, ci = 0):
x = '店名':指定横坐标为店铺名称,用于展示不同店铺的情况。
y ='sale_count':指定纵坐标为销售数量,体现各店铺男士专用商品的销售数量。
hue ='main_type':按商品大类区分柱子颜色,便于观察各店铺中不同大类男士专用商品的销售情况。
estimator=np.sum:对每个店铺和大类组合下的销售数量进行求和计算。
data = male_data:使用筛选出的男士专用商品数据 male_data 进行绘图。
ci = 0:不显示置信区间,使图表更简洁。
plt.title('各店男士专用商品销量', fontsize = 15):设置图表标题为“各店男士专用商品销量”,字体大小为15。
plt.ylabel('销量', fontsize = 10):设置纵轴标签为“销量”,字体大小为10。
plt.tight_layout():自动调整子图间距,防止图表元素重叠,使图表展示更美观。
图像初始化与子图设置
绘制男士专用销量图
绘制非男士专用销量图
- 关于时间
导入模块与图形初始化
from datetime import datetime:从 datetime 模块中导入 datetime 类,用于处理日期和时间相关操作。
plt.figure(figsize = (12,12)):创建一个 matplotlib 图形对象,设置图形大小为宽度12单位、高度12单位。
计算每日销量并绘图
数据聚合与日期格式转换
sale_day=data.groupby('update_time').sale_count.sum():按 update_time(可能是记录销售数据的时间字段 )对数据进行分组,并对每组的销售数量(sale_count)求和,得到每天的销售总量。
sale_day.index = [datetime.strptime(i, '%Y/%m/%d') for i in sale_day.index]:datetime.strptime() 函数用于将字符串类型的日期(原 update_time 字段值,格式为 %Y/%m/%d,即年/月/日 )转换为 datetime 对象,然后将其设置为 sale_day 数据的索引,方便后续绘图时按日期顺序展示。
绘图操作
plt.subplot(2,1,1):将图形划分为2行1列的子图布局,并定位到第1个子图,用于绘制每日销售量图。
plt.tick_params(labelsize = 15):设置子图刻度标签的字体大小为15。
sale_day.plot():绘制 sale_day 数据的折线图,展示每日销售量随时间的变化趋势。
plt.grid(linestyle = '-'):在图中添加网格线,linestyle = '-' 表示网格线为实线,方便观察数据点位置。
plt.title('每日销售量', fontsize = 15):设置子图标题为“每日销售量”,字体大小15。
plt.ylabel('销量', fontsize = 10):设置纵轴标签为“销量”,字体大小10。
计算每日销售额并绘图
数据聚合与日期格式转换
r_day=data.groupby('update_time')['销售额'].sum():按 update_time 对数据进行分组,并对每组的销售额(销售额 列 )求和,得到每天的销售总额。
r_day.index = [datetime.strptime(i, '%Y/%m/%d') for i in r_day.index]:同样将字符串日期转换为 datetime 对象并设置为索引。
绘图操作
plt.subplot(2,1,2):定位到2行1列子图布局的第2个子图,用于绘制每日销售额图。
plt.tick_params(labelsize = 15):设置刻度标签字体大小为15。
r_day.plot():绘制 r_day 数据的折线图,展示每日销售额随时间的变化。
plt.grid(linestyle = '-'):添加网格线
plt.title('每日销售额', fontsize = 15):设置子图标题为“每日销售额”,字体大小15。
plt.ylabel('销售额', fontsize = 15):设置纵轴标签为“销售额”,字体大小15。
调整子图布局
plt.tight_layout():自动调整子图间距,防止子图之间的标签、标题等元素相互重叠,使图形展示更美观、清晰。
观察两个折线图,其走势是相同的,因为整个销量与销售额应该是成正相关的。图形有如下特点:
在9日单日销售量达到峰值,而在11日达到最小
10日之前的波动趋势相对稳定,在11日有一个急剧的下降
11日过后又开始缓慢的增长。由于统计的日期有限,无法判断这种趋势是长期的还是短期的。
那么,双11活动反而在双11当天的销量有剧烈的下滑,其原因大概率是双11的预热、预售活动等等。在临近双11时,9日销量达到最高,因为更临近了,所以关注的人更多,购买的人更多。但是在10日有所下降,和双11下降有相同的理由,是人们都主观的认为双11当天的购买人数太多,可能会有网络、平台卡顿导致无法成功下单的忧虑,所以反而造成了双11当天销量急剧下滑。而双11过后又开始有了销量增长,有可能是店铺持续优惠,比如赠送满减卷,让许多已经消费过的消费者再次消费。
3对评论数进行分析
图形初始化与子图设置
◦ plt.figure(figsize = (16,6)):创建一个 matplotlib 图形对象,设置图形大小为宽度16单位、高度6单位,为后续绘制子图提供空间。
◦ plt.subplot(1,2,1):将图形划分为1行2列的子图布局,并定位到第1个子图,用于绘制每个店铺总评论数的图表。
◦ plt.subplot(1,2,2):定位到1行2列子图布局的第2个子图,用于绘制每个店铺平均多少单一条评论的图表。
绘制每个店铺总评论数图表
◦ data.groupby('店名').comment_count.sum().sort_values().plot.bar():
◦ data.groupby('店名').comment_count.sum():按店铺名称(店名)对数据进行分组,然后对每组的评论数量(comment_count)求和,统计出每个店铺的总评论数。
◦ .sort_values():将上述求和结果按升序排列(默认升序 )。
◦ .plot.bar():绘制柱状图,展示各店铺总评论数的多少,柱子高度代表评论数。
◦ plt.title('每个店铺总评论数'):设置该子图的标题为“每个店铺总评论数”,明确图表主题。
绘制每个店铺平均多少单一条评论图表
(data1.groupby('店名').sale_count.sum()/data1.groupby('店名').comment_count.sum()).sort_values().plot.bar():
◦ data1.groupby('店名').sale_count.sum():按店铺名称对销售数量(sale_count)分组求和,得到每个店铺的总销售数量。
◦ data1.groupby('店名').comment_count.sum():按店铺名称对评论数量分组求和,得到每个店铺的总评论数。
◦ data1.groupby('店名').sale_count.sum()/data1.groupby('店名').comment_count.sum():计算每个店铺的销售单数与评论数的比值,即平均多少单会产生一条评论。
◦ .sort_values().plot.bar():将上述比值结果按升序排列后绘制柱状图,展示各店铺平均评论产生的情况。
◦ plt.title('每个店铺平均多少单一条评论'):设置该子图的标题为“每个店铺平均多少单一条评论”,突出图表展示内容。
调整子图布局
◦ plt.tight_layout():自动调整子图间距,防止子图的标题、坐标轴标签等元素相互重叠,使整个图形展示更美观、协调。