Python文本数据挖掘——电商寻求市场增长点(中)

(三)、 灭鼠杀虫剂市场机会点

灭鼠杀虫剂市场机会点-业务逻辑

  1. 子类目市场确定后(灭鼠杀虫剂市场):确定市场中最受欢迎的产品类别–>细分价格段
    –>属性进一步分析:什么样的价格作为主市场,什么样的商品符合大众口味
  2. 不同用途的商品定位:
  3. 商品布局时要考虑的问题:价格,产品特征,用户喜好度,商品需求等
  4. 引流商品:价格低,利润空间几乎没有,目的是为了引流
  5. 利润商品:价格合理,只要的盈利来源
  6. 品牌商品:价格偏高,门面商品或奢侈品
    获取流量的方式有免费和付费两种,免费流量看缘分(lian),控制付费流量成本
    即是对流量精准度的要求,即精准营销

灭鼠杀虫剂市场机会点-产品类别

  • 使用灭鼠杀虫剂细分市场数据(截止到2018年11月22日30天的交易数据):
    • 读取五个文件并且合并
    • 清洗:去掉大量缺失值的列,去掉单一值的列,去掉逻辑上不可用的列,如:‘时间’,‘链接’,‘主图链接’,'主图视频链接’,‘页码’,‘排名’,‘宝贝标题’,‘运费’,‘下架时间’,‘旺旺’
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列 - 名字 - 分类多,每类频次太少,预测能力差

# 计算空值占比
null_percent = df2.isnull().sum() / len(df2)

# 找出空值占比大于98%的列
ind1 = null_percent > 0.98

# 删除空值占比大于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()

在这里插入图片描述

df22

在这里插入图片描述

# 按照 '类别' 列进行分组,并计算每个类别的总预估销售额
sales_by_category = df22.groupby('类别')['预估销售额'].sum()
print(sales_by_category)

在这里插入图片描述

# 画出横向柱状图
plt.figure(figsize=(10, 5))
sales_by_category.plot(kind='barh')
plt.xlabel('预估销售额')
plt.ylabel('类别')
plt.title('按类别统计的预估销售额')
plt.show()

在这里插入图片描述

# 画出饼图
plt.figure(figsize=(8, 8))
sales_by_category.plot(kind='pie', autopct='%1.1f%%', startangle=90)
plt.ylabel('')  # 隐藏y轴标签
plt.title('按类别统计的预估销售额分布')
plt.show()

在这里插入图片描述
可见:最受欢迎的是灭鼠类产品,市场占比最大,高达38%,需要重点研究。

灭鼠杀虫剂市场机会点-灭鼠类别分析

  • 选择灭鼠数据进一步分析–>依据’售价’进行价格划分,得到若干的价格区间
  • 每个价格区间计算:预估销售额(总和),销售额占比,宝贝数(不同’宝贝ID’数),宝贝数占比,单宝贝平均销售额(不同宝贝的平均预估销售额,可以理解为竞争的反面,单宝贝平均销售额越高,竞争越低,单宝贝销售额高才有的分),相对竞争度(由前一项套入线性变换 得到,0表示类目中最小竞争,1表示最大)
df24 = df22[df22['类别'] == '灭鼠']

在这里插入图片描述

# 对价格分箱进一步观察
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()

在这里插入图片描述

# 对价格分箱进一步观察
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()

在这里插入图片描述

  • 0-50是大容量市场,虽然竞争大,但这么大的蛋糕能参与还是要参与。 2、200-250,竞争小,做高价市场的优先选择,属于机会点,可发展轻奢产品。
# 创建 df25,其中包含 df22 中 '售价' 大于 0 且小于 50 的每一行
df25 = df24[(df24['售价'] > 0) & (df24['售价'] < 50)]

在这里插入图片描述

灭鼠杀虫剂市场机会点-0_50细分价格市场

# 对0-50价格分箱进一步观察
bins = [0,10,20,30,40,50]
labels = ['0-10','10-20','20-30',
         '30-40','40-50']
