剖析天猫双十一的美妆产品销售数据

Catalogue
  1. 1. 项目描述
  2. 2. 数据导入
  3. 3. 数据清洗
    1. 3.1. 清除重复数据
    2. 3.2. 索引重构
    3. 3.3. 日期处理
    4. 3.4. 缺失值处理
  4. 4. 信息提取
    1. 4.1. 表格信息提取
    2. 4.2. 添加商品类别
    3. 4.3. 新增主类别 & 子类别
    4. 4.4. 新增 “是否为男士专用” 类别
    5. 4.5. 新增销售额 & 购买日期
    6. 4.6. 时间列类型装换 & 新增以天为单位时间列
  5. 5. 分析及可视化
    1. 5.1. 各品牌SKU数
    2. 5.2. 各品牌销量&销售额
    3. 5.3. 各类别销售量
    4. 5.4. 各品牌销量 - 主类别
    5. 5.5. 各品牌销售额 - 主类别
    6. 5.6. 各品牌销量 - 子类别
    7. 5.7. 各品牌销售额 - 子类别
    8. 5.8. 品牌热度
    9. 5.9. 各品牌价格分析
    10. 5.10. 平均销量&平均销售额
    11. 5.11. 男性护肤品销量分析
    12. 5.12. 购买时间与销量分析
  6. 6. 总结
  7. 7. 写在最后

摘要
深度挖掘天猫双十一时刻的美妆产品销售数据,分析各品牌之间的销量、热度、价格等~

项目描述

项目名称:天猫双十一美妆产品销售数据分析

数据来源:数据来源于网络,为2016年双十一美妆产品天猫数据的采集和整理,原始数据为.xlsx格式。

字段说明

update_time : 更新时间

id : 商品id(唯一标识)

title : 商品标题

price : 价格

店名 : 即品牌名

项目目的

通过对数据集进行清理整合,并进行以下几个方面的分析:

  • 双十一期间各品牌的销量以及销售额对比
  • 各大品牌热度
  • 各品牌价格分析
  • 关于男性护肤品销量分析
  • 消费高峰期分析

环境解释:基于jupyter notebook,可视化工具包:matplotlib、seaborn

数据导入

1
2
3
4
5
6
7
8
9
10
11
12
13
# 导入模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as ss
import warnings
%matplotlib inline

import os

os.chdir("/home/min/data")
warnings.filterwarnings("ignore")
1
2
3
4
5
6
7
# 数据读取

data = pd.read_csv('双十一淘宝美妆数据.csv')

# 数据查看

data.head()


1
2
3
# 数据基本属性

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 27598 entries, 0 to 27597
Data columns (total 7 columns):
update_time      27598 non-null object
id               27598 non-null object
title            27598 non-null object
price            27598 non-null float64
sale_count       25244 non-null float64
comment_count    25244 non-null float64
店名               27598 non-null object
dtypes: float64(3), object(4)
memory usage: 1.5+ MB

1
2
3
# 店名统计

data['店名'].value_counts()
悦诗风吟    3021
佰草集     2265
欧莱雅     1974
雅诗兰黛    1810
倩碧      1704
美加净     1678
欧珀莱     1359
妮维雅     1329
相宜本草    1313
兰蔻      1285
娇兰      1193
自然堂     1190
玉兰油     1135
兰芝      1091
美宝莲      825
资生堂      821
植村秀      750
薇姿       746
雅漾       663
雪花秀      543
SKII     469
蜜丝佛陀     434
Name: 店名, dtype: int64

数据清洗

清除重复数据

1
2
3
4
# drop_duplicates -- 重复数据

data = data.drop_duplicates(inplace=False)
data.shape
(27512, 7)

索引重构

1
2
3
4
# 重置索引

data.reset_index(inplace=True,drop = True)
data.head()


日期处理

1
2
3
4
5
6
# 日期处理

data['date'] = pd.to_datetime(data['update_time'])
data['month'] = data['date'].dt.month
data['day'] = data['date'].dt.day
data.head()


1
2
3
# 查看数据描述性统计

data.describe()


