spark总结

本项目来源于和鲸社区,使用转载需要标注来源
作者: Miseryzz
来源: https://www.heywhale.com/mw/project/5f86a95ce48a3f0030238ca9
1、数据初步了解
import numpy as np
import pandas as pd 
df = pd.read_csv('双十一淘宝美妆数据.csv')
df.head() #查看数居前五行  
update_time    id    title    price    sale_count    comment_count    店名
0    2016/11/14    A18164178225    CHANDO/自然堂 雪域精粹纯粹滋润霜50g 补水保湿 滋润水润面霜    139.0    26719.0    2704.0    自然堂
1    2016/11/14    A18177105952    CHANDO/自然堂凝时鲜颜肌活乳液120ML 淡化细纹补水滋润专柜正品    194.0    8122.0    1492.0    自然堂
2    2016/11/14    A18177226992    CHANDO/自然堂活泉保湿修护精华水(滋润型135ml 补水控油爽肤水    99.0    12668.0    589.0    自然堂
3    2016/11/14    A18178033846    CHANDO/自然堂 男士劲爽控油洁面膏 100g 深层清洁 男士洗面奶    38.0    25805.0    4287.0    自然堂
4    2016/11/14    A18178045259    CHANDO/自然堂雪域精粹纯粹滋润霜(清爽型)50g补水保湿滋润霜    139.0    5196.0    618.0    自然堂
df.info() #查看数据特征
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 27598 entries, 0 to 27597
Data columns (total 7 columns):
 #   Column         Non-Null Count  Dtype  
---  ------         --------------  -----  
 0   update_time    27598 non-null  object 
 1   id             27598 non-null  object 
 2   title          27598 non-null  object 
 3   price          27598 non-null  float64
 4   sale_count     25244 non-null  float64
 5   comment_count  25244 non-null  float64
 6   店名             27598 non-null  object 
dtypes: float64(3), object(4)
memory usage: 1.1+ MB
df.shape #查看数据量
(27598, 7)
df.describe() #查看各数字类型特征的一些统计量
price    sale_count    comment_count
count    27598.00000    2.524400e+04    25244.000000
mean    362.83060    1.230177e+04    1121.141816
std    614.17332    5.233693e+04    5271.059822
min    1.00000    0.000000e+00    0.000000
25%    99.00000    2.790000e+02    21.000000
50%    205.00000    1.445000e+03    153.000000
75%    390.00000    6.354500e+03    669.000000
max    11100.00000    1.923160e+06    202930.000000
数据有27598条,每条数据有7个特征,都是非空的。
2.数据清洗
2.1 重复值处理
直接删除重复值。

data = df.drop_duplicates(inplace = False)##去重
data.reset_index(inplace = True,drop = True)##重置行索引
data.shape
(27512, 7)
看出有86条重复数据,删除后得到新的数据

2.2 缺失值处理
通过上面观察数据发现sale_count,comment_count 存在缺失值,先观察存在缺失值的行的基本情况

data.loc[data['sale_count'].isnull()].head()
update_time    id    title    price    sale_count    comment_count    店名
1996    2016/11/14    A527960599636    Shu uemura植村秀新无色限唇膏 口红 长效保湿滋润 显色持久 正品    215.0    NaN    NaN    植村秀
1997    2016/11/14    A528013549083    Shu uemura植村秀晶萃溢彩肌底液30ml 面部精华    590.0    NaN    NaN    植村秀
1998    2016/11/14    A528030330786    Shu uemura 植村秀无色限柔雾唇膏 哑光口红 保湿持久 高饱和显色    215.0    NaN    NaN    植村秀
1999    2016/11/14    A528091449317    shu uemura植村秀无色限唇颊缤纷霜 腮红 口红两用 唇彩 正品    220.0    NaN    NaN    植村秀
2000    2016/11/14    A528191935022    Shu uemura植村秀韵眉膏 染眉膏 多维度丰眉刷头    280.0    NaN    NaN    植村秀
data.loc[data['comment_count'].isnull()].tail()
update_time    id    title    price    sale_count    comment_count    店名
27507    2016/11/5    A535642405757    SK-II【11-11】全新大眼眼霜skii放大双眼眼部修护精华紧致    590.0    NaN    NaN    SKII
27508    2016/11/5    A535911851408    SK-II 11-11预售skii大眼眼霜sk2眼部修护精华霜淡化黑眼圈    590.0    NaN    NaN    SKII
27509    2016/11/5    A537027211850    SK-II 11-11预售skii前男友护肤面膜sk2精华面膜贴密集修护    1740.0    NaN    NaN    SKII
27510    2016/11/5    A538212160126    SK-II 11-11预售skiisk2神仙水护肤精华油面部套装滋润补水密集修    1190.0    NaN    NaN    SKII
27511    2016/11/5    A538677326709    SK-II【11-11】神仙水护肤精华油面部套装滋润补水密集修    1190.0    NaN    NaN    SKII
存在的缺失值很可能意味着售出的数量为0或者评论的数量为0,所以我们用0来填补缺失值。

##填补缺失值
data=data.fillna(0) #用0填补缺失值
data.isnull().any() #查看是否还有空值
update_time      False
id               False
title            False
price            False
sale_count       False
comment_count    False
店名               False
dtype: bool
2.3 数据挖掘寻找新的特征
##使用jieba包对title进行分词,进一步了解每一个商品的特征
import jieba 
subtitle=[]
for each in data['title']:
    k=jieba.lcut_for_search(each) ##搜索引擎模式
    subtitle.append(k)
data['subtitle']=subtitle
data[['title','subtitle']].head()
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ASUS\AppData\Local\Temp\jieba.cache
Loading model cost 0.895 seconds.
Prefix dict has been built succesfully.
title    subtitle
0    CHANDO/自然堂 雪域精粹纯粹滋润霜50g 补水保湿 滋润水润面霜    [CHANDO, /, 自然, 堂, , 雪域, 精粹, 纯粹, 滋润, 滋润霜, 50g...
1    CHANDO/自然堂凝时鲜颜肌活乳液120ML 淡化细纹补水滋润专柜正品    [CHANDO, /, 自然, 堂, 凝, 时鲜, 颜肌活, 乳液, 120ML, , 淡...
2    CHANDO/自然堂活泉保湿修护精华水(滋润型135ml 补水控油爽肤水    [CHANDO, /, 自然, 堂, 活泉, 保湿, 修护, 精华, 水, (, 滋润, 型...
3    CHANDO/自然堂 男士劲爽控油洁面膏 100g 深层清洁 男士洗面奶    [CHANDO, /, 自然, 堂, , 男士, 劲爽, 控油, 洁面膏, , 100g...
4    CHANDO/自然堂雪域精粹纯粹滋润霜(清爽型)50g补水保湿滋润霜    [CHANDO, /, 自然, 堂, 雪域, 精粹, 纯粹, 滋润, 滋润霜, (, 清爽,...
# 给商品添加分类
sub_type = []   #子类别
main_type = []  #主类别
basic_data = """护肤品    乳液类    乳液    美白乳    润肤乳    凝乳    柔肤液    亮肤乳    菁华乳    修护乳
护肤品    眼部护理类    眼霜    眼部    眼膜                    
护肤品    面膜类    面膜                                                    
护肤品    清洁类    洗面    洁面    清洁    卸妆    洁颜    洗颜    去角质    磨砂                        
护肤品    化妆水    化妆水    爽肤水    柔肤水    补水露    凝露    柔肤液    精粹水    亮肤水    润肤水    保湿水    菁华水    保湿喷雾    舒缓喷雾
护肤品    面霜类    面霜    日霜    晚霜    柔肤霜    滋润霜    保湿霜    凝霜    日间霜    晚间霜    乳霜    修护霜    亮肤霜    底霜    菁华霜
护肤品    精华类    精华液    精华水    精华露    精华素    精华                                        
护肤品    防晒类    防晒
护肤品    补水类    补水                                                    
化妆品    口红类    唇釉    口红    唇彩    唇膏                                            
化妆品    底妆类    散粉    蜜粉    粉底液    定妆粉     气垫    粉饼    BB    CC    遮瑕    粉霜    粉底膏    粉底霜        
化妆品    眼部彩妆    眉粉    染眉膏    眼线    眼影    睫毛膏    眉笔                                        
化妆品    修容类    鼻影    修容粉    高光    腮红""" 
##主观的分类,不在这些类别里的并入其他类。第一列是大类,第二列是小类,后面都是关键词
dcatg={}
catg=basic_data.split('\n')
for i in catg:
    main_cat=i.strip().split('\t')[0]
    sub_cat=i.strip().split('\t')[1]
    o_cat=i.strip().split('\t')[2:len(catg)]
    for j in o_cat:
        dcatg[j]=(main_cat,sub_cat)
dcatg
##分类字典
{'乳液': ('护肤品', '乳液类'),
 '美白乳': ('护肤品', '乳液类'),
 '润肤乳': ('护肤品', '乳液类'),
 '凝乳': ('护肤品', '乳液类'),
 '柔肤液': ('护肤品', '化妆水'),
 '亮肤乳': ('护肤品', '乳液类'),
 '菁华乳': ('护肤品', '乳液类'),
 '修护乳': ('护肤品', '乳液类'),
 '眼霜': ('护肤品', '眼部护理类'),
 '眼部': ('护肤品', '眼部护理类'),
 '眼膜': ('护肤品', '眼部护理类'),
 '面膜': ('护肤品', '面膜类'),
 '洗面': ('护肤品', '清洁类'),
 '洁面': ('护肤品', '清洁类'),
 '清洁': ('护肤品', '清洁类'),
 '卸妆': ('护肤品', '清洁类'),
 '洁颜': ('护肤品', '清洁类'),
 '洗颜': ('护肤品', '清洁类'),
 '去角质': ('护肤品', '清洁类'),
 '磨砂': ('护肤品', '清洁类'),
 '化妆水': ('护肤品', '化妆水'),
 '爽肤水': ('护肤品', '化妆水'),
 '柔肤水': ('护肤品', '化妆水'),
 '补水露': ('护肤品', '化妆水'),
 '凝露': ('护肤品', '化妆水'),
 '精粹水': ('护肤品', '化妆水'),
 '亮肤水': ('护肤品', '化妆水'),
 '润肤水': ('护肤品', '化妆水'),
 '保湿水': ('护肤品', '化妆水'),
 '菁华水': ('护肤品', '化妆水'),
 '面霜': ('护肤品', '面霜类'),
 '日霜': ('护肤品', '面霜类'),
 '晚霜': ('护肤品', '面霜类'),
 '柔肤霜': ('护肤品', '面霜类'),
 '滋润霜': ('护肤品', '面霜类'),
 '保湿霜': ('护肤品', '面霜类'),
 '凝霜': ('护肤品', '面霜类'),
 '日间霜': ('护肤品', '面霜类'),
 '晚间霜': ('护肤品', '面霜类'),
 '乳霜': ('护肤品', '面霜类'),
 '修护霜': ('护肤品', '面霜类'),
 '精华液': ('护肤品', '精华类'),
 '精华水': ('护肤品', '精华类'),
 '精华露': ('护肤品', '精华类'),
 '精华素': ('护肤品', '精华类'),
 '精华': ('护肤品', '精华类'),
 '防晒': ('护肤品', '防晒类'),
 '补水': ('护肤品', '补水类'),
 '唇釉': ('化妆品', '口红类'),
 '口红': ('化妆品', '口红类'),
 '唇彩': ('化妆品', '口红类'),
 '唇膏': ('化妆品', '口红类'),
 '散粉': ('化妆品', '底妆类'),
 '蜜粉': ('化妆品', '底妆类'),
 '粉底液': ('化妆品', '底妆类'),
 '定妆粉 ': ('化妆品', '底妆类'),
 '气垫': ('化妆品', '底妆类'),
 '粉饼': ('化妆品', '底妆类'),
 'BB': ('化妆品', '底妆类'),
 'CC': ('化妆品', '底妆类'),
 '遮瑕': ('化妆品', '底妆类'),
 '粉霜': ('化妆品', '底妆类'),
 '粉底膏': ('化妆品', '底妆类'),
 '眉粉': ('化妆品', '眼部彩妆'),
 '染眉膏': ('化妆品', '眼部彩妆'),
 '眼线': ('化妆品', '眼部彩妆'),
 '眼影': ('化妆品', '眼部彩妆'),
 '睫毛膏': ('化妆品', '眼部彩妆'),
 '眉笔': ('化妆品', '眼部彩妆'),
 '鼻影': ('化妆品', '修容类'),
 '修容粉': ('化妆品', '修容类'),
 '高光': ('化妆品', '修容类'),
 '腮红': ('化妆品', '修容类')}
给出各个关键词的分类类别

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
data.loc[data['sub_type'] == '其他'].count() ##查看分类为其他的有多少商品
update_time      4273
id               4273
title            4273
price            4273
sale_count       4273
comment_count    4273
店名               4273
subtitle         4273
sub_type         4273
main_type        4273
dtype: int64
由title新生成两列类别

对是否是男性专用进行分析并新增一列
sex=[]
for i in range(len(data)):
    if '男士' in data['subtitle'][i] :
        sex.append('是')
    elif '男生' in data['subtitle'][i] :
        sex.append('是')
    elif '男' in data['subtitle'][i] and '女' not in data['subtitle'][i]  and '斩男' not in data['subtitle'][i]:
        sex.append('是')
    else :
        sex.append('否')
data['是否男士专用']=sex 
data.loc[data['是否男士专用'] == '是'].head()
update_time    id    title    price    sale_count    comment_count    店名    subtitle    sub_type    main_type    是否男士专用
3    2016/11/14    A18178033846    CHANDO/自然堂 男士劲爽控油洁面膏 100g 深层清洁 男士洗面奶    38.0    25805.0    4287.0    自然堂    [CHANDO, /, 自然, 堂, , 男士, 劲爽, 控油, 洁面膏, , 100g...    清洁类    护肤品    是
13    2016/11/14    A18980833277    CHANDO/自然堂男士面部护肤套装 洁面洗面奶爽肤水面霜    503.0    2775.0    124.0    自然堂    [CHANDO, /, 自然, 堂, 男士, 面部, 护肤, 套装, , , 洁面, 洗...    清洁类    护肤品    是
24    2016/11/14    A20173231724    自然堂男士保湿补水霜矿物元素滋润肌肤面霜护肤品 正品    89.0    13906.0    567.0    自然堂    [自然, 堂, 男士, 保湿, 补水, 霜, 矿物, 元素, 滋润, 肌肤, 面霜, 护肤,...    补水类    护肤品    是
36    2016/11/14    A24543820600    CHANDO/自然堂男士保湿精华眼霜淡化黑眼圈细纹紧致眼部护理正品    98.0    4694.0    162.0    自然堂    [CHANDO, /, 自然, 堂, 男士, 保湿, 精华, 眼霜, 淡化, 黑眼, 眼圈,...    精华类    护肤品    是
37    2016/11/14    A24544528901    自然堂男士冰川控油爽肤水 补水保湿控油须后水正品包邮    69.0    6861.0    761.0    自然堂    [自然, 堂, 男士, 冰川, 控油, 爽肤水, , 补水, 保湿, 控油, 须, 后, ...    化妆水    护肤品    是
data['是否男士专用'].value_counts()
否    25333
是     2179
Name: 是否男士专用, dtype: int64
对每个产品总销量新增销售额这一列
data['销售额'] = data.price * data.sale_count
data.head()
update_time    id    title    price    sale_count    comment_count    店名    subtitle    sub_type    main_type    是否男士专用    销售额
0    2016/11/14    A18164178225    CHANDO/自然堂 雪域精粹纯粹滋润霜50g 补水保湿 滋润水润面霜    139.0    26719.0    2704.0    自然堂    [CHANDO, /, 自然, 堂, , 雪域, 精粹, 纯粹, 滋润, 滋润霜, 50g...    面霜类    护肤品    否    3713941.0
1    2016/11/14    A18177105952    CHANDO/自然堂凝时鲜颜肌活乳液120ML 淡化细纹补水滋润专柜正品    194.0    8122.0    1492.0    自然堂    [CHANDO, /, 自然, 堂, 凝, 时鲜, 颜肌活, 乳液, 120ML, , 淡...    乳液类    护肤品    否    1575668.0
2    2016/11/14    A18177226992    CHANDO/自然堂活泉保湿修护精华水(滋润型135ml 补水控油爽肤水    99.0    12668.0    589.0    自然堂    [CHANDO, /, 自然, 堂, 活泉, 保湿, 修护, 精华, 水, (, 滋润, 型...    精华类    护肤品    否    1254132.0
3    2016/11/14    A18178033846    CHANDO/自然堂 男士劲爽控油洁面膏 100g 深层清洁 男士洗面奶    38.0    25805.0    4287.0    自然堂    [CHANDO, /, 自然, 堂, , 男士, 劲爽, 控油, 洁面膏, , 100g...    清洁类    护肤品    是    980590.0
4    2016/11/14    A18178045259    CHANDO/自然堂雪域精粹纯粹滋润霜(清爽型)50g补水保湿滋润霜    139.0    5196.0    618.0    自然堂    [CHANDO, /, 自然, 堂, 雪域, 精粹, 纯粹, 滋润, 滋润霜, (, 清爽,...    面霜类    护肤品    否    722244.0
3.数据分析及可视化
import matplotlib.pyplot as plt 
%matplotlib inline
plt.rcParams['font.sans-serif'] = [u'SimHei'] ##显示中文,设置字体
plt.rcParams['axes.unicode_minus'] = False ##显示符号
plt.figure(figsize = (12,10))
# 各店铺的商品数量
plt.subplot(2,2,1)
plt.tick_params(labelsize=15)
data['店名'].value_counts().sort_values().plot.bar()
plt.title('各品牌商品数',fontsize = 20)
plt.ylabel('商品数量',fontsize = 15)
plt.xlabel('店名')

#  各店铺的销量
plt.subplot(2,2,2)
plt.tick_params(labelsize=15)
data.groupby('店名').sale_count.sum().sort_values().plot.bar()
plt.title('各品牌所有商品的销量',fontsize = 20 )
plt.ylabel('商品总销量',fontsize = 15)

#各店铺总销售额
plt.subplot(2,2,3)
plt.tick_params(labelsize=15)
data.groupby('店名')['销售额'].sum().sort_values().plot.bar()
plt.title('各品牌总销售额', fontsize = 20)
plt.ylabel('商品总销售额' , fontsize = 15)
#旋转显示plt.xticks(rotation=45)

##补充绘图,挖掘数据,各品牌的平均每单单价,三个销量为0的品牌暂时不考虑
plt.subplot(2,2,4)
plt.tick_params(labelsize = 15)
avg_price=data.groupby('店名')['销售额'].sum()/data.groupby('店名').sale_count.sum() ###每个品牌售出的商品的平均单价
avg_price.sort_values().plot.bar()
plt.title('各品牌平均每单单价', fontsize = 20)
plt.ylabel('售出商品的平均单价' , fontsize = 15)
##自适应调整子图间距
plt.tight_layout()
通过图表不难看出以下几点:
悦诗风吟的商品数量遥遥领先,然而其商品销量只排在第三位,总销售额只排在第五位。
SKII,玉兰油,植村秀商品数量大概都在500-1500的范围,而销量为0。
相宜本草商品数量也只属于中游,但其销量销售额均排在第一位,由于其销量是第二名的大约两倍,而销售额远不到两倍,所以销售额/销量,也就是每一单的均价也是一个值得研究的新指标。

通过加入平均每单单价之后,观察销售额较高的几个品牌相宜本草,欧莱雅,佰草集,悦诗风吟,雅诗兰黛。其中相宜本草,悦诗风吟,欧莱雅都是平均单价200元以下的,佰草集为200-300元区间,雅诗兰黛为大于500元区间。是否能够判断价格亲民的品牌的销售额会相对来说更高?下面根据这里的数据先把平均单价分为几个区间,其中0-100元记为A类,100-200元记为B类,200-300元记为C类,300元及以上记为D类。

A=avg_price[(avg_price <= 100) & (avg_price > 0) ].index
B=avg_price[(avg_price <= 200) & (avg_price > 100) ].index
C=avg_price[(avg_price <= 300) & (avg_price > 200) ].index
D=avg_price[avg_price > 300 ].index
#四类ABCD分别代表0-100,100-200,200-300,300以上平均单价区间的各品牌
sum_sale=data.groupby('店名')['销售额'].sum()
plt.figure(figsize = (16,8))
plt.tick_params(labelsize=10)

###各类、各品牌的销售额占比
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%%',pctdistance=0.9)

###各类的平均每个店销售额
plt.subplot(1,2,2)
plt.tick_params(labelsize = 15)
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('不同类别的平均每个店销售额',fontsize = 20)
plt.ylabel('平均销售额',fontsize = 20)

plt.tight_layout()
观察饼图,不难发现A类平均单价的品牌所占的销售额比例最高,D类最少,并且D类中的一半以上收入都来自于雅诗兰黛品牌,而最受欢迎的相宜本草由于其价格便宜,销售额也最高。综合分析来说,在价格方面,价格越高的一般来说销量就会越低,反之亦有所相似之处。销量前四的品牌都属于A类,而属于D类的五个品牌销量都在最后七名之中。但
收益来说也有很大的区别。从每个类中每个店的平均销售额也能看出,定价越低则平均销售额越高。

比如A类中的美加净,销售额很低,观察分析其是平均单价最低的品牌,而且销量也并不算高,所以可以考虑几点:1.商品质量问题,虽然便宜但是是否产品质量过低降低了用户使用体验?2.知名度问题,是否需要提高知名度获取更多点击率以提高销量?3.定价问题,在质量过关的前提下,是否因为定价过低而降低了收益?能否在不大幅影响销量的情况下涨价?

事实上,D类中,也就是高端商品中,雅诗兰黛占据了主要份额,一方面可能由于品牌效应,就个人主观的分析,雅诗兰黛为人熟知,在推广营销方面做的很好,所以销量尚可。另一方面,可能雅诗兰黛虽然相对价格较高,但是给使用者带来的使用体验非常好,所以很多消费者宁愿多花钱也要选择雅诗兰黛。这也可能是雅诗兰黛平均单价最高,然而销量却在D类中也最高的原因。

接下来考虑各个类别的销售情况
#大类销售量、销售额的占比
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()
通过观察比较各个类销售量与销售额占比的关系,基本可以判断他们是正相关的。这也是符合常识的。
在大类中,护肤品的销量远胜化妆品以及其他商品。而在小类之中,清洁类的护肤品销量最高,其次是补水类的护肤品。
接下来用seaborn包给出每个店铺各个大类以及各个小类的销量销售额
##为了减少图形复杂度,先去掉总销量为0的店铺,分别为SKII,植村秀,玉兰油
data1 = data.drop(index = data[data['店名'].isin(data.groupby('店名').sale_count.sum()[data.groupby('店名').sale_count.sum() == 0].index)].index)
data1['店名'].value_counts()
悦诗风吟    3021
佰草集     2264
欧莱雅     1942
雅诗兰黛    1810
倩碧      1703
美加净     1678
欧珀莱     1359
相宜本草    1313
妮维雅     1299
兰蔻      1285
娇兰      1193
自然堂     1175
兰芝      1088
美宝莲      825
资生堂      821
薇姿       746
雅漾       663
雪花秀      543
蜜丝佛陀     434
Name: 店名, dtype: int64
import seaborn as sns
plt.figure(figsize = (16,12))

plt.subplot(2,1,1)
plt.tick_params(labelsize = 10)
sns.barplot(x = '店名', y = 'sale_count', hue = 'main_type' ,estimator=np.sum, data = data1 , ci = 0)  ####estimator参数表示取该列的什么值
plt.title('各店铺中各大类的销售量',fontsize = 20)
plt.ylabel('销量',fontsize = 15)

plt.subplot(2,1,2)
plt.tick_params(labelsize = 10)
sns.barplot(x = '店名', y = '销售额', hue = 'main_type' ,estimator=np.sum, data = data1 , ci = 0)
plt.title('各店铺中各大类的销售额',fontsize = 20)
plt.ylabel('销售额',fontsize = 15)
plt.tight_layout()
 plt.figure(figsize = (16,12))

plt.subplot(2,1,1)
plt.tick_params(labelsize = 10)
sns.barplot(x = '店名', y = 'sale_count', hue = 'sub_type' ,estimator=np.sum, data = data1 , ci = 0)####estimator参数取该列的什么值
plt.title('各店铺中各小类的销售量',fontsize = 20)
plt.ylabel('销量',fontsize = 15)

plt.subplot(2,1,2)
plt.tick_params(labelsize = 10)
sns.barplot(x = '店名', y = '销售额', hue = 'sub_type' ,estimator=np.sum, data = data1 , ci = 0)
plt.title('各店铺中各小类的销售额',fontsize = 20)
plt.ylabel('销售额',fontsize = 15)
plt.tight_layout()
先观察销量,各店小类中销量最高的是相宜本草的补水类商品以及妮维雅的清洁类商品,这两类销量很接近。而销售额上,相宜本草的补水类商品比妮维雅的清洁类商品要高得多,这显然是商品平均单价不同所导致的。由于不同的类别使用量也不同,销量自然也会有所区别,所以相对于比较每个店铺的不同类别的销售量,比较每个不同类别的各店铺的销售量应该更有价值。

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

plt.subplot(2,1,1)
plt.tick_params(labelsize = 10)
sns.barplot(x = 'sub_type', y = 'sale_count', hue = '店名' ,estimator=np.sum, data = data1 , ci = 0)####estimator参数取该列的什么值
plt.title('各小类中各店铺的销售量',fontsize = 20)
plt.ylabel('销量',fontsize = 15)

plt.subplot(2,1,2)
plt.tick_params(labelsize = 10)
sns.barplot(x = 'sub_type', y = '销售额', hue = '店名' ,estimator=np.sum, data = data1 , ci = 0)
plt.title('各小类中各店铺的销售额',fontsize = 20)
plt.ylabel('销售额',fontsize = 15)
plt.tight_layout()
事实上可以看出相宜本草在面霜、乳液、精华、补水、化妆水、眼部护理以及防晒类中都是销量最高的。美宝莲在口红、眼部彩妆也都是卖的最好的。而妮维雅在清洁类中一骑绝尘。在这里我们就可以用上之前提取出的新特征-是否男性专用。因为清洁类显然是有男性市场的。

关于性别
接下来考虑性别因素,了解各类产品在男性消费者中的销量占比

plt.figure(figsize = (16,16))
#男士专用中各类销量占比
plt.subplot(2,2,1)
data.loc[data['是否男士专用'] == '是'].groupby('sub_type').sale_count.sum().plot.pie(autopct = '%0f%%',title = '男士各小类销售量占比', pctdistance=0.8)
#非男士专用中各类销量占比
plt.subplot(2,2,2)
data.loc[data['是否男士专用'] == '否'].groupby('sub_type').sale_count.sum().plot.pie(autopct = '%0f%%',title = '非男士专用各小类销售量占比', pctdistance=0.8)
#男士专用销售量占总销售量
plt.subplot(2,2,3)
data.groupby('是否男士专用').sale_count.sum().plot.pie(autopct = '%0f%%',title = '男士专用销售量占比', pctdistance=0.8)
#男士专用销售额占总销售额
plt.subplot(2,2,4)
data.groupby('是否男士专用')['销售额'].sum().plot.pie(autopct = '%0f%%',title = '男士专用销售额占比', pctdistance=0.8)
plt.tight_layout()
与之前的饼图相比,能发现什么?

男士的销量基本来自于清洁类,其次是补水类。而这两类正是总销量中占比最高的两类。
非男士专用中,补水类成为了销量最高的类别,清洁类降到了第二位。
男士专用的销量以及销售额占比都比较低。
显然,在没有区分性别的情况下,由于清洁类是男性女性通用,所以占得销量最高是理所应当的。而非男士专用中,女性消费者较多,所以补水类一跃成为最高销量。尽管就整个销量而言,男士专用的占比不高,但是这也说明男性市场是一个值得发展急需拓宽的点。如果增加更多关于男性护肤品的推广,有可能会吸引更多的男性消费者从而增加销量。所以进一步分析,各个店铺的男性专用商品的销量。

male_data = data1.loc[data['是否男士专用'] == '是']
plt.figure(figsize = (12,8))
sns.barplot(x = '店名', y = 'sale_count', hue = 'main_type' ,estimator=np.sum, data = male_data , ci = 0)
plt.title('各店男士专用商品销量',fontsize = 15)
plt.ylabel('销量',fontsize = 10)
plt.tight_layout()
男士专用护肤品的销售量前三名分别是:妮维雅,欧莱雅,相宜本草。所有男士商品主要销量来自于护肤品。对于其他类这里暂时不进行分析,因为其产生大概率是basic_data也就是我们的分类集不完善导致的。观察一下男用化妆品的数据,如下:

male_data[male_data.main_type == '化妆品'].head()
update_time    id    title    price    sale_count    comment_count    店名    subtitle    sub_type    main_type    是否男士专用    销售额
15794    2016/11/10    A16470618157    L'oreal欧莱雅男士劲能极润护唇膏 滋润保湿补水润唇膏男士唇膏    29.0    37995.0    1096.0    欧莱雅    [L, ', oreal, 欧莱雅, 男士, 劲能, 极润, 唇膏, 护唇膏, , 滋润,...    口红类    化妆品    是    1101855.0
16023    2016/11/9    A16470618157    L'oreal欧莱雅男士劲能极润护唇膏 滋润保湿补水润唇膏男士唇膏    29.0    37979.0    1094.0    欧莱雅    [L, ', oreal, 欧莱雅, 男士, 劲能, 极润, 唇膏, 护唇膏, , 滋润,...    口红类    化妆品    是    1101391.0
16236    2016/11/8    A16470618157    L'oreal欧莱雅男士劲能极润护唇膏 滋润保湿补水润唇膏男士唇膏    29.0    37965.0    1080.0    欧莱雅    [L, ', oreal, 欧莱雅, 男士, 劲能, 极润, 唇膏, 护唇膏, , 滋润,...    口红类    化妆品    是    1100985.0
16445    2016/11/7    A16470618157    L'oreal欧莱雅男士劲能极润护唇膏 滋润保湿补水润唇膏男士唇膏    29.0    37947.0    1071.0    欧莱雅    [L, ', oreal, 欧莱雅, 男士, 劲能, 极润, 唇膏, 护唇膏, , 滋润,...    口红类    化妆品    是    1100463.0
16645    2016/11/6    A16470618157    L'oreal欧莱雅男士劲能极润护唇膏 滋润保湿补水润唇膏男士唇膏    29.0    37926.0    1059.0    欧莱雅    [L, ', oreal, 欧莱雅, 男士, 劲能, 极润, 唇膏, 护唇膏, , 滋润,...    口红类    化妆品    是    1099854.0
可以看出基本都是男用唇膏。因为将唇膏归于了口红类,而口红类归于了化妆品类。接下来看看各个店铺的男士专用商品的总销量销售额是怎样的

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

plt.subplot(2,2,1)
plt.tick_params(labelsize = 15)
male_data.groupby('店名').sale_count.sum().sort_values(ascending = True).plot.bar()
plt.title('各店男士专用商品销量', fontsize = 15)
plt.ylabel('销量', fontsize = 15)

plt.subplot(2,2,2)
plt.tick_params(labelsize = 15)
male_data.groupby('店名')['销售额'].sum().sort_values(ascending = True).plot.bar()
plt.title('各店男士专用商品销售额', fontsize = 15)
plt.ylabel('销售额', fontsize = 15)


###非男性专用
fmale_data = data1.loc[data['是否男士专用'] == '否']
plt.subplot(2,2,3)
plt.tick_params(labelsize = 15)
fmale_data.groupby('店名').sale_count.sum().sort_values(ascending = True).plot.bar()
plt.title('各店非男士专用商品销量', fontsize = 15)
plt.ylabel('销售量', fontsize = 15)

plt.subplot(2,2,4)
plt.tick_params(labelsize = 15)
fmale_data.groupby('店名')['销售额'].sum().sort_values(ascending = True).plot.bar()
plt.title('各店非男士专用商品销售额', fontsize = 15)
plt.ylabel('销售额', fontsize = 15)
plt.tight_layout()
不难看出,欧莱雅和妮维雅占据了男性专用商品的绝大部分市场,不管是销量还是销售额。这一点在不区分是否男性专用的商品中是有所出入的。欧莱雅在无论在哪个方面都表现的很好,虽然销量在非男士专用商品里属于一般水平,但销售额都名列前茅。而妮维雅在非男士专用商品里的销售情况就很差了,这说明妮维雅主打的就是男士专用商品。而相宜本草在非男士专用商品的表现还是遥遥领先,其在男士专用商品中也排在第三位,虽然和前两名都有比较大的差距。

关于时间
from datetime import datetime 
plt.figure(figsize = (12,12))
sale_day=data.groupby('update_time').sale_count.sum()
sale_day.index = [datetime.strptime(i, '%Y/%m/%d') for i in sale_day.index] ###将update_time转换为datetime数据否则plot函数无法识别排序
####每天的销量
plt.subplot(2,1,1)
plt.tick_params(labelsize = 15)
sale_day.plot()
plt.grid(linestyle = '-.')
plt.title('每日销售量',fontsize = 15)
plt.ylabel('销量', fontsize =10)
###每天的销售额
r_day=data.groupby('update_time')['销售额'].sum()
r_day.index = [datetime.strptime(i, '%Y/%m/%d') for i in r_day.index]
plt.subplot(2,1,2)
plt.tick_params(labelsize = 15)
r_day.plot()
plt.grid(linestyle = '-.')
plt.title('每日销售额',fontsize = 15)
plt.ylabel('销售额', fontsize =15)

plt.tight_layout()
观察两个折线图,其走势是相同的,因为整个销量与销售额应该是成正相关的。图形有如下特点:

在9日单日销售量达到峰值,而在11日达到最小
10日之前的波动趋势相对稳定,在11日有一个急剧的下降
11日过后又开始缓慢的增长。由于统计的日期有限,无法判断这种趋势是长期的还是短期的。
那么,双11活动反而在双11当天的销量有剧烈的下滑,其原因大概率是双11的预热、预售活动等等。在临近双11时,9日销量达到最高,因为更临近了,所以关注的人更多,购买的人更多。但是在10日有所下降,和双11下降有相同的理由,是人们都主观的认为双11当天的购买人数太多,可能会有网络、平台卡顿导致无法成功下单的忧虑,所以反而造成了双11当天销量急剧下滑。而双11过后又开始有了销量增长,有可能是店铺持续优惠,比如赠送满减卷,让许多已经消费过的消费者再次消费。

对评论数进行分析
plt.figure(figsize = (16,6))

plt.subplot(1,2,1)
data.groupby('店名').comment_count.sum().sort_values().plot.bar()
plt.title('每个店铺总评论数')

plt.subplot(1,2,2)
(data1.groupby('店名').sale_count.sum()/data1.groupby('店名').comment_count.sum()).sort_values().plot.bar()
plt.title('每个店铺平均多少单一条评论')
plt.tight_layout()
悦诗风吟的评论数远高于其他。而前面的分析中,悦诗风吟的所有商品数量是第一名,但其销量只在第三位。反观相宜本草,销量远高于其他,然而评论数相对销量却过低。所以我们考虑一个新的指标:每个店铺平均每多少单能得到一条评论。这个指标上,相宜本草和蜜丝佛陀最高。而理论上,销量与评论应该是一个正比的关系。这些平均多少单一条评论的指标能否反映店铺存在水军刷单的问题?相宜本草的该指标为28左右,而大多数品牌都在5-10左右,相宜本草是其他的大概4倍。所以是否可以推论,该指标过高的店铺存在刷单,刷销量的行为。如果能获得更详细的数据,例如好评率,好评格式等等,这也是一个可以探讨的问题。

总结分析
平均每单价格低的店铺的总销量、销售额都高于均价更高的。价格便宜是消费者考虑的最多的一个点。销量最高的相宜本草的均价就很低,同时它的销售额也是最高额的。而均价较高的类中,只有雅诗兰黛的销售额相对客观。对于一些中高端商品,可以考虑适当降价来吸引更多消费者。而一些低端商品可以考虑多推广来提高知名度获取销量。
所有大类中,护肤品类的销量最高,其次是化妆品类。所有小类中,清洁类、补水类分别是销量的前二名。
男士专用的商品中,护肤品销量最高,而化妆品类中主要是唇膏。并且妮维雅占据了男士专用的大部分市场。
平均每多少单一条评论这个指标,相宜本草过高了,是评论数最多的悦诗风吟的4倍。可能存在刷单等现象。
不同的日期销量也不同。在双11销量反而有一个剧烈的下滑。原因可能是预热活动导致了消费者提前消费,并且由于消费者往往会主观的考虑到双11当天的网络、平台会卡顿,一般都会提前下单来避免“高峰”,虽然这个高峰并不存在。而在双11之后销量又有了小幅度的增长,可能跟商家的持续优惠等各种活动有关。所以商家应该把目光放在双11之前,尽量的吸引消费者消费来增加销量,不要局限于双11当天。在双11之后可以通过类似双11购物返满减卷,来刺激二次消费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值