outliers() 方法

识别数值列中的统计异常值。可以为整个列识别异常值,也可以基于一个或多个键列中的相同值为单独的组进行识别。

语法

数据帧名称.outliers(keys = ["键列", "...n"]|None, on = "数值列", distance = 标准偏差数, method = mean|median)

参数

名称 描述
keys = ["键列", "...n"] | None
  • 键列要用来对该数据帧中的数据进行分组的一个或多个键列

    对于每个组,都会为数值列中的组数值类型值计算一个标准偏差。组标准偏差被用作识别组异常值的基础。

    如果您按一个以上的列进行分组,则会创建嵌套组。嵌套顺序遵循您指定列的顺序。

    键列被定位于输出数据帧的最左侧位置。

    说明

    在识别异常值之前,outliers() 方法自动按键列对数据帧进行排序。

  • None不将数据分组,并且为整个数值列识别异常值

    为整个数值列计算标准偏差。列标准偏差被用作识别列异常值的基础。

on = "数值列"

要审查其是否存在异常值的数值列。您一次只能审查一个列。

异常值是落在由组或列标准偏差或者由标准偏差的指定倍数设立的上限和下限外部的值。

distance = 标准偏差数

数值列中,从平均值或中值到上异常边界和下异常边界的标准偏差数。您可以指定任何正整数或小数 (0.5, 1, 1.5, 2 . . . )

用于创建异常值边界的公式是:

平均值/中值 ± (标准偏差数 * 标准偏差)

说明

标准偏差是对数据集的离差 — 即值的分散性的度量。异常值计算使用总体标准偏差。

异常值边界的示例

distance = 2

为整个数值列或者为每个键列组设立:

  • 一个比平均值或中值大两个标准偏差的异常值上边界

    mean/median + (2 * SD)

  • 一个比平均值或中值小两个标准偏差的异常值下边界

    平均值/中值 – (2 * SD)

任何大于上边界或者小于下边界的值都作为异常值被包括在输出结果中。

说明

对于相同数据集,随着您增加标准偏差数中的值,您可能减小返回的异常值的数量。

method = mean | median

可选

用于计算数值列(异常值列)中的值的中点的方法。

  • mean 计算这些值的平均值
  • median 计算这些值的中值

为下列两者之一计算中点:

  • 每个键列组的数值类型值
  • 整个数值列

该中点随后被用于计算每个组或者整个数值列的标准偏差。

如果您省略 method,则使用默认值 mean。

提示

如果您审查以寻找异常值的数据被显著歪曲,则使用 median 可能生成更能代表该数据块的结果。

返回

HCL 数据帧。

示例

识别反常的交易金额

您想要识别整个应收账款数据帧中的反常交易金额。

您决定将异常值边界设置为 Amount 列的标准偏差的 3 倍。该测试返回包含 772 行的数据帧中的 16 个异常值。

outliers_ar = accounts_receivable.outliers(keys = None, on = "Amount", distance = 3, method = "mean")

您重复执行该测试,但是将标准偏差倍数增加到 3.5。该测试现在只返回 6 个异常值,因为异常值边界远离 Amount 列中的值的中点。

outliers_ar = accounts_receivable.outliers(keys = None, on = "Amount", distance = 3.5, method = "mean")

识别对每个客户而言反常的交易金额

对于应收账款数据帧中的每个客户,您想要识别任何反常的交易金额。

您决定将异常值边界设置为每个客户的交易组的标准偏差的 3 倍。

outliers_customer_ar = accounts_receivable.outliers(keys = ["CustNum"], on = "Amount", distance = 3, method = "mean")

该测试返回 7 个异常值。为每个客户的交易组报告平均值和标准偏差:

group no CustNum Amount mean stdev distance
0 65003 4,954.64 833.83 1015.58 3
1 262001 3,567.34 438.81 772.44 3
1 262001 (2,044.82) 438.81 772.44 3
2 376005 (931.55) 484.57 411.18 3
3 501657 5,549.19 441.14 1332.80 3
4 811002 3,409.82 672.10 634.20 3
5 925007 3,393.87 906.16 736.48 3

如何为客户 262001 识别异常值

客户 262001 在应收帐款数据帧中具有 101 个交易,其中有两个被报告为异常值,因为它们超过该客户的异常值边界:

异常值 下边界 上边界 异常值
(2,044.82) (1,878.51) 2,756.13 3,567.34

如何为客户 262001 计算异常值边界

异常值边界是客户 262001 的所有交易的平均值加上或减去这些交易的标准偏差的指定倍数。

所有客户 262001 交易的平均值 438.81
标准偏差的指定倍数 3
交易的标准偏差 772.44

438.81 ± (3 * 772.44)

= 438.81 ± 2,317.32

= (1,878.51)(下边界)

= 2,756.13(上边界)

使用 median 识别超出每个客户的正常值的交易金额

您使用 median 而不是 mean 执行与您在上面的示例中执行的测试相同的异常值测试。

outliers_customer_ar_median = accounts_receivable.outliers(keys = ["CustNum"], on = "Amount", distance = 3, method = "median")

该测试返回 10 个异常交易,而不是在之前测试中返回的 7 个交易。根据数据性质的不同,median 和 mean 可能返回稍微不同的结果:

group no CustNum Amount median stdev distance
0 65003 4,954.64 663.68 1015.58 3
1 262001 3,567.34 450.67 772.44 3
1 262001 (2,044.82) 450.67 772.44 3
2 376005 (931.55) 517.16 411.18 3
3 501657 4,426.14 146.80 1332.80 3
3 501657 5,549.19 146.80 1332.80 3
4 811002 3,409.82 624.53 634.20 3
5 925007 2,972.78 717.88 736.48 3
5 925007 3,030.71 717.88 736.48 3
5 925007 3,393.87 717.88 736.48 3

如何为每个客户计算异常值边界

异常值边界是每个客户的交易的中值,加上或减去这些交易的标准偏差的指定倍数。

例如,对于客户 262001:450.67 ± (3 * 772.44)

备注

输入数据帧中的所有列都被自动包括在输出数据帧中。不直接参与异常值计算的列被定位于输出数据帧的最右侧。