Calcul d’un écart type avec PHP

Je continue mon petit bonhomme de chemin dans le monde des civic tech et du big data et ce coup-ci j’avaisi besoin de calculer un écart type.
PHP dispose d’une fonction native pour cela, mais elle n’est pas installée chez tous les hébergements. J’ai écrit une petite fonction pour remédier à ce problème.
En même temps c’est un bon exercice intellectuel pour passer le temps.

Définition

L’écart type est utilisé en statistique pour connaître la dispersion d’une série de valeur par rapport à la moyenne.
Plus l’écart type est faible plus les valeurs sont proches de la moyenne.
Pour plus d’information je vous invite à aller faire un tour sur Wikipedia et sur Khan Academy.
La page Wikipedia sur l‘écart type: https://fr.wikipedia.org/wiki/%C3%89cart_type
Le cours de Khan Academy : https://fr.khanacademy.org/math/probability/data-distributions-a1/summarizing-spread-distributions/a/introduction-to-standard-deviation

Le code

function ecart_type ($donnees) {
    //0 - Nombre d’éléments dans le tableau
    $population = count($donnees);
    if ($population != 0) {
        //1 - somme du tableau
        $somme_tableau = array_sum($donnees);
        //2 - Calcul de la moyenne
        $moyenne = $somme_tableau / $population;
        //3 - écart pour chaque valeur
        $ecart = [];
        for ($i = 0; $i < $population; $i++){
            //écart entre la valeur et la moyenne
            $ecart_donnee = $donnees[$i] - $moyenne;
            //carré de l'écart
            $ecart_donnee_carre = bcpow($ecart_donnee, 2, 2);
            //Insertion dans le tableau
            array_push($ecart, $ecart_donnee_carre);
        }
        //4 - somme des écarts
        $somme_ecart = array_sum($ecart);
        //5 - division de la somme des écarts par la population
        $division = $somme_ecart / $population;
        //6 - racine carrée de la division
        $ecart_type = bcsqrt ($division, 2);
    } else {
        $ecart_type = "Le tableau est vide";
    }
      //7 - renvoi du résultat
    return $ecart_type;
}

Pour la structure de la fonction je me suis inspiré de ce cours : https://fr.khanacademy.org/math/probability/data-distributions-a1/summarizing-spread-distributions/a/calculating-standard-deviation-step-by-step

Détail du code

function ecart_type ($donnees) 

Pour le nom de la fonction je ne suis pas allé chercher loin. La variable qui est passée en paramètre doit être un tableau ne contenant que des valeurs numériques. Il faudrait la filtrer au préalable.

$population = count($donnees);

Pour débuter on va compter le nombre d’élément dans le tableau, la fonction count() est donc utile.

if ($population != 0)

Si le tableau n’est pas vide la fonction va calculer l’écart type.

$somme_tableau = array_sum($donnees);

D’abord on calcule la somme des éléments du tableau avec array_sum(). Si votre tableau contient des chaînes de caractères vous risquez d’avoir des erreurs à ce niveau-là, d’où l’importance du filtrage.

$moyenne = $somme_tableau / $population;

Connaissant la somme du tableau et la population, on calcule la moyenne. Elle servira pour calculer les différents écarts.

        $ecart = [];
        for ($i = 0; $i < $population; $i++){
            //écart entre la valeur et la moyenne
            $ecart_donnee = $donnees[$i] - $moyenne;
            //carré de l'écart
            $ecart_donnee_carre = bcpow($ecart_donnee, 2, 2);
            //Insertion dans le tableau
            array_push($ecart, $ecart_donnee_carre);
        }

Maintenant on va calculer l’écart à la moyenne pour chaque valeur et passer ce résultat dans un tableau.
Il faut d’abord créer le tableau qui contiendra les résultats.
Puis avec la boucle for on va calculer les différentes valeurs. Attention, ce sont les carrées des écarts qui seront passés dans le tableau.
Pour calculer le carré on utilise la fonction bcpow() qui prend trois arguments. Le premier est la valeur dont on veut connaître le carré, le deuxième est la puissance à laquelle on veut monter notre valeur, le troisième est le nombre de chiffre après la virgule.
Une fois le carré obtenu on le passe dans le tableau avec la fonction array_push().

$somme_ecart = array_sum($ecart);

Une fois le tableau des carrés des écarts rempli on en calcule la somme avec array_sum().

$division = $somme_ecart / $population;

Puis on divise cette somme par la population. On obtient donc le carré de l’écart type.

$ecart_type = bcsqrt ($division, 2);

Il ne reste plus qu’à calculer la racine carrée de notre résultat avec bcsqrt (). Cette fonction prend deux arguments, la variable contenant le nombre dont on veut connaître la racine carrée et le nombre de décimales. En règle générale deux chiffres après la virgule suffit en termes de précision.

    } else {
        $ecart_type = "Le tableau est vide";
    }

L’instruction if est terminée. Avec l’expression else on défini le message d’erreur à renvoyer si le tableau est vide.

return $ecart_type;

Pour finir on renvoie la variable $ecart_type qui contient le résultat final et qui sera affiché dans la page web.

Cette fonction reste assez sommaire, mais il faut reconnaître que PHP n’est pas vraiment le meilleur langage pour le calcul statistique. Mais dans un contexte Web on n’a souvent pas trop le choix.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

URL de rétrolien : http://blog.philippe-poisse.eu/index.php?trackback/234

Fil des commentaires de ce billet