ChronoMath, une chronologie des MATHÉMATIQUES
à l'usage des professeurs de mathématiques, des étudiants et des élèves des lycées & collèges

Calculs des paramètres élémentaires de la statistique descriptive
      Statistique descriptive

Une série statistique étant donnée en vrac (triée ou non) ou en classes d'amplitudes distinctes ou non, ce programme calcule l'effectif total, la moyenne, l'écart moyen arithmétique, l'écart-type, la médiane, les quartiles et, à la demande, les déciles si n>50. Le lecteur pourra facilement modifier et compléter le programme afin d'obtenir les centiles pour des séries contenant plusieurs centaines de données.



 

<SCRIPT LANGUAGE=JavaScript>
var x=new Array(), c=new Array(), eff=new Array(), eff_cumul= new Array(), ampli_class=new Array()
function stat_elem() // programme stat elem
{
a="";a=prompt("série classée (o/n) ?",a)
if (a==null) {return} else {classe=0;if (a=="o"){classe=1}}
nc="";
if (classe==0)
{
nc=eval(prompt("Entrez le nombre de valeurs de votre série :",nc))
if (nc==null) {return}
}
if(classe==1)
{
nc=eval(prompt("Entrez le nombre de classes :",nc))
if (nc==null) {return}
a="";a=prompt("Classes de meme amplitude ? (o/n) ?",a)
if (a==null) {return} else {mem_ampli=0;if (a=="o") {mem_ampli=1}}
if(mem_ampli==1)
{
a="";a=eval(prompt("Entrez maintenant l'amplitude des classes :",a))
if (a==null) {return} else {ampli_class[1]=a}
}
a="";a=eval(prompt("Entrez la borne inférieure de la 1ère classe :",a))
if (a==null) {return} else {min=a}
}

for(i=1;i<=nc;i++)
// entrée des valeurs, nc est le nombre de valeurs ou le nombre de classes si série classée
{
if (classe==0) // série de nombres
{
a="";a=prompt("Entrez x("+i+"):",a)
if (a==null) {return} else {x[i]=eval(a)};
a="";a=eval(prompt("Donnez maintenant l'effectif de la valeur x("+i+") :",a))
if (a==null) {return} else {eff[i]=a}
}

if (classe==1) // série classée
{
if (mem_ampli==1) {ampli_class[i] = ampli_class[1]}
if (mem_ampli==0)
{
a="";a=eval(prompt("Donnez l'amplitude de la classe "+i+" :",a))
if (a==null) {return} else {ampli_class[i]=a}
}
a="";a=eval(prompt("Donnez maintenant l'effectif de la classe "+i+" :",a))
if (a==null) {return} else {eff[i]=a}
}
} // fin entrée des données
if(classe==0){tri()}
//alert(x[1]+" "+eff[1])
//alert(x[6]+" "+eff[6])

eff_cumul[0]=0; //calcul des effectifs cumulés
for(i=1;i<=nc;i++){eff_cumul[i]=eff_cumul[i-1] + eff[i]}

if (classe==1)
// calcul des bornes des classes et centres
{
x[1]=min;c[1]=min+ampli_class[1]/2
for(i=2;i<=nc;i++)
{x[i]=x[i-1]+ampli_class[i-1];c[i]=x[i]+ampli_class[i]/2}
x[nc+1]=x[nc]+ampli_class[nc]
}

moy=0;eff_t=0;    
// effectif total et calcul de la moyenne
for(i=1;i<=nc;i++)
{
eff_t=eff_t+eff[i]
if(classe==0) {moy=moy+x[i]*eff[i]} else {moy=moy+c[i]*eff[i]}
}
moy=moy/eff_t;
moy_arr=sign(moy)*Math.floor(Math.abs(moy)*1000+0.5)/1000   
// arrondi au milllième
alert("L'effectif total de la série donnée est : "+eff_t+"\n"+"La moyenne est : "+moy_arr)

V=0;em=0;Vk=0;  
//calcul de la variance, de l'écart-type et de l'écart moyen arithmétique
for(i=1;i<=nc;i++)
{
if (classe==0){em=em+eff[i]*Math.abs(x[i]-moy);V=V+eff[i]*(x[i]-moy)*(x[i]-moy);Vk = Vk+eff[i]*x[i]*x[i]}
else {em=em+eff[i]*Math.abs(c[i]-moy);V=V+eff[i]*(c[i]-moy)*(c[i]-moy)}
}
V=V/eff_t;s=Math.sqrt(V);em=em/eff_t;V1=Vk/eff_t-moy_arr*moy_arr;V2=Vk/eff_t-moy*moy;
V=Math.floor(Math.abs(V)*1000+0.5)/1000     
// arrondi au milllième
s=Math.floor(Math.abs(s)*1000+0.5)/1000
em=Math.floor(Math.abs(em)*1000+0.5)/1000
alert("La variance est "+V+"\n"+"L'écart-type est : "+s+"\n"+"L'écart moyen arithmétique est : "+em)

if (classe==1)   
 // calcul de la médiane
{
med=med_qdc(1/2)
alert("La médiane se situe dans la classe "+i+"\n"+"Sa valeur est : "+med)
}
else
{
if(eff_t%2==0){rg=eff_t/2;x1=x_rang(rg);x2=x_rang(rg+1);med=(x1+x2)/2} else {rg=(eff_t+1)/2;med=x_rang(rg)}
alert("La médiane est : "+med+", rang théorique : "+rg)
}

a="";a=prompt("Voulez-vous les quartiles (o/n) ?",a)    
// quartiles
if (a=="o")
{
if (classe==1)
{
q1=med_qdc(1/4);alert("Le 1er quartile se situe dans la classe "+i+"\n"+"Sa valeur Q1 est : "+q1)
q3=med_qdc(3/4);alert("Le 3ème quartile se situe dans la classe "+i+"\n"+"Sa valeur Q3 est : "+q3)
}
else
{
q1=quartile(1)
qq1=med_qdc(1/4);alert("Le 1er quartile théorique est : "+qq1+"\n"+"1er quartile corrigé : "+q1)
q3=quartile(3)
qq3=med_qdc(3/4);alert("Le 3ème quartile théorique est : "+qq3+"\n"+"1er quartile corrigé : "+q3)
}
alert("Intervalle interquartile : ["+q1+" , "+q3+"]")
}
if (eff_t>=50)
{
a="";a=prompt("Voulez-vous calculer des déciles (o/n) ?",a) // déciles
if ((a==null)||(a=="n")) {return}
while (1)  
// boucle valide tant que l'utilisateur n'annule pas de le prompt qui suit
{
a="";a=prompt("Préciser le décile (1 à 9) ?",a)
if (a==null) {return}
aa=10-a;
a$=" ème";if(a==1){a$="er"}
aa$=" ème";if(aa==1){aa$="er"}
if (classe==1)
{
d1=med_qdc(a/10);alert("Le "+a+a$+" décile se situe dans la classe "+i+"\n"+"Sa valeur est d"+a+" = "+d1)
d2=med_qdc(aa/10);alert("Le "+aa+aa$+" décile se situe dans la classe "+i+"\n"+"Sa valeur est d"+aa+" = "+d2)
}
else
{
d1=med_qdc(a/10);alert("Le "+a+a$+" décile est d"+a+" = "+d1)
d2=med_qdc(aa/10);alert("Le "+aa+aa$+" décile est d"+aa+" = "+d2)
}
 // fin while (1)
}
}
 // fin stat_elem

function tri() 
// tri par insertion des données en vrac
{
for(i=1;i<=nc;i++)
{
aux1=x[i];aux2=eff[i];j=i
while(aux1<x[j-1] && j>=1) {x[j]=x[j-1];eff[j]=eff[j-1];j--}
x[j]=aux1;eff[j]=aux2
}
}

function sign(x) 
// le signe de x est 1 si positif, 0 si nul, -1 si négatif
{
if(x==0){return 0} else {if (x>0) {return 1} else {return -1}}
}

function x_rang(n)
{
i=0;
while(n>eff_cumul[i]){i++}
return x[i]
}
function med_qdc(qdc) 
// routine calcul de la médiane et des quartiles
{
i=0;eff_cumul=0;div=1/qdc;
 // pour quartiles qdc=1/4 ou 3/4 donc div = 4 ou 4/3
while(eff_cumul<eff_t/div){i++;eff_cumul=eff_cumul+eff[i]}
eff_cumul=eff_cumul-eff[i];v_min=x[i]
medqdc=v_min+(eff_t/div-eff_cumul)*ampli_class[i]/eff[i]
if (classe==0) {medqdc=v_min}
medqdc=sign(medqdc)*Math.floor(Math.abs(medqdc)*1000+0.5)/1000 
 // arrondi au millième
return medqdc
}

function quartile(q)
{
r=nc%4
switch(r)
{
case 0:
ns4=nc/4;
if(q==1){quart=(x[ns4]+x[ns4+1])/2} else {quart=(x[3*ns4]+x[3*ns4+1])/2}
return quart
break
case 1:
ns4 =(nc-1)/4;
if(q==1){quart=x[ns4+1]} else {quart=x[3*ns4+1]}
alert("ns4="+ns4)
alert("quart="+quart)
return quart
break
case 2:
ns4=(nc-2)/4;
if(q==1){quart=x[ns4+1]} else {quart=x[3*ns4+2]}
return quart
break
case 3:
ns4=(nc-3)/4;
if(q==1){quart=(x[ns4+1]+x[ns4+2])/2} else {quart=(x[3*ns4+2]+x[3*ns4+3])/2}
return quart
break
 // fin switch
// fin quartile

</SCRIPT>


© Serge Mehl - www.chronomath.com