Open In Colab

Traitement des données Madeleine


Madeleine est née le 14 avril 2005. Sa mère dirige une société de production et son père est cadre supérieur dans une entreprise de restauration industrielle. Elle est le deuxième enfant de la famille et au début du tournage, sa sœur est de onze ans son aînée.

Martine Sékali la filme en situation naturelle, chez elle, une heure par mois depuis l’âge de 1 ans et 5 jours, et tous les trois mois depuis l’âge de 4 ans.

Madeleine est une petite fille très bavarde dont le développement langagier peut-être qualifié d’impressionnant. En effet, elle utilise dès l’âge de 2;02 un lexique très précis, des marqueurs grammaticaux, des prépositions, des conjonctions ainsi que des déterminants variés. Elle est aussi capable de faire des plaisanteries, raconter des histoires, décrire ses actions et maîtrise plusieurs temps et aspects. A cinq ans, Madeleine entre au CP, elle sait déjà lire et est très sociable et joyeuse. Elle a désormais un petit frère très vif et dynamique de 3 ans, Côme, qui vient d’entrer en maternelle, et avec qui elle échange et joue volontiers.

Nettoyage

Chargement des données

Récupèrer la liste des noms de fichier pour Madeleine :

  • Ces fichiers sont placés dans un repertoire 'data/madeleine_texte'
  • Ils sont issuent d'une extraction sur le site colaje au format chat
  • Nous les avons transformés en format .txt afin de pouvoir les traiter avec python
In [6]:
import os 
import pandas as pd 
import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
import chardet
In [1]:
#print(os.getcwd())
#os.chdir('/Users/marine/Desktop/Projet_TER/data/madeleine_texte')
#listing=os.listdir() # On crée une liste de tout les noms des fichiers
In [2]:
#listing.sort()
#listing
In [3]:
#del listing[0] # pour retirer '.DS_Store'
#len(listing)

Nous avons 35 fichiers pour Madeleine, chacun de ses fichiers corresepondent aux retrancriptions d'un enregistrement vidéo.

Lecture des données

  • Définir le nom des colonnes selon le fichier final attendu
  • Lire chaque fichier de la liste
  • Ajouter les colonnes nom de l'enfant et son age
  • La colonne age identifie de manière unique l'enregistrement
In [0]:
d = {} # Le dictionnaire contenant les noms des fichiers
nom_col = ['type', 'seconde_debut', 'seconde_fin', 'contenu']
rows = 0 #Compteur de ligne pour vérifier la perte de données

for file in listing: 
    d[file]=pd.read_csv(file, 
                        sep = '\t', 
                        names = nom_col, 
                        header = None)  

    # On ajoute le nom de l'enfant
    nom_pos1 = 0
    nom_pos2 = file.find('-')
    nom = file[nom_pos1:nom_pos2]
    d[file]['enfant'] = nom
    
    # On ajoute l'age de l'enfant
    age_pos1 = file.find('_')-1
    age_pos2 = file.find('.')
    age = file[age_pos1:age_pos2]
    d[file]['age'] = age
    
    rows += len(d[file])
    
    
# DataFrame contenant toutes les lignes de l'enfant
data = pd.concat([d[file] for file in listing], 
                 sort=False,
                 ignore_index=True) 
In [4]:
#data.shape

Vérification de la perte de données

On vérifie qu'il y a autant de ligne lu (variable rows) que de ligne écritent (len(data))

In [0]:
print(rows == len(data))
True

Ordre des colonnes

In [0]:
#data=data[['enfant', 'age','type', 'seconde_debut', 'seconde_fin', 'contenu']]
#data.head()
Out[0]:
enfant age type seconde_debut seconde_fin contenu
0 MADELEINE 1_00_05 +div+ 0 3603.0 div |
1 MADELEINE 1_00_05 +div+ 0 58.0 div |
2 MADELEINE 1_00_05 MOT 0 2.0 c'est pas très propre ça .
3 MADELEINE 1_00_05 act NaN NaN MOT penchée regarde CHI .
4 MADELEINE 1_00_05 MOT 2 3.0 allez debout .

