Open In Colab

Traitement des données Antoine


Antoine est né le 10 avril 2006. Son père est consultant en informatique bancaire et sa mère est responsable d’une agence de voyage. Il est le premier enfant de la famille et a maintenant un petit frère de deux ans et dix mois de moins que lui. Antoine est un petit garçon gracieux, sociable et prudent qui aime explorer le monde qui l’entoure.

Christophe Parisse l’a filmé pour la première fois alors qu’il n’était âgé que de 13 jours! Depuis, il se rend dans sa famille environ une heure par mois. Antoine n’est pas un petit garçon naturellement bavard et préfère communiquer par le regard ou des sous-entendus. Par conséquent, il est difficile de qualifier son développement langagier de bon ou moyen car il ne produit pas énormément d’énoncés mais lorsqu’il s’exprime, il parle correctement.

Nettoyage

Chargement des données

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

  • Ces fichiers sont placés dans un repertoire 'data/antoine_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 [2]:
import os 
import pandas as pd 
import os 
import numpy as np 
import pandas as pd 
import warnings
warnings.filterwarnings("ignore")
#print(os.getcwd())
#os.chdir('C:\\Users\\Lamou\\Desktop\\MIASHS\\TER_a\\data\\antoine_texte')
#listing=os.listdir() # On crée une liste de tout les noms des fichiers
In [0]:
#listing

Nous avons 61 fichiers pour Antoine, 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]:
os.chdir('C:\\Users\\Lamou\\Desktop\\MIASHS\\TER_a\\data\\antoine_texte')

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 [3]:
#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 [5]:
#data=data[['enfant', 'age','type', 'seconde_debut', 'seconde_fin', 'contenu']]
#data.head()

Création du fichier final format csv

In [0]:
# Création du fichier enfant
os.chdir('C:\\Users\\Lamou\\Desktop\\MIASHS\\TER_a\\data')
data.to_csv('data_antoine_final.csv',
           encoding = 'utf-8',
           sep = '\t',
           header = True)

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

Lecture fichier final

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

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

Exploration des données


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

In [0]:
print(len(data_antoine['type'].unique()))
51

Il existe 51 types de ligne dans les fichiers Antoine :

In [0]:
print(data_antoine['type'].unique())
['+div+' 'CHI' 'FAT' 'act' 'OBS' 'com' '-div-' 'MOT' 'ANN' 'UNK' 'GRM'
 'pho' 'sit' 'int' 'xpnt' 'add' 'AUN' 'ADU' 'xpol' 'VIS' 'ximi' 'exp'
 'xpho' 'GDM' 'UNI' 'BOY' 'GIR' 'gls' 'gpx' 'fac' 'xdia' 'tim' 'xnpt'
 'CPT' 'JEN' 'WOM' 'mor' 'GDF' 'lia' 'COL' 'VOI' 'CHA' 'COM' 'COU' 'xrep'
 'NAN' 'UNC' 'CAM' 'BRO' 'BAB' 'xpt']

Les phonèmes

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

  • Nous avons à disposition 16116 traductions pour Antoine
  • On distingue les premiers mots d'Antoine à l'age d'un an et 14 jours
  • Les traductions s'arrêtent à l'age de 6 ans 3 mois et 8 jours
In [9]:
pho_antoine = data_antoine[data_antoine['type'] == 'pho']
#pho_antoine
In [10]:
xpho_antoine = data_antoine[data_antoine['type'] == 'xpho']
#xpho_antoine

Valeurs NaN

Il existe 4 valeurs NaN dans la colonne contenu, nous allons les supprimer :

In [11]:
#pho_antoine.loc[pho_antoine['contenu'].isna()]
Out[11]:
enfant age type seconde_debut seconde_fin contenu
2152 ANTOINE 1_00_24 pho NaN NaN NaN
2372 ANTOINE 1_00_24 pho NaN NaN NaN
23672 ANTOINE 1_07_15 pho NaN NaN NaN
29960 ANTOINE 1_08_05 pho NaN NaN NaN
In [13]:
#Supprime les 4 lignes
#pho_antoine = pho_antoine.dropna(subset=['type', 'contenu'])

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_antoine['age'][0:1] nous donne le nombre d'année
  • pho_antoine['age'][2:4] nous donne le nombre de mois
  • pho_antoine['age'][5:7] nous donne le nombre de jours
In [14]:
# Ajout du nombre d'année
année_pho_antoine = pho_antoine.apply(lambda row: row['age'][0:1], axis=1)
pho_antoine['année'] = année_pho_antoine

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

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

Quantité de données

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

Quantité de données par année

