作者 | Lukas Frei
来源 | Medium
编辑 | 代码医生团队
介绍
在第一次导入新数据集时,首先要做的是了解数据。这包括确定特定预测变量的范围,识别每个预测变量的数据类型以及计算每个预测变量的缺失值的数量或百分比等步骤。
pandas库为EDA提供了许多非常有用的功能。但是在能够应用大多数函数之前,通常必须从更常用的函数开始,例如df.describe()。然而这些功能提供的功能是有限的,并且通常初始EDA工作流程对于每个新数据集非常相似。最近搜索了替代品并且遇到了Pandas-Profiling。pandas-profiling不仅可以提供单一输出,还可以让用户快速生成一个结构非常广泛的HTML文件,其中包含可能需要了解的大部分内容,然后再进行更具体的个人数据探索。在下面的段落中,将介绍pandas-profiling在Titanic数据集中的应用。
更快的EDA
选择将pandas-profiling应用于 Titanic 数据集,因为数据类型多种多样,缺少值。当数据尚未清理并仍需要进一步的个性化调整时,pandas-profiling特别有趣。为了更好地指导在这些个性化调整过程中的重点,需要知道从哪里开始以及要关注什么。这是pandas-profiling的用武之地。
首先,导入数据并使用pandas来检索一些描述性统计信息:
# importing required packages
import pandas as pd
import pandas_profiling
import numpy as np
# importing the data
df = pd.read_csv('/Users/lukas/Downloads/titanic/train.csv')
# descriptive statistics
df.describe()
上面的代码块将产生以下输出:
虽然上面的输出包含大量信息,但它并没有告诉可能感兴趣的所有内容。例如可以假设数据框有891行。如果要检查,则必须添加另一行代码以确定数据帧的长度。虽然这些计算并不是非常昂贵,但一次又一次地重复这些计算确实占用了时间,可能在清理数据时更好地使用它们。
概观
现在对pandas-profiling做同样的事情:
pandas_profiling.ProfileReport(df)
运行此单行代码将创建数据的HTML EDA报告。上面显示的代码将创建结果的内联输出; 也可以选择将EDA报告另存为HTML文件,以便更轻松地共享。
HTML EDA报告的第一部分将包含一个概述部分,提供基本信息(观察数量,变量数量等)。它还会输出一个警告列表,告诉在何处仔细检查数据并可能集中清洁工作。
概述输出
可变特异性EDA
概述之后,EDA报告提供有关每个特定变量的有用见解。这些还包括描述每个变量分布的小型可视化:
数字变量'Age'的输出
如上所示,pandas-profiling提供了一些有用的指标,例如缺失值的百分比和数量以及之前看到的描述性统计数据。由于'Age'是一个数字变量,使用直方图可视化其分布告诉这个变量似乎是正确的。
对于分类变量,仅进行微小更改:
分类变量'Sex'的输出
pandas-profiling不是计算均值,最小值和最大值,而是计算分类变量的类计数。由于'Sex'是一个二元变量,只找到两个不同的计数。
想知道pandas-profiling究竟是如何计算它的输出的。源代码可以在GitHub上找到。快速深入研究数字变量的源代码:
https://github.com/pandas-profiling
def describe_numeric_1d(series, **kwargs):
"""Compute summary statistics of a numerical (`TYPE_NUM`) variable (a Series).
Also create histograms (mini an full) of its distribution.
Parameters
----------
series : Series
The variable to describe.
Returns
-------
Series
The description of the variable as a Series with index being stats keys.
"""
# Format a number as a percentage. For example 0.25 will be turned to 25%.
_percentile_format = "{:.0%}"
stats = dict()
stats['type'] = base.TYPE_NUM
stats['mean'] = series.mean()
stats['std'] = series.std()
stats['variance'] = series.var()
stats['min'] = series.min()
stats['max'] = series.max()
stats['range'] = stats['max'] - stats['min']
# To avoid to compute it several times
_series_no_na = series.dropna()
for percentile in np.array([0.05, 0.25, 0.5, 0.75, 0.95]):
# The dropna() is a workaround for https://github.com/pydata/pandas/issues/13098
stats[_percentile_format.format(percentile)] = _series_no_na.quantile(percentile)
stats['iqr'] = stats['75%'] - stats['25%']
stats['kurtosis'] = series.kurt()
stats['skewness'] = series.skew()
stats['sum'] = series.sum()
stats['mad'] = series.mad()
stats['cv'] = stats['std'] / stats['mean'] if stats['mean'] else np.NaN
stats['n_zeros'] = (len(series) - np.count_nonzero(series))
stats['p_zeros'] = stats['n_zeros'] * 1.0 / len(series)
# Histograms
stats['histogram'] = histogram(series, **kwargs)
stats['mini_histogram'] = mini_histogram(series, **kwargs)
return pd.Series(stats, name=series.name)
虽然这可能看起来像一个巨大的代码块,但它实际上很容易理解。Pandas-profiling的源代码包括另一个确定每个变量类型的函数。如果变量被识别为数字变量,上面的函数将产生之前显示的输出。此函数使用基本的pandas系列操作,例如series.mean(),并将结果存储在stats字典中。这些图是使用matplotlib的matplotlib.pyplot.hist函数的改编版本生成的,目的是能够处理各种类型的数据集。
相关性和样本
在每个特定变量的EDA下,pandas-profiling将输出Pearson和Spearman相关矩阵。
Pearson相关矩阵输出
可以在生成报告的初始代码行中设置一些相关阈值。通过这样做可以调整认为对分析重要的相关强度。
最后,pandas-profiling将输出代码示例。严格来说,这不是代码示例,而只是数据的头部。当前几个观察结果不能代表数据的一般特征时,这可能会出现问题。
因此建议不要使用最后一个输出进行初始分析,而是运行df.sample(5),它将从数据集中随机选择五个观察值。
结论
总而言之,pandas-profiling提供了一些有用的功能,主要目标是快速的理解数据或以可视格式与他人分享初始EDA。然而它并没有接近自动化EDA。实际的个性化工作仍然需要手动完成。
想在一个notebook中看到整个EDA,请查看链接:
https://nbviewer.jupyter.org/github/lksfr/TowardsDataScience/blob/master/pandas-profiling.ipynb
GitHub代码链接:
https://github.com/lksfr/TowardsDataScience/blob/master/pandas-profiling.ipynb