首页 > 编程语言 >Python数据分析-超市销售数据分析和可视化

Python数据分析-超市销售数据分析和可视化

时间:2024-11-11 09:14:38浏览次数:3  
标签:数据分析 plt 字体大小 Python 单价 sales 超市 可视化 fontsize

一、研究背景

在现代零售业中,超市作为顾客日常消费的重要场所,承担着提供各种商品和服务的角色。随着数字化和电子商务的快速发展,消费者需求日益多样化,零售业竞争愈发激烈,了解消费者的购物行为、偏好、和消费模式成为超市经营和管理的关键因素之一。利用数据分析方法对超市销售数据进行挖掘和研究,不仅可以揭示顾客的购买倾向,还能帮助零售商优化库存管理、提升顾客满意度和服务质量、制定有效的营销策略,从而提高整体竞争力。

超市销售数据集捕获了各类商品的详细交易信息,包括产品种类、价格、数量、收入等。此外,该数据还记录了顾客的性别、会员身份及支付方式等人口统计数据,为我们进一步分析消费者行为和超市运营模式提供了宝贵的资料。在数据驱动的今天,运用Python进行数据处理、可视化分析已成为洞察客户需求、优化业务策略的重要手段。因此,本次研究旨在基于Python的数据分析工具,对超市销售数据进行深入挖掘和分析,为优化超市经营策略提供依据。

二、研究结论

本研究具有以下几方面的现实意义:

  1. 优化库存管理:通过分析不同产品线的销售情况,我们可以预测不同商品的需求变化趋势,从而帮助超市更合理地分配库存资源,避免因商品短缺或积压带来的经济损失。

  2. 提升顾客满意度:通过分析顾客的购买习惯和偏好(如性别、会员类型、产品线偏好),可以更好地理解顾客需求,从而定制个性化的营销活动和服务体验,提升顾客的忠诚度和满意度。

  3. 制定精准的营销策略:通过分析各城市分店的销售情况和不同支付方式的偏好,可以有效帮助超市制定区域性的营销策略,优化广告投入、会员活动等资源,提升销售转化率。

  4. 提升销售业绩和利润:通过分析单价与总收入、毛利率等财务指标之间的关系,可以识别利润较高的商品类别,帮助超市在经营过程中重点推广这些商品,从而提升整体利润率。

  5. 数据驱动的决策支持:本研究通过多种数据可视化手段(如直方图、热力图、词云等)将复杂的数据直观地展示出来,为超市管理层提供了基于数据的科学决策依据,减少主观决策的风险,提高决策的准确性。

三、实证分析

完整代码和数据

超市销售数据集捕获超市的详细交易数据,包括产品类别、单价、数量和总收入。它还记录客户人口统计数据,如性别、付款方式和会员类型。

特征
发票 ID:每笔交易或购买的唯一标识符。这通常是字符串或字母数字代码。
Branch:表示发生交易的超市的特定分店。这可以是分类的(例如,“A”、“B”、“C”)。
City:超市分店所在的城市。这也是分类的,有助于地理分析。
客户类型:定义客户的类型(例如,“成员”或“普通”)。这对于细分和了解购买行为可能很有用。
性别: 客户的性别(例如,“男性”或“女性”)。这对于人口统计分析非常有用。
Product Line: 指定所购商品的分类(例如,“杂货”、“服装”、“电子产品”)。这有助于产品性能分析。
单价: 单件商品的价格。这是一个连续的数值。
数量: 在单笔交易中购买的商品数量。这也是一个连续的数值。
税 5%:适用于购买的税额,计算为税前总额的 5%。这是一个连续的数值。
总计:买家支付的总金额(含税)。这是一个连续的数值。
Date:交易的日期,有助于时间序列分析。格式通常为 YYYY-MM-DD。
Time:交易的时间,可用于分析购物高峰时段。
付款:使用的付款方式(例如,“现金”、“信用卡”、“借记卡”)。这是分类的,并提供对付款偏好的见解。
COGS:销货成本,代表生产所售商品的总成本。这是一个连续的数值。
毛利率百分比: 销售额与销售成本之间的百分比差异,表示销售的盈利能力。
Gross Income(总收入):从总销售额中扣除销售商品成本后剩余的收入。这是一个连续的数值。
评分:客户对产品或服务的评分,通常采用等级(例如,1 到 5)。这有助于了解客户满意度。

导入数据分析的包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['KaiTi']  #中文
plt.rcParams['axes.unicode_minus'] = False   #负号
%matplotlib inline
import seaborn as sns
import plotly.express as px
from wordcloud import WordCloud
colors = ["#e9c46a","#2a9d8f","#264653"]

读取数据

sales = pd.read_csv("supermarket_sales.csv")

sales.head()

为了检查行数和列数,我们使用 shape 函数

描述性统计分析

sales.describe()

从上面的统计描述中,我们可以看到所有列的列数、平均值、标准差、最小值、最大值和四分位数 。如果我们为 describe 函数添加 include='all' 参数,我们也将获得分类列的摘要,不存在的值将用 Nan 表示:

查看数据结构

使用 columns 函数要获取列的名称

sales.columns

 数据清洗

sales.isnull().sum()

正如我们所看到的,没有 null 值。
如果我们有 null 值,我们将使用 dropna(inplace=True) 从 DataFrame 中永久删除具有 NaN 值的行。
为了填充 null 值,我们使用 fillna(0, inplace = true),用 '0' 填充 null 值。
我们还可以用平均值/中位数或列中最常见的值填充 null 值
要用平均值填充缺失值,我们使用 df['column_name'].fillna(df['column_name'].mean())
要使用最频繁的值填充缺失值,我们使用 df['column_name'].fillna(df['column_name'].mode()[0])

探索性数据分析
分布形状
偏度:测量分布的不对称性。

正偏斜:右侧 尾部较长。
负偏斜:尾部在左侧较长。

skewness = sales['Total'].skew()

outlier_identifier = sales['Total'].kurtosis()

色散度量
一些函数,如 mean()、median()、var()、std()、sum() 给出列的统计值

total_gross_income = sales['gross income'].sum().round(4)
average_sales = round(sales['Total'].mean(), 2)  # 使用round函数对平均值进行四舍五入
meadin_unit_price = sales['Unit price'].median()
var_of_rating = sales['Rating'].var()
std_of_rating = sales['Rating'].std()

 
检测异常值包括计算 quartile1 和 quartile3。
四分位数范围是 Q3 与 Q1 之间的差异
位于任何四分位数之后 IQR 的 1.5 倍的点称为异常值 

Q1 = sales['Income'].quantile(0.25)
Q3 = sales['Income'].quantile(0.75)
IQR = Q3 - Q1

outliers = sales[(sales['Income'] < Q1 - 1.5 * IQR) | (sales['Income'] > Q3 + 1.5 * IQR)]
outliers

 可视化

plt.figure(figsize=(8, 4), dpi=200)
# 绘制箱线图,数据为sales数据框中的'Income'列
sns.boxplot(y=sales['Income'], palette='Set3')
# 设置图形标题为“收入的箱线图展示”(中文标题)
plt.title('收入的箱线图展示')
# 自动调整子图参数,以适应图形
plt.tight_layout()
# 显示图形
plt.show()

 通过相关性热力图探索数据关系

plt.figure(figsize=(10, 6), dpi=200)
# 绘制热力图,数据为 correlation_matrix,显示注释,使用'coolwarm'颜色映射,设置线条宽度为 0.5
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
# 设置图形标题为“通过相关性热力图探索数据关系”(中文标题)
plt.title('通过相关性热力图探索数据关系')
# 自动调整子图参数,以适应图形
plt.tight_layout()
# 显示图形
plt.show()

 Tax 5%、Total、Cogs、gross Income 和 Income 完全相关,表明冗余。数量与财务指标呈正相关 (~0.71),表明数量越多,收入就越高。评级显示相关性较弱,这意味着它对财务指标的影响很小。单价与收入相关特征呈适度相关性 (~0.63)。应删除冗余特征以防止多重共线性。

 绘制所有直方图

这些直方图显示数值变量的分布,揭示偏度、值集中度和均匀性等模式。关键见解包括总计、成本和收入向较低值倾斜,以及毛利率百分比的最小变化。

回归图 - 不同单价的总收入趋势
该图表是比较 Unit Price(在 x 轴上)和 Gross Income(在 y 轴上)的散点图。它包括一条拟合回归线,指示两个变量之间存在正相关。

