किसी डेटासेट से आउटलेर को कैसे निकालें


98

मुझे सुंदरता बनाम उम्र के कुछ बहुभिन्नरूपी आंकड़े मिले हैं। आयु 20-40 से 2 (20, 22, 24 .... 40) के अंतराल पर होती है, और डेटा के प्रत्येक रिकॉर्ड के लिए, उन्हें 1-5 से एक उम्र और एक सौंदर्य रेटिंग दी जाती है। जब मैं इस डेटा (एक्स-एक्सिस पर उम्र, वाई-अक्ष पर सौंदर्य रेटिंग) के बॉक्सप्लेट करता हूं, तो प्रत्येक बॉक्स के मूंछ के बाहर प्लॉट किए गए कुछ आउटलेयर होते हैं।

मैं इन आउटलेर्स को डेटा फ़्रेम से निकालना चाहता हूं, लेकिन मुझे यकीन नहीं है कि R अपने बॉक्स प्लॉट के लिए आउटलेर्स की गणना कैसे करता है। नीचे एक उदाहरण है कि मेरा डेटा कैसा दिख सकता है। यहां छवि विवरण दर्ज करें


2
boxplotसमारोह (अन्य आंकड़ों के अलावा) बाहरी कारकों के कारण रिटर्न अदृश्य। कोशिश करें foo <- boxplot(...); fooऔर ?boxplotआउटपुट को समझने के लिए पढ़ें ।
जोशुआ उलरिच

आपको प्रसाद के उत्तर पर दी गई टिप्पणी के अनुसार अपने प्रश्न को संपादित करना चाहिए!
aL3xa

@ aL3xa: यह दूसरे पैराग्राफ के पहले वाक्य में है।
जोशुआ उलरिच

24
प्रासंगिक: davidmlane.com/ben/outlier.gif
eyjo

क्या आप डेटा का लिंक भेज सकते हैं?
शब्दश्रृंग

जवाबों:


119

ठीक है, आपको अपने डेटासेट में ऐसा कुछ लागू करना चाहिए। बदलें और सहेजें या आप अपना डेटा नष्ट नहीं करेंगे! और, btw, आपको (लगभग) अपने डेटा से आउटलेर को कभी नहीं निकालना चाहिए:

remove_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.5 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- NA
  y[x > (qnt[2] + H)] <- NA
  y
}

इसे कार्रवाई में देखने के लिए:

set.seed(1)
x <- rnorm(100)
x <- c(-10, x, 10)
y <- remove_outliers(x)
## png()
par(mfrow = c(1, 2))
boxplot(x)
boxplot(y)
## dev.off()

और एक बार फिर, आपको अपने दम पर ऐसा कभी नहीं करना चाहिए, आउटलेयर बस होने के लिए हैं! =)

संपादित करें: मैंने na.rm = TRUEडिफ़ॉल्ट के रूप में जोड़ा ।

EDIT2: हटाए गए quantileफ़ंक्शन, ने सबस्क्रिप्टिंग को जोड़ा, इसलिए फ़ंक्शन तेज हो गया! =)

यहां छवि विवरण दर्ज करें


सहायता के लिए धन्यवाद! मुझे लगता है कि अगर आर बॉक्सप्लॉट में आउटलेर्स को आउटपुट करने में सक्षम है, तो मुझे इन मध्यस्थ गणनाओं को नहीं करना चाहिए। आउटलेयर को हटाने के लिए, यह सिर्फ एक असाइनमेंट के लिए है।
दान Q

3
ठीक है, मुझे यहाँ कुछ याद आ रहा है। आप डेटा से आउटलेर्स निकालना चाहते हैं, ताकि आप उनके साथ प्लॉट कर सकें boxplot। यह प्रबंधनीय है, और आपको अपने प्रश्न का उत्तर देने के बाद से @ प्रसाद के उत्तर को चिह्नित करना चाहिए। यदि आप "बाहरी नियम" का उपयोग करके आउटलेर को बाहर करना चाहते हैं q +/- (1.5 * H), इसलिए कुछ विश्लेषण चलाएं, तो इस फ़ंक्शन का उपयोग करें। BTW, मैंने इसे खरोंच, w / o Googling से किया है, इसलिए एक मौका है कि मैंने इस समारोह के साथ पहिया को फिर से तैयार किया है ...
aL3xa

