« Découvrir Scilab/Statistiques » : différence entre les versions

Contenu supprimé Contenu ajouté
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 26 :
 
La commande
<sourcesyntaxhighlight lang="scilab">
strange(X)
</syntaxhighlight>
</source>
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 <code>strange(X, "r")</code> et <code>strange(X, "c")</code>.
La commande
<sourcesyntaxhighlight lang="scilab">
mad(X)
</syntaxhighlight>
</source>
calcule la déviation absolue moyenne ''(mean absolute deviation)''
: <math>\dfrac{1}{n}\sum| x_i - \bar{x} |</math>
Ligne 39 :
 
La commande
<sourcesyntaxhighlight lang="scilab">
iqr(X)
</syntaxhighlight>
</source>
calcule l'écart interquartile ''(interquartile range)''.
 
La commande <code>stdev</code> calcule l'écart type ''(standard deviation)'' et la commande <code>variance</code> 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 <code>1</code> pour calculer le moment d'ordre 2 (normalisation par ''m'' ou ''n''), par exemple
<sourcesyntaxhighlight lang="scilab">
mom2 = variance(X, "r", 1) // pour une matrice non-vecteur
mom2 = variance(X, "*", 1) // pour un vecteur
</syntaxhighlight>
</source>
L'écart type est toujours sans biais. Si l'on veut l'estimateur normalisé par ''m'' ou ''n'', il faut utiliser
<sourcesyntaxhighlight lang="scilab">
estim_ecart_type = sqrt(variance(X, "*", 1)) // pour une matrice non-vecteur
</syntaxhighlight>
</source>
 
== Normalisation ==
Ligne 61 :
 
La commande <code>tabul(X)</code> 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 <code>"i"</code> ''({{lang|en|increasing order}})'' :
<sourcesyntaxhighlight lang="scilab">
tabul(X, "i")
</syntaxhighlight>
</source>
 
La commande <code>quart(X)</code> calcule les quartiles et les renvoie dans un vecteur de dimension 3. On peut calculer les quartiles pour chaque colonne ou chaque ligne, avec <code>quart(X, "r")</code> et <code>quart(X, "c")</code>.
Ligne 75 :
'''Exemple'''
 
<sourcesyntaxhighlight lang="scilab">
X = int(10*rand(100,1, "normal")); // génère 100 valeurs entières avec une loi normale centrée d'écart type 10
F = tabul(X); // calcule les fréquences d'apparition
Ligne 84 :
 
moyenne = meanf(x, f); // calcul de la moyenne pondérée par les fréquences
</syntaxhighlight>
</source>
 
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 :
Ligne 92 :
'''Exemple'''
 
<sourcesyntaxhighlight lang="scilab">
n = 10; // nombre de valeurs
X = 1:n; // abscisses
Ligne 104 :
correlation1 = correl(X, Y, F);
correlation2 = covariance2/sqrt(variance(X, "*", 1))/sqrt(variance(Y, "*", 1)); // calcul "à la main"
</syntaxhighlight>
</source>
 
== Fonctions de distribution et de répartition de lois statistiques ==
Ligne 111 :
 
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
<sourcesyntaxhighlight lang="scilab">
f = binomial(p, n)
</syntaxhighlight>
</source>
La variable <code>f</code> est un vecteur de ''n'' + 1 composantes, avec
: <math>\mathtt{f}(k + 1) = \begin{pmatrix} n \\ k \end{pmatrix} \cdot p^k \cdot (1 - p)^{n - k}
= \mathrm{C}^k_n \cdot p^k \cdot (1 - p)^{n - k}</math>
La fonction de répartition s'obtient avec <code>cdfbin()</code> :
<sourcesyntaxhighlight lang="scilab">
P = = cdfbin("PQ", k, n, p, 1-p)
</syntaxhighlight>
</source>
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
<sourcesyntaxhighlight lang="scilab">
f = binomial(p, n)
c = sum(f(1:k+1))
</syntaxhighlight>
</source>
 
De manière générale, les fonctions de répartition commencent par <code>cdf…</code> ''(cumulative distribution function)'', par exemple :
Ligne 139 :
 
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.
<sourcesyntaxhighlight lang="scilab">
X = -3:0.1:3;
mu = zeros(X);
Ligne 145 :
[P, Q] = cdfnor("PQ", X, mu, sigma);
plot(X', [P', Q'])
</syntaxhighlight>
</source>
 
Les mêmes fonctions permettent de rechercher les quantiles ou fractiles :
Ligne 158 :
 
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é
<sourcesyntaxhighlight lang="scilab">
-->x = cdfnor("X", 0, 1, 0.975, 0.025)
x =
Ligne 168 :
2.0422725
</syntaxhighlight>
</source>
 
Enfin, ces fonctions permettent de déterminer les paramètres des loi pour atteindre un quantile visé :
Ligne 186 :
 
Scilab possède une fonction <code>rand()</code> 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 :
<sourcesyntaxhighlight lang="scilab">
de = 1 + int(6*rand())
</syntaxhighlight>
</source>
La fonction peut générer une matrice ''m''×''n'' avec les syntaxes
<sourcesyntaxhighlight lang="scilab">
rand(m, n)
rand(X)
</syntaxhighlight>
</source>
où X est une matrice ''m''×''n''. Notons que si l'on veut générer ''n'' valeurs, il faut bien taper <code>rand(n, 1)</code> ou <code>rand(1, n)</code>.
 
On peut lui faire générer une valeur selon une loi normale centrée réduite avec la clef <code>"normal"</code> :
<sourcesyntaxhighlight lang="scilab">
rand(m, n, "normal")
</syntaxhighlight>
</source>
 
'''Exemple'''
Ligne 207 :
On veut déterminer statistiquement dans combien de cas la contrainte S est supérieure à la résistance R<sub>e</sub>.
 
<sourcesyntaxhighlight lang="scilab">
n = 1e6; // nombre d'événements
R = 269 + 17*rand(n, 1, "normal"); // résistance
Ligne 214 :
moyenne = sum(Mbool)/n; // les "vrai" comptent pour 1 et les "faux" pour 0
disp(string(100*moyenne)+" %") // affichage du résultat
</syntaxhighlight>
</source>
 
La commande <code>grand()</code> ''(get random number)'' permet d'avoir des nombres aléatoires selon de nombreuses lois, par exemple :
Ligne 223 :
* …
Dans l'exemple précédent, on aurait donc :
<sourcesyntaxhighlight lang="scilab">
R = grand(n, 1, "nor", 369, 17); // résistance
S = grand(n, 1, "nor", 314, 14); // contrainte
</syntaxhighlight>
</source>
 
== Autres lois statistiques ==
Ligne 234 :
Par exemple le module [http://atoms.scilab.org/toolboxes/casci CASCI] donne accès à de nombreuses fonctions de distribution et de répartition, notamment des lois log-normale (<code>pdflognormal()</code>, <code>cdflognormal()</code>), exponentielle (<code>pdfexponential()</code>, <code>cdfexponential()</code>) ou de Weibull (<code>pdfweibull()</code>, <code>cdfweibull()</code>). Ainsi :
 
<sourcesyntaxhighlight lang="scilab">
p = pdfnormal(x, mu, sigma); // densité d'une loi normale en x
y = cdflognormal(x, lambda); // répartition d'une loi log-normale d'espérance mu et d'écart type sigma
Ligne 240 :
y = cdfweibull(x, k, lambda, theta); // répartition d'une loi de Weibull
// de paramètre de forme k, de paramètre d'échelle lambda et de paramètre de position thêta
</syntaxhighlight>
</source>
 
Le module fournit également le calcul des quantiles avec les fonctions <code>idf…</code> ''({{lang|en|inverse cumulative distribution functions}})'', et des générateurs de nombres aléatoires avec les fonctions <code>rnd…</code>. Par exemple :
<sourcesyntaxhighlight lang="scilab">
x = idfweibull(y, k, lambda, theta); // quantile y d'une loi de Weibull
// de paramètre de forme k, de paramètre d'échelle lambda et de paramètre de position thêta
X = rndweibull(n, k, lambda, theta); // génère n nombres aléatoires selon la loi de Weibull
</syntaxhighlight>
</source>
 
== Module Stixbox ==
Ligne 255 :
Le module [http://atoms.scilab.org/toolboxes/stixbox Stixbox] définit également un certain nombre de fonctions statistiques utiles. Citons par exemple la fonction <code>quantile()</code> qui permet de calculer les quantiles expérimentaux et la fonction <code>qqplot()</code> qui permet de tracer un diagramme quantile-quantile (par exemple une droite de Henry). Par exemple :
 
<sourcesyntaxhighlight lang="scilab">
n = 100;
X = rand(1, n, "norm"); // tirage aléatoire de n valeurs
Ligne 274 :
xtitle("diagramme quantiles-quantiles", "quantiles théoriques",...
"quantiles expérimentaux");
</syntaxhighlight>
</source>
 
== Notes ==