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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

lambdastreammaven

1.Lambda &#xff08;1&#xff09;Java 8 Lambda 表达式 在 Java 8 以前&#xff0c;若我们想要把某些功能传递给某个方法&#xff0c;总要去写内部类 或匿名内部类类。代码示例&#xff1a; list.sort(new Comparator<User>() { Override public int compare(User …

java实现一个图的最短路径算法

import java.util.*; //java实现一个图的最短路径算法 public class Test_34 { // 定义一个常量INF&#xff0c;表示无穷大。private static final int INF Integer.MAX_VALUE; // 定义一个方法dijkstra&#xff0c;接受一个二维数组图和一个起始节点作为参数。public s…

apk反编译修改教程系列-----去除apk软件更新方法步骤列举 记录八种最常见的去除方法

在前面几期博文中 有说明去除apk软件更新的步骤方法。我们在对应软件反编译去除更新中要灵活运用。区别对待。同一个软件可以有不同的去除更新方法可以适用。今天的教程对于软件更新去除列举几种经常使用的修改步骤。 通过基础课程可以了解 1-----软件反编译更新去除的几种常…

经典游戏案例:仿植物大战僵尸

学习目标&#xff1a;仿植物大战僵尸核心玩法实现 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Random UnityEngine.Random;public enum…

CSS打印设置页眉页脚

之前写过一篇文章CSS实现自动分页打印同时每页保留重复的自定义内容&#xff0c;可以实现window.print()打印时多张页面保留相同的内容&#xff08;如header、footer&#xff09;&#xff0c;但其并不是真正意义上的页眉页脚&#xff0c;footer内容在最后一张页面未撑满时不能置…

Java高级重点知识点-12-Collection、iterator迭代器、泛型

文章目录 Collection集合Iterator迭代器泛型&#xff08;难点&#xff09; Collection集合 集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 集合框架 单列集合java.util.Collection双列集合java.util.Map 集合类继承体系图&#xff1a; List集合的特点&am…

【大数据】大数据的核心特征与挑战:Volume、Velocity、Variety、Veracity

目录 Volume&#xff1a;海量数据的挑战与机遇 挑战 技术挑战 机遇 Velocity&#xff1a;数据处理的速度与实时性 挑战 技术挑战 机遇 Variety&#xff1a;数据类型的多样性与复杂性 挑战 技术挑战 机遇 Veracity&#xff1a;数据的真实性与质量控制 挑战 技术挑…

【Chapter7】虚拟存储系统,计算机操作系统教程,第四版,左万利,王英

文章目录 [toc]零、前言一、外存资源管理1.1 外存空间划分1.2 外存空间分配1.2.1 空闲块链(慢)1.2.2 空闲块表(UNIX)1.2.3 字位映像图 1.3 进程与外存对应关系 二、虚拟页式存储系统2.1 基本原理2.2 内存页框分配策略2.3 外存块的分配策略2.4 页面调入时机2.5 置换算法2.5.1 最…

Oracle详情数据库索引事务视图触发器分区发生死锁数据字典【Oracle】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

乐鑫ESP32-WROOM-32E模组设备低功耗控制方案,启明云端乐鑫代理商

在数字化浪潮的推动下&#xff0c;物联网&#xff08;IoT&#xff09;正迅速成为我们日常生活的一部分。而在这个领域中&#xff0c;ESP32-WROOM-32E模组以其卓越的性能和多功能性&#xff0c;成为了开发者和制造商的选择。 ESP32-WROOM-32E模组集成了ESP32-D0WD-V3芯片&#…

宝塔面板部署前端项目

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

重生奇迹MU 谁才是真正的全能职业

重生奇迹MU中&#xff0c;游戏的奥妙就在于职业的选择。不同职业间各有千秋&#xff0c;可远可近&#xff0c;全都是玩家们心中的全能职业。本文就将为你分析重生奇迹MU中的各个职业&#xff0c;为你解答谁才是真正的全能职业。 每次新开一个服务器时&#xff0c;玩家们总会纠结…

为什么不推荐在自动化测试中使用单例模式

简述 尽管在国内大量的代码中使用单例这种简单的方式&#xff0c;但在自动化测试过程中会导致很多问题。因此&#xff0c;在自动化测试中&#xff0c;不推荐使用单例模式。 什么是单例&#xff1f; 《设计模式&#xff1a;可复用面向对象软件的基础》一书&#xff08;通常被称为…

2024地理信息相关专业大学排名

在开始之前&#xff0c;不得不提一下今年福耀科技大学不能招生的遗憾&#xff0c;不知道明年是否能一切准备就绪开始招生呢&#xff1f; 如果这所大学能招生了&#xff0c;不知道它有没有地理信息相关专业呢&#xff1f; 言归正转&#xff0c;我们现在就基于公开资料&#xf…

vue:响应式原理解析,深入理解vue的响应式系统

一、文章秒读 vue的响应式系统核心有两个&#xff0c;简单描述就是&#xff1a; 1.在数据变化时重新render依赖相关函数&#xff08;组件&#xff09;。 2.在vue2和vue3中分别使用Object.defineProperty和Proxy进行对象属性的读写。 数据变化时&#xff1a; 二、什么是响应…

解决宝塔linux面板 - 404 Not Found(Nginx)方法

宝塔Linux面板后台登录提示404 Not Found Nginx如何解决&#xff1f;码笔记&#xff1a;这是因为BT面板丢失了安全登录入口&#xff0c;如下图&#xff1a; 宝塔404 Not Found nginx 解决方法&#xff1a; 1、先SSH远程服务器 2、然后执行命令 bt 14 重新获取宝塔面板URL地址安…

Linux安装frp实现内网穿透

Linux运维工具-ywtool 目录 一. 简介二.代理类型三.frp支持的Linux的架构四.安装1.准备工作2.配置frp服务器端(a)下载安装包(b)解压安装包(c)修改配置文件(d)启动服务端 3.配置frp客户端(a)下载安装包并修改配置文件(b)启动客户端 4.测试连接 五.其他1.多端口穿透(a)服务端(b)客…

wireshark工具获取设备IP地址

背景&#xff1a; 一个网口抓包工具&#xff0c;主要是升级XX设备时候不知道网口的ip地址。每次需要一个一个试&#xff0c;比较麻烦。 使用步骤&#xff1a; 1、连接好XX设备与笔记本&#xff0c;在网络连接里面找到以太网&#xff0c;没有出现红色X号&#xff0c;表示网线连…

【道合顺展会预告】2024国际传感器仪器仪表物联网长沙展览会!

传感器技术作为万物互联的基石&#xff0c;正以前所未有的速度驱动着全球各行各业的转型升级。在此背景下&#xff0c;2024国际传感器&仪器仪表&物联网展览会将于6月28日至30日在长沙盛大启幕&#xff0c;道合顺传感将携公司最新技术及科研成果参加展览会&#xff0c;并…

数据库自动备份到gitee上,实现数据自动化备份

本人有个不太好的习惯&#xff0c;每次项目的数据库都是在线上创建&#xff0c;Navicat 连接线上数据库进行处理&#xff0c;最近有一个项目需要二次升级&#xff0c;发现老项目部署的服务器到期了&#xff0c;完蛋&#xff0c;数据库咩了&#xff01;&#xff01;&#xff01;…