파이썬을 사용하여 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()
결과
답변
사용 qqplot
의statsmodels.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 플롯으로 생각하는 것입니다.
답변
나는 이것을 생각 해냈다. 아마도 당신은 그것을 향상시킬 수 있습니다. 특히 분포의 분위수를 생성하는 방법은 저에게 번거로운 것 같습니다.
데이터를 다른 분포와 비교하기 위해 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)
답변
이제 statsmodels 패키지에 있습니다.
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
답변
Python 및 R 세계에서 QQ 플롯과 확률 플롯에 대한 혼란을 추가하기 위해 SciPy 매뉴얼 은 다음과 같이 말합니다.
”
probplot
확률도를 생성하며 QQ 또는 PP 플롯과 혼동해서는 안됩니다. Statsmodels에는이 유형의 더 광범위한 기능이 있습니다. statsmodels.api.ProbPlot을 참조하십시오.”
시도해 scipy.stats.probplot
보면 실제로 데이터 세트를 이론적 분포와 비교하는 것을 볼 수 있습니다. QQ 플롯, OTOH는 두 데이터 세트 (샘플)를 비교합니다.
R에는 기능 qqnorm
이 qqplot
있으며 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
스크립트를 작성하고 있다면 더 제대로 할 수 있습니다.
from openturns.viewer import View`
import matplotlib.pyplot as plt
View(g)
plt.show()