在数据分析领域,统计学家喜欢与数字打交道以从原始数据中获得有价值的洞察,但在现实世界中,相关方是否对统计数据如此感兴趣?大多数情况下,答案会是直接的“不”。为了赋予知识和洞察以故事性,需要将其以数据可视化的形式呈现,即将数字数据转换为富有洞察力的图表/图形/图表。
本文将重点关注多维数据。在之前的文章中专门讨论了一维数据,因此在企业案例研究中关注N-D数据更为重要。
首先导入相关的库,如NumPy(处理数学计算)、pandas(DataFrame操作)、matplotlib(最接近Python解释器和“C”开发的可视化库)以及seaborn(建立在matplotlib之上,提供更多的选项和更好的外观和感觉)。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
为了探索更高维度的数据以及数据属性之间的关系,将加载文件Diabetes.csv。它来自Kaggle。
将在本文中使用两个数据集,一个是糖尿病患者数据集,另一个是人的身高和体重。在上面的输出中,可以使用head()方法看到第一个数据集的一瞥。
df_original = pd.read_csv("diabetes.csv")
#print(df_original.head())
cols = [c for c in df_original.columns if c not in ["Pregnancies", "Outcome"]]
df = df_original.copy()
df[cols] = df[cols].replace({0: np.NaN})
print(df.head())
从数据集中移除缺失或垃圾值始终是优先步骤。在这里,首先将0值替换为NaN,因为在特征列中有0作为坏数据。
df.info()
现在可以看到,在某些列中,有一些空值,如皮肤厚度、胰岛素、BMI等。
令人惊讶的是,没有人发现直接查看数据是有用的。通过使用head,可以看到该数据集使用0来表示没有值——除非有些不幸的人的皮肤厚度为0。
df.describe()
散点矩阵是确定多个数据集之间变量(主要是线性)关系的最好图表之一;当看到两个或更多变量之间的线性图时,表明这些特征之间存在高相关性,可以是正相关或负相关。
pd.plotting.scatter_matrix(df, figsize=(10, 10));
从上面的图表中,可以说,仅凭这个图表就非常具有描述性,因为它向展示了数据集中所有变量之间的线性关系。例如,可以看到皮肤厚度和BMI共享线性趋势。
注意:由于列名很大,在阅读时遇到了一些问题,尽管这可以改进(超出了文章的范围)。
df2 = df.dropna()
colors = df2["Outcome"].map(lambda x: "#44d9ff" if x else "#f95b4a")
pd.plotting.scatter_matrix(df2, figsize=(10,10), color=colors);
散点图为提供了沿对角线的直方图以及许多2D散点图。这不是一个对称矩阵,所以通常只查看对角线及其下方。可以看到一些变量有很多散点,一些是相关的(即,它们的散点有方向)。这引导了解另一种图表,即相关性图。
在深入讨论相关性图之前,首先需要了解相关性,因此使用pandas的corr()方法,它将返回两个数据输入之间的皮尔逊相关系数。简而言之,这些图表可以轻松量化哪些变量或属性彼此相关。
df.corr()
在seaborn或matplotlib支持的相关性图中,可以使用其颜色调色板和比例来比较变量之间的高相关性和低相关性。在上述图表中,颜色越浅,相关性越大,反之亦然。这个图表有一些缺点,将在下一个图表中摆脱这些缺点。
sb.set(rc={'figure.figsize':(11,6)})
sb.heatmap(df.corr());
现在,可以看到这是一个对称矩阵。但它立即允许指出最相关和最不相关的属性。有些可能只是常识——例如,怀孕与年龄——但有些可能给提供了对数据的真正洞察。
sb.heatmap(df.corr(), annot=True, cmap="viridis", fmt="0.2f");
在这里,还使用了一些参数,如annot=True,以便可以看到相关值和一些格式化。
2D直方图主要用于图像处理,显示图像中某个位置的像素强度。同样,也可以将其用于其他问题陈述,其中需要分析两个或更多变量作为二维或三维直方图,这提供了多维数据。
在本节的其余部分,将使用一个包含更多数据的不同数据集。
df2 = pd.read_csv("height_weight.csv")
df2.info()
df2.describe()
也使用一维直方图处理多维数据,但现在如果想要获得多个特征的数据分布,那么必须将重点转移到2D直方图上。在上述2D图表中,身高和体重相互绘制,保持C-MAP为magma。
plt.hist2d(df2["height"], df2["weight"], bins=20, cmap="magma")
plt.xlabel("Height")
plt.ylabel("Weight");
从2D直方图中获取信息有点困难,不是吗?图像中有很多噪音。如果尝试等高线图呢?将不得不自己对数据进行分箱。
当原始图表有一些缺点时,每个替代方案都会出现在画面中。同样,在2D直方图的情况下,从中获取信息变得有点困难,因为图中有很多噪音。因此,现在将使用等高线图。
hist, x_edge, y_edge = np.histogram2d(df2["height"], df2["weight"], bins=20)
x_center = 0.5 * (x_edge[1:] + x_edge[:-1])
y_center = 0.5 * (y_edge[1:] + y_edge[:-1])
plt.contour(x_center, y_center, hist, levels=4)
plt.xlabel("Height")
plt.ylabel("Weight");
现在可以看到,这个等高线图比复杂且嘈杂的2D直方图要好得多,因为它同时显示了身高和体重之间的清晰分布。仍然有改进的空间。如果使用seaborn中的KDE图,那么相同的等高线将被平滑,并且更清晰地提供信息。
从文章一开始,就主要关注多维数据的可视化,在这次旅程中,经历了所有重要的图表/图形,这些图表/图形可以从多个特征的数字数据中一次性获得业务相关的洞察。在最后一节中,将概述所有这些图表。
首先,介绍了一个散点矩阵,它向展示了每个变量与其他变量之间的关系。然后使用seaborn热图来更好地进行多变量分析。
接下来是2D直方图,可以进行二元变量分析,即同时查看两个变量,并从中获得洞察。