df25['价格区间'] = pd.cut(df25['售价'],bins,labels=labels,include_lowest=True)
df25['价格区间'].value_counts()

在这里插入图片描述

byprice2 = bykey(df25,'价格区间')
byprice2

在这里插入图片描述

plot_m(byprice2)

在这里插入图片描述
可见:10-20相对竞争度低,容量大,优选,20-30也不错。

细分市场的其它属性分析

byprice3 = bykey(df24,'店铺类型')
byprice3

在这里插入图片描述

plot_m(byprice3)

在这里插入图片描述

bytype = bykey(df25,'型号')
#预估销售额 前5%的型号
bytype1 = bytype[bytype['预估销售额']>=bytype['预估销售额'].quantile(0.95)]
bytype1

在这里插入图片描述

plot_m(bytype1)

在这里插入图片描述
可见虽然粘鼠板市场份额普遍较高,但是0005、MT007在竞争度上有明显的优势。

物理形态

byshape = bykey(df25,'物理形态')
byshape

在这里插入图片描述

plot_m(byshape)

在这里插入图片描述
可见:常见物理形态是固体,竞争度也偏高,而胶水虽然竞争度低,但是市场份额较低。

物理形态、净含量

byhanliang = bykey(df25,'净含量')
byhanliang

在这里插入图片描述

plot_m(byhanliang)

在这里插入图片描述

  • 可见:当物理形态为固体,净含量为1时,潜力较大。

  • 可见市场份额最高的是固体,竞争度也偏高, 而胶水虽然竞争度低,但是市场份额较低, 基本可以认为常见的物理形态就是固体。

灭鼠杀虫剂市场机会点-结论
  • 灭鼠杀虫剂市场中,需要重点关注的产品类别是:灭鼠和蟑螂
  • 灭鼠中:
    · 最大的市场集中在0-50的价格段,这个价格段竞争也很激烈
    · 200-250这个价格段市场份额占10%左右,竞争度很低,是值得挖掘的高价市场
    灭鼠0-50价格段的产品市场中: · 10-20价格段市场容量大,竞争度低,值得进一步开发,20-30也不错
  • 店铺类型方面天猫明显优于淘宝
  • 市场份额高的型号是粘鼠板,然而型号0005市场份额还行,竞争度较低,值得开发
  • 产品的物理形态基本都是固体,也是被大众认可的形态
  • 当物理形态为固体,净含量为1时,市场份额高竞争度低,值得开发
  • 思考:数据分类多是人为填写的,那么分类的严谨性和可扩展性都值得考量,需要结合 业务逻辑和市场环境进一步判断

(四)、竞争分析

依据之前的top100品牌数据,分析市场份额前三的商家:拜耳,科凌虫控,安速
分析流程:

  1. 人群画像分析:三个品牌的人群特征基本一致(这里省略)
  2. 品类分布:依据各个商家产品类别和适用对象的分布,理解每个品牌的产品分布情况
    (横向发展还是纵向发展)
  3. 产品结构:依据波士顿矩阵,分析各品牌不同产品的结构特征,为产品发展策略提供依
  4. 流量结构:通过流量结构和流量效果的对比,制定推广策略
  5. 产品舆情:优质产品维稳
os.listdir('../竞争数据')

在这里插入图片描述
使用商品销售数据分析各家的产品类别的分布:

os.chdir('../竞争数据/商品销售数据')
filename2 = glob.glob('*.xlsx')
filename2 

在这里插入图片描述

df3 = pd.read_excel(filename2[2])
df3.head(1) 

在这里插入图片描述

# 删除无用特征
def load_xlsx_title(filename):
    df = pd.read_excel(filename)
    unless = ['序号','店铺名称','商品名称','主图链接','商品链接']
    df.drop(columns=unless,inplace=True)
    return df

df3bai = load_xlsx_title(filename2[1])
df3bai.head()

在这里插入图片描述

df3an = load_xlsx_title(filename2[0])
df3an.head()

在这里插入图片描述

df3kl = load_xlsx_title(filename2[2])
df3kl.head()

在这里插入图片描述

bai31 = df3bai.groupby('类目').sum()
bai31

