SciPy를 사용한 분위수-분위수 플롯


85

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

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

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

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

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



1
많은 옵션이있는 qqplot 및 probplots : statsmodels.sourceforge.net/devel/…
Josef

답변:


105

나는 그것이 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()

결과

여기에 이미지 설명 입력


때때로 나는 중간이 좁아지고 끝이 트럼펫과 같은 점선 신뢰 선을 보았습니다. 이 "안내선"을 플롯에 추가 할 수 있습니까?
Norfeldt 2013-08-13

21
좋습니다.하지만 이것은 확률도입니다 (샘플 대 이론적 분포). qq 플롯은 두 샘플을 비교합니다. itl.nist.gov/div898/handbook/eda/section3/qqplot.htm itl.nist.gov/div898/handbook/eda/section3/probplot.htm
리키 로빈슨

7
@RickyRobinson 많은 출처 (wikipedia 포함)가 NIST 핸드북과 모순되는 것 같습니다. 거의 모든 다른 출처에 따르면 QQ 플롯에는 수평 축에 이론적 분위수가 있고 수직으로 데이터 분위수가 있습니다. 어쨌든 구별은 학문적입니다. 표본을 그리는 것은 본질적으로 경험적 분포 함수를 사용하는 것과 동일합니다. 어느 쪽이든 하나의 분산 분포의 분위수를 다른 분포에 대해 플로팅합니다.
Peter

1
@RickyRobinson에 동의합니다. 이것은이 질문에 대한 정답이 아닙니다. QQ 플롯과 확률 플롯은 둘 다 한 분포의 분위수와 다른 분포의 분위수에도 불구하고 다릅니다.
Florent

48

사용 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()

결과:

여기에 이미지 설명 입력

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


1
@ 그것은 의도적으로 분리 된 tommy.carstensen scipystatsmodels
SARose

3
메모입니다. 귀하의 예는 표준 정규 분포에 대한 선을 그립니다. @Geoff 예제에서와 같이 표준화 된 선 (주어진 샘플의 표준 편차로 스케일링되고 평균이 추가됨)을 얻으려면 line = '45 '대신 line ='s '를 설정해야합니다.
Mike

이 답변에 +1. 통계 용 단일 패키지에 더 많은 리소스를 집중하는 것이 중요하다고 생각합니다. statsmodels좋은 선택이 될 것입니다.
Ken T

20

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

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


11
QQ 플롯의 가장 큰 장점 중 하나는 하나가 서로 다른 크기의 샘플을 비교할 수 있기 때문에 ...이 qqplot 구현은 재미 다른 크기와 샘플을 처리하지 않는 것
로버트 Muil

5

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

데이터를 다른 분포와 비교하기 위해 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)


2

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 플롯을 생성"해야 한다는 사실은 사용자를 쉽게 혼동시킬 수 있습니다.

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


2

샘플은 얼마나 큽니까? 다음은 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()

1

보케를 사용할 수 있습니다.

from bokeh.plotting import figure, show
from scipy.stats import probplot
# pd_series is the series you want to plot
series1 = probplot(pd_series, dist="norm")
p1 = figure(title="Normal QQ-Plot", background_fill_color="#E8DDCB")
p1.scatter(series1[0][0],series1[0][1], fill_color="red")
show(p1)

1
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()

여기서 probplot은 dist = "norm"에서 지정한 정규 분포에 대한 그래프 측정을 그립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.