这是教你如何在 Microsoft Excel 中使用 Python 代码以可视化方式分析数据的博客文章系列中的第三篇。
如果您是 Python 在 Excel 中的新手,您应该从我的 Python for Excel Analysts 博客系列开始,该系列涵盖了本博客系列中将假设的许多概念。
本系列将使用 Microsoft Excel Labs Python 编辑器 来编写代码。但是,Python 编辑器不是必需的。所有代码都可以使用公式栏和新的 PY() 函数 输入。
本系列中的每篇文章都附带一个可供下载和使用的 Microsoft Excel 工作簿,以帮助您提升技能。本篇文章的工作簿可供 在此处下载。
为了方便起见,以下是本系列中所有博客文章的链接
- 第 1 部分 - 使用直方图
- 第 2 部分 - 使用箱线图
- 第 3 部分 - 使用散点图(本篇文章)
- 第 4 部分 - 使用条形图
- 第 5 部分 - 使用折线图
注意:要重现本篇文章中的示例,请 安装 Python in Excel 试用版。如果您喜欢这个博客系列,请查看我的自定进度的认证课程,Anaconda Certified: Data Analysis with Python in Excel。
介绍散点图
业务分析中常见的场景是调查两个度量之间是否存在某种关系,例如,广告支出和销售之间的关系。
换句话说,就是两列数字之间的关系。
正如之前文章中所述,如果列很小,则可以可视化地检查数字列。但是,当列变得更大时,数字数据的可视化检查很快就会失效。
使用 散点图 可视化两列数字可以实现以下目标
- 它允许您的分析扩展到大型数字列。
- 数据中的模式和关系更容易检测和分析。
一个人为的例子
以下数据集合是一个人为的例子:
图 01 - 人为数字数据的示例
图 01 中显示的数据结构如下
- 每一行代表某个时期(例如,月份)。
- 每个时期的冰淇淋销量和鲨鱼袭击次数都已记录在案。
虽然图 01 描述了一个可以使用数据可视化检查并得出一些见解的场景,但本篇文章后面的示例将演示散点图的强大功能。
您的第一个散点图
Python seaborn 库 提供了多种基于散点图的可视化效果。以下代码将图 01 中显示的 Excel 表格加载为 pandas DataFrame,然后将数据可视化为散点图
图 02 - 散点图的 Python 代码
注意:虽然上面的 Python 代码是使用 Excel Labs Python 编辑器编写的,但这并不是必需的。
图 02 中显示的代码利用了 seaborn scatterplot() 函数,可视化配置如下
- shark_attacks DataFrame 是 data 源。
- 冰淇淋销量 列映射到 x 轴。
- 鲨鱼袭击 列映射到 y 轴。
最后,set_title() 方法 为散点图添加了标题。
通过单击 Python 代码编辑器中单元格的向下箭头,使用 转换为 Excel 值 选项配置代码单元格。选择此选项将在工作表单元格内渲染散点图
图 03 - 在工作表单元格内渲染散点图
单击磁盘图标会告诉 Python 代码编辑器执行 Python 代码
图 04 - 执行 Python 代码
图 02 中显示的代码会生成以下散点图
图 05 - 鲨鱼袭击次数与冰淇淋销量的散点图
图 05 中的每个点代表图 01 中数据表中的一行。
介绍相关性
当使用散点图以可视化方式分析数字数据时,主要目标是识别数字列之间的任何 相关性。
相关性是统计学中的一个重要概念,它有几个数学定义。虽然了解相关性的基础数学知识很有用,但本篇文章将采用一种直观的理解相关性的方法。
首先,让我们了解相关性的三种基本形式。
正相关
相关性的第一种形式是数据中的一种关系,即一列的值越大,第二列的值也越大。
当这种关系存在于您的数据中时,称为正相关。
通常,通过可视化检查散点图可以明显地看出正相关。其他时候,它并不那么明显。
seaborn 库提供了用于创建带趋势线的散点图的 regplot() 函数。为散点图添加趋势线通常很有用
图 06 - 带趋势线的散点图的 Python 代码
图 06 中显示的代码与图 02 中的代码非常相似。显著的差异在于使用 line_kws 参数将趋势线的样式设置为虚线。
图 06 中显示的 Python 代码编辑器单元格已使用 转换为 Excel 值 选项进行配置。执行代码会生成以下可视化效果
图 07 - 带趋势线的散点图
如图 07 所示,数据显示出正相关。随着 冰淇淋销量 的值越来越大,鲨鱼袭击次数 的值也越来越大。
图 07 还提供了对数据的另外一种见解 - 趋势线与散点图中的每个点相交。当这种情况发生时,数据被称为完全相关。
查看图 07 时,直观的理解是,基于提供有限的数据集,您可以 100% 准确地根据 冰淇淋销量 的值预测 鲨鱼袭击次数。
换句话说,随着散点图中的数据点越来越接近趋势线,相关性就越强。
负相关
相关性的第二种形式是数据中的一种关系,即一列的值越大,第二列的值越小。
当这种关系存在于您的数据中时,称为负相关。
请考虑以下散点图
图 08 - 负相关的示例
检查图 08 中显示的数据的性质,关系是直观的 - 随着 每日温度 的升高,每月能源账单 降低(即,使用的能源更少)。
将图 08 中显示的数据点与图 07 中的数据点进行比较。注意图 08 中的趋势线如何接近数据点,但只与其中一个点相交?
与图 07 不同,图 08 中的数据高度相关,但不是完全相关。更准确地说,图 08 中的数据是高度负相关。
再次,直观的理解是基于能够根据另一个值预测一个值。
例如,使用提供有限的数据集,了解 每日温度 可以让您对 每月能源账单 的值做出相当准确的预测。
注意:正相关与负相关只指的是数字列之间的关系性质,而不是关系的质量(即,负不意味着“不好”)。
无相关
相关性的最后一种形式是,数字列的值之间没有明显的关系。
请考虑以下散点图
图 09 - 无相关的示例
图 09 中显示的数据是人为的,可以肯定,但它演示了一个重要的概念 - X 值 和 Y 值 之间没有预测关系。
例如,当 X 值等于 1.00 时,Y 值可以是 1.00、2.00、3.00、4.00 或 5.00。这种缺乏预测关系体现在趋势线中 - 它是水平的。
弱相关
值得注意的是,相关性是一个连续谱。一般来说
- 趋势线越陡峭,无论是正的还是负的,相关性就越强。
- 趋势线越平坦,相关性就越弱。
请考虑以下散点图。趋势线已变为实心黑线,以增强可见度
图 10 - 非常弱相关的示例
查看图 10 时,请思考趋势线的斜率以及使用此数据集进行预测的准确性。
趋势线的斜率并非水平线。其斜率很小。这意味着两列数字之间只有极其微弱的关系。
换句话说,预测关系很糟糕。
相关性分析
在使用相关性分析数据时,最重要的是要记住:相关性不等于因果关系。
基本概念是,两列数字高度相关并不意味着一列数字会导致另一列数字发生变化。
例如,图 07 显示了冰淇淋销量和鲨鱼袭击之间存在完美的正相关性。然而,假设冰淇淋销量会导致鲨鱼袭击是荒谬的!
这就是在商业分析中将相关性与预测精度联系起来思考很重要的原因。虽然相关性不等于因果关系,但预测关系却非常有用。
分析经销商订单
假设您正在分析促销策略的执行情况,并拥有以下数据集
图 11 - 经销商订单数据集
分析的合理起点是查看折扣金额与利润之间的关系(即相关性)。
当前数据集不包含利润。以下代码将 Excel 表格加载为pandas DataFrame 并添加利润列。
图 12 - 用于设计利润特征的 Python 代码
执行图 12 中显示的代码将生成更新后的reseller_orders DataFrame
图 13 - 更新后的 reseller_orders DataFrame
更新后的 DataFrame 允许对利润按折扣金额进行相关性分析。
利润按折扣金额的相关性
以下 Python 代码为reseller_orders DataFrame 创建一个带有趋势线的散点图
图 14 - 用于创建带有趋势线的散点图的 Python 代码
图 14 中显示的代码与之前的示例不同,因为它使用了ci参数。ci参数控制在趋势线周围显示的置信区间的大小。
在幕后,趋势线是从数据集中创建的线性回归预测模型。当数据不显示完美的相关性时,趋势线模型的预测将不完美。
置信区间提供了一种直观的指示,表明趋势线模型的误差水平。图 14 中的代码配置散点图不显示置信区间。
图 14 中显示的 Python 代码编辑器单元格配置了转换为 Excel 值选项。执行代码将生成以下可视化结果
图 15 - 利润按折扣金额的散点图
查看图 15 可以发现以下结果
- 总体而言,折扣金额与利润之间存在很强的负相关性。
- 根据可视化结果中左上角的数据点云,对于非常低的折扣金额值,预测关系并不强。
- 然而,当折扣金额超过约 2,500 美元时,所有订单似乎都存在负利润额。
如前所述,这种相关性分析不应该假设折扣金额会导致利润。然而,这种高度预测性的关系无疑值得进一步分析。
利润按折扣金额和销售区域组的相关性
深入研究利润按折扣金额的相关性的一个例子是调查某些地理区域是否可能表现出更高/更低的盈利/亏损订单倾向。
reseller_orders DataFrame 具有一个SalesTerritoryGroup列,其中包含以下分类值
- 欧洲
- 北美
- 太平洋
以下代码创建了利润按折扣金额和SalesTerritoryGroup的散点图
图 16 - 用于创建带有分类数据的散点图的 Python 代码
图 16 中的代码使用hue参数根据SalesTerritoryGroup的值对散点图数据点进行颜色编码。
图 16 中显示的 Python 代码编辑器单元格配置了转换为 Excel 值选项。执行代码将生成以下可视化结果
图 17 - 利润按折扣金额和销售区域组的散点图
查看图 17 的散点图可以发现以下结果
- 在北美地区下的订单数量远超其他地理区域。
- 在利润最低的订单中,大部分来自北美。
图 15 和图 17 的组合产生了需要额外分析的问题。两个例子
- 除了折扣金额之外,还有哪些其他因素(例如,处理过剩库存)会影响利润?
- 地理区域之间是否存在真正影响利润的差异?例如,与加拿大销售相比,美国销售在北美地区的利润率是否低得多?
下一步做什么?
本文展示了如何使用散点图进行相关性分析,这是一个强大的工具,用于在数字列之间构建见解。
不出所料,相关性分析是数据分析师工具箱中必不可少的工具。
本系列中的下一篇文章将改变方向,介绍如何对商业分析中最常见的类型之一的数据进行可视化分析 - 诸如产品线和地理区域之类的类别。
敬请期待,愿您数据挖掘愉快!