驱虫市场的潜力分析
导包
jieba的下载:
!pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple
;
wordcloud:词云包的下载
!pip install wordcloud -i https://pypi.tuna.tsinghua.edu.cn/simple
;
导包:
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
;
分析目的&加载数据
分析目的:针对各个子类目市场近三年的交易额数据,以及top100品牌数据(2017年
11月到2018年10月),通过描述性分析,在年变化的维度上:
- 分析整个市场的总体趋势
- 分析各子类目市场占比及变化趋势
- 分析市场集中度,即是否存在垄断
· 分析过程:
- 读取各子类目市场近三年交易额数据
- 依时间汇总成各子类目在时间线上的交易金额数据
- 1.把数据集放到对应的工作目录下:
import os
# 显示当前工作目录
print("Initial working directory:", os.getcwd())
进入目录:
# 切换目录
os.chdir('data\驱虫剂市场')
filenames = glob.glob('*近三年交易额.xlsx')
filenames
['灭鼠杀虫剂市场近三年交易额.xlsx',
'电蚊香套装市场近三年交易额.xlsx',
'盘香灭蟑香蚊香盘市场近三年交易额.xlsx',
'蚊香加热器市场近三年交易额.xlsx',
'蚊香液市场近三年交易额.xlsx',
'蚊香片市场近三年交易额.xlsx',
'防霉防蛀片市场近三年交易额.xlsx'];
这里假设:
1、各月之间没有明显的周期性变化;
2、每年对应月份的数据呈线性变化。
# 回顾一下re.search()方法
re.search(r'.*(?=市场)','灭鼠杀虫剂市场近三年交易额.xlsx').group()
'灭鼠杀虫剂'';
- 定义函数,读取单个excel文件,转换成DataFrame,改变列名,
时间列变为datetime类型,并将时间列变为index
def read_3threes(filename):
colname = re.search(r'.*(?=市场)',filename).group() # 提取文件名中“市场”前面的文字
df = pd.read_excel(filename)
if df['时间'].dtypes == 'int64':
# 将“时间”列的数据类型转变为datetime类型
df['时间'] = pd.to_datetime(df['时间'],unit='D',origin=pd.Timestamp('1899-12-30'))
df.rename(columns={df.columns[1]:colname},inplace=True) # 修改第二列的列名
df.set_index('时间',inplace=True)
return df
# 分别读取七个文件,并转换成DataFrame,存入列表中
dfs = [read_3threes(filename) for filename in filenames];
# 将7个DataFrame在axis=1的方向拼接
df = pd.concat(dfs,axis=1).reset_index()
df.head()
;
时间 灭鼠杀虫剂 电蚊香套装 盘香灭蟑香蚊香盘 蚊香加热器 蚊香液 蚊香片 防霉防蛀片
0 2018-10-01 1.136548e+08 106531.29 4171283.35 315639.48 7814546.15 1032414.29 8541153.59
1 2018-09-01 1.440261e+08 105666.63 6784500.17 457366.41 10654973.47 1566651.88 8825870.43
2 2018-08-01 1.540426e+08 201467.03 10709683.41 746513.13 17835577.80 2617149.00 6320153.44
3 2018-07-01 1.480032e+08 438635.29 16589184.89 1871757.00 38877917.83 6209040.06 6302595.06
4 2018-06-01 1.359438e+08 953749.78 23526385.73 3641025.92 76499091.86 12484919.63 7047206.98;
清洗补全数据
由于其中的时间列是从2015年11月到2018年10月,而我们需要的是2016-2018年每
月完整的数据(方便从年变化的角度分析产品)
· 这里我们假设:
- 每年各月之间没有明显规律的周期性变化(近似认为月和月之间的相关性不大)
- 每年对应月份的数据是线性变化的(一是因为数据少,二是认为随着年份的增长,
交易额在大环境下是稳步变化的)
· 故这里我们可以简单的用线性回归预测
查看各列的数据缺失情况
df.isna().mean()
;
时间 0.0
灭鼠杀虫剂 0.0
电蚊香套装 0.0
盘香灭蟑香蚊香盘 0.0
蚊香加热器 0.0
蚊香液 0.0
蚊香片 0.0
防霉防蛀片 0.0
dtype: float64';
抽取df的所有月份,以供后面使用
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
for i in [11,12]:
dm = df[month==i] # 从df中抽取对应月份的记录
Xtrain = np.array(dm['时间'].dt.year).reshape(-1,1)
y_hat = [pd.datetime(2018,i,1)]
for j in range(1,len(dm.columns)): # 遍历对应月份的每个种类
ytrain = np.array(dm.iloc[:,j]) # 获取对应种类的交易金额,作为训练样本集标签
reg = LinearRegression()
reg.fit(Xtrain,ytrain)
y_predict = reg.predict(np.array([2018]).reshape(-1,1))
y_hat.append(y_predict)
newrow = pd.DataFrame(dict(zip(df.columns,y_hat)))
df = newrow.append(df) # 将预测的结果加到df中
df.reset_index(drop=True,inplace=True) # 删除原索引,重置索引
df.head()
时间 灭鼠杀虫剂 电蚊香套装 盘香灭蟑香蚊香盘 蚊香加热器 蚊香液 蚊香片 防霉防蛀片
0 2018-12-01 5.256763e+07 50204.53 9.285543e+05 86849.166667 3.081492e+06 4.268126e+05 3958717.58
1 2018-11-01 7.175250e+07 38692.61 1.801319e+06 193874.386667 5.543204e+06 7.766270e+05 6678677.55
2 2018-10-01 1.136548e+08 106531.29 4.171283e+06 315639.480000 7.814546e+06 1.032414e+06 8541153.59
3 2018-09-01 1.440261e+08 105666.63 6.784500e+06 457366.410000 1.065497e+07 1.566652e+06 8825870.43
4 2018-08-01 1.540426e+08 201467.03 1.070968e+07 746513.130000 1.783558e+07 2.617149e+06 6320153.44
整体市场
删除2015年的记录
df = df[df['时间'].dt.year!=2015]
添加新列,用来存储每年的交易金额总和
df['colsum'] = df.sum(1)
插入一个年分列’year’
df.insert(1,'year',df['时间'].dt.year)
byyear = df.groupby('year').sum().reset_index()
byyear.head()
# 重命名 'year' 列为 '年份'
byyear = byyear.rename(columns={'year': '年份'})
byyear = byyear.rename(columns={'colsum': '合计'})
# 显示前几行数据
byyear.head()
年份 灭鼠杀虫剂 电蚊香套装 盘香灭蟑香蚊香盘 蚊香加热器 蚊香液 蚊香片 防霉防蛀片 合计
0 2016 6.080471e+08 7666572.12 4.785285e+07 5.905205e+06 1.704905e+08 27980839.47 50023001.94 9.179661e+08
1 2017 8.477740e+08 9377531.68 8.635539e+07 1.055284e+07 3.300656e+08 49068587.96 62678822.18 1.395873e+09
2 2018 1.137893e+09 4537682.09 1.180885e+08 1.683672e+07 3.582077e+08 51845921.56 72701365.23 1.760111e+09
1.1 市场变化趋势描述
# 绘图
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
年份 灭鼠杀虫剂 电蚊香套装 盘香灭蟑香蚊香盘 蚊香加热器 蚊香液 蚊香片 防霉防蛀片 合计 16-17年增幅 17-18年增幅
0 2016 6.080471e+08 7666572.12 4.785285e+07 5.905205e+06 1.704905e+08 27980839.47 50023001.94 9.179661e+08 NaN NaN
1 2017 8.477740e+08 9377531.68 8.635539e+07 1.055284e+07 3.300656e+08 49068587.96 62678822.18 1.395873e+09 52.061472 NaN
2 2018 1.137893e+09 4537682.09 1.180885e+08 1.683672e+07 3.582077e+08 51845921.56 72701365.23 1.760111e+09 26.093967 91.740342
# 绘制各子类目市场趋势
# 列出所有子类目
categories = ['灭鼠杀虫剂', '电蚊香套装', '盘香灭蟑香蚊香盘', '蚊香加热器', '蚊香液', '蚊香片', '防霉防蛀片']
for category in categories:
plt.plot(byyear['年份'], byyear[category], marker='o', label=category)
plt.xlabel('年份')
plt.ylabel('销售总量')
plt.title('各子类目市场趋势')
plt.legend()
plt.grid(True)
plt.tight_layout()
# 显示图表
plt.show()
可见:灭鼠杀虫剂份额大,增长高。直观的看灭鼠杀虫剂和蚊香液都有较大的机会
各市场占比
# 先按年份对数据进行分组求和
by_year_sum = byyear.groupby('年份')[categories].sum()
# 计算每个类目在各年份的占比
category_percentage_by_year = by_year_sum.div(by_year_sum.sum(axis=1), axis=0) * 100
# 可视化各类目在不同年份的销售额占比
plt.figure(figsize=(12, 8))
category_percentage_by_year.plot(kind='bar', stacked=True)
plt.xlabel('年份')
plt.ylabel('占比(%)')
plt.title('各类目在不同年份的销售额占比')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1))
plt.grid(True)
plt.tight_layout()
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
灭鼠杀虫剂 电蚊香套装 盘香灭蟑香蚊香盘 蚊香加热器 蚊香液 蚊香片 防霉防蛀片 合计 16-17年增幅
16-17 0.394257 0.223171 0.804603 0.787041 0.935976 0.753650 0.253000 0.520615 NaN
17-18 0.342213 -0.516111 0.367471 0.595468 0.085262 0.056601 0.159903 0.260940 -0.498785
byyear_diff.plot()
plt.xlabel('年份')
plt.ylabel('销售总量')
plt.title('各子类目市场趋势')
plt.legend()
plt.grid(True)
plt.show()
可见:见除了灭鼠杀虫剂和蚊香液增幅比较稳定,其它都有下降甚至变负 1、电蚊香套装进入负增长,该领域不可进; 2、较稳定增长领域:灭鼠杀虫剂; 3、考虑蚊香加热器产品寿命长,且总交易额较低,占比较低,市场小,故主要考虑灭鼠杀虫剂市场。
垄断
1.3 市场集中度描述 采用赫芬达尔指数(Herfindahl-Hirschman Index,缩写HHI)
df1 = pd.read_excel('top100品牌数据.xlsx')
# 生成交易指数占比列,用以描述市场份额
df1['交易指数占比'] = df1['交易指数']/df1['交易指数'].sum()
df1.plot(x='品牌', y='交易指数占比', kind='bar', figsize=(12, 8))
plt.xlabel('品牌')
plt.ylabel('交易指数占比')
plt.title('驱虫市场各品牌份额占有率')
plt.legend(loc='upper right') # 设置图例位置为右上角
plt.grid(True) # 显示网格线
plt.tight_layout()
plt.show()
驱虫市场各品牌份额占有率图如下:
# 计算HHI指数
HHI = sum(df1['交易指数占比']**2)
print(f'驱虫市场HHI指数:{HHI:.6f}(或{HHI*10000:.2f}),等效公司数:{1/HHI:.2f}')
驱虫市场HHI指数:0.013546(或135.46),等效公司数:73.82
结论
可见:该市场存在一定竞争,但不存在垄断。 驱虫市场的潜力分析-结论
整体驱虫市场处于快速增长阶段,趋向于成长期到成熟期
灭鼠杀虫剂市场份额较大(大于60%),约是第二名蚊香液的二倍,市场增长率接近40%, 可以认为是明星产品类目,需要持续投资和重点关注
驱虫市场不存在垄断,结构不集中,竞争相对激烈,即没有明显的来自大公司的压力