Menu

Moyenne, médiane et écart-type en R

Comment résumer des données en R : mean(), median(), sd(), var(), summary(), quantile() - ce que chacune calcule, le détail du n−1 derrière sd(), et pourquoi mode() de R est un piège.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Moyenne et médiane

Les deux résumés les plus utilisés de toute la statistique tiennent chacun en un appel de fonction :

mean() additionne tout et divise par l'effectif. median() trie les valeurs et prend celle du milieu (ou la moyenne des deux du milieu quand l'effectif est pair). Pour les 32 voitures de mtcars, la consommation moyenne est d'environ 20,1 mpg et la médiane de 19,2 - proches l'une de l'autre, ce qui te dit que les données ne sont pas fortement asymétriques. Quand elles divergent beaucoup, c'est aussi une information ; on y vient à la fin.

Une chose qui surprend tout le monde : si le vecteur contient ne serait-ce qu'un NA, les deux fonctions renvoient NA :

C'est délibéré - R refuse de faire discrètement comme si la valeur manquante n'existait pas. na.rm = TRUE dit « calcule sur les valeurs que tu as ». Presque toutes les fonctions de résumé de cet article l'acceptent. L'histoire complète de la propagation des NA est dans les valeurs manquantes.

Écart-type et variance

sd() mesure la dispersion : grosso modo, la distance à laquelle se trouve une valeur typique de la moyenne, dans les mêmes unités que les données. var() en est le carré :

Un écart-type d'environ 6 mpg signifie que les voitures se situent typiquement à environ 6 mpg de la moyenne de 20,1. Comme sd() est dans les unités propres des données, c'est celui que tu rapportes ; var() apparaît surtout à l'intérieur d'autres formules.

Voici le détail qui compte pour les cours : sd() et var() calculent la statistique d'échantillon - ils divisent la somme des écarts au carré par n − 1, pas par n :

Pourquoi n − 1 ? Parce que tu as estimé la moyenne à partir des mêmes données, les écarts autour de cette moyenne estimée sont systématiquement un peu trop petits ; diviser par n − 1 corrige ça. Comme tes données sont presque toujours un échantillon tiré de quelque chose de plus grand, la version en n − 1 est celle qu'il te faut. Si tu as réellement la population entière (chaque élève de la classe, chaque produit du catalogue), multiplie : var(x) * (n - 1) / n.

Erreur type de la moyenne

Écart-type et erreur type sont constamment confondus, alors garde-les séparés : l'écart-type décrit les données, l'erreur type décrit ton estimation de la moyenne. R n'a pas de se() intégré, mais la formule tient en une ligne :

L'erreur type diminue quand l'échantillon grandit - collecte quatre fois plus de données et l'erreur type est divisée par deux - parce qu'un échantillon plus grand cerne la moyenne plus précisément. L'écart-type, lui, ne diminue pas avec la taille de l'échantillon ; les voitures sont aussi variées qu'elles le sont, quel que soit le nombre que tu mesures. L'erreur type est la brique de base des intervalles de confiance, et c'est là qu'elle gagne sa place.

summary() - la vue d'ensemble en un appel

summary() te donne le résumé à cinq nombres plus la moyenne d'un coup, et il fonctionne sur des data frames entiers :

Appelé sur un data frame, il résume chaque colonne - les colonnes numériques reçoivent min/quartiles/moyenne/max, et les facteurs reçoivent les effectifs par niveau. C'est la première chose à lancer sur tout jeu de données que tu viens de charger : les valeurs impossibles (un âge négatif, un maximum de 9999) sautent immédiatement aux yeux.

Quantiles, étendue et IQR

quantile() généralise la médiane à n'importe quel point de coupe :

Sans argument il renvoie le minimum, les quartiles et le maximum. Passe probs = pour des points de coupe précis - les 10e et 90e percentiles ci-dessus encadrent l'endroit où vit le gros des données. IQR() (la distance entre les 25e et 75e percentiles) est une mesure de dispersion qui, contrairement à sd(), n'est pas tirée par les valeurs aberrantes. range() renvoie le min et le max sous forme de paire.

Le mode : le mode() de R ne fait PAS ça

Celui-ci attrape tout le monde exactement une fois. R a une fonction appelée mode(), et elle n'a rien à voir avec la statistique - elle rapporte le type de stockage d'un objet :

L'idiome à retenir : table(x) compte la fréquence d'apparition de chaque valeur, which.max() trouve le plus grand effectif, et names() extrait la valeur elle-même. Note qu'elle revient sous forme de chaîne de caractères (les noms de table le sont toujours) ; enveloppe-la dans as.numeric() si tu dois calculer avec. Si deux valeurs sont à égalité, which.max() ne renvoie silencieusement que la première - vérifie la table toi-même quand des égalités sont plausibles.

Moyenne ou médiane : laquelle rapporter

La moyenne utilise chaque valeur, ce qui est sa force et sa faiblesse - une seule valeur extrême la tire. La médiane ne s'intéresse qu'au milieu, donc les valeurs aberrantes l'affectent à peine :

Une seule valeur ajoutée pousse la moyenne d'environ 49 300 à plus de 155 000 - un nombre qui ne décrit personne dans les données - tandis que la médiane ne passe que de 48 000 à 49 500. C'est pourquoi les revenus, les prix de l'immobilier et les durées d'hospitalisation sont rapportés en médianes : des données asymétriques avec une longue queue rendent la moyenne trompeuse. Pour des données à peu près symétriques, les deux s'accordent et la moyenne convient très bien (et elle est statistiquement plus efficace). Un rapide histogramme te dit dans quelle situation tu es - et comparer ta moyenne à ta médiane est en soi un test d'asymétrie en une ligne.

Ce que tu retiens

  • mean(x) et median(x) - ajoute na.rm = TRUE quand il y a des valeurs manquantes.
  • sd(x) et var(x) calculent la statistique d'échantillon (dénominateur n − 1) - c'est ce que tu veux.
  • L'erreur type est sd(x) / sqrt(length(x)) - elle mesure à quel point tu connais bien la moyenne, pas la dispersion des données.
  • summary() sur un data frame fraîchement chargé est le contrôle de bon sens le plus rapide de R.
  • Le mode s'obtient avec names(which.max(table(x))) - le mode() de R parle de types de stockage.
  • Données asymétriques ou valeurs aberrantes : rapporte la médiane. Données symétriques : la moyenne convient.

Prochaine étape : mesurer comment deux variables évoluent ensemble - la corrélation avec cor() et cor.test().

Questions fréquentes

Comment calculer l'écart-type en R ?

Avec sd(x). Note qu'il calcule l'écart-type d'échantillon - il divise par n − 1, pas par n. C'est ce que tu veux dans presque toute analyse réelle, parce que tes données sont presque toujours un échantillon plutôt que la population entière.

Comment trouver la moyenne et la médiane en R ?

mean(x) et median(x). Si le vecteur contient des valeurs manquantes, les deux renvoient NA - ajoute na.rm = TRUE pour calculer sur les valeurs présentes : mean(x, na.rm = TRUE).

Comment trouver le mode en R ?

Pas avec mode() - cette fonction renvoie le type de stockage d'un objet, pas la valeur la plus fréquente. Utilise plutôt l'idiome de la table : names(which.max(table(x))) renvoie la valeur qui apparaît le plus souvent.

Qu'est-ce que l'erreur type en R ?

Il n'y a pas de fonction intégrée. Calcule-la avec sd(x) / sqrt(length(x)). L'écart-type décrit la dispersion de tes données ; l'erreur type décrit avec quelle précision tu as estimé la moyenne, et elle diminue quand l'échantillon grandit.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER