scipy.stats.probplot для генерации qqplot с использованием пользовательского дистрибутива - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь получить scipy.stats.probplot для построения QQplot с пользовательским дистрибутивом. В основном у меня есть куча числовых переменных (все числовые массивы), и я хочу проверить различия в распределении с помощью QQplot.

Мой фрейм данных df выглядит примерно так:

         some_var  another_var
1        16.5704   3.3620
2        12.8373  -8.2204
3        8.1854    1.9617
4        13.5683   1.8376
5        8.5143    2.3173
6        6.0123   -7.7536
7        9.6775   -4.3874
...      ...       ...
189499   11.8561  -8.4887
189500   10.0422  -4.6228

Согласно справке :

dist : str или stats.distributions, необязательно

Распределение или имя функции распределения. Значение по умолчанию - «норма» для нормального графика вероятности. Объекты, которые достаточно похожи на экземпляр stats.distributions (т. Е. У них есть метод ppf), также принимаются.

Конечно, у массива numpy нет метода ppf, поэтому, когда я пытаюсь сделать следующее:

import scipy.stats as stats
stats.probplot(X[X.columns[1]].values, dist=X[X.columns[2]].values, plot=pylab)

Я получаю следующую ошибку:

AttributeError: 'numpy.ndarray' object has no attribute 'ppf'

(Нет. Если я не использую метод .values, я получу ту же ошибку, но для объекта 'Series' вместо 'numpy.ndarry')

Итак, вопрос в том, что такое объект с методом ppf и как мне создать его из моего массива numpy?

1 Ответ

2 голосов
/ 18 марта 2019

Объект dist должен быть экземпляром или классом статистических распределений scipy.Вот что означает:

dist: str или экземпляр stats.distributions, необязательный

Таким образом, автономный пример будет:

import numpy
from matplotlib import pyplot
from scipy import stats

random_beta = numpy.random.beta(0.3, 2, size=37)

fig, ax = pyplot.subplots(figsize=(6, 3))

_ = stats.probplot(
    random_beta,       # data
    sparams=(0.3, 2),  # guesses at the distribution's parameters
    dist=stats.beta,   # the "dist" object
    plot=ax            # where the data should be plotted
)

И вы получите:

enter image description here

Если вы хотите построить несколько столбцов фрейма данных, вам нужно позвонить probplot несколько раз, каждый раз создавая графики на одних и тех же (или новых) осях.

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

import probscale

fig, ax = pyplot.subplots(figsize=(6, 3))
fig = probscale.probplot(
    random_beta,
    ax=ax,
    plottype='qq',
    bestfit=True,
    dist=stats.beta(0.3, 2)
)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...