回归分析模型推广_案例分析的意义

回归分析模型推广_案例分析的意义这个项目呢,就不需要我们做很多的数据清洗的工作了,因为我们手里的数据基本已经做好数据清洗了,我们主要需要做的就是数据可视化和文本挖掘工作。下面我们来一一介绍一下。目录1业务背景1.1分析流程概述1.2市场分类1.3产品生命周期1.4产品结构-波士顿矩阵(BCGMatrix)1.5处理项目需求的基本思路1.6项目需求例子1.7项目背景&产品架构1.8数据说明2驱虫市场的潜力分析2.1分析目的&加载数据2.1.1分析目的2.1.2加载数据2.2清洗&补全数

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师。欢迎大家跟我一起走进数据分析的世界,一起学习!

感兴趣的朋友可以关注我或者我的数据分析专栏,里面有许多优质的文章跟大家分享哦。


如果你是一名数据分析师,要让你为你们公司的某类产品寻求市场增长点,你会怎么做呢?

下图是我用xmind整理的一个分析框架:
在这里插入图片描述

本次项目具体内容大家可以从1.1小节的项目背景开始进行了解,而前言这一部分是我这段时间在学习数据分析这一领域知识的过程中慢慢整理总结出来的,有任何错误还请大家不吝赐教。

目录

前言:数据分析思维与业务流程

前言这一部分是我这段时间在学习数据分析这一领域知识的过程中慢慢整理总结出来的,有任何错误还请大家不吝赐教。

分析流程概述

在这里插入图片描述
上图是一些电商平台的数据分析流程,大家可以看下。

其中这个数据采集排期的话中小公司用的比较多一点,而大公司是有自己的灰度发布系统的(已经埋好点了)。

另外,通过建模等分析后输出分析报告之后,也要再和产品经理反复沟通确定结论。

  1. 每个环节都有具体的要求,例如需求文档要求包含:目的、分析思路、预期效果。
  2. 业务部门出问题和需求,以及对算法&数据部门输出报告的理解和应用。

市场分类

评判市场和品牌的发展趋势和增长情况,从宏观到微观,从大市场到细分市场:

  1. 互联网产品由关注用户增量到用户存量,判断产品或市场是用户增量还是存量,只需要判断有新的需求出现即可:
     ○ 增量市场(又叫蓝海市场):从无到有,以前关注哪些需求没有被满足,快速迭代抢占市场,考虑最多的不是用户体验。
      流量=新增客户。例如:智能手机潮开始时的市场,小米面对的是增量。
     ○ 存量市场(又叫红海市场):从有到优,现在关注如何更好的满足需求,考虑更多的是用户体验(如拼多多就是从红海市场杀出来的)。
      产品价值=新体验-旧体验-替换成本,新体验没有突破性大幅增加,产品价值很难实现。
      流量=用户时间(停留时间越久,利益价值越大)。
      例如:现在人手一台智能手机,小米面对存量市场,如何让需要换手机的用户换成小米,从有到优。
  2. 创新:想要用产品价值撬动一个用户,同纬度竞争别家的先发优势门槛太高,如果别家体量很大,基本可以放弃。
    创新可能就是剩下的活路,而面对互联网的高速发展,线下需求基本都被互联网化,切入点可能就转移到细分市场。
    例如:微信QQ是社交领域的霸主,陌陌探探在陌生人社交上也分了一杯羹,这些已存在的需求,没有被充分实现,也算增量市场。

产品生命周期

在这里插入图片描述
● 客户生命周期
在这里插入图片描述

  • 初级信用评分(京东的白条、支付宝的花呗)、客户价值预测可以用分类算法去实现(像大家常遇到的大数据杀熟这种情况,就是基于分类的结果——富人卖贵,穷人卖的便宜点,两头赚)
  • 客户细分可以用聚类算法实现,交叉销售可以用关联规则,产品精准营销可以考虑用户画像(分类),行为信用评分也可以用分类方法实现,欺诈侦测(比方说防止你恶意薅羊毛)可以用异常值分析;
  • 客户关系网、流失客户时间判断、流失客户类型判断这些也可以用分类算法实现(流失客户时间判断这里会涉及时间序列)

这里大家也可以发现,这里很多的业务都是可以用分类的算法来实现的。

产品结构-波士顿矩阵(BCG Matrix)

在这里插入图片描述
我们来看下上图的波士顿矩阵。

这里的相对市场份额我们可以理解为销售额。

我们可以把产品都分成四种类型:问题类(成长期)、明星类(成熟期)、奶牛类(稳定期)、瘦狗类(衰退期)。

我们拿到产品的数据后我们就可以判断产品是属于哪一类的,判断是不是有提升空间。

像腾讯旗下的手游王者荣耀就属于奶牛类产品,当它想要一些稳定的现金流的话,就可以出个活动,相当于挤挤奶,这就是奶牛类产品。

处理项目需求的基本思路

这里我们简单了解一下就可以了。

  1. 了解项目公司的背景和对接人员情况。
     ○ 公司的产品结构,市场环境,对接人的角色和权利等级等。
  2. 沟通明确实际的项目需求。
     ○ 团队内部理解项目需求。
     ○ 和业务方沟通需求:从业务的角度理解需求可能的解决方案。
     ○ 优化项目需求。
     ○ 和业务核对项目需求。
  3. 根据项目需求梳理分析思路:每一步分析的目标,需要的数据支持,反复优化。
  4. 确定分析工具和人员配置,进行数据分析。
  5. 撰写分析结论和方案

项目需求例子

问题:销售额下降,怎么办?

这个问题其实很大,比方说电商类的产品方法有:优化老客户、扩大流量、提高转化率等等。这种问题也是需要我们一步步来拆分的。具体操作可以如下:

  1. 了解涉及项目相关的所有的业务部门的需求,逻辑,问题点
  2. 拆分:销售额 = 流量 * 转化率 * 客单价
  3. 待沟通部门:营销部门(活动),推广部门(流量),客服,售后,供应链
    ○ 营销:精准营销(找到高价值客户),客户行为分析(响应效果),组合营销(购物篮)
    ○ 推广:竞价排名,买广告位,点击付费(需要很强的经验)
    ○ 退款和评论分析:优化产品,优化服务质量
  4. 沟通之前出想法,沟通之后优化,确认项目需求。
  5. 数据收集:确认每一步需求的数据(可能用到爬虫)。

像上面提到的流量,还可以接着细分成站内流量和站外流量,而站内流量还可以分成全部流量和每个商品流量(详情页的访问),我们需要不断的拆分问题,直至不能拆分为止。

1 业务背景

那下面我们开始正式介绍我们此次项目的背景啦。

1.1 项目背景&产品架构

接着我介绍一下本次项目的背景与其产品架构。

  1. 客户介绍: 拜耳官方旗舰店(拜耳公司,总部位于德国的勒沃库森,在六大洲的200个地点建有750家生产厂;拥有120,000名员工及350家分支机构,几乎遍布世界各国。高分子医药保健,化工以及农业是公司的四大支柱产业.公司的产品种类超过10000种)。
  2. 客户需求:寻求市场增长点。
  3. 产品架构:
    在这里插入图片描述
    其实上图也有体现出拆分问题的思想,我们可以把中间这个看成一级市场,左右这7个市场看成二级市场,右下角的可以看出三级市场。

1.2 数据说明

在这里插入图片描述

本次项目已有的数据十分齐全。

2 驱虫市场的潜力分析

老规矩,先导包,设置一下中文编码。

import glob #读文件
import os   #设置工作路径
import pandas as pd
import re #正则表达式
import numpy as np
import datetime as dt #时间包
from sklearn.linear_model import LinearRegression
import seaborn as sns
from matplotlib import pyplot as plt
import jieba  #分词
import jieba.analyse
import imageio #配合做词云的
from wordcloud import WordCloud #词云

# 中文编码
plt.rcParams['font.sans-serif']='simhei'
plt.rcParams['axes.unicode_minus']=False

sns.set_style("darkgrid",{ 
   "font.sans-serif":['simhei','Droid Sans Fallback']})
os.chdir('E:\Data-analysis-project\电商文本挖掘\data/') # 工作路径
os.chdir('./驱虫剂市场')

2.1 分析目的&加载数据

2.1.1 分析目的

  1. 分析目的:针对各个子类目市场近三年的交易额数据,以及top100品牌数据(2017年11月到2018年10月),通过描述性分析,在年变化的维度上:
     ○ 分析整个市场的总体趋势
     ○ 分析各子类目市场占比及变化趋势
     ○ 分析市场集中度,即是否存在垄断
  2. 分析过程:
     ○ 读取各子类目市场近三年交易额数据
     ○ 依时间汇总成各子类目在时间线上的交易金额数据

2.1.2 加载数据

  • 读取各子类交易额数据并合并
filenames = glob.glob('*市场近三年交易额.xlsx')

filenames

输出结果:

['灭鼠杀虫剂市场近三年交易额.xlsx',
 '电蚊香套装市场近三年交易额.xlsx',
 '盘香灭蟑香蚊香盘市场近三年交易额.xlsx',
 '蚊香加热器市场近三年交易额.xlsx',
 '蚊香液市场近三年交易额.xlsx',
 '蚊香片市场近三年交易额.xlsx',
 '防霉防蛀片市场近三年交易额.xlsx']
  • 自定义函数读取单个xlsx文件:提取文件名,作为列名,修改时间格式
re.search(r'.*(?=市场)',"盘香灭蟑香蚊香盘市场近三年交易额.xlsx",).group()  # 匹配市场之前的wenb

‘盘香灭蟑香蚊香盘’

def load_xlsx(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_xlsx(i) for i in filenames]
df = pd.concat(dfs,axis=1).reset_index()  # 拼接一下数据
df.head()

在这里插入图片描述

2.2 清洗&补全数据

  1. 由于其中的时间列是从2015年11月到2018年10月,而我们需要的是2016-2018年每月完整的数据(方便从年变化的角度分析产品)
  2. 这里我们假设:
     ○ 每年各月之间没有明显规律的周期性变化(近似认为月和月之间的相关性不大)
     ○ 每年对应月份的数据是线性变化的(一是因为数据少,二是认为随着年份的增长,交易额在大环境下是稳步变化的)
  3. 故这里我们可以简单的用线性回归预测
    即对于每个子类目市场,用15、16、17年的11/12月销售金额预测18年的对应月份

抽取月份方便建模索引:

month = df['时间'].dt.month
month

输出结果如下:

0     10
1      9
2      8
3      7
4      6
5      5
6      4
7      3
8      2
9      1
10    12
11    11
12    10
13     9
14     8
15     7
16     6
17     5
18     4
19     3
20     2
21     1
22    12
23    11
24    10
25     9
26     8
27     7
28     6
29     5
30     4
31     3
32     2
33     1
34    12
35    11
Name: 时间, dtype: int64
  • 循环预测2018年11月和12月的销售额
for i in [11,12]:
    # 抽取对月份的数据
    dm = df[month == i]   #2015.11 2016.11 2017.11 
    # 训练x是年份
    xtrain = np.array(dm['时间'].dt.year).reshape(-1,1)
    # 测试y是新增的行,对应的日期
    ytest = [pd.datetime(2018,i,1)]
    for j in range(1,len(dm.columns)):
        # 训练y是指定的列
        ytrain = np.array(dm.iloc[:,j]).reshape(-1,1)
        # 回归建模
        lm = LinearRegression().fit(xtrain,ytrain)
        # 预测当测试x为2018时销售额 yhat
        yhat = lm.predict(np.array([2018]).reshape(-1,1))
        ytest.append(round(yhat[0][0],2))
    #给预测结果赋值对应的列名
    newrow = pd.DataFrame([dict(zip(df.columns,ytest))])
    #预测结果行加在数据前,所以说用newrow来append,不是df来append
    df = newrow.append(df)

df.head()

在这里插入图片描述

  • 去掉原始索引
df.reset_index(drop=True,inplace=True)  
# 上图中的索引是0 0 1 ,用drop=True去掉,而inplace=True的作用是不创建新的对象,直接对原始对象进行修改;
  • 去掉15年的数据
df = df[df['时间'].dt.year != 2015]
df.tail()

在这里插入图片描述

接下来我们可以进行以下操作:

  1. 分析整个市场的总体趋势
  2. 分析各子类市场销售额占比及变化趋势
  3. 分析市场集中度,是否存在垄断

2.3 市场变化趋势描述

  • 每行所有市场的交易金额总和生成新列
  • 抽取年份生成新列
df['colsums'] = df.sum(1) #交易金额总和列
df.head()

在这里插入图片描述

df.insert(1,'year',df['时间'].dt.year) #年份列

df.head()

在这里插入图片描述

byyear = df.groupby('year').sum().reset_index()

byyear

在这里插入图片描述

sns.relplot('year','colsums',kind='line',marker='o',data=byyear,height=4)
plt.title('近三年的市场趋势')
plt.xticks(byyear.year,rotation=45)  # rotation是旋转角度
plt.xlabel('年份')
plt.ylabel('总交易额')
plt.show()

在这里插入图片描述

可以看出:近三年呈增长趋势,整个市场倾向于成长期和成熟期。

2.4 各市场变化趋势

查看各类目市场三年内销售额总和的变化趋势:

# 图形大小
f,ax = plt.subplots(figsize=(10,6))  # f代表整个图像,ax代表坐标轴和画的图,保存图像时需要用到fig
#dashes=False 不区分线型
sns.lineplot(data=byyear.set_index('year').iloc[:,:-1],dashes=False,marker='^')
plt.title('近三年各类市场销售趋势')
plt.xticks(byyear.year,rotation=45)
#在指定位置加文本
for a,b in zip(byyear.year,byyear['灭鼠杀虫剂']):
    plt.text(a,b,'%.3e'% b, ha='center',va='bottom',size=12)

plt.xlabel('年份')
plt.ylabel('总交易额')
plt.show()

在这里插入图片描述

直观的看灭鼠杀虫剂和蚊香液都有较大的机会。

  • 查看灭鼠杀虫剂近三年的增长趋势
g = sns.FacetGrid(byyear,height=5)
g.map(sns.barplot,'year','灭鼠杀虫剂',color='wheat')
g.map(sns.pointplot,'year','灭鼠杀虫剂')

