কীভাবে ডেটাসেট থেকে আউটলিয়ারগুলি সরিয়ে ফেলা যায়


101

আমি বয়সের বয়সের সৌন্দর্যের কিছু মাল্টিভাটার তথ্য পেয়েছি। 2 (20, 22, 24 .... 40) এর বিরতিতে বয়সগুলি 20-40 থেকে বিস্তৃত হয় এবং প্রতিটি রেকর্ডের জন্য তাদের বয়স এবং 1-5 থেকে একটি সৌন্দর্য রেটিং দেওয়া হয়। আমি যখন এই ডেটাটির বাক্সপ্লটগুলি করি (এক্স-অক্ষ জুড়ে বয়সেরগুলি, ওয়াই-অক্ষটি জুড়ে বিউটি রেটিং), তখন প্রতিটি বাক্সের হুইস্কারের বাইরে কিছু আউটলিয়ার প্লট করা হয়।

আমি এই আউটলিয়ারদের ডেটা ফ্রেম থেকেই সরাতে চাই, তবে আমি নিশ্চিত নই যে আর এর বাক্স প্লটের জন্য কীভাবে বিদেশী গণনা করে। নীচে আমার ডেটা দেখতে কেমন হতে পারে তার একটি উদাহরণ দেওয়া আছে। এখানে চিত্র বর্ণনা লিখুন


4
boxplotফাংশন (অন্যান্য পরিসংখ্যান মধ্যে) outliers ফেরৎ অলক্ষ্যে। আউটপুট বুঝতে চেষ্টা করুন foo <- boxplot(...); fooএবং পড়ুন ?boxplot
জোশুয়া উলিরিচ

আপনি @ প্রসাদের উত্তরে দেওয়া মন্তব্য অনুসারে আপনার প্রশ্নটি সম্পাদনা করা উচিত!
aL3xa

@ aL3xa: এটি দ্বিতীয় অনুচ্ছেদের প্রথম বাক্যে রয়েছে।
জোশুয়া উলিরিচ

24
প্রাসঙ্গিক: davidmlane.com/ben/outlier.gif
eyjo

আপনি কি ডেটাতে একটি লিঙ্ক পাঠাতে পারেন?
শব্দসুখে

উত্তর:


120

ঠিক আছে, আপনার নিজের ডেটাসেটে এই জাতীয় কিছু প্রয়োগ করা উচিত। প্রতিস্থাপন ও সংরক্ষণ করবেন না বা আপনি আপনার ডেটা ধ্বংস করবেন! এবং, বিটিডব্লিউ, আপনার (প্রায়) কখনই আপনার ডেটা থেকে আউটলিয়ারগুলি অপসারণ করা উচিত নয়:

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 ফাংশন মুছে ফেলা হয়েছে, সাবস্ক্রিপিং যুক্ত করা হয়েছে, সুতরাং ফাংশনটি দ্রুত তৈরি করে! =)

এখানে চিত্র বর্ণনা লিখুন


সাহায্যের জন্য ধন্যবাদ! আমি ভাবব যে আর বাক্সপ্লট-এ আউটলিয়ারগুলিকে আউটপুট দিতে সক্ষম হলে আমার এই মধ্যস্থতাকারী গণনাগুলি করা উচিত নয়। বহিরাগতদের মুছে ফেলার ক্ষেত্রে এটি কেবল একটি কার্যভারের জন্য।
ড্যান কিউ

4
ঠিক আছে, আমি এখানে কিছু মিস করছি। আপনি ডেটা থেকে বহিরাগতদের সরাতে চান, যাতে আপনি তাদের দিয়ে প্লট করতে পারেন boxplot। এটি পরিচালনাযোগ্য এবং আপনার প্রশ্নের উত্তর দেওয়ার পরে আপনার @ প্রসাদের উত্তরটি চিহ্নিত করা উচিত। আপনি যদি "আউটিলার বিধি" ব্যবহার করে আউটলিয়ারদের বাদ দিতে চান q +/- (1.5 * H), তাই কিছু বিশ্লেষণ চালান, তবে এই ফাংশনটি ব্যবহার করুন। বিটিডাব্লু, আমি স্ক্র্যাচ থেকে এটি করেছি, ডাব্লু / ও গুগলিং, তাই এমন একটি সুযোগ আছে যে আমি আমার এই ক্রিয়াকলাপটি দিয়ে চাকাটি পুনর্নবীকরণ করেছি ...
aL3xa

10
আপনি স্ট্যাকওভারফ্লোতে অ্যাসাইনমেন্ট প্রশ্ন জিজ্ঞাসা করা উচিত নয়!
hadley

7
তার মানে কি আমাদের এটির উত্তর দেওয়া উচিত নয়? =)
aL3xa

5
"আউটলিয়ারদের বলতে কি বোঝানো হয়"? অগত্যা। এগুলি পরিমাপের ত্রুটি থেকে আসতে পারে এবং অবশ্যই তাদের পুঙ্খানুপুঙ্খ পর্যালোচনা করা উচিত। যখন আউটলেটর খুব বড় হয় তখন এর অর্থ কিছু হতে পারে বা খুব বেশি কিছু নয়। এজন্য (কমপক্ষে জীববিজ্ঞানে) মিডিয়ান সাধারণত গড়ের চেয়ে জনসংখ্যার বিষয়ে আরও বেশি কিছু বলে।
রডরিগো

137

সহজ উত্তর কেউ পোস্ট করেনি:

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

এটিও দেখুন: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/


4
সত্যিই মার্জিত। ধন্যবাদ তবে বিতরণে যদি একাধিক মোড থাকে এবং আউটলিয়াররা সত্যিকার অর্থে খুব কম এবং বিক্ষিপ্ত হয় তবে সাবধান হওয়া দরকার।
কার্তিকস

আপনি যদি কোনও ডেটাসেটে তাদের সূচক পেতে সক্ষম হন তবে দুর্দান্ত হত। আপনি যেভাবে সম্পন্ন করেছেন তা ডেটা মানের ভিত্তিতে ফিল্টার করবে। যদি বক্স প্লটটিও গ্রুপিং করছে, অগত্যা নয় যে প্রতিটি গ্রুপে একই উপাত্তের মান বহিরাগত হবে
অ্যাডাম

4
এটি ডেটাসেট পরিবর্তন করে না তা উল্লেখ করাও গুরুত্বপূর্ণ। এটি কেবল একটি ফিল্টারিং পদ্ধতি। সুতরাং আপনি যদি আউটলেট না করে ডেটাসেট ব্যবহার করতে চান তবে এটিকে একটি ভেরিয়েবলের জন্য বরাদ্দ করুন। উদাহরণস্বরূপresult = x[!x %in% boxplot.stats(x)$out]
ভিক্টর আগস্টো 18

কোডের এক লাইন থাকা মানেই এটি সহজ নয়! এক-লাইন কোডটি বোঝা সর্বদা সহজ নয়, বিশেষত নতুনদের জন্য এবং কোনও মন্তব্য ছাড়াই।
PeyM87

29

outline = FALSEবক্সপ্লট করার সময় বিকল্প হিসাবে ব্যবহার করুন (সহায়তা পড়ুন!)।

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

এখানে চিত্র বর্ণনা লিখুন


4
প্রকৃতপক্ষে, এটি বাক্সপ্লট থেকেই আউটলিরদের সরিয়ে ফেলবে, তবে আমি ডেটা ফ্রেম থেকে আউটলিয়ারদের সরাতে চাই।
ড্যান কিউ

4
আমি দেখতে পাচ্ছি, তারপরে @ জোশুয়া বলেছিলেন যে আপনাকে বক্সপ্লট ফাংশন দ্বারা ফিরিয়ে নেওয়া ডেটা (বিশেষত তালিকার আইটেম outএবং groupআইটেম) দেখতে হবে।
প্রসাদ চালশানী

16

বক্সপ্লট ফাংশন প্লট করার জন্য ব্যবহৃত মানগুলি ফেরত দেয় (যা আসলে বিসিপিএফ দ্বারা সম্পন্ন হয়):

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