1
2
3
# 查看缺失值

data.apply(lambda x:sum(x.isnull()))
update_time         0
id                  0
title               0
price               0
sale_count       2350
comment_count    2350
店名                  0
date                0
month               0
day                 0
dtype: int64
1
data.isnull().any()
update_time      False
id               False
title            False
price            False
sale_count        True
comment_count     True
店名               False
date             False
month            False
day              False
dtype: bool

缺失值处理

1
2
3
4
# sale_count & comment_count 考虑使用众数填充

data['sale_count'].mode()
data['comment_count'].mode()
0    0.0
dtype: float64
1
2
data['sale_count'] = data['sale_count'].fillna(0)
data['comment_count'] = data['comment_count'].fillna(0)

1
2
3
# 再次确认缺失值

data.apply(lambda x : sum(x.isnull()))
update_time      0
id               0
title            0
price            0
sale_count       0
comment_count    0
店名               0
date             0
month            0
day              0
dtype: int64
1
data.duplicated().value_counts()
False    27512
dtype: int64

信息提取

表格信息提取

1
2
3
# 表格信息提取

import jieba
1
2
3
4
title_cut = []
for i in data.title:
j = jieba.lcut(i)
title_cut.append(j)
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 1.520 seconds.
Prefix dict has been built successfully.
1
2
data['item_name_cut'] = title_cut
data[['title','item_name_cut']].head()


添加商品类别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 给商品添加分类

# 子类别

sub_type = []

# 主类别

main_type = []
basic_config_data = """护肤品 套装 套装
护肤品 乳液类 乳液 美白乳 润肤乳 凝乳 柔肤液' 亮肤乳 菁华乳 修护乳
护肤品 眼部护理 眼霜 眼部精华 眼膜
护肤品 面膜类 面膜
护肤品 清洁类 洗面 洁面 清洁 卸妆 洁颜 洗颜 去角质 磨砂
护肤品 化妆水 化妆水 爽肤水 柔肤水 补水露 凝露 柔肤液 精粹水 亮肤水 润肤水 保湿水 菁华水 保湿喷雾 舒缓喷雾
护肤品 面霜类 面霜 日霜 晚霜 柔肤霜 滋润霜 保湿霜 凝霜 日间霜 晚间霜 乳霜 修护霜 亮肤霜 底霜 菁华霜
护肤品 精华类 精华液 精华水 精华露 精华素
护肤品 防晒类 防晒霜 防晒喷雾
化妆品 口红类 唇釉 口红 唇彩
化妆品 底妆类 散粉 蜜粉 粉底液 定妆粉 气垫 粉饼 BB CC 遮瑕 粉霜 粉底膏 粉底霜
化妆品 眼部彩妆 眉粉 染眉膏 眼线 眼影 睫毛膏
化妆品 修容类 鼻影 修容粉 高光 腮红
其他 其他 其他"""
1
2
3
4
5
6
7
8
9
category_config_map = {}
for config_line in basic_config_data.split('\n'):
basic_category_list = config_line.strip().strip('\n').strip('\t').split('\t')
main_category = basic_category_list[0]
sub_category = basic_category_list[1]
unit_category_list = basic_category_list[2:-1]
for unit_category in unit_category_list:
if unit_category and unit_category.strip().strip('\t'):
category_config_map[unit_category] = (main_category,sub_category)

1
2
3
# 查看主类别 & 子类别

