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

news2025/1/11 7:55:12

文章目录

  • 前言
  • 项目背景与目标
    • 品类分布分析
      • 数据准备与处理
      • 查看数据
      • 类目
        • 作图查看占比的不同
      • 适用对象
        • 作图查看适用对象占比
    • 产品结构分析
        • 对商品分类汇总
        • 定义作图函数
        • 拜耳
        • 安速
        • 科凌虫控


前言

在这里插入图片描述

  • 数据说明:

项目背景与目标

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

品类分布分析

数据准备与处理

  • 导入相应的库和模块:
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从删库到还原

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 从删库到还原 魔法一魔法二魔法三魔法四查看是否开启binlog&#xff0c;且format为row执行以下命…

常微分方程算法之编程示例四(龙格-库塔法)

目录 一、算例一 1.1 研究问题 1.2 C代码 1.3 计算结果 二、算例二 2.1 研究问题 2.2 C代码 2.3 计算结果 一、算例一 本节我们采用龙格-库塔法&#xff08;Runge-Kutta法&#xff09;求解算例。 龙格-库塔法的原理及推导请参考&#xff1a; 常微分方程算法之龙…

钡铼BL101网关6串口Modbus转MQTT优化智慧园区设备互联

BL101网关&#xff1a;优化智慧园区设备互联的关键利器 在当今快速发展的智能化时代&#xff0c;智慧园区管理对于设备之间的高效互联至关重要。钡铼&#xff08;BL101&#xff09;网关作为一款功能强大的Modbus转MQTT设备&#xff0c;不仅支持多种通信协议和硬件接口&#xf…

安帝康生物完成超2亿元A轮融资,持续深耕呼吸感染和疼痛领域创新药研发

日前&#xff0c;嘉兴安帝康生物科技有限公司&#xff08;下称“安帝康生物”&#xff09;正式宣布完成超2亿元A轮融资&#xff0c;由先声药业&#xff08;02096.HK&#xff09;、华金投资与华金大道联合领投&#xff0c;老股东同创伟业、嘉兴新创创投持续加投&#xff0c;嘉睿…

【CVPR2024】Bootstrapping Autonomous Radars with Self-Supervised Learning

原文链接&#xff1a;https://arxiv.org/abs/2312.04519 简介&#xff1a;自动驾驶中的雷达可以在极端天气下进行感知&#xff0c;但相关模型的训练受到标注困难的阻碍。本文提出自监督框架&#xff0c;利用大量无标注雷达数据预训练雷达表达。方法包括雷达到雷达的、以及雷达到…

适用于不同场合的高频俄语祝福语,柯桥零基础俄语培训

Приятного аппетита. Кушайте на здоровье. (говорят те, кто подает еду на стол, обычно это хозяйка дома, квартиры, или официант в кафе, ресторане…

论文辅导 | 基于贝叶斯优化LSTM的锂电池健康状态评估方法

辅导文章 模型描述 在传统的 LSTM 神经网络中,超参数的取值对模型性能有很大影响,但人工调参很难得到最优解。 因此,本文加入了 BO 来迭代出最优超参数。 在利用LSTM 神经网络评估锂电池 SoH 的基础上,通过 BO来提高评估的精确度。 预测效果

`THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。

demo案例 THREE.PointsMaterial 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性&#xff0c;比如颜色、大小和透明度。下面是对其构造函数的参数、属性和方法的详细讲解。 构造函数 const material new THREE.PointsMaterial(parameters);参数&am…

sourceTree 和Tortoise git软件的对比,以及使用sourceTree管理公司托管的 gitlab 项目或github项目

文章目录 Tortoisegit 和sourcetree的比较如何添加 gitlab 的社区版账号总结参考资料 Tortoisegit 和sourcetree的比较 我在 window都是用 Git 小乌龟&#xff08;Tortoise git&#xff09;来可视化管理 Git 项目。这时是不区分 Git 平台的&#xff0c;也就是不管你用的是 Git…

第4讲:pixi.js绘制舞台、随窗口大小而改变画布大小和舞台位置

基于前面写的代码&#xff0c;在gamelets的工程目录下新建一个CanvasAndStage.ts 代码如下 import {Application, Graphics} from pixi.js; // 不要忘了&#xff0c;一定要引用这个css样式&#xff0c;否则就会以默认样式显示 import ./style.css // app.view就是画布&#xf…

宝塔面板部署前端项目

部署前端项目 1 打包自己的项目2 登录宝塔面板3 添加站点4 设置域名5 进入当前站点对应的文件目录中6 上传打包后的文件7 访问网站 1 打包自己的项目 2 登录宝塔面板 点击左侧“网站”菜单进入对应页面 点击“添加站点” 3 添加站点 填写域名&#xff0c;如果没有域名的&am…

公交行业系统特点及面临的挑战

在当前城市发展中&#xff0c;公交行业作为公共交通的重要组成部分&#xff0c;承担着重要的社会责任。随着科技的进步和城市化进程的加快&#xff0c;公交行业系统也在不断地发展和完善。然而&#xff0c;从目前的发展情况来看&#xff0c;公交行业系统也呈现出一些显著的特点…

jmeter乱码汇总

一、Web页面乱码 如果想让他显示中文可以按以下操作: 1、打开jmter配置文件 bin/jmeter.properties 2、修改配置文件&#xff0c;查找“sampleresult.default.encoding”将其改为utf8&#xff0c;注意要去掉“#”号 sampleresult.default.encodingutf-8 3、重启 jmeter 4、再次…

让TSN DDS运转起来——面向智能汽车的以太网测试解决方案

概述 作为OPEN联盟和AUTOSAR联盟的核心成员&#xff0c;经纬恒润多年来持续为国内外各大OEM和供应商提供车载以太网相关的咨询服务&#xff0c;涵盖TCP/IP、SOME/IP、DDS、诊断、TSN等前沿技术领域的设计和测试。同时&#xff0c;经纬恒润与行业内的合作伙伴紧密合作&#xff0…

Linux删除文件磁盘空间未释放解决办法

工作中经常遇到Linux系统磁盘空间不足&#xff0c;但是删除后较大的日志文件后&#xff0c;发现磁盘空间仍没有被释放。 解决思路 1、工作发现磁盘空间不足&#xff1b; 2、找到占用磁盘空间较大的文件进行删除&#xff1b; 3、删除文件后&#xff0c;查看磁盘空间使用情况…

Web Serial串口通信实现WEB浏览器读写M1卡

本示例使用的设备&#xff1a;RS232串口RFID NFC IC卡读写器可二次开发编程发卡器USB转COM-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &l…

第10章 启动过程组 (启动过程组的重点工作)

第10章 启动过程组 10.3启动过程组的重点工作&#xff0c;在第三版教材第362~364页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;项目启动会议 1、作用 标志着对项目经理责权的定义结果的正式公布&#xff0c;通常由项目经理负责组织和召开。2、目的 使项目各…

AI网络爬虫:下载m3u8视频文件

要下载m3u8视频文件&#xff0c;首先得找到m3u8地址&#xff0c;按下F12键&#xff0c;看网络-fetch/xhr,然后找网址中包括m3u8的地址&#xff0c;再预览或者看下相应 https://1304688195.vod2.myqcloud.com/9d058fb7vodtranscq1304688195/1194c6da1253642699220090018/video_1…

【阅读论文】-- IDmvis:面向1型糖尿病治疗决策支持的时序事件序列可视化

IDMVis: Temporal Event Sequence Visualization for Type 1 Diabetes Treatment Decision Support 摘要1 引言2 1 型糖尿病的背景3 相关工作3.1 时间事件序列可视化3.2 电子健康记录可视化3.3 1 型糖尿病可视化3.4 任务分析与抽象 4 数据抽象5 层次化任务抽象5.1 临床医生工作…

【IM 服务】新用户为什么刚注册就能收到通知?为什么能接收注册前的通知?

功能说明&#xff1a; 默认新注册的用户可以接收到注册前 7 天内的广播消息。您可以从控制台免费基础功能页面关闭该服务。 开通方式&#xff1a; 访问开发者后台 免费基础功能 1页面&#xff0c;确认应用名称与环境&#xff08;开发 /生产 &#xff09;正确无误后&#xff0c…