<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Da on FF的实验笔记</title>
    <link>http://blog.memcd.com/tags/da/</link>
    <description>Recent content in Da on FF的实验笔记</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>(c) 1998 - 2026</copyright>
    <lastBuildDate>Tue, 04 Feb 2025 12:48:43 +0800</lastBuildDate>
    <atom:link href="http://blog.memcd.com/tags/da/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Z分数异常数据检测方法</title>
      <link>http://blog.memcd.com/posts/cs/2025-0204-z-score/</link>
      <pubDate>Tue, 04 Feb 2025 12:48:43 +0800</pubDate>
      <guid>http://blog.memcd.com/posts/cs/2025-0204-z-score/</guid>
      <description>&lt;h1 id=&#34;z分数异常数据检测方法&#34;&gt;Z分数异常数据检测方法&lt;/h1&gt;&#xA;&lt;p&gt;标准差（Standard Deviation）是统计学中用于衡量数据分散程度的重要指标。它表示数据点与数据集平均值（均值）之间的偏离程度。标准差越大，说明数据分布越分散；标准差越小，说明数据分布越集中。&lt;/p&gt;&#xA;&lt;p&gt;Z分数异常检测，是一种基于统计学的异常检测方法，通过计算数据点的Z分数（Z-score）来判断其是否为异常值。Z分数反映了数据点与数据集均值之间的偏离程度，以标准差为单位。&lt;/p&gt;&#xA;&lt;h2 id=&#34;适用场景&#34;&gt;适用场景&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数据近似服从正态分布（或至少是对称分布），例如：金融数据（如股票收益率）、考试成绩、生产质量数据（如产品尺寸、重量）&lt;/li&gt;&#xA;&lt;li&gt;需要快速识别极端值的时候，例如：传感器数据中的异常值、网络流量中的异常行为、财务数据中的异常交易等&lt;/li&gt;&#xA;&lt;li&gt;数据标准化需求，例如机器学习中的数据预处理、多指标综合评价（如学生成绩、员工绩效）&lt;/li&gt;&#xA;&lt;li&gt;异常值定义明确的场景&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;计算公式&#34;&gt;计算公式&lt;/h2&gt;&#xA;&lt;p&gt;Z分数的计算公式为：Z =（X−μ）/σ&lt;/p&gt;&#xA;&lt;p&gt;其中：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;X：某个数据点的值&lt;/li&gt;&#xA;&lt;li&gt;μ：数据集的均值（平均值）&lt;/li&gt;&#xA;&lt;li&gt;σ：数据集的标准差&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Z 分数的意义：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Z=0：数据点等于均值&lt;/li&gt;&#xA;&lt;li&gt;Z&amp;gt;0：数据点高于均值&lt;/li&gt;&#xA;&lt;li&gt;Z&amp;lt;0：数据点低于均值&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;原理说明&#34;&gt;原理说明&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;如果某个数据点的 Z 分数绝对值较大（即远离均值），则该数据点可能是异常值&lt;/li&gt;&#xA;&lt;li&gt;通常，设定一个阈值（如 Z=3 或 Z=2），如果数据点的 Z 分数绝对值超过该阈值，则认为它是异常值&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;阈值选择&#34;&gt;阈值选择&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;∣Z∣ &amp;gt; 3：适用于严格检测，只有非常极端的数据点才会被标记为异常&lt;/li&gt;&#xA;&lt;li&gt;∣Z∣ &amp;gt; 2：适用于一般检测，可能会标记更多的潜在异常值&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;示例数据说明&#34;&gt;示例数据说明&lt;/h2&gt;&#xA;&lt;p&gt;以下示例数据（data.csv）中，构造了一组随机数，并人为修改了其中几个让其z分数大于3来模拟异常情况；&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;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&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;代码实现&#34;&gt;代码实现&lt;/h2&gt;&#xA;&lt;p&gt;StandardScaler 是 Python 机器学习库 scikit-learn（sklearn）中的一个数据预处理工具，用于对数据进行标准化处理。使用python调用StandardScaler完成Z分数计算：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import pandas as pd&#xA;import numpy as np&#xA;from sklearn.preprocessing import StandardScaler&#xA;import matplotlib.pyplot as plt&#xA;from matplotlib import font_manager&#xA;import os&#xA;&#xA;def setup_font():&#xA;    potential_fonts = [&#xA;        &amp;#39;/usr/share/fonts/truetype/wqy/wqy-microhei.ttc&amp;#39;,&#xA;        &amp;#39;/usr/share/fonts/wqy-microhei/wqy-microhei.ttc&amp;#39;,&#xA;    ]&#xA;    &#xA;    for font_path in potential_fonts:&#xA;        if os.path.exists(font_path):&#xA;            font_manager.fontManager.addfont(font_path)&#xA;            plt.rcParams[&amp;#39;font.family&amp;#39;] = font_manager.FontProperties(fname=font_path).get_name()&#xA;            break&#xA;    plt.rcParams[&amp;#39;axes.unicode_minus&amp;#39;] = False&#xA;&#xA;def load_data(file_path):&#xA;    data = pd.read_csv(file_path, header=None)&#xA;    return data.iloc[0].values&#xA;&#xA;def detect_anomalies_zscore(data, threshold=3):&#xA;    scaler = StandardScaler()&#xA;    z_scores = scaler.fit_transform(data.reshape(-1, 1))&#xA;    return (abs(z_scores) &amp;gt; threshold).ravel()&#xA;&#xA;def plot_results(data, anomalies, output_path=&amp;#39;zscore_anomalies.png&amp;#39;):&#xA;    plt.figure(figsize=(15, 5))&#xA;    plt.plot(range(len(data)), data, label=&amp;#39;原始数据&amp;#39;)&#xA;    anomaly_indices = np.where(anomalies)[0]&#xA;    anomaly_values = data[anomaly_indices]&#xA;    plt.scatter(anomaly_indices, anomaly_values, color=&amp;#39;red&amp;#39;, label=&amp;#39;异常值&amp;#39;)&#xA;    plt.title(&amp;#39;使用Z-score方法检测的异常值&amp;#39;)&#xA;    plt.legend()&#xA;    plt.tight_layout()&#xA;    plt.savefig(output_path)&#xA;    plt.close()&#xA;&#xA;def main():&#xA;    setup_font()&#xA;    data = load_data(&amp;#39;data.csv&amp;#39;)&#xA;    &#xA;    anomalies = detect_anomalies_zscore(data, threshold=3)&#xA;    print(f&amp;#39;Z-score方法检测到 {sum(anomalies)} 个异常值&amp;#39;)&#xA;    &#xA;    plot_results(data, anomalies)&#xA;    &#xA;    print(&amp;#34;\n详细的异常值信息：&amp;#34;)&#xA;    anomaly_indices = np.where(anomalies)[0]&#xA;    anomaly_values = data[anomaly_indices]&#xA;    for idx, value in zip(anomaly_indices, anomaly_values):&#xA;        print(f&amp;#34;索引: {idx}, 值: {value:.2f}&amp;#34;)&#xA;&#xA;if __name__ == &amp;#34;__main__&amp;#34;:&#xA;    main() &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;代码说明&#34;&gt;代码说明&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;pandas：数据分析和处理库，用于数据的导入和基本处理，例如数据清洗和预处理、数据重塑和透视、时间序列处理、数据合并和连接、统计分析、数据可视化等&#xA;&lt;ul&gt;&#xA;&lt;li&gt;read_csv()：读取CSV格式的数据文件&#xA;&lt;ul&gt;&#xA;&lt;li&gt;iloc[]：索引器，用于按位置进行整数索引&#xA;&lt;ul&gt;&#xA;&lt;li&gt;values[]：将pandas对象转换为NumPy数组&#xA;&lt;ul&gt;&#xA;&lt;li&gt;reshape()：重塑数组的形状&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;numpy：数学和科学计算库，用于数值计算、数组和矩阵操作等&#xA;&lt;ul&gt;&#xA;&lt;li&gt;where()：条件判断，用于判断数组中的元素是否满足某个条件&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;sklearn：机器学习库，用于数据预处理、模型训练和评估等&#xA;&lt;ul&gt;&#xA;&lt;li&gt;preprocessing：数据预处理，包括标准化、缩放等&#xA;&lt;ul&gt;&#xA;&lt;li&gt;StandardScaler：标准化数据，将特征缩放到标准化的分布（均值为0，标准差为1）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;fit_transform()：拟合并转换数据&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;matplotlib：数据可视化库，用于绘图、图表、图形和动画等&#xA;&lt;ul&gt;&#xA;&lt;li&gt;font_manager：字体管理，用于设置字体和字号等，解决中文问题&lt;/li&gt;&#xA;&lt;li&gt;pyplot：绘图工具，用于生成静态图形和动态图形&#xA;&lt;ul&gt;&#xA;&lt;li&gt;figure：创建图形对象，用于绘制图形和图表&lt;/li&gt;&#xA;&lt;li&gt;plot：绘制图形，用于绘制折线图、柱状图等&lt;/li&gt;&#xA;&lt;li&gt;scatter：绘制散点图，用于显示数据点&lt;/li&gt;&#xA;&lt;li&gt;title：设置图形标题&lt;/li&gt;&#xA;&lt;li&gt;legend：设置图例&lt;/li&gt;&#xA;&lt;li&gt;tight_layout：自动调整子图布局&lt;/li&gt;&#xA;&lt;li&gt;savefig：保存图形，用于保存绘制的图形&lt;/li&gt;&#xA;&lt;li&gt;close：关闭图形，用于关闭绘制的图形&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;异常数据识别&#34;&gt;异常数据识别&lt;/h2&gt;&#xA;&lt;p&gt;将代码保存为 z-score.py，执行得到结果，并在生成的图片&lt;code&gt;zscore_anomalies.png&lt;/code&gt;中标识异常位置。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
