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
      @ programme JavaScript      » Statistique descriptive , Cas d'un couple statistique ou aléatoire pondéré

Une série statistique étant donnée en vrac (triée ou non) ou en classes d'amplitudes distinctes ou non, ce programme calcule :

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()}
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]}
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