Dix jours d’hiver
Un nouvel employé compte les locations des dix premiers jours de l’année et dit : « On loue environ 197 vélos par jour. » Le patron approuve.
L’année entière donne environ 270. Le nombre était juste et la phrase était fausse. Un résultat vaut ce que valent l’échantillon, la dispersion et le groupe derrière lui.
À la fin de cette leçon
Remarque
Je peux dire jusqu’où on peut croire le résultat d’un échantillon.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Échantillon | quelques lignes prises dans un tableau plus grand |
| Représentatif | un échantillon qui ressemble au tableau entier |
| Dispersion | de combien les valeurs diffèrent les unes des autres |
| Valeur aberrante | une valeur loin des autres, vraie ou fausse |
| Médiane | la valeur du milieu quand les valeurs sont rangées |
| Taille du groupe | le nombre de lignes derrière une moyenne ou un compte |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un échantillon sert s’il ressemble au tout
Souvent on ne peut pas tout regarder : on prend un échantillon. Un bon échantillon est représentatif : il ressemble au tableau entier sur ce qui compte.
Les dix premières lignes d’un tableau sont rarement représentatives. Elles viennent toutes du même endroit ou du même moment.
Comparer trois façons de choisir des jours
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); print(\"moyenne de l’année :\", round(h['hires'].mean(),1)); print(\"moyenne des 10 premiers jours :\", round(h['hires'].head(10).mean(),1)); print(\"moyenne d’un jour sur 36 :\", round(h['hires'].iloc[::36].mean(),1), len(h['hires'].iloc[::36]))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un échantillon au hasard bouge encore
Tirer des lignes au hasard évite un motif. Mais un petit échantillon au hasard donne chaque fois une autre moyenne, et un grand échantillon bouge moins.
Dans pandas, sample(10, random_state=1) tire dix jours. Le random_state est une graine : le même nombre redonne les mêmes jours.
Six échantillons de 10 jours, six de 100
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); print([round(h['hires'].sample(10, random_state=s).mean(),1) for s in range(1,7)]); print([round(h['hires'].sample(100, random_state=s).mean(),1) for s in range(1,7)])"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une grande valeur, et que faire d’elle
Une valeur aberrante est loin des autres. Elle tire la moyenne vers elle, mais bouge à peine la médiane.
Ne la supprimez pas parce qu’elle est grande. Demandez si elle peut être vraie. Une erreur, comme 5000 locations dans un magasin de 30 vélos, se retire. Un vrai jour chargé reste, et on le signale.
Un jour énorme, calculé en Python
# Sept jours de locations dans une station, puis la même liste avec un jour énorme.
jours = [204, 173, 327, 173, 240, 198, 220]
def milieu(valeurs):
en_ordre = sorted(valeurs)
moitie = len(en_ordre) // 2
if len(en_ordre) % 2 == 1:
return en_ordre[moitie]
return (en_ordre[moitie - 1] + en_ordre[moitie]) / 2
print("moyenne :", round(sum(jours) / len(jours), 1), "médiane :", milieu(jours))
jours.append(5000)
print("moyenne :", round(sum(jours) / len(jours), 1), "médiane :", milieu(jours))
# Lequel des deux nombres a le plus bougé ?
Mettre un 5000 inventé au premier jour
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); t=h.copy(); t.loc[t.index[0],'hires']=5000; print(round(h['hires'].mean(),1), h['hires'].median(), round(t['hires'].mean(),1), t['hires'].median())"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Regarder les trois plus grands jours
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); print(h.nlargest(3,'hires')[['date','weather','hires']].to_string(index=False))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent que la médiane est toujours meilleure que la moyenne. Elle est plus stable face à une valeur aberrante, mais elle cache sa taille. Donnez les deux, dites quelle était la plus grande valeur et pourquoi vous l’avez gardée.
Regardez la taille de chaque groupe
Une moyenne sur 8 jours et une moyenne sur 200 jours ne sont pas des preuves égales. Affichez toujours combien de lignes il y a dans chaque groupe, à côté de sa moyenne.
Et soignez le verbe. Les jours de pluie vont avec moins de locations dans ce tableau. Montrer que la pluie les cause demande plus qu’une moyenne.
Jours de pluie contre jours de soleil
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); r=h[h['weather']=='rainy']['hires']; s=h[h['weather']=='sunny']['hires']; print(len(r),len(s),round(r.mean(),1),round(s.mean(),1)); print(round(r.std(),1), round(s.std(),1))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : lire les nombres
| Ce qu’on voit | Ce qu’on peut dire | Ce qu’on ne peut pas dire |
|---|---|---|
| 120 jours de pluie, moyenne 227.6 | Les jours de pluie ont eu moins de locations ici | Que la pluie est la seule raison |
| 131 jours de soleil, moyenne 312.2 | Les jours de soleil étaient plus chargés ici | Que ce sera pareil l’an prochain |
| Dispersion de 80.3 et 68.2 | Un jour isolé varie beaucoup | Qu’un jour donné sera proche de sa moyenne |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Plus loin : une règle juste
Dans votre carnet, trouvez les percentiles 25 et 75 de hires avec quantile. Appelez leur écart l’EIQ.
Comptez les jours sous le percentile 25 moins 1,5 EIQ ou au-dessus du percentile 75 plus 1,5 EIQ. Quels jours sont-ce, et en retireriez-vous un ?