一、研究背景
在现代零售业中,超市作为顾客日常消费的重要场所,承担着提供各种商品和服务的角色。随着数字化和电子商务的快速发展,消费者需求日益多样化,零售业竞争愈发激烈,了解消费者的购物行为、偏好、和消费模式成为超市经营和管理的关键因素之一。利用数据分析方法对超市销售数据进行挖掘和研究,不仅可以揭示顾客的购买倾向,还能帮助零售商优化库存管理、提升顾客满意度和服务质量、制定有效的营销策略,从而提高整体竞争力。
超市销售数据集捕获了各类商品的详细交易信息,包括产品种类、价格、数量、收入等。此外,该数据还记录了顾客的性别、会员身份及支付方式等人口统计数据,为我们进一步分析消费者行为和超市运营模式提供了宝贵的资料。在数据驱动的今天,运用Python进行数据处理、可视化分析已成为洞察客户需求、优化业务策略的重要手段。因此,本次研究旨在基于Python的数据分析工具,对超市销售数据进行深入挖掘和分析,为优化超市经营策略提供依据。
二、研究结论
本研究具有以下几方面的现实意义:
-
优化库存管理:通过分析不同产品线的销售情况,我们可以预测不同商品的需求变化趋势,从而帮助超市更合理地分配库存资源,避免因商品短缺或积压带来的经济损失。
-
提升顾客满意度:通过分析顾客的购买习惯和偏好(如性别、会员类型、产品线偏好),可以更好地理解顾客需求,从而定制个性化的营销活动和服务体验,提升顾客的忠诚度和满意度。
-
制定精准的营销策略:通过分析各城市分店的销售情况和不同支付方式的偏好,可以有效帮助超市制定区域性的营销策略,优化广告投入、会员活动等资源,提升销售转化率。
-
提升销售业绩和利润:通过分析单价与总收入、毛利率等财务指标之间的关系,可以识别利润较高的商品类别,帮助超市在经营过程中重点推广这些商品,从而提升整体利润率。
-
数据驱动的决策支持:本研究通过多种数据可视化手段(如直方图、热力图、词云等)将复杂的数据直观地展示出来,为超市管理层提供了基于数据的科学决策依据,减少主观决策的风险,提高决策的准确性。
三、实证分析
超市销售数据集捕获超市的详细交易数据,包括产品类别、单价、数量和总收入。它还记录客户人口统计数据,如性别、付款方式和会员类型。
特征
发票 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”词云有助于突出对销售贡献最大的关键产品。颜色的多样性强调了销售中的产品多样性。总的来说,它是一个一目了然地掌握主要趋势的有效工具。
四、研究结论
在本次超市销售数据的分析和可视化过程中,我们通过对产品类别、销售区域、支付方式和客户属性的深入探讨,得出了以下结论:
-
产品销售表现:
不同产品类别的销售表现有显著差异。时尚配饰和食品饮料等产品类别销售额较高,而健康美容产品的销售表现相对较弱。通过观察不同产品类别的销售情况,可以帮助超市了解顾客需求并优化商品库存。 -
城市销售差异:
仰光、内比都和曼德勒三个城市的总收入差距不大,但各个城市在特定产品线的需求有所差异。这种地理差异揭示了各城市的消费偏好,为地区化的市场推广策略提供了参考。 -
客户类型和支付方式:
会员客户的购买频率和单笔消费金额普遍高于普通客户,这表明会员计划对于吸引顾客重复消费具有积极作用。此外,现金支付是最常用的支付方式,其次是信用卡和电子支付。了解支付偏好可以帮助超市在不同的支付方式上提供针对性优惠,提升顾客的购物体验。 -
性别消费差异:
男性和女性顾客在产品类别上的消费有所不同。男性顾客在健康美容和运动旅游产品上消费较多,而女性顾客则偏向于食品饮料产品。这种性别差异能够帮助超市优化产品的陈列及促销策略。 -
时间维度的消费趋势:
通过分析交易的日期和时间发现,周末和工作日的销售额存在差异,且高峰购物时段集中在下午至傍晚。此发现可以帮助超市在特定时段和日期进行更有效的促销活动,提升销售额。 -
单价与毛收入关系:
单价与毛收入呈现正相关关系,表明在价格较高的商品上,超市能够获得更高的毛利。这一发现可以帮助超市在定价策略上做出调整,合理提升某些商品的单价以增加盈利。
总结: 本次分析的发现提供了关于顾客行为和销售模式的深入洞察。超市可以利用这些洞察,在商品组合、库存管理、市场推广以及顾客忠诚度计划上做出更有针对性的决策,以实现销售提升和顾客满意度的提高。同时,数据分析和可视化手段有效地传递了复杂的信息,便于管理层快速理解并据此做出数据驱动的决策,最终为企业的运营优化和长期增长提供支持。
标签:数据分析,plt,字体大小,Python,单价,sales,超市,可视化,fontsize From: https://blog.csdn.net/m0_62638421/article/details/143636665