In [15]:
nb_phrase_annee = pho_antoine[{'année','contenu'}].groupby('année').count()
nb_phrase_annee.rename(columns={'contenu': 'nb_phrase'})
Out[15]:
nb_phrase
année
1 3574
2 7291
3 2456
4 2215
5 575
6 1
In [26]:
plt = nb_phrase_annee.plot(kind='bar', 
                       subplots=True, 
                       figsize=(10,5),
                       title = 'Nombre de phrases phonétiques retranscritent par année : Antoine',
                       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 deux fois plus de données la deuxième année que la première (surement dû à une prise de la parole plus importante chez Antoine)
  • Il y a moins de données les troisième et quatrième années (surement dû à des prises de parole plus complexes chez Antoine)
  • Il y a moins beaucoup moins de données la cinquième année
  • 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 [43]:
nb_phrase_mois = pho_antoine[{'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)

Nous avons moins de 5 phrases pour les ages :

  • 4_00_xx
  • 5_04_xx
  • 5_07_xx
  • 6_03_xx

On voit aussi qu'il y a des mois sans données, cela vérifie qu'il y ait moins de données pour les années 3, 4 et 5

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

En effet on voit qu'il y a moins d'enregistrements effectués sur Antoine les troisième et quatrième années. De même la cinquième année ne contient qu'un mois avec une quantité de données significative. On voit encore ici que la sixième contient une seule ligne de traduction phonétique.

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

Cette distribution n'est pas homogène, de plus elle n'est pas distribuée de manière équitable dans le temps. En effet nous avons ici plus de données pour les années 1 et 2

Quantité de données par jour

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

In [23]:
nb_phrase_jour = pho_antoine[{'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 [29]:
plt = nb_phrase_jour.plot(kind='bar',
                    subplots=True,
                    figsize=(20, 10),
                    title = 'Nombre phrases phonétiques retranscritent par jour : Antoine',
                    fontsize = 15,
                    use_index = True)

De cette manière on a une distribution plus homogène de la quantité de données phonétique. En effet nous avons découpé les données de tel sorte à avoir la quantité de données pour chaque enregistrement d'Antoine. Mais elle n'est pas distribuée 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).
Pour cela nous devrons être attentifs aux quantités pour les ages :

  • 2_00_21
  • 4_10_22
  • 5_04_11
  • 5_07_11
  • 6_03_08

(Car ces quantités ne sont pas représentatives et cela pourrait fausser nos mesure)

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 Antoine.

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 [30]:
# Exemple 
pho = pho_antoine.at[141596, 'contenu']
print('Nombre de mot dans "' + pho + '" : '+ str(pho.count(' ')+1))
Nombre de mot dans "epɥi ʁəgaʁd la kɑ̃ t a f t ɛ fe tudududu sa fɛ kɔm sa" : 15

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

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

Par exemple on peut avoir la phrase d'Antoine avec le plus grand nombre de mot :

In [32]:
pho_antoine.loc[pho_antoine['nombre_mot_phonétique'] == pho_antoine['nombre_mot_phonétique'].max()].contenu.values
Out[32]:
array(['əm matjø mwa ʒ e fini tu lə skɔtʃ alɔʁ i fo k t ɑ̃ ʁəmɛt dɑ̃ ʁəpʁɑ̃d dy skotʃ paʁskə j ɑ̃na ply si si dəmɛ̃ matɛ̃ ʒ vø akʁoʃe ɑ̃kɔʁ dɛ dɛsɛ̃ ʃe mwa'],
      dtype=object)

Voici la ligne de cette phrase :

In [33]:
pho_antoine.loc[pho_antoine['nombre_mot_phonétique'] == 36 ]
Out[33]:
enfant age type seconde_debut seconde_fin contenu année mois jour nombre_mot_phonétique
130742 ANTOINE 4_08_02 pho NaN NaN əm matjø mwa ʒ e fini tu lə skɔtʃ alɔʁ i fo k ... 4 08 02 36

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 [34]:
mean_nb_mot_pho_antoine_jour = pho_antoine[{'année', 'mois', 'jour', 'nombre_mot_phonétique'}].groupby(['année', 'mois', 'jour']).mean()
mean_nb_mot_pho_antoine_jour = mean_nb_mot_pho_antoine_jour.rename(columns={'nombre_mot_phonétique': 'espérance_nombre_de_mot_phonétique'})
#mean_nb_mot_pho_antoine_jour
In [44]:
plt = mean_nb_mot_pho_antoine_jour.plot(kind='bar', 
                            subplots=True, 
                            figsize=(20, 13),
                            title = 'Espérance du nombre de mot phonétique par mois : Antoine',
                            fontsize = 15,
                            use_index = True,
                            grid=True)
  • On constaste que l'espérance augmente en fonction du temps
  • L'esperance pour l'age 4_20_22 est exessivement élevée

Variance du nombre de mot par phrase

In [36]:
var_nb_mot_pho_antoine = pho_antoine[{'année','mois','nombre_mot_phonétique'}].groupby(['année','mois']).var()
var_nb_mot_pho_antoine = var_nb_mot_pho_antoine.rename(columns={'nombre_mot_phonétique': 'variance'})
#var_nb_mot_pho_antoine.unstack(level=1)
In [38]:
plt = var_nb_mot_pho_antoine.plot(kind='bar', 
                            subplots=True, 
                            figsize=(20, 13),
                            title = 'Espérance du nombre de mot phonétique par jours : ANAE',
                            fontsize = 15,
                            use_index = True,
                            grid=True)

Plus grande phrase

In [39]:
max_mot_pho_antoine = pho_antoine[{'année','mois','nombre_mot_phonétique'}].groupby(['année','mois']).max()
max_mot_pho_antoine = max_mot_pho_antoine.rename(columns={'nombre_mot_phonétique': 'longueur_max'})
#max_mot_pho_antoine.unstack(level=1)
In [40]:
plt = max_mot_pho_antoine.plot(kind='bar', 
                            subplots=True, 
                            figsize=(20, 20),
                            title = 'Longueur de la plus grande par jour : Antoine',
                            fontsize = 15,
                            use_index = True,
                            grid=True)

On voit qu'antoine a s'est exprimer à l'age 1_01_xx avec une phrase comportant un nombre de mot assez grand :

In [41]:
pho_antoine.loc[pho_antoine['année'] == '1'].loc[pho_antoine.loc[pho_antoine['année'] == '1']['nombre_mot_phonétique'] == 12]
#pho_antoine
#pho_antoine_annee_1.loc[pho_antoine_annee_1['nombre_mot_phonétique'] == pho_antoine_annee_1['nombre_mot_phonétique'].max()]
Out[41]:
enfant age type seconde_debut seconde_fin contenu année mois jour nombre_mot_phonétique
6963 ANTOINE 1_01_24 pho NaN NaN puʁ diʁ mɛʁsi d tɑ̃ zɑ̃ tã i di i di si 1 01 24 12