10
आपको स्टैकओवरफ्लो पर असाइनमेंट प्रश्न नहीं पूछना चाहिए!
हैडले

7
क्या इसका मतलब यह है कि हमें इसका जवाब नहीं देना चाहिए? =)
aL3xa

5
"आउटलेयर सिर्फ होने के लिए हैं"? जरुरी नहीं। वे माप त्रुटियों से आ सकते हैं, और पूरी तरह से समीक्षा की जानी चाहिए। जब आउटलाइन बहुत बड़ी हो, तो इसका मतलब कुछ हो सकता है, या बहुत अधिक नहीं। इसीलिए (कम से कम जीव विज्ञान में) माध्यिका आमतौर पर औसत से अधिक जनसंख्या के बारे में कहती है।
रॉड्रिगो

132

किसी ने भी सरलतम उत्तर पोस्ट नहीं किया:

x[!x %in% boxplot.stats(x)$out]

इसे भी देखें: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/


4
वास्तव में सुरुचिपूर्ण। धन्यवाद। लेकिन अगर एक से अधिक मोड में वितरण की जरूरत है तो सावधानी बरतने की जरूरत है और आउटलेयर वास्तव में केवल कुछ और बिखरे हुए हैं।
कार्तिक्स

यदि आप डेटासेट में इनका इंडेक्स प्राप्त करने में सक्षम होते तो बहुत अच्छा होता। आपके द्वारा किया जाने वाला तरीका डेटा मान के आधार पर फ़िल्टर होगा। यदि बॉक्स प्लॉट भी समूहीकरण कर रहा है, तो जरूरी नहीं कि प्रत्येक समूह में समान डेटा मूल्य एक जैसा हो
adam

2
यह उल्लेख करना भी महत्वपूर्ण है कि यह डेटासेट नहीं बदलता है। यह सिर्फ एक फ़िल्टरिंग विधि है। इसलिए यदि आप आउटलेर के बिना डेटासेट का उपयोग करने का इरादा रखते हैं, तो इसे एक चर में असाइन करें जैसेresult = x[!x %in% boxplot.stats(x)$out]
विक्टर ऑगस्टो

कोड की सिर्फ एक पंक्ति होने का मतलब यह आसान नहीं है! हमेशा एक-लाइन कोड को समझना आसान नहीं होता है, विशेष रूप से शुरुआती लोगों के लिए, और बिना किसी टिप्पणी के।
PeyM87

29

outline = FALSEएक विकल्प के रूप में उपयोग करें जब आप बॉक्सप्लॉट करते हैं (मदद पढ़ें!)।

> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)

यहां छवि विवरण दर्ज करें


4
वास्तव में, यह आउटलेर्स को बॉक्सप्लेट से हटा देगा, लेकिन मैं डेटा फ्रेम से आउटलेर्स को हटाना चाहता हूं।
दान Q

2
मैं देखता हूं, तब @Joshua ने कहा कि आपको बॉक्सप्लेट फ़ंक्शन (विशेष रूप से सूची में आइटम outऔर groupआइटम) द्वारा लौटाए गए डेटा को देखने की आवश्यकता है ।
प्रसाद चलसानी २४'११

16

बॉक्सप्लॉट फ़ंक्शन प्लॉटिंग करने के लिए उपयोग किए गए मान लौटाता है (जो वास्तव में तब bxp द्वारा किया जाता है) ():

bstats <- boxplot(count ~ spray, data = InsectSprays, col = "lightgray") 
#need to "waste" this plot
bstats$out <- NULL
bstats$group <- NULL
bxp(bstats)  # this will plot without any outlier points

