内容: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的销售数据:
2.1爬数据
大概长这样
基本处理:
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)
销量按照最少的来取,这些销量要看看规则,例如2万+人付款,200+人付款,很少的几十个以内的,会显示具体数字;还有极少部分多少人看过,选了两个点进去,发现销量都比较少,想着销量真不错,也不至于不写多少人买,直接写0算了;
2.2销量动态图
# 选择销量、销售额靠前的 逆序是为了横向柱状图从大到小显示
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
算了,园子里有,去那边看啦,不想复制了;
燃气行业分析、商品运营前景分析 - 勁 - 博客园 (cnblogs.com)