r语言 - 标记组内重复度量的异常值(假设有数千个组)



我想识别学区误报的值。有 10,000 个学区,我收集了 14 年的学区以及他们每年每个学生的平均支出金额。如果前五年,这些值在 6 - 9000 美元的范围内,但在第二年,即 2013 年,该学区(及其相应的城市(报告每个学生的支出为 15,000 美元;无论出于何种原因,该值很有可能被误报。有一些方法可以追踪正确的价值,但 15000 美元可能是错误的陈述,不应该使用。

我创建了一个大型数据集来查看教育支出(每个学生的学区支出(和犯罪率,因此我在 14 年期间重复了市、县、学区的值。我查看了每个学生支出的学区数据集的最大值/最小值(并查看了散点图(,并确定了异常情况。这让我意识到,可能存在错误报告的学区支出,这对于数据集来说并不极端(尽管它们在该特定学区中是极端的(。

如果我想根据标准偏差将值标记为误报,我可以使用:

flags<-
dat%>%
group_by(full_district_id)%>%
mutate(sd.district_id = sd(EXPENDITURE_PER_STUDENT, na.rm = TRUE),
flag = ifelse(full_district_id > 2* sd.district_id, "greater",
ifelse(full_district_id< 2 * sd.district_id, "smaller", "nothing"))%>%
ungroup()%>%
filter(flag == "greater"|flag == "smaller")

但我认为最好看看前一年(或前五年(,看看那一年是否是异常的。因此,如果一个值比前五年中的任何一年都多 4000 美元,则该值将被标记。我不确定如何写一个条件,比如如果前 x 年的学区支出超过 4000 美元,然后标记这个值。然后我查看这些值并寻找它们的正确值。

我用谷歌搜索了各种东西,但没有一个是我真正想要的。

这是我数据集的一小部分,所以你可以了解正在发生的事情;虽然作为参考,它有超过100,000个值。 u2028多谢!

数据输出

structure(list(year = c(2003, 2005, 2006, 2007, 2008, 2009, 2010, 
2011, 2012, 2013, 2014, 2015, 2016, 2003, 2005, 2006, 2007, 2009, 
2010, 2011), PLACE_ID = c("0100124", "0100124", "0100124", "0100124", 
"0100124", "0100124", "0100124", "0100124", "0100124", "0100124", 
"0100124", "0100124", "0100124", "0100460", "0100460", "0100460", 
"0100460", "0100460", "0100460", "0100460"), CITY = c("abbeville", 
"abbeville", "abbeville", "abbeville", "abbeville", "abbeville", 
"abbeville", "abbeville", "abbeville", "abbeville", "abbeville", 
"abbeville", "abbeville", "adamsville", "adamsville", "adamsville", 
"adamsville", "adamsville", "adamsville", "adamsville"), COUNTY_ID = c("01067", 
"01067", "01067", "01067", "01067", "01067", "01067", "01067", 
"01067", "01067", "01067", "01067", "01067", "01073", "01073", 
"01073", "01073", "01073", "01073", "01073"), full_district_id = c("0101740", 
"0101740", "0101740", "0101740", "0101740", "0101740", "0101740", 
"0101740", "0101740", "0101740", "0101740", "0101740", "0101740", 
"0101920", "0101920", "0101920", "0101920", "0101920", "0101920", 
"0101920"), EXPENDITURE_PER_STUDENT = c(6.91392685629849, 6.80427570954663, 
7.42387732749179, 7.80973129992738, 8.57273726639795, 8.14466546112116, 
7.91766361717101, 7.57727272727273, 7.50594166366583, 7.91607343574372, 
8.26783670354826, 8.4435736677116, 8.48149606299213, 5.93085371942087, 
6.31827864279556, 7.21194954512474, 7.96307522733535, 8.61417039862885, 
9.07166232181485, 8.87169548243168)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -20L))

下面定义了每个district_id的异常值并保留行,其中每个学生的支出不是异常值(为每个地区单独定义(:

library(dplyr)
library(outliers)
View(df %>%
group_by(full_district_id) %>%
arrange(year)%>% 
filter(!EXPENDITURE_PER_STUDENT %in% c(outlier(EXPENDITURE_PER_STUDENT))))

最新更新