# 设置图形大小为宽度 8 单位,高度 6 单位,分辨率为 200dpi
plt.figure(figsize=(8, 6), dpi=200)
# 绘制回归图,x 轴为'Unit price',y 轴为'gross income',数据来自 sales,颜色为'#46f00a'
sns.regplot(x='Unit price', y='gross income', data=sales, color='#46f00a', scatter_kws={'s': 50}, line_kws={'lw': 2})
# 设置 x 轴标签,字体大小为 15
plt.xlabel('单价', fontsize=15)
# 设置 y 轴标签,字体大小为 15
plt.ylabel('毛收入', fontsize=15)
# 设置标题为“单价与毛收入关系图”,字体大小为 15
plt.title('单价与毛收入关系图', fontsize=15)
# 显示图形
plt.show()

 

正相关:随着单价的上涨,总收入也趋于上升,这表明存在直接关系。
线性趋势:回归线表示线性关系,意味着总收入与单价成比例增加。
数据变化:尽管这些点分布广泛,尤其是在价格较高时,但总体趋势保持不变。
Clusters:有几个单价较低的集群,表明此价格范围内的交易或观察更频繁。 

接下来创建条形图,我们将能够识别客户数量最多的城市,并且可以实施我们的营销策略,以最少的客户数量提高城市中的客户群
将 Cityname 与 Total earnings 分组并将其分配给 bar_plot 数据

import matplotlib.pyplot as plt

# 设置图形大小为宽度 8 单位,高度 5 单位,分辨率为 200dpi
plt.figure(figsize=(8, 5), dpi=200)

# 提取数据中的城市名称和总收入数据
cities = bar_data['City']
total_earnings = bar_data['Total']

# 选择一种漂亮的颜色序列,这里假设 colors 是一个合适的颜色列表
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b']

# 绘制柱状图,城市为 x 轴,总收入为 y 轴,使用特定颜色
plt.bar(cities, total_earnings, color=colors)

# 在柱状图上方添加数值标签
for i, value in enumerate(total_earnings):
    plt.text(i, value + 100, str(value), ha='center', va='bottom', fontsize=10)

# 设置标题为“各城市总收入柱状图”
plt.title('各城市总收入柱状图', fontsize=16)

# 设置 x 轴标签为“城市名称”,字体大小为 12
plt.xlabel('城市名称', fontsize=12)

# 设置 y 轴标签为“总收入”,字体大小为 12
plt.ylabel('总收入', fontsize=12)

# 显示图形
plt.show()

 此条形图显示了三个城市的总收入。内比都的收入最高(110,568.71),略高于仰光(106,200.37)和曼德勒(106,197.67),表明城市之间的差异很小。

条形图 - 可视化与产品类型相关的基于性别的比较
此图有助于分析不同商品品类中基于性别的支出模式,从而揭示针对性营销策略的洞察。它还突出了定价趋势和可变性,指导业务决策。

import matplotlib.pyplot as plt
import seaborn as sns
# 设置图形大小为宽度 12 单位,高度 6 单位,分辨率为 200dpi
plt.figure(figsize=(12, 6), dpi=200)
# 绘制柱状图,x 轴为'Product line'(产品类型),y 轴为'Unit price'(单价),根据'Gender'(性别)进行分类
barplot = sns.barplot(x='Product line', y='Unit price', hue='Gender', data=sales, palette=['#4c72b0', '#cc6666'])
# 设置 x 轴标签为“产品类型”,字体大小为 15
plt.xlabel('产品类型', fontsize=15)
# 设置 y 轴标签为“单价”,字体大小为 15
plt.ylabel('单价', fontsize=15)
# 设置图例标题为“性别”,位置在右上角
plt.legend(title='性别', loc='upper right')
# 设置标题为“基于性别的产品类型单价对比可视化”,字体大小为 15
plt.title('基于性别的产品类型单价对比可视化', fontsize=15)
# 自动调整子图参数,以适应图形
plt.tight_layout()
# 显示图形
plt.show()

 男性倾向于在健康和美容以及运动和旅游产品上花费更多,而女性在食品和饮料上的支出略高。时尚配饰吸引了男女同等的兴趣,单价最高。电子产品和家居与生活方式反映了均衡的支出。
误差线表示不同产品类型的一致性可变性,没有重大异常值。

可视化与产品类型相关的基于城市的比较
创建此热图是为了比较三个城市中不同产品类型的数量,从而清楚地了解产品分布如何随位置而变化。它有助于确定哪些城市在特定类别中的代表性较高或较低。

创建 swarm 图

这里是为了直观地比较不同产品类型和城市的单价分布,突出显示每个类别内的价格变化。它允许以清晰、不重叠的方式轻松识别模式、异常值和城市之间的差异。 

g = sns.catplot(x='Product line', y='Unit price', hue='City', kind='swarm', data=sales, aspect=2.5, palette='Set2', height=6)

# 设置 x 轴标签为“产品类型”,字体大小为 16
plt.xlabel('产品类型', fontsize=16)

# 设置 y 轴标签为“单价”,字体大小为 16
plt.ylabel('单价', fontsize=16)

# 设置标题为“基于城市的产品类型单价对比可视化”,字体大小为 18
plt.title('基于城市的产品类型单价对比可视化', fontsize=18)

# 设置图例标题为“城市”,位置在右上角,字体大小为 14
plt.legend(title='城市', loc='upper right', fontsize=14)

# 设置图形分辨率为 300dpi
plt.gcf().set_dpi(300)

# 显示图形
plt.show()

在上面的 Swarm 图中,如果我保持 jitter = False,将导致数据点重叠,从而更难看到单个点和整体分布。抖动有助于分散各个点,以获得更好的清晰度和可视化效果。

从上面的热图和蜂群图可以明显看出,仰光、内比都和曼德勒三个城市不同产品类型的单价。
每个城市都用颜色编码,蓝色代表仰光,橙色代表内比都,绿色代表曼德勒。
“Health and beauty” 和 “Food and beverages” 等产品的单价差异更大,从 20 件左右到 100 多件不等。就大多数商品类型的总体价格分布而言,城市之间没有显著差异,这表明不同城市之间的价格是一致的。但是,在特定分类(如“电子配件”)中可能会注意到细微的差异。

 可视化 Branch 对特定产品类型的销售效果更好
生成此热图是为了可视化三个分支(A、B 和 C)的不同产品线(例如,电子配饰、时尚配饰)的销售分布。它有助于确定哪些分支在特定产品类别中表现出色。

分公司 A 在家居和生活方式产品方面处于领先地位,而分公司 C 在时尚配饰和食品和饮料方面处于领先地位。
细分 B 在大多数商品类型中表现均衡,尤其是在体育和旅游领域。
健康和美容品的销售额总体上最低,其中分店 A 在该品类中的销售额最少。
不同的分支在不同的产品线中表现出色,这表明每个分支都有专门的产品偏好。 

以 Word Cloud 的形式可视化产品线
创建此词云是为了直观地表示销售数据中最常见的产品线。它允许快速、直观地了解哪些产品线更突出。

# 设置图形大小为宽度 15 单位,高度 6 单位,分辨率为 300dpi
plt.figure(figsize=(15, 6), dpi=300)

# 生成词云,设置背景颜色为白色,宽度为 1920,高度为 1080,使用'viridis'颜色映射
wordcloud = WordCloud(
    background_color='white',
    width=1920,
    height=1080,
    colormap='plasma',  # 选择一个更鲜艳的颜色映射
    contour_color='steelblue',  # 添加一个轮廓颜色
    contour_width=2
).generate(" ".join(sales['Product line']))

# 显示词云
plt.imshow(wordcloud, interpolation='bilinear')

# 设置标题为“产品类型词云图”,字体大小为 22,顶部边距为 30
plt.title('产品类型词云图', fontsize=22, pad=30)

# 关闭坐标轴
plt.axis('off')

# 保存图像为高清格式
plt.savefig('colored_wordcloud_hd.png', dpi=300)

# 显示图形
plt.show()

 较大的单词表示数据集中更受欢迎的产品线。例如图中的“Fashion accessories”词云有助于突出对销售贡献最大的关键产品。颜色的多样性强调了销售中的产品多样性。总的来说,它是一个一目了然地掌握主要趋势的有效工具。

四、研究结论

在本次超市销售数据的分析和可视化过程中,我们通过对产品类别、销售区域、支付方式和客户属性的深入探讨,得出了以下结论:

  1. 产品销售表现

    不同产品类别的销售表现有显著差异。时尚配饰和食品饮料等产品类别销售额较高,而健康美容产品的销售表现相对较弱。通过观察不同产品类别的销售情况,可以帮助超市了解顾客需求并优化商品库存。
  2. 城市销售差异

    仰光、内比都和曼德勒三个城市的总收入差距不大,但各个城市在特定产品线的需求有所差异。这种地理差异揭示了各城市的消费偏好,为地区化的市场推广策略提供了参考。
  3. 客户类型和支付方式

    会员客户的购买频率和单笔消费金额普遍高于普通客户,这表明会员计划对于吸引顾客重复消费具有积极作用。此外,现金支付是最常用的支付方式,其次是信用卡和电子支付。了解支付偏好可以帮助超市在不同的支付方式上提供针对性优惠,提升顾客的购物体验。
  4. 性别消费差异

    男性和女性顾客在产品类别上的消费有所不同。男性顾客在健康美容和运动旅游产品上消费较多,而女性顾客则偏向于食品饮料产品。这种性别差异能够帮助超市优化产品的陈列及促销策略。
  5. 时间维度的消费趋势

    通过分析交易的日期和时间发现,周末和工作日的销售额存在差异,且高峰购物时段集中在下午至傍晚。此发现可以帮助超市在特定时段和日期进行更有效的促销活动,提升销售额。
  6. 单价与毛收入关系

    单价与毛收入呈现正相关关系,表明在价格较高的商品上,超市能够获得更高的毛利。这一发现可以帮助超市在定价策略上做出调整,合理提升某些商品的单价以增加盈利。

总结: 本次分析的发现提供了关于顾客行为和销售模式的深入洞察。超市可以利用这些洞察,在商品组合、库存管理、市场推广以及顾客忠诚度计划上做出更有针对性的决策,以实现销售提升和顾客满意度的提高。同时,数据分析和可视化手段有效地传递了复杂的信息,便于管理层快速理解并据此做出数据驱动的决策,最终为企业的运营优化和长期增长提供支持。

标签:数据分析,plt,字体大小,Python,单价,sales,超市,可视化,fontsize
From: https://blog.csdn.net/m0_62638421/article/details/143636665

相关文章

  • 大数据项目-基于python实现的人才招聘数据分析与可视化平台
    《[含文档+PPT+源码等]精品基于python实现的人才招聘数据分析与可视化平台》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!数据库管理工具:phpstudy/Navicat或者phpstudy/sqlyog后台管......
  • [Python学习日记-65] 抽象类
    [Python学习日记-65]抽象类简介接口与归一化设计抽象类简介    抽象类是由继承演变而来的,他可以很好的规范子类当中的统一函数属性,在不同的语言当中也会有类似的用法,下面我们会先讲讲什么是接口与归一化设计,然后再介绍什么是抽象类,我们在Python当中应该如何使......
  • Django电影推荐系统 豆瓣电影 协同过滤推荐算法 Echarts可视化 爬虫 机器学习 大数据
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌>......
  • 大数据毕业设计:电影推荐系统 深度学习 协同过滤推荐算法 Python 爬虫 豆瓣电影 LSTM算
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌感兴趣的可以先收藏起来,点赞、关注不迷路✌1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅......
  • Python基于Flask的前程无忧招聘信息可视化系统【附源码,文档】
    博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • Python 6
    目录Python61.求第n项的斐波那契数列值【源代码】2.青蛙跳楼梯,每一次只能跳一个台阶或者两个台阶,注意,不允许倒退如果第N个台阶,请问有多少种跳法:【源代码】3.小明高考结束,成绩非常理想,父母为了奖励他,为他买了一对刚刚出生的兔子刚刚出生的免子经过4个月成长为成年的兔子......
  • 深度学习电影推荐系统 协同过滤推荐算法 大数据毕业设计 Python 爬虫 豆瓣电影 LSTM算
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌>......
  • 基于Python电影票房数据分析可视化系统 Flask框架 豆瓣电影票房 MySQL数据库 大数据毕
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌>......
  • Python pandas库:强大的数据处理工具
        在Python的数据处理领域,pandas库无疑是一颗璀璨的明星。它为数据分析和处理提供了高效、便捷的方法。一、pandas简介    pandas是一个用于数据处理和分析的Python库,提供了数据结构Series和DataFrame,使得数据的操作和分析变得更加容易。二、主要数据结构......
  • Python捕获与处理异常
        在Python中,异常处理是一种重要的机制,用于处理程序运行时可能出现的错误情况。对程序的异常捕获与处理,可增强程序稳定性、可读性与可维护性,实现优雅的错误恢复。一、异常的概念    异常是程序在运行过程中发生的错误或意外情况。当出现异常时,程序的正常执行......