Mis a jour le 2025-04-14, 12:10

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