内容:1.燃气灶(不含集成灶)整体行业分析 2.淘宝平台销量分析 3.针对性建议(部分涉及商业信息略)
一、基本情况
(一)产品定义:
以液化石油气(液态)、人工煤气、天然气等气体燃料进行直火加热的厨房用具
按气源:分为煤气灶、液化气灶、天然气灶;
按灶眼:分为单灶、双灶和多眼灶。
(二)销售渠道
主要分为线上、线下模式。
线下:商超、专卖店(授权店)、加盟店、个体等其他店铺
线上:各网购平台、直播平台,以及占比较小、渠道来源复杂的私域流量(厂家的推手、有粉丝的个人、朋友圈带货达人等)
从一些咨询机构获取的整体数据来看:
2022年数据,线上零售989万台,占总46.0%,较2021年增加了5%;线下零售1162万台,占比54.0%;
目前来看:
线下渠道占比五成多,占比呈逐年减弱趋势;
线上平台占比四成多,并呈逐年上升趋势,有望超过线下渠道,未来的整体市场,会被各类线上、直播逐步挖墙脚;
咨询机构虽然有比较宽泛的渠道和信息来源,但数据也不一定完全准,但大趋势是对的!
(三 )当前行业现状
历史:我国燃气灶起步于1980年,近几十年以来,国内外各种燃具进入市场;
市场整体需求在下降,原因可能是①其他炊具替代影响(**集成灶**)②人口增长放缓③房地产销量下滑
未来大趋势:燃气灶市场较为成熟,客户需求主要在①旧灶换新灶②家庭必备③小餐饮店需要
总体来看:头部的品牌,已占据大部分销量,并且头部效应会愈发明显,小品牌生存空间将进一步缩小;
整体销量图
近年来,2017年为顶峰,销量3186.8万台,零售额215.2亿元。2018年以来,逐年下降,至2020年销量2803.9万台,
零售额为188.4亿元;
近期数据,2022年,国内燃气灶零售量为2151万台,较上年下降15%。
销售额图
2022年,国内燃气灶零售额约为170亿元,与零售量一样有所下滑,但销售额下滑比例比数量少,证明平均单价有所上升;
二、线上情况分析
纸上得来终觉浅,咨询机构的数据可信又不能完全信,实际干一票看看情况:
搜了一下淘宝关键词:“燃气灶不锈钢单炉”的数据;
基于以下假设:
假设1:大品牌应该有自己的线上销售团队,如果线下销售靠前的牌子,线上不会太差;
假设2:线上销售额,占比约一半,可以代表整体的销售排名;
拟爬取淘宝和1688的销售数据:
需要懂的知识:
①淘宝的销量,也有刷的,不完全真实,但整体的趋势还是有价值;
②数据模糊,例如销量4000+,3万+,不会显示具体数,销量几个、几十个的会显示具体个数(如65人付款,会准确到具体数),销量极少一般都是对线上不在乎、或者无能力线上发力的卖家;
③部分销量,显示为多少人已看过(如:10785人看过),一般都是花钱推广的产品,看过几个,销量都比较低,也不是大牌子,这类数据都转为0;
④淘宝销量,为近一年的历史销量,2023年下半年改的,以前一直是近30天的月销;
⑤无法知晓每个SKU的具体销量,需要开店后申请相关权限,只能知道整个链接的销量;
SKU解释:Stock Keeping Unit的首字母缩写,产品唯一标识码,用于区分每个不同的产品,例如iphone14 的 64GB和128GB,虽然都是iphone14,但却是两个不同的SKU,虽然都是同一类产品,颜色不同、内存大小不同,是不是pro、max等,都是不同的SKU;
2.1爬数据
大概长这样,每个链接都点进去,容易被ban,所以只抓首页上面的信息,某宝是显示100页;
基本处理:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts.charts import Bar
from pyecharts.options import *
plt.rcParams['font.sans-serif'] = ['SimHei']
# 只将一些需要的列导入,重命名
path = "C:/Users/Administrator/Downloads/rqz.xlsx"
df = pd.read_excel(path,usecols=[0,3,4,5,6,7,8,9,10,11,12,13])
pd.set_option('display.max_columns',10)
df.columns = ['title','advan1','advan2','price1','advan3','price2','sales','city','province','shop_name','promo1','promo2']
# 先把完全重复的删掉
df = df.drop_duplicates(subset=['title','shop_name','sales','price1','price2'],keep='first')
# 查看缺失值
# import missingno as msgo
# msgo.bar(df)
同一个店铺,可能有多个商品被搜到,并且还有价格一样但标题不同的,还有同一个店完全一样的链接,被搜到多次,毕竟能爬100个页面,数据约3072条; 知道这个很重要,因为在后面的数据处理和分析中,会被这东西坑!
advan--short for advantage ,每个商品可以放最多三个标签;
promo--promotion ,促销标签,最多可以有两个,略微复杂;
2.1.2处理价格、销量
# 抓的数据,整数和小数部分,是分开的
df['price'] = df['price1'] + df['price2']
df.drop(['price1','price2'],axis=1,inplace=True)
# 处理销售数量
def clean_sales(df):
if '看过' in df.sales:
return 0
elif '万' in df.sales:
return int(df.sales.split('万')[0]) * 10000
elif '+' in df.sales:
return int(df.sales.split('+')[0])
else:
return int(df.sales.split('人')[0])
df['sale_amount'] = df.apply(clean_sales,axis=1)
df.drop('sales',axis=1,inplace=True)
销量按照最少的来取,其中销量按最低算,例如7000+人已付款,则将销量定为7000;
这些销量要看看规则,例如2万+人付款,200+人付款,很少的几十个以内的,会显示具体数字如23人付款;还有极少部分写多少人例如13506人看过。对于看过,选了几个点进去,发现销量都比较少,想着销量真不错,也不至于不写多少人买,应该是花了大价钱付费推荐的,直接计为0;
2.2销量动态图
用pyechart画的图,比较好看点,还可以设置缩放,就是稍微麻烦些,很多参数要仔细设置;
不把销量和销售额放在一个图里,因为销量多的,销售额不一定特别多,这样有一个轴不会变动,看起来不甚聪明;
# 选择销量、销售额靠前的 逆序是为了横向柱状图从大到小显示
groups_1 = df.groupby('shop_name')['money'].sum().sort_values(ascending=True)[-30:]
groups_2= df.groupby('shop_name')['sale_amount'].sum().sort_values(ascending=True)[-30:]
from pyecharts.charts import Bar,Grid,Page
bar_1 = Bar()
bar_1.add_xaxis(list(groups_1.index))
bar_1.add_yaxis("销售额",list(groups_1.values))
bar_1.reversal_axis() # 翻转x和y轴
bar_1.set_global_opts(title_opts=opts.TitleOpts(title='销售额'),
xaxis_opts=opts.AxisOpts(name='店铺名称'),
yaxis_opts=opts.AxisOpts(name='抓取的销售额'),
datazoom_opts=[opts.DataZoomOpts(type_='inside',orient='horizontal',xaxis_index=0,pos_left='10%'),
opts.DataZoomOpts(type_='inside',orient='vertical',xaxis_index=1,pos_right='10%'),
],
legend_opts=opts.LegendOpts(type_='plain',pos_left="30%")
)
bar_1.set_series_opts(label_opts=opts.LabelOpts(position="right"), # 设置数值显示在右侧
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_='max', name='最大值'),
# opts.MarkLineItem(type_='min', name='最小值'),
opts.MarkLineItem(type_='average', name='平均值')
],linestyle_opts=opts.LineStyleOpts(color='red',opacity=.5,width=2,type_='dashed')
)
)
# 设置第二个柱状图
bar_2 = Bar()
bar_2.add_xaxis(list(groups_2.index))
bar_2.add_yaxis("销量",groups_2.values.tolist())
bar_2.set_series_opts(label_opts=opts.LabelOpts(position="right"),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_='max', name='最大值'),
opts.MarkLineItem(type_='average', name='平均值')
],linestyle_opts=opts.LineStyleOpts(color='grey',width=2,type_='dashed'))
)
bar_2.set_global_opts(
title_opts=opts.TitleOpts(title='销量'),
xaxis_opts=opts.AxisOpts(name='店铺名称'),
yaxis_opts=opts.AxisOpts(name='抓取的销量'),
)
bar_2.reversal_axis()
# # 显示图像
grid = Grid(init_opts=opts.InitOpts(width="1600px",height="1200px"))
grid.add(bar_1,grid_opts=opts.GridOpts(pos_bottom='49%'))
grid.add(bar_2,grid_opts=opts.GridOpts(pos_top='60%'))
grid.render_notebook()
2.3 竞争对手地域分析
competitor = group_place.set_index(['province','city'],inplace=False)
# 添加临时辅助列
temp=competitor.groupby(level=0)['shop_name'].sum()
hehe=pd.merge(left=competitor,right=temp,left_index=True,right_index=True,how='left')
hehe2 = hehe.sort_values(['shop_name_y','shop_name_x'],ascending=False)
col_1 = 100*(hehe2['sale_amount'].cumsum()/hehe2['sale_amount'].sum()).values
col_1 = [str(round(i,2))+'%' for i in col_1]
# 临时决定多加一列
col_3 = 100*(hehe2['sale_amount']/hehe2['sale_amount'].sum()).values
col_3= [str(round(i,2))+'%' for i in col_3]
col_2 = 100*(hehe2['shop_name_x']/hehe2['shop_name_x'].sum()).values
col_2= [str(round(i,2))+'%' for i in col_2]
hehe2.insert(loc=1,column='销量占总体比',value=col_3)
hehe2.insert(loc=2,column='销量累计占比',value=col_1)
hehe2.insert(loc=4,column='店铺数占总体比',value=col_2)
hehe2.drop(columns='shop_name_y',inplace=True)
hehe2.columns=['销量','销量占比','销量累计占比','店铺数量','店铺数占总体比']
主要的竞争对手:
广东--中山、佛山,广州也有点苗头;
浙江--杭州、金华,宁波、绍兴也有点;
再就是山东--滨州、江苏--南京;
2.4不同店铺竞争力分析
旗舰店(一般是一手厂家)、专卖店企业店(一级、二级授权店铺)、大型商超店(仅限苏宁易购、天猫超市、天天特卖工厂)、其他普通个人店(包含很多名字假装是直营店,实际只是忽悠人的个人店,也包含一些无法简单判定是否为二级授权的店铺,都归为杂牌店)的销量分析;后续发现,可能分的不够准,不同店铺的类型需要仔细查看规律,有个什么国货甄选旗舰店,好像也得划分到大型商超店里;
def map_shop(ss):
if "苏宁易购" in ss:
return 3
if "旗舰店" in ss:
return 1
elif "专卖店" in ss or "企业店" in ss:
return 2
elif "天猫超市" in ss or "天天特卖工厂" in ss:
return 3
else:
return 5
df['shop_type'] = df['shop_name'].apply(map_shop)
temp_2 = df.groupby('shop_type').agg({"sale_amount":sum,'money':sum,"shop_type":'count'})
pd.set_option('display.float_format', lambda x: '%.4f' % x)
new_names = ['旗舰店','专卖\企业店','苏宁天猫淘工厂','杂牌店']
temp_2.index = new_names
temp_2.sort_values(by='money',ascending=False,inplace=True)
# 销量占比
va1 = 100*(temp_2['sale_amount']/temp_2['sale_amount'].sum()).values
va1 = [str(round(i,2))+'%' for i in va1]
# 销售额占比
va2 = 100*(temp_2['money']/temp_2['money'].sum()).values
va2 = [str(round(i,2))+'%' for i in va2]
# 蓝海值计算
temp_2.insert(loc=1,column='销量占比',value=va1)
temp_2.insert(loc=3,column='销售额占比',value=va2)
temp_2['销量蓝海值'] = temp_2['sale_amount']/temp_2['shop_type']
temp_2['销售金额蓝海值'] = temp_2['money']/temp_2['shop_type']
temp_2
销量蓝海值粗略计算=对应的销量/去重店铺数
销量金额蓝海值=销售额/去重店铺数
蓝海值越高,就是能分到的蛋糕越多,越大越好!
可以看到旗舰店、专卖店还是受到了更多消费者的青睐,杂牌店开的人多,竞争比较激烈,天猫、淘工厂亦蹭顺风车,搞了一部分销量;
2.4.2了解一下数据:
总共抓取了淘宝网页端100页的链接数据,3073条数据,去掉完全重复的后2358条,其中店铺去重后,1194个店铺,意味着有的店铺可能抓取到多条链接;看了一下,淘宝自家或者利益非常相关的店铺,搜索到的链接明显多于其他家,看来胳膊肘是朝着自己的;
2.5 宣传卖点标签
可以看到,商品都有个摆在前面的宣传标签;
aa =pd.DataFrame(df.advan1.value_counts().sort_values(ascending=False))
aa.rename(columns={'advan1':'统计'},inplace=True)
aa.reset_index(inplace=True)
bb =pd.DataFrame(df.advan2.value_counts().sort_values(ascending=False))
bb.rename(columns={'advan2':'统计'},inplace=True)
bb.reset_index(inplace=True)
cc =pd.DataFrame(df.advan3.value_counts().sort_values(ascending=False))
cc.rename(columns={'advan3':'统计'},inplace=True)
cc.reset_index(inplace=True)
dd=pd.concat([aa,bb,cc],axis=1,ignore_index=True)
dd.columns=['宣传卖点-1','统计-1','宣传卖点-2','统计-2','宣传卖点-3','统计-3']
dd
这些卖点,在商家中宣传得比较多,应是当下产品的重要竞争力!
基于以下经验知识:商家比较清楚当下热门卖点以及消费者需求,可以把自家产品往这方面靠或者吹;
2.6促销分析
ee=pd.DataFrame(df.promo1.value_counts().sort_values(ascending=False))
ee.reset_index(inplace=True)
ff=pd.DataFrame(df.promo2.value_counts().sort_values(ascending=False))
ff.reset_index(inplace=True)
gg=pd.concat([ee,ff],axis=1,ignore_index=True)
gg.columns=['促销手段-1','统计-1','促销手段-2','统计-2']
gg
促销标签这块规则比较乱稍微复杂一点,同时我们发现宣传卖点和促销标签,存在不同列之间有重复的,决定重新合并统计一次;
2.7 两组标签合并统计
2.7.1 宣传卖点标签
ll = list(df.advan1)+list(df.advan2)+list(df.advan3)
# 将三列advan合并统计
empty_dict ={}
for i in ll:
if i not in empty_dict:
empty_dict[i]=1
else:
empty_dict[i]+=1
empty_dict= sorted(empty_dict.items(),key=lambda d: d[1], reverse=True)
xc_labels=pd.DataFrame(data=empty_dict,columns=['卖点名称','统计数量'])
xc_labels
2.7.2 促销标签
# 将两列promo合并统计
kk = list(df.promo1)+list(df.promo2)
empty_dict_2 ={}
for i in kk:
if i not in empty_dict_2:
empty_dict_2[i]=1
else:
empty_dict_2[i]+=1
empty_dict_2= sorted(empty_dict_2.items(),key=lambda d: d[1], reverse=True)
pr_labels = pd.DataFrame(empty_dict_2,columns=['推广标签','统计'])
pr_labels
因为准备搞点特征衍生,所以现在是提前做了准备;
2.8 特征衍生
2.8.1 宣传标签衍生
xc_labels.drop(labels=xc_labels[xc_labels['卖点名称'].isna()].index,inplace=True)
xc_labels['percent'] = xc_labels['统计数量']/xc_labels['统计数量'].sum()
xc_labels['statstic'] = xc_labels['统计数量'].cumsum()/xc_labels['统计数量'].sum()
# 将标签从热门-->冷门分级
level_1 = xc_labels[xc_labels['statstic']<=0.75]['卖点名称'].values
level_2 = xc_labels[(xc_labels['statstic']>0.75)&(xc_labels['statstic']<=0.95)]['卖点名称'].values
level_3 = xc_labels[(xc_labels['statstic']>0.95)&(xc_labels['statstic']<=0.99)]['卖点名称'].values
# level_1
# ['不锈钢', '一级', '脉冲电子点火', '旋火', '5.2KW', '钢化玻璃', '热电偶熄火保护', '直火',
'钢化玻璃、不锈钢', '双旋火']
简单来讲,对卖家的标签,按照热门程度,最热门的给4分,其次3分,比较冷门的1分,不写0分;
# 先把那些填充为0比较好搞
df2 = df.copy()
print('去重前:',df2.shape)
df2.drop_duplicates(inplace=True)
df2.fillna(value=0,inplace=True)
def map_advan(df):
score = 0
for col in ['advan1','advan2','advan3']:
if df[col] in level_1:
score+=4
elif df[col] in level_2:
score+=3
elif df[col] in level_3:
score+=2
elif df[col]==0:
score+=0
else:
score+=1
return score
df2['advan_score'] = df2.apply(map_advan,axis=1)
print('去重后:',df2.shape)
df2
新生成的特征列:
2.8.2 促销标签页
pr_labels.drop(pr_labels[pr_labels['推广标签'].isna()].index,inplace=True)
pr_labels['percent'] = pr_labels['统计']/pr_labels['统计'].sum()
pr_labels['statstic'] = pr_labels['统计'].cumsum()/pr_labels['统计'].sum()
pd.set_option('display.max_rows',20)
pr_labels
促销这块,种类很多,根据个人主观判断,什么公益宝贝、绿色节能,都没什么卵吸引力,比较厉害的、并且无法量化的是这些:
array(['包邮', '3期', '新品', '30天价保', '6期', '12期'], dtype=object)
先添加一个包含重要且不太好量化的指标列,本人俗称其为犀利值;
def map_promo(df):
start = 0
for col in ['promo1','promo2']:
if df[col] in p_level_1:
start+=1
return start
df2['promo_priority'] = df2.apply(map_promo,axis=1)
df2
再就是比较难搞的,满多少减多少,有很多种,要仔细看原数据,发现规律,总结研究;
有满300元减20元,有淘金币抵扣**元,有官方立减元,有限时直降元,有包邮、3期、6期、12期,多少天保价之类的,一个商品最多有两个标签,而这些分为第一列、第二列,随意组合的,我将有淘金币抵扣的,不论金额大小,都算作商品有一个特征列为1,因为我查到淘金币抵扣的钱,一般都不会太多,主要是正则表达式+各种条件判断太麻烦;
import re
# 先新建合并列
for i in df2.index:
df2.loc[i,'combine'] = str(df2.loc[i,'promo1'])+str(df2.loc[i,'promo2'])
def temp_map(df):
pattern_1 = re.compile(r'(\d+)减(\d+)')
pattern_2 = re.compile(r'[立减,降,补](\d+)')
pattern_3 = re.compile(r'已抵(\d\.?\d*)')
# if '抵' in df['combine']:
# """淘金币抵扣,情况太复杂,可能多个促销,前后不一,简化处理"""
# result = re.search(pattern_3,df['combine'])
# return result.groups()[0]
if '立减' in df['combine'] or '降' in df['combine']or'补' in df['combine']:
"""官方立减、限时直降、已补多少"""
result = re.search(pattern_2,df['combine'])
return result.groups()[0]
if "满" in df['combine']:
"""满多少减多少"""
result = re.search(pattern_1,df['combine'])
return result.groups() # 返回两个数的元组
else:
return 0
df2['new'] = df2.apply(temp_map,axis=1)
df2
如果满a减b,得到是个元组,还要进一步处理;
df2['满多少'] = [i[0] if type(i)==tuple else 0 for i in df2['new']]
df2['减多少'] = [i[1] if type(i)==tuple else i if int(i)>0 else 0 for i in df2['new']]
df2['淘金抵'] = [1 if '淘金币'in i else 0 for i in df2['combine']]
# 将没有满多少减多少的,满多少 这一列,设为5000,已知最大为3563
temp_index = df2[df2['满多少']==0].index
df2.loc[temp_index,'满多少'] =5000
# 先转换数据类型
df2[['满多少','减多少']]=df2[['满多少','减多少']].astype(float)
# 新建可学习列
df2['dis_condition'] = df2['满多少']/df2['price'] # 越大越不好促销
df2['disount'] = df2['减多少']/df2['price'] # 越大,促销力度越大
df2.drop(columns=['combine','new','满多少','减多少'],inplace=True)
df2.sample(20)
最终,关于促销手段,我们衍生出了4列;
promo_priority就是包含比较犀利、无法量化的,犀利程度;
淘金抵,简化为0和1,能用淘金币抵扣的就是1,不管多少,查资料好像最大值为商品的1%-5%,费用商家出,其实也不是很多,主要是淘金币抵扣有的在前、有的在后,排列组合多,懒得弄那么细了;
dis_condition,是满a减b中的a除以商品价格,比如商品价格50元,要满300减20;则=300/50=6,可知越大越难满减;没有满减的,就将数值设得比较大,超过列的最大值;
disount,是满a减b中的b,再除以商品价格,=20/50=0.4,越大则优惠力度越大;
2.9 标题列
import jieba
# 提取所有标题
title_list_all = df2['title'].values.tolist()
title_s=[]
# 先进行切分
for line in title_list_all:
title_cut = jieba.lcut(line)
title_s.append(title_cut)
# 去掉没什么意义的词
stopwords = [line.strip() for line in open('d:/停用词表.txt', 'r', encoding='utf-8').readlines()]
title_clean = []
for inner_list in title_s:
line_clean = []
for single_word in inner_list:
if single_word not in stopwords:
line_clean.append(single_word)
title_clean.append(line_clean)
# 转为一个大列表
final_list=[]
for line in title_clean:
for word in line:
final_list.append(word)
df_word = pd.DataFrame(data={'words':final_list}) # 先转为df好统计
word_count = df_word.words.value_counts().reset_index()
word_count.columns = ['word', 'count'] # 名字有点乱,改一下
2.9.1 提取销量最高的100个词
有个问题,标题中含得最多的词,并非是最好的,要看销量中,含哪个词的销量最高,这样统计数据会重复,不过能代表关键词和销量的关系!
# 发现有单个字的,删掉,补充直到100
count_list=[]
i=0
while len(count_list)<100:
value = word_count.loc[i,'word']
if len(value) >1:
count_list.append(value)
i+=1
result_dict = {}
for index in df2.index:
for single_word in count_list:
if single_word in df2.loc[index,'title']:
result_dict[single_word] = result_dict.get(single_word,0)
result_dict[single_word]+=df2.loc[index,'sale_amount']
top100_df = pd.DataFrame(list(result_dict.items()),columns=['word','sale_amount'])
top100_df.sort_values(by='sale_amount',ascending=False,inplace=True)
top100_df.reset_index(drop=True,inplace=True)
top100_df['percent'] = top100_df['sale_amount']/df2.sale_amount.sum()
top100_df
2.9.2 画图看看
plt.figure(figsize=(12,10))
plt.title("标题中最热门的50个词",fontsize=15,fontweight='bold')
sns.set(font='SimSun')
sns.barplot(data=top100_df[:50],x='percent',y='word',alpha=.8)
for i,j in enumerate(top100_df[:50]['percent']):
plt.text(j+0.03,i,round(j,3),ha='center',va='center')
plt.xlabel('标题词占总销量比')
plt.ylabel('标题关键词')
# plt.savefig('d:/标题关键词热门.jpg',dpi=400,bbox_inches='tight')
三、特征重要性
目标列是销量,我们衍生了一百多列的特征,后面有些稀疏,用回归算法看看影响销量的因素;
3.1 RF特征重要性
考虑用RF随机森林、GBDT梯度提升和Lightgbm看看,实际中我的参数换过不少,这边只放一部分,过程中内容比较多,这边就直接放结果了;
解释:判断线上平台,各个表面因素对【销量】的影响:
①promo_priority 推广标签吸引力,首先将推广标签统计,含有【'包邮', '3期', '新品', '30天价保', '6期'】任意一项加一分,一个链接最高2分,最低0分,什么公益宝贝、绿色节能(总共只出现9次)等看起来没什么竞争力的词,不算为有吸引力的标签;promo_priority 即为推广标签吸引力对销量的影响力;
②dis_condition,为打折条件,比如标价是50元,打折条件是满300减20元,打折条件即为300/50=6,单就这个因素,数字越大,证明要满减越难,倍数越小则越容易打折,只包含这个300,减的20影响力较小排在后面;
③price 链接价格
④has关键词,将标题拆分为很多个短关键词,选了出现次数最多的前100个,例如has苏泊尔,即标题中出现了苏泊尔这个词;
注意:has志高,并非因为标题有志高而销量高,而是因为志高旗舰店,销量排第一,才导致这个因素排在前面,因果关系要知道;has苏泊尔、has太太同理,其他一个不带牌子的例如has猛火、has炉灶,则是标题中,比较火热的;
⑤advan_score: 商品卖点标签的影响力,也是对宣传卖点进行统计,比较火热的给4分,一般火的3分,冷门的1分,不写的0分,每个产品最多写3个卖点标签,一个都不写的0分,最高的12分; advan_score 即为卖点标签的影响力;
⑥count_keys ,商品标题包含最热门的100个词的数量,一些卖的比较火的产品,标题会包含十大几个到20个热门词,较少的也有个六七个,标题越火越容易被搜到(单就标题这个因素而言),成交量一般也高一点;
⑦shop_type: 店铺类型,旗舰店列为1等,专卖、企业店2等,天猫超市、苏宁等列为3等,其他杂牌店列为5等;
3.2 GBDT特征重要性
GBDT算的结果,是比较偏准的;
3.3 LightGbm
注意此处,importance_type='gain',不是用的split; 其实,要调调参数的,但我主要就是想看看特征重要性而已,树模型基本都能找到规律,大差不差啦;
四、定价策略
这块,是有一些商业性的分析建议的,因为一些原因,就不能写出来了;
4.1 全价格VS销量
df2_price= df2[['price','sale_amount','money']]
price_group= df2_price.groupby('price')['sale_amount'].sum()
price_group.plot(figsize=(14,8))
plt.xlabel('价格')
plt.ylabel('淘宝平台显示销量')
plt.legend().set_visible(False)
plt.title('价格与销量图')
要对一些异常高的销量专门看看,比如700元、500元这两个价位段;具体内容略过;
4.2 三百以内的
price_group_2_df = pd.DataFrame(price_group[(price_group.index < 300)&(price_group.values > 0)])
price_group_2_df.plot(figsize=(14,8))
plt.xlabel('价格')
plt.ylabel('淘宝平台显示销量')
plt.legend().set_visible(False)
plt.title('三百以内销量至少1的价格与销量图')
plt.xticks(ticks=range(0,310,15),labels=range(0,310,15),minor=False)
plt.grid(visible=False)
plt.savefig('d:/三百以内的与销量图.jpg',dpi=400,bbox_inches='tight')
4.3 两百而以内的
因为200的价格有段很突出,所以拉长一点到220;
4.4 品牌店铺对比
4.5 单个店铺对比
由于我们添加一个但店铺销量累计和列,所以上面数据很多是带有一些重复性质,我们只按店铺划分,这样数据会从430行变为144行;
4.6 销量区间分箱查看
看看,销量很多、销量一般的店铺,占总体的比例,这边只看了旗舰店+荣事达部分;