<jupyter_start><jupyter_text>Analytique de l'apprentissage Collecte et extraction des données  Exemple de la plateforme Open edX Carnet web IPython (Jupyter Notebook) en complément du **«Chapitre 6 – Vers une IENA pilotée par les données » ** du livre : **« Vers une nouvelle ingénierie des environnements numériques d’apprentissage »**, auteurs du chapitre, <NAME> & <NAME>, éditeurs: <NAME>, <NAME>, licence code source libre Apache  Plateforme Open edXPlateforme de cours en ligne ouverts et massifs CLOM (en anglais MOOC: massive open online course) https://open.edx.org/about-open-edx/  La collecte des donnéesLa première étape du travail d’analytique est la collecte des données.Comme exemple, nous collecterons les réponses de la question 3 du questionnaire socio-démogaphique. À la question « Dans quel pays habitez-vous ? », l’apprenant sélectionnait sa réponse dans un menu déroulant qui était mémorisée dans la base de données.Ci-dessous une requête SQL pour collecter les données brutes sur la question 3 et les sauvegarder dans un fichier `IHPQ_Profil_Q3_brut.csv`. Le choix du format `.csv`, signifiant 'Comma Separated Value', est très pratique car compatible avec la plupert des outils de l'écosystème Python pour la science des données. La structure de données contenant la réponse pour la question 3 est mémorisée dans le champ « state » pour chaque apprenant «student_id» du module identifié (`module_id`) par ` i4x://TELUQ/TUL2/problem/0704643ff2e943dbae4bffcae0bb7d82`.**Note**: Le code SQL est donné à titre indicatif mais ne fonctionne pas dans ce carnet Python. ```SQLSELECT     edxapp.courseware_studentmodule.student_id,     edxapp.courseware_studentmodule.module_id,     edxapp.courseware_studentmodule.stateFROM     edxapp.courseware_studentmodule WHERE    edxapp.courseware_studentmodule.module_id=             "i4x://TELUQ/TUL2/problem/0704643ff2e943dbae4bffcae0bb7d82" INTO OUTFILE     '/home/data_usagers/IHPQ_Profil_Q3_brut.csv' FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY '\n' ;``` Nous avons délibérément choisi de limiter l’utilisation du SQL à la collecte des données brutes et à leur sauvegarde dans des fichiers tabulaires.  Le prétraitement des donnéesTous les traitements subséquents (ou prétraitements) seront effectués en Python dans une console ou dans des carnets Jupyter iPython pratiques. Ce choix a été motivé par la plus grande souplesse des outils Python et par une meilleure maîtrise des outils Python que des outils SQL.Ces traitements impliqueront la manipulation de tableaux de données appelés « DataFrames » avec les outils de la bibliothèque Pandas qui est utilisée pour le pré-traitement et la manipulation des données [McKinney, 2010].    Lecture et chargement des données brutes :Commençons par charger les données du fichier des données brutes, `IHPQ_Profil_Q3_Brut.csv` dans un tableau de données Pandas (dataframe) `IHPQ_Profil_Q3_DF`.<jupyter_code>import pandas as pd
path_to_datafile = "AA_data/"
IHPQ_Profil_Q3_DF = pd.read_csv (path_to_datafile+"IHPQ_Profil_Q3_Brut.csv", 
                                delimiter=",",
                                na_values=[""],
                                encoding='utf-8')<jupyter_output><empty_output><jupyter_text>L'opération de lecture `pd.read_csv(...)` retourne `IHPQ_Profil_Q3_DF`, un Dataframe ou tableau de données analogue à une feuille de tableur où chaque ligne représente un exemplaire de données (observations ou exemples) et chaque colonne représente la valeur d'un attribut (ou caractéristique). Avec la commande `.head()` demandons à Pandas d'afficher les cinq premières lignes du tableau de données `IHPQ_Profil_Q3_DF` en configurant Pandas pour afficher jusqu’à 1000 caractères par champ ou colonne.<jupyter_code>pd.options.display.max_colwidth = 1000
IHPQ_Profil_Q3_DF.head ()<jupyter_output><empty_output><jupyter_text>Modification / uniformisation des données avec une expression régulière (caractères accentués)Nous remarquons problème d’encodage dans les noms de pays, par exemple « Haïti » est encodé « Ha\u00efti » ce qui sera facilement corrigé en appliquant une petite fonction de correction à chaque cellule `'state'`.<jupyter_code>IHPQ_Profil_Q3_DF['state'] = IHPQ_Profil_Q3_DF['state'].apply(lambda text: text.replace("\\/", "/").encode().decode('unicode_escape')  if type(text) is str  else text)
IHPQ_Profil_Q3_DF.head()<jupyter_output><empty_output><jupyter_text>Extraction d'un attribut au moyen d'une expression régulièreL’étape suivante est l’extraction du nom du pays de la chaîne de caractères contenue dans la colonne « “state” ».du tableau de données (dataframe), nous utiliserons une expression régulière. Une expression régulière est un formalisme qui décrit la forme générale d’une chaîne de caractères. Une expression régulière est utilisée pour rechercher des chaînes de caractères de même forme dans un texte. Une fois les chaînes trouvées, on peut leur appliquer un traitement, comme un ajout, une modification ou une suppression [WIKIPÉDIA, Regular expression]. Une expression régulière est un formalisme qui décrit la forme générale d’une chaîne de caractères. Une expression régulière est utilisée pour rechercher des chaînes de caractères de même forme dans un texte. Une fois les chaînes trouvées, on peut leur appliquer un traitement, comme un ajout, une modification ou une suppression [WIKIPÉDIA, Regular expression]. Le résultat de l’extraction des différentes valeurs est affecté dans la nouvelle colonne « “pays” » du tableau des données « IHPQ_Profil_Q3_DF ». Cette colonne du tableau de données représente les différentes valeurs l’attribut « “pays” ».<jupyter_code>IHPQ_Profil_Q3_DF['pays'] = IHPQ_Profil_Q3_DF['state'].str.extract('\":\s*\"([A-Za-ü\s*\-\.\s*]*)\"')
IHPQ_Profil_Q3_DF.head()
IHPQ_Profil_Q3_DF["pays"].head()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.06931370871127845, 'fraction_numerical': 0.01232243710422728, 'mean_word_length': 5.190677966101695, 'pattern_counts': {'":': 1, '<': 21, '<?xml version=': 0, '>': 21, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '286091', 'license': 'Apache-2.0', 'n_tokens_mistral': 1995, 'n_tokens_neox': 1963, 'n_words': 690, 'path': 'AA-Collecte_des_donnees-OpenEdX.ipynb', 'repo_name': 'ClaudeCoulombe/Analytique_Apprentissage', 'size': '5877'}