Table des matières
Introduction | Extraction | Préparation des données | Analyse | Conclusion
Méthode : À partir de l'outil "Les tricoteuses" d'Emmanuel Raviart, on obtient l'ensemble des textes (i.e. dispositif et exposé sommaire) des amendements se référant au PLFSS 2020-2021.
Output : Ils sont sauvegardés dans un fichier .csv situé ici:
Code : On importe le fichier précédent et on le range dans un tableau dont on peut voir les 5 premières lignes ci-dessous:
import pandas as pd
amdts = pd.read_csv('https://raw.githubusercontent.com/leximpact/donnees-extraites-assemblee/main/textes_amendements_nouveaux_articles_plfss_2020-2021.csv')
amdts.head(5)
#On regroupe dans un même texte chaque dispositif et son exposé sommaire
amdts['texte'] = amdts['dispositif'] + amdts['exposeSommaire']
print("Nous avons alors un nombre total de : ", len(amdts), "amendements")
Méthode : Nous allons ensuite appliquer des méthodes de Natural Language Processing pour pouvoir étudier ces textes. Le NLP est la science de l'analyse de texte. Pour pouvoir faire des opérations mathématiques sur le texte, il faut d'abord le "pré-processer" de la façon suivante:
- tokenization : séparer en mots distincts dits TOKENS
- part-of-speech tagging : attribuer à chaque mot son type (nom, verbe, etc...)
- lemmatization : réduire chaque mot à sa racine. Cela permet de traiter comme un seul mot toutes les formes conjuguées d'un verbe, ou un mot et son pluriel.
- casing and punctuation : passer tous les mots en minuscule et retirer toute ponctuation
- stop-word removal : supprimer les mots inutiles ('le', 'la', 'les', 'un', 'des',...)
!python3 -m spacy download fr_core_news_sm > /dev/null
Code :
#( Casing: Est-ce vraiment utile ? Est-ce qu'on ne va pas perdre les Acronymes de vue ?)
amdts_clean = []
for amdt in lemmatized_amdts:
amdts_clean.append([ word.lower() for word in amdt if word.isalpha()])
print(amdts_clean[4])
print(len(amdts_clean))
Pour choisir nos mots inutiles, on décide de faire une liste à partir de trois sources:
- le package python nltk
- le package python spacy
- et notre propore fichier Excel que nous complétons avec les mots qui nous semblent inintéressants.
Ce fichier Excel se situe ici: https://github.com/leximpact/etudes-amendements/blob/main/notebook/Added_stop_words.csv
Output : On va ensuite sauvegarder ces amendements "pré-processés" dans trois fichiers, dont deux en '.csv', avec deux formats différents. Pour ces deux-là, chaque ligne représentera un amendement, mais:
dans le 1er fichier on n'a qu'une colonne, avec la liste des TOKENS de chaque amendement: https://github.com/leximpact/etudes-amendements/tree/main/notebook/data_csv/amdts_cleaned_liste.csv
dans le 2e fichier on a une colonne par TOKEN pour chaque amendement: https://github.com/leximpact/etudes-amendements/tree/main/notebook/data_csv/amdts_cleaned.csv
Ces données sont consultables directement, mais sont quelque peu indigestes. Le troisième format d'enregistrement (avec pickle) n'est pas consultable hors code. Ces fichiers nous serviront surtout de base d'import pour la suite des analyses.
Limites : Une question se pose ici: est-ce que l'on veut supprimer les lignes en double (i.e. les amendements qui ont exactement les mêmes tokens) ? Cela permettrait de ne pas donner trop d'importance à un même amendement déposé plusieurs fois, mais on risque aussi de ne pas voir des amendements réellement différents mais qui traitent d'un même sujet. Pour l'instant le choix a été fait de ne pas supprimer les doublons. Cela peut se changer en un clic sur le code ci-dessous.
!mkdir -p data_csv
Input : Pour la suite des analyses, on charge directement le fichier amdts_list.pickle, qui contient nos amendements "mis en forme"
Méthode : On commence par regarder les mots les plus fréquents dans l'ensemble du corpus (i.e. l'ensemble des mots des amendements). Le script ci-dessous va nous permettre d'extraire les mots les plus importants et le nombre de fois où ils sont cités. On décide d'extraire les N mots les plus fréquents. Vous pouvez changer ce nombre directement dans le code ci-dessous, et exécuter la cellule (run) pour générer automatiquement un fichier .csv avec ces mots et leur nombre total d'occurrences par amendement.
Les fichiers ainsi générés seront disponibles ici: https://github.com/leximpact/etudes-amendements/tree/main/notebook/data_csv/ et s'appelleront : most_common N words_per_amdt.csv
Code :
Méthode : Pour plus de lisibilité, on met ces données sous forme de graphique. On va d'abord chercher LE mot le plus fréquent dans chaque amendement: ce sera le MOT-CLEF de cet amendement. Ensuite on regarde quels sont les Mots-clefs les plus fréquents. Ici on décide de regarder les N mots-clefs qui reviennent le plus souvent. Comme précédemment, vous pouvez changer la valeur de N dans le code ci-dessous, et exécuter la cellule: cela génèrera automatiquement un fichier .png (dans le dossier https://github.com/leximpact/etudes-amendements/tree/main/notebook/graphs).
Code :
N = 30 # À modifier ici
# Calculs
from collections import Counter
mots_clefs = [ words[i][0] for i in range(len(words))]
bow = Counter(mots_clefs)
df = pd.DataFrame( bow.most_common(N) )
df.columns = ["Word", 'Count']
# Mise en forme graphique
from matplotlib import pyplot as plt
import seaborn as sns
plt.figure(figsize = (7,5), dpi = 300, facecolor = 'white')
sns.barplot(data = df, x = 'Count', y = 'Word')
#Styling
sns.set_context('paper', font_scale = 1, rc = {'font.size': 10})
sns.despine(top = True, right = True)
plt.rc('axes', labelsize = 12)
plt.rc('axes', titlesize = 16)
plt.xlabel("Nombre d'amendements dont c'est le mot-clef")
plt.ylabel("Mot-clefs les plus fréquents")
plt.title("Visualisation des {N} mots-clefs les plus fréquents dans les amendements".format(N=N))
#Save and show
plt.savefig('graphs/{N}_Mots_clefs_les_plus_fréquents.png'.format(N=N), bbox_inches = 'tight')
plt.show()
Méthode : On fait un nuage de mots, qui représente les expressions (de 1 à 2 mots) les plus fréquentes avec une taille proportionnelle à leur occurrence dans le corpus d'amendements. On a ici une représentation des TOKENS, donc certains mots sont réduits à leur racine, d'où leur orthographe parfois... étonnante.
Ce nuage de mots est disponible ici : https://github.com/leximpact/etudes-amendements/tree/main/notebook/graphs/Nuage_de_mots_PLFSS.png
from IPython.display import Image
Image("graphs/Nuage_de_mots_PLFSS.png")
Méthode : Puisque tous les amendements traitent de sujets similaires, on va s'intéresser à leur spécificité par rapport aux autres amendements. Cela permettra de voir ceux qui ont un but ou un domaine d'application spécifique .
Pour cela on utilise la méthode "Term Frequency - Inverse Document Frequency", qui consiste à regarder la fréquence d'un mot dans un amendement par rapport à la fréquence de ce mot dans l'ensemble du corpus (i.e. tous les amendements). Ces mots ne seront pas les plus fréquents, mais les plus importants (relativement) .
PS: Nous sauvegardons ces mots importants dans un fichier .csv, qui n'a vocation à être consulté uniquement si l'on veut se plonger dans les détails. Ce fichier est ici : https://github.com/leximpact/etudes-amendements/tree/main/notebook/data_csv/mots_importants_pour_chaque_amdt.csv
Code :
Méthode : Afin d'avoir un résultat lisible, nous génénerons un fichier .csv qui contient, pour chaque amendement, les 3 mots les plus fréquents et les 3 mots les importants. Cette 'combinaison' de 6 mots sera notre 'description minimale essentielle' d'un amendement.
Pour l'analyse, nous regroupons les amendements qui ont la même description essentielle (i.e. sont décrits par la même combinaison de 6 mots), et nous classons les combinaisons par ordre décroissant : https://github.com/leximpact/etudes-amendements/tree/main/notebook/data_csv/comparatif_3_mots_specifiques_et_relatifs_pour_chaque_amdts.csv
Un résumé des 20 premières lignes de ce fichier est disponible ici :
N = 3
#Load and transform data
import pandas as pd
import pickle
del(freq)
freq = pickle.load(open("data_csv/freq.pickle", "rb"))
#print(freq.head())
del(df)
df = pd.read_csv('data_csv/mots_importants_pour_chaque_amdt.csv', low_memory=False)
#print(df.head())
df2 = []
for i in range(len(df)):
mots_spec = []
mots_rel = []
for j in range(N):
if freq.iloc[i][j] != None :
mots_spec.append( freq.iloc[i][j][0] )
mots_rel.append( df.iloc[i][j+1] )
df2.append( mots_spec + mots_rel ) # N mots relatifs
#Mise en forme
df2 = pd.DataFrame(df2)
spec_index = ['Mot Fréquent{i}'.format(i = j+1) for j in range(N)]
rel_index = ['Mot Important{i}'.format(i = j+1) for j in range(N)]
df2.columns = [ spec_index + rel_index]
df2.index = corpus_index
#print(df2.head())
#Pour plus de lisibilité, on regroupe les cas similaires
final = df2.value_counts()
print("Descriptions minimales essentielles les plus fréquentes, et le nombre d'amendements concernés: \n \n", final.head(20))
#Sauvegarde dans un fichier csv
final.to_csv('data_csv/comparatif_{nb}_mots_specifiques_et_relatifs_pour_chaque_amdts.csv'.format(nb = N))
CONCLUSION :
Après analyse, il semble que les catégories les plus importantes d'amendements parlent de :
- 1 : financement de la santé et de la sécurité sociale
- 2 : des médicaments et de leur accessibilité
- 3 : de l'investissement public dans la santé
- 4 : ??
- 5 : de la répartition des médicaments
- ...
Input :
Méthode : Afin d'étudier les TOPICS (domaines ou sujets) d'intérêt du corpus, nous allons effectuer une LDA (Latent Dirichlet Allocation). Ce modèle génératif probabiliste permet de regrouper des observations en ensembles définis par des similarités de données. Plus d'infos: https://en.wikipedia.org/wiki/Latent_Dirichlet_allocation
L'idée est de dire que chaque amendement est un mélange d'un petit nombre de sujets (topics) et que chaque mot de l'amendement a une probabilité plus ou moins forte d'appartenir à chacun des sujets. En fonction de ses mots, chaque amendement sera ensuite classé parmis les sujets que nous aurons définis.
Par exemple, l'amendement 18 traitera à 5% du Topic 1, 80% du Topic 3 et 15% du Topic 8.
Code : Nous commençons par rechercher le nombre de Topics optimal, c'est-à-dire le nombre de sujets différents qui permettre de classifier au mieux les amendements.
model.best_params_
Méthode : Une fois le nombre optimal de topics trouvé, nous allons étudier la répartition des différents amendements de notre corpus parmi ces topics.
Méthode : Nous allons ensuite afficher les mots caractéristiques de chacun de ces topics. Nous décidons d'en afficher 20, mais vous pouvez changer cette valeur dans le code ci-dessous.
Le graphe issu de cette analyse est enregistré automatiquement ici: https://github.com/leximpact/etudes-amendements/tree/main/notebook/graphs/analyse_topics.png
from IPython.core.display import display, HTML
n_top_words = 20
for n_topics in [3, 4, 5, 7, 10, 15]:
#for n_topics in [3, 20]:
# Init the Model
lda_model = LatentDirichletAllocation(
n_components=n_topics, # Number of topics
max_iter=10, # Max learning iterations
learning_decay=0.7, # We find it by gridsearch
learning_method='online',
batch_size=128, # n docs in each learning iter
n_jobs = -1,# Use all available CPUs
)
# On entraîne le modèle sur nos datas
display(HTML(f'<h3>Entraînement avec {n_topics} thématiques</h3>'))
lda_model.fit(data_vectorized)
use_model(lda_model, n_topics, n_top_words)
Analyse des thématiques
Pour le chiffre en début de ligne est le nombre d'amendements de cette thématique. C'est trié sur ce nombre.
à supprimer avant analyse car lié au contexte des amendements : supprimer, article, social, sécurité, numéro, code ?
L'expérimentation ressort souvent mais c'est peut-être lié au fait que c'est un des contournements de l'article 40 ?
Il serait intéressant d'avoir le regard de personnes connaissant le texte.
Pour info, voici les principaux thèmes que l'on pourrait vouloir retrouver : https://www.vivamagazine.fr/plfss-pour-2021-ce-quil-faut-en-retenir/ En supposant que les amendements soient répartis sur toutes les thématiques.
Pour 3 thèmes
Après analyse, on distingue 3 topics. Il semblerait que ces topics soient:
Topic 1 : Les exonérations de cotisations sociales
Topic 2 : Le développement de médicaments et la recherche thérapeutique
Topic 3 : Le financement de la santé
Pour 4 thèmes
- Financement des établissements : santé, article, établissement, soin, charge, pouvoir, financement, social, public, prise, maladie, code, service, permettre, assurance, professionnel, objectif, sécurité, médecin, activité
- Cotisation, prestation, exonération droit et devoir : article, social, sécurité, code, degré, droit, cotisation, devoir, exonération, supprimer, mentionner, prestation, pouvoir, prévoir, entreprise, organisme, travail, dispositif, salarié, famille
- Prix médicament : médicament, article, santé, prix , produit, médical, public, pouvoir, degré, sécurité, patient, devoir, vise, rédiger, cas, dispositif, code, supprimer, an, permettre
- Financement ? pourcent, euro, social, taux, sécurité, contribution, article, million, perte, année, taxe, milliard, entreprise, régime, recette, activité, code, professionnel, cotisation, impôt
Pour 5 thèmes
- 1 409 ??? social, article, sécurité, supprimer, prestation, degré, droit, famille, pouvoir, prévoir, enfant, familial, faire, allocation, branche, code, numéro, disposition, vise, état - 1 327 Financement ? : santé, établissement, soin, article, financement, public, social, service, pouvoir, objectif, patient, dépense, permettre, charge, territoire, prise, activité, expérimentation, code, national
- 707 Prix médicaments : médicament, santé, prix, produit, article, public, médical, pouvoir, sécurité, patient, degré, dispositif, code, rédiger, an, recherche, permettre, vise, insérer, développement - 686 ??? article, code, charge, professionnel, degré, social, travail, sécurité, santé, dispositif, maladie, pouvoir, cotisation, médecin, assurance, activité, devoir, régime, femme, exonération - 668 Contribution des entreprises : social, pourcent, entreprise, article, euro, contribution, code, sécurité, taux, perte, devoir, général, impôt, année, recette, cotisation, concurrence, compenser, organisme, salarié
Pour 7 thèmes
- 1 194 entreprise, exonération social, article, sécurité, code, pourcent, cotisation, euro, entreprise, exonération, devoir, taux, contribution, recette, perte, général, année, mentionner, organisme, impôt, droit
- 1 089 Financement ? : santé, établissement, financement, article, social, soin, public, objectif, dépense, autonomie, service, sécurité, aide, projet, hospitalier, national, activité, naissance, allocation, code
- 915 droit, prestation : article, social, pouvoir, sécurité, droit, prestation, prévoir, code, délai, numéro, professionnel, disposition, vise, organisme, national, rédiger, supprimer, travail, maladie, fonds - 495 expérimentation : article, pouvoir, expérimentation, médecin, dispositif, accès, santé, médical, zone, supprimer, permettre, durée, charge, maladie, famille, soin, état, déjà, devoir, code - 422 Accouchement à domicile ? charge, santé, article, prise, femme, patient, soin, médical, pouvoir, urgence, maladie, maison, assurance, consultation, sage, réaliser, permettre, faire, téléconsultation, pratique - 421 Tiers payant : santé, prix, article, médicament, degré, public, sécurité, produit, code, social, professionnel, recherche, payer, assurance, convention, tiers, développement, maladie, médical, cas - 261 Lien covid ? : médicament, pourcent, france, public, produit, santé, français, pouvoir, mois, pharmaceutique, territoire, faire, stock, sécurité, marché, besoin, taxe, patient, dernier, important
Pour 10 thèmes
- 838 complémentaire : article, santé, charge, maladie, pouvoir, assurance, prise, produit, dispositif, accès, permettre, médical, cas, complémentaire, information, délai, professionnel, état, prestation, sécurité - 821 Financement : article, degré, social, pourcent, code, euro, taux, montant, prévoir, substituer, année, sécurité, revenu, supprimer, conséquence, date, pouvoir, mentionner, remplacer, mois - 579 Médecine de ville : santé, article, soin, social, code, médecin, professionnel, sécurité, femme, établissement, public, libéral, expérimentation, médical, régional, degré, service, prix, territoire, pouvoir - 529 Financement covid : social, sécurité, article, cotisation, régime, recette, pourcent, branche, perte, euro, organisme, contribution, devoir, faire, crise, milliard, supprimer, exonération, taux, état - 467 Financement hôpitaux : établissement, patient, santé, soin, public, devoir, projet, hospitalier, financement, service, pouvoir, urgence, traitement, dotation, qualité, acteur, prise, faire, article, charge - 442 Exonérations : article, entreprise, code, social, exonération, mentionner, cotisation, travail, dispositif, employeur, salarié, devoir, sécurité, général, droit, investissement, impôt, charge, concurrence, emploi - 418 Dépendance : 5° branche : article, autonomie, pouvoir, supprimer, enfant, famille, charge, médical, handicap, parent, besoin, jour, durée, âge, structure, permettre, activité, maladie, proposer, domicile
- 356 financement psychiatrie : santé, financement, activité, établissement, ressource, hôpital, objectif, public, année, territoire, produit, article, national, france, psychiatrie, réforme, an, titre, dépense, pourcent - 196 Industrie : médicament, entreprise, pourcent, sécurité, pharmaceutique, million, public, pouvoir, taux, vente, thérapeutique, contribution, année, france, euro, perte, chiffre, stock, article, affaire - 151 Les allocations : allocation, naissance, familial, prestation, enfant, social, fraude, famille, droit, contre, bénéficiaire, lutte, politique, aeeh, article, place, mode, aah, faire, dépense
Pour 15 thémes
- 705 Legislatif : article, social, degré, code, sécurité, mentionner, prévoir, prestation, rédiger, décret, numéro, application, organisme, pouvoir, disposition, date, service, titre, relatif, janvier - 576 financement : social, sécurité, article, euro, pourcent, exonération, cotisation, supprimer, milliard, recette, crise, branche, faire, entreprise, emploi, état, perte, année, compensation, charge
- 499 expérimentation :santé, charge, prise, médical, maladie, expérimentation, soin, patient, article, assurance, professionnel, pouvoir, permettre, état, complémentaire, dispositif, faire, réaliser, pratique, an
- 444 Hopital : santé, établissement, dépense, public, soin, article, hôpital, hospitalier, financement, objectif, ville, ressource, régional, ondam, national, projet, montant, service, sécurité, assurance - 434 cotisation, social : article, code, cotisation, social, devoir, entreprise, sécurité, droit, organisme, général, activité, concurrence, salarié, employeur, compenser, mentionner, impôt, perte, exonération, professionnel - 416 médecin : médecin, territoire, santé, article, pouvoir, soin, zone, devoir, professionnel, accès, mois, libéral, public, offre, liberté, besoin, territorial, faire, dispositif, nouveau - 379 Médicament : médicament, santé, produit, prix, article, pouvoir, public, sécurité, patient, entreprise, information, dispositif, thérapeutique, devoir, accès, traitement, mois, marché, conséquence, pharmaceutique - 372 5° branche : financement, autonomie, établissement, degré, acteur, activité, santé, pouvoir, vise, réforme, mission, article, aide, national, besoin, proposer, objectif, insérer, domicile, prendre - 273 Allocations familliales : familial, famille, allocation, enfant, prestation, naissance, pourcent, article, euro, pension, droit, bénéficiaire, retraite, prime, parent, handicap, dépense, faire, supprimer, revalorisation - 236 les maisons de naissance : femme, pouvoir, sage, cas, travail, patient, grossesse, substituer, arrêt, maternité, jour, rédactionnel, possibilité, durée, prescription, accouchement, permettre, insérer, devoir, traitement - 171 indemnisation victimes : contribution, pourcent, produit, fonds, degré, maladie, indemnisation, français, titre, compter, article, victime, travailleur, européen, professionnel, transport, travail, france, code, demandeur
- 112 Prix médicament : prix, an, médicament, révision, social, sécurité, service, cas, dotation, code, degré, bout, inférieur, indication, ssiad (services de soins infirmiers à domicile) , géographique, niveau, coefficient, extension, article - 77 COVID ? pourcent, taux, million, médicament, contribution, euro, chiffre, année, affaire, entreprise, perte, sécurité, taxe, répartition, crise, ensemble, marge, pharmaceutique, social, rémunération - 65 investissement, recherche, développement : public, investissement, recherche, développement, euro, part, prix, prendre, montant, dette, financement, revenu, médicament, ehpad, impôt, définition, social, lucratif, priver, aide - 38 Alcool : juge, vin, isolement, contention, détention, alcool, taxe, boisson, vise, faire, article, aromatiser, base, carte, jeune, presse, règlement, judiciaire, conséquence, mainlevée
La conclusion de cette analyse est à réaliser ensemble.