Подтвердить что ты не робот

Matplotlib: игнорировать выбросы при построении графика

Я рисую некоторые данные из различных тестов. Иногда в тесте у меня бывает один выброс (скажем, 0,1), а все остальные значения на три порядка меньше.

С matplotlib, я рисую против диапазона [0, max_data_value]

Как я могу просто увеличить масштаб данных и не отображать выбросы, что испортило бы ось x в моем сюжете?

Должен ли я просто взять 95 процентов и иметь диапазон [0, 95_percentile] по оси x?

4b9b3361

Ответ 1

Там нет единого "лучшего" теста для выброса. В идеале вы должны включить априорную информацию (например, "Этот параметр не должен превышать x из-за бла..." ).

Большинство тестов на выбросы используют медианное абсолютное отклонение, а не 95-й процентиль или какое-то другое измерение на основе дисперсии. В противном случае вычисляемая дисперсия /stddev будет сильно искажена выбросами.

Здесь функция, которая реализует один из наиболее распространенных тестов outlier.

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

В качестве примера его использования вы сделаете следующее:

import numpy as np
import matplotlib.pyplot as plt

# The function above... In my case it 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

Ответ 2

Если вы не сомневаетесь в том, что отвергаете выбросы, о которых говорил Джо, и это чисто эстетические причины для этого, вы можете просто установить пределы графика по оси x:

plt.xlim(min_x_data_value,max_x_data_value)

Если значения являются вашими желаемыми пределами для отображения.

plt.ylim(min,max) также работает для установки пределов на оси y.

Ответ 3

Я обычно np.clip данные через функцию np.clip Если у вас есть разумная оценка максимального и минимального значения ваших данных, просто используйте это. Если у вас нет разумной оценки, гистограмма обрезанных данных покажет вам размер хвостов, а если выбросы действительно просто выбросы, хвост должен быть небольшим.

Я запускаю что-то вроде этого:

import numpy as np
import matplotlib.pyplot as plt

data = np.random.normal(3, size=100000)
plt.hist(np.clip(data, -15, 8), bins=333, density=True)

Вы можете сравнить результаты, если вы измените минимальное и максимальное значения в функции отсечения, пока не найдете правильные значения для ваших данных.

Example

В этом примере вы сразу видите, что максимальное значение 8 не очень хорошо, потому что вы удаляете много значимой информации. Минимальное значение -15 должно быть в порядке, так как хвост даже не виден.

Возможно, вы могли бы написать некоторый код, основанный на этом, чтобы найти хорошие границы, которые минимизируют размеры хвостов согласно некоторому допуску.