category_config_map
{'乳液': ('护肤品', '乳液类'),
 '美白乳': ('护肤品', '乳液类'),
 '润肤乳': ('护肤品', '乳液类'),
 '凝乳': ('护肤品', '乳液类'),
 "柔肤液'": ('护肤品', '乳液类'),
 '亮肤乳': ('护肤品', '乳液类'),
 '菁华乳': ('护肤品', '乳液类'),
 '眼霜': ('护肤品', '眼部护理'),
 '眼部精华': ('护肤品', '眼部护理'),
 '洗面': ('护肤品', '清洁类'),
 '洁面': ('护肤品', '清洁类'),
 '清洁': ('护肤品', '清洁类'),
 '卸妆': ('护肤品', '清洁类'),
 '洁颜': ('护肤品', '清洁类'),
 '洗颜': ('护肤品', '清洁类'),
 '去角质': ('护肤品', '清洁类'),
 '化妆水': ('护肤品', '化妆水'),
 '爽肤水': ('护肤品', '化妆水'),
 '柔肤水': ('护肤品', '化妆水'),
 '补水露': ('护肤品', '化妆水'),
 '凝露': ('护肤品', '化妆水'),
 '柔肤液': ('护肤品', '化妆水'),
 '精粹水': ('护肤品', '化妆水'),
 '亮肤水': ('护肤品', '化妆水'),
 '润肤水': ('护肤品', '化妆水'),
 '保湿水': ('护肤品', '化妆水'),
 '菁华水': ('护肤品', '化妆水'),
 '保湿喷雾': ('护肤品', '化妆水'),
 '面霜': ('护肤品', '面霜类'),
 '日霜': ('护肤品', '面霜类'),
 '晚霜': ('护肤品', '面霜类'),
 '柔肤霜': ('护肤品', '面霜类'),
 '滋润霜': ('护肤品', '面霜类'),
 '保湿霜': ('护肤品', '面霜类'),
 '凝霜': ('护肤品', '面霜类'),
 '日间霜': ('护肤品', '面霜类'),
 '晚间霜': ('护肤品', '面霜类'),
 '乳霜': ('护肤品', '面霜类'),
 '修护霜': ('护肤品', '面霜类'),
 '亮肤霜': ('护肤品', '面霜类'),
 '底霜': ('护肤品', '面霜类'),
 '精华液': ('护肤品', '精华类'),
 '精华水': ('护肤品', '精华类'),
 '精华露': ('护肤品', '精华类'),
 '防晒霜': ('护肤品', '防晒类'),
 '唇釉': ('化妆品', '口红类'),
 '口红': ('化妆品', '口红类'),
 '散粉': ('化妆品', '底妆类'),
 '蜜粉': ('化妆品', '底妆类'),
 '粉底液': ('化妆品', '底妆类'),
 '定妆粉 ': ('化妆品', '底妆类'),
 '气垫': ('化妆品', '底妆类'),
 '粉饼': ('化妆品', '底妆类'),
 'BB': ('化妆品', '底妆类'),
 'CC': ('化妆品', '底妆类'),
 '遮瑕': ('化妆品', '底妆类'),
 '粉霜': ('化妆品', '底妆类'),
 '粉底膏': ('化妆品', '底妆类'),
 '眉粉': ('化妆品', '眼部彩妆'),
 '染眉膏': ('化妆品', '眼部彩妆'),
 '眼线': ('化妆品', '眼部彩妆'),
 '眼影': ('化妆品', '眼部彩妆'),
 '鼻影': ('化妆品', '修容类'),
 '修容粉': ('化妆品', '修容类'),
 '高光': ('化妆品', '修容类')}

1
2
3
4
5
6
7
8
9
10
11
12
13
# 分类处理

for i in range(len(data)):
exist = False
for temp in data.item_name_cut[i]:
if temp in category_config_map:
sub_type.append(category_config_map.get(temp)[1])
main_type.append(category_config_map.get(temp)[0])
exist = True
break
if not exist:
sub_type.append('其他')
main_type.append('其他')

新增主类别 & 子类别

1
2
3
4
# 新增 子类别 & 主类别 两列

data['sub_type'] = sub_type
data['main_type'] = main_type

1
2
3
# 子类别统计

data['sub_type'].value_counts()
其他      13100
清洁类      2922
面霜类      2675
化妆水      1955
底妆类      1790
乳液类      1352
眼部护理     1114
精华类       727
口红类       715
眼部彩妆      604
防晒类       494
修容类        64
Name: sub_type, dtype: int64

1
2
3
# 主类别统计

data['main_type'].value_counts()
其他     13100
护肤品    11239
化妆品     3173
Name: main_type, dtype: int64

新增 “是否为男士专用” 类别