for a,b in zip(range(len(byyear)),byyear['灭鼠杀虫剂']):
    plt.text(a,b,'%.3e'% b, ha='center',va='bottom',size=12)

plt.xlabel('年份')
plt.ylabel('灭鼠杀虫剂近三年的增长趋势')
plt.xticks(rotation=45)
plt.show()

在这里插入图片描述

2.5 各市场占比

查看各类目市场三年内销售额总和的占比:

#计算每年每个子市场的比例
byyear_per = byyear.iloc[:,1:-1].div(byyear.colsums,axis=0)
byyear_per.index = byyear.year
byyear_per

在这里插入图片描述

#stacked=True 
byyear_per.plot(kind='bar',stacked=True,figsize=(10,8),colormap='tab10')

for a,b in zip(range(len(byyear_per)),byyear_per['灭鼠杀虫剂']):
    plt.text(a,b/2,f'{ 
     b*100:.2f}%', ha='center',va='bottom',size=12,color='white')


plt.xlabel('年份')
plt.ylabel('总交易额占比')
plt.title('近三年各子类市场销量占比')
plt.show()

在这里插入图片描述

可见灭鼠杀虫剂和蚊香液可进一步扩展,就需要与甲方业务人员进一步沟通。

这里我们假设沟通后我们重点关注的是灭鼠杀虫剂。

2.6 各市场年增幅

byyear

在这里插入图片描述

#拿到中间7列
byyear0 = byyear.iloc[:,1:-1] 
byyear0.diff()#一阶差分 17-16 18-17 

在这里插入图片描述

#计算年增幅
byyear0 = byyear.iloc[:,1:-1] 
byyear_diff = byyear0.diff().iloc[1:,:].reset_index(drop=True)/byyear0.iloc[:2,:]
byyear_diff.index = ['16-17','17-18']
byyear_diff

在这里插入图片描述

#作图查看
f,ax = plt.subplots(figsize=(10,8))
sns.lineplot(data=byyear_diff,dashes=False)
plt.title('近三年各子类市场销量年增幅')

plt.xlabel('年份')
plt.ylabel('总交易额年增幅')
plt.show()

在这里插入图片描述

可见除了灭鼠杀虫剂和蚊香液增幅比较稳定,其它都有下降甚至变负。

2.7 市场集中度描述(垄断)

这里我们先介绍一下什么是垄断,以及常见的评估指标有哪些:

  1. 垄断程度,或者说市场势力的重要量化指标是行业集中度。
  2. 常见的指标有行业集中率:CRn指数,赫芬达尔指数(Herfindahl-Hirschman Index,缩写HHI)。
  3. 公式: H = ∑ i = 1 N s i 2 ) i H=\sum^N_{i=1}s^2_i)i H=i=1Nsi2i(有些地方s前乘100或结果乘10000),N:公司数量;第i个公司的市场份额。
    例子:六家最大的公司市场上生产90%的商品,剩余的10%由10个规模相等的生产者分配,六家公司中,最大的公司生产80%,其余各2%。 H H I = 0. 8 2 + 5 ∗ 0.0 2 2 + 10 ∗ 0.0 1 2 = 0.643 ( 64.2 HHI=0.8^2+5*0.02^2+10*0.01^2=0.643(64.2%) HHI=0.82+50.022+100.012=0.643(64.2
  4. 指数范围从1/N到1,指数的导数表示该行业中“等效”的公司数量,上例的市场结构等同于拥有1.55521加相同规模的公司。
    范围:[1/N,‘高度竞争行业’,0.01],(0.01,‘不集中的行业’,0.15],(0.15,‘中等集中’,0.25], (0.25,‘高度集中’,1]
  5. HHI的局限性:
     ○ 行业细分:由于产品分类细化,类间差异大,销售量数据就不一定能准确判断行业集中度。(例如某个大行业中各大公司市场份额相同,但业务不同,仍可能造成垄断)。
     ○ 地理范围:从总的市场份额来看占比一致,但是各个公司可能在当地造成垄断。
     ○ 长尾现象:无限小众市场抗衡大市场(看具体行业)。
  6. 分析流程:使用top100品牌数据,通过交易指数反映销售额从而得到市场占有率,描述各品牌市场份额,计算HHI指标。

那接下来我们就来实现一下。

df1 = pd.read_excel('top100品牌数据.xlsx')
df1.isna().mean()

输出结果如下:

品牌        0.0
行业排名      0.0
交易指数      0.0
交易增长幅度    0.0
支付转化指数    0.0
操作        0.0
dtype: float64
df1.head()

在这里插入图片描述

df1.describe(include='all')

在这里插入图片描述

  • 生成交易指数占比,用来描述市场份额
df1['交易指数占比'] = df1['交易指数']/df1['交易指数'].sum()

df1['交易指数占比']

输出结果如下:

0     0.035998
1     0.032237
2     0.027311
3     0.024488
4     0.023530
        ...   
95    0.004603
96    0.004492
97    0.004465
98    0.004447
99    0.004425
Name: 交易指数占比, Length: 100, dtype: float64
df1.plot(x='品牌',y='交易指数占比',kind='bar',figsize=(15,5))
plt.show()

在这里插入图片描述

## HHI
HHI = sum(df1['交易指数占比']**2)
HHI

0.013546334007208914

计算得到:驱虫市场HHI指数:0.013546(或135.46),等效公司数:73.82。

2.8 市场的潜力分析-结论

os.chdir('..')#返回到上一级目录
os.chdir('./灭鼠杀虫剂细分市场')#进入灭鼠杀虫剂细分市场文件夹

2.8.1 加载数据&清洗数据

filename1 = glob.glob('*.xlsx')
dfs1 = [pd.read_excel(i) for i in filename1]
df2 = pd.concat(dfs1,sort=False)
df2.info()

输出结果如下:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 6556 entries, 0 to 1742
Columns: 229 entries, 类别 to 产品名
dtypes: float64(129), int64(5), object(95)
memory usage: 11.7+ MB
#查看缺失值
df2.isna().mean()

输出结果如下:

类别      0.0
时间      0.0
页码      0.0
排名      0.0
链接      0.0
       ... 
宝贝成份    1.0
规格:     1.0
樟脑      1.0
包装      1.0
产品名     1.0
Length: 229, dtype: float64
  • 如果一个特征缺失值占比超过98% 从整个数据角度来讲没有意义则删除
ind1 = df2.isna().mean()> 0.98
sum(ind1)

191

df20 = df2.loc[:,~ind1] #删除缺失值> 0.98的
df20.isna().mean()

输出结果如下:

类别              0.000000
时间              0.000000
页码              0.000000
排名              0.000000
链接              0.000000
主图链接            0.000000
主图视频链接          0.746797
宝贝标题            0.000000
宝贝ID            0.000000
销量(人数)          0.000000
售价              0.000000
预估销售额           0.005491
运费              0.000000
评价人数            0.022880
收藏人数            0.000000
下架时间            0.000000
类目              0.000000
地域              0.406955
旺旺              0.000000
店铺类型            0.000000
品牌              0.095333
型号              0.423276
净含量             0.421599
适用对象            0.279896
物理形态            0.286303
药品登记号           0.927090
产品名称            0.796980
农药登记证号          0.873093
生产企业            0.888957
农药生产许可证/批准文号    0.889262
农药产品标准证号        0.889262
农药名称            0.889262
剂型              0.882093
农药成分            0.885754
有效成分总含量         0.889262
毒性              0.873093
防治对象            0.889262
农药类型            0.973612
dtype: float64
  • 特征值完全一致的进行删除
ind2 = np.array([len(df20[i].unique()) == 1 for i in df20.columns])
df21 = df20.loc[:,~ind2]
df21.isna().mean()

输出结果如下:

类别              0.000000
时间              0.000000
页码              0.000000
排名              0.000000
链接              0.000000
主图链接            0.000000
主图视频链接          0.746797
宝贝标题            0.000000
宝贝ID            0.000000
销量(人数)          0.000000
售价              0.000000
预估销售额           0.005491
运费              0.000000
评价人数            0.022880
收藏人数            0.000000
下架时间            0.000000
地域              0.406955
旺旺              0.000000
店铺类型            0.000000
品牌              0.095333
型号              0.423276
净含量             0.421599
适用对象            0.279896
物理形态            0.286303
药品登记号           0.927090
产品名称            0.796980
农药登记证号          0.873093
生产企业            0.888957
农药生产许可证/批准文号    0.889262
农药产品标准证号        0.889262
农药名称            0.889262
剂型              0.882093
农药成分            0.885754
有效成分总含量         0.889262
毒性              0.873093
防治对象            0.889262
农药类型            0.973612
dtype: float64
#删除药品登记号 之后的属性 
ind3 = df21.columns.get_loc('药品登记号')
df22 = df21.iloc[:,:ind3]

df22.isna().mean()

输出结果如下:

类别        0.000000
时间        0.000000
页码        0.000000
排名        0.000000
链接        0.000000
主图链接      0.000000
主图视频链接    0.746797
宝贝标题      0.000000
宝贝ID      0.000000
销量(人数)    0.000000
售价        0.000000
预估销售额     0.005491
运费        0.000000
评价人数      0.022880
收藏人数      0.000000
下架时间      0.000000
地域        0.406955
旺旺        0.000000
店铺类型      0.000000
品牌        0.095333
型号        0.423276
净含量       0.421599
适用对象      0.279896
物理形态      0.286303
dtype: float64
unless = ["时间","链接","主图链接","主图视频链接","宝贝标题","运费" ,"下架时间","旺旺"  ,"页码","排名"]
unless

[‘时间’, ‘链接’, ‘主图链接’, ‘主图视频链接’, ‘宝贝标题’, ‘运费’, ‘下架时间’, ‘旺旺’, ‘页码’, ‘排名’]

df23 = df22.drop(columns=unless)

df23.isna().mean()

输出结果如下:

类别        0.000000
宝贝ID      0.000000
销量(人数)    0.000000
售价        0.000000
预估销售额     0.005491
评价人数      0.022880
收藏人数      0.000000
地域        0.406955
店铺类型      0.000000
品牌        0.095333
型号        0.423276
净含量       0.421599
适用对象      0.279896
物理形态      0.286303
dtype: float64
df23.dtypes

输出结果如下:

类别         object
宝贝ID        int64
销量(人数)      int64
售价        float64
预估销售额     float64
评价人数      float64
收藏人数        int64
地域         object
店铺类型       object
品牌         object
型号         object
净含量        object
适用对象       object
物理形态       object
dtype: object
df23 = df23.astype({ 
   '宝贝ID':'object'}) #将宝贝ID转成object
df23.reset_index(drop=True,inplace=True)
df23.describe()

在这里插入图片描述

df23.head()

在这里插入图片描述

2.8.2 结论

通过上述内容,我们可以得到以下结论:

  1. 整体驱虫市场处于快速增长阶段,趋向于成长期到成熟期;
  2. 灭鼠杀虫剂市场份额较大(大于60%),约是第二名蚊香液的二倍,市场增长率接近40%,可以认为是明星产品类目,需要持续投资和重点关注;
  3. 驱虫市场不存在垄断,结构不集中,竞争相对激烈,即没有明显的来自大公司的压力。

3 市场机会点

3.1 业务逻辑

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

3.2 产品类别

  1. 使用灭鼠杀虫剂细分市场数据(截止到2018年11月22日30天的交易数据):
     ○ 读取五个文件并且合并
     ○ 清洗:去掉大量缺失值的列,去掉单一值的列,去掉逻辑上不可用的列,如:“时间”,“链接”,“主图链接”,“主图视频链接”,“页码”,“排名”,“宝贝标题”,“运费”,“下架时间”,“旺旺” 。
  2. 查看各产品’类别’总的’预估销售额’的分布,以此表示市场分布情况。
byclass = df23['预估销售额'].groupby(df23['类别']).sum()

byclass
类别
杀虫     8207628.10
灭鼠    25686011.99
虱      4512886.01
螨     10886752.88
蟑螂    18037223.68
Name: 预估销售额, dtype: float64
byclass.plot.barh()

在这里插入图片描述

byclass.plot.pie(autopct='%.2f')

在这里插入图片描述

import plotly.graph_objects as go #交互图形 类似于PowerBI

fig = go.Figure(data=[go.Pie(labels=byclass.index,values=byclass.values)])
fig.show()

在这里插入图片描述

  1. 可以看出重点需要研究的市场是灭鼠和蟑螂,这里我们选择灭鼠

3.3 类别分析

  1. 选择灭鼠数据进一步分析–>依据’售价’进行价格划分,得到若干的价格区间。
df24 = df23[df23['类别']== '灭鼠']
df24

在这里插入图片描述

df24['售价'].describe() 

输出结果如下:

count    1523.000000
mean       49.018910
std        69.762057
min         0.010000
25%        15.800000
50%        27.700000
75%        52.600000
max       498.000000
Name: 售价, dtype: float64
df24['售价'].plot.hist()

在这里插入图片描述

#自定义分箱 销售额 将连续型变量转成分类型变量
bins = [0,50,100,150,200,250,300,500] #分界线
labels = ['0_50','50_100','100_150','150_200','200_250','250_300','300_500']#箱子的标题
#pd.cut (0,50] ---> [0,50]
df24['价格区间'] = pd.cut(df24['售价'],bins,labels=labels,include_lowest=True)
df24['价格区间'].value_counts()

输出结果如下:

0_50       1138
50_100      242
100_150      62
150_200      35
300_500      28
250_300       9
200_250       9
Name: 价格区间, dtype: int64
df24

在这里插入图片描述

  1. 每个价格区间计算:预估销售额(总和),销售额占比,宝贝数(不同’宝贝ID’数),宝贝数占比,单宝贝平均销售额(不同宝贝的平均预估销售额,可以理解为竞争的反面,单宝贝平 均销售额越高,竞争越低,单宝贝销售额高才有的分),相对竞争度(由前一项套入线性变换 得到0表示类目中最小竞争,1表示最大)。
#分类的依据----价格区间
by = '价格区间'
df = df24
#根据价格区间求和
df.groupby(by).sum()

在这里插入图片描述

#把预估销售额列抽出来
byc = pd.DataFrame(df.groupby(by).sum().loc[:,['预估销售额']])

byc

在这里插入图片描述

#销售额占比、宝贝数、宝贝数的占比、单个宝贝的平均销售额
byc['销售额占比'] = byc['预估销售额'] / byc['预估销售额'].sum()
byc['宝贝数'] = df.groupby(by).nunique()['宝贝ID']
byc['宝贝数占比'] = byc['宝贝数'] / byc['宝贝数'].sum()
byc['单宝贝平均销售额'] =  byc['预估销售额']/byc['宝贝数']

byc

在这里插入图片描述

  • 竞争度(单宝贝平均销售额的反面)
  • 单宝贝平均销售额越大,竞争越低,越小,竞争越大。
byc['相对竞争度'] = 1- (byc['单宝贝平均销售额']-byc['单宝贝平均销售额'].min())/(
                        byc['单宝贝平均销售额'].max()-byc['单宝贝平均销售额'].min())

byc

在这里插入图片描述

# 自定义函数 
def byfun(df,by,sort='单宝贝平均销售额'):
    byc = pd.DataFrame(df.groupby(by).sum().loc[:,['预估销售额']])
    #销售额占比、宝贝数、宝贝数的占比、单个宝贝的平均销售额
    byc['销售额占比'] = byc['预估销售额'] / byc['预估销售额'].sum()
    byc['宝贝数'] = df.groupby(by).nunique()['宝贝ID']
    byc['宝贝数占比'] = byc['宝贝数'] / byc['宝贝数'].sum()
    byc['单宝贝平均销售额'] =  byc['预估销售额']/byc['宝贝数']
    byc['相对竞争度'] = 1- (byc['单宝贝平均销售额']-byc['单宝贝平均销售额'].min())/(
                        byc['单宝贝平均销售额'].max()-byc['单宝贝平均销售额'].min())
    if sort:
        byc.sort_values(sort,ascending=False,inplace=True)
    return byc
byprices = byfun(df24,'价格区间')
byprices

在这里插入图片描述

def mcplot(bydf,figsize=(10,4)):
    ax = bydf.plot(y='相对竞争度',linestyle='-',marker='o',figsize=figsize)
    bydf.plot(y='销售额占比',kind='bar',alpha=0.8,color='wheat',ax=ax)
    plt.show() 
mcplot(byprices)

在这里插入图片描述

结果依单宝贝销售额降序,即依竞争度升序,这里销售额占比可以理解为市场份额。

可见0-50容量大,竞争大,大容量市场(对比的是50-100,容量小,竞争稍小)

200-250,竞争小,做高价市场的优先选择,属于机会点。

可见我们喜欢的类目是:市场份额高(表示更适合大众),相对竞争度低(没人抢)。也就是找到闷声发大财的那些个分类去分蛋糕。

3.4 0_50-细分价格市场

  • 这里我们选择容量最大的0-50细分市场进一步分析
df25 = df24[df24['价格区间']=='0_50']

df25['售价'].plot.hist()

在这里插入图片描述

  • 再一次细分得到新的更小的价格区间,计算每个区间的指标
#自定义分箱 销售额 将连续型变量转成分类型变量
bins_01 = [0,10,20,30,40,50] #分界线
labels_01 = ['0_10','10_20','20_30','30_40','40_25']#箱子的标题
#pd.cut (0,50] ---> [0,50]
df25['价格子区间'] = pd.cut(df25['售价'],bins_01,labels=labels_01,include_lowest=True)
byprices_01 = byfun(df25,'价格子区间')
byprices_01

在这里插入图片描述

mcplot(byprices_01)

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

200-250细分市场也是同样的分析思路。

3.5 其他属性分析

df25.head()

在这里插入图片描述

  • 店铺类型
bystore = byfun(df25,'店铺类型')
bystore

在这里插入图片描述

mcplot(bystore)

在这里插入图片描述
可见天猫各个方面都优于淘宝。

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

在这里插入图片描述

mcplot(bytype1)

在这里插入图片描述

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

  • 物理形态
byshape = byfun(df25,'物理形态')
byshape

在这里插入图片描述

mcplot(byshape)

在这里插入图片描述

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

3.6 市场机会点-结论

通过上述分析我们可以得出以下结论:

  1. 灭鼠杀虫剂市场中,需要重点关注的产品类别是:灭鼠和蟑螂;
  2. 灭鼠中:
     ○ 最大的市场集中在0-50的价格段,这个价格段竞争也很激烈;
     ○ 200-250这个价格段市场份额占10%左右,竞争度很低,是值得挖掘的高价市场.
  3. 灭鼠0-50价格段的产品市场中:
     ○ 10-20价格段市场容量大,竞争度低,值得进一步开发,20-30也不错;
     ○ 店铺类型方面天猫明显优于淘宝;
     ○ 市场份额高的型号是粘鼠板,然而型号0005市场份额还行,竞争度较低,值得开发;
     ○ 产品的物理形态基本都是固体,也是被大众认可的形态;
     ○ 当物理形态为固体,净含量为1时,市场份额高竞争度低,值得开发。

4 竞争分析

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

4.1 分析流程

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

4.2 品类分布-产品类别

使用商品销售数据分析各家的产品类别的分布:

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

filename2 

[‘安速家居近30天销售数据.xlsx’, ‘拜耳近30天销售数据.xlsx’, ‘科凌虫控旗舰店近30天销售数据.xlsx’]

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()

在这里插入图片描述

可见拜耳只有一个市场,其他的有不同市场,但主要市场都是灭鼠杀虫剂。

4.3 品类分布-适用对象

分析各家的适用对象的分布:

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()

在这里插入图片描述

拜耳的主要对象是蟑螂,而另外两家除此之外还有螨,鼠;

而从之前的分析看灭鼠和蟑螂的整体市场份额都大;应该开拓新市场,尤其是灭鼠,也考察其他两家都开拓的螨市场。

4.4 产品结构分析-拜耳

os.chdir('..')
os.chdir('./商品交易数据')
filename3 = glob.glob('*.xlsx')

filename3 

[‘安速全店商品交易数据.xlsx’, ‘拜耳全店商品交易数据.xlsx’, ‘科凌虫控全店商品交易数据.xlsx’]

4.4.1 拜耳数据

使用商品交易数据,每个竞争者分开分析,先分析拜耳的数据。

df4bai = pd.read_excel(filename3[1])
df4bai.head()

在这里插入图片描述

df4bai.info()

输出结果如下:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 142 entries, 0 to 141
Data columns (total 9 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   品牌      142 non-null    object        
 1   时间      142 non-null    datetime64[ns]
 2   商品      142 non-null    object        
 3   行业排名    142 non-null    int64         
 4   交易指数    142 non-null    int64         
 5   交易增长幅度  142 non-null    float64       
 6   支付转化指数  142 non-null    int64         
 7   操作      142 non-null    object        
 8   交易金额    142 non-null    float64       
dtypes: datetime64[ns](1), float64(2), int64(3), object(3)
memory usage: 10.1+ KB
  • 5个月的数据,每个商品最多5个月都在卖,至少有1个月,所以需要对商品分类汇总
df4bai['商品'].value_counts().count()

44

#自定义分类汇总函数
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分位数,认为是异常值,考虑引入盖帽法,方便作图。

4.4.2 产品结构-拜耳-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)

在这里插入图片描述

点的大小为商品个数,以中位数作为波士顿矩阵的分隔线,拜耳的BOG图如下:

plotBOG(bai41,mean=False)

在这里插入图片描述

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

从图可以看出:明星产品和奶牛产品的商品个数普遍比较多。

没有突出的明星产品,但是有快进入明星产品的问题产品。

4.4.3 产品结构-拜耳-明星

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

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

  • 明星产品:都关心,依什么排序都可以,产品一般不多
  • 奶牛产品:老爆款,关心市场份额,依交易金额占比排序

问题产品,潜力款,关心市场增长率,依交易增长幅度排序。

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

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

在这里插入图片描述

主要是除蟑和杀虫,但是占比不大,增幅一般。

4.4.4 产品结构-拜耳-奶牛

bai4cow

在这里插入图片描述

可见占比最高的是除蟑,灭虫也占一部分,占比一般。

4.4.5 产品结构-拜耳-问题

在这里插入图片描述
可见大部分仍然是灭蟑和杀虫。

交易增长幅度最大的是灭鼠,而之前描述过灭鼠有最高的市场份额,可以作为下一步着力点。

4.4.6 总结

总结:拜耳大部分产品集中在除蟑上,杀虫也有一定的规模,但是明星产品略乏力,可以进一步发展问题产品灭鼠为明星产品。

4.5 产品结构分析-安速

4.5.1 安速数据

df4an = pd.read_excel(filename3[0])
df4an.head()

在这里插入图片描述

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

49

an4 = byproduct(df4an)

an4.head()

在这里插入图片描述

an4.describe()

在这里插入图片描述

an41 = block2(an4)
an41.describe(percentiles=[0.1,0.9,0.99])

在这里插入图片描述

4.5.2 产品结构-安速-BCG图

分析方法和之前一致,故直接看图和产品:

plotBOG(an41)

在这里插入图片描述

可见奶牛产品足,明星产品部分有前途,问题产品部分有潜力,瘦狗产品不多。

4.5.3 产品结构-安速-明星

anstar,ancow,anque = extractBOG(an4)

anstar

在这里插入图片描述

杀虫和除蟑表现都不错。

4.5.4 产品结构-安速-奶牛

ancow.head()

在这里插入图片描述

主要是除蟑,和拜耳产生竞争。

4.5.5 产品结构-安速-问题

anque.head()

在这里插入图片描述

前几款是灭蟑,除螨,杀虫,都有发展空间。

4.5.6 总结

安速没有明显的灭鼠市场;拜耳和安速比较:拜耳杀虫是老爆款,灭蟑存在一定竞争。

4.6 产品结构分析-科凌虫控

4.6.1 科凌虫控数据

df4ke = pd.read_excel(filename3[2])
df4ke.head()

在这里插入图片描述

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

31

ke4 = byproduct(df4ke)

ke4.head()

在这里插入图片描述

ke4.describe()

在这里插入图片描述

ke41 = block2(ke4)
ke41.describe(percentiles=[0.1,0.9,0.99])

在这里插入图片描述

4.6.2 产品结构-科凌虫控-BCG图

plotBOG(ke41)

在这里插入图片描述

可见奶牛产品足,明星产品少,大部分竞争力强,问题产品部分有潜力,瘦狗产品少。

4.6.3 产品结构-科凌虫控-明星

kestar,kecow,keque = extractBOG(ke4)

kestar

在这里插入图片描述
主要是灭鼠,除螨和杀虫。

4.6.4 产品结构-科凌虫控-奶牛

kecow.head()

在这里插入图片描述

主要是除蟑,有很小部分灭虫和灭鼠。

4.6.5 产品结构-科凌虫控-问题

keque.head()

在这里插入图片描述

有较大潜力的是除螨。

4.6.6 总结

科凌虫控积极发展多个产品,然而每个产品结构相对独立(奶牛除蟑,明星灭鼠,潜力除螨),没有后续的支持,竞争力不是那么强。

4.7 流量结构-业务逻辑

4.7.1 概述

  1. 目前的流量主要由三大块构成:免费流量,付费流量和自主访问。
     ○ 一般的店铺占比分别是50-60%,30%,10-15%
     ○ 免费流量中,搜索流量占60%,即搜索流量只占总流量的30%-40%
  2. 付费流量没有特定的比例,合理的值是一般不超过40%(正常销售时期),如果此类目利润率高竞争激烈,占比80%也有可能。
  3. 看店铺付费流量比例是否健康,应该看广告费用在全店销售额的占比。一般控制在10%左右。(同样的广告费用占比,降低CPC(点击成本),付费流量占比会上升)。
  4. 付费流量带动免费流量的前提:
    1)引来的流量是否适合你的店铺和宝贝。
    2)引流量要达到一定的数量。
    3)宝贝适合市场。
  5. 增加免费流量:一般是以小爆款带动,而这个时代小爆款层出不穷,一般建议主推两三个宝贝,辅推三五个宝贝,合理安排推广预算占比。
  6. 好的流量结构:
    1)合理的产品结构。
    2)宝贝标题(搜索流量的入口)的关键词布局。
    3)适当的付费广告占比。
    4)尽可能提升流量入口数量。
    5)参考同行的流量结构。
  • 流量结构-分析问题

