> Modules non standards > SciPy > Distributions avec SciPy
Distributions avec SciPy
Généralités.
On fait ici : from scipy import stats
Il y a un grand nombre de distributions disponibles :
- distributions continues (dérivent de la classe rv_continuous) : beta, chi2, expon, f, gamma, logistic, norm, powerlaw, t, uniform, et beaucoup d'autres.
- distributions discrètes (dérivent de la classe rv_discrete) : binom, geom, hypergeom, nbinom, poisson, zipf et d'autres.
Pour avoir l'aide sur une distribution, faire : print(stats.norm.__doc__)
location et scale pour une distribution continue : permettent de déplacer et changer l'échelle de la distribution :
- en général, loc et scale permettent de faire une transformation (X - loc) / scale.
- stats.norm.rvs(loc = 10, scale = 2) : loi normale de moyenne 10 et écart-type 2
Méthodes des distributions continues :
- stats.norm.rvs(size = 100) : génération de 100 valeurs pour la distribution (ici Normale(0,1))
- stats.norm.rvs(loc = 10, scale = 2, size = 100) : 100 valeurs pour la distribution normale de moyenne 10 et d'écart-type 2.
- stats.norm.rvs(size = 100, random_state = 3) : pour avoir des valeurs reproductibles (si on donne la même valeur à random_state à chaque fois)
- stats.norm.cdf(0, loc = 10, scale = 2) : valeur cumulée de -infini jusqu'à la valeur indiquée pour une distribution normale.
- stats.norm.cdf([-1, 0, 1]) : renvoie une array numpy pour toutes les valeurs de la liste.
- stats.norm.ppf([0.005, 0.025, 0.5, 0.975, 0.995]) : la fonction inverse de cdf (percent point function). scipy.stats.norm.ppf(0.975) est donc la valeur de la distribution normale centrée réduite qui donne une proba de 0.975 en partant de - infini, donc, à peu près 2.
- stats.norm.pdf(0) : la valeur de la densité de probabilité en 0.
- stats.norm.mean(loc = 5, scale = 2) : la moyenne.
- stats.norm.std(loc = 5, scale = 2) : l'écart_type.
- stats.norm.var(loc = 5, scale = 2) : la variance.
A partir de données, on peut fitter les paramètres de la distribution par maximum likelihood :
- data = scipy.stats.norm.rvs(size = 100); mean, sd = scipy.stats.norm.fit(data)
- on peut aussi ne fitter que certains paramètres en faisant l'hypothèse d'une valeur fixée a priori pour les autres :
- en fixant la moyenne à 0 : mean, sd = scipy.stats.norm.fit(data, floc = 0)
- en fixant l'écart-type à 1 : mean, sd = scipy.stats.norm.fit(data, fscale = 1)
On peut définir une distribution une fois pour toutes
- dist = stats.norm(loc = 5, scale = 2) : définit une loi normale de moyenne 5 et d'écart-type 2
- puis, on peut l'utiliser : dist.rvs(size = 100) (génération de 100 valeurs)
- également, dist.cdf([0, 2, 5]), dist.pdf(3), dist.mean(), dist.var(), etc ...
Méthodes des distributions discrètes :
- stats.poisson.rvs(mu = 10, size = 100) : génération de 100 valeurs pour la distribution de poisson de paramètre 10
- stats.poisson.rvs([2, 8, 12]) : génération de 3 valeurs pour des distributions de poisson de paramètres 2, 8 et 12 respectivement.
- stats.poisson.pmf(11, mu = 10) : la probabilité de 11 pour une loi de poisson de paramètre 10.
- stats.poisson.pmf([9, 11, 12], mu = 10) : les probabilités de 9, 11 et 12 pour une loi de poisson de paramètre 10.
- stats.poisson.pmf([2, 5, 10], mu = [1, 7, 9]) : une array numpy avec les probabilités de 2, 5 et 10 d'une loi de poisson de paramètre 1, 7 et 9 respectivement (même principe avec cdf)
- stats.poisson.cdf(8, mu = 10) : la somme des probabilités de 0 à 10 pour une loi de poisson de paramètre 10
- stats.poisson.ppf(0.1, mu = 10) : la valeur qui donne un quantile d'environ 0.1 (stats.poisson.ppf(stats.poisson.cdf(x, mu = 10), mu = 10) donne x, pour x entier)
Distributions continues.
Quelques exemples de distributions discrètes (mais il y en a énormément d'autres) :
- dist = stats.uniform() : distribution uniforme (on peut la deplacer avec loc et scale : dist = stats.uniform(loc = 3, scale = 2) : uniforme entre 3 et 5)
- dist = stats.t(df = 10) : distribution t de Student
- dist = stats.beta(a = 0.5, b = 0.7) : distribution beta
- dist = stats.chi2(df = 10) : distribution du chi2
- dist = stats.expon() : distribution exponentielle. On peut aussi aussi faire une distribution exp(-2x) avec dist = stats.expon(scale = 1 / 2)
- dist = stats.gamma(a = 2) : distribution gamma
Distributions discrètes
Distributions discrètes :
- dist = stats.bernoulli(p = 0.3) : distribution de Bernoulli
- dist = stats.binom(n = 10, p = 0.3) : distribution binomiale
- dist = stats.poisson(mu = 5) : distribution de Poisson.
- dist = stats.nbinom(n = 5, p = 0.5) : distribution binomiale négative.
- dist = stats.geom(p = 0.3) : distribution géométrique
- dist = stats.hypergeom(M = 30, n = 5, N = 10) : distribution hypergéometrique.
Transformation de Box-Cox
Transformation de Box-Cox pour approximer le plus possible une loi normale :
- scipy.stats.probplot(values, dist = scipy.stats.norm, plot = pyplot.gca()) : trace un Q-Q plot pour regarder la normalité de valeurs.
- values2, lam = scipy.stats.boxcox(values) : renvoie les données transformées ainsi que le paramètre lambda de la transformation de Box-Cox qui est optimal pour approximer une loi normale.
- values2 = scipy.stats.boxcox(values, lmbda = lam) : calcule la transformation de Box-Cox pour une valeur donnée de lambda
- values = scipy.special.inv_boxcox(values2, lam) : transformation inverse pour retrouver les données d'origine.
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert