文章目录
- 前言
- 项目背景与目标
- 品类分布分析
- 数据准备与处理
- 查看数据
- 类目
- 作图查看占比的不同
- 适用对象
- 作图查看适用对象占比
- 产品结构分析
- 对商品分类汇总
- 定义作图函数
- 拜耳
- 安速
- 科凌虫控
前言
- 数据说明:
项目背景与目标
- 该项目旨在分析三个品牌(拜耳、安速、科凌虫控)在电商领域的销售数据、产品结构、流量结构和舆情状况。
- 目的是评估市场竞争地位,识别市场机会和潜在风险,为市场策略提供数据支持。
品类分布分析
数据准备与处理
- 导入相应的库和模块:
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
- 忽视警告:
import warnings
warnings.filterwarnings("ignore")
- 将当前工作目录切换到指定的路径 ‘C:/Users/Desktop/竞争数据’:
os.chdir('..')
os.chdir('C:/Users/Desktop/竞争数据')
# 将当前工作目录切换到指定的路径 'C:/Users/Desktop/竞争数据'
- 数据准备:
os.chdir('C:/Users/Desktop/竞争数据/商品销售数据')
- 使用 glob 模块获取当前目录下所有扩展名为.xlsx 的文件,并将文件名列表存储在 filenames2 变量中:
filenames2 = glob.glob('*.xlsx')
filenames2
查看数据
- 从 filenames2 列表中的第二个文件读取 Excel 数据,并将其存储为 DataFrame 对象 df3
- 显示 df3 的前 1 行数据
df3 = pd.read_excel(filenames2[1])
df3.head(1)
- 定义了一个名为 load_xlsx1 的函数,作用是读取指定的 Excel 文件,并删除数据框 df 中的指定列(‘序号’、‘店铺名称’、‘主图链接’、‘商品链接’、‘商品名称’),最后返回处理后的结果数据框 df 。
def load_xlsx1(filename):
df = pd.read_excel(filename)
useless = ['序号','店铺名称','主图链接',
'商品链接','商品名称']
df.drop(columns=useless,inplace=True)
return df
- 输出:
df3bai = load_xlsx1(filenames2[1])
df3bai.head()
df3an = load_xlsx1(filenames2[0])
df3an.head()
df3kl = load_xlsx1(filenames2[2])
df3kl.head()
类目
- 将三个Excel的类目作为索引输出:
bai31 = df3bai.groupby('类目').sum()
bai31
an31 = df3an.groupby('类目').sum()
an31
kl31 = df3kl.groupby('类目').sum()
kl31
作图查看占比的不同
# 创建一个 1 行 3 列的子图布局,图形大小为 (10, 6)
fig, axes = plt.subplots(1, 3, figsize=(10, 6))
# 选择第一个子图
ax = axes[0]
# 绘制 bai31 数据框中'销售额'列的饼图,显示百分比为整数形式,标题为'拜耳',起始角度为 30 度,并在当前子图绘制
bai31['销售额'].plot.pie(autopct='%.f', title='拜耳', startangle=30, ax=ax)
# 去除当前子图的 y 轴标签
ax.set_ylabel('')
# 选择第二个子图
ax = axes[1]
# 绘制 an31 数据框中'30 天销售额'列的饼图,显示百分比为整数形式,标题为'安速',起始角度为 60 度,并在当前子图绘制
an31['30 天销售额'].plot.pie(autopct='%.f', title='安速', startangle=60, ax=ax)
# 去除当前子图的 y 轴标签
ax.set_ylabel('')
# 选择第三个子图
ax = axes[2]
# 绘制 kl31 数据框中'30 天销售额'列的饼图,显示百分比为整数形式,标题为'科凌虫控',起始角度为 90 度,并在当前子图绘制
kl31['30 天销售额'].plot.pie(autopct='%.f', title='科凌虫控', startangle=90, ax=ax)
# 去除当前子图的 y 轴标签
ax.set_ylabel('')
# 显示绘制的图形
plt.show()
可见拜耳只有一个市场,其他俩公司虽然有不同市场,但主要市场还都是灭鼠杀虫剂
适用对象
bai32 = df3bai.groupby('使用对象').sum()
bai32
an32 = df3an.groupby('适用对象').sum()
an32
kl32 = df3kl.groupby('适用对象').sum()
kl32
作图查看适用对象占比
#作图
# 创建一个 1 行 3 列的子图布局,图形大小为 (10, 6)
fig, axes = plt.subplots(1, 3, figsize=(10, 6))
# 选择第一个子图
ax = axes[0]
# 绘制 bai32 中'销售额'列的饼图,显示百分比为整数形式,标题为'拜耳',起始角度为 30 度,并在当前子图绘制
bai32['销售额'].plot.pie(autopct='%.f', title='拜耳', startangle=30, ax=ax)
# 去除当前子图的 y 轴标签
ax.set_ylabel('')
# 选择第二个子图
ax = axes[1]
# 绘制 an32 中'30 天销售额'列的饼图,显示百分比为整数形式,标题为'安速',起始角度为 60 度,并在当前子图绘制
an32['30 天销售额'].plot.pie(autopct='%.f', title='安速', startangle=60, ax=ax)
# 去除当前子图的 y 轴标签
ax.set_ylabel('')
# 选择第三个子图
ax = axes[2]
# 绘制 kl32 中'30 天销售额'列的饼图,显示百分比为整数形式,标题为'科凌虫控',起始角度为 90 度,并在当前子图绘制
kl32['30 天销售额'].plot.pie(autopct='%.f', title='科凌虫控', startangle=90, ax=ax)
# 去除当前子图的 y 轴标签
ax.set_ylabel('')
# 显示图形
plt.show()
- 拜耳的主要对象是蟑螂,而另外两家除此之外还有螨,鼠
- 而从之前的分析看灭鼠和蟑螂的整体市场份额都大
- 应该开拓新市场,尤其是灭鼠,也考察其他两家都开拓的螨市场
产品结构分析
os.chdir('..')
# 将当前工作目录切换到指定的目录 'C:/Users/Desktop/竞争数据/商品交易数据'
os.chdir('C:/Users/Desktop/竞争数据/商品交易数据')
filenames3 = glob.glob('*.xlsx')# 使用 glob 模块获取当前目录下所有扩展名为.xlsx 的文件,并将文件名列表存储在 filenames3 变量中
filenames3
- 拜耳,安速,科凌虫控的数据分开读取分析
- 主要分析产品结构
- 由于分析过程相似,故都封装成函数方便分析
- 拜耳
#读数据
df4bai = pd.read_excel(filenames3[1])
df4bai.head()
# 打印 df4bai 数据框的信息,包括列的数据类型、非空值数量等
df4bai.info()
# 计算 df4bai 数据框中'商品'列的不同值的数量
df4bai['商品'].value_counts().count()
对商品分类汇总
- 自定义分类汇总函数:
def byproduct(df):
"""
此函数用于对输入的数据框进行处理和计算
参数:
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
# 调用自定义函数 `byproduct` 对 `df4bai` 数据框进行处理,并将结果存储在 `bai4` 变量中
bai4 = byproduct(df4bai)
# 显示 `bai4` 数据框的前 5 行数据
bai4.head(5)
bai4.describe()
- 使用波士顿矩阵分析,用
交易增长幅度
表示市场发展率,交易金额占比
表示市场份额 - 观察运行结果,这两个指标的max值都远大于75%分位数,认为是异常值,考虑引入盖帽法,方便后续作图
给定数据最低阈值为A,最高阈值为B,简单来说,
盖帽法
将数据中低于A的值以A覆盖,高于B的值以B覆盖。
- 定义盖帽法函数:
def block(x):
# 计算输入数据的 90% 分位数
qu = x.quantile(.9)
# 将大于 90% 分位数的值替换为 90% 分位数
out = x.mask(x > qu, qu)
return out
- 分别定义对两个指标盖帽的函数
def block2(df):
"""
此函数用于处理输入的数据框
参数:
df: 输入的数据框
返回:
处理后的新数据框
"""
# 复制输入的数据框,以便在不改变原始数据框的情况下进行操作
df1 = df.copy()
# 对'交易增长幅度'列应用自定义的'block'函数进行处理
df1['交易增长幅度'] = block(df1['交易增长幅度'])
# 对'交易金额占比'列应用自定义的'block'函数进行处理
df1['交易金额占比'] = block(df1['交易金额占比'])
return df1
# 调用 `block2` 函数对 `bai4` 数据框进行处理,并将处理结果存储在 `bai41` 变量中
bai41 = block2(bai4)
# 输出 `bai41` 数据框的描述性统计信息,包括计数、均值、标准差、最小值、四分位数和最大值等
bai41.describe()
这是盖帽后的数据,盖帽后指标不那么异常,方便作图观察
定义作图函数
def plotBOG(df, mean=False, q1=0.5, q2=0.5):
"""
此函数用于绘制特定的图表
参数:
df: 要绘制的数据框
mean: 布尔值,若为 True,则使用均值绘制竖线和横线,否则使用分位数
q1: 用于绘制竖线的分位数(默认 0.5)
q2: 用于绘制横线的分位数(默认 0.5)
"""
# 创建一个图形和坐标轴,设置图形大小为 (10, 8)
f, ax = plt.subplots(figsize=(10, 8))
# 使用 seaborn 绘制散点图,以'交易金额占比'和'交易增长幅度'为坐标,'商品个数'为颜色和大小
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)
# 根据 mean 的值决定绘制均值线还是分位数线
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)
- 这里要查看实际数据,故使用盖帽前数据
def extractBOG(df, q1=0.5, q2=0.5, by='交易金额占比'):
"""
此函数用于从输入的数据框中提取不同类型的产品
参数:
df: 输入的数据框
q1: 用于筛选的第一个分位数,默认为 0.5
q2: 用于筛选的第二个分位数,默认为 0.5
by: 用于排序的列名,默认为'交易金额占比'
返回:
三个数据框,分别表示明星产品、奶牛产品和问题产品
"""
# 提取明星产品,即'交易金额占比'大于等于其 q1 分位数且'交易增长幅度'大于等于其 q2 分位数的产品
star = df.loc[(df['交易金额占比']>=df['交易金额占比'].quantile(q1)) & (df['交易增长幅度']>=df['交易增长幅度'].quantile(q2)),:]
# 对明星产品按指定列降序排序
star = star.sort_values(by, ascending=False)
# 提取奶牛产品,即'交易金额占比'大于等于其 q1 分位数但'交易增长幅度'小于其 q2 分位数的产品
cow = df.loc[(df['交易金额占比']>=df['交易金额占比'].quantile(q1)) & (df['交易增长幅度']<df['交易增长幅度'].quantile(q2)),:]
# 对奶牛产品按指定列降序排序
cow = cow.sort_values(by, ascending=False)
# 提取问题产品,即'交易金额占比'小于其 q1 分位数但'交易增长幅度'大于等于其 q2 分位数的产品
que = df.loc[(df['交易金额占比']<df['交易金额占比'].quantile(q1)) & (df['交易增长幅度']>=df['交易增长幅度'].quantile(q2)),:]
# 对问题产品按指定列降序排序
que = que.sort_values(by, ascending=False)
return star, cow, que
调用
extractBOG
函数处理bai4
数据框,以默认的by='交易金额占比'
条件进行提取
将返回的明星产品、奶牛产品和问题产品分别存储在baistar
、baicow
和baique
变量中
再次调用extractBOG
函数处理bai4
数据框,但这次指定by='交易增长幅度'
作为提取条件
将返回的明星产品、奶牛产品和问题产品分别存储在baistar1
、baicow1
和baique1
变量中
baistar, baicow, baique = extractBOG(bai4)
baistar1, baicow1, baique1 = extractBOG(bai4, by='交易增长幅度')
拜耳
- 拜耳明星产品:
baistar
- 拜耳奶牛产品:
baicow
- 拜耳问题产品:
baique1
其他两个公司的分析和上述流程一样
安速
- 读数据:
df4an = pd.read_excel(filenames3[0])
df4an.head(2)
df4an.info()
df4an['商品'].value_counts().count()
- 汇总指标
an4 = byproduct(df4an)
an4.describe()
- 盖帽法处理
an41 = block2(an4)
an41.describe()
- 波士顿矩阵图(BCG)
plotBOG(an41)
- 查看具体产品
anstar,ancow,anque = extractBOG(an4)
anstar1,ancow1,anque1 = extractBOG(an4,by='交易增长幅度')
- 安速明星产品
anstar
- 安速奶牛产品
ancow
- 安速问题产品
anque1
科凌虫控
- 读数据:
df4kl = pd.read_excel(filenames3[2])
df4kl.head(2)
df4kl.info()
df4kl['商品'].value_counts().count()
- 汇总指标
kl4 = byproduct(df4kl)
kl4.describe()
- 盖帽法处理
kl41 = block2(kl4)
kl41.describe()
- 波士顿矩阵图(BCG)
plotBOG(kl41)
- 查看具体产品
klstar,klcow,klque = extractBOG(kl4)
klstar1,klcow1,klque1 = extractBOG(kl4,by='交易增长幅度')
- 安速明星产品
klstar
- 安速奶牛产品
klcow
- 安速问题产品
klque1