在这里插入图片描述

an31 = df3an.groupby('类目').sum()
an31

在这里插入图片描述

kl31 = df3kl.groupby('类目').sum()
kl31

在这里插入图片描述

#饼图  [0,1,2]
fig,axes = plt.subplots(1,3,figsize=(10,6)) 
ax = axes[0] #第一个拜耳
bai31['销售额'].plot.pie(autopct='%.f',title='拜耳',startangle=30,ax=ax)
ax.set_ylabel('')
ax = axes[1] #第二个安速
an31['30天销售额'].plot.pie(autopct='%.f',title='安速',startangle=60,ax=ax)
ax.set_ylabel('')
ax = axes[2] #第三个科凌虫控
kl31['30天销售额'].plot.pie(autopct='%.f',title='科凌虫控',startangle=90,ax=ax)
ax.set_ylabel('')
plt.show()

在这里插入图片描述
可见拜耳只有一个市场,其他的有不同市场,但主要市场都是灭鼠杀虫剂

竞争分析-品类分布-适用对象

bai32 = df3bai.groupby('使用对象').sum()
bai32

在这里插入图片描述

an32 = df3an.groupby('适用对象').sum()
an32

在这里插入图片描述

kl32 = df3kl.groupby('适用对象').sum()
kl32

在这里插入图片描述

#饼图  [0,1,2]
fig,axes = plt.subplots(1,3,figsize=(10,6)) 
ax = axes[0] #第一个拜耳
bai32['销售额'].plot.pie(autopct='%.f',title='拜耳',startangle=30,ax=ax)
ax.set_ylabel('')
ax = axes[1] #第二个安速
an32['30天销售额'].plot.pie(autopct='%.f',title='安速',startangle=60,ax=ax)
ax.set_ylabel('')
ax = axes[2] #第三个科凌虫控
kl32['30天销售额'].plot.pie(autopct='%.f',title='科凌虫控',startangle=90,ax=ax)
ax.set_ylabel('')
plt.show()

在这里插入图片描述

  • 拜耳的主要对象是蟑螂,而另外两家除此之外还有螨,鼠
  • 而从之前的分析看灭鼠和蟑螂的整体市场份额都大
  • 应该开拓新市场,尤其是灭鼠,也考察其他两家都开拓的螨市场

竞争分析-产品结构-拜耳

  • 使用商品交易数据,每个竞争者分开分析,先分析拜耳的数据
  • 包含五个月的数据,每个商品至多五个月都有,至少有一个月,故需要对商品分类汇总, 如下为分类汇总前五行结果
os.chdir('..')
os.chdir('./商品交易数据')
filename3 = glob.glob('*.xlsx')
filename3 

在这里插入图片描述

拜耳数据:使用商品交易数据,每个竞争者分开分析,先分析拜耳的数据
df4bai = pd.read_excel(filename3[1])
df4bai.head()

在这里插入图片描述

df4bai.info()

在这里插入图片描述

5个月的数据,每个商品最多5个月都在卖,至少有1个月,所以需要对商品分类汇总

df4bai['商品'].value_counts().count()

在这里插入图片描述

#自定义分类汇总函数
def byproduct(df):
    dfb = df.groupby('商品').mean().loc[:,['交易增长幅度']] #交易增长幅度做均值
    dfb['交易金额'] = df.groupby('商品').sum()['交易金额']
    dfb['交易金额占比'] = dfb['交易金额']/dfb['交易金额'].sum()
    dfb['商品个数'] = df.groupby('商品').count()['交易金额'] 
    dfb.reset_index(inplace= True)
    return dfb
bai4 = byproduct(df4bai)
bai4.head()

在这里插入图片描述
其中交易增长幅度可表示市场发展率,交易金额占比可表示市场份额

bai4.describe(percentiles=[0.1,0.9,0.99])

在这里插入图片描述

def block(x):
    qu = x.quantile(.9)
    out = x.mask(x>qu,qu) #当大于90%分位数的进行替换
    return(out)
def block2(df):
    df1 = df.copy()
    df1['交易增长幅度'] = block(df1['交易增长幅度']) #使用盖帽法进行替换交易增长幅度
    df1['交易金额占比'] = block(df1['交易金额占比']) #使用盖帽法进行替换交易增长幅度
    return df1
bai41 = block2(bai4)
bai41.describe(percentiles=[0.1,0.9,0.99])

在这里插入图片描述
交易增长幅度和交易金额占比这两个指标的最大值都远大于3/4分位数,认为是异常值,考虑引入盖帽法,方便作图。

竞争分析-产品结构-拜耳-BCG图

定义波士顿矩阵绘图函数 可以使用均值、中位数来分割(0.33 0.33) 作为波士顿矩阵的切割线。

# mean True  均值
# mean  False  中位数来分割(0.33 0.33)
def plotBOG(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) #索引标注相对于x轴右移
    if mean:
        plt.axvline(df['交易金额占比'].mean())#垂线
        plt.axhline(df['交易增长幅度'].mean())#水平线
    else:
        plt.axvline(df['交易金额占比'].quantile(q1))#垂线
        plt.axhline(df['交易增长幅度'].quantile(q2))#水平线
    plt.show()
        
plotBOG(bai41,mean=True)

在这里插入图片描述

plotBOG(bai41,mean=False)

在这里插入图片描述
我们可以根据实际的业务选择区间的分隔线,由行业经验确定(例如认为增幅0.1在行业里算高,就可以作为分隔线)

从图可以看出:
明星产品和奶牛产品的商品个数普遍比较多。
没有突出的明星产品,但是有快进入明星产品的问题产品。

竞争分析-产品结构-拜耳-明星

查看各个产品结构的产品(除了瘦狗)

各种产品排序,关心点不同,排序依据不同

明星产品:都关心,依什么排序都可以,产品一般不多 奶牛产品:老爆款,关心市场份额,依交易金额占比排序 问题产品,潜力款,关心市场增长率,依交易增长幅度排序。

这里要查看实际数据,故使用盖帽前数据,拜耳明星产品如下:

def extractBOG(df,q1=0.5,q2=0.5,by='交易金额占比'):
    # 明星产品
    star = df.loc[(df['交易金额占比'] >= df['交易金额占比'].quantile(q1))#交易金额大于0.5
          & (df['交易增长幅度'] >= df['交易增长幅度'].quantile(q2)),:] #交易增长幅度大于0.5
    star = star.sort_values(by,ascending=False)
    # 爆款产品
    cow = df.loc[(df['交易金额占比'] >= df['交易金额占比'].quantile(q1))#交易金额大于0.5
          & (df['交易增长幅度'] < df['交易增长幅度'].quantile(q2)),:] #交易增长幅度小于0.5
    cow = cow.sort_values(by,ascending=False)
    # 问题产品
    que = df.loc[(df['交易金额占比'] < df['交易金额占比'].quantile(q1))#交易金额小于0.5
          & (df['交易增长幅度'] >= df['交易增长幅度'].quantile(q2)),:] #交易增长幅度大于0.5
    que = que.sort_values(by,ascending=False)
    
    return star,cow,que

bai4star,bai4cow,bai4que = extractBOG(bai4)

bai4star

在这里插入图片描述
主要是除蟑和杀虫,但是占比不大,增幅一般。

竞争分析-产品结构-拜耳-奶牛

bai4cow

在这里插入图片描述
可见占比最高的是除蟑,灭虫也占一部分,占比一般。

竞争分析-产品结构-拜耳-问题

bai4que

在这里插入图片描述
· 可见大部分仍然是灭蟑和杀虫 · 交易增长幅度最大的是灭鼠,而之前描述过灭鼠有最高的市场份额,可以作为下一步着 力点 · 总结:拜耳大部分产品集中在除蟑上,杀虫也有一定的规模,但是明星产品略乏力,可以 进一步发展问题产品灭鼠为明星产品。
总结:拜耳大部分产品集中在除蟑上,杀虫也有一定的规模,但是明星产品略乏力,可以进一步发展问题产品灭鼠为明星产品。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值