python酒类销售数据分析
一、数据概述
'id','name','price','sales','ad_word','buy_act','vote_count','url','date','brand'分别为销售数据的商品ID,商品名称,单价,销量,广告词,促销活动,链接,日期,品牌。
以及自构属性‘amount’:销售额,‘month’:月份,‘price_level’:价格区间。
二、提出问题
1、行业大盘最近一个周期(2018/2/27)表现?各价位段表现?
总体表现,各价位表现,哪个价位的产品最火,各厂家表现?
近期各行业的广告词、促销活动怎么样
2、行业大盘总体态势怎样?
销量与评论数、单价的关系?
时间序列下的行业产品走势?
3、如何评价泸州老窖品牌?(可从多角度,规模增长趋势、产品结构等)
产品规模、增长趋势、友商竞争、行业水平?
三、行业大盘最近一个周期(2018/2/27)表现?各价位段表现?
行业大盘最近一个周期总体表现
近期行业的总销售量为5.663030e+05,总评价数为1.255655e+06,总销售额达1.842307e+08。
平均单价价格为417元,平均销售642份,平均销售额达209115.4元
单价中位数199,说明少数高价位的酒提高了总体均值
销量中位数为148,说明少数及销量高的天数提升了平均交易量
销售额中位数低于总体均值相差巨大,可能存在爆发交易的情况。
一天中出现的最高交易量是21685份订单,最高交易额是65011630元,最高单价的白酒为6588元,最高评论数为67514条,最低为0条。
各价位表现
在行业大盘最近一个周期内,可以看到销量最好和评论数最高的均是是100-200价位的白酒。
在价位50以下白酒销量和评论数出现大反差,在销量差距悬殊的情况下,该类白酒的评论数超过200-500价位白酒的评论数,但是销量偏低说明该类白酒在市场中有较高流行度的同时可能也存在较多的吐槽点。
3000以上的销量与评论数极低,符合当今社会人们财富资源分配或生活消费水平的差距,高消费人群只占极少数,中等价位(100-500)是市场的主要潮流所在,由中价位向低价位过度的产品(50-100)同样能稳住市场,获得较高的销量与人气。
1000-3000价位席卷市场,高单价情况下即时在低销量时也能远超越其他价位销售额。
基本呈现单价越高,评论数越少。人们总是低价商品的要求过于执着?
各厂家表现
0 金六福 14 董酒 28 白云边
1 酒鬼酒 15 双沟君坊 29 红星
2 双沟醴泉 16 稻花香 30 劲酒
3 古越龙山 17 衡水老白干 31 郎酒
4 安达情 18 天佑德 32 习酒
5 贵州国台 19 年份原浆 33 汾酒
6 白水杜康 20 金门 34 古井贡酒
7 国台 21 四特 35 江小白
8 双沟 22 赖茅 36 剑南春
9 致中和 23 迎驾贡酒 37 泸州老窖
10 劲牌 24 西凤 38 牛栏山
11 八八坑 25 飞天不老 39 五粮液
12 伊力特 26 小糊涂仙 40 洋河
13 珍酒 27 水井坊 41 茅台
最近一周期五粮液销量最高达到10万瓶以上,远领先于其他厂家。
五粮液产品市场评论数最高,应该是广告宣传或者产品质量做得好。
茅台近期销售总额位于行业最高水平,销售额近7500万。五粮液可能由于产品单价偏低,销售总额位居第三,接近2000万。
最近一个周期广告、促销活动怎么做的?
广告词一以‘天猫配送’,‘正品保证’等为主要标语,‘东方习酒’,‘猫超自营’,‘地道北京味’也是主要宣传方向。
促销活动主要以‘满一1或2送任意一件赠品,赠完为止’作为主要促销活动。
四、行业大盘总体态势怎样?
销量与单价、评论数的关系
评论数量变化与销量基本呈线性变化。评论数代表市场反应,市场热度越高,销量越高。
单价与销量基本成反比例变化。单价越高,销量越低,单价越低,销量越高。
时间序列下的行业产品走势
200-500价位段的商品销量呈上升趋势,0-50和50-100的商品在2017年11月上升后出现持续下降,100-200的商品在上升后保持平稳,基本站稳市场。500-3000区间内商品在同年12月后出现小范围增长,因其单价基数较大,可能引起销售额大幅增长。
除0-50和3000以上产品外,其他商品都在2017年11月后出现销售额显著增长,推测可能是双十一以及其他促销活动,但是对0-50和3000以上的商品销售状态基本无影响。1000-3000区间商品在2017年12月过后出现直线式增长,100-500区间产品作为市场主力也出现增长趋势。
3000月以上的酒类在11月出现价格大额下跌,其他区间商品单价均走势平稳。
五、泸州老窖自身增长的趋势,产品结构,行业水平
泸州老窖产品规模
泸州老窖品牌主打50-500价位产品覆盖市场,其中3000+超高价酒类占比与0-50低价品类占比最低,均低于500-3000档位,说明泸州老窖在市场的品牌形象与战略目标是做好中高端酒类产品。
在2017年12月产品规模突然增大,应该是与行业竞争或市场需求相关。
销量在十一月份出现大幅增长,持续到次年一月份出现显著下降。
总销售额与销量表现相似,也是在十一月份出现大幅增长,持续到次年一月份出现显著下降。
0-50区间产品在十一月后大幅增长,后持续衰弱。50-500区间商品同期均出现显著增长,后缓慢下降趋于稳定。
200-500与1000-3000区间商品由于其单价基数较大,在同年十一月销量保证的前提下,出现大幅增长。
3000+产品在2017年7月-9月出现波动后趋于平稳。
17年9月可能出现了一些问题,除500-1000区间外,都出现了先增后降的趋势。
那种广告词、促销标语出现的最多
该品牌主打广告关键词: ‘’限时直降‘’,‘甄选好货’,‘厂家直供’。
主打的促销标语为 ‘’送任意一件赠品,赠完即止‘’。
选择牛栏山作为泸州老窖竞争对手
牛栏山品牌在产品布局上和泸州老窖都是主打50-500价位段商品布局,但是牛栏山在0-50上的产品数多于500-1000价位的产品数量。且没有3000元以上产品上市,可见牛栏山品牌试图留住中端价位产品客户,拉拢低价位产品客户的战略方针。
与泸州老窖相似均在十二月出现了较大幅度的增长。
泸州老窖只在200-300和超1000元以上的产品销量小范围领先友商,但由于单价基数较大,可能会有意想不到的效果哦
泸州老窖销售额仅在200-500和1000元以上三个价位段领先友商,在50-200价位,销售额较大程度低于友商。
除了200-500和1000以上价位的产品,泸州老窖品牌产品收到的市场评论与反馈均低于友商,可见友商的宣传力度或产品口碑在市场中占有较高热度 。
可以看到两个品牌的销售额主要来源产品类别有明显差异。
泸州老窖在行业的水平如何
泸州老窖位于行业的上游水平,产品规模完善,各价位商品数量布局体现了明确的行业目标:要做中高端酒类产品的佼佼者。且不放弃低价位的0-50系列产品,全面覆盖市场,在给定的时间数据中,各区间段产品除0-50与3000+以外,其他商品的销量与销售额均呈持续缓慢上升趋势。可以看到该企业处于一个蓬勃向上,逐步冲向高端的行业发展状态。
六、分析结论
1、近期行业呈现蓬勃向上的发展状态,0-50价位产品的销量与评论数出现较大市场反差,100-200价位段的商品销量最火,位于市场销量及销售额榜首的是茅台品牌,五粮液以市场获评数最高位居榜首。行业广告词以‘天猫配送’,‘正品保证’等作为主要标语,以‘满1或2件送任意一件赠品,赠完为止’作为主要促销活动。
2、行业总体发展十分成熟,各品牌产品竞争力都十分明显,销量与评论基本呈正相关线性关系,与单价成反比例关系,100-500区间产品销量作为市场主流,1000元以上产品可能在销售额上反超其他高销量产品,双十一对市场的刺激反响极为强烈。
3、泸州老窖主打中高端酒类产品,全价位品类布局全面,综合实力处于全行业上游水平。销量受双十一影响显著,导致200-500与1000-3000区间商品销售额大幅增长。该品牌主打广告关键词: ‘’限时直降‘’,‘甄选好货’,‘厂家直供’。主要促销活动为 ‘’送任意一件赠品,赠完即止‘’。其总体销售额主要来源于100-3000价位产品,相比牛栏山不相上下,在中高价位品类优势明显,0-100价位段还有较大进步空间。
七、python代码
导入包,设定字体和画图风格
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from wordcloud import WordCloud
plt.rcParams['font.sans-serif'] = ['SimHei']#显示中文
plt.style.use('ggplot')
导入并清洗数据
#导入数据
path = 'D:/python_data_file/Alcohol.xlsx'
def load_alcohol_data(path):
df = pd.read_excel(path)
df.columns = ['id','name','price','sales','ad_word','buy_act','vote_count','url','date','brand']
df = df[df.price.notnull()]
df['amount'] = df['sales']*df['price']
df['month'] = df.date.values.astype('datetime64[M]')#日期时间序列转化为月份时间序列
return df
df = load_alcohol_data(path)
#对酒类单价分层
def price_level(data):
a=[]
for i in data.price:
if i <50:
a.append('0-50')
elif i <100:
a.append('50-100')
elif i <200:
a.append('100-200')
elif i<500:
a.append('200-500')
elif i <1000:
a.append('500-1000')
elif i<3000:
a.append('1000-3000')
else:
a.append('3000+')
data['price_level'] = a
data = data.reset_index(drop=True)
return data
df = price_level(df)
recent_df = df[df.date=='2018-02-27']
recent_df[['sales','vote_count','amount']].sum()
recent_df.describe()
lzlj_df = df[df.brand=='泸州老窖'].reset_index(drop=True)
lzlj_df = price_level(lzlj_df)
lzlj_df.describe()
近期各厂家的表现
#各厂家的表现就在这了
all_brand = recent_df.groupby('brand')[['sales','vote_count','amount']].sum().sort_values(by=
'amount',ascending = True).reset_index()
all_brand.sales.plot.bar()
plt.title('各厂家销量对比')
all_brand.vote_count.plot.bar()
plt.title('各厂家评论数')
all_brand.amount.plot.bar()
plt.title('各厂家销售额')
画柱状图
#x写个画图函数,不然太麻烦了
def pic_barh(data,tit,xbel,ybel):
data.sort_values().plot.barh(figsize=(12,6))
plt.title(tit,fontsize = 20)
plt.xlabel(xbel,fontsize = 20)
plt.ylabel(ybel,fontsize = 20)
plt.show()
pic_barh(level_performance_mean.price,'近期平均价格表现','价格','区间')
pic_barh(level_performance_sum.amount,'近期销售额表现','金额','区间')
pic_barh(level_performance_mean.vote_count,'近期评论表现','评论数','区间')
pic_barh(level_performance_mean.amount,'近期平均金额表现','金额','区间')
近期各价位段表现
level_performance_sum = recent_df.groupby('price_level')[
'sales','vote_count','amount'].sum().sort_values(by='sales',ascending=False)
level_performance_mean = recent_df.groupby('price_level')[
'price','sales','vote_count','amount'].mean().sort_values(by='sales',ascending=False)
#绘制利润柱状图
x= list(range(len(level_performance_sum.index)))#索引长度序列
xl = level_performance_sum.index#xl为索引实际值
fig = plt.figure(figsize=(12,6))
ax1=fig.add_subplot(111)
plt.bar(x,level_performance_sum.sales)
#接下来有疑问?
plt.xticks(x,xl,rotation = 0,fontsize=12)
plt.yticks(fontsize=15)
ax1.set_title('各价位酒类销量',fontsize = 20)
ax1.set_xlabel('价位',fontsize = 18)
ax1.set_ylabel('销量',fontsize = 18)
ax1.legend(loc=2,labels='销量')
#绘制利润折线图
import matplotlib.ticker as mtick
ax2 = ax1.twinx()
ax2.plot(x,level_performance_sum.vote_count,'go-',lw=2)
yticks = mtick.FormatStrFormatter(fmt='%d%%')
ax2.yaxis.set_major_formatter(yticks)#次纵坐标标签设置为百分比显示
plt.yticks(fontsize = 15)
ax2.set_ylabel('评论数',fontsize = 18)
ax2.legend(labels = 'vote_count')#传递labels参数避免警告
寻找竞争品牌
#想写个函数找出泸州老窖的上下各相邻两个的品牌,也就是它的竞争品牌
def lookup_name(data):
for i in range(len(data)):
if data.loc[i,'brand'] =='泸州老窖':
return [data.loc[i-1,'brand'],data.loc[i-2,'brand'],data.loc[i+1,'brand'],data.loc[i+2,'brand']]
else:
continue
#按品牌分组求均值,再分别按价格、销量和金额排序,然后找出竞争品牌
df_brand_price_mean = df.groupby('brand',as_index=False)[[
'price','sales','amount']].mean().sort_values(by='price',ascending=True).reset_index(drop=True)
lookup_name(df_brand_price_mean)#['汾酒', '珍酒', '剑南春', '白云边']
df_brand_sales_mean=df.groupby('brand',as_index=False)[[
'price','sales','amount']].mean().sort_values(by='sales',ascending=True).reset_index(drop=True)
df_brand_amount_mean= df.groupby('brand',as_index=False)[[
'price','sales','amount']].mean().sort_values(by='amount',ascending=True).reset_index(drop=True)
#按品牌分组求和,再分别按价格、销量和金额排序,然后找出竞争品牌
df_brand_amount_sum=df.groupby('brand',as_index=False)[[
'sales','amount']].sum().sort_values(by='amount',ascending = True).reset_index(drop=True)
df_brand_sales_sum=df.groupby('brand',as_index=False)[[
'sales','amount']].sum().sort_values(by='sales',ascending = True).reset_index(drop=True)
a_sums = set(lookup_name(df_brand_amount_sum)+lookup_name(df_brand_sales_sum))
a_means = set(lookup_name(df_brand_price_mean)+lookup_name(df_brand_sales_mean)+lookup_name(df_brand_amount_mean))
s = set(list(a_means)+list(a_sums))
#{'习酒','五粮液','剑南春','劲酒','古井贡酒', '水井坊', '江小白', '汾酒', '洋河', '牛栏山','珍酒',
# '白云边','红星','茅台'} 选取剑南春 古井贡酒 牛栏山 五粮液作为泸州老窖的竞争对手
生成词云图
#提取广告词字符串
def ad_words_str(data):
ad_words_list = []
for x in data.ad_word.dropna():
ad_words_list.append(x)
ad_words_list = ''.join(ad_words_list)
return ad_words_list
#提取促销活动字符串
def buy_act_str(data):
buy_act_list=[]
for x in data.buy_act.dropna():
buy_act_list.append(x)
buy_act_list = ''.join(buy_act_list)
return buy_act_list
#生成词云
def pic_words(keywords_list):
keywords_list.replace('\s','')#去除字符串中空字符串(\s用于匹配空白字符,可能是空格、制表符、其他空白))
font = 'C:\Windows\Fonts\msyh.ttc'
wordcloud = WordCloud(background_color='white',max_words=3000,scale=1.5,font_path=font).generate(keywords_list)
plt.figure(figsize=(14,8))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
listb = ad_words_str(lzlj_df)+buy_act_str(lzlj_df)
#行业大盘最近一个周期的词云
pic_words(ad_words_str(recent_df))
pic_words(buy_act_str(recent_df))
pic_words(ad_words_str(lzlj_df))
pic_words(buy_act_str(lzlj_df))
画走势图
df.plot.scatter(x='price',y='sales')
plt.title('销量与单价')
df.plot.scatter(x='vote_count',y='sales')
plt.title('销量与评论数')
#写个画图函数,它不香吗
def pic_trend(data,val,agg,tit,ylab):
a_sum = data.pivot_table(
index='price_level',columns='month',values=val,aggfunc=agg).fillna(0).T
plt.figure(figsize=(12,6))
a_sum.plot()
plt.title(tit,fontsize=20)
plt.ylabel(ylab,fontsize=15)
plt.show()
pic_trend(lzlj_df,'sales','sum','泸州老窖各区间产品销量走势','sales')
pic_trend(lzlj_df,'amount','sum','泸州老窖销售额走势','amount')
pic_trend(lzlj_df,'price','mean','泸州老窖产品单价走势','price')
pic_trend(lzlj_df,'vote_count','sum','泸州老窖产品评论走势','vote_count')
pic_trend(df,'sales','sum','总体各区间产品销量走势','sales')
pic_trend(df,'amount','sum','总体产品销售额走势','amount')
pic_trend(df,'price','mean','总体产品单价走势','price')
pic_trend(df,'vote_count','sum','总体产品评论走势','vote_count')
得到各品牌数据
#写个函数用来对各品牌数据拆分
def df_brand(data,brand):
data = data[data.brand==brand].reset_index(drop=True)
data = price_level(data)
data['amount'] = data['sales']*data['price']
return data
# list_brand = ['剑南春','古井贡酒','牛栏山','五粮液','泸州老窖']
# for i in list_brand:
# df_brand(df,i)
#对该品牌的各价位段进行分组求和
def df_brand_groupby_sum(data):
data = data.groupby('price_level').sum().loc[:,['sales','vote_count','amount']]
return data
# 剑南春 古井贡酒 牛栏山 五粮液 #各个价格段的销量、评论量、销售额汇总
lzlj_sum = df_brand_groupby_sum(df_brand(df,'泸州老窖'))
jlc_sum = df_brand_groupby_sum(df_brand(df,'剑南春'))
gjgj_sum = df_brand_groupby_sum(df_brand(df,'古井贡酒'))
nls_sum = df_brand_groupby_sum(df_brand(df,'牛栏山'))
wly_sum = df_brand_groupby_sum(df_brand(df,'五粮液'))
画饼图
def pic_pie(data,gby,tit):
price_count = data.groupby(gby).count().reset_index(drop=False)
fig = plt.figure(figsize=(16,8))
plt.pie(price_count.price,labels=price_count[gby],autopct='%.1f%%')
plt.title(tit,fontsize = 15)
pic_pie(nls_df,'price_level','牛栏山产品价位规模')
pic_pie(nls_df,'month','牛栏山产品月份规模')
pic_pie(lzlj_df,'price_level','泸州老窖产品价位规模')
pic_pie(lzlj_df,'month','泸州老窖产品月份规模')
fig = plt.figure(figsize=(16,8))
plt.pie(lzlj_sum.sales,labels=lzlj_sum.index,autopct='%.1f%%')
plt.title('泸州老窖各价位销量图',fontsize = 15)
fig = plt.figure(figsize=(16,8))
plt.pie(nls_sum.vote_count,labels=nls_sum.index,autopct='%.1f%%')
plt.title('牛栏山各价位评论数图',fontsize = 15)
#按月份销量变化
lzlj_df.groupby('month').sales.sum().plot()
plt.title('销量按月份变化')
#总销售额随时间变化
lzlj_df.groupby('month').amount.sum().plot()
plt.title('总销售额随时间变化')
def pic_bar2(arg):
sales_dif = nls_sum.sales.reset_index().merge(lzlj_sum[arg].reset_index(),on='price_level',how='outer',suffixes=['_nls','_lzlj'])
sales_dif = sales_dif.set_index('price_level')
plt.figure(figsize=(12,10))
sales_dif.plot.bar()
plt.title('泸州老窖与牛栏山'+str(arg)+'对比')
pic_bar2('sales')
pic_bar2('amount')
pic_bar2('vote_count')
pic_barh(df_brand_sum.sales,'各品牌销售总量对比','销量','品牌')
pic_barh(df_brand_sum.amount,'各品牌销售总金额对比','金额','品牌')
pic_barh(df_brand_sum.vote_count,'各品牌产品评论数对比','评论数','品牌')
好好学习,天天敲代码!