SciPy kullanarak Quantile-Quantile Plot


87

Python kullanarak nasıl bir qq arsa yaratırsınız?

Büyük bir ölçüm kümesine sahip olduğunuzu ve girdi olarak XY değerlerini alan bazı çizim işlevlerini kullandığınızı varsayarsak. Fonksiyon, bazı dağılımların karşılık gelen niceliklerine karşı ölçümlerin niceliklerini çizmelidir (normal, tekdüze ...).

Ortaya çıkan grafik, ölçümümüzde varsayılan dağılımı izleyerek değerlendirmemizi sağlar.

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

Hem R hem de Matlab bunun için hazır işlevler sağlar, ancak Python'da uygulamak için en temiz yöntemin ne olacağını merak ediyorum.



1
qqplot ve birçok seçeneğe sahip probplotlar: statsmodels.sourceforge.net/devel/…
Josef

Yanıtlar:


105

Bunun scipy.stats.probplotistediğini yapacağını düşünüyorum . Daha fazla ayrıntı için belgelere bakın .

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

Sonuç

görüntü açıklamasını buraya girin


Bazen ortada daralan ve uçlarında trompet gibi görünen noktalı güven çizgileri gördüm. Bu "kılavuz çizgileri" arsaya ekleyebilir misiniz?
Norfeldt

21
Tamam, ama bu bir olasılık grafiğidir (teorik dağılıma karşı örneklem). Bir qq grafiği, iki örneği karşılaştırır. itl.nist.gov/div898/handbook/eda/section3/qqplot.htm itl.nist.gov/div898/handbook/eda/section3/probplot.htm
Ricky Robinson

7
@RickyRobinson Pek çok kaynak (wikipedia dahil) NIST el kitabıyla çelişiyor gibi görünüyor. Hemen hemen tüm diğer kaynaklar, bir QQ grafiğinin yatay eksende teorik niceliklere ve dikey olarak veri miktarlarına sahip olduğunu belirtir. Her durumda, ayrım akademiktir: Bir örneklemin grafiğini çizmek, temelde deneysel dağılım işlevini kullanmakla aynıdır. Her iki durumda da, bir dağılımın niceliklerini diğerine karşı çiziyorsunuz.
Peter

1
@RickyRobinson'a katılıyorum, bu sorunun doğru cevabı bu değil. QQ grafikleri ve prob grafikleri, bir dağılımın diğerine karşı kuantilleri olsalar bile farklıdır.
Florent

49

Kullanılması qqplotait statsmodels.apibaşka bir seçenektir:

Çok basit bir örnek:

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

Sonuç:

görüntü açıklamasını buraya girin

Belgeler ve daha fazla örnek burada


1
@ kasıtlı ayrılmış tommy.carstensen scipyiçinstatsmodels
SARose

5
Sadece bir not. Örneğiniz, standart normal dağılım için bir çizgi çiziyor. @ Geoff örneğindeki gibi standartlaştırılmış bir çizgi (verilen örneğin standart sapmasıyla ölçeklenir ve ortalamanın eklenmesi) elde etmek için, line = '45 '
Mike

Bu cevap için +1. İstatistikler için tek bir pakete daha fazla kaynak odaklamanın önemli olduğunu düşünüyorum. statsmodelsiyi bir seçim olur.
Ken T

20

Bir numuneye karşı diğerinin QQ grafiğini yapmanız gerekiyorsa, istatistik modelleri qqplot_2samples () içerir. Ricky Robinson'ın yukarıdaki bir yorumda olduğu gibi, bu, teorik bir dağılıma karşı bir örnek olan bir olasılık grafiğine karşı bir QQ grafiği olarak düşündüğüm şeydir.

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


11
Bir QQ komplo büyük avantajlarından biri biri farklı boyutları ile numune karşılaştırabilirsiniz olmasıdır çünkü ... Bu qqplot uygulama komik farklı boyutlara sahip numunelerin işlemek için görünmüyor
Robert Muil

5

Bunu ben buldum. Belki onu geliştirebilirsin. Özellikle dağılımın niceliklerini üretme yöntemi bana külfetli geliyor.

Sen yerini alabilecek np.random.normalbaşka herhangi dağılımla np.randomdiğer dağılımlar karşı karşılaştırmak verilere.

#!/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 ve R dünyalarındaki QQ grafikleri ve olasılık grafikleri etrafındaki karışıklığa ek olarak, SciPy kılavuzunun söylediği şey şudur :

" probplotQQ veya PP grafiği ile karıştırılmaması gereken bir olasılık grafiği oluşturur. Statsmodels bu türden daha kapsamlı işlevselliğe sahiptir, bkz. statsmodels.api.ProbPlot."

Eğer denerseniz scipy.stats.probplot, gerçekten de bir veri kümesini teorik bir dağılımla karşılaştırdığını göreceksiniz. QQ grafikleri, OTOH, iki veri setini (numuneleri) karşılaştırın.

R fonksiyonları vardır qqnorm, qqplotve qqline. R yardımından (Sürüm 3.6.3):

qqnormvarsayılan yöntemi y'deki değerlerin normal bir QQ grafiğini üreten genel bir işlevdir. qqline"teorik", varsayılan olarak normal, kuantil-kuantil grafiğe bir çizgi ekler ve bu, probların niceliklerinden, varsayılan olarak birinci ve üçüncü çeyreklerden geçer.

qqplot iki veri kümesinin QQ grafiğini üretir.

Kısacası, R'ler , varsayılan ayarı sağlayan qqnormaynı işlevselliği sunar . Ancak onu adlandırmaları ve "normal bir QQ grafiği üretmesi" gerektiği gerçeği, kullanıcıların kolayca kafasını karıştırabilir.scipy.stats.probplotdist=normqqnorm

Son olarak, bir uyarı. Bu grafikler, uygun istatistiksel testlerin yerini almaz ve yalnızca açıklama amacıyla kullanılmalıdır.


1

Bokeh kullanabilirsiniz

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

Burada probplot, dist = "norm" olarak belirtilen normal dağılımla grafik ölçümlerini çizer


0

Örneğiniz ne kadar büyük? İşte verilerinizi OpenTURNS kitaplığını kullanarak herhangi bir dağıtıma karşı test etmek için başka bir seçenek . Aşağıdaki örnekte, Tekdüzen dağılımdan 1.000.000 sayılık bir x örneği oluşturuyorum ve bunu Normal bir dağılıma karşı test ediyorum. Verilerinizi şu şekilde yeniden şekillendirirseniz, x yerinex= [[x1], [x2], .., [xn]]

import openturns as ot

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

Jupyter Defterimde şunu görüyorum: görüntü açıklamasını buraya girin

Bir senaryo yazıyorsanız, daha düzgün yapabilirsiniz

from openturns.viewer import View`
import matplotlib.pyplot as plt
View(g)
plt.show()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.