流量急剧下降了,怎么分析:

  1. 先看行业大盘,看是不是全行业如此
  2. 查看数据是否异常。如果大家的数据都来自第三方,和同行交流看是否也有相同问题
  3. 后台分析是主推宝贝单个下滑还是全店宝贝同步下滑
     ○ 单个下滑:查看评价或库存,都没问题继续拆分,查看所有流量入口:
       ■ 单个入口下滑:针对这个入口补救,如果这个入口是搜索流量入口,查验是否有强大的竞争对手;
       ■ 所有流量入口下滑:拆分这个宝贝每一天的数据(收藏率,加购率,转化率,停留时长等),判断客户特征是否发生变化,即进来了和之前不同的人群,导致效果变差从而影响宝贝权重。
     ○ 所有宝贝下滑:关注动态评分,尤其是售后评分,可能的原因有:季节,竞争对手,官方 活动。如果都不是,找异常数据:把看宝贝每一项数据的变化曲线,所有影响店铺权重的因素反推。

聊完分析方法后,下面我们正式用数据来分析一下。

4.7.2 流量结构-拜耳

os.chdir('..')
os.chdir('./流量渠道数据')
filename4 = glob.glob('*.xlsx')

filename4

[‘安速家居旗舰店流量渠道.xlsx’, ‘拜耳官方旗舰店流量渠道.xlsx’, ‘科凌虫控旗舰店流量渠道.xlsx’]

