使用 pandas-profiling 库加速探索性数据分析

开始使用新数据集的第一步是理解它。 为此,您需要找出变量接受的值的范围及其类型,并找出缺失值的数量。

pandas 库为我们提供了许多有用的工具来执行探索性数据分析(EDA)。 但在使用它们之前,通常需要从更通用的函数开始,例如 df.describe()。 然而,应该指出的是,这些函数提供的功能是有限的,并且在执行 EDA 时处理任何数据集的初始阶段通常彼此非常相似。

使用 pandas-profiling 库加速探索性数据分析

我们今天发布的材料的作者表示,他不喜欢执行重复的动作。 因此,在寻找快速有效地执行探索性数据分析的工具时,他找到了该库 大熊猫分析。 其工作结果不是以某些单独指标的形式表示,而是以相当详细的 HTML 报告的形式表示,其中包含有关分析数据的大部分信息,您在开始更密切地使用它之前可能需要了解这些信息。

这里我们以泰坦尼克号数据集为例,看看使用 pandas-profiling 库的特性。

使用 pandas 进行探索性数据分析

我决定在泰坦尼克号数据集上尝试 pandas-profiling,因为它包含不同类型的数据并且其中存在缺失值。 我相信 pandas-profiling 库在数据尚未清理并且需要根据其特征进行进一步处理的情况下特别有趣。 为了成功地执行此类处理,您需要知道从哪里开始以及需要注意什么。 这就是 pandas 分析功能派上用场的地方。

首先,我们导入数据并使用pandas获取描述性统计:

# импорт необходимых пакетов
import pandas as pd
import pandas_profiling
import numpy as np

# импорт данных
df = pd.read_csv('/Users/lukas/Downloads/titanic/train.csv')

# вычисление показателей описательной статистики
df.describe()

执行这段代码后,你将得到如下图所示的结果。

使用 pandas-profiling 库加速探索性数据分析
使用标准 pandas 工具获得的描述性统计数据

尽管这里有很多有用的信息,但它并不包含有关所研究数据的所有有趣信息。 例如,人们可能假设在数据帧中、在结构中 DataFrame,有 891 行。 如果需要检查这一点,则需要另一行代码来确定框架的大小。 虽然这些计算并不是特别消耗资源,但一直重复它们必然会浪费时间,而这些时间可能最好花在清理数据上。

使用 pandas-profiling 进行探索性数据分析

现在让我们使用 pandas-profiling 做同样的事情:

pandas_profiling.ProfileReport(df)

执行上述代码行将生成一份包含探索性数据分析指标的报告。 上面显示的代码将输出找到的数据,但您可以使其输出一个 HTML 文件,例如您可以向某人展示的文件。

报告的第一部分将包含概述部分,提供有关数据的基本信息(观察数量、变量数量等)。 此外,它还将包含一个警报列表,通知分析师需要特别注意的事项。 这些警报可以提供有关您可以将数据清理工作重点放在何处的线索。

使用 pandas-profiling 库加速探索性数据分析
概览报告部分

探索性变量分析

在报告的概述部分下方,您可以找到有关每个变量的有用信息。 其中包括描述每个变量分布的小图表。

使用 pandas-profiling 库加速探索性数据分析
关于年龄数值变量

从前面的示例中可以看出,pandas-profiling 为我们提供了几个有用的指标,例如缺失值的百分比和数量,以及我们已经看到的描述性统计度量。 因为 Age 是一个数值变量,以直方图的形式可视化其分布使我们可以得出结论:我们的分布向右倾斜。

考虑分类变量时,输出结果与数值变量的输出结果略有不同。

使用 pandas-profiling 库加速探索性数据分析
关于性别分类变量

也就是说,pandas-profiling 库不是找到平均值、最小值和最大值,而是找到类的数量。 因为 Sex — 一个二元变量,它的值由两个类表示。

如果您像我一样喜欢检查代码,您可能会对 pandas-profiling 库如何准确计算这些指标感兴趣。 鉴于库代码在 GitHub 上是开放且可用的,了解这一点并不困难。 由于我不太喜欢在项目中使用黑匣子,因此我查看了该库的源代码。 例如,这就是处理数值变量的机制,由函数表示 描述_数字_1d:

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 操作来处理类型的对象 Series, 喜欢 series.mean()。 计算结果存储在字典中 stats。 直方图是使用该函数的改编版本生成的 matplotlib.pyplot.hist。 适应的目的是确保该函数可以处理不同类型的数据集。

相关指标与研究样本数据

获得变量分析结果后,pandas-profiling 的“相关性”部分将显示 Pearson 和 Spearman 相关矩阵。

使用 pandas-profiling 库加速探索性数据分析
皮尔逊相关矩阵

如果需要,您可以在触发生成报告的代码行中,设置计算相关性时使用的阈值的指标。 通过这样做,您可以指定什么关联强度对您的分析被认为是重要的。

最后,pandas-profiling 报告在“示例”部分中显示了从数据集开头获取的一段数据作为示例。 这种方法可能会导致令人不快的意外,因为最初的几次观察可能代表的样本不能反映整个数据集的特征。

使用 pandas-profiling 库加速探索性数据分析
包含正在研究的样本数据的部分

因此,我不建议您关注最后一部分。 相反,最好使用命令 df.sample(5),将从数据集中随机选择 5 个观测值。

结果

总而言之,pandas-profiling 库为分析师提供了一些有用的功能,当您需要快速了解数据的粗略信息或将情报分析报告传递给某人时,这些功能将派上用场。 同时,考虑到其特征,手动执行数据的实际工作,而不使用 pandas-profiling。

如果您想了解所有智能数据分析在一台 Jupyter 笔记本中的样子,请查看 我的项目是使用 nbviewer 创建的。 并且在 您可以在 GitHub 存储库中找到相应的代码。

亲爱的读者! 您从哪里开始分析新数据集?

使用 pandas-profiling 库加速探索性数据分析

来源: habr.com

添加评论