# Découvrir Scilab/Statistiques

Table des matières — Index
4. Statistiques
Pour l'analyse statistique de données, on peut se reporter au document
    (en) Anna Bassi et Giovanni Borzi, « Data Analysis and Statistics: a Scilab data mining tutorial » [PDF], sur Openeering.

## Tendance centrale

Considérons une matrice X. On peut calculer les moyennes suivantes :
* mean(X) : calcule la moyenne de tous les éléments de X ;
* mean(X, "r") : donne un vecteur ligne (row) contenant les moyennes colonne par colonne ;
* mean(X, "c") : donne un vecteur colonne contenant les moyennes ligne par ligne.
On peut calculer la moyenne géométrique avec geomean, et la moyenne harmonique avec harmean, avec la même syntaxe.
De la même manière, on peut calculer les médianes avec median(X), median(X, "r") et median(X, "c").
La commande trimmean(X, p) permet de calculer la moyenne en éliminant les p pourcents extrêmes (les p/2 % valeurs les plus élevées, et les p/2 % valeurs les plus faibles). On peut également faire le calcul par ligne ou par colonne — trimmean(X, p, "r") ou trimmean(X, p, "c"). notons que l'on a :
* mean(X) = trimmean(X, 0) ;
* median(X) = trimmean(X, 100).

## Dispersion

La commande
calcule l'écart (range) entre la valeur maximale et la valeur minimale de la matrice. On peut calculer les valeurs pour chaque colonne ou chaque ligne avec strange(X, "r") et strange(X, "c"). La commande
calcule la déviation absolue moyenne (mean absolute deviation)
    ${\dfrac {1}{n}}\sum |x_{i}-{\bar {x}}|$
on peut de même la calculer pour chaque colonne ou ligne.
La commande
calcule l'écart interquartile (interquartile range).
La commande stdev calcule l'écart type (standard deviation) et la commande variance la variance des éléments de la matrice (entière, par ligne ou par colonne). Par défaut, la variance est sans biais : normalisée par m × n – 1 pour une matrice de m × n éléments, par m – 1 par colonne et par n – 1 par ligne. Si l'on calcule la variance par ligne ou par colonne, on peut ajouter l'option 1 pour calculer le moment d'ordre 2 (normalisation par m ou n), par exemple
L'écart type est toujours sans biais. Si l'on veut l'estimateur normalisé par m ou n, il faut utiliser

## Normalisation

La commande center(X) permet de centrer la matrice (équivalent de X - mean(X)). La commande wcenter(X) donne la matrice centrée réduite (équivalent de 1/stdev(X)*(X - mean(X))).

## Fréquences et quartiles

La commande tabul(X) calcule les fréquences d'apparition des valeurs dans la matrice X. Le résultat est classé par défaut par ordre décroissant des valeurs ; pour avoir un classement croissant, on ajoute le paramètre "i" (increasing order) :
La commande quart(X) calcule les quartiles et les renvoie dans un vecteur de dimension 3. On peut calculer les quartiles pour chaque colonne ou chaque ligne, avec quart(X, "r") et quart(X, "c").
On peut aussi travailler avec des valeurs et leur fréquence. Si la matrice X contient les valeurs et la matrice F leur fréquence — F(i, j) est la fréquence de X(i, j) —, alors
* meanf(X, F) donne la moyenne ;
* stdevf(X, F) donne l'écart type ;
* variancef(X, F) donne la variance.
Notons que F n'est pas nécessairement normalisé à 1 ou à 100 ; il peut par exemple s'agir d'un nombre d'occurrences.
Exemple
Considérons maintenant deux vecteurs X et Y de même dimension, et la matrice F des fréquences de X et Y : F(i, j) est la fréquence de X(i) & Y(j). Alors :
* covar(X, Y, F) donne la covariance ;
* correl(X, Y, F) donne le coefficient de corrélation.
Exemple

## Fonctions de distribution et de répartition de lois statistiques

Par défaut, Scilab propose une loi de distribution, pour la loi binomiale, et onze lois de répartition (probabilités cumulatives).
Pour la loi binomiale, la fonction de répartition pour n épreuves (nombre entier) avec une probabilité p (nombre réel entre 0 et 1) est donnée par
La variable f est un vecteur de n + 1 composantes, avec
    ${\mathtt {f}}(k+1)={\begin{pmatrix}n\\k\end{pmatrix}}\cdot p^{k}\cdot (1-p)^{n-k}=\mathrm {C} _{n}^{k}\cdot p^{k}\cdot (1-p)^{n-k}$
Notez que les coefficients binomiaux C$^k$$_n$ s'obtiennent eux avec la commande b = nchoosek(n, k).
La fonction de répartition s'obtient avec cdfbin :
donne la probabilité P d'avoir entre 0 et k succès pour n tirages avec une probabilité de réussite p. On peut d'ailleurs le comparer avec
De manière générale, les fonctions de répartition commencent par cdf… (cumulative distribution function), par exemple :
* P = cdfchi("PQ", x, k) : loi du χ$^2$ à k degrés de liberté ;
* P = cdfnor("PQ", x, mu, sigma) : loi normale d'espérance mu et d'écart type sigma ;
* P = cdfpoi("PQ", k, lambda) : loi de Poisson de paramètre lambda ;
* P = cdft("PQ", t, k) : loi t de Student à k degrés de liberté ;
* … voir Scilab help >> Statistics > Cumulated Distribution Functions
Notons que pour chaque cas, on peut aussi avoir la valeur complémentaire Q = 1 – P avec la syntaxe
Exemple
Ci-dessous, nous traçons la fonction de répartition de la loi normale centrée réduite (μ = 0, σ = 1). Notons que pour des calculs vectoriels, l'espérance et l'écart type sont des vecteurs de même dimension que X.
Les mêmes fonctions permettent de rechercher les quantiles ou fractiles :
* k = cdfbin("S", n, P, 1-P, p, 1-p) : nombre de succès k sur n épreuves ayant pour paramètre p, donnant une probabilité cumulée P ;
* x = cdfchi("X", k, P, 1-P) : valeur de x pour laquelle on a une probabilité cumulée P avec une loi du χ$^2$ à k degrés de liberté ;
* x = cdfnor("X", mu, sigma, P, 1-P) : valeur de x pour laquelle on a une probabilité cumulée P avec une loi normale d'espérance mu et d'écart type sigma ;
* k = cdfpoi("S", lambda, P, 1-P) : valeur de k pour laquelle on a une probabilité cumulée P avec une loi de Poisson de paramètre lambda ;
* t = cdft("T", k, P, 1-P) : valeur de t pour laquelle on a une probabilité cumulée P avec une loi t de Student à k degrés de liberté ;
Exemple
Ci dessous, nous déterminons le quantile pour un risque α bilatéral de 5 %, c'est-à-dire que l'on rejette 0,25 % des cas les plus hauts et les plus bas, pour une loi normale centrée réduite puis pour une loi t de Student à 30 degrés de liberté
Enfin, ces fonctions permettent de déterminer les paramètres des loi pour atteindre un quantile visé :
* loi binomiale :
** n = cdfbin("Xn", p, 1-p, P, 1-P, k) : nombre d'épreuves ayant pour paramètre p afin d'avoir un quantile P valant k,
** [p, q] = cdfbin("PrOmpr", P, 1-P, k, n) : paramètre p de chaque épreuve afin d'avoir un quantile P pour k succès parmi n ;
* loi du χ$^2$ : k = cdfchi("Df", P, 1-P, x) : valeur du nombre de degrés de liberté (degrees of freedom) k pour avoir un quantile P valant x ;
* loi normale :
** mu = cdfnor("Mean", sigma, P, 1-P, x) : valeur de l'espérance (moyenne) pour avoir un quantile P valant x si l'on a un écart type sigma,
** sigma = cdfnor("Std", P, 1-P, X, mu) : valeur de l'écart type (standard deviation) pour avoir un quantile P valant x si l'on a une espérance de mu ;
* loi de Poisson : lambda = cdfpoi("Xlam", P, 1-P, k) : valeur du paramètre λ pour avoir un quantile P valant k ;
* loi t de Student : k = cdft("Df", P, 1-P, t) : nombre de degrés de liberté k pour avoir un quantile P valant t.

## Générateurs pseudo-aléatoires

Les générateurs de nombres aléatoires permettent de tester des programmes ou bien de faire des simulations par la méthode de Monte Carlo.
Scilab possède une fonction rand qui par défaut génère un nombre entre 0 et 1 avec une loi de distribution uniforme. Par exemple, pour simuler un jet de dé à six faces, on peut utiliser :
La fonction peut générer une matrice m × n avec les syntaxes
où X est une matrice m × n. Notons que si l'on veut générer n valeurs, il faut bien taper rand(n, 1) ou rand(1, n).
On peut lui faire générer une valeur selon une loi normale centrée réduite avec la clef "normal" :
Exemple
Supposons par exemple que l'on a une poutre faite dans un acier dont la résistance intrinsèque, la limite d'élasticité R$_e$, est garantie au minimum à 235 MPa. En réalité, R$_e$ suit une loi normale d'espérance μ$_{Re}$ = 269 MPa et d'écart type σ$_{Re}$ = 17 MPa. Dans les conditions d'utilisation, l'acier de cette poutre doit résister à une contrainte S (stress) de 214 MPa ; en fait, les conditions de chargement sont variables et suivent une loi normale de paramètres μ$_S$ = 214 MPa et σ$_S$ = 15 MPa.
On veut déterminer statistiquement dans combien de cas la contrainte S est supérieure à la résistance R$_e$.
La commande grand (get random number) permet d'avoir des nombres aléatoires selon de nombreuses lois, par exemple :
* Y = grand(m, n, "bin", N, p) : matrice m × n de nombres aléatoires tirés selon une loi binomiale de N essais avec une probabilité p chacun ;
* Y = grand(m, n, "nor", mu, sigma) : pour une loi normale d'espérance mu et d'écart type sigma ;
* Y = grand(m, n, "unf", a, b) : pour une loi uniforme sur [a ; b[ (b exclus) ;
* Y = grand(m, n, "uin", a, b) : pour une loi uniforme sur [a ; b] (b inclus) ;
Dans l'exemple précédent, on aurait donc :

## Autres lois statistiques

Des modules complémentaires Atoms permettent d'avoir accès à d'autres loi.
Par exemple le module CASCI donne accès à de nombreuses fonctions de distribution et de répartition, notamment des lois log-normale (pdflognormal, cdflognormal), exponentielle (pdfexponential, cdfexponential) ou de Weibull (pdfweibull, cdfweibull). Ainsi :
Le module fournit également le calcul des quantiles avec les fonctions idf… (inverse cumulative distribution functions), et des générateurs de nombres aléatoires avec les fonctions rnd…. Par exemple :

## Module Stixbox

Le module Stixbox définit également un certain nombre de fonctions statistiques utiles. Citons par exemple la fonction quantile qui permet de calculer les quantiles expérimentaux et la fonction qqplot qui permet de tracer un diagramme quantile-quantile (comme une droite de Henry). Par exemple :

## Notes

Calcul numérique < ↑ > Interpolation, extrapolation et lissage