Création du fichier final format csv

In [0]:
# Création du fichier enfant
os.chdir('/Users/marine/Desktop/Projet_TER/TER/data')
data.to_csv('data_madeleine_final.csv',
           encoding = 'utf-8',
           sep = '\t',
           header = True)

On peut maintenant utiliser le fichier 'data_madeleine_finale.csv' pour l'exploration de données.

Lecture fichier final

In [7]:
os.chdir('C:\\Users\\Lamou\\Desktop\\MIASHS\\TER_a\\data')
data_madeleine = pd.read_csv('data_madeleine_final.csv',
                           sep = '\t',
                           encoding = 'utf-8',
                           index_col=False)

# On supprime la colonne qui duplique les index
data_madeleine = data_madeleine.drop(columns = 'Unnamed: 0')
In [8]:
#data_madeleine

Exploration des données


Qu'elles sont les différents type de ligne ?

In [0]:
print(len(data_madeleine['type'].unique()))
40

Il existe 40 types de ligne dans les fichiers Madeleine :

In [0]:
print(sorted(data_madeleine['type'].unique()))
['+div+', '-div-', 'ANG', 'CAM', 'CHI', 'CHR', 'COM', 'FAT', 'FRI', 'HOU', 'LUC', 'MAR', 'MOT', 'OBS', 'SIS', 'TOY', 'UNI', 'VAL', 'VIS', 'VOI', 'act', 'add', 'cod', 'com', 'com¬:', 'dis', 'disc', 'exp', 'fac', 'fic', 'gpx', 'int', 'mod', 'nof', 'pho', 'sit', 'ximi', 'xnpt', 'xpnt', 'xpol']

Les phonèmes

Les lignes de type 'pho' correspondent à la traduction phonétique lorsque Madeleine s'exprime :

  • Nous avons à disposition 14614 traductions pour Madeleine
  • On distingue les premiers mots de Madeleine à l'age d'un an et 5 jours
  • Les traductions s'arrêtent à l'age de 6 ans 11 mois et 27 jours
In [9]:
pho_madeleine = data_madeleine[data_madeleine['type'] == 'pho']
#pho_madeleine
In [0]:
#mad = data_madeleine['type'].unique()
#mad.sort()
#type_madeleine = {}
#for file in mad:
#    type_madeleine[file] = len(data_madeleine[data_madeleine['type'] == file])
#type_madeleine

Nous allons chercher à visualiser la quantité phonétique de données à disposition

Visualisation des données phonétiques

Ajout des colonnes 'année', 'mois' et 'jour'

On considère que la colonne age a pout format : x_xx_xx (année_mois_jour) ainsi :

  • pho_madeleine['age'][0:1] nous donne le nombre d'année
  • pho_madeleine['age'][2:4] nous donne le nombre de mois
  • pho_madeleine['age'][5:7] nous donne le nombre de jours
In [10]:
# Ajout du nombre d'année
année_pho_madeleine = pho_madeleine.apply(lambda row: row['age'][0:1], axis=1)
pho_madeleine['année'] = année_pho_madeleine

# Ajout du nombre de mois
mois_pho_madeleine = pho_madeleine.apply(lambda row: row['age'][2:4], axis=1)
pho_madeleine['mois'] = mois_pho_madeleine

# Ajout du nombre de jour
jour_pho_madeleine = pho_madeleine.apply(lambda row: row['age'][5:7], axis=1)
pho_madeleine['jour'] = jour_pho_madeleine
In [0]:
#pho_madeleine

Quantité de données

Combien avons-nous de ligne pour chaque année ? mois ? jour ?

Quantité de données par année

In [12]:
nb_phrase_annee = pho_madeleine[{'année','contenu'}].groupby('année').count()
nb_phrase_annee.rename(columns={'contenu': 'nb_phrase'})
Out[12]:
nb_phrase
année
1 4270
2 5390
3 2566
4 1962
5 410
6 16
In [14]:
nb_phrase_annee.plot(kind='bar', 
                       subplots=True, 
                       figsize=(10,5),
                       title = 'Nombre de données phonétiques par année : Madeleine',
                       fontsize = 15,
                       use_index = True);

On voit qu'il y a des quantités de données phonétiques différentes pour chaques années :

  • Il y a un riche contenue des la premiere annee
  • Le pic de données phonétiques se situe a l'age de 2 ans
  • La quantité de données diminue a partir de 2 ans, pourtant les nombre d'enregistrments ne diminue qu'a l'age de 4 ans
  • Peut-on considérer la sixième année comme n'ayant aucune donnée ?

Quantité de données par mois

Regardons plus en détail la quantité de données phonétiques par mois :

In [15]:
nb_phrase_mois = pho_madeleine[{'année','mois','contenu'}].groupby(['année','mois']).count()
nb_phrase_mois = nb_phrase_mois.rename(columns={'contenu': 'nb_phrase'})
#nb_phrase_mois.unstack(level=1)

On note que contrairement aux informations donnée par le corpus, le nombre d'enregistrements diminuent des les 3ans de Madeleine :

  • 4 enregistrements durant sa 3eme année,
  • 3 enregistrements durant sa 4eme et 5eme année,
  • 2 enregistrements durant sa 6eme année totalisant seulement 16 phrases.

Cela vérifie qu'il y ait moins de données des les 3 ans de Madeleine

In [29]:
plt = nb_phrase_mois.unstack(level=0).plot(kind='bar', 
                                     subplots=True, 
                                     figsize=(20, 20),
                                     title = 'Nombre de phrases phonétiques retranscritent par mois : Madeleine',
                                     fontsize = 15,
                                     use_index = True)

En effet on voit que l'enfant fait de nombreuses interactions lors de chacun enregistrement, hormis à l'âge de 6 ans.
(Il faudrait peut-être regarder si ce que l'enfant a dit à cet âge-là a été traduit en phonétique)

In [30]:
plt = nb_phrase_mois.plot(kind='bar',
                    subplots=True, 
                    figsize=(20, 10),
                    title = 'Nombre de phrases phonétiques retranscritent par mois : Madeleine',
                    fontsize = 15,
                    use_index = True)

Cette visualisation regroupe toutes les informations commentées ci-dessus.

Quantité de données par jour

Regardons maintenant la quantité de données par jours :

In [18]:
nb_phrase_jour = pho_madeleine[{'année','mois', 'jour', 'contenu'}].groupby(['année','mois', 'jour']).count()
nb_phrase_jour = nb_phrase_jour.rename(columns={'contenu': 'nb_phrase'})
#nb_phrase_jour
In [31]:
plt = nb_phrase_jour.plot(kind='bar',
                    subplots=True,
                    figsize=(20, 10),
                    title = 'Nombre de phrases phonétiques retranscritent par jour : Madeleine',
                    fontsize = 15,
                    use_index = True)

Ici nous avons découpé les données de tel sorte à avoir la quantité de données pour chaque enregistrement de Madeleine. Mais elles ne sont pas distribué de manière équitable dans le temps. On peut mesurer la croissance du nombre de prise de parole (on pourrait croiser cette donnée avec la durée de l'enregistrement pour une meilleure mesure).
Les quantites de donnnees phonetiques pour les ages ci-dessous, sont tres faibles:

  • 2_11_19
  • 5_10_16
  • 6_05_14
  • 6_11_27

On a maintenant une meilleure vision du nombre de la quantité de données phonétiques à disposition et de leur répartition dans le temps pour Madeleine.

Nombre de mot

Nous allons chercher à explorer le nombre de mot au sens phonétique par phrase.
Pour cela on peut compter le nombre d'espace dans la chaîne de caractère :

In [20]:
# Exemple 
pho = pho_madeleine.at[103508, 'contenu']
print('Nombre de mot dans "' + pho + ' : '+ str(pho.count(' ')+1))
Nombre de mot dans "mɛ̃tnɑ̃ vø ekʁiʁ kom : 4

Pour chaque ligne on calcul le nombre de mot phonétique :

In [21]:
nb_mot_pho = pho_madeleine.apply(lambda row: row['contenu'].count(' ')+1, axis=1)
pho_madeleine['nombre_mot_phonétique'] = nb_mot_pho #On ajoute une colonne contenant le nombre de mot

Par exemple on peut avoir la phrase de Madeleine avec le plus grand nombre de mot :

In [22]:
pho_madeleine.loc[pho_madeleine['nombre_mot_phonétique'] == pho_madeleine['nombre_mot_phonétique'].max()].contenu.values
Out[22]:
array(['dabɔʁ ty sɛ œm œm l ot fwa maʁi e mɔ̃ papa i zetɛ ale aʃte ty sɛ i zetɛ ale aʃ a gugini i zetɛ ale aʃte œm ɛ̃ paʁk me me avɛk ɛ̃ ɛ̃ de de sɔʁ de pœ avɛk ɛ̃ ɛ̃ tapi ɑ̃ ɑ̃ ɑ̃ sɔʁ ɛ̃ː pœzl'],
      dtype=object)

Voici la ligne de cette phrase :

In [23]:
pho_madeleine.loc[pho_madeleine['nombre_mot_phonétique'] == pho_madeleine['nombre_mot_phonétique'].max()]
Out[23]:
enfant age type seconde_debut seconde_fin contenu année mois jour nombre_mot_phonétique
76477 MADELEINE 3_06_08 pho NaN NaN dabɔʁ ty sɛ œm œm l ot fwa maʁi e mɔ̃ papa i z... 3 06 08 51

Espérance de mot par phrase

Il est intéressant d'observer le nombre de mot moyen que contient les phrases. C'est un indicateur qui peut nous aiguiller sur l'explosion du lexicale de l'enfant.

In [24]:
mean_nb_mot_pho_madeleine_jour = pho_madeleine[{'année', 'mois', 'jour', 'nombre_mot_phonétique'}].groupby(['année', 'mois', 'jour']).mean()
mean_nb_mot_pho_madeleine_jour = mean_nb_mot_pho_madeleine_jour.rename(columns={'nombre_mot_phonétique': 'espérance_nombre_de_mot_phonétique'})
#mean_nb_mot_pho_madeleine_jour
In [26]:
mean_nb_mot_pho_madeleine_jour.plot(kind='bar', 
                            subplots=True, 
                            figsize=(20, 10),
                            title = 'Espérance du nombre de mot phonétique par mois : Madeleine',
                            fontsize = 15,
                            use_index = True,
                            grid=True);
  • On constaste que l'espérance a tendance a augmenter au fil du temps
  • L'esperance pour l'age 4_07_04 est élevée

Variance du nombre de mot par phrase

In [32]:
var_nb_mot_pho_madeleine = pho_madeleine[{'année','mois','nombre_mot_phonétique'}].groupby(['année','mois']).var()
var_nb_mot_pho_madeleine = var_nb_mot_pho_madeleine.rename(columns={'nombre_mot_phonétique': 'variance'})
#var_nb_mot_pho_madeleine.unstack(level=1)
In [34]:
plt = var_nb_mot_pho_madeleine.plot(kind='bar', 
                            subplots=True, 
                            figsize=(20, 13),
                            title = 'Variance du nombre de mot phonétique par jours : Julie',
                            fontsize = 15,
                            use_index = True,
                            grid=True)

Plus grande phrase

In [35]:
max_mot_pho_madeleine = pho_madeleine[{'année','mois','nombre_mot_phonétique'}].groupby(['année','mois']).max()
max_mot_pho_madeleine = max_mot_pho_madeleine.rename(columns={'nombre_mot_phonétique': 'longueur_max'})
#max_mot_pho_madeleine.unstack(level=1)
In [37]:
max_mot_pho_madeleine.plot(kind='bar', 
                            subplots=True, 
                            figsize=(20, 13),
                            title = 'Longueur de la plus grande phrase par jour : Madeleine',
                            fontsize = 15,
                            use_index = True,
                            grid=True);

On note une que la longueur de la plus longue phrase par enregistrement évolue jusqu'à ses 3 ans, ensuite elle ne fluctue plus beaucoup.
Remarque: le fait que l'enfant effectue une longue prhase signifie pas forcement que celle-ci a un sens