我有一个包含产品成本信息的数据集,该数据集按制造商 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
我将此回复放在答案中对问题的编辑,因为代表不适合评论。当所有产品 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