2012-08-09 24 views
10

Tôi đang vẽ sơ đồ một số dữ liệu từ các thử nghiệm khác nhau. Đôi khi trong một thử nghiệm tôi xảy ra để có một outlier (nói 0,1), trong khi tất cả các giá trị khác là ba đơn đặt hàng của độ lớn nhỏ hơn.matplotlib: bỏ qua các ngoại lệ khi vẽ

Với matplotlib, tôi âm mưu chống lại phạm vi [0, max_data_value]

Làm thế nào tôi có thể chỉ cần zoom vào dữ liệu của tôi và không hiển thị giá trị ngoại biên, mà sẽ mess lên trục x trong cốt truyện của tôi?

Tôi có nên chỉ cần lấy 95 phần trăm và có phạm vi [0, 95_percentile] trên trục x không?

+0

Loại cốt truyện nào? Tiêu tan? Biểu đồ? –

+0

Tôi đang vẽ đồ thị với biểu đồ. –

Trả lời

36

Không có thử nghiệm "tốt nhất" cho một ngoại lệ. Lý tưởng nhất là bạn nên kết hợp thông tin ưu tiên (ví dụ: "Thông số này không được vượt quá x vì blah ...").

Hầu hết các thử nghiệm cho các ngoại lệ sử dụng độ lệch tuyệt đối trung bình, thay vì tỷ lệ phần trăm thứ 95 hoặc một số phép đo dựa trên phương sai khác. Nếu không, phương sai/stddev được tính toán sẽ bị sai lệch nặng nề bởi các ngoại lệ.

Đây là một hàm thực hiện một trong các thử nghiệm ngoại lệ phổ biến hơn.

def is_outlier(points, thresh=3.5): 
    """ 
    Returns a boolean array with True if points are outliers and False 
    otherwise. 

    Parameters: 
    ----------- 
     points : An numobservations by numdimensions array of observations 
     thresh : The modified z-score to use as a threshold. Observations with 
      a modified z-score (based on the median absolute deviation) greater 
      than this value will be classified as outliers. 

    Returns: 
    -------- 
     mask : A numobservations-length boolean array. 

    References: 
    ---------- 
     Boris Iglewicz and David Hoaglin (1993), "Volume 16: How to Detect and 
     Handle Outliers", The ASQC Basic References in Quality Control: 
     Statistical Techniques, Edward F. Mykytka, Ph.D., Editor. 
    """ 
    if len(points.shape) == 1: 
     points = points[:,None] 
    median = np.median(points, axis=0) 
    diff = np.sum((points - median)**2, axis=-1) 
    diff = np.sqrt(diff) 
    med_abs_deviation = np.median(diff) 

    modified_z_score = 0.6745 * diff/med_abs_deviation 

    return modified_z_score > thresh 

Như một ví dụ của việc sử dụng nó, bạn muốn làm điều gì đó như sau:

import numpy as np 
import matplotlib.pyplot as plt 

# The function above... In my case it's in a local utilities module 
from sci_utilities import is_outlier 

# Generate some data 
x = np.random.random(100) 

# Append a few "bad" points 
x = np.r_[x, -3, -10, 100] 

# Keep only the "good" points 
# "~" operates as a logical not operator on boolean numpy arrays 
filtered = x[~is_outlier(x)] 

# Plot the results 
fig, (ax1, ax2) = plt.subplots(nrows=2) 

ax1.hist(x) 
ax1.set_title('Original') 

ax2.hist(filtered) 
ax2.set_title('Without Outliers') 

plt.show() 

enter image description here

+0

Đây là một câu trả lời tuyệt vời (1 từ tôi), nhưng tôi nghĩ rằng '~' là một chút không, không phải là hợp lý - dường như không quan trọng ở đây vì lý do tôi không rõ 100%, nhưng ở những nơi khác, . '~ False! = True', nhưng' không False == True' –

+1

Điểm tốt! Trong numpy, nó quá tải để hoạt động như hợp lý không phải trên mảng boolean (ví dụ: '~ np.array (False) == True'), nhưng đây không phải là trường hợp cho bất cứ điều gì khác. Tôi nên làm rõ điều đó. (Trên một mặt lưu ý, theo quy ước 'không some_array' sẽ tăng một lỗi giá trị nếu' some_array' có nhiều hơn một phần tử. Vì vậy, cần '~' trong ví dụ trên.) –

+0

Cảm ơn phản hồi - Tôi thực sự đã thử ' không phải 'và có lỗi mà bạn dự đoán, vì vậy tôi thậm chí còn hoang mang hơn nữa ... –

7

Nếu bạn không phải là kiểu cách về từ chối giá trị ngoại biên như đã đề cập bởi Joe và nó là lý do hoàn toàn thẩm mỹ để thực hiện việc này, bạn chỉ có thể đặt giới hạn trục x của ô của bạn:

plt.xlim(min_x_data_value,max_x_data_value) 

Trong trường hợp các giá trị là giới hạn mong muốn của bạn để hiển thị.

plt.ylim(min,max) cũng hoạt động để đặt giới hạn trên trục y.

+1

Đối với một biểu đồ, mặc dù, OP cũng sẽ cần phải tính toán lại các thùng. Matplotlib sử dụng các cạnh thùng cố định. Nó không "hồi sinh" khi bạn phóng to. –