赞
踩
1、分析整个市场的总体趋势
2、分析各子类目市场占比及变化趋势
3、分析市场集中度,即是否存在垄断
import glob import os import pandas as pd import numpy as np import re import datetime as dt from sklearn.linear_model import LinearRegression import seaborn as sns;sns.set() from matplotlib import pyplot as plt import jieba import jieba.analyse import imageio from wordcloud import WordCloud from snownlp import SnowNLP import warnings warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif']='simhei'
plt.rcParams['axes.unicode_minus']=False
filenames = glob.glob('*近三年交易额.xlsx')
filenames
def load_file(filename):
colname = re.search(r'.*(?=市场)',filename).group()
df = pd.read_excel(filename)
if df['时间'].dtypes == 'int64': # 可能存在的时间数据杂乱清洗
df['时间'] = pd.to_datetime(df['时间'],unit='D',origin=pd.Timestamp('1899-12-30'))
df.rename(columns={df.columns[1]:colname},inplace=True)
df = df.set_index('时间')
return df
dfs = [load_file(i) for i in filenames]
df = pd.concat(dfs,axis=1).reset_index()
df.head()
线性回归补全2018年11、12月数据,便于年维度分析
这里假设:
1、各月之间没有明显的周期性变化;
2、每年对应月份的数据呈线性变化。
month = df['时间'].dt.month # 提取月份便于索引
for i in [11,12]:
dm = df[month == i]
xtrain = np.array(dm['时间'].dt.year).reshape(-1,1)
ytest = [pd.datetime(2018,i,1)] #测试y第一列为日期
for j in range(1,len(dm.columns)):
ytrain = np.array(dm.iloc[:,j]).reshape(-1,1)
lm = LinearRegression().fit(xtrain,ytrain) #2015、16、17数据训练
yhat = lm.predict(np.array([2018]).reshape(-1,1))
ytest.append(round(yhat[0][0],2)) #对应列的预测值附在新增加的行后
newrow = pd.DataFrame([dict(zip(df.columns,ytest))]) #给预测结果赋值对应的列名
df = newrow.append(df)
df
# 分组求和,看整个市场交易额逐年变化趋势
byyear = df.groupby('年份').sum(axis=1).reset_index()
byyear
# 绘图
sns.relplot('年份','合计',kind='line',marker='o',data=byyear)
plt.title('近三年驱虫市场趋势',fontsize=16)
plt.xticks(byyear.年份)
plt.xlabel('年份')
plt.yticks(byyear.合计)
plt.ylabel('总交易额')
plt.show()
总趋势:驱虫市场整体处于增长趋势,上升期。
可见:灭鼠杀虫剂份额大,增长高。
可见:每年占比情况变化不大,灭鼠杀虫剂和蚊香液市场大。
# 计算年增幅
byyear_p = byyear.iloc[:,1:-1]
byyear_diff = byyear_p.diff().iloc[1:,:].reset_index(drop=True)/byyear_p.iloc[:2,:]
byyear_diff.index = ['16-17','17-18']
byyear_diff
可见:
1、电蚊香套装进入负增长,该领域不可进;
2、较稳定增长领域:灭鼠杀虫剂;
3、考虑蚊香加热器产品寿命长,且总交易额较低,占比较低,市场小,故主要考虑灭鼠杀虫剂市场。
采用赫芬达尔指数(Herfindahl-Hirschman Index,缩写HHI)
df1 = pd.read_excel('top100品牌数据.xlsx')
df1
# 生成交易指数占比列,用以描述市场份额
df1['交易指数占比'] = df1['交易指数']/df1['交易指数'].sum()
# 计算HHI指数
HHI = sum(df1['交易指数占比']**2)
print(f'驱虫市场HHI指数:{HHI:.6f}(或{HHI*10000:.2f}),等效公司数:{1/HHI:.2f}')
可见:该市场存在一定竞争,但不存在垄断。
1、最受欢迎的产品类型
2、重点产品细分价格段分析
3、细分市场其它属性分析
os.listdir('../灭鼠杀虫剂细分市场')
os.chdir('../灭鼠杀虫剂细分市场')
filenames1 = glob.glob('*.xlsx')
dfs1 = [pd.read_excel(i) for i in filenames1]
df2 = pd.concat(dfs1,sort=False)
df2.info()
df2.isnull().mean()
删除列
1、NA > 98%
2、单一值
3、逻辑上可删:
- 如果我有新数据,新数据里会不会有这个x,会有则留下,没有则删去
- 链接等没用的列
4、类ID列
- 名字
- 分类多,每类频次太少,预测能力差
# 空值占比大于98%,删除
df20 = df2.loc[:,~ind1]
# 药品登记号之后的文号列作用不大且空值占比依旧较大,删除
ind11 = df20.columns.get_loc('药品登记号')
df20 = df20.iloc[:,:ind11]
# 特征值单一,删除
ind2 = np.array([len(df20[i].unique())==1 for i in df20.columns])
df21 = df20.loc[:,~ind2]
# 删除逻辑上不可能用到的列
useless = ['时间','页码','链接','主图链接','主图视频链接',
'排名','运费','下架时间','旺旺'] #目标:寻找增长点,新数据中没有排名信息,故删除
df22 = df21.drop(columns=useless)
df22.isnull().mean()
可见:最受欢迎的是灭鼠类产品,市场占比最大,高达38%,需要重点研究。
# 对价格分箱进一步观察
bins = [0,50,100,150,200,250,300,500]
labels = ['0-50','50-100','100-150',
'150-200','200-250','250-300','300以上']
df24['价格区间'] = pd.cut(df24['售价'],bins,labels=labels,include_lowest=True)
df24['价格区间'].value_counts()
销售额
销售额占比
宝贝数
宝贝数占比
相对竞争度(1-归一化['单宝贝销售额'])
def bykey(df,by,sort='销售额占比'):
byk = pd.DataFrame(df.groupby(by).sum()).loc[:,['预估销售额']]
byk['销售额占比'] = byk['预估销售额']/byk['预估销售额'].sum()
byk['宝贝数'] = df.groupby(by).nunique()['宝贝ID']
byk['宝贝数占比'] = byk['宝贝数']/byk['宝贝数'].sum()
byk['单宝贝平均销售额'] = byk['预估销售额']/byk['宝贝数']
byk['相对竞争度'] = 1-(byk['单宝贝平均销售额']-byk['单宝贝平均销售额'].min())/(
byk['单宝贝平均销售额'].max()-byk['单宝贝平均销售额'].min())
if sort:
byk.sort_values(sort,ascending=False,inplace=True)
return byk
byprice = bykey(df24,'价格区间')
byprice
# 绘图观察 def plot_m(bydf): ''' 绘图函数 ''' sns.set(font='SimHei',style='white') y1 = bydf['销售额占比'] y2 = bydf['相对竞争度'] x = bydf.index.tolist() fig = plt.figure(figsize=(10,6)) # 柱形图 ax1 = fig.add_subplot(111) ax1.set_ylim([0,1]) ax1.bar(x, y1, alpha=0.7,color='g') ax1.set_ylabel('销售额占比',fontsize='14') ax1.tick_params(labelsize=15) for i,(_x, _y) in enumerate(zip(x, y1)): plt.text(_x, _y,f'{_y*100:.2f}%',color='black', fontsize=20, ha='center', va='bottom') plt.xlabel('价格区间') # 折线图 ax2 = ax1.twinx() ax2.set_ylim([-0.1,1.1]) ax2.plot(x, y2, 'b', ms=10, lw=3, marker='o') ax2.set_ylabel(u'相对竞争度', fontsize='14') sns.despine(left=True, bottom=True) ax2.tick_params(labelsize=15) ax2.legend(loc='upper right') plt.show()
可见:
1、0-50是大容量市场,虽然竞争大,但这么大的蛋糕能参与还是要参与。
2、200-250,竞争小,做高价市场的优先选择,属于机会点,可发展轻奢产品。
可见:10-20相对竞争度低,容量大,优选,20-30也不错。
可见:天猫各个方面都优于淘宝。
# 筛选出排名前5%的型号,更倾向于大众的产品
bytype1 = bytype[bytype['预估销售额']>=bytype['预估销售额'].quantile(0.95)]
可见:虽然粘鼠板市场份额普遍较高,但是0005在竞争度上有明显的优势。
可见:常见物理形态是固体,竞争度也偏高,而胶水虽然竞争度低,但是市场份额较低。
可见:当物理形态为固体,净含量为1时,潜力较大。
对比市场份额前三的拜耳、安速、科凌虫控,挖掘拜耳市场增长策略
1、产品分布情况
2、产品结构特征(BCG矩阵)及发展策略
3、流量结构及推广策略
4、舆情评论及情感分析(拜耳公司)
os.listdir('../竞争数据')
an31 = df3an.groupby('类目').sum()
an31
bai31 = df3bai.groupby('类目').sum()
bai31
kl31 = df3kl.groupby('类目').sum()
kl31
可见:拜耳只有一个市场,竞争对手则有不同市场,但主要市场都是灭鼠杀虫剂。
可见:
1、拜耳的主要对象是蟑螂,而另外两家除此之外还有螨,鼠。
2、从之前的分析看灭鼠和蟑螂的整体市场份额都大,所以对拜耳公司而言,应开拓新市场,尤其是灭鼠,也应考察其他两家都开拓的螨市场。
# 函数1:关键指标
def byproduct(df):
'''
定义关键指标函数
'''
dfb = df.groupby('商品').mean().loc[:,['交易增长幅度']] #DataFrame
dfb['交易金额'] = df.groupby('商品').sum()['交易金额'] #Series
dfb['交易金额占比'] = dfb['交易金额']/dfb['交易金额'].sum()
dfb['商品个数'] = df.groupby('商品').count()['交易金额']
dfb.reset_index(inplace=True)
return dfb
# 函数2:盖帽法处理异常值
def block(x):
'''盖帽函数
用90%的值替换最大值
'''
get = x.quantile(0.9)
out = x.mask(x>get,get)
return(out)
def block1(df):
df1 = df.copy()
df1['交易增长幅度']=block(df1['交易增长幅度'])
df1['交易金额占比']=block(df1['交易金额占比'])
return df1
# 函数3:绘制波士顿矩阵图
def plotBCG(df,mean=False,q1=0.5,q2=0.5):
f,ax = plt.subplots(figsize=(10,8))
ax = sns.scatterplot('交易金额占比','交易增长幅度',
hue='商品个数',size='商品个数',sizes=(20,200),
palette='cool',legend='full',data=df)
for i in range(0,len(df)):
ax.text(df['交易金额占比'][i]+0.001,df['交易增长幅度'][i],i)
if mean: # 均值线
plt.axvline(df['交易金额占比'].mean())
plt.axhline(df['交易增长幅度'].mean())
else:
plt.axvline(df['交易金额占比'].quantile(q1))
plt.axhline(df['交易增长幅度'].quantile(q2))
plt.show()
# 函数4:根据BCG矩阵,抽取明星、奶牛、问题产品 def extractBCG(df,q1=0.5,q2=0.5,by='交易金额占比'): ''' 从原始数据中,抽取明星产品、奶牛产品、问题产品 ''' # 明星产品 star = df.loc[(df['交易金额占比']>=df['交易金额占比'].quantile(q1) ) & (df['交易增长幅度']>=df['交易增长幅度'].quantile(q2)),:] star = star.sort_values(by,ascending=False) # 奶牛产品:关心市场份额,依交易金额占比排序 cow = df.loc[(df['交易金额占比']>=df['交易金额占比'].quantile(q1) ) & (df['交易增长幅度']<df['交易增长幅度'].quantile(q2)),:] cow = cow.sort_values(by,ascending=False) # 问题产品:关心市场增长率,依交易增长幅度排序 que = df.loc[(df['交易金额占比']<df['交易金额占比'].quantile(q1) ) & (df['交易增长幅度']>=df['交易增长幅度'].quantile(q2)),:] que = que.sort_values(by,ascending=False) return star,cow,que
可见:
1、问题产品中的潜力款和奶牛产品的商品个数普遍比较多。
2、突出的明星产品不足,但是有快进入明星产品的问题产品。
baistar,baicow = extractBOG(bai4)[:2]
baique = extractBOG(bai4,by='交易增长幅度')[-1]
总结:拜耳大部分产品集中在除蟑上,杀虫也有一定的规模,但是明星产品略乏力,可以进一步发展问题产品灭鼠为明星产品。
可见:奶牛产品足,明星产品部分有前途,问题产品部分有潜力,瘦狗产品不多。
总结:安速没有明显的灭鼠市场,同拜耳在灭蟑方面存在竞争。因此拜耳更应率先发展起灭鼠市场,在新市场增长点建立先发优势。
可见:奶牛产品足,明星产品少,大部分有前途,问题产品部分有潜力,瘦狗产品少。
总结:科凌虫控每个产品结构相对独立(奶牛除蟑,明星灭鼠,潜力除螨),缺少后续的支持。拜耳若决定进驻灭鼠市场,应仔细研究科凌虫控在灭鼠市场的产品表现,做好准备。
抽取交易指数排名前10的流量渠道分析
好的流量结构:
1、合理的产品结构;
2、适当的付费广告占比(一般不超过40%);
3、尽可能提升流量入口数量;
4、参考同行流量结构
# 自定义流量结构及说明函数 def flow(df): ''' 流量结构及说明函数 ''' df0 = df.copy() top10 = df0.sort_values('交易指数',ascending=False ).reset_index(drop=True).iloc[:10,:] top10['交易指数占比'] = top10['交易指数']/top10['交易指数'].sum() top10.set_index('流量来源',inplace=True) paid = ['付费流量','直通车','淘宝客','淘宝联盟'] #查得4个付费流量渠道 ind = np.any([top10.index == i for i in paid],axis=0) explode = ind * 0.1 ax = top10['交易指数占比'].plot.pie(autopct='%.2f%%', figsize=(5,5),explode=explode) ax.set_ylabel('') plt.show() paidsum = top10['交易指数占比'][ind].sum() salesum = top10['交易指数'].sum() paidsale = salesum * paidsum print(f'前10流量中:\ 总交易指数:{salesum:.0f},付费流量占比:{paidsum*100:.2f}%,付费流量带来交易指数:{paidsale:.0f}') return top10
bai5top10 = flow(df5bai)
an5top10 = flow(df5an)
kl5top10 = flow(df5kl)
可见:付费流量占比三家无较大差异,但拜耳付费流量带来的交易指数占比最高,流量结构较为优秀,应继续维护。
1、文本数据清洗
(1)去非中英文(英文应变小写)
(2)分词(jieba/stemming--自定义词典--搜狗词库)
(3)去停用词
(4)去低频词
2、可视化:词云
3、建模:
(1)转化为文档词矩阵(DTM)
(2)有监督:贝叶斯
(3)无监督:LDA、分群、情感分析
# 分词函数
def w_cut(df):
df_new = []
for i in df:
seg0 = pd.Series(jieba.lcut(i))
ind3 = pd.Series([len(j) for j in seg0])>1 #筛选出长度大于1的词
seg1 = seg0[ind3]
ind31 = ~seg1.isin(pd.Series(stopwords)) #去停用词并去重
seg2 = list(seg1[ind31].unique())
if len(seg2)>0: #去空列表
df_new.append(seg2)
return df_new
# 绘制词云图函数
def word_cloud(df):
mask = imageio.imread(r"D:\CDA课件\10月30日 项目1:电商文本挖掘\data\leaf.jpg")
font = r'C:\Windows\Fonts\simkai.ttf'
wc = WordCloud(background_color='white',mask=mask,font_path=font).generate(df)
plt.figure(figsize=(6,8))
plt.imshow(wc)
plt.axis('off')
plt.show()
word_cloud(bai64)
w = pd.DataFrame(jieba.analyse.extract_tags(bai64,20,True),columns=['关键词','重要度比重'])
w
可见:从词云和关键词来看,舆论评价偏好。
# 情感评分函数
def senti(df):
sc = []
for i in df.评论:
s = SnowNLP(str(i))
sc.append(s.sentiments)
df['情感评分']=sc
return df
可见:与竞争品牌相比,拜耳产品的买家评分还较低,可以考虑在产品和售后方面进一步挖掘改进。
s_bai = s_bai.sort_values('情感评分')
bad = s_bai.iloc[:100]['评论']
bad
可见:差评反映了使用效果欠佳、客服存在不周、快递较慢等问题,应结合实际业务进行考察改进。
1、整体市场处于快速增长阶段。
2、灭鼠杀虫剂市场份额大(高于60%),约占第二名蚊香液市场的2倍,且市场增长率接近40%,可认为是明星产品类目,需重点投资和关注。
3、驱虫市场不存在垄断,竞争相对激烈,尚无明显来自大公司的压力。
1、该市场中,需重点关注的产品类别是:灭鼠和蟑螂。
2、灭鼠方面:
3、灭鼠0-50价格段的产品市场中:
1、产品分布上:
2、产品结构上:
3、流量结构上:较为优秀,应继续维护。
4、舆情及情感分析上:
1、大力发展灭鼠产品,10-20、20-30、200-250的价格段产品是机会点,店铺优选天猫、型号优选黏鼠板,产品形态优选固态,做好对科凌虫控在灭鼠市场的产品研究。
2、适当发布消螨产品,拓宽产品发展线。
3、考察、改进在产品效果、客服表现和物流系统方面的潜在不足。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。