原文:
www.kdnuggets.com/2021/02/powerful-exploratory-data-analysis-sweetviz.html
评论
由Francois Bertrand提供,数据可视化和游戏的编码员及设计师。
1. 谷歌网络安全证书 - 快速进入网络安全职业。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织在 IT 方面
探索性数据分析(EDA)是大多数数据科学项目中一个至关重要的早期步骤,它通常包括采取相同的步骤来描述数据集(例如,查找数据类型、缺失信息、值的分布、相关性等)。鉴于这些任务的重复性和相似性,有一些库可以自动化这些任务,并帮助启动过程。
最新的一个工具是一个名为 Sweetviz 的开源 Python 库(GitHub),由几位贡献者和我自己共同创建,正是为了这个目的。它接受 pandas 数据框,并生成一个自包含的 HTML 报告。
它功能强大: 除了只需两行代码即可创建富有洞察力和美观的可视化外,它还提供了手动生成所需大量时间的分析,包括一些其他库无法如此快速提供的分析,如:
-
两个数据集的比较(例如,训练集与测试集)
-
目标值与所有其他变量的可视化(例如,“男性与女性的生存率是多少”)
这是一个由 Sweetviz 生成的关于著名泰坦尼克号幸存者数据集的报告链接。我们将在本文中分析这个报告。
能够快速获得如此多关于目标值的信息,并几乎瞬间比较数据集的不同区域,将这一步骤从完全枯燥的工作转变为更快、更有趣,甚至在某种程度上…有趣!(至少对于这个数据爱好者来说!)当然,EDA 是一个更长的过程,但至少第一步要顺利得多。让我们看看在著名样本数据集上的效果。
对于本文,我们将分析你可以在这里找到的泰坦尼克号幸存者样本数据集。
安装 Sweetviz 后(使用 pip install sweetviz),只需像平常一样加载 pandas 数据框,然后根据需要调用 analyze()、compare() 或 compare_intra()(更多细节见下文)。完整的文档可以在 GitHub 上找到。现在,让我们从当前的案例开始,加载如下:
import sweetviz
import pandas as pd
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
我们现在有两个数据框(训练集和测试集),我们希望分析目标值“Survived”。我想指出的是,在这种情况下,我们事先知道目标列的名称,但指定目标列始终是可选的。我们可以用以下代码生成报告:
my_report = sweetviz.compare([train, "Train"], [test, "Test"], "Survived")
运行此命令将执行分析并创建报告对象。要获取输出,只需使用 show_html() 命令:
my_report.show_html("Report.html") # Not providing a filename will default to SWEETVIZ_REPORT.html
生成文件后,它将通过默认浏览器打开,应该如下所示:
有很多内容需要解读,所以我们一步步来吧!
摘要展示
摘要展示了两个数据框的特征。我们可以立即识别出测试集的大小大约是训练集的一半,但包含相同的特征。底部的图例显示,训练集包含“Survived”目标变量,但测试集不包含。
请注意,Sweetviz 会对每列的数据类型进行最佳猜测,包括数值型、类别/布尔型和文本型。这些可以被覆盖——更多细节见下文。
关联
将鼠标悬停在摘要中的“关联”按钮上,会使右侧出现关联图:
该图表是 Drazen Zaric: Better Heatmaps and Correlation Matrix Plots in Python 和 Shaked Zychlinski: The Search for Categorical Correlation 的视觉效果合成。
基本上,除了展示传统的数值相关性外,它还将数值相关性、类别-类别的不确定系数以及类别-数值的相关比率统一在一个图表中。方框代表类别特征相关变量,圆圈代表数值-数值相关性。为了清晰起见,简单对角线被留空。
重要提示:由不确定系数提供的类别-类别关联是不对称的,意味着每一行表示行标题(在左侧)对每一列提供了多少信息。例如,“性别”、“客舱等级”和“票价”是对“生存”提供最多信息的元素。对于泰坦尼克号数据集,这些信息是相当对称的,但情况并不总是如此。
最后,值得注意的是这些相关性/关联方法不应被视为绝对真理,因为它们对数据的基本分布和关系做出了一些假设。然而,它们可以作为一个非常有用的起点。
目标变量
当指定一个目标变量时,它会首先显示在一个特殊的黑色框中。
重要提示:目前只有数值和布尔特征可以作为目标变量。
从这个摘要中我们可以得知,“生存”在训练集中没有缺失数据(891,100%),有 2 个不同的可能值(占所有值的不到 1%),从图表中可以估算出大约 60%未能生存。
详细区域(类别/布尔型)
当你将鼠标悬停在任何变量上时,右侧区域将展示详细信息。详细信息的内容取决于正在分析的变量类型。在类别(或布尔型)变量的情况下,如目标变量,分析如下:
重要提示:目前需要一台“宽屏”显示器才能查看完整的详细区域。
在这里,我们可以看到每个类别的具体统计数据,其中 62%未能生存,38%存活。你还可以看到其他特征的关联详细信息。
数值数据
数值数据在其摘要中展示了更多的信息。在这里,我们可以看到,在这种情况下,大约有 20%的数据缺失(测试数据中为 21%,非常一致)。
注意,目标值(在此情况下为“生存”)被绘制为分布图上方的一条线。这可以实现对目标分布相对于其他变量的即时分析。
有趣的是,从右侧的图表中我们可以看到,生存率在所有年龄段中都相当一致,除了最年轻的年龄段,其生存率较高。这看起来像是“妇女和儿童优先”并非仅仅是空话。
详细区域(数值)
与类别数据类型一样,数值数据类型在其详细区域中显示了一些额外的信息。这里值得注意的是图表上方的按钮。这些按钮会改变图表中显示的“箱”的数量。你可以选择以下选项:
-
自动
-
5
-
15
-
30
注意:要访问这些按钮,你需要通过点击当前特征来“锁定”它。该特征会有一个红色轮廓,显示它已被锁定,你可以访问详细区域。
例如,选择“30”会生成一个更详细的图表:
文本数据
目前,系统未考虑为数值型或类别型的数据将被视为“文本”。文本特征目前只显示计数(百分比)作为统计信息。
在许多情况下,有些“标签”列你可能不想分析(尽管目标分析可以提供基于标签的目标值分布的见解)。在其他情况下,你可能希望强制某些值标记为类别型,即使它们在本质上是数值型的。
要完成所有这些操作,只需创建一个 FeatureConfig 对象并将其传递给分析/比较函数。你可以在 kwargs 中指定一个字符串或一个列表,用于skip,force_cat,和force_text:
feature_config = sweetviz.FeatureConfig(skip="PassengerId", force_cat=["Ticket"])
my_report = sweetviz.compare([train, "Train"], [test, "Test"], "Survived", feature_config)
即使你只查看单一数据集,研究该数据集中不同子群体的特征也是非常有用的。为此,Sweetviz 提供了compare_intra()函数。要使用它,你需要提供一个布尔测试来拆分数据集(在这里我们尝试train["Sex"] == 'male',以了解不同性别群体的情况),并为每个子群体指定一个名称。例如:
my_report = sweetviz.compare_intra(train, train["Sex"] == 'male', ["Male", "Female"], 'Survived')
my_report.show_html() # Not providing a filename will default to SWEETVIZ_REPORT.html
生成以下分析:(在此截图中,我使用了 feature_config 来跳过“性别”特征的分析,因为它是多余的)
注意,目标值(在这种情况下为“生存”)现在被绘制为单独的线条,每个比较的数据集一个(例如,男性用蓝色,女性用橙色)。
EDA(探索性数据分析)是一个流动的、艺术性的过程,必须根据每个数据集和情况进行独特的调整。然而,像 Sweetviz 这样的工具可以帮助启动这一过程,并消除许多初步的数据特征工作,从而立即提供见解。让我们一起查看 Titanic 数据集的所有特征,看看这可能是什么样的。
单独字段
乘客 ID
-
ID 和生存率的分布均匀且有序,如你所希望/预期的那样,因此没有意外情况。
-
无缺失数据
性别
-
男性的数量大约是女性的两倍,但……
-
女性的生存概率远高于男性
-
从相关性来看,性别与票价相关,这一点既在意料之中,又在意料之外……
-
训练集和测试集之间的分布相似
-
无缺失数据
年龄
-
20%缺失数据,训练集和测试集之间的缺失数据和分布一致
-
以年轻人为主的人口,但 0–70 岁的年龄段都有很好的代表性
-
生存率分布相当均匀,除了最年轻年龄段有一个峰值
-
使用详细窗口中的 30 个区间直方图,你可以看到这个生存率峰值确实是针对最年轻的(大约<=5 岁),因为在大约 10 岁时,生存率非常低。
-
年龄似乎与兄弟姐妹数量、票舱等级和票价相关,令人惊讶的是与登船港口也有些关联
Name
-
没有缺失数据,数据看起来很干净
-
所有名字都是独特的,这并不意外
Pclass
-
生存率与舱位等级紧密相关(头等舱最可能生存,三等舱最不可能生存)
-
训练集和测试集之间的分布类似
-
没有缺失数据
SibSp
-
似乎在 1 号和 2 号船舱有生存率的峰值,但(查看未显示的详细面板)在 3 号及以上的船舱有明显的下降。大家庭可能无法生存或者可能更贫困?
-
训练集和测试集之间的分布类似
-
没有缺失数据
Parch
-
训练集和测试集之间的分布类似
-
没有缺失数据
Ticket
-
~80%的值是独特的,所以平均每 5 张票中大约有 1 张是共享的
-
最高频率的票是 7,这通常与最大兄弟姐妹数量(8)一致
-
没有缺失数据,数据看起来很干净
Fare
-
正如预期的那样,与 Pclass 一样,较高的票价生存情况更好(尽管在更高水平上样本量会变得相当薄)
-
“生存”变量的相关系数为 0.26,相对较高,因此可能支持这一理论
-
大约 30%的独特值感觉有点高,因为你会期望更少的固定价格,但似乎有很多细节,因此这没问题
-
测试集中只有 1 条缺失记录,数据在训练集和测试集之间比较一致
Cabin
-
大量缺失数据(高达 78%),但训练集和测试集之间的一致性很好
-
最高频率是 4,这与每个舱位最多 4 人是合理的
Embarked
-
3 个独特的值(S、C、Q)
-
训练数据中只有 2 行缺失。训练集和测试集之间的数据看起来很一致
-
C 类的生存率稍高;这可能是一个富人居住的地区吗?
-
无论如何,“登船港口”对“生存”的不确定系数仅为 0.03,因此可能不是很重要
- 总体而言,大部分数据是存在的,并且看起来一致且合理;没有重大异常值或巨大惊喜
测试数据与训练数据
-
测试集的行数大约少了 50%
-
训练集和测试集在缺失数据的分布上非常接近
-
训练集和测试集的数据值在各个方面都非常一致
关联/相关分析
-
性别、票价和 Pclass 提供了最多的生还信息。
-
正如预期的那样,票价和 Pclass 高度相关。
-
年龄似乎能告诉我们关于 Pclass、兄弟姐妹以及某种程度上的 Fare 的信息,这在一定程度上是可以预期的。它对“Embarked”也有很大提示,这有点令人惊讶。
缺失数据
- 除了年龄(约 20%)和舱位(约 77%)的显著缺失数据外,没有其他显著的缺失数据(其他特征中偶尔也有一些缺失)。
这些信息都来自两行代码!Sweetviz 现在还支持笔记本集成(你可以插入内联报告)和新功能!
使用 Sweetviz,当我开始查看新的数据集时,它能迅速帮助我起步。值得指出的是,我还发现它在后续分析过程中非常有用,例如,在特征生成期间,快速概览新特征的表现。我希望你也会发现它在自己的数据分析中是一种有用的工具。
原文。转载已获许可。
相关: