Ggplot2 বক্সপ্লোটে আউটলিয়ারদের উপেক্ষা করুন


132

আমি কীভাবে জিজিপ্লাট 2 বক্সপ্লটে আউটরিয়ারদের উপেক্ষা করব? আমি কেবল তাদের অদৃশ্য হয়ে যেতে চাই না (অর্থাত্ আউটিলার.সাইজ = 0), তবে আমি চাই যে এগুলি অক্ষর 1 ম / 3 য় পার্সেন্টাইল দেখানোর জন্য তাদের এটিকে অগ্রাহ্য করা উচিত। আমার আউটলিয়াররা "বক্স "টিকে এত ছোট করে এর বাস্তবিকভাবে একটি লাইন সঙ্কুচিত করছে। এটি মোকাবেলায় কিছু কৌশল আছে কি?

সম্পাদনা করুন এখানে একটি উদাহরণ:

y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")

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


কিছু নমুনা ডেটা এবং একটি পুনরুত্পাদনযোগ্য উদাহরণ আপনাকে সহায়তা করা সহজ করে তুলবে।
অ্যান্ড্রি

3
আমার ফাইল 200 মেগা! 1 ম এবং 3 য় কোয়ান্টাইল এবং কয়েক জন আউটলিয়ারের মধ্যে প্রচুর ডেটাপয়েন্ট রয়েছে যেখানে কেবল কোনও ডেটাসেট নিন (আপনার কেবলমাত্র 1 প্রয়োজন)। যদি
আউটলেটার

হ্যাঁ, এটাই আমার মনে ছিল। এই জাতীয় ডেটাসেট তৈরি করুন এবং আপনার ব্যবহৃত জিজিপ্লাট () বিবৃতিটির সাথে এটি এখানে পোস্ট করার জন্য ডুপেট () ব্যবহার করুন। আপনাকে সাহায্য করতে আমাদের সহায়তা করুন।
অ্যান্ড্রি

আপনি আগ্রহী সেই y- অক্ষের অংশে আপনি কি কেবলমাত্র y-axis সীমাটি "জুম" এ পরিবর্তন করতে পারবেন না?
গ্যাভিন সিম্পসন

2
আমাকে দেখতে দিন .... ওহ হ্যাঁ, দুঃখিত। শুধু কি fivenum()কি, IIRC, boxplots উপর উচ্চ এবং নিম্ন বিশৃঙ্খল জন্য ব্যবহার করা হয় নিষ্কর্ষ এবং যে আউটপুট ব্যবহার করতে ডেটার উপর scale_y_continuous()কল যে @Ritchie দেখিয়েছেন। এটি আর ও জিজিপ্লট সরবরাহকারী সরঞ্জামগুলি ব্যবহার করে খুব সহজেই স্বয়ংক্রিয়ভাবে তৈরি হতে পারে। আপনার যদি হুইসারগুলিকেও অন্তর্ভুক্ত করতে হয় তবে হুইস্কারগুলির boxplot.stats()জন্য উপরের এবং নিম্ন সীমাটি পেতে ব্যবহার করার বিষয়টি বিবেচনা করুন এবং তারপরে ব্যবহার করুন scale_y_continuous()
গ্যাভিন সিম্পসন

উত্তর:


141

এখানে বক্সপ্লট.স্ট্যাটস ব্যবহার করে একটি সমাধান দেওয়া হয়েছে

# create a dummy data frame with outliers
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))


# compute lower and upper whiskers
ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]

# scale y limits based on ylim1
p1 = p0 + coord_cartesian(ylim = ylim1*1.05)

15
স্বয়ংক্রিয় গণনার জন্য +1, ডেটা বাদ দিয়ে কর্ড_কার্টেসিয়ান জুম করার জন্য +1
বেন বলকার

2
@ বেন - আপনার দুটি অ্যাকাউন্ট আছে? =) @ রমনাথ - এটি সত্যিই মার্জিত সমাধান
এসফুন 28

7
উপরের পদ্ধতিটি ব্যবহার করে, সীমাগুলি একদিকে যেমন একটি ছোট্ট চূড়ান্ত এবং অন্যদিকে বড় চরম দ্বারা পক্ষপাতযুক্ত হতে পারে, যেমন ylim <- c(-0.1, 1000) * 1.05দেয় [1] 0.105 1050। গড় হিসাবে সমান সীমা পেতে আপনি ব্যবহার করতে পারেন ylim + c(-0.05, 0.05) * diff(ylim) / 2। আমার মতে সুন্দর
ব্রাম ভিজার 3

2
@ রমনাথ $ পরিসংখ্যান [সি (1,5)] কি করে?
লুক্কে

3
আপনি যদি ব্যবহার করেন তবে এটি কাজ করছে না facet_grid()। তারপরে আপনার একটির পরিবর্তে একাধিক বক্সপ্লট রয়েছে। সুতরাং আপনি সঠিক সীমা পান না।
উইথশেডো

204

geom_boxplot(outlier.shape = NA)আউটলিয়ারগুলি প্রদর্শন না করার scale_y_continuous(limits = c(lower, upper))জন্য এবং অক্ষ সীমা পরিবর্তন করতে ব্যবহার করুন ।

একটি উদাহরণ.

n <- 1e4L
dfr <- data.frame(
  y = exp(rlnorm(n)),  #really right-skewed variable
  f = gl(2, n / 2)
)

p <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot()
p   # big outlier causes quartiles to look too slim

p2 <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot(outlier.shape = NA) +
  scale_y_continuous(limits = quantile(dfr$y, c(0.1, 0.9)))
p2  # no outliers plotted, range shifted

প্রকৃতপক্ষে, রামনাথ তাঁর উত্তরে (এবং মন্তব্যে অ্যান্ড্রিও) যেমন দেখিয়েছেন, আপনি পরিসংখ্যান গণনা করার পরে, আঁশগুলি কাটতে আরও বুদ্ধিমান হয়ে উঠছেন coord_cartesian

coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))

( scale_y_continuousঅক্ষ বিরতি ঠিক করতে আপনার সম্ভবত এখনও ব্যবহারের প্রয়োজন হবে ))


1
সুতরাং আমি নিম্ন / উচ্চতর গণনা করতে হবে - সম্ভবত প্রথম / তৃতীয় পার্সেন্টাইল গণনা করে? মানে জিজি-প্লট 2 বলতে বিদেশীদের অগ্রাহ্য করার জন্য এবং বুদ্ধিমানের সাথে স্কেল করার কোনও অটো-ম্যাজিক উপায় নেই?
এসফুন 28

38
স্কেল_ই_সিদ্ধ (সতর্কতা = ...) দিয়ে সতর্ক থাকুন এটি সীমা ছাড়িয়ে এমন ডেটা সরিয়ে দেবে এবং তারপরে পরিসংখ্যান গণনা সম্পাদন করবে। অন্য কথায় গড় এবং অন্যান্য সংক্ষিপ্তসারগুলি প্রভাবিত হবে। আপনি যদি এটি চান তবে তা দুর্দান্ত। বিকল্পটি হ'ল কর্ড_কার্টেসিয়ান (সীমা = ...) ব্যবহার করা - এটি ডেটা অপসারণ বা সংক্ষিপ্তসারগুলিকে প্রভাবিত না করে এই 'জুম'।
অ্যান্ড্রি

@ এন্ড্রি - ধন্যবাদ! আমি চাই না যে গড় এবং অন্যান্য সংক্ষিপ্তসারগুলি প্রভাবিত হোক।
এসফুন 28

1
coord_cartesian()coord_flip()আমার অভিজ্ঞতার সাথে ভাল খেলছে না , তাই আমি পছন্দ করি scale_y_continuous()
প্যাট্রিকটি

1
এটিই সেরা সমাধান। আমি আউটলিয়ারদের গোপন করতে চাই কারণ হ'ল আমি জিওম_জিটারের সাথে জিটটার পয়েন্টগুলিও বানাচ্ছি। এক্ষেত্রে আউটলিয়াররা কেবল পথে চলেছে এবং এটি দেখতে আরও বেশি পয়েন্ট থাকার মতো দেখায়।
উইলিয়ামসুরলেস

14

আমার একই সমস্যা ছিল এবং কিউ 1, কিউ 2, মিডিয়ান, ইয়ামিন, ইয়াম্যাক্স ব্যবহার করে মানগুলি প্রতিরোধ করে boxplot.stats:

# Load package and generate data
library(ggplot2)
data <- rnorm(100)

# Compute boxplot statistics
stats <- boxplot.stats(data)$stats
df <- data.frame(x="label1", ymin=stats[1], lower=stats[2], middle=stats[3], 
                 upper=stats[4], ymax=stats[5])

# Create plot
p <- ggplot(df, aes(x=x, lower=lower, upper=upper, middle=middle, ymin=ymin, 
                    ymax=ymax)) + 
    geom_boxplot(stat="identity")
p

ফলাফল আউটলিয়ার ছাড়াই একটি বক্সপ্লট। এখানে চিত্র বর্ণনা লিখুন


9

একটি ধারণা হ'ল দুই-পাসের পদ্ধতিতে ডেটাটি উইনসরাইজ করা :

  1. একটি প্রথম পাস চালান, সীমানা কী তা শিখুন, যেমন প্রদত্ত পারসেন্টাইলের কাটা, বা গড়ের উপরে এন স্ট্যান্ডার্ড বিচ্যুতি, বা ...

  2. দ্বিতীয় পাসে, সেই বাউন্ডের মানের সাথে দেওয়া সীমাটির বাইরে মানগুলি সেট করুন

আমার জোর দেওয়া উচিত যে এটি একটি পুরানো ধাঁচের পদ্ধতি যা আরও আধুনিক শক্তিশালী কৌশল দ্বারা প্রভাবিত হওয়া উচিত তবে আপনি এখনও এটির প্রচুর পরিমাণে আসেন।


1
যে সবে চুপচাপ নিচু করে : কেন তা ব্যাখ্যা করার জন্য মন্তব্য করুন ।
ডার্ক এডেলবুয়েটেল

আমি ছিল না। কেবল যুক্ত করতে চেয়েছিলেন যে পার্সেন্টাইলগুলিতে থেমে থাকা হুইস্কারগুলি (সাধারণত 10 ম এবং 90 তম) পরিবেশগত তথ্যের সাথে খুব সাধারণ বলে মনে হয়।
রিচি কটন

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

এই পোস্টটি পুনরায় পড়ছিল, আপনি উল্লেখ করেছেন যে উইন্ডসরাইজিং একটি পুরানো কৌশল .... আরও কিছু আধুনিক কৌশল কী হবে?
এসফুন 28

1
সাধারণভাবে, গত 30+ বছরের বিকাশ হিসাবে শক্ত পদ্ধতি।
ডার্ক এডেলবুয়েটেল

2

জিওম_বক্সপ্লাট ফাংশনের "কোফ" বিকল্পটি আন্তঃখণ্ডজ রেঞ্জের ক্ষেত্রে বহির্মুখী কাটঅফ পরিবর্তন করতে দেয়। এই বিকল্পটি স্ট্যাট_বক্সপ্লট ফাংশনের জন্য ডকুমেন্টেড রয়েছে। বহিরাগতদের নিষ্ক্রিয় করতে (অন্য কথায় এগুলি নিয়মিত ডেটা হিসাবে বিবেচনা করা হয়), এর পরিবর্তে 1.5 এর ডিফল্ট মানটি ব্যবহারের পরিবর্তে খুব উচ্চতর কাটঅফ মান নির্দিষ্ট করতে পারে:

library(ggplot2)
# generate data with outliers:
df = data.frame(x=1, y = c(-10, rnorm(100), 10)) 
# generate plot with increased cutoff for outliers:
ggplot(df, aes(x, y)) + geom_boxplot(coef=1e30)

3
এটি কেবল হুইস্কারগুলি প্রসারিত করে, যা কিছু চার্টটি পুনরুদ্ধার করে না
মুডি_মডসকিপার

2

আপনি যদি হুইস্কারদের সর্বাধিক এবং ন্যূনতম মানগুলিতে প্রসারিত করতে বাধ্য করতে চান তবে আপনি coefযুক্তিটি টুইঙ্ক করতে পারেন । এর জন্য ডিফল্ট মান coef1.5 হয় (যেমন হুইস্কারগুলির ডিফল্ট দৈর্ঘ্য আইকিউআরের 1.5 গুন বেশি)।

# Load package and create a dummy data frame with outliers 
#(using example from Ramnath's answer above)
library(ggplot2)
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))

# create boxplot where whiskers extend to max and min values
p1 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)), coef = 500)

p0 এর চিত্র

পি 1 এর চিত্র


2

আইপ্যাপার :: জিওম_বক্সপ্লট 2 আপনি যা চান তা ঠিক।

# devtools::install_github('kongdd/Ipaper')
library(Ipaper)
library(ggplot2)
p <- ggplot(mpg, aes(class, hwy))
p + geom_boxplot2(width = 0.8, width.errorbar = 0.5)

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


ধন্যবাদ !! আমার ডেটা দিয়ে পরীক্ষিত, নিখুঁতভাবে কাজ করছে! আমি এই সমাধানটি পুনঃসামন্ডন করব, যদিও আমি গিথুব জিনিসগুলির স্থায়িত্ব / দীর্ঘকালীন সমর্থন সম্পর্কে নিশ্চিত নই।
গিল্ডাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.