Python en Mathématiques - Niveau 2

Exploiter les données d'une feuille tableur

Exploiter des données réelles

Pour la partie statistique, le programme de mathématiques demande d'exploiter des données réelles, par exemple des fichiers INSEE.

Dans cet objectif, il est possible de récupérer des données d'un fichier tableur pour les exploiter dans un programme python.

L'une des façons les plus simples pour cela est de travailler avec le format CSV (comma separated value).

Transformer un fichier tableur en fichier au format CSV

Nous commençons par charger un fichier tableur (par exemple un fichier xls) sur le site de l'INSEE. Par exemple, ce fichier concernant le bilan démographique en France en 2016.

Le fichier ouvert sous libreoffice présente une structure classique :
fichier tableur

Si le fichier choisi contient des valeurs décimales, il est prudent de régler votre tableur afin que le séparateur décimal soit le point, cela évitera un certain nombre de problèmes dans la communication avec python. Pour cela, vous pouvez par exemple dans libreoffice sélectionner Outils > Options > Paramètres linguistiques > Langue, choisir le français Suisse pour les paramètres locaux.

Pour transformer notre fichier en fichier au format CSV, dans LibreOffice,on sélectionne "enregistrer sous", puis on sélectionne le format csv. On sélectionne ensuite les options adéquates. Le plus simple étant de laisser les options par défaut :
options menu

Le fichier obtenu est un fichier texte dans lequel les valeurs sont séparées par des virgules :
fichier csv

Le fichier obtenu est un simple fichier texte et peut donc s'ouvrir avec un simple éditeur de texte. Toutefois, par défaut, sur votre poste ce sera certainement Libreoffice ou Excel (ou votre logiciel tableur préféré) qui ouvrira le fichier. Nous vous conseillons de l'ouvrir avec un éditeur de texte afin de mieux comprendre la simplicité de sa structure.

Exploitation des données

Pour faciliter l'exploitation, nous supprimons quelques lignes de présentation du fichier csv. Ce qui donne ce fichier, à télécharger.

Lecture du contenu

Pour lire le contenu, exécuter le script suivant (le fichier .py et le fichier .csv étant dans le même dossier) :


import csv
with open('population.csv', encoding="utf-8", newline='') as f:
	lecture = csv.reader(f)
	for ligne in lecture :
		print(ligne)

Après la ligne lecture = csv.reader(f), la variable lecture est un objet (de type _csv.reader) dont chaque élément est une ligne du fichier csv (enregistrée sous le type liste). On obtient donc :

