Como você criaria um qq-plot usando Python?
Supondo que você tenha um grande conjunto de medidas e esteja usando alguma função de plotagem que recebe valores XY como entrada. A função deve plotar os quantis das medições contra os quantis correspondentes de alguma distribuição (normal, uniforme ...).
O gráfico resultante nos permite então avaliar em nossa medição segue a distribuição assumida ou não.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
Tanto R quanto Matlab fornecem funções prontas para isso, mas estou me perguntando qual seria o método mais limpo para implementação em Python.
python
statistics
scipy
John
fonte
fonte
probplot
? docs.scipy.org/doc/scipy/reference/generated/…Respostas:
Eu acho que
scipy.stats.probplot
vai fazer o que você quiser. Veja a documentação para mais detalhes.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()
Resultado
fonte
O uso
qqplot
destatsmodels.api
é outra opção:Exemplo muito básico:
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()
Resultado:
A documentação e mais exemplos estão aqui
fonte
scipy
parastatsmodels
statsmodels
seria uma boa escolha.Se você precisar fazer um gráfico QQ de uma amostra em relação a outra, os modelos de estatísticas incluem qqplot_2samples (). Como Ricky Robinson em um comentário acima, isso é o que considero um gráfico QQ versus um gráfico de probabilidade que é uma amostra contra uma distribuição teórica.
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html
fonte
Eu vim com isso. Talvez você possa melhorá-lo. Especialmente o método de geração dos quantis da distribuição parece complicado para mim.
Você pode substituir
np.random.normal
por qualquer outra distribuição denp.random
para comparar os dados com outras distribuições.#!/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)
fonte
Agora existe no pacote statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
fonte
Para aumentar a confusão em torno de gráficos QQ e gráficos de probabilidade nos mundos Python e R, isto é o que o manual do SciPy diz:
Se você tentar
scipy.stats.probplot
, verá que de fato compara um conjunto de dados a uma distribuição teórica. Os gráficos QQ, OTOH, comparam dois conjuntos de dados (amostras).R tem funções
qqnorm
,qqplot
eqqline
. Da ajuda do R (versão 3.6.3):Resumindo, o R's
qqnorm
oferece a mesma funcionalidade quescipy.stats.probplot
a configuração padrãodist=norm
. Mas o fato de que eles o chamaramqqnorm
e que ele deveria "produzir um gráfico QQ normal" pode facilmente confundir os usuários.Finalmente, uma palavra de advertência. Esses gráficos não substituem os testes estatísticos adequados e devem ser usados apenas para fins ilustrativos.
fonte
Você pode usar bokeh
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)
fonte
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()
Aqui o probplot desenha as medidas do gráfico vs distribuição normal que especifique em dist = "norma"
fonte
Qual é o tamanho da sua amostra? Aqui está outra opção para testar seus dados em qualquer distribuição usando a biblioteca OpenTURNS . No exemplo abaixo, eu gerei uma amostra x de 1.000.000 de números a partir de uma distribuição Uniforme e testo-a contra uma distribuição Normal. Você pode substituir x por seus dados se você reformulá-lo como
x= [[x1], [x2], .., [xn]]
import openturns as ot x = ot.Uniform().getSample(1000000) g = ot.VisualTest.DrawQQplot(x, ot.Normal()) g
No meu Jupyter Notebook, vejo:
Se você estiver escrevendo um script, poderá fazê-lo de maneira mais adequada
from openturns.viewer import View` import matplotlib.pyplot as plt View(g) plt.show()
fonte