Les statistiques

Python permet de tirer des nombres aléatoires et de travailler avec des distributions. Il permet aussi de calculer des statistiques. Plusieurs de ces fonctions sont dans scipy.stats mais certaines se retrouvent aussi dans numpy.

Prenons l’exemple de la distribution normale…

[7]:
from scipy.stats import norm
import numpy as np

Plusieurs fonctions sont disponibles

[4]:
dir(norm)
[4]:
['__call__',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getstate__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setstate__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_argcheck',
 '_argcheck_rvs',
 '_cdf',
 '_cdf_single',
 '_cdfvec',
 '_construct_argparser',
 '_construct_default_doc',
 '_construct_doc',
 '_ctor_param',
 '_entropy',
 '_fit_loc_scale_support',
 '_fitstart',
 '_get_support',
 '_isf',
 '_logcdf',
 '_logpdf',
 '_logsf',
 '_mom0_sc',
 '_mom1_sc',
 '_mom_integ0',
 '_mom_integ1',
 '_munp',
 '_nnlf',
 '_nnlf_and_penalty',
 '_open_support_mask',
 '_parse_args',
 '_parse_args_rvs',
 '_parse_args_stats',
 '_pdf',
 '_penalized_nnlf',
 '_ppf',
 '_ppf_single',
 '_ppf_to_solve',
 '_ppfvec',
 '_random_state',
 '_reduce_func',
 '_rvs',
 '_rvs_size_warned',
 '_rvs_uses_size_attribute',
 '_sf',
 '_stats',
 '_stats_has_moments',
 '_support_mask',
 '_unpack_loc_scale',
 '_updated_ctor_param',
 'a',
 'b',
 'badvalue',
 'cdf',
 'entropy',
 'expect',
 'extradoc',
 'fit',
 'fit_loc_scale',
 'freeze',
 'generic_moment',
 'interval',
 'isf',
 'logcdf',
 'logpdf',
 'logsf',
 'mean',
 'median',
 'moment',
 'moment_type',
 'name',
 'nnlf',
 'numargs',
 'pdf',
 'ppf',
 'random_state',
 'rvs',
 'sf',
 'shapes',
 'stats',
 'std',
 'support',
 'var',
 'vecentropy',
 'xtol']

Créons un vecteur numpy de valeurs aléatoires provenant d’une distribution normale.

[6]:
xs = norm(0,1).rvs(1000)
[9]:
np.mean(xs), np.std(xs)
[9]:
(-0.007637470068240482, 1.0197635816492145)

On peut aussi vouloir calculer la CDF à une valeur de x donnée:

[10]:
norm(0,1).cdf(0)
[10]:
0.5
[11]:
norm(0,1).pdf(0)
[11]:
0.3989422804014327

ou la CDF inverse (quantile):

[12]:
norm(0,1).ppf(0.5)
[12]:
0.0

Un truc utile est de simplifier notre notation à l’aide d’un alias. Par exemple, si on sait qu’on travaille avec la normale (0,1), alors on peut faire

[13]:
std_norm = norm(0,1)
phi = std_norm.pdf
Phi = std_norm.cdf
invPhi = std_norm.ppf

phi(0),Phi(0),invPhi(0.5)
[13]:
(0.3989422804014327, 0.5, 0.0)

Il est possible de faire des estimations non-paramétriques, des tests statistiques et de l’économétrie. Nous y reviendrons dans des leçons ultérieures.