使用Python和Pandas:Z-Score方法详解及其在数据清洗中识别异常值的应用

上文介绍了数据清洗的方法,箱线图分析,本文继续介绍另一种数据清洗的方法:Z-Score。Z-Score 方法就是一种常用的基于标准差来识别异常值的技术。

什么是 Z-Score?

Z-Score,又称为标准分数,是统计学中用于表示一个值与数据集均值之间的偏差程度的一种度量。具体而言,Z-Score 是一个观测值减去均值后,再除以标准差的结果。Z-Score 可以告诉我们这个观测值在标准正态分布中处于什么位置。数学表达式如下:

[ Z = \frac{(X – \mu)}{\sigma} ]

其中:

  • ( X ) 表示单个观测值,
  • ( \mu ) 表示观测值所在样本的均值,
  • ( \sigma ) 表示样本的标准差。
  • 如何使用 Z-Score 识别异常值?

    Z-Score 方法通常用来识别那些距离均值太远的点,即那些在正态分布中属于尾部的观测值。一般认为,如果一个数据点的 Z-Score 超过一定的阈值(通常是 3 或 -3),则可以将其视为异常值。这是因为,在标准正态分布中,大约99.7%的数据点会落在均值加减3个标准差的范围内。

    例如,如果一个数据点的 Z-Score 是 4,这意味着这个点比均值高出了4个标准差,这在正态分布中是非常罕见的事件,因此这个数据点很可能是一个异常值。

    应用示例

    假设我们有一个数据集,我们首先计算数据集的均值和标准差。然后,我们对数据集中的每一个观测值计算其 Z-Score。接下来,我们将 Z-Score 的绝对值与一个预设的阈值进行比较,比如3,如果 Z-Score 的绝对值大于3,则将该观测值标记为异常值。

    在 Python 中,可以使用 Pandas 和 SciPy 库来执行 Z-Score 方法:

    import pandas as pd
    import numpy as np
    from scipy import stats
    import matplotlib.pyplot as plt
    
    # 创建一个示例数据集
    np.random.seed(0)  # 设置随机种子以获得可重复的结果
    sales_data = np.random.normal(loc=100, scale=20, size=1000)  # 生成1000个服从正态分布的销售数据点
    sales_data = np.append(sales_data, [1000, -200])  # 添加两个异常值
    
    # 将数据转换为DataFrame
    df_sales = pd.DataFrame(sales_data, columns=['Sales'])
    
    # 计算Z-Score
    z_scores = stats.zscore(df_sales['Sales'])
    
    # 设定阈值,通常情况下,|Z| > 3 表示异常值
    threshold = 3
    
    # 标记异常值
    outliers = np.where(np.abs(z_scores) > threshold)
    
    # 打印异常值
    print("Original outliers:")
    print(df_sales.iloc[outliers])
    
    # 删除异常值
    df_cleaned = df_sales[(np.abs(z_scores) < threshold)]
    
    # 打印清洗后的数据
    print("Cleaned data:")
    print(df_cleaned)
    
    # 可视化原始数据和清洗后的数据
    plt.figure(figsize=(12, 6))
    
    plt.subplot(1, 2, 1)
    plt.boxplot(sales_data, vert=False)
    plt.title('Original Sales Data')
    plt.xlabel('Sales')
    
    plt.subplot(1, 2, 2)
    plt.boxplot(df_cleaned['Sales'], vert=False)
    plt.title('Cleaned Sales Data')
    plt.xlabel('Sales')
    
    plt.tight_layout()
    plt.show()
    
    # 原始异常值的输出
    # 这里,“Sales”列包含了异常值,而行索引(998和999)对应于原始数据集中异常值的位置。
    # Original outliers:
    #          Sales
    # 998   1000.00
    # 999    -200.00
    
    # 清洗后的数据输出
    # Cleaned data:
    #          Sales
    # 0     104.881356
    # 1      90.997852
    # 2     105.447278
    # 3     111.436596
    # 4     105.117735
    
    Z-Score 方法的局限性

    首先,Z-Score 方法假设数据服从正态分布,如果数据集严重偏斜或非正态分布,这种方法可能不适用。其次,Z-Score 方法对数据集中的极端值敏感,因为极端值会影响均值和标准差的计算,进而影响 Z-Score 的准确性。

    结论

    Z-Score 方法是数据清洗中识别异常值的有力工具,尤其是在数据集大致呈正态分布的情况下。但是要注意其局限性,并考虑结合其他方法如箱线图、四分位数法等,以获得更全面的数据质量评估。

    作者:叶阿猪

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用Python和Pandas:Z-Score方法详解及其在数据清洗中识别异常值的应用

    发表回复