['Année de naissance', 'Âge révolu', "Nombre d'hommes", 'Nombre de femmes', 'Ensemble']
['2016', '0', '382585', '364392', '746977']
['2015', '1', '390810', '373164', '763974']
['2014', '2', '402728', '386467', '789195']
['2013', '3', '405636', '387097', '792733']
['2012', '4', '416074', '396365', '812439']
['2011', '5', '419825', '403745', '823570']
['2010', '6', '431441', '413015', '844456']
['2009', '7', '430766', '410302', '841068']
['2008', '8', '432988', '414480', '847468']
['2007', '9', '430455', '410800', '841255']
['2006', '10', '437868', '417377', '855245']
['2005', '11', '428095', '408856', '836951']
['2004', '12', '426346', '407709', '834055']
['2003', '13', '424143', '405009', '829152']
['2002', '14', '427103', '406661', '833764']
['2001', '15', '434624', '414303', '848927']
['2000', '16', '442477', '421718', '864195']
['1999', '17', '420859', '399845', '820704']
['1998', '18', '412130', '393748', '805878']
['1997', '19', '398672', '379913', '778585']
['1996', '20', '396021', '378786', '774807']
['1995', '21', '385668', '374438', '760106']
['1994', '22', '371370', '364912', '736282']
['1993', '23', '365665', '361957', '727622']
['1992', '24', '383622', '379397', '763019']
['1991', '25', '384159', '386886', '771045']
['1990', '26', '390424', '395536', '785960']
['1989', '27', '388035', '398622', '786657']
['1988', '28', '391051', '405526', '796577']
['1987', '29', '392113', '405625', '797738']
['1986', '30', '397166', '415466', '812632']
['1985', '31', '397694', '414424', '812118']
['1984', '32', '394487', '414723', '809210']
['1983', '33', '391385', '409924', '801309']
['1982', '34', '416844', '434710', '851554']
['1981', '35', '421347', '438946', '860293']
['1980', '36', '428863', '443778', '872641']
['1979', '37', '406539', '420798', '827337']
['1978', '38', '400092', '412752', '812844']
['1977', '39', '406523', '414045', '820568']
['1976', '40', '394637', '404327', '798964']
['1975', '41', '407044', '414686', '821730']
['1974', '42', '430758', '434997', '865755']
['1973', '43', '453217', '462084', '915301']
['1972', '44', '464935', '470320', '935255']
['1971', '45', '461370', '468226', '929596']
['1970', '46', '453647', '459417', '913064']
['1969', '47', '444344', '454028', '898372']
['1968', '48', '439617', '453790', '893407']
['1967', '49', '438425', '449972', '888397']
['1966', '50', '447323', '461209', '908532']
['1965', '51', '447957', '461449', '909406']
['1964', '52', '450434', '468607', '919041']
['1963', '53', '445604', '462841', '908445']
['1962', '54', '428996', '447536', '876532']
['1961', '55', '428616', '448699', '877315']
['1960', '56', '426039', '447295', '873334']
['1959', '57', '419476', '445320', '864796']
['1958', '58', '409289', '435783', '845072']
['1957', '59', '404428', '435049', '839477']
['1956', '60', '399268', '431012', '830280']
['1955', '61', '391371', '426767', '818138']
['1954', '62', '391215', '425717', '816932']
['1953', '63', '379585', '417348', '796933']
['1952', '64', '383041', '423687', '806728']
['1951', '65', '372916', '413124', '786040']
['1950', '66', '385462', '428235', '813697']
['1949', '67', '374938', '420738', '795676']
['1948', '68', '373836', '416348', '790184']
['1947', '69', '363111', '408218', '771329']
['1946', '70', '341226', '387115', '728341']
['1945', '71', '254890', '291663', '546553']
['1944', '72', '245430', '284816', '530246']
['1943', '73', '235812', '275591', '511403']
['1942', '74', '216345', '254741', '471086']
['1941', '75', '189634', '228170', '417804']
['1940', '76', '192426', '238625', '431051']
['1939', '77', '195108', '248951', '444059']
['1938', '78', '186728', '244971', '431699']
['1937', '79', '176365', '240276', '416641']
['1936', '80', '170321', '238380', '408701']
['1935', '81', '158542', '230952', '389494']
['1934', '82', '152030', '229257', '381287']
['1933', '83', '136455', '214820', '351275']
['1932', '84', '130890', '215514', '346404']
['1931', '85', '117107', '201077', '318184']
['1930', '86', '105230', '191275', '296505']
['1929', '87', '87578', '167944', '255522']
['1928', '88', '75618', '153111', '228729']
['1927', '89', '62933', '135809', '198742']
['1926', '90', '52089', '120776', '172865']
['1925', '91', '42892', '105159', '148051']
['1924', '92', '33531', '87258', '120789']
['1923', '93', '25617', '72709', '98326']
['1922', '94', '19407', '60358', '79765']
['1921', '95', '14319', '47292', '61611']
['1920', '96', '10444', '36658', '47102']
['1919', '97', '4449', '16182', '20631']
['1918', '98', '2474', '10089', '12563']
['1917', '99', '1362', '6765', '8127']
['1916 ou avant', '100 ou plus', '3015', '15617', '18632']

Exemple d'utilisation

On aimerait par exemple maintenant récupérer une liste des années de naissance et une liste des effectifs des femmes correspondants aux années de naissance :


import csv

annees_naissance = []
effectifs_femme = [] 

with open('population.csv', encoding="utf-8", newline='') as f:
	lecture = csv.reader(f)
	for ligne in lecture :
		annees_naissance.append(ligne[0])
		effectifs_femme.append(ligne[3])
		
# on choisit de supprimer le premier élément
# qui correspondait à une ligne de titre des colonnes :
del(annees_naissance[0])
del(effectifs_femme[0])
for i in range(len(annees_naissance)) :
	print("Le nombre de femmes de la population française de 2016")
	print("qui sont nées en {} est égal à {}.".format(annees_naissance[i], effectifs_femme[i]))
	print()

Le début de l'affichage :

Le nombre de femmes de la population française de 2016
qui sont nées en 2016 est égal à 364392.

Le nombre de femmes de la population française de 2016
qui sont nées en 2015 est égal à 373164.

Le nombre de femmes de la population française de 2016
qui sont nées en 2014 est égal à 386467.

Le nombre de femmes de la population française de 2016
qui sont nées en 2013 est égal à 387097.

Le nombre de femmes de la population française de 2016
qui sont nées en 2012 est égal à 396365.

On voit ainsi qu'il est possible de fournir aux élèves un fichier Python dans lequel on aura initialisé des listes de données issues de données réelles comme celles proposées par l'INSEE. On peut alors envisager tous les traitements statistiques au programme de la classe.