[python] SciPy를 사용한 분위수-분위수 플롯

파이썬을 사용하여 qq 플롯을 어떻게 만들까요?

측정 값이 많고 XY 값을 입력으로 사용하는 일부 플로팅 기능을 사용하고 있다고 가정합니다. 이 함수는 일부 분포 (정규, 균일 …)의 해당 분위수에 대한 측정 분위수를 플로팅해야합니다.

결과 플롯을 통해 측정에서 가정 된 분포를 따르는 지 여부를 평가할 수 있습니다.

http://en.wikipedia.org/wiki/Quantile-quantile_plot

R과 Matlab은 모두이를 위해 준비된 기능을 제공하지만 Python에서 구현하는 가장 깨끗한 방법이 무엇인지 궁금합니다.



답변

나는 그것이 scipy.stats.probplot당신이 원하는 것을 할 것이라고 생각합니다 . 자세한 내용은 설명서 를 참조하십시오 .

import numpy as np
import pylab
import scipy.stats as stats

measurements = np.random.normal(loc = 20, scale = 5, size=100)
stats.probplot(measurements, dist="norm", plot=pylab)
pylab.show()

결과

여기에 이미지 설명 입력


답변

사용 qqplotstatsmodels.api 또 다른 옵션이다 :

아주 기본적인 예 :

import numpy as np
import statsmodels.api as sm
import pylab

test = np.random.normal(0,1, 1000)

sm.qqplot(test, line='45')
pylab.show()

결과:

여기에 이미지 설명 입력

문서와 더 많은 예제는 여기에 있습니다.


답변

한 샘플과 다른 샘플의 QQ 플롯을 수행해야하는 경우 statsmodels에는 qqplot_2samples ()가 포함됩니다. 위의 의견에서 Ricky Robinson과 마찬가지로 이것은 이론적 분포에 대한 샘플 인 확률 플롯 대 QQ 플롯으로 생각하는 것입니다.

http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html


답변

나는 이것을 생각 해냈다. 아마도 당신은 그것을 향상시킬 수 있습니다. 특히 분포의 분위수를 생성하는 방법은 저에게 번거로운 것 같습니다.

데이터를 다른 분포와 비교하기 위해 np.random.normal에서 다른 분포로 바꿀 수 np.random있습니다.

#!/bin/python

import numpy as np

measurements = np.random.normal(loc = 20, scale = 5, size=100000)

def qq_plot(data, sample_size):
    qq = np.ones([sample_size, 2])
    np.random.shuffle(data)
    qq[:, 0] = np.sort(data[0:sample_size])
    qq[:, 1] = np.sort(np.random.normal(size = sample_size))
    return qq

print qq_plot(measurements, 1000)


답변


답변

Python 및 R 세계에서 QQ 플롯과 확률 플롯에 대한 혼란을 추가하기 위해 SciPy 매뉴얼 은 다음과 같이 말합니다.

probplot확률도를 생성하며 QQ 또는 PP 플롯과 혼동해서는 안됩니다. Statsmodels에는이 유형의 더 광범위한 기능이 있습니다. statsmodels.api.ProbPlot을 참조하십시오.”

시도해 scipy.stats.probplot보면 실제로 데이터 세트를 이론적 분포와 비교하는 것을 볼 수 있습니다. QQ 플롯, OTOH는 두 데이터 세트 (샘플)를 비교합니다.

R에는 기능 qqnormqqplot있으며 qqline. R 도움말 (버전 3.6.3)에서 :

qqnorm는 y 값의 일반 QQ 플롯을 생성하는 기본 방법 인 일반 함수입니다. qqline“이론적”, 기본적으로 확률 분위수, 기본적으로 1 분위수 및 3 분위수를 통과하는 일반 분위수-분위수 플롯에 선을 추가합니다.

qqplot 두 데이터 세트의 QQ 플롯을 생성합니다.

요컨대, R 은 기본 설정과 qqnorm동일한 기능을 scipy.stats.probplot제공합니다 dist=norm. 그러나 그들이 그것을 불렀고 그것이 qqnorm“일반적인 QQ 플롯을 생성”해야 한다는 사실은 사용자를 쉽게 혼동시킬 수 있습니다.

마지막으로 경고의 한마디. 이러한 플롯은 적절한 통계 테스트를 대체하지 않으며 설명 목적으로 만 사용해야합니다.


답변

샘플은 얼마나 큽니까? 다음은 OpenTURNS 라이브러리를 사용하여 배포에 대해 데이터를 테스트하는 또 다른 옵션 입니다. 아래 예에서는 Uniform 분포에서 1.000.000 숫자의 샘플 x를 생성하고 정규 분포에 대해 테스트합니다. x를 다음과 같이 모양을 변경하면 데이터로 바꿀 수 있습니다.x= [[x1], [x2], .., [xn]]

import openturns as ot

x = ot.Uniform().getSample(1000000)
g = ot.VisualTest.DrawQQplot(x, ot.Normal())
g

내 Jupyter 노트북에서 다음을 볼 수 있습니다.
여기에 이미지 설명 입력

스크립트를 작성하고 있다면 더 제대로 할 수 있습니다.

from openturns.viewer import View`
import matplotlib.pyplot as plt
View(g)
plt.show()