Vous êtes sur la page 1sur 53

Traiter des données statistiques au lycée

avec pandas pour Python

Frédéric BRO
Professeur au lycée Henri Moissan de Meaux
Philippe DUTARTE
IA-IPR de mathématiques – académie de Nice

SOMMAIRE
A. Éléments pour l’enseignant ........................................................................................................ 2
1. Des compétences porteuses d’avenir................................................................................... 2
2. Fichiers au format csv ............................................................................................................ 2
3. La bibliothèque pandas de Python........................................................................................ 3
B. Exemples d’activités pour la classe .......................................................................................... 7
1. Titanic : les femmes et les enfants d’abord ? ...................................................................... 7
2. Inégalités de salaire en France ............................................................................................ 13
3. Sécurité routière .................................................................................................................... 25
4. Data journalisme : suspicion de fraude dans le monde du tennis .................................. 30
5. Galton, Pearson et régression en Python........................................................................... 42
6. Mélanomes aux USA 1950-1959 ........................................................................................... 49

1
Catégorie de ressource

A. Éléments pour l’enseignant


1. Des compétences porteuses d’avenir
Un article de 2012 du Harvard Business Revue titrait : « Data Scientist : The Sexiest Job of the 21st
Century ». On y décrit un data scientist comme une personne ayant une solide formation en
mathématiques, statistique, probabilités et informatique, dotée d’un grand esprit de curiosité.
« Quelles sont les compétences qui font un bon data scientist ? Considérez-le comme un hybride de
hacker de données, d’analyste, de communiquant et de conseiller. La combinaison est extrêmement
puissante et rare ». La demande pour de tels profils est forte et de nombreuses formations de
l’enseignement supérieur ont été créées pour y répondre. Depuis quelques années, la visualisation de
données (dataviz en anglais), portée par le phénomène du big data, a pris une importance
économique considérable (20 % des entreprises européennes utilisent le data storytelling pour
acquérir un avantage concurrentiel). C’est ce type de compétences, porteuses d’avenir, que l’on
souhaite développer chez les élèves, par le biais d’activités motivantes utilisant les possibilités offertes
par les outils numériques et notamment la bibliothèque pandas de Python.

2. Fichiers au format csv


De nombreux fichiers de données sont téléchargeables sur Internet au format csv (Comma-Separated
Values). Il s’agit de fichiers « texte » où une table de valeurs est fournie en lignes. Pour chaque
ligne,les valeurs correspondant à des colonnes différentes sont séparées par une virgule. Le
séparateur n’est pas toujours une virgule, mais peut être, par exemple, un point-virgule (notamment
lorsque la virgule est utilisée, comme en France, comme séparateur décimal).

Exemple : premières lignes du fichier « titanic.csv », avec comme séparateur le point-virgule, ouvert
dans un bloc-note (la première ligne correspond aux noms des variables).

Le même fichier, ouvert dans un tableur, est affiché sous forme de tableau :

Les fichiers csv peuvent être lus et analysés avec Python, notamment grâce à la bibliothèque pandas
qui permettra, de plus, une analyse statistique des données.

2
Catégorie de ressource

3. La bibliothèque pandas de Python


La bibliothèque pandas fait de Python un langage très puissant pour l’exploration de données. Le nom
de pandas dérive de panel data, qui désigne des ensembles de données structurées
multidimensionnelles, et de Python Data Analysis.
La bibliothèque pandas permet de lire un fichier de données csv par la fonction read_csv (le fichier
Python ou le notebook et le fichier csv doivent se trouver dans le même dossier, sinon il faut indiquer
le chemin permettant la lecture du fichier csv).

La variable table ainsi créée est la table de données associée au fichier csv. Cette table est
semblable à celle obtenue avec le tableur.Par défaut, le séparateur d’un fichier csv est la virgule.
Comme les valeurs du fichier titanic.csv sont séparées par un point-virgule, nous avons indiqué ';'
comme valeur du paramètre sep de la fonction read_csv.
La fonction head permet d’afficher les 4 premières lignes(par exemple) de données.

Les lignes d’une table de données sont numérotées, par défaut, à partir de 0, comme pour les listes
en langage Python.
Nous donnons dans ce document quelques exemples d’exploitation de la bibliothèque pandas au
lycée (programmes 2019).
Le mémento suivant permet de lister les principales fonctions utilisées.

3
Catégorie de ressource

Mémento pandas

Lecture d’un fichier csv


Importer le module pandas import pandas
T = pandas.read_csv('nom.csv', sep = ';')
sep = ',' si le séparateur du fichier csv est une
virgule.
Lire le fichier nom.csv figurant dans le même
sep = '\t' si le séparateur du fichier csv est une
dossier que le programme Python et affecter
tabulation.
les données à une table de données,
Ajouter l’argument encoding = 'latin-1' si le
nommée T, dont chaque colonne correspond
fichier csv comporte des accents.
à une variable statistique.
Ajouter à la fin l’argument decimal = ',' si les
nombres décimaux du fichier csv sont séparés par
une virgule.
Opérations de base sur une table pandas et ses colonnes
Dimension de T : nombre de lignes
T.shape
(individus) et de colonnes (variables).
(Nom) et type des variables (ou colonnes). T.dtypes
Afficher les 5 premières lignes de T. T.head(5)
Afficher les 5 dernières lignes de T. T.tail(5)
Afficher des indicateurs statistiques pour
T.describe()
chaque colonne de nombres de T.
Afficher des indicateurs statistiques pour la
T['C'].describe()
colonne de nombres nommée C.
Calculer la moyenne de la variable C. T['C'].mean()
Calculer l’écart type de la variable C.
Remarque : la fonction std() fournit, par
T['C'].std(ddof = 0)
défaut, l’estimation sn – 1 de l’écart type en
considérant C comme un échantillon.
Calculer la médiane de la variable C. T['C'].median()
Calculer la somme de la variable C. T['C'].sum()
Compter le nombre de valeurs de la colonne
T['C'].count()
C.
Déterminer les effectifs de chacune des
T['C'].value_counts()
valeurs prises par la variable C.
Trier T par ordre croissant selon la variable
T.sort_values(by = 'C ')
C.
Trier T par ordre décroissant selon la variable T.sort_values(by = 'C ',
C. ascending = False)
Extraction d’un sous-tableau sous condition, tableau croisé avec pandas
T1 = T.query('C != 0')
Créer une table T1 correspondant aux lignes
ou
de Toù la variable C est non nulle.
T1 = T[T['C'] != 0]
Créer une table T2 correspondant aux lignes T2 = T.query('A >= 2 and B <= 6')
de T où la variable A est supérieure à 2 et la ou
variable B inférieure à 6. T2 = T[(T['A'] >= 2) & (T['B']<= 6)]
Créer une table T3 correspondant aux lignes T3 = T.query('A >= 2 or B <= 6')
de T où la variable A est supérieure à 2 ou la ou
variable B inférieure à 6. T3 = T[(T['A'] >= 2) | (T['B'] <= 6)]
Créer une table T4 correspondant aux lignes T4 = T.query('A == "kiwi"')
de T où la variable A contient la chaîne de ou
caractères "kiwi". T4 = T[T['A'] == "kiwi"]

4
Catégorie de ressource

Créer une table T5 correspondant aux lignes T5 = T.query('A == @var')


de T où la colonne A contient une variable ou
nommée var. T5 = T[T['A'] == var]
Créer une table T6 échantillon aléatoire sans import random
remise de 100 lignes de T. T6 = T.sample(n = 100)
Créer une table des effectifs des colonnes de
T en regroupant les données selon les T.groupby('C').count()
valeurs de la variable C.
Créer une table des moyennes des colonnes
de T en regroupant les données selon les T.groupby('C').mean()
valeurs de la variable C.
Créer une table des sommes des colonnes
de T en regroupant les données selon les T.groupby('C').sum()
valeurs de la variable C.
Créer un tableau croisé en effectifs des pandas.crosstab(T['C1'], T['C2'], margins
variables C1 et C2 de la table T. = True)

Installer pandas dans votre environnement Python


