在计算相关性时如何告诉R删除异常值?我从散点图中发现了一个潜在的异常值,并且我试图比较有和没有这个值的相关性.这是一个介绍统计课程; 我只是在玩这些数据来开始理解相关性和异常值.
我的数据如下:
"Australia" 35.2 31794.13
"Austria" 29.1 33699.6
"Canada" 32.6 33375.5
"CzechRepublic" 25.4 20538.5
"Denmark" 24.7 33972.62
...
Run Code Online (Sandbox Code Playgroud)
等等,对于26行数据.我试图找到第一个和第二个数字的相关性.
我确实读过这个问题,但是,我只想删除一个点,而不是一个百分点.R中是否有命令执行此操作?
我正在使用不同的标准偏差标准对两个通行证运行异常值检查pandas Series对象.但是,我使用两个循环,它运行速度非常慢.我想知道是否有任何大熊猫"伎俩"来加速这一步.
这是我正在使用的代码(警告非常丑陋的代码!):
def find_outlier(point, window, n):
return np.abs(point - nanmean(window)) >= n * nanstd(window)
def despike(self, std1=2, std2=20, block=100, keep=0):
res = self.values.copy()
# First run with std1:
for k, point in enumerate(res):
if k <= block:
window = res[k:k + block]
elif k >= len(res) - block:
window = res[k - block:k]
else:
window = res[k - block:k + block]
window = window[~np.isnan(window)]
if np.abs(point - window.mean()) >= std1 * window.std():
res[k] = np.NaN
# Second run with …
Run Code Online (Sandbox Code Playgroud) 我试图让ggplot2的geom_boxplot的胡须覆盖异常值.事实上,异常值不会显示为点,因为它们被箱图包围.
如果我使用标准的'boxplot',我将使用:
boxplot(x, range=n)
Run Code Online (Sandbox Code Playgroud)
其中ñ将是一个大数目,使得,而不是显示异常值,该箱线图的胡子延伸覆盖异常值.
如何用ggplot2完成?我试过了:
ggplot(myDF, aes(x=x, y=y)) +
geom_boxplot(range = 5)
Run Code Online (Sandbox Code Playgroud)
注意:我不想使用以下内容丢弃异常值:
geom_boxplot(outlier.shape = NA)
Run Code Online (Sandbox Code Playgroud) 我正在生成一个带有固定异常值数据的热图,我需要将这些异常值显示为我使用的“热”的 cmap 调色板中的颜色。通过使用 cmap.set_bad('green') 和 np.ma.masked_values(data, outlier),我得到了一个看起来正确的图,但是即使我使用 cmap.set_over,颜色条也没有与数据正确同步('绿色')。这是我一直在尝试的代码:
plt.xlim(0,35)
plt.ylim(0,35)
img=plt.imshow(data, interpolation='none',norm=norm, cmap=cmap,vmax=outlier)
cb_ax=fig.add_axes([0.85, 0.1, 0.03, 0.8])
cb=mpl.colorbar.ColorbarBase(cb_ax,cmap=cmap,norm=norm,extend='both',spacing='uniform')
cmap.set_over('green')
cmap.set_under('green')
Run Code Online (Sandbox Code Playgroud)
这是数据(异常值显然是 1.69):
Data;A;B;C;D;E;F;G;H;I;J;K
A;1.2;0;0;0;0;1.69;0;0;1.69;1.69;0
B;0;0;0;0;0;1.69;0;0;1.69;1.69;0
C;0;0;0;0;0;1.69;0;0.45;1.69;1.69;0.92
D;1;0;-0.7;-1.2;0;1.69;0;0;1.69;1.69;0
E;0;0;0;0;0;1.69;0;0;1.69;1.69;0
F;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69
G;0;0;0;0;0;1.69;0;0;1.69;1.69;0
H;0;0;0;0;0;1.69;0;0;1.69;1.69;0
I;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69
J;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69
K;0;0;0;0;0;1.69;0;0;1.69;1.69;0
Run Code Online (Sandbox Code Playgroud)
感谢任何帮助
我试图标签上使用卡方QQ图离群mvOutlier()
的功能MVN
包R
。
我设法通过标签识别异常值并获得它们的x坐标。我尝试使用 将前者放在图上text()
,但x和y坐标似乎被翻转了。
基于文档中的示例:
library(MVN)
data(iris)
versicolor <- iris[51:100, 1:3]
# Mahalanobis distance
result <- mvOutlier(versicolor, qqplot = TRUE, method = "quan")
labelsO<-rownames(result$outlier)[result$outlier[,2]==TRUE]
xcoord<-result$outlier[result$outlier[,2]==TRUE,1]
text(xcoord,label=labelsO)
Run Code Online (Sandbox Code Playgroud)
这会产生以下结果:
我也试过text(x = xcoord, y = xcoord,label = labelsO)
,当点靠近 y = x 线时很好,但当不满足正态性时可能会失败(并且点偏离这条线)。
有人可以建议如何访问卡方分位数或为什么函数的x坐标text()
似乎不服从输入参数。
我有与此相关的新问题,我的主题 删除 r 中的异常值并考虑名义 var。在新情况下,变量 x 和 x1 具有不同的长度
x <- c(-10, 1:6, 50)
x1<- c(-20, 1:5, 60)
z<- c(1,2,3,4,5,6,7,8)
bx <- boxplot(x)
bx$out
bx1 <- boxplot(x1)
bx1$out
x<- x[!(x %in% bx$out)]
x1 <- x1[!(x1 %in% bx1$out)]
x_to_remove<-which(x %in% bx$out)
x <- x[!(x %in% bx$out)]
x1_to_remove<-which(x1 %in% bx1$out)
x1 <- x1[!(x1 %in% bx1$out)]
z<-z[-unique(c(x_to_remove,x1_to_remove))]
z
data.frame(cbind(x,x1,z))
Run Code Online (Sandbox Code Playgroud)
然后我收到警告
Warning message:
In cbind(x, x1, z) :
number of rows of result is not a multiple of vector length (arg 2)
Run Code Online (Sandbox Code Playgroud)
所以在新的数据框中 …
我试图用我的密度图识别异常值。我目前正在使用 seaborn 库来绘制我的数据。我将如何识别异常值?我一直在考虑使用 stats 库实现 Z-score,这是唯一可以实现的方法,这不能在密度图中完成吗?
我找到了一个函数来检测列中的异常值,但我不知道如何删除异常值
是否有从列中排除或删除异常值的函数
这是检测异常值的函数,但我需要帮助删除异常值的函数
import numpy as np
import pandas as pd
outliers=[]
def detect_outlier(data_1):
threshold=3
mean_1 = np.mean(data_1)
std_1 =np.std(data_1)
for y in data_1:
z_score= (y - mean_1)/std_1
if np.abs(z_score) > threshold:
outliers.append(y)
return outliers
Run Code Online (Sandbox Code Playgroud)
这里是打印异常值
#printing the outlier
outlier_datapoints = detect_outlier(df['Pre_TOTAL_PURCHASE_ADJ'])
print(outlier_datapoints)
Run Code Online (Sandbox Code Playgroud) 我有一个包含 30 列和 >10,000 行的数据框。
我如何对一组变量运行异常值分析,如果任何变量超过特定阈值(对于该给定变量),则返回 TRUE,如果不满足任何异常值阈值 (3SD),则返回 FALSE变量,TRUE/FALSE 值显示在新列中?
我使用分位数来找到每个变量的 3 个标准偏差截止值:
IE:
quantile(df$a, 0.003, na.rm = T) #and
quantile(df$a, 0.997, na.rm = T)
Run Code Online (Sandbox Code Playgroud)
假设第一个值是 2.5,这个变量的上限值是 10.5,然后我创建了一个新变量:
df$outliers <- (df$a <- df$a <2.5 | df$a > 10.5)
Run Code Online (Sandbox Code Playgroud)
当 a 列中的值小于 2.5 或大于 10.5 时,它给出 TRUE 值。
我想做的是让 df$outliers 代表一组列的异常值状态,而不仅仅是一个列,即列 d、e、f、g、l、m 等,它们都有自己的阈值遇见。
做这个的最好方式是什么?
我有一个没有目标值的值样本。实际上,X 特征(预测变量)全部用于拟合隔离森林估计器。目标是确定哪些 X 特征以及未来出现的特征实际上是异常值。举例来说,假设我拟合一个数组 (340,3) => (n_samples, n_features)并且我预测这些特征来识别 340 个观察值中哪些是异常值。
到目前为止我的方法是:
首先我创建一个管道对象
from sklearn.pipeline import Pipeline
from sklearn.ensemble import IsolationForest
from sklearn.model_selection import GridSearchCV
steps=[('IsolationForest', IsolationForest(n_jobs=-1, random_state=123))]
pipeline=Pipeline(steps)
Run Code Online (Sandbox Code Playgroud)
然后我创建一个用于超参数调整的参数网格
parameteres_grid={'IsolationForest__n_estimators':[25,50,75],
'IsolationForest__max_samples':[0.25,0.5,0.75,1.0],
'IsolationForest__contamination':[0.01,0.05],
'IsolationForest__bootstrap':[True, False]
}
Run Code Online (Sandbox Code Playgroud)
最后,我应用GridSearchCV算法
isolation_forest_grid=GridSearchCV(pipeline, parameteres_grid, scoring=scorer_f, cv=3, verbose=2)
isolation_forest_grid.fit(scaled_x_features.values)
Run Code Online (Sandbox Code Playgroud)
我的目标是确定最适合的评分函数(记为Scorer_f ),它将有效地选择最合适的隔离森林估计器来进行异常值检测。
到目前为止,基于这个出色的答案,我的评分如下:
isolation_forest_grid=GridSearchCV(pipeline, parameteres_grid, scoring=scorer_f, cv=3, verbose=2)
isolation_forest_grid.fit(scaled_x_features.values)
Run Code Online (Sandbox Code Playgroud)
简单解释一下,我不断地将批次中 5%(0.05 分位数)的观察值识别为异常值。因此,每个低于阈值的分数都被表示为异常值。因此,我指示 GridSearch 函数选择异常值最多的模型作为最坏情况。
让您尝尝结果:
isolation_forest_grid.cv_results_['mean_test_score']
array([4. , 4. , 4. , …
Run Code Online (Sandbox Code Playgroud) python machine-learning outliers scikit-learn isolation-forest
outliers ×10
python ×5
r ×5
dataframe ×2
pandas ×2
boxplot ×1
colorbar ×1
correlation ×1
density-plot ×1
dplyr ×1
ggplot2 ×1
heatmap ×1
label ×1
matplotlib ×1
mean ×1
scikit-learn ×1
scipy ×1
seaborn ×1