Z分数异常数据检测方法

Z分数异常数据检测方法

标准差(Standard Deviation)是统计学中用于衡量数据分散程度的重要指标。它表示数据点与数据集平均值(均值)之间的偏离程度。标准差越大,说明数据分布越分散;标准差越小,说明数据分布越集中。

Z分数异常检测,是一种基于统计学的异常检测方法,通过计算数据点的Z分数(Z-score)来判断其是否为异常值。Z分数反映了数据点与数据集均值之间的偏离程度,以标准差为单位。

适用场景

  • 数据近似服从正态分布(或至少是对称分布),例如:金融数据(如股票收益率)、考试成绩、生产质量数据(如产品尺寸、重量)
  • 需要快速识别极端值的时候,例如:传感器数据中的异常值、网络流量中的异常行为、财务数据中的异常交易等
  • 数据标准化需求,例如机器学习中的数据预处理、多指标综合评价(如学生成绩、员工绩效)
  • 异常值定义明确的场景

计算公式

Z分数的计算公式为:Z =(X−μ)/σ

其中:

  • X:某个数据点的值
  • μ:数据集的均值(平均值)
  • σ:数据集的标准差

Z 分数的意义:

  • Z=0:数据点等于均值
  • Z>0:数据点高于均值
  • Z<0:数据点低于均值

原理说明

  • 如果某个数据点的 Z 分数绝对值较大(即远离均值),则该数据点可能是异常值
  • 通常,设定一个阈值(如 Z=3 或 Z=2),如果数据点的 Z 分数绝对值超过该阈值,则认为它是异常值

阈值选择

  • ∣Z∣ > 3:适用于严格检测,只有非常极端的数据点才会被标记为异常
  • ∣Z∣ > 2:适用于一般检测,可能会标记更多的潜在异常值

示例数据说明

以下示例数据(data.csv)中,构造了一组随机数,并人为修改了其中几个让其z分数大于3来模拟异常情况;

63.75,62.43,51.79,42.50,57.78,30.53,38.54,56.05,44.12,37.44,206.71,55.50,56.02,40.32,40.78,46.88,30.66,40.39,68.34,31.88,58.10,35.47,69.57,59.48,66.84,45.56,34.63,43.30,46.87,48.85,45.41,34.33,65.25,34.86,35.52,50.05,65.33,55.70,68.85,57.02,64.62,35.78,39.80,69.44,62.43,39.23,43.59,38.58,45.01,36.83,36.40,52.71,63.07,52.09,39.17,40.18,39.03,65.55,31.97,50.84,57.35,129.51,134.86,121.94,132.03,130.88,130.33,128.39,202.08,208.72,100.55,239.86,130.93,111.57,101.99,105.49,116.00,107.51,111.02,131.58,107.05,136.89,111.09,124.50,103.30,107.55,55.65,31.15,48.87,36.01,57.97,47.08,32.42,51.04,55.61,68.73,68.66,36.25,57.20,62.03

代码实现

StandardScaler 是 Python 机器学习库 scikit-learn(sklearn)中的一个数据预处理工具,用于对数据进行标准化处理。使用python调用StandardScaler完成Z分数计算:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from matplotlib import font_manager
import os

def setup_font():
    potential_fonts = [
        '/usr/share/fonts/truetype/wqy/wqy-microhei.ttc',
        '/usr/share/fonts/wqy-microhei/wqy-microhei.ttc',
    ]
    
    for font_path in potential_fonts:
        if os.path.exists(font_path):
            font_manager.fontManager.addfont(font_path)
            plt.rcParams['font.family'] = font_manager.FontProperties(fname=font_path).get_name()
            break
    plt.rcParams['axes.unicode_minus'] = False

def load_data(file_path):
    data = pd.read_csv(file_path, header=None)
    return data.iloc[0].values

def detect_anomalies_zscore(data, threshold=3):
    scaler = StandardScaler()
    z_scores = scaler.fit_transform(data.reshape(-1, 1))
    return (abs(z_scores) > threshold).ravel()

def plot_results(data, anomalies, output_path='zscore_anomalies.png'):
    plt.figure(figsize=(15, 5))
    plt.plot(range(len(data)), data, label='原始数据')
    anomaly_indices = np.where(anomalies)[0]
    anomaly_values = data[anomaly_indices]
    plt.scatter(anomaly_indices, anomaly_values, color='red', label='异常值')
    plt.title('使用Z-score方法检测的异常值')
    plt.legend()
    plt.tight_layout()
    plt.savefig(output_path)
    plt.close()

def main():
    setup_font()
    data = load_data('data.csv')
    
    anomalies = detect_anomalies_zscore(data, threshold=3)
    print(f'Z-score方法检测到 {sum(anomalies)} 个异常值')
    
    plot_results(data, anomalies)
    
    print("\n详细的异常值信息:")
    anomaly_indices = np.where(anomalies)[0]
    anomaly_values = data[anomaly_indices]
    for idx, value in zip(anomaly_indices, anomaly_values):
        print(f"索引: {idx}, 值: {value:.2f}")

if __name__ == "__main__":
    main() 

代码说明

  • pandas:数据分析和处理库,用于数据的导入和基本处理,例如数据清洗和预处理、数据重塑和透视、时间序列处理、数据合并和连接、统计分析、数据可视化等
    • read_csv():读取CSV格式的数据文件
      • iloc[]:索引器,用于按位置进行整数索引
        • values[]:将pandas对象转换为NumPy数组
          • reshape():重塑数组的形状
  • numpy:数学和科学计算库,用于数值计算、数组和矩阵操作等
    • where():条件判断,用于判断数组中的元素是否满足某个条件
  • sklearn:机器学习库,用于数据预处理、模型训练和评估等
    • preprocessing:数据预处理,包括标准化、缩放等
      • StandardScaler:标准化数据,将特征缩放到标准化的分布(均值为0,标准差为1)
        • fit_transform():拟合并转换数据
  • matplotlib:数据可视化库,用于绘图、图表、图形和动画等
    • font_manager:字体管理,用于设置字体和字号等,解决中文问题
    • pyplot:绘图工具,用于生成静态图形和动态图形
      • figure:创建图形对象,用于绘制图形和图表
      • plot:绘制图形,用于绘制折线图、柱状图等
      • scatter:绘制散点图,用于显示数据点
      • title:设置图形标题
      • legend:设置图例
      • tight_layout:自动调整子图布局
      • savefig:保存图形,用于保存绘制的图形
      • close:关闭图形,用于关闭绘制的图形

异常数据识别

将代码保存为 z-score.py,执行得到结果,并在生成的图片zscore_anomalies.png中标识异常位置。

python z-score.py
Z-score方法检测到 4 个异常值

详细的异常值信息:
索引: 10, 值: 206.71
索引: 68, 值: 202.08
索引: 69, 值: 208.72
索引: 71, 值: 239.86

2025-0204-zscore_anomalies

可见,通过Z分数成功识别了示例数据中的异常值。

注意事项

需要注意的是,通过Z分数进行异常数据检测,只是异常数据检测中的基础方法之一,只在限定的条件下适用。

posted on 2026-06-04 08:55  ffb  阅读(2)  评论(0)    收藏  举报

导航