– À partir d’Anaconda ou de Miniconda, il peut être nécessaire, avant la première utilisation de
pandas, de saisir l’une des instructions suivantes :
condainstall pandas ou pipinstall pandas.
Depuis Anaconda Navigator, on peut gérer les modules.

Il y a deux façons pour installer pandas s’il n’est pas installé par défaut :
- aller dans Environments, cliquer sur installed puis choisir not installed et saisir pandas puis cliquer
sur la ligne associée ;
- aller dans Environments, cliquer sur base (root), puis choisir Open Terminal et écrire conda
install pandas ou pip install pandas. Appuyer sur Entrée puis attendre l’installation.

– Sur EduPython (version mai 2019), la bibliothèque pandas n'est pas installée par défaut. Pour
l'installer, il faut suivre la procédure suivante :
Aller dans le menu Outils/Outils et choisir Installation d'un nouveau module.

5
Catégorie de ressource

Pour le choix de la méthode d'installation, taper 1 (conda).


Pour le choix du module : saisir pandas puis valider.

6
Catégorie de ressource

B. Exemples d’activités pour la classe


1. Titanic : les femmes et les enfants d’abord ?

Éléments du programme commun aux classes de première en voie technologique


Contenus
– Croisement de variables catégorielles.
– Tableau croisé d’effectifs.
– Fréquence conditionnelle, fréquence marginale.
Commentaires
– L’étude des fréquences conditionnelles permet un travail sur la langue française en considérant
les formulations usuellement utilisées dans les médias.
– Des variables catégorielles de natures diverses sont étudiées : nominale (profession, espèce,
département de résidence…), ordinale (niveau d’étude, degré de satisfaction de la clientèle…) ou
définies par des intervalles (classe d’âge, temps de transport…).
– Les élèves travaillent avec des données réelles dans des domaines variés (sécurité routière,
démographie, économie, agronomie…).
– Au moins un traitement statistique de fichier de données individuelles anonymes est proposé,
issu par exemple du web (OpenData…).
Situations algorithmiques
– À partir de deux listes représentant deux caractères d'individus, déterminer un sous-ensemble
d'individus répondant à un critère (filtre, utilisation des ET, OU, NON).
– Dresser le tableau croisé de deux variables catégorielles à partir du fichier des individus et
calculer des fréquences conditionnelles ou marginales.

Support numérique et fichiers associés


Python avec la bibliothèque pandas.
Fichiers : titanic.csv ; titanic.ipynb ; titanic.py.

Énoncé de l’activité
Le fichier « titanic.csv » comporte les données de 1 309 des 1 317 passagers du Titanic, paquebot
ayant fait naufrage en 1912 (source :www.kaggle.com).
En explorant les données à l’aide de la bibliothèque pandas de Python, il s’agit d’examiner les
chances qu’un passager ait survécu selon des critères de classe sociale, de genre ou d’âge.

Partie A :exploration du fichier de données


1. Implémenter en langage Python le programme suivant permettant la lecture et le stockage des
données dans la variable data (le fichier « titanic.csv » doit se trouver dans le même dossier que le
fichier Python ou le notebook).
Import matplotlib.pyplot as plt
import pandas
data = pandas.read_csv('titanic.csv', sep = ';')

7
Catégorie de ressource

2. Exécuter successivement les instructions suivantes et commenter les résultats :


data.head() puis data.shape et data.dtypes.
3. Quelles sont les valeurs que peut prendre la variable survie et la variable sexe ? Interpréter ces
valeurs.
4. Exécuter l’instruction data.describe().
En déduire l’âge moyen des passagers, le tarif moyen, ainsi que le tarif le plus élevé.
5. Commenter l’affichage obtenu en saisissant les instructions suivantes :
data.hist(column = 'tarif', bins = 20)
plt.show()

(Remarque : le paramètre «bins » est le paramètre associé au nombre de classes.)

Partie B : étude de la survie selon différents critères à l’aide de croisements de variables

1. Entrer l’instruction suivante :


data['survie'].mean()
Interpréter le résultat obtenu.
2. Il n’y avait pas suffisamment de places dans les canots de sauvetage du Titanic pour les 1 317
passagers et les 885 membres d’équipage. On souhaite examiner l’influence de la classe sociale des
passagers sur l’obtention d’une place sur un canot de sauvetage.
Entrer les instructions suivantes calculant les moyennes des variables selon le regroupement par
classe de cabines.
gr1 = data.groupby('classe').mean()
gr1
Interpréter les résultats affichés en termes de fréquences de survivants selon la classe de la cabine.
3. Déterminer la fréquence de survie selon le genre à l’aide d’un tableau croisé selon un groupement
gr2.
4. Quels renseignements sur les fréquences de survie le groupement suivant permet-il d’obtenir ?
gr3 = data.groupby(['classe', 'sexe']).mean()
5. La tradition maritime veut que l’on évacue « les femmes et les enfants d’abord ».
a. On a vu que certaines valeurs de la variable age n'étaient pas attribuées. Pour supprimer ces
valeurs, exécuter l'instruction suivante.
data = data.dropna() data.query('condition1
and condition2') renvoie
b. Pour extraire la sous-population des femmes et des enfants
une table de données extraite
des données, quelle requête doit-on faire :
de data selon les deux
gr4 = data.query('sexe == 2 and age < 18') conditions spécifiées.
ou data.query('condition1
gr4 = data.query('sexe == 2 or age < 18') ? or condition2') renvoie une
c.Déterminer alors la fréquence de survie parmi les femmes et table de données extraite de
les enfants du Titanic. data selon l’une ou l’autre des
conditions spécifiées.

8
Catégorie de ressource

Éléments de réponse
A. Exploration du fichier de données
2.

L’instruction data.head() montre les 5 premières lignes de la table data.

L’instruction data.shape donne les dimensions de la table de données : 1 309 lignes (individus) et 6
colonnes (6 variables).

L’instruction data.dtypes donne la liste des variables et leur type (entier, flottant ou « objet »).
3. La variable survie prend les valeurs 1 (survivant au naufrage), c’est le cas des deux premiers
passagers de la liste, ou 0 (décédé), c’est le cas des trois passagers suivants sur les 5 premiers de la
table de données. La variable sexe est codée 2 pour les femmes et 1 pour les hommes.
4.

9
Catégorie de ressource

L’instruction data.describe() donne une description statistique des 5 variables quantitatives. La


variable qualitative nom, au format « objet » n’est pas concernée : count correspond au nombre de
valeurs de chaque variable (1 309 individus, mais des âges non renseignés et un tarif manquant) ;
mean fournit la moyenne, std l’écart type (il s’agit en fait de l’estimation de l’écart type en considérant
qu’il s’agit d’un échantillon ; la différence avec l’écart type étant très peu sensible compte tenu du
nombre de données, il est inutile de l’évoquer en seconde), 50% la médiane.
Attention, ces résultats n’ont pas toujours de sens : pour le sexe, codé 1 ou 2, la moyenne n’a pas
grande signification (on peut cependant y retrouver indirectement la proportion d’hommes et de
femmes), pour les survivants (variable survie), codés 0 ou 1, on peut interpréter la moyenne comme
étant la fréquence de survie (38 %), mais ce n’est pas immédiat.
L’âge moyen des passagers était 29,9 ans. Le tarif moyen 33,36 £ et le tarif maximal 512 £.
5.

Il s’agit d’un histogramme (plus exactement un diagramme en barres compte tenu de la présence
d’une graduation sur l’axe des ordonnées) montrant la répartition des tarifs de la traversée. On
constate une grande dispersion, mais l’immense majorité des passagers a payé un tarif faible (moins
de 100 livres).
B. Étude de la survie selon différents critères à l’aide de croisements de variables
1.

C’est un résultat que fournissait déjà le descriptif global des données data.describe(). La variable
survie prenant les valeurs 0 ou 1, sa moyenne correspond à la fréquence d’occurrence de la valeur 1,
c’est-à-dire à la fréquence des survivants. Il y a environ 38 % des passagers du Titanic qui ont
survécu au naufrage.

10
Catégorie de ressource

2.

Il y a environ 62 % de survivants en première classe, 43 % en seconde classe et seulement 25,5 % de


survivants en troisième classe.
On constate par ailleurs que la moyenne d’âge a tendance à être plus élevée en première classe.
Quant au tarif moyen, la première classe se distingue nettement des deux autres.
Les moyennes de la colonne sexe sont difficilement interprétables.
3.

La fréquence de survie est d’environ 19 % pour les hommes et 73 % pour les femmes.
4.

On constate que le taux de survie monte à 96,5 % pour les femmes en première classe alors qu’il
n’est que de 49 % pour les femmes en troisième classe.

11
Catégorie de ressource

5. b.
Il faut utiliser « or » dans la requête car avec « and », on extrait des données les filles de moins de 18
ans et non les femmes et les enfants.

c. Environ 69 % des femmes et des enfants ont survécu au naufrage.

12
Catégorie de ressource

2. Inégalités de salaire en France

Éléments du programmede la classe de seconde générale et technologique.


Contenus
– Indicateurs de tendance centrale d’une série statistique : moyenne pondérée.
– Indicateurs de dispersion : écart interquartile, écart type.
Capacités attendues
– Décrire verbalement les différences entre deux séries statistiques, en s’appuyant sur des
indicateurs ou sur des représentations graphiques données.

Support numériqueet fichiers associés


Python avec les bibliothèques pandas et matplotlib.pyplot.
Fichiers : salaires_France.csv ;inegalites_salaires.ipynb ; inegalites_salaires.py.
Modalité possible de mise en œuvre
L’intérêt de l’utilisation de pandas est de pouvoir traiter aisément de nombreuses données.
Si les élèves ont déjà manipulé la bibliothèque pandas sur des fichiers csv, on peut envisager de
présenter ce type d’activité sous forme d’un « data challenge ». Après un travail collectif (la partie
A de l’activité par exemple), les élèves, en groupes, se saisissent des données. Les groupes
peuvent se répartir des objectifs différents correspondant, par exemple, aux inégalités territoriales,
aux inégalités de genre, aux inégalités socioprofessionnelles, ou encore en étudiant plus
précisément les données de leur département, avec un questionnement plus ou moins guidé. Une
restitution des travaux à l’oral peut faire l’objet d’une évaluation à laquelle est associé l’ensemble
de la classe.
Contexte
Les données sont issues de l’INSEE :
https://www.insee.fr/fr/statistiques/2021266#consulter
Elles concernent le salaire net horaire moyen selon la catégorie socioprofessionnelle, le sexe et
l’âge dans les communes d’au moins 2 000 habitants de France métropolitaine. On a adjoint aux
données celles de la population des communes correspondantes au moment de l’enquête (2014).
L’ensemble est rassemblé dans le fichier « salaires_France.csv ».
L’objectif de l’activité est d’étudier les inégalités de salaires en France du point de vue du territoire,
du genre et de la catégorie socio-professionnelle.

Énoncé de l’activité

Partie A :lecture et premier examen des données


1. Implémenter en Python le programme ci-dessous permettant de stocker les données du fichier
« salaires_France.csv » dans la table S.
(Le fichier « salaires_France.csv » doit se trouver dans le même dossier que le fichier Python.)
import pandas
La variable S est une table de
import matplotlib.pyplot as plt données dont chaque colonne
correspond à une variable
S = pandas.read_csv('salaires_France.csv')
statistique et chaque ligne à un
individu (ici une commune).
2. Entrer successivement les instructions suivantes et commenter les résultats :
S.shape S.dtypes S.head()

13
Catégorie de ressource

3. Voici un descriptif des 27 variables du fichier.


• dept numéro du département
• ville nom de la ville (ou commune)
• pop population de la ville
• moyen salaire net horaire moyen (en euros)
• cadres_sup salaire net horaire moyen des cadres supérieurs
• profs_inter salaire net horaire moyen des professions intermédiaires
• employes salaire net horaire moyen des employés
• ouvriers salaire net horaire moyen des ouvriers
• moyenF salaire net horaire moyen des femmes
• cadres_supF salaire net horaire moyen des femmes cadres supérieures
• profs_interF salaire net horaire moyen des femmes de profession intermédiaire
• employesF salaire net horaire moyen des femmes employées
• ouvriersF salaire net horaire moyen des femmes ouvrières
• moyenH salaire net horaire moyen des hommes
• cadres_supH salaire net horaire moyen des hommes cadres supérieurs
• profs_interH salaire net horaire moyen des hommes de profession intermédiaire
• employesH salaire net horaire moyen des hommes employés
• ouvriersH salaire net horaire moyen des hommes ouvriers
• moyen18 salaire net horaire moyen des personnes de 18 à 25 ans
• moyen26 salaire net horaire moyen des personnes de 26 à 50 ans
• moyen50 salaire net horaire moyen des personnes de plus de 50 ans
• moyenF18 salaire net horaire moyen des femmes de 18 à 25 ans
• moyenF26 salaire net horaire moyen des femmes de 26 à 50 ans
• moyenF50 salaire net horaire moyen des femmes de plus de 50 ans
• moyenH18 salaire net horaire moyen des hommes de 18 à 25 ans
• moyenH26 salaire net horaire moyen des hommes de 26 à 50 ans
• moyenH50 salaire net horaire moyen des hommes de plus de 50 ans

Examinons les données des villes du département de l’Ain (01), fournies dans les 5 premières lignes
de la table.
a. Quelle est la population d’Oyonnax ?
b. Quel est le salaire net horaire moyen à Ambérieux-en-Bugey ?
c. Quel est le salaire net horaire moyen d’une femme cadre supérieure à Prévessin-Moëns ?

Partie B :inégalités territoriales


1. Entrer l’instruction suivante et interpréter chacun des résultats affichés.
S['moyen'].describe()
2. Entrer les instructions suivantes permettant d’obtenir une représentation de la répartition des
salaires net horaires moyens selon les villes sous forme d’histogramme avec 20 classes. Analyser le
graphique obtenu.
S.hist(column = 'moyen', bins = 20)
plt.show()
3.a. Entrer l’instruction suivante permettant de connaître les 10 villes où le salaire net horaire moyen
est le plus élevé.
S.sort_values(by = 'moyen', ascending = False).head(10)
Dans quelles régions ces villes sont-elles situées ?

14
Catégorie de ressource

b. Déterminer de façon analogue, en changeant la valeur de l’argument ascending, les 10 villes où le


salaire net horaire moyen est le moins élevé.
4. On examine dans cette question les inégalités de salaires selon les départements de France
métropolitaine. Pour cela, nous allons déterminer le salaire moyen pondéré par la population de
chaque ville d’un département.
a. Ajouter une colonne à la table salaires à l’aide de l’instruction suivante.
S['prd_moyen_pop'] = S['moyen'] * S['pop']
À quoi correspond cette nouvelle colonne ?
b. Regrouper par département les données des variables dept, pop et prd_moyen_pop à l’aide de
l’instruction suivante :
D = S[['dept', 'pop', 'prd_moyen_pop']].groupby('dept').sum()
Interpréter le contenu de la table D en exécutant l’instruction suivante :
D.head()
c. Qu’effectue l’instruction suivante ? Exécuter cette instruction.
D['salaire_moyen'] = D['prd_moyen_pop'] / D['pop']
d. Étudier la distribution des salaires selon les départements (on pourra s’inspirer des questions 1., 2.
et 3.).

Partie C :inégalités de genre


1.a. À l’aide de la fonction describe, calculer les principaux indicateurs statistiques de la série des
salaires nets horaires moyens des femmes dans les différentes villes, puis celle des salaires moyens
des hommes.
b.Comparer le premier quartile du salaire moyen des hommes et le troisième quartile du salaire
moyen des femmes. Interpréter.
2. La fonction boxplot permet de représenter la médiane, max
les quartiles et les valeurs extrêmes sous forme d’un Dans un diagramme en
diagramme en boîte (voir encadré). boîte, les extrémités de
la boîte correspondent aux
quartiles (25 % et 75 %),
Ce type de graphique facilite la comparaison de deux la médiane (50 %) est à 75 %
séries statistiques. l’intérieur de la boîte et les 50 %
« moustaches »
correspondent ici au
minimum et au 25 %
maximum
Entrer les instructions suivantes puis commenter le min
graphique affiché.
S[['moyenF', 'moyenH']].boxplot(whis = 'range')
plt.show()
3. On étudie dans cette question la répartition des salaires des hommes et des femmes selon la
tranche d’âge et la catégorie socioprofessionnelle.
a. Représenter par des diagrammes en boîtes la répartition des salaires moyens dans les différentes
villes, pour les femmes et pour les hommes, selon les différentes tranches d’âges. Interpréter.
b. Représenter par des diagrammes en boîtes la répartition des salaires moyens dans les différentes
villes, pour les femmes et pour les hommes, selon les différentes catégories socioprofessionnelles.
Interpréter.

15
Catégorie de ressource

4. On étudie dans cette question les différences relatives, dans les différentes villes, des salaires
moyens entre les hommes et les femmes en pourcentage du salaire moyen.
a. Entrer l’instruction suivante. Que fait-elle ?
S['differenceHF%'] = ((S['moyenH'] - S['moyenF']) / S['moyen']) * 100
b. Calculer les principaux indicateurs statistiques de la série S['differenceHF%'].
Interpréter.
c. Représenter la série précédente sous forme d’un histogramme avec 20 classes.
Analyser le graphique.
d. Rechercher les 10 villes où la différence relative de salaire moyen entre les femmes et les hommes
est la plus importante, puis les 10 villes où elle est la moins importante.

Éléments de réponse
A. Lecture et premier examen des données
1.

2.

La table des données comporte 5 010 lignes (individus = communes) et 27 colonnes (variables
statistiques).

16
Catégorie de ressource

On obtient ici le nom des variables et leur type.

L’instruction S.head() fournit les 5 premières lignes de la table.


3.
a. La population d’Oyonnax est 22 559 habitants.
b. Le salaire net horaire moyen à Ambérieux-en-Bugey est 13,7 €.
c. Le salaire net horaire moyen d’une femme cadre supérieure à Prévessin-Moëns est 26,4 €
B. Inégalités territoriales
1. On obtient l’affichage suivant.

Il y a 5 010 villes étudiées.


Le salaire net horaire moyen dans une ville est de 13,72 € avec un écart type de 2,57 € entre les
différentes villes (il s’agit en fait de l’estimation de l’écart type en considérant qu’il s’agit d’un
échantillon ; compte tenu du nombre de données, la différence est faible et il est inutile de le signaler
en seconde).
Dans la ville où le salaire horaire moyen est minimal, il est de 10,2 €, dans celle où il est maximal, il
est de 43,3 €.
Un quart des villes ont un salaire moyen inférieur ou égal à 12,10 € de l’heure.
La moitié des villes ont un salaire moyen inférieur ou égal à 13 € de l’heure.

17
Catégorie de ressource

Les trois quarts des villes ont un salaire moyen inférieur ou égal à 14,50 € de l’heure.
2. On obtient le graphique suivant.

Le graphique est très asymétrique. On retrouve le fait que plus de 75 % des villes ont un salaire
moyen inférieur à 15 €. Il y a de fortes inégalités, avec quelques villes seulement avec des salaires
moyens supérieurs à 25 € de l’heure. Ces villes tirent la moyenne vers le haut, ce qui explique qu’elle
est supérieure à la médiane.
3. a. On obtient l’affichage suivant :

Ces villes sont situées dans deux départements, les Yvelines et les Hauts-de-Seine, de la région Île
de France.

18
Catégorie de ressource

b.

Il s’agit de villes dans un environnement plus rural.


4. a. La nouvelle colonne correspond, pour chaque ville, au produit du salaire moyen par la
population.
b.

Pour chaque département, on a la somme des populations de chaque ville (c’est-à-dire la population
totale du département), et la somme des produits du salaire moyen par la population de chaque ville.

19
Catégorie de ressource

c.

Cette instruction ajoute une colonne correspondant au salaire moyen pondéré de chaque
département, obtenu en divisant par la population totale du département la somme des produits du
salaire moyen de chaque ville par sa population.
d.

20
Catégorie de ressource

Les 10 départements où le salaire net horaire moyen est le plus élevé :

Les 10 départements où le salaire net horaire moyen est le moins élevé :

C. Inégalités de genre
1. a. La requête S['moyenF'].describe() fournit les résultats suivants :

21
Catégorie de ressource

La requête S['moyenH'].describe() fournit les résultats suivants :

b. Le premier quartile du salaire des hommes est supérieur au troisième quartile du salaire des
femmes. Ainsi, dans 75 % des villes, les hommes gagnent plus de 12,9 € par heure et dans 75 % des
villes (pas nécessairement les mêmes), les femmes gagnent moins de 12,67 € de l’heure.
2. On obtient le graphique suivant.

On observe que la « boîte » des salaires moyens féminins est en-dessous de la « boîte » des salaires
moyens masculins, ce qui est une façon de voir que le troisième quartile des femmes est inférieur au
premier quartile des hommes. La dispersion des salaires masculins est aussi plus grande que celle
des salaires féminins (écart interquartile, c’est-à-dire hauteur de la boîte, plus grand ; étendue, les
valeurs extrêmes sont à l’extrémité des « moustaches), plus grande).
3. a.

Les salaires des hommes de 18 à 25 ans peuvent être très élevés, ce n’est pas le cas des femmes de
cette tranche d’âge.

22
Catégorie de ressource

Les écarts de salaires entre les femmes et les hommes ont tendance à augmenter avec la tranche
d’âge (les boîtes se décalent de plus en plus).
b. La requête :
S[['cadres_supF', 'cadres_supH', 'profs_interF', 'profs_interH', 'employesF', 'employesH', 'ouvriersF',
'ouvriersH']].boxplot(whis = 'range', figsize = (15, 6))
permet l’affichage suivant.

Les écarts de salaire entre les femmes et les hommes les plus importants se trouvent dans la
catégorie socioprofessionnelle des cadres supérieurs. On constate par ailleurs que dans certaines
villes, les hommes exerçant des professions intermédiaires sont très fortement rémunérés.
4. a.

Cette instruction ajoute une colonne où est calculée la différence de salaire relative entre les hommes
et les femmes en pourcentage du salaire moyen.
b.

23
Catégorie de ressource

En moyenne, dans une ville, le salaire moyen des hommes est supérieur à celui des femmes de
19,8 % (du salaire moyen dans la ville).
Le salaire moyen des hommes est supérieur à celui des femmes dans toutes les villes. L’écart le plus
faible est de 0,7 %. L’écart le plus important est de 69,4 % !
c.

On observe une distribution relativement symétrique autour de la valeur 19 %.


d.

24
Catégorie de ressource

3. Sécurité routière

Éléments du programme de la classe de première voie technologique.


Contenus
– Proportion et pourcentage (automatismes).
– Croisement de variables catégorielles.
– Tableau croisé d’effectifs.
– Fréquence conditionnelle, fréquence marginale.
Commentaires
– L’étude des fréquences conditionnelles permet un travail sur la langue française en considérant
les formulations usuellement utilisées dans les médias.
– Des variables catégorielles de natures diverses sont étudiées : nominale (profession, espèce,
département de résidence…), ordinale (niveau d’étude, degré de satisfaction de la clientèle…) ou
définies par des intervalles (classe d’âge, temps de transport…).
– Les élèves travaillent avec des données réelles dans des domaines variés (sécurité routière,
démographie, économie, agronomie…).
– Au moins un traitement statistique de fichier de données individuelles anonymes est proposé,
issu par exemple du web (OpenData…).
Situations algorithmiques
– À partir de deux listes représentant deux caractères d'individus, déterminer un sous-ensemble
d'individus répondant à un critère (filtre, utilisation des ET, OU, NON).
– Dresser le tableau croisé de deux variables catégorielles à partir du fichier des individus et
calculer des fréquences conditionnelles ou marginales.

Support numérique et fichiers associés


Python avec les bibliothèques pandas et pyplot.
Fichiers : usagers-2017.csv ;securite_routiere.ipynb ; securite_routiere.py.

Énoncé de l’activité
Le site data.gouv.fr met à disposition le fichier « usagers-2017.csv ».
Chaque ligne de ce fichier est associée à un usager de la route impliqué dans un accident survenu en
2017.

Partie A :lecture des données


1. Le fichier de données peut être traité en langage Python en utilisant le module pandas.Pour cela,
exécuter les instructions suivantes :
import pandas
T = pandas.read_csv('usagers-2017.csv')
Remarque : T est la table de données associée au fichier csv.

2. Afficher les 5 premières lignes de la table T en exécutant l’instruction :


T.head()
3. Exécuter successivement les instructions suivantes et commenter les résultats :
T.shapepuisT.dtypes.

25
Catégorie de ressource

Partie B :proportion et requête


Dans la suite, on s’intéresse aux trois variables suivantes :
– la variable « catu » correspond à la catégorie de l’usager ; elle prend les valeurs 1 (conducteur), 2
(passager), 3 (piéton) ou 4 (piéton avec roulettes) ;
– la variable « grav » correspond à la gravité de l’accident ; elle prend les valeurs 1 (indemne), 2 (tué),
3 (blessé hospitalisé) ou 4 (blessé léger) ;
– la variable « sexe » correspond au genre et prend les valeurs 1 (masculin) ou 2 (féminin).
Sur le site : http ://www.securite-routiere.gouv.fr/medias/les-chiffres-de-la-route/les-hommes-et-les-
femmes-sur-la-route, on trouve l’infographie suivante, selon laquelle 75 % des morts sur la route sont
des hommes.

Essayons de retrouver la proportion des hommes parmi les morts sur la route en 2017.
1. Exécuter l’instruction suivante :
T.query('grav == 2 and sexe == 1')
Compléter : « Cette requête appliquée à la table Trenvoie les lignes de Toù la colonne gravne contient
que des ………. et la colonne sexene contient que des ………. ».
2. Exécuter l’instruction suivante et interpréter le résultat :
len(T.query('grav == 2 and sexe == 1'))
3. La proportion de 75 % fournie par le site de sécurité routière est-elle exacte ?
Indication :on pourra utiliser les commandes len et query.

26
Catégorie de ressource

Partie C :croisement de deux variables


On étudie le croisement des variables « catu » (catégorie d’usager) et « grav » (gravité de l’accident).
1. Exécuter l’instruction suivante :
TC = pandas.crosstab(T['catu'], T['grav'], margins = True)
Compléter le tableau croisé suivant en affichant le tableau TC.
grav
1 2 3 4 Total
catu
1
2
3
4
Total

2. Exécuter la commande TC[1] / TC['All'] et interpréter le résultat obtenu.


3. Comparer la fréquence conditionnelle des tués parmi les piétons impliqués dans un accident et
celle des tués parmi les conducteurs.

Éléments de réponse
A. Lecture des données
2.

3.

La table compte 136 021 lignes (individus) et 12 colonnes (variables).

27
Catégorie de ressource

Cette instruction fournit le nom des variables et leur type.


B. Proportion et requête
1. « Cette requête appliquée à la table T renvoie les lignes de T où la colonne grav ne contient que
des 2 et la colonne sexe ne contient que des 1 ».
2.

Il y a 2 801 hommes morts sur les routes.


3.

Il serait plus exact de dire que 78 % ou 77,8 % des tués sur la route sont des hommes.
C. Croisement de deux variables

28
Catégorie de ressource

2.

La commande TC[1] / TC['All'] fournit les fréquences conditionnelles des individus indemnes selon les
catégories d’usagers (environ 48 % pour les conducteurs et 2 % pour les piétons).
3. Pour comparer la fréquence conditionnelle des tués parmi les piétons impliqués dans un accident et
celle des tués parmi les conducteurs, on peut exécuter la commande :
TC[2] / TC['All'].

La fréquence conditionnelle des tués parmi les piétons est environ 4,5 % et celle des tués parmi les
conducteurs environ 2,5 %.

29
Catégorie de ressource

4. Data journalisme : suspicion de fraude dans le monde du tennis

Éléments du programme de la classe de première voie générale


Contenus
Variable aléatoire réelle : modélisation du résultat numérique d’une expérience aléatoire.
Capacités attendues
– Modéliser une situation à l’aide d’une variable aléatoire.
– Générer une liste (en extension, par ajouts successifs ou en compréhension).
– Parcourir une liste.
Expérimentations
– Simuler une variable aléatoire avec Python.
– Lire, comprendre et écrire une fonction Python renvoyant la moyenne d’un échantillon de taille n
d’une variable aléatoire.
– Générer une liste (en extension, par ajouts successifs ou en compréhension), parcourir une
liste, itérer sur les éléments d’une liste.
Évaluation des élèves
Travaux pratiques pouvant s’appuyer sur des logiciels.

Support numérique et fichiers associés


Python avec la bibliothèque pandas.
Fichiers : tennis.csv ; tennis.ipynb ; tennis.py.
Mise en œuvre
Cette activité est mise en œuvre après une initiation à l’utilisation de la bibliothèque pandas.

Énoncé de l’activité
Le « data journalist » (journaliste de données en français) exploite et analyse des données
statistiques. John Templon est un data journalist qui a étudié les suspicions de fraudes parmi les
joueurs de tennis de niveau mondial.Il a téléchargé, depuis un site de paris en ligne regroupant
plusieurs bookmakers, les cotes concernant25 993 matchs entre 2009 et 2015 et 1 523 joueurs.
John Templon traita ces données statistiques avec python et la librairie pandas. Son travail, relayé
notamment par le journal Le Monde, illustre de nouvelles pratiques d’investigation, mêlant journalisme
et analyse scientifique de données de masse.
Rôle d’un bookmaker pour un match donné :
Avant le match, le bookmaker évalue la probabilité de gagner de chacun des deux joueurs. C’est la
probabilité de gagner « au départ ».
Après publication en ligne de ces probabilités de départ, les internautes peuvent continuer à miser sur
les deux joueurs jusqu’à la clôture des paris, qui se produit avant la fin du match.
Lors de la clôture des paris, on obtient les probabilités de gagner « de fin ». Elles tiennent compte des
mises finales effectuées par les parieurs en ligne. Ainsi l’évolution de la probabilité de gagner d’un
joueur renseigne sur le comportement de ce joueur pendant une bonne partie du match.
Les objectifs de cette activité sont :
– de déterminer les matchs où les joueurs ont pu jouer sensiblement moins bien qu’attendu (ces
matchs et ces joueurs seront dits « suspects ») ;
– d’estimer par simulation, la vraisemblance qu’un joueur suspect reproduise au moins la même
contre-performance.

30
Catégorie de ressource

Partie A :Table des paris


Le fichier « tennis.csv » contient les données simplifiées du fichier de John Templon. Cette base de
données peut être lue avec Python en utilisant le module pandas.
1. Exécuter les instructions suivantes permettant d’observer les premières lignes de la table des
données.
T = pandas.read_csv('tennis.csv')
T.head()

Comme on peut le voir, plusieurs paris peuvent être associés à un même match.
Informations :
–T est une « table de données » liée au fichier « tennis.csv ».
– Principales variables :
id : identifiant d’un pari proposé par un bookmaker ;
P_gagnant_début : probabilité de gagner pour le gagnant du match, fournie par le
bookmaker au début des paris ;
P_gagnant_fin : probabilité de gagner pour le gagnant du match, à la clôture des
paris (évolution selon les paris effectués durant le match) ;
gagnant : nom du joueur qui a gagné le match ;
perdant : nom du joueur qui a perdu le match.
– T.head() permet l’affichage des 5 premières lignes de la table T.
– len(T) donne le nombre de lignes de la table T.
2. Pour le pari 1 du match M1, quelle était la probabilité de gagner du joueur J2 au début des paris ?
Et à la fin des paris ?
3. Même question pour le joueur J1.
4. Quel est le nombre de paris étudiés dans la table T ?

Partie B : Quels sont les matchs suspects ?

1.Variation de la probabilité de gagner au cours de chaque match

On veut ajouter à la table T la colonne nommée var_gagnant. Elle contient la variation entre
P_gagnant_début et P_gagnant_fin pour chaque match.

a)Compléter alors les pointillés :

T['var_gagnant'] = T['P_gagnant_fin']-T['................']
T.head()

31
Catégorie de ressource

b) Pour le pari 5 du match M2, quelle a été la variation de la probabilité de gagner du joueur J3 ?

2.Sélection des matchs suspects :

Principe : selon les professionnels, un match est considéré suspect lorsque var_gagnant est supérieur
ou égal à 0,1 en valeur absolue.

a) D’après les premières lignes de la table T, le match M1 est-il suspect ?

b) Compléter la requête qui, appliquée à T, permet d’obtenir la table PMS des paris associés aux
matchs suspects :

PMS = T.query('var_gagnant>= .... or var_gagnant<= ....')

Rappels sur query


La colonne année contient seulement des nombres (ici type int) :
T.query('année == 2009')
Sélectionne les lignes de T liées à l’année 2009.
La colonne perdant contient seulement des chaînes de caractères (string) :
T.query('perdant == "J1"')
Sélectionne les lignes de T liées aux « matchs perdus » par J1.
On peut relier 2 conditions entre elles avec les conjonctions : « and » et « or ».

c) On ne retient qu’un seul pari par match suspect. Pour obtenir cette table MS, exécuter :

MS = PMS.drop_duplicates(subset = 'match')
MS.head()

d) Quel est le nombre de matchs suspects ?

Partie C : Joueur suspect

Définition : Lors d’un match suspect, le joueur dit « suspect » est celui dont la probabilité de gagner a
diminué de plus de 0,1.

Remarque :Un joueur suspect peut recevoir de l’argent avant le match pour moins bien jouer, par
exemple pendant un set. Ceux qui l’ont corrompu sauront parier à leur avantage durant ce set.

1.En utilisant la table MS


a) justifier que, pour le match M64, le joueur J68 est suspect ;

32
Catégorie de ressource

b) citer les joueurs suspects pour les matchs M66, M130, M171 et M176.

2. Lors d’un match suspect, lorsque var_gagnant est positif, quel est le joueur suspect, le gagnant
ou le perdant ? Même question lorsque var_gagnant est négatif.

Partie D : Cas du joueur J1

On cherche à déterminer si, oui ou non, on peut suspecter le joueur J1.

1. a)Exécuter l’instruction suivante :

MPS_J1 = MS.query('perdant == "J1" and var_gagnant > 0')


MPS_J1

Compléter : « la table MPS_J1 contient les matchs …….par le joueur …… et pour lesquels il
est ……..».

b) En déduire le nombre np de matchs perdus lorsque J1 est suspect.

c) Le match M2815 est perdu par J1. Quelle était sa probabilité de perdre au début de ce match ?

d) LorsqueJ1 est suspect, créer puis afficher la liste LP à l’aide de l’instruction :


LP = list(MPS_J1['P_gagnant_début'])

Compléter les pointillés : « la liste LP contient, lorsque J1 est suspect, les probabilités qu’a le joueur
J1 de ……………… au début de chacun des matchs perdus ».

2.a) Créer la table MGS_J1, présentée ci-dessous, associée aux matchs gagnés par le joueur J1
lorsqu’il est suspect.

b) En déduire le nombre ng de matchs gagnés lorsque J1 est suspect.

c) Le match M3356 est gagné par J1.

Quelle était sa probabilité de perdre au début de ce match ?

d) Lorsque J1 est suspect, compléter les pointillés pour construire la liste LG des probabilités de
perdre au début de chacun des matchs gagnés.

33
Catégorie de ressource

LG = []
for p in MGS_J1['P_gagnant_début']:
LG.append(........)
LG

On obtient la liste suivante.

[0.375634517766, 0.615384615385, 0.505319148936]

3.Calculer le nombre N de matchs joués par J1 lorsqu’il est suspect.

4. Créer alors la liste L des probabilités de perdre au début de chacun des matchs joués.

5. À l’aide de simulations, nous allons mesurer la vraisemblance des performances du joueur J1.

a) Charger la fonction random du module random.

b) On simule 100 000 séries des 18 matchs joués par le joueur J1selon les probabilités de la liste L.

Compléter les instructions de l’algorithme ci-dessous pour qu’il fournisse la fréquence f des
simulations pour lesquelles au moins 15 des 18 matchs sont perdus.

c = 0
for i in range(100000):
perdus = 0
for j in range(....):
if random() <= L[j]:
perdus = perdus + 1
if perdus >= 15:
c = c + 1
f = ........
f

Exécuter ensuite cet algorithme.

c) Après exécution, on obtient, par exemple, f = 0.00249.Que peut-on penser concernant le


joueur J1

34
Catégorie de ressource

Partie E :Bonus – Généralisation à l’ensemble des joueurs suspects

1. On propose la fonction nommée perdus de paramètre joueur, une chaîne de caractères qui
désignera le nom d’un joueur. Préciser le rôle de cette fonction.

def perdus(joueur) :
MPS_J = MS.query('perdant == @joueur and var_gagnant >0')
return list(MPS_J['P_gagnant_début'])

Information : la notation @joueur permet à la variable joueur d’être évaluée à l’intérieur de la


chaîne de caractères de la requête query.

Vérifier votre réponse pour le joueur J1.

2. Ecrire une fonction nommée gagnés de paramètre joueur (le nom d’un joueur suspect) qui
renvoie la liste LG des probabilités de perdre au début de chacun des matchs gagnés par joueur.
Vérifier votre réponse pour le joueur J1.

3. Écrire une fonction nommée vraisemblance de paramètre joueur (le nom d’un joueur suspect)
qui :

– calcule les nombres N des matchs joués par joueur et n des matchs perdus par joueur ;

– simule 100 000 séries de N matchs joués par joueur et calcule la fréquence des cas amenant à
perdre au moins n matchs sur les N joués.

Vérifier votre réponse pour le joueur J1.

4. a) Dans l’algorithme ci-dessous, dire ce que représente LJS.

Relevés = list(MS['perdant']) + list(MS['gagnant'])


L = []
for joueur in Relevés:
if joueur not in L:
L.append(joueur)
LJS = [joueur for joueur in L if Relevés.count(joueur) >= 10]

b) Créer la liste des joueurs suspectés dans plus de 10 matchs et pour lesquels la fonction
vraisemblance donne un résultat inférieur à 5 %.

c) Préciser le nombre de personnes pour lesquelles la vraisemblance est inférieure à 5 %.Quelle part
cela représente-t-il par rapport aux 1 523 joueurs mondiaux ?

35
Catégorie de ressource

Éléments de réponse
Partie A : Table des paris
1.

2. Le joueur J2 est gagnant. Sa probabilité de gagner au début des paris est 0,56 et à la fin des paris,
environ 0,54.
3. Le joueur J1 est perdant. Sa probabilité de gagner au début des paris est 1 – 0,56 = 0,44 et sa
probabilité de gagner à la fin des paris est environ 0,47.
4.

Il y a 126 461 paris étudiés.


Partie B : Quels sont les matchs suspects ?
1. a)

b) Pour le pari 5 du match M2, l’évolution de la probabilité de gagner du joueur J3 est une
augmentation d’environ 0,012.
2. a) Dans les premières lignes de la table T, les variations de la probabilité de gagner du gagnant du
match M1 est inférieure, en valeur absolue, à 0,1. Le match M1 n’est pas suspect.
b)

36
Catégorie de ressource

c)

d)

Partie C :Joueur suspect


