关于异常值检测,我有几组问题:
我们可以使用k-means找到异常值,这是一个好方法吗?
是否有任何聚类算法不接受用户的任何输入?
我们可以使用支持向量机或任何其他监督学习算法进行异常值检测吗?
每种方法的优缺点是什么?
我在这里 [在.txt文件中] 有一些数据,我读入数据帧df,
df <- read.table("data.txt", header=T,sep="\t")
Run Code Online (Sandbox Code Playgroud)
我使用以下代码删除列中的负值x
(因为我只需要正值)df
,
yp <- subset(df, x>0)
Run Code Online (Sandbox Code Playgroud)
现在我想在同一层中绘制多个箱形图.我首先融化数据框df
,结果图包含几个异常值,如下所示.
# Melting data frame df
df_mlt <-melt(df, id=names(df)[1])
# plotting the boxplots
plt_wool <- ggplot(subset(df_mlt, value > 0), aes(x=ID1,y=value)) +
geom_boxplot(aes(color=factor(ID1))) +
scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) +
theme_bw() +
theme(legend.text=element_text(size=14), legend.title=element_text(size=14))+
theme(axis.text=element_text(size=20)) +
theme(axis.title=element_text(size=20,face="bold")) +
labs(x = "x", y = "y",colour="legend" ) +
annotation_logticks(sides = "rl") +
theme(panel.grid.minor = element_blank()) +
guides(title.hjust=0.5) +
theme(plot.margin=unit(c(0,1,0,0),"mm"))
plt_wool …
Run Code Online (Sandbox Code Playgroud) 我有200个数据行(意味着一小组数据).我想进行一些统计分析,但在此之前我想排除异常值.
为此目的有哪些潜在的算法?准确性是一个值得关注的问题.
我对Stats很新,所以需要非常基本的帮助.
我对一些异常值有困难,使得色标无用.
我的数据有一个基于范围的Length变量,但通常会有一些更大的值.以下示例数据具有介于500和1500之间的95个值,以及超过50,000的5个值.当我想看到500到1500之间的颜色变化时,由此产生的颜色图例倾向于使用10k,20k,... 70k的颜色变化.真的,1300左右的任何东西应该是相同的纯色(可能是中位+/-疯狂),但我不知道在哪里定义.
我对任何ggplot解决方案持开放态度,但理想情况下,较低的值将是红色,中间白色和较高的蓝色(低值很差).在我自己的数据集中,date是ggplot aes()中as.POSIXct()的实际日期,但似乎不影响该示例.
#example data
date <- sample(x=1:10,size=100,replace=T)
stateabbr <- sample(x=1:50,size=100,replace=T)
Length <- c(sample(x=500:1500,size=95,replace=T),60000,55000,70000,50000,65000)
x <- data.frame(date=date,stateabbr=stateabbr,Length=Length)
#main plot
(g <- ggplot(data=x,aes(x=date,y=factor(stateabbr))) +
geom_point(aes(color=as.numeric(as.character(Length))),alpha=3/4,size=4) +
#scale_x_datetime(labels=date_format("%m/%d")) +
opts(title="Date and State") + xlab("Date") + ylab("State"))
#problem
g + scale_color_gradient2("Length",midpoint=median(x$Length))
Run Code Online (Sandbox Code Playgroud)
添加trans ="log"或"sqrt"也不是很有效.
谢谢您的帮助!
如何调整我的Y轴以忽略异常值,就像在这篇文章中一样,但是在一个更具挑战性的情况下,我有4个箱图和"自由刻面"布局?
p < - ggplot(molten.DF,aes(x = class,y = SOC,fill = class))+ geom_boxplot()+ facet_grid(layer~.,scales ="free",space ="free")
正如您在我的图中所看到的,考虑Y轴范围内的异常值会使框更难以阅读.如果结果中仍然可以看到一些异常值,那就不重要了,但我想真正关注这些方块!
我想反复将Grubbs测试应用于一组数据,直到它不再找到异常值.我希望标记异常值而不是删除异常值,以便我可以将数据绘制为直方图,异常值为不同颜色.我已经使用了异常值包中的grubbs.test来手动识别异常值,但无法弄清楚如何循环它们并成功标记它们.我的目标输出类似如下:
X Outlier
152.36 Yes
130.38 Yes
101.54 No
96.26 No
88.03 No
85.66 No
83.62 No
76.53 No
74.36 No
73.87 No
73.36 No
73.35 No
68.26 No
65.25 No
63.68 No
63.05 No
57.53 No
Run Code Online (Sandbox Code Playgroud) 我一直在寻找使用R来识别多变量异常值的最佳方法,但我认为我还没有找到任何可信的方法.
我们可以将虹膜数据作为示例,因为我的数据还包含多个字段
data(iris)
df <- iris[, 1:4] #only taking the four numeric fields
Run Code Online (Sandbox Code Playgroud)
首先,我正在使用距离图书馆MVN的马哈拉诺比斯距离
library(MVN)
result <- mvOutlier(df, qqplot = TRUE, method = "quan") #non-adjusted
result <- mvOutlier(df, qqplot = TRUE, method = "adj.quan") #adjusted Mahalonobis distance
Run Code Online (Sandbox Code Playgroud)
两者都产生了大量的异常值(非调整的150个中有50个,调整后为49/150个),我认为需要更多的改进.遗憾的是,我似乎无法在mvOutlier方法中找到一个设置阈值的变量(表示增加一个点为异常值的概率,因此我们的数字较小)
其次,我使用了异常库.这是为了找到单变量异常值.因此,我的计划是在数据的每个维度上找到异常值,并且那些在所有维度上都是异常值的点被视为数据集的异常值.
library(outliers)
result <- scores(df, type="t", prob=0.95) #t test, probability is 0.95
result <- subset(result, result$Sepal.Length == T & result$Sepal.Width == T & result$Petal.Length == T & result$Petal.Width == T)
Run Code Online (Sandbox Code Playgroud)
为此,我们可以设置概率,但我不认为它可以取代多变量异常值检测.
我试过的其他一些方法
我正在使用boxplot绘制非正态分布,并有兴趣使用matplotlib的boxplot函数找出异常值.
除了情节,我有兴趣找出我的代码中的点的值,这些点在箱图中显示为异常值.有没有什么办法可以从boxplot对象中提取这些值以用于我的下游代码?
我有一个包含40列和许多记录的DataFrame df.
DF:
User_id | Col1 | Col2 | Col3 | Col4 | Col5 | Col6 | Col7 |...| Col39
Run Code Online (Sandbox Code Playgroud)
对于除user_id列之外的每个列,我想检查异常值并删除孔记录,如果出现异常值.
对于每行的异常值检测,我决定简单地使用第5和第95百分位数(我知道它不是最好的统计方法):
编码我到目前为止:
P = np.percentile(df.Col1, [5, 95])
new_df = df[(df.Col1 > P[0]) & (df.Col1 < P[1])]
Run Code Online (Sandbox Code Playgroud)
问题:如何在不执行此操作的情况下将此方法应用于所有列(user_id除外)?我的目标是获取没有具有异常值的记录的数据帧.
谢谢!
我的数据集中有一些非常非常少的异常值使得箱图难以阅读:
library(ggplot2)
mtcars$mpg[1] <- 60
p <- ggplot(mtcars, aes(factor(cyl), mpg))
p + geom_boxplot()
Run Code Online (Sandbox Code Playgroud)
因此,我想指出这样的极端异常值:
任何想法如何做到这一点ggplot2
?转换轴不是我的选择......
outliers ×10
r ×6
ggplot2 ×4
boxplot ×2
python ×2
data-mining ×1
facet ×1
gradient ×1
mahalanobis ×1
matplotlib ×1
pandas ×1
scale ×1
statistics ×1
svm ×1