मैंने जानबूझकर विशिष्ट प्रश्न का उत्तर नहीं दिया क्योंकि मैं इसे "आउटलेर्स" को हटाने के लिए सांख्यिकीय कदाचार मानता हूं। मैं उन्हें एक बॉक्सप्लॉट में प्लॉट नहीं करने के लिए स्वीकार्य अभ्यास मानता हूं, लेकिन उन्हें सिर्फ इसलिए हटा देता हूं क्योंकि वे मानक विचलन की कुछ संख्या या अंतर-चतुर्थक चौड़ाई की कुछ संख्या से अधिक है जो अवलोकन रिकॉर्ड का एक व्यवस्थित और अवैज्ञानिक प्रबंधन है।


4
खैर, इस सवाल को दरकिनार किए बिना कि यह सवाल क्यों पूछा गया कि यह एक अच्छा अभ्यास नहीं है। हां, डेटा से 'आउटलेर्स' को हटाना अच्छा नहीं है, लेकिन कभी-कभी आपको विशिष्ट कार्यों के लिए डेटा को आउटलेयर के बिना की आवश्यकता होती है। हाल ही में मेरे पास एक सांख्यिकी असाइनमेंट में, हमें डेटा के उपयोग के लिए सर्वश्रेष्ठ प्रतिगमन मॉडल का निर्धारण करने के लिए इसके आउटलेयर के बिना एक सेट की कल्पना करनी थी। इसलिए वहाँ!
एलेक्स Essilfie

4
मैं इस सलाह के बारे में विचार नहीं कर रहा हूं कि आप इस संबंध में "सबसे अच्छा प्रतिगमन मॉडल निर्धारित करें" विशेष रूप से प्रेरक हो सकते हैं। इसके बजाय, यदि आपको उस कथित उद्देश्य के लिए आउटलेर्स को हटाने की आवश्यकता है, तो मुझे लगता है कि यह उन व्यक्तियों पर खराब दर्शाता है, जिन्होंने मेरी स्थिति की अमान्यता का सबूत होने के बजाय इसे सलाह दी थी।
IRTFM

जब आप जानते हैं कि आप "शोर" को हटा रहे हैं तो मुझे इसका कानूनी अनुमान है। विशेष रूप से शारीरिक डेटा में।
roscoe1895

हाँ। यदि आपके पास यह मानने का अच्छा कारण है कि एक अलग प्रक्रिया सिग्नल बनाती है, तो डेटा से हटाने का औचित्य है।
IRTFM

9

मैंने आउटलेर्स को हटाने से संबंधित पैकेजों की तलाश की, और यह पैकेज पाया (आश्चर्यजनक रूप से "आउटलेयर" कहा जाता है!): Https://cran.r-project.org/web/packages/outliers/outliers.pdf
यदि आप इसके माध्यम से जाते हैं आउटलेयर को हटाने के विभिन्न तरीकों को देखें और उनमें से मुझे rm.outlierउपयोग करने के लिए सबसे सुविधाजनक पाया गया और जैसा कि ऊपर दिए गए लिंक में कहा गया है: "यदि सांख्यिकीय परीक्षणों द्वारा आउटलाइयर का पता लगाया और पुष्टि की जाती है, तो यह फ़ंक्शन इसे हटा सकता है या नमूना माध्य या माध्यिका द्वारा प्रतिस्थापित कर सकता है" और यहाँ भी उसी स्रोत से उपयोग भाग है:
" उपयोग

rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)

तर्क
x एक डाटासेट, सबसे अधिक बार एक वेक्टर। यदि तर्क एक डेटाफ़्रेम है, तो नीलम द्वारा प्रत्येक कॉलम से एकमुश्त निकाल दिया जाता है। मैट्रिक्स दिए जाने पर एक ही व्यवहार लागू होता है।
भरें यदि TRUE पर सेट किया गया है, तो माध्य या माध्य को बाहरी की बजाय रखा जाता है। अन्यथा, आउटलाइज़ (s) बस हटा दिए जाते हैं।
माध्य यदि TRUE पर सेट किया जाता है, तो माध्य का उपयोग बाह्य प्रतिस्थापन में माध्य के बजाय किया जाता है। यदि TRUE पर सेट किया जाता है, तो विपरीत मूल्य देता है (यदि सबसे बड़े मूल्य का माध्य से अधिकतम अंतर है, तो यह सबसे छोटा और इसके विपरीत देता है) "


यह बहुत अच्छा लगता है, लेकिन अगर आपके डेटा फ्रेम में टाइम सीरीज़ का कॉलम है, तो यह टाइम सीरीज़ को बदल देता है।
PeyM87

7
x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]

मुझे यह बहुत आसान लगता है कि इसे बाहर निकालना आसान है। उपरोक्त उदाहरण में मैं सिर्फ 2 प्रतिशत से 98 प्रतिशत तक गुण मान निकाल रहा हूं।


5

नहीं होगा:

z <- df[df$x > quantile(df$x, .25) - 1.5*IQR(df$x) & 
        df$x < quantile(df$x, .75) + 1.5*IQR(df$x), ] #rows

इस कार्य को आसानी से पूरा करें?


4

@Sefarkas के सुझाव में जोड़कर और कट-ऑफ के रूप में क्वांटाइल का उपयोग करते हुए, कोई भी निम्नलिखित विकल्प का पता लगा सकता है:

newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) ) 

यह 99 वें क्वांटाइल से परे अंक को हटा देगा। ध्यान रखना चाहिए कि आउटलेक रखने के बारे में एएलए 3 एक्सए क्या कह रहा था। इसे केवल डेटा के वैकल्पिक रूढ़िवादी दृष्टिकोण को प्राप्त करने के लिए हटा दिया जाना चाहिए।


यह है 0.91या 0.99? में mydata$var < quantile(mydata$var, probs=c(.01, .91))[1])याmydata$var < quantile(mydata$var, probs=c(.01, .99))[1])
कोमल राठी

यदि आपके पास ९९ वें प्रतिशत के बजाय ९ ० प्रतिशत का उपयोग करने का एक विशिष्ट कारण है, तो आप इसका उपयोग कर सकते हैं। यह केवल एक
हेयुरिस्टिक है

1

ऐसा करने का 1 तरीका है

my.NEW.data.frame <- my.data.frame[-boxplot.stats(my.data.frame$my.column)$out, ]

या

my.high.value <- which(my.data.frame$age > 200 | my.data.frame$age < 0) 
my.NEW.data.frame <- my.data.frame[-my.high.value, ]

0

आउटलेर चोटियों के समान हैं, इसलिए आउटलेर्स की पहचान करने के लिए एक चोटी डिटेक्टर उपयोगी हो सकता है। वर्णित विधियहाँ z- स्कोर का उपयोग करके काफी अच्छा प्रदर्शन किया गया है। पृष्ठ के नीचे का एनीमेशन हिस्सा आउटलेर्स, या चोटियों पर सिग्नलिंग विधि को दिखाता है।

चोटियां हमेशा आउटलेर के समान नहीं होती हैं, लेकिन वे समान रूप से होती हैं।

एक उदाहरण यहां दिखाया गया है: यह डेटासेट सीरियल संचार के माध्यम से सेंसर से पढ़ा जाता है। समसामयिक धारावाहिक संचार त्रुटियां, सेंसर त्रुटि या दोनों बार-बार, स्पष्ट रूप से गलत डेटा बिंदुओं को जन्म देते हैं। इन बिंदुओं में कोई सांख्यिकीय मूल्य नहीं है। वे यकीनन आउटलेयर नहीं हैं, वे त्रुटियां हैं। Z- स्कोर पीक डिटेक्टर स्प्रिटियस डेटा बिंदुओं पर संकेत देने में सक्षम था और एक साफ परिणामी डेटासेट उत्पन्न करता था:यहां छवि विवरण दर्ज करें


-1

इसे इस्तेमाल करे। फ़ंक्शन में अपने वेरिएबल को फ़ीड करें और वेरिएबल में ओ / पी को बचाएं जिसमें हटाए गए आउटलेयर शामिल होंगे

outliers<-function(variable){
    iqr<-IQR(variable)
    q1<-as.numeric(quantile(variable,0.25))
    q3<-as.numeric(quantile(variable,0.75))
    mild_low<-q1-(1.5*iqr)
    mild_high<-q3+(1.5*iqr)
    new_variable<-variable[variable>mild_low & variable<mild_high]
    return(new_variable)
}

कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें। जवाब कैसे दें इसका संदर्भ लें ।
ejderuby
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.