使用 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 函式庫加速探索性資料分析

來源: www.habr.com

添加評論