1
2
3
4
5
6
7
8
9
10
11
12
# 新增 "是否为男士专用" 列

gender = []
for i in range(len(data)):
if '男' in data.item_name_cut[i]:
gender.append('是')
elif '男士' in data.item_name_cut[i]:
gender.append('是')
elif '男生' in data.item_name_cut[i]:
gender.append('是')
else:
gender.append('否')

1
2
data['是否男士专用'] = gender
data['是否男士专用'].value_counts()
否    25310
是     2202
Name: 是否男士专用, dtype: int64

新增销售额 & 购买日期

1
2
3
4
# 新增 销售额 & 购买日期(天) 两列

# 销售额 = 销售数量 × 价格
data['销售额'] = data.sale_count * data.price
1
2
3
4
# 时间格式转换

data['update_time'] = pd.to_datetime(data['update_time'])
data['update_time']
0       2016-11-14
1       2016-11-14
2       2016-11-14
3       2016-11-14
4       2016-11-14
           ...    
27507   2016-11-05
27508   2016-11-05
27509   2016-11-05
27510   2016-11-05
27511   2016-11-05
Name: update_time, Length: 27512, dtype: datetime64[ns]

时间列类型装换 & 新增以天为单位时间列

1
2
3
4
# 将时间列设置为新的index & 新增时间列 "天"

data = data.set_index('update_time')
data['day'] = data.index.day
1
del data['item_name_cut']
1
2
3
# 清理后数据查看

data.head()


1
data.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 27512 entries, 2016-11-14 to 2016-11-05
Data columns (total 13 columns):
id               27512 non-null object
title            27512 non-null object
price            27512 non-null float64
sale_count       27512 non-null float64
comment_count    27512 non-null float64
店名               27512 non-null object
date             27512 non-null datetime64[ns]
month            27512 non-null int64
day              27512 non-null int64
sub_type         27512 non-null object
main_type        27512 non-null object
是否男士专用           27512 non-null object
销售额              27512 non-null float64
dtypes: datetime64[ns](1), float64(4), int64(2), object(6)
memory usage: 2.9+ MB

1
2
3
# 数据备份

df = data

分析及可视化

各品牌SKU数

SKU : Stock Keeping Unit。SKU是库存量单位,区分单品。

​ 在电商领域,通常每一个商品详情页对应一个独立的SKU编码。

1
2
3
# 图表风格

plt.style.use('ggplot')
1
2
3
4
5
6
7
8
9
10
11
plt.figure(figsize=(16,10))
colors = ['r','b','g','yellow','pink','c','orange','violet','slateblue','gray']
df['店名'].value_counts().sort_values(ascending = False).plot.bar(width = 0.8,
alpha = 0.6,
color = colors)

plt.title('各品牌SKU数',fontsize = 18)
plt.xticks(rotation = 60)
plt.ylabel('商品数量',fontsize = 14)
plt.grid(axis='x')
plt.show()

图表解析:由图可知,仅悦诗风吟与佰草集的商品数量超过两千,且悦诗风吟商品数量达到了3000+,稳居榜首。


各品牌销量&销售额

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
fig,axes = plt.subplots(1,2,figsize=(24,12))
colors = ['r','b','g','yellow','pink','c','orange','violet','slateblue','gray']

ax1 = data.groupby('店名').sale_count.sum().sort_values(ascending=True).plot(kind='barh',
ax=axes[0],
width=0.6,
color = colors)
ax1.set_title('品牌总销售量',fontsize=18)
ax1.set_xlabel('总销售量')

ax2 = data.groupby('店名')['销售额'].sum().sort_values(ascending=True).plot(kind='barh',
ax=axes[1],
width=0.6,
color = colors)
ax2.set_title('品牌总销售额',fontsize=18)
ax2.set_xlabel('总销售额')

plt.subplots_adjust(wspace=0.4)
paraments = {'ytick.labelsize':16,'axes.labelsize':15}
plt.rcParams.update(paraments)
plt.show()

图表解析:相宜本草的销售量和销售额都是最高的。销量第二至第五,分别为美宝莲、悦诗风吟、妮维雅和欧莱雅;而销售额第二至第五,分别为欧莱雅、佰草集、美宝莲、悦诗风吟。其中,美宝莲、悦诗风吟和欧莱雅都在销量&销售额前五内。


各类别销售量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 各类别的销售量占比情况

fig,axes = plt.subplots(1,2,figsize = (18,10))

df1 = df.groupby('main_type')['sale_count'].sum()
ax1 = df1.plot(kind = 'pie',ax = axes[0],autopct = '%.1f%%',
pctdistance = 0.8,labels = df1.index,
labeldistance = 1.05,
startangle = 60,
radius = 1.1,counterclock = False,
wedgeprops = {'linewidth':1.2,'edgecolor':'k'},
textprops = {'fontsize':10,'color':'k'})
ax1.set_title('主类别销售量占比',fontsize = 15)

df2 = df.groupby('sub_type')['sale_count'].sum()
ax2 = df2.plot(kind = 'pie',ax = axes[1],autopct = '%.1f%%',
pctdistance = 0.8,labels = df2.index,
labeldistance = 1.05,
startangle = 60,
radius = 1.1,counterclock = False,
wedgeprops = {'linewidth':1.2,'edgecolor':'k'},
textprops = {'fontsize':12,'color':'k'})
ax2.set_title('子类别销售量占比',fontsize = 15)

plt.subplots_adjust(wspace=0.4)
plt.show()

图表解析:

  • 从主类别销售量占比情况来看,护肤品的销量远大于化妆品销量
  • 从子类别销售量占比情况来看,底妆类、口红类在化妆品中销量最多,清洁类、化妆水、面霜在护肤品中销量最多。

各品牌销量 - 主类别

1
2
3
4
5
6
7
8
9
10
# 销量

plt.figure(figsize=(20,10))

ss.barplot(x='店名',y='sale_count',hue='main_type',data=df,saturation=0.75,ci=0)
plt.title('各品牌各总类的总销售量')
plt.ylabel('销量')
plt.text(0,78000,horizontalalignment = 'left',color = 'gray',fontsize = 15)
plt.show()


各品牌销售额 - 主类别

1
2
3
4
5
6
7
8
# 销售额

plt.figure(figsize=(20,10))
ss.barplot(x = '店名',y = '销售额',hue = 'main_type',data = df,
saturation=0.75,ci = 0)
plt.title('各品牌各总类的总销售额')
plt.ylabel('销售额')
plt.show()

图表解析:各品牌的化妆品、护肤品销量以及销售情况均不一样,可能与品牌的定位有关。有的品牌主打化妆品,化妆品销量、销售额表现会相对好很多,例如蜜丝佛陀等;而主打护肤品的品牌,护肤品的销量、销售额会表现较好,如欧莱雅、佰草集等;也有部分品牌如美宝莲、兰蔻、悦诗风吟,化妆品和护肤品的销量、销售额都还不错。


各品牌销量 - 子类别

1
2
3
4
5
6
7
8
# 各品牌各子类销量

plt.figure(figsize=(26,12))
ss.barplot(x = '店名',y = 'sale_count',hue = 'sub_type',data = df ,
saturation=0.75,ci=0)
plt.title('各品牌各子类别的总销量')
plt.ylabel('销量')
plt.show()


各品牌销售额 - 子类别

1
2
3
4
5
6
plt.figure(figsize=(26,15))
ss.barplot(x = '店名',y = '销售额',hue = 'sub_type',data = df,saturation=0.75,ci = 0)
plt.title('各品牌各子类别的总销售额')
plt.legend(loc = 'upper right',fontsize = 13)
plt.ylabel('销售额')
plt.show()

图表解析:由于子类别较多,图表大致上能呈现出与主类别数据分析结果一致,其中比较突出的是自然堂的化妆水的销售额在自然堂总销售额中占据极大份额。


品牌热度

根据数据源分析,本次品牌热度呈现主要根据各品牌商品的平均评论数多少来展现。

1
2
3
4
5
6
7
8
9
10
11
12
# 各品牌热度

plt.figure(figsize=(24,10))
prop_iter = iter(plt.rcParams['axes.prop_cycle'])
colors = ['r','b','g','yellow','pink','c','orange','violet','slateblue','gray']
df.groupby('店名').comment_count.mean().sort_values(ascending = False).plot(kind = 'bar',
width = 0.8,
color=colors)
plt.title('各品牌商品的平均评论数',fontsize = 18)
plt.xticks(rotation = 60,fontsize = 18)
plt.ylabel('评论数',fontsize =18)
plt.show()


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 销量热度

plt.figure(figsize = (18,10))

x = df.groupby('店名')['sale_count'].mean()
y = df.groupby('店名')['comment_count'].mean()
s = df.groupby('店名')['price'].mean()
txt = df.groupby('店名').id.count().index

ss.scatterplot(x,y,size = s,hue = s,sizes=(100,1500),data = df)

for i in range(len(txt)):
plt.annotate(txt[i],xy = (x[i],y[i]))

plt.ylabel('热度',fontsize = 18)
plt.xlabel('销量',fontsize = 18)

plt.legend(loc = 'upper left',fontsize = 15)
plt.show()

图表解析:

热度越高的品牌越靠上,销量越高的品牌越靠右,价格越高的品牌颜色越深圈越大

  • 热度与销量呈一定的正相关
  • 美宝莲热度第一,销量第二;妮维雅热度第二,销量第四;且二者价格均相对较低
  • 图中显示,价格低的品牌热度和销量相对较高,价格高的品牌热度和销量相对较低;说明价格在热度和销量中有一定影响,也反映出人们较关注性价比问题。

各品牌价格分析

1
2
3
4
5
6
7
# 各品牌价格

plt.figure(figsize = (18,10))
ss.boxplot(x = '店名',y = 'price',data = df)
plt.ylim(0,4000)
plt.xticks(fontsize = 13)
plt.show()


1
2
3
4
5
# 各品牌的平均价格

# df.groupby('店名').price.sum()
avg_price = df.groupby('店名').price.sum() / df.groupby('店名').price.count()
avg_price
店名
SKII    1011.727079
佰草集      289.823171
倩碧       346.092190
兰芝       356.615809
兰蔻       756.400778
妮维雅       73.789053
娇兰      1361.043588
悦诗风吟     121.245945
植村秀      311.786667
欧珀莱      276.218543
欧莱雅      167.282698
玉兰油      329.657294
相宜本草     122.958446
美加净       44.694619
美宝莲      148.757576
自然堂      180.130213
薇姿       281.085791
蜜丝佛陀     142.118894
资生堂      577.438490
雅漾       212.618401
雅诗兰黛     872.470718
雪花秀      901.082873
Name: price, dtype: float64

1
2
3
4
5
6
7
8
9
10
11
fig = plt.figure(figsize=(19,10))
avg_price.sort_values(ascending=False).plot(kind = 'bar',width = 0.8,alpha = 0.6,
color = 'lightgreen',
label = '各品牌平均价格')
y = df.price.mean()
plt.axhline(y,0,5,color = 'yellow',label = '全品牌平均价格')
plt.ylabel('各品牌平均价格',fontsize = 16)
plt.title('各品牌产品的平均价格',fontsize = 24)
plt.xticks(rotation = 60,fontsize = 16)
plt.legend(loc = 'best')
plt.show()

图表解析:

  • 娇兰、SKII、雪花秀、雅诗兰黛、兰蔻、资生堂均是国际大牌,产品平均价格都在500以上,属于一线大牌;
  • 兰芝、倩碧、玉兰油、植村秀、佰草集、薇姿、雅漾的平均价格在300~400之间,其中佰草集是最贵的国货品牌;
  • 美加净作为国货品牌,平均价格最低,性价比高,而妮维雅平均价格第二低;
  • 全品牌的平均价格低于400元,而除了前六个国际大牌外的其他品牌的平均价格都低于全品牌的平均价格

平均销量&平均销售额

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 各品牌平均销量和平均销售额

plt.figure(figsize=(20,12))

x = df.groupby('店名')['sale_count'].mean()
y = df.groupby('店名')['销售额'].mean()
s = avg_price
txt = df.groupby('店名').id.count().index

ss.scatterplot(x,y,size = s,sizes=(100,1500),marker='v',alpha=0.5,color = 'b',
data=df)
for i in range(len(txt)):
plt.annotate(txt[i],xy = (x[i],y[i]),xytext = (x[i]+0.2,y[i]+0.2),fontsize = 14)

plt.ylabel('销售额',fontsize = 17)
plt.xlabel('销量',fontsize = 17)

plt.legend(loc = 'upper left',fontsize = 18)
plt.show()

图表解析:

  • 销售额越高越靠图像上方,销量越高越靠图像右方,图形越大代表平均价格越高
  • 销量与销售额呈正相关
  • 相宜本草、美宝莲、蜜丝佛陀销量与销售额在所有品牌中位列前三,而且平均价格较低

男性护肤品销量分析

1
2
3
4
5
6
7
8
# 男性护肤品销量情况

gender_data = df[df['是否男士专用'] == '是']
gender_data_1 = gender_data[(gender_data.main_type == '护肤品') | (gender_data.main_type == '化妆品')]
plt.figure(figsize=(19,9))
ss.barplot(x = '店名',y = 'sale_count',hue = 'main_type',data=gender_data_1,
saturation = 0.75,ci = 0)
plt.show()

图表分析:男用大多购买的是护肤品


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
f,[ax1,ax2] = plt.subplots(1,2,figsize=(19,9))
colors = ['r','b','g','yellow','pink','c','orange','violet','slateblue','gray']
gender_data.groupby('店名').sale_count.sum().sort_values(ascending = True).plot(kind='barh',
width = 0.8,
ax = ax1,
color=colors)
ax1.set_title('男士护肤品销量排名',fontsize = 20)

gender_data.groupby('店名')['销售额'].sum().sort_values(ascending = True).plot(kind='barh',
width = 0.8,
ax = ax2,
color = colors)
ax2.set_title('男士护肤品销量额排名',fontsize = 20)

plt.subplots_adjust(wspace= 0.4)
plt.show()

图表分析:

  • 妮维雅是男士护肤品中购买首选,销量遥遥领先
  • 欧莱雅、相宜本草、倩碧分别位于男士护肤品销量的二三四位

购买时间与销量分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 时间与销量分析 -- 购买高峰期

from matplotlib.pyplot import MultipleLocator

plt.figure(figsize=(19,9))
day_sale = df.groupby('day')['sale_count'].sum()
day_sale.plot()
plt.grid(linestyle = '-.',color = 'gray',axis = 'x',alpha = 0.5)
x_major_locator = MultipleLocator(1)
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.xlabel('日期(11月)',fontsize = 18)
plt.ylabel('销量',fontsize = 18)
plt.show()

图表解析:

  • 化妆品的购买高峰期在11号的前几天,猜测原因为双十一前商家为提前预热给出了较大优惠,导致了消费者的购买欲望加强
  • 双十一当天销量最低
  • 双十一后3天,销量较于11当天稳步上涨,可能是消费余热导致,也有可能是商家给出了新的优惠或是持续打折导致

总结

基于上方分析,做出以下总结整理:

  • 美妆类别中护肤品销量远大于化妆品,而护肤品中又以清洁类、化妆水以及面霜等基础护肤类产品销量最高
  • 男士使用的美妆产品集中在护肤品类别,在众多品牌中妮维雅是最受男士喜爱的品牌
  • 价格和热度对销量有极大关联,平价的基础产品是大多数消费者的首选,也说明了消费者对性价比高的产品的热衷
  • 可能是商家在双十一的提前预热,亦或是给出了巨大的优惠和为了避免11当天的消费高峰,不少消费者选择了提前消费,导致了销量高峰出现在双十一的前几天,而非11日当天
  • 双十一后3天,消费者还留有购物余热,但销量远不如双十一之前

写在最后

以上为双十一天猫美妆产品销售数据分析以及可视化。有错误及不足之处,恳请指正,感谢阅读。