识别单个组或组组合中的异常值

问题描述 投票:0回答:1

我有一个包含产品成本信息的数据集,该数据集按制造商 ID、经销商 ID 和产品 ID 分组。

样本数据:

        Manufacturer Reseller Product_ID Avg_Cost
 1:         M001     R001       P001       10
 2:         M001     R002       P001       15
 3:         M001     R002       P002      100
 4:         M002     R001       P003       40
 5:         M002     R003       P003       50
 6:         M002     R004       P004        3
 7:         M003     R001       P001       12
 8:         M004     R002       P001      520
 9:         M004     R005       P002      125
10:         M005     R002       P002      300
11:         M005     R006       P004        8
12:         M005     R007       P005       30
13:         M005     R008       P005       30

我的目标是在每个产品的 avg_cost 上查找和分类离群值实例(这可能会迭代,但从像 3*IQR 这样简单的东西开始就可以了,如果需要指定的话)。我想知道异常值是由制造商、经销商还是两者共同造成的。我尝试使用 rstatix 库中的 identify_outliers 函数,因为它允许分组 - 但我看不到我正在寻找的所需输出的路径,如下所示:

    Manufacturer Reseller Product_ID Avg_Cost m_outlier r_outlier mr_outlier
 1:         M001     R001       P001       10         0         0          0
 2:         M001     R002       P001       15         0         0          0
 3:         M001     R002       P002      100         0         0          0
 4:         M002     R001       P003       40         1         0          0
 5:         M002     R003       P003       50         0         1          0
 6:         M002     R004       P004        3         0         0          0
 7:         M003     R001       P001       12         0         0          0
 8:         M004     R002       P001      520         0         1          1
 9:         M004     R005       P002      125         0         0          0
10:         M005     R002       P002      300         1         0          0
11:         M005     R006       P004        8         0         1          0
12:         M005     R007       P005       30         0         0          0
13:         M005     R008       P005       30         0         0          0

在数据集中,大约有 100 个制造商、50000 个经销商和 1000 个产品,平均每个制造商有约 400 个经销商。

如果我需要分段执行此操作并将该部分的制造商 ID + 经销商 ID 连接起来,那么应该没问题。但是,如果您能提供有关此类情况最佳实践的任何指导,我们将不胜感激。如果我可以提供任何其他信息来使这个问题变得更好,请告诉我!

编辑:identify_outliers似乎无法获得所需的输出。任何其他建议将不胜感激!

将组中的所有值标记为离群值的identify_outliers示例问题:

# A tidytable: 23 x 2
   product     cost
       <chr>      <dbl>
     1 a            1  
     2 a            1.1
     3 a            1.2
     4 a            1.3
     5 a            1.4
     6 a            1.5
     7 a            1  
     8 a            2  
     9 a            1  
    10 a            1.6
    11 a            1.7
    12 a            1.8
    13 a            2  
    14 b         2422  
    15 b         2526  
    16 b         2600  
    17 b         2590  
    18 b       123424  
    19 c            4  
    20 c            3  
    21 c            1  
    22 c            2  
    23 c            1  


  tmp %>%
      group_by(product) %>%
      identify_outliers(cost)

# A tidytable: 5 x 4
  product   cost is.outlier is.extreme
  <chr>    <dbl> <lgl>      <lgl>     
1 b         2422 TRUE       TRUE      
2 b         2526 TRUE       TRUE      
3 b         2600 TRUE       TRUE      
4 b         2590 TRUE       TRUE      
5 b       123424 TRUE       TRUE 
r outliers anomaly-detection
1个回答
0
投票

我将此回复放在答案中对问题的编辑,因为代表不适合评论。当所有产品 b 被选为异常值时,我没有得到问题中显示的结果。

我的 dplyr 和 rstatix 版本是:

rstatix_0.7.2    dplyr_1.1.4 

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(rstatix)
#> 
#> Attaching package: 'rstatix'
#> The following object is masked from 'package:stats':
#> 
#>     filter
tmp <- structure(list(product = c("a", "a", "a", "a", "a", "a", "a", 
                                  "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "c", "c", 
                                  "c", "c", "c"), 
                      cost = c(1, 1.1, 1.2, 1.3, 1.4, 1.5, 1, 2, 1, 
                               1.6, 1.7, 1.8, 2, 2422, 2526, 2600, 2590, 123424, 4, 3, 1, 2, 
                               1)), class = "data.frame", row.names = c(NA, -23L))
tmp %>%
  group_by(product) %>%
  identify_outliers(cost)
#> # A tibble: 1 × 4
#>   product   cost is.outlier is.extreme
#>   <chr>    <dbl> <lgl>      <lgl>     
#> 1 b       123424 TRUE       TRUE

创建于 2024 年 11 月 25 日,使用 reprex v2.1.1

© www.soinside.com 2019 - 2024. All rights reserved.