df5bai = pd.read_excel(filename4[1])
df5bai.head(10)

在这里插入图片描述

# 只取交易指数排名前十的流量渠道
df0 = df5bai
top10 = df0.sort_values('交易指数',ascending=False).reset_index(drop=True).iloc[:10,:]
#计算交易指数占比,交易指数是销售额的反映
top10['交易指数占比'] = top10['交易指数']/top10['交易指数'].sum()
top10.set_index('流量来源',inplace=True)
top10

在这里插入图片描述

#把付费的渠道 进行标记
paid = ['付费流量','直通车','淘宝客']
ind = np.any([top10.index == i for i in paid],axis=0) #true 为付费的
ind

array([False, False, False, False, True, False, False, True, False, True])

自定义函数-流量结构说明:

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 = ['付费流量','直通车','淘宝客']
    ind = np.any([top10.index == i for i in paid],axis=0) #true 为付费的
    explode = ind * 0.1 #相当于往外爆0.1的距离
    
    ax = top10['交易指数占比'].plot.pie(autopct='%.1f%%',
                            figsize=(8,8),colormap='cool',explode = explode)
    
    ax.set_ylabel('')
    plt.show()
    
    #输出占比:总交易指数、付费流量占比、付费流量带来的交易指数
    salesum = top10['交易指数'].sum() #总交易指数
    paidsum = top10['交易指数占比'][ind].sum() #付费流量占比
    paidsale = salesum * paidsum #付费流量带来的交易指数
    print(f'前十流量中:总交易指数:{ 
     salesum:.0f};付费流量占比:{ 
     paidsum*100:.2f}%;付费流量带来的交易指数:{ 
     paidsale:.0f}')
    
    return top10
bai5 = flow(df5bai)

在这里插入图片描述
前10流量中:总交易指数:2334051;付费流量占比:21.85%;付费流量带来交易指数:509959。

4.7.3 流量结构-安速

df5an = pd.read_excel(filename4[0])

df5an.head(10)

在这里插入图片描述

# 只取交易指数排名前十的流量渠道
df0 = df5an
top10 = df0.sort_values('交易指数',ascending=False).reset_index(drop=True).iloc[:10,:]
#计算交易指数占比
top10['交易指数占比'] = top10['交易指数']/top10['交易指数'].sum()
top10.set_index('流量来源',inplace=True)
top10

在这里插入图片描述

#把付费的渠道 进行标记
paid = ['付费流量','直通车','淘宝客']
ind = np.any([top10.index == i for i in paid],axis=0) #true 为付费的
ind

array([False, False, False, True, False, False, False, True, False, False])

an5 = flow(df5an)

在这里插入图片描述

前10流量中:总交易指数:748539;付费流量占比:18.58%;付费流量带来交易指数:139048。

可见拜耳和安速的流量配比是差不多的,安速的整体流量小很多,即流量效果拜耳明显优于安速。

4.7.4 流量结构-科凌虫控

df5ke = pd.read_excel(filename4[2])

df5ke.head(10)

在这里插入图片描述

# 只取交易指数排名前十的流量渠道
df0 = df5ke
top10 = df0.sort_values('交易指数',ascending=False).reset_index(drop=True).iloc[:10,:]
#计算交易指数占比
top10['交易指数占比'] = top10['交易指数']/top10['交易指数'].sum()
top10.set_index('流量来源',inplace=True)
top10

在这里插入图片描述

#把付费的渠道 进行标记
paid = ['付费流量','直通车','淘宝客']
ind = np.any([top10.index == i for i in paid],axis=0) #true 为付费的
ind

array([False, False, False, True, False, False, False, True, True, False])

ke5 = flow(df5ke)

在这里插入图片描述

前10流量中:总交易指数:1918111;付费流量占比:25.51%;付费流量带来交易指数:489263。

  1. 和拜耳在流量上差不多,科凌虫控付费占比较高
  2. 可见拜耳在流量结构上是有优势的,要保持这个优势

5 舆情分析

5.1 文本挖掘基本流程

  1. 使用的数据是评论数据,即文本数据。
  2. 文本数据的分析过程主要有:清洗,可视,这里针对中文文本。
     ○ 清洗基本流程:
       ■ 替换非中英文字符为空格;
       ■ 分词(结巴jieba);
       ■ 去掉停用词(对描述和建模无意义的词);
       ■ 筛选高频词;此流程需要反复尝试对比效果。
  3. 可视化:一般都是词云,可能配合关键词排序等。
  4. 建模:建模前需要将数据转成文档词矩阵(dtm);有监督的话常用的是贝叶斯,其他偏精度的算法也可以,要注意特征个数;无监督常用的是主题模型LDA,其他诸如分群,情感分析也可以。
  5. 清洗流程中,尤其是口语化较强的数据,例如评论数据,需要去除重复语句,以及字数少于某个阈值的评论。
  6. 根据评论数据得到的词云。

下面开始正式复现上述流程。

os.chdir('..')
os.chdir('./评论舆情数据')
filename = glob.glob('*.xlsx')

filename

[‘安速.xlsx’, ‘德国拜耳.xlsx’, ‘科林虫控.xlsx’]

df6bai = pd.read_excel(filename[1])

df6bai

在这里插入图片描述

bai6 = list(df6bai['评论'])

bai6[:5] # 提取5条看一看

在这里插入图片描述
可见,我们需要一定的数据清洗:非中英文字符的不要、在分词前逗号、句号不要。

bai61 = [re.sub(r'[^a-z\u4E00-\u9Fa5]+',' ',i,
                flags=re.I) for i in bai6]#中文字符 \u4E00-\u9Fa5 flags=re.I 不区分大小写

清洗完再来看一下:

bai61[:5]

在这里插入图片描述
接着我们来去掉停用词(百度的停用词库)。不过在此之前,我们得先分一下词,这里我们用的分词工具是jieba分词。先来看一下jieba的使用:

jieba.lcut('真心坑人啊 还没到 小时就凝固了 小强依然活跃')

输出结果如下:

['真心',
 '坑人',
 '啊',
 ' ',
 '还',
 '没到',
 ' ',
 '小时',
 '就',
 '凝固',
 '了',
 ' ',
 '小强',
 '依然',
 '活跃']

接下来正式进行分词:

# 先读取停用词
stopwords = list(pd.read_csv('E:\Data-analysis-project\电商文本挖掘\data/百度停用词表.txt',
                             names=['stopwords'])['stopwords']) #指定列名转化为列表
stopwords.extend([' ', '蟑螂']) #把空格也去掉 蟑螂
bai62 = []
for i in bai61:
    #对每条评论分析
    seg1 = pd.Series(jieba.lcut(i))
    ind1 = pd.Series([len(j) for j in seg1])>1 #长度大于1的保留 
    seg2 = seg1[ind1]
    #去掉停用词 isin
    ind2 = ~seg2.isin(pd.Series(stopwords))
    seg3 = list(seg2[ind2].unique())#去重一下
    if len(seg3)>0:
        bai62.append(seg3)
bai62[0]  #得到的是大列表套小列表

输出结果如下:

['收到',
 '家里',
 '厨房',
 '小强',
 '评价',
 '销量',
 '赶紧',
 '三盒',
 '管用',
 '后续',
 '效果',
 '追加',
 '多久',
 '才能',
 '消灭',
 '干净',
 '没法',
 '做饭',
 '进去',
 '担心',
 '挥发',
 '很多',
 '试试']

组合多个列表到一个列表:

bai63 = [y for x in bai62 for y in x]

bai63[:5]

[‘收到’, ‘家里’, ‘厨房’, ‘小强’, ‘评价’]

#词频统计
baifreq = pd.Series(bai63).value_counts()

baifreq[:10]  # 看下前10个词

输出结果如下:

效果    541
蟑螂    409
双十    145
不错    144
评论    138
小强    114
收到    106
用户    100
填写    100
东西     95
dtype: int64

而构建一个词云所需要的数据 一个巨大字符串 (用空格分隔的词):

bai64 = ' '.join(bai63)

最后一个步骤,调用WordCloud模块生成词云:

#读取照片
mask = imageio.imread(r'E:\Data-analysis-project\电商文本挖掘\data/leaf.jpg')
#如果是中文的词云---字体
font = r'E:\Data-analysis-project\电商文本挖掘\data/SimHei.ttf'

wc = WordCloud(background_color='white',mask=mask,
                       font_path=font).generate(bai64)
plt.figure(figsize=(8,8))
plt.imshow(wc)
plt.axis('off')#不要坐标轴
plt.show()

在这里插入图片描述

5.2 关键字提取

基于 TF-IDF 算法的关键词抽取:

jieba.analyse.extract_tags(bai64,20,True)

输出结果如下:

[('效果', 0.29875695025833393),
 ('双十', 0.13410500058357974),
 ('评论', 0.08641902343506376),
 ('湿巾', 0.08395512199412308),
 ('填写', 0.08239762548761781),
 ('不错', 0.0823420504295694),
 ('好评', 0.07553937079103677),
 ('追评', 0.07069905010031417),
 ('没用', 0.06662667991833673),
 ('收到', 0.06542549350413418),
 ('用户', 0.06304136086139346),
 ('好用', 0.06195551748124191),
 ('尸体', 0.05744312738244686),
 ('划算', 0.057198916923431896),
 ('湿纸巾', 0.05523277943411569),
 ('家里', 0.04893045405589909),
 ('发货', 0.04800798233693402),
 ('期待', 0.0452573579284439),
 ('希望', 0.04377063232686934),
 ('hellip', 0.04308223365487895)]

5.3 总结

  1. 不管从词云还是关键词来看,评价偏好评,没有明显问题
  2. 可以在停用词中添加好评,可以再看效果。

6 项目总结

最终我们可以把以上总结汇总一下:

分析角度 结论
潜力分析 1.整体驱虫市场处于快速增长阶段,趋向于成长期到成熟期;

2.灭鼠杀虫剂市场份额较大(大于60%),约是第二名蚊香液的二倍,市场增长率接近40%,可以认为是明星产品类目,需要持续投资和重点关注;

3.驱虫市场不存在垄断,结构不集中,竞争相对激烈,即没有明显的来自大公司的压力。

市场机会点1.灭鼠杀虫剂市场中,需要重点关注的产品类别是:灭鼠和蟑螂;

2.灭鼠产品:
 ○ 最大的市场集中在0-50的价格段,这个价格段竞争也很激烈;
 ○ 200-250这个价格段市场份额占10%左右,竞争度很低,是值得挖掘的高价市场;

3.灭鼠0-50价格段的产品市场中:
 ○ 10-20价格段市场容量大,竞争度低,值得进一步开发,20-30也不错;
 ○ 店铺类型方面天猫明显优于淘宝;
 ○ 市场份额高的型号是粘鼠板,然而型号0005市场份额还行,竞争度较低,值得开发;
 ○ 产品的物理形态基本都是固体,也是被大众认可的形态;
 ○ 当物理形态为固体,净含量为1时,市场份额高竞争度低,值得开发。

品类分布-产品类别拜耳只有一个市场,其他的有不同市场,但主要市场都是灭鼠杀虫剂。
品类分布-适用对象拜耳的主要对象是蟑螂,而另外两家除此之外还有螨,鼠;

而从之前的分析看灭鼠和蟑螂的整体市场份额都大;应该开拓新市场,尤其是灭鼠,也考察其他两家都开拓的螨市场。

产品结构拜耳大部分产品集中在除蟑上,杀虫也有一定的规模,但是明星产品略乏力,可以进一步发展问题产品灭鼠为明星产品

安速没有明显的灭鼠市场;拜耳和安速比较:拜耳杀虫是老爆款,灭蟑存在一定竞争。

科凌虫控积极发展多个产品,然而每个产品结构相对独立(奶牛除蟑,明星灭鼠,潜力除螨),没有后续的支持,竞争力不是那么强。

流量结构拜耳和安速的流量配比是差不多的,不过安速的整体流量小很多;

科凌虫控和拜耳在流量上差不多,科凌虫控付费占比较高,可见拜耳在流量结构上是有优势的,要保持这个优势。

舆情分析不管从词云还是关键词来看,评价偏好评,没有明显问题

到这里,我们这一个项目也差不多结束啦,希望这篇文章对你能有所帮助!


关注我,了解更多相关知识!

CSDN@报告,今天也有好好学习

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/186674.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • html标签<td><tr><th>全称及缩写说明[通俗易懂]

    html标签<td><tr><th>全称及缩写说明[通俗易懂]<td>是tabledatacell的缩写,单元格<tr>是tablerow的缩写,表格中的一行<th>是tableheadercell的

  • java文件转码工具-native2ascii.exe命令简介

    java文件转码工具-native2ascii.exe命令简介native2ascii.exe简介java的转码工具,需要java.dll动态库和相关程序才能执行。native2ascii.exe是Java的一个文件转码工具,是将特殊各异的内容转为用指定的编码标准文体形式统一的表现出来,它通常位于JDK_home\bin目录下,安装好JavaSE后,可在命令行直接使用native2ascii命令进行转码。JDK自带的工具native2ascii可以将uncode编码的文件转换为本地编码的文件,但是不能批量转换文件。native2ascii.

  • python中random函数的使用方法 详解

    python中random函数的使用方法 详解#random各种使用方法importrandom#随机生成[0.1)的浮点数print("random():",random.random())#随机生成1000-9999之间的整数print("randint(1000,9999):",random.randint(1000,9999))#随机生成0-20之间的偶数print("randrange(0,21,2):"…

  • navicat for mysql 15激活码_在线激活2022.01.18

    (navicat for mysql 15激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html0HKLM1UCCY-eyJsaWNlbnNlSW…

  • nextline函数_在JAVA中Scanner中的next()和nextLine()为什么不能一起使用?

    nextline函数_在JAVA中Scanner中的next()和nextLine()为什么不能一起使用?Java输入一直是一个坑,本来一直用Scanner,但一直搞不懂换行符啥的,就用BufferReader,但前不久大疆笔试需要持续输入,早忘了Scanner怎么写,而那个场景用Scanner很好实现……就继续在这里记录一下Scanner的坑吧一、next&nextLine区别next不能得到带有空格的字符串一定要读到有效字符后才可以结束,结束条件是碰到空格…

  • BN层的作用_什么时候使用BN

    BN层的作用_什么时候使用BN参考https://blog.csdn.net/fate_fjh/article/details/53375881

    2022年10月14日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号