Python文本挖掘数据分析——竞争分析(1)


前言

在这里插入图片描述

  • 数据说明:

项目背景与目标

  • 该项目旨在分析三个品牌(拜耳、安速、科凌虫控)在电商领域的销售数据、产品结构、流量结构和舆情状况。
  • 目的是评估市场竞争地位,识别市场机会和潜在风险,为市场策略提供数据支持。

品类分布分析

数据准备与处理

  • 导入相应的库和模块:
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='交易金额占比' 条件进行提取
将返回的明星产品、奶牛产品和问题产品分别存储在 baistarbaicowbaique 变量中
再次调用 extractBOG 函数处理 bai4 数据框,但这次指定 by='交易增长幅度' 作为提取条件
将返回的明星产品、奶牛产品和问题产品分别存储在 baistar1baicow1baique1 变量中

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
  • 35
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值