1. a) Pour le match M64, le joueur J68 est gagnant et a vu sa probabilité de gagner diminuer de plus
de 0,1 (0,12 environ).
b) Pour M66 le joueur suspect est J70, pour M130 le joueur suspect est J93, pour M171 le joueur
suspect est J103 et pour le match M176 le joueur suspect est J10.
2. Lors d’un match suspect, si var_gagnant est positif, c’est la probabilité de gagner du perdant qui a
baissé de plus de 0,1. C’est donc le perdant qui est suspect.
Si var_gagnant est négatif pour un match suspect, c’est le gagnant qui est suspect.
Partie D :Cas du joueur J1 :
1. a) « la table MPS_J1 contient les matchs perdus par le joueur J1 et pour lesquels il est suspect ».
b) Nombre de « matchs perdus » par J1 :

c) Probabilité de perdre de J1 :
J1 a perdu le match, donc sa probabilité de gagner au début est 1 – P_gagnant_début.
Donc sa probabilité de perdre est 0,463807.
d)

37
Catégorie de ressource

« La liste LP contient, lorsque J1 est suspect, les probabilités qu’a le joueur J1 de perdre au début de
chacun des matchs perdus ».
2. a) Table des matchs gagnés par le suspect J1 :

b) Nombre ng de « matchs gagnés » par le suspect J1 :

c) La probabilité de perdre le match gagné M3356 est :


1 – P_gagnant_début = 1 – 0,624365 = 0,375635.
d) Liste LG des probabilités de perdre au début de chacun des matchs gagnés par J1 :

3. Nombre N de matchs joués par J1 lorsqu’il est suspect.

4. Liste L des probabilités de perdre au début de chacun des matchs joués par J1 :

38
Catégorie de ressource

5. a)

b) 100 000simulations des 18 matchs joués par J1 :

c) La fréquence observée f est très faible. Il est vraiment peu probable que J1 réalise une telle contre-
performance.
On peut suspecter que J1 est impliqué dans d’éventuelles tricheries.

Partie E : Bonus – Généralisation à l’ensemble des joueurs suspects


1. La fonction perdus a pour paramètre joueur.
Elle crée la table des matchs perdus par le joueur dans le cas où il est suspect.
Cette fonction renvoie la liste LP des probabilités de perdre au début de chacun des
matchs perdus par le joueur.

39
Catégorie de ressource

2. Fonction gagnés :

3. a) Fonction nb_joués :

b) Fonction vraisemblance :

4. a) Relevés est la liste des noms des joueurs cités à chaque dans un match suspect.
LJS est la liste des noms des joueurs suspectés dans plus de 10 matchs.

40
Catégorie de ressource

b) Liste des joueurs ayant une vraisemblance inférieure à 5% et jouant au moins10 matchs :

c) Nombre de « potentiels tricheurs » :

Proportion de « potentiels tricheurs » parmi les joueurs mondiaux :

soit environ 1,4 %.

41
Catégorie de ressource

5. Galton, Pearson et régression en Python

Éléments du programme de la classe de terminale voie technologique


Contenus
– Nuage de points associé à une série statistique à deux variables quantitatives.
– Ajustement affine.
Capacités attendues
– Représenter un nuage de points.
– Déterminer et utiliser un ajustement affine pour interpoler ou extrapoler des valeurs inconnues.
Commentaires
–Les situations ou contextes réels, en lien notamment avec les enseignements de spécialité, sont
privilégiés : données issues des domaines de la santé, de l’économie, de la gestion, des sciences
sociales… ; mesures expérimentales de grandeurs liées par une relation linéaire en physique-
chimie (intensité et tension ; droite d’étalonnage d’une concentration…), en biotechnologies ou en
sciences de l’ingénieur dans tous les domaines (industriels, génie civil…).
– Les élèves sont entraînés à exercer leur esprit critique sur la pertinence, au regard des données
et de la situation étudiée, d’une modélisation par ajustement affine et sur les limites des
extrapolations faites dans ce cadre.

Éléments du programme de la classe de terminale option « mathématiques


complémentaires » voie générale
Contenus
– Nuage de points. Point moyen.
– Ajustement affine. Droite des moindres carrés. Coefficient de corrélation.
– Ajustement se ramenant par changement de variable à un ajustement affine.
– Application des ajustements à des interpolations ou extrapolations.
Capacités attendues
– Représenter un nuage de points.
– Calculer les coordonnées d’un point moyen.
– Déterminer une droite de régression, à l’aide de la calculatrice, d’un logiciel ou par calcul.
– Dans le cadre d’une résolution de problème, utiliser un ajustement pour interpoler, extrapoler.

Support numérique et fichiers associés


Python avec la bibliothèque pandas.
Fichiers : Galton.csv ; Galton.py ; Galton_Pearson_regression.ipynb ;
Galton_Pearson_regression.py.
Mise en œuvre
Cette activité est mise en œuvre après une initiation à l’utilisation de la bibliothèque pandas.

42
Catégorie de ressource

Énoncé de l’activité
Francis Galton (1822-1911) a introduit le mot « régression » dans le cadre d'un ajustement affine de la
taille des enfants selon celle de leurs parents. Galton montre que la taille des enfants nés de parents
inhabituellement grands ou petits se rapproche de la taille moyenne de la population : il y a
« régression » vers la moyenne. Le fichier « Galton.csv » correspond aux données utilisées par
Galton. Les mesures sont en inch (1 inch vaut 2,54 cm).

1. Exécuter les instructions suivantes (le fichier Galton.csv doit se trouver dans le même répertoire
que le programme en Python) et observer les premières lignes du fichier.
import pandas
G = pandas.read_csv('Galton.csv')
G.head()
2. Combien a-t-on de données ? Déterminer la moyenne et l'écart type des tailles du père, de la mère
et de l'enfant. (On pourra utiliser les fonctions suivantes appliquées à la table G :
G.shape et G.describe().)
3. Exécuter les instructions suivantes :
G['Parent_moyen'] = (G['Pere'] + G['Mere']) / 2
G.head(10)
À quoi correspond la variable Parent_moyen ?
4. Effectuer un ajustement affine de la taille de l'enfant selon la taille moyenne des parents en
exécutant les instructions suivantes.
from scipy.stats import linregress
ajust = linregress(G['Parent_moyen'], G['Enfant'])
a = ajust[0]
b = ajust[1]
print(a,b)
Donner une équation de la droite d’ajustement obtenue (arrondir les coefficients à 10– 2).
5. Représenter l’ajustement réalisé à l’aide des instructions suivantes (sur un notebook la dernière
instruction est inutile).
import matplotlib.pyplot as plt
import numpy as np
plt.scatter(G['Parent_moyen'], G['Enfant'])
x = np.array(G['Parent_moyen'])
plt.plot(x, a * x + b, 'r')
plt.plot(x, x, 'g')
plt.show()
6. Quelle est la taille de l'enfant prédite par le modèle lorsque la taille moyenne des parents est 75
inches (inhabituellement grande) ? Et lorsque la taille moyenne des parents est 60 inches
(inhabituellement petite) ? La « loi » défendue par Galton est-elle vérifiée selon ce modèle ?
7. Pour quelle valeur de la taille moyenne des parents, le modèle prévoit-il la même taille pour
l'enfant ?
8. Karl Pearson (1857-1936) fit une étude sur un échantillon plus grand vers 1903. Les données des
tailles pères/fils figurent dans le fichier Pearson.csv. Effectuer un ajustement affine de ces données.
Les résultats de Galton sont-ils confirmés ?

43
Catégorie de ressource

POINT HISTOIRE
Francis Galton (1822-1911), scientifique anglais, est considéré comme le fondateur de l’eugénisme
(science visant à améliorer l’espèce humaine). C’est dans ce cadre qu’il s’est intéressé aux lois de
l’hérédité. Il décrit le phénomène de régression vers la moyenne, qu’il nomme « régression vers la
médiocrité » dans l’article Regression towards mediocrity in hereditary stature publié en 1886 (une
édition est accessible sur Internet) dont est extraite l’illustration suivante.

Il est difficile, aux vues des exactions commises par la suite dans l'Allemagne nazie, d'imaginer
comment, à l'époque, les idées eugénistes de Galton étaient perçues. Ses ouvrages furent en effet
vus, à l’époque, comme progressistes et participant au combat de la science contre l'obscurantisme.

44
Catégorie de ressource

Éléments de réponse
1. On obtient ci-dessous les 5 premières lignes de la table G.

2. On exécute les instructions suivantes.

Il y a 197 lignes, c’est-à-dire 197 familles constituées du père, de la mère et d’un enfant.
3. On exécute les instructions demandées qui aboutissent à la création d’une nouvelle colonne (ou
variable) dans la table G.

45
Catégorie de ressource

La variable Parent_moyen correspond à la taille moyenne des deux parents.


4. L’ajustement du nuage de points (selon la méthode des moindres carrés) s’effectue de la façon
suivante.

La droite d’ajustement obtenue a pour équation (en arrondissant les coefficients à 0,01) :
y = 0,57 x + 31,8.
5. Réalisation du graphique :

46
Catégorie de ressource

6. Pour x = 75, le modèle donne y ≈ 74,6 et pour x = 60, le modèle donne y ≈ 66.

La « régression », au sens de Galton, est importante pour les (très) petites tailles, l’enfant a tendance
à être plus grand (on passe de 60 à 66). En revanche, c’est moins évident, pour cet ensemble de
données, pour les grandes tailles où l’enfant a tendance à être un peu plus petit (on passe de 75 à
74,6).
b
7. On résout l’équation en x, ax + b = x. Ce qui donne x = .
1− a

On obtient x ≈ 74. Graphiquement, cela correspond à l’abscisse du point d’intersection entre les
droites rouge (d’ajustement) et verte (d’équation y = x).
8. On procède de façon analogue, en créant la table P avec les données de Pearson.

47
Catégorie de ressource

L’instruction P.shape montre qu’il y a 1078 couples de données.


La droite d’ajustement de la taille du fils en fonction de la taille du père a pour équation (en
arrondissant les coefficients à 0,01) : y = 0,51x + 33,89.

On constate un phénomène de régression, au sens de Galton, plus net : la droite d’ajustement (en
rouge) est au-dessus de la droite d’équation y = x (en vert) pour les petites valeurs de x (fils plus
grand que le père petit) et en-dessous pour les grandes valeurs de x (fils plus petit que le père grand).

48
Catégorie de ressource

6. Mélanomes aux USA 1950-1959

Éléments du programme de la classe de terminale voie technologique


Contenus
– Nuage de points associé à une série statistique à deux variables quantitatives.
– Ajustement affine.
Capacités attendues
– Représenter un nuage de points.
– Déterminer et utiliser un ajustement affine pour interpoler ou extrapoler des valeurs inconnues.
Commentaires
–Les situations ou contextes réels, en lien notamment avec les enseignements de spécialité, sont
privilégiés : données issues des domaines de la santé, de l’économie, de la gestion, des sciences
sociales… ; mesures expérimentales de grandeurs liées par une relation linéaire en physique-
chimie (intensité et tension ; droite d’étalonnage d’une concentration…), en biotechnologies ou en
sciences de l’ingénieur dans tous les domaines (industriels, génie civil…).
– Les élèves sont entraînés à exercer leur esprit critique sur la pertinence, au regard des données
et de la situation étudiée, d’une modélisation par ajustement affine et sur les limites des
extrapolations faites dans ce cadre.

Éléments du programme de la classe de terminale option « mathématiques


complémentaires » voie générale
Contenus
– Nuage de points. Point moyen.
– Ajustement affine. Droite des moindres carrés. Coefficient de corrélation.
– Ajustement se ramenant par changement de variable à un ajustement affine.
– Application des ajustements à des interpolations ou extrapolations.
Capacités attendues
– Représenter un nuage de points.
– Calculer les coordonnées d’un point moyen.
– Déterminer une droite de régression, à l’aide de la calculatrice, d’un logiciel ou par calcul.
– Dans le cadre d’une résolution de problème, utiliser un ajustement pour interpoler, extrapoler.

Support numérique et fichiers associés


Python avec la bibliothèque pandas.
Fichiers : skincancer.txt ; Melanomes_USA.ipynb ; Melanomes_USA.py.
Mise en œuvre
Cette activité est mise en œuvre après une initiation à l’utilisation de la bibliothèque pandas.

49
Catégorie de ressource

Énoncé de l’activité
Entre 1950 et 1959, on a relevé le taux de mortalité (nombre de décès pour 10 millions d’habitants)
des hommes blancs dû à un mélanome malin de la peau entre 1950 et 1959 dans chaque état des
USA. L’objectif est d’étudier le lien entre le taux de mortalité, la latitude de l’Etat ainsi que la présence
éventuelle d’une côte maritime.
1. Exécuter les instructions suivantes (le fichier texte skincancer.txt doit se trouver dans le même
répertoire que le programme en Python) et observer les premières lignes du fichier.
import pandas
T = pandas.read_csv('skincancer.txt',delim_whitespace=True)
T.head()
2. Effectuer un ajustement affine du taux de mortalité selon la latitude de l’Etat en exécutant les
instructions suivantes.
from scipy.stats import linregress
ajust = linregress(T['Lat'], T['Taux'])
a = ajust[0]
b = ajust[1]
print(a,b)
Donner une équation de la droite d’ajustement obtenue (arrondir les coefficients à 10– 2).
3. Représenter l’ajustement réalisé à l’aide des instructions suivantes (sur un notebook la dernière
instruction est inutile).
import matplotlib.pyplot as plt
import numpy as np
plt.scatter(T['Lat'], T['Taux'])
x = np.array(T['Taux'])
plt.plot(x, a * x + b, 'r')
plt.show()
4. a. Interpréter le graphique obtenu.
b. Quel taux de mortalité, pour 10 millions d’habitants, le modèle prévoit-il pour une latitude de 20°N ?
Et 50°N ?
5. La variable Ocean prend la valeur 1 si l'Etat est bordé par l'océan et la valeur 0 sinon. Donner les
principaux indicateurs statistiques correspondants aux sous-ensembles de données obtenus selon
que la variable Ocean vaut 0 ou 1. Comparer les taux de mortalité moyens pour les deux sous-
ensembles.
(Pour constituer les deux sous-ensembles de données, on peut utiliser les instructions :
OC = T.query('Ocean == 1') et NO = T.query('Ocean == 0').
6. Effectuer, pour chacun des deux sous-ensembles, l’ajustement affine du taux de mortalité selon la
latitude.
7. Quel taux de mortalité, pour 10 millions d’habitants, les modèles prévoient-il pour une latitude de
20°N, selon que l’Etat est, ou non, bordé par l’océan ?

50
Catégorie de ressource

Éléments de réponse
1. On obtient l’affichage suivant.

2. Calcul de la droite d’ajustement du taux de mortalité selon la latitude.

Equation de la droite d’ajustement : y = – 5,98 x + 389,19.


3. Représentation du nuage de points et de la droite d’ajustement :

4. a. Le nuage de points est de forme allongée et l’ajustement affine est justifié. Plus la latitude est
élevée (plus on s’éloigne de l’équateur), plus le taux de mortalité a tendance à diminuer.
b. Prévisions du modèle :

51
Catégorie de ressource

Pour une latitude de 20°N, le modèle prévoit un taux de mortalité de 270 morts pour 10 millions
d’habitants. Pour une latitude de 50°N, le modèle prévoit un taux de mortalité de 90 morts pour 10
millions d’habitants.
5. Indicateurs statistiques selon que l’Etat est, ou non, bordé par l’océan :

Le taux de mortalité moyen est supérieur lorsque l’Etat est bordé par l’océan (170 morts pour 10
millions d’habitants contre 139).
6. Ajustements affines selon que l’Etat est, ou non, bordé par l’océan :

52
Catégorie de ressource

7. On obtient les valeurs suivantes :

Le taux de mortalité pour 10 millions d’habitants prévu par les modèles à une latitude de 20°N est 271
si l’Etat est bordé par l’océan et 251 si l’Etat n’est pas bordé par l’océan.

53

Vous aimerez peut-être aussi