আমি উদ্দেশ্যমূলকভাবে নির্দিষ্ট প্রশ্নের উত্তর দেইনি কারণ আমি "আউটলিয়ার" অপসারণের জন্য এটি পরিসংখ্যানগত অপব্যবহার বিবেচনা করি। আমি এটি বক্সপ্লটে তাদের চক্রান্ত না করা গ্রহণযোগ্য অনুশীলন হিসাবে বিবেচনা করি, তবে এগুলি কেবলমাত্র কয়েকটি মানক বিচ্যুতি বা কিছু সংখ্যক আন্তঃ চৌম্বক প্রস্থকে অতিক্রম করার কারণে এগুলি পর্যবেক্ষণের রেকর্ডের একটি নিয়মতান্ত্রিক এবং অবৈজ্ঞানিক ম্যাংলিং consider


4
ওয়েল, প্রশ্নটি কেন জিজ্ঞাসা করা হয়েছিল তা জেনেও প্রশ্নটিকে পাশ কাটিয়ে নেওয়া ভাল অভ্যাস নয়। হ্যাঁ, ডেটা থেকে 'আউটলিয়ার' সরিয়ে ফেলা ভাল নয় তবে কখনও কখনও নির্দিষ্ট কাজের জন্য আপনাকে অপ্রদর্শক ছাড়াই ডেটা প্রয়োজন। আমি সম্প্রতি একটি পরিসংখ্যান অ্যাসাইনমেন্টে, ডেটা ব্যবহারের জন্য সর্বোত্তম রিগ্রেশন মডেল নির্ধারণ করতে আমাদের এর সেটলাইনকারীদের ছাড়াই একটি সেটটি কল্পনা করতে হয়েছিল। তাই তো!
অ্যালেক্স এসিলফি

4
বিশেষভাবে অনুপ্রেরণীয় হওয়ার জন্য "সেরা প্রতিরোধের মডেল নির্ধারণ করতে" আপনি এই বিষয়ে যে পরামর্শটি অর্জন করতে পারেন তা আমি বিবেচনা করছি না। পরিবর্তে, যদি আপনার অস্পষ্টভাবে বলা উদ্দেশ্যটির জন্য আউটলিয়ারগুলি অপসারণের প্রয়োজন হয়, তবে আমি মনে করি এটি আমার অবস্থানের অযোগ্যতার প্রমাণ হওয়ার চেয়ে পরামর্শ দেওয়া ব্যক্তিদের প্রতি এটি খারাপভাবে প্রতিফলিত করে।
আইআরটিএফএম

আপনি যখন "শব্দ" অপসারণ করছেন তখন আপনি জানেন যে আমি এর বৈধতা অনুমান করি। বিশেষত শারীরবৃত্তীয় ডেটাতে।
roscoe1895

হ্যাঁ. আপনার যদি বিশ্বাস করার উপযুক্ত কারণ থাকে যে একটি পৃথক প্রক্রিয়া সংকেত তৈরি করে, এটি ডেটা থেকে অপসারণের ন্যায়সঙ্গততা।
আইআরটিএফএম

9

আমি আউটলিয়ারগুলি অপসারণ সম্পর্কিত প্যাকেজগুলির সন্ধান করেছি এবং এই প্যাকেজটি পেয়েছি (আশ্চর্যরূপে "আউটলিয়ারস" নামে পরিচিত!): Https://cran.r-project.org/web/packages/outliers/outliers.pdf
আপনি যদি এটির মাধ্যমে যান তবে বহিরাগতদের অপসারণের বিভিন্ন উপায়গুলি দেখুন এবং তাদের মধ্যে আমি rm.outlierব্যবহারের জন্য সবচেয়ে সুবিধাজনক একটি পেয়েছি এবং এটি উপরের লিঙ্কে যেমনটি বলেছে: "যদি আউটলেটারের পরিসংখ্যানগত পরীক্ষাগুলি দ্বারা সনাক্ত করা হয় এবং নিশ্চিত করা হয় তবে এই ফাংশনটি এটি সরিয়ে ফেলতে পারে বা নমুনা গড় বা মধ্যমা দ্বারা প্রতিস্থাপন করতে পারে" এবং একই উত্স থেকে ব্যবহারের অংশটি এখানে রয়েছে:
" ব্যবহার

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

যুক্তিগুলি
x একটি ডেটাসেট, প্রায়শই একটি ভেক্টর। যদি আর্গুমেন্টটি ডেটাফ্রেম হয় তবে প্রতিটি কলাম থেকে আউটলেটকে নীচে সরিয়ে দেওয়া হবে। একই আচরণ প্রয়োগের মাধ্যমে প্রয়োগ করা হয় যখন ম্যাট্রিক্স দেওয়া হয়।
পূরণ করুন যদি সত্য হিসাবে সেট করা হয়, আউটলারের পরিবর্তে মধ্যম বা গড়টি স্থাপন করা হয়। অন্যথায়, আউটলেটর সরানো / সরানো হয়।
মিডিয়ান যদি সত্য হিসাবে সেট করা হয়, আউটিলার রিপ্লেসমেন্টের পরিবর্তে মিডিয়ান ব্যবহার করা হয়। বিপরীতে যদি সত্য হিসাবে সেট করা হয়, বিপরীত মান দেয় (যদি বৃহত্তম মানটির গড় থেকে সর্বোচ্চ পার্থক্য থাকে তবে এটি সবচেয়ে ছোট এবং বিপরীতে দেয়) "


এটি দুর্দান্ত বলে মনে হচ্ছে তবে আপনার যদি আপনার ডেটা ফ্রেমে কোনও সময় সিরিজ কলাম থাকে তবে এটি সময় ধারাবাহিকটিকে পরিবর্তন করে।
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

@ সেফারকাসের পরামর্শে যুক্ত করে এবং কোয়ান্টাইলকে কাট-অফ হিসাবে ব্যবহার করে, কেউ নিম্নলিখিত বিকল্পটি আবিষ্কার করতে পারেন:

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

এটি 99 তম কোয়ান্টাইল ছাড়িয়ে পয়েন্ট পয়েন্টগুলি সরিয়ে ফেলবে। এলএলএক্সএ বহিরাগতদের রাখার বিষয়ে কী বলছে তার মতো যত্ন নেওয়া উচিত। এটি কেবলমাত্র ডেটার বিকল্প রক্ষণশীল দৃষ্টিভঙ্গি পাওয়ার জন্য অপসারণ করা উচিত।


এটা 0.91নাকি 0.99? যেমন mydata$var < quantile(mydata$var, probs=c(.01, .91))[1])বাmydata$var < quantile(mydata$var, probs=c(.01, .99))[1])
কোমল রাঠি

আপনার যদি 99 তম পার্সেন্টাইলের পরিবর্তে 91 তম শতাংশ ব্যবহার করার নির্দিষ্ট কারণ থাকে তবে আপনি এটি ব্যবহার করতে পারেন। এটি কেবল একটি
তাত্পর্যপূর্ণ

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-স্কোর দেখিয়ে বেশ ভাল পারফরম্যান্স হয়েছে। পৃষ্ঠার নিচে অ্যানিমেশন অংশটি বহিরাগতদের বা শিখরে পদ্ধতি সংকেত চিত্রিত করে।

পিকগুলি সর্বদা বিদেশী হিসাবে একই হয় না তবে ঘন ঘন একই রকম হয়।

একটি উদাহরণ এখানে দেখানো হয়েছে: এই ডেটাসেটটি সেন্সর থেকে সিরিয়াল যোগাযোগের মাধ্যমে পড়ে। মাঝেমধ্যে সিরিয়াল যোগাযোগ ত্রুটি, সেন্সর ত্রুটি বা উভয়ই পুনরাবৃত্তি, স্পষ্টত ভ্রান্ত ডেটা পয়েন্টের দিকে পরিচালিত করে। এই পয়েন্টে কোনও পরিসংখ্যানের মান নেই। তারা যুক্তিযুক্তভাবে বিদেশী নয়, তারা ত্রুটি। জেড-স্কোর শিখর ডিটেক্টরটি তীব্র ডেটা পয়েন্টগুলিতে সিগন্যাল করতে সক্ষম হয়েছিল এবং একটি পরিষ্কার ফলাফল ডেটাসেট উত্পন্ন করেছিল:এখানে চিত্র বর্ণনা লিখুন


-1

এটা চেষ্টা কর. ফাংশনে আপনার ভেরিয়েবলকে খাওয়ান এবং ভেরিয়েবলের মধ্যে o / p সংরক্ষণ করুন যা মুছে ফেলা বহিরাগতদের থাকতে পারে

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)
}

আপনার উত্তরে দয়া করে কিছু ব্যাখ্যা যুক্ত করুন। পড়ুন কিভাবে উত্তর দিতে
এজাদুবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.