क्वांटाइल-क्वांटाइल प्लॉट SciPy का उपयोग करते हुए


85

आप पायथन का उपयोग करके एक qq- प्लॉट कैसे बनाएंगे?

यह मानते हुए कि आपके पास माप का एक बड़ा सेट है और कुछ प्लॉटिंग फ़ंक्शन का उपयोग कर रहे हैं जो इनपुट के रूप में XY- मान लेता है। फ़ंक्शन को कुछ वितरण (सामान्य, समान ...) के संबंधित मात्रा के खिलाफ माप के क्वांटाइल्स को प्लॉट करना चाहिए।

परिणामस्वरूप प्लॉट हमें अपने माप में मूल्यांकन करने देता है कि मान लिया गया वितरण है या नहीं।

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

R और Matlab दोनों इसके लिए तैयार किए गए कार्य प्रदान करते हैं, लेकिन मैं सोच रहा हूं कि पायथन में लागू करने के लिए सबसे साफ तरीका क्या होगा।


2
क्या आपने देखा probplot? docs.scipy.org/doc/scipy/reference/generated/…
ज्यॉफ

1
बहुत सारे विकल्पों के साथ qqplot और probplots : ystsmodels.sourceforge.net/devel/…
जोसेफ

जवाबों:


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

परिणाम

यहां छवि विवरण दर्ज करें


कभी-कभी मैंने कुछ बिंदीदार विश्वास रेखाएं देखी हैं जो मध्य में सुनाई देती हैं और सिरों में एक तुरही की तरह होती हैं। क्या आप इन "गाइड लाइन्स" को प्लॉट में जोड़ सकते हैं?
नोरफेल्ट

21
ठीक है, लेकिन यह एक संभावना प्लॉट (एक सैद्धांतिक वितरण बनाम नमूना) है। एक qq भूखंड दो नमूनों की तुलना करता है। itl.nist.gov/div898/handbook/eda/section3/qqplot.htm itl.nist.gov/div898/handbook/eda/section3/probplot.htm
रिकी रॉबिन्सन

7
@RickyRobinson ऐसा लगता है कि कई स्रोत (विकिपीडिया सहित) NIST हैंडबुक का खंडन करते हैं। किसी भी अन्य स्रोत में कहा गया है कि एक QQ भूखंड की क्षैतिज अक्ष पर सैद्धांतिक मात्राएँ होती हैं, और डेटा मात्राएँ खड़ी होती हैं। किसी भी मामले में, भेद अकादमिक है: एक नमूना की साजिश करना अनिवार्य रूप से अनुभवजन्य वितरण फ़ंक्शन का उपयोग करने के समान है। किसी भी तरह से, आप एक dsitribution के दूसरे के खिलाफ क्वांटाइल्स की साजिश रच रहे हैं।
पीटर

1
मैं @RickyRobinson से सहमत हूं, यह इस प्रश्न का सही उत्तर नहीं है। क्यूक्यू प्लॉट और प्रोब प्लॉट अलग-अलग हैं, भले ही वे दोनों एक दूसरे के खिलाफ वितरण के क्वांटाइल हैं।
फ्लोरेंट

48

का उपयोग करते हुए 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()

परिणाम:

यहां छवि विवरण दर्ज करें

प्रलेखन और अधिक उदाहरण यहाँ हैं


1
@ tommy.carstensen यह जानबूझ कर से अलग किया गया scipyकरने के लिएstatsmodels
SARose

3
सिर्फ एक नोट। आपका उदाहरण मानक सामान्य वितरण के लिए रेखा खींचता है। @Geoff उदाहरण में एक मानकीकृत रेखा (दिए गए नमूने के मानक विचलन द्वारा मापी गई और इसका मतलब जोड़ा गया है) प्राप्त करने के लिए, आपको पंक्ति = '45 'के बजाय लाइन =' s 'सेट करने की आवश्यकता है
माइक

इस उत्तर के लिए +1। मुझे लगता है कि आंकड़ों के लिए एक पैकेज पर अधिक संसाधनों को केंद्रित करना महत्वपूर्ण है। statsmodelsएक अच्छा विकल्प होगा।
केन टी

20

यदि आपको एक नमूना बनाम दूसरे का QQ प्लॉट करने की आवश्यकता है, तो Analyticsmodels में qqplot_2samples () शामिल हैं। ऊपर एक टिप्पणी में रिकी रॉबिन्सन की तरह, यह वही है जो मैं एक क्यूक्यू प्लॉट बनाम एक संभावना प्लॉट के रूप में सोचता हूं जो एक सैद्धांतिक वितरण के खिलाफ एक नमूना है।

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


11
यह qqplot कार्यान्वयन विभिन्न आकारों के साथ नमूनों को संभालने के लिए प्रतीत नहीं होता है, जो कि मज़ेदार है क्योंकि क्यूक्यू प्लॉट के बड़े लाभों में से एक यह है कि विभिन्न आकारों के साथ नमूनों की तुलना की जा सकती है ...
रॉबर्ट मुइल

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

पायथन और आर दुनिया में QQ भूखंडों और संभाव्यता भूखंडों के बारे में भ्रम को जोड़ने के लिए, यह SciPy मैनुअल कहता है:

" probplotएक संभावना प्लॉट उत्पन्न करता है, जिसे क्यूक्यू या पीपी प्लॉट के साथ भ्रमित नहीं किया जाना चाहिए। स्टैटस्मॉडल में इस प्रकार की अधिक व्यापक कार्यक्षमता है, देखिए।

यदि आप बाहर की कोशिश करते हैं scipy.stats.probplot, तो आप देखेंगे कि वास्तव में यह एक सैद्धांतिक वितरण के लिए डेटासेट की तुलना करता है। QQ प्लॉट, OTOH, दो डेटासेट (नमूनों) की तुलना करें।

आर के कार्य हैं qqnorm, qqplotऔर qqline। R मदद से (संस्करण 3.6.3):

qqnormजेनेरिक फ़ंक्शन डिफ़ॉल्ट विधि है, जो y में मानों के एक सामान्य QQ प्लॉट का उत्पादन करती है। qqlineएक "सैद्धांतिक" के लिए एक पंक्ति जोड़ता है, सामान्य रूप से, क्वांटाइल-क्वांटाइल प्लॉट जो कि प्रोब्स क्वांटाइल्स से गुजरता है, डिफ़ॉल्ट रूप से पहले और तीसरे क्वार्टराइल द्वारा।

qqplot दो डेटासेट का एक QQ प्लॉट बनाता है।

संक्षेप में, आर qqnormएक ही कार्यक्षमता scipy.stats.probplotप्रदान करता है जो डिफ़ॉल्ट सेटिंग के साथ प्रदान करता है dist=norm। लेकिन तथ्य यह है कि उन्होंने इसे बुलाया qqnormऔर यह माना जाता है कि "एक सामान्य क्यूक्यू प्लॉट का उत्पादन" आसानी से उपयोगकर्ताओं को भ्रमित कर सकता है।

अंत में, चेतावनी का एक शब्द। ये भूखंड उचित सांख्यिकीय परीक्षण की जगह नहीं लेते हैं और इसका उपयोग केवल उदाहरण के लिए किया जाना चाहिए।


2

आपका नमूना कितना बड़ा है? यहां OpenTURNS लाइब्रेरी का उपयोग करके किसी भी वितरण के खिलाफ अपने डेटा का परीक्षण करने का एक और विकल्प है । नीचे दिए गए उदाहरण में, मैं एक समान वितरण से 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()

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

यहाँ प्रोब्लॉट ग्राफ वितरण को सामान्य वितरण के अनुसार खींचता है, जो डिस्टिफ़ में परिभाषित होता है = "मानदंड"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.