Que nous a dit Emmanuel Macron dans son discours du 10/12/18, d’un peu plus de 12 minutes ?
Bon, 12 minutes, ça ne nous fait pas énormément de matière (959 termes, une fois retirés les petits mots de français comme « je », « c’est », « de », etc.), mais voyons voir ce qu’il s’y trouve.
Nuage de mots du discours d’Emmanuel Macron du 10/12/18
Bon, il veut plus… Si l’on s’intéresse aux 374 noms (communs ou propres) du discours, les plus fréquents sont :
Si on regarde les formes verbales (sans les déclinaisons, pluriels etc.) :
Pas de référence directe aux « gilets jaunes », mais ça tout le monde l’avait entendu. J’ai retenu ici les mots qui apparaissent plus de trois fois dans le discours, mais nous pouvons constater que l’impôt et la colère occupe la majorité de son propos. Nous pouvons voir la recherche de l’unité du pays (avec les mots « pays », « ensemble », « français », »citoyen », »peuple »), l’ « engagement » envers un « changement » (« question », « débat ») (qui passerait par le « travail » et l’ « impôt » ?)… Et les enfants, que viennent-ils faire dans tout ça ?
[text1, 372] moyens de faire garder les | enfants | et d'améliorer ses fins de
[text1, 424] à la fois parents et | enfants | et ne s'en sortent pas
[text1, 866] , une France où nos | enfants | vivront mieux que nous.
Ah, ça ressemble à de l’appel à de l’émotion…
Justement, du côté de la tonalité du discours, qu’elles sont les émotions de notre Président ? Pour cette analyse, j’utilise la traduction française du dictionnaire NRC (dont on pourrait vouloir modifier certaines catégorisations) qui classifie les mots en 10 catégories : 2 sentiments (positifs, négatifs) et 8 émotions (colère, peur, anticipation, confiance, joie, dégoût, surprise, tristesse). Alors, qu’en est-il ?
Le discours est plutôt positif (de pas beaucoup), avec un sentiment de confiance qui domine la tristesse, la colère et la peur. L’anticipation nous montre à nouveau une certaine volonté d’aller de l’avant. Et quels sont les mots qui expriment ces sentiments ?
La couleur et la taille dépendent des occurrences des mots. Et plus précisément ?
La taille des mots dépend de leur fréquence dans le discours. Si on entre un peu plus dans le détails : (Comme les mots peuvent avoir plusieurs sentiments associés, l’échelle des abscisses n’est pas très lisible.)
Il est clair que le sujet principal semble être le malaise du pays. La volonté d’en sortir de ce malaise est présente (« réussir », »partager », « courage », « amélioration »), et les solutions seraient du côté d’une « prime », du « vote »,de l’ « impôt », … La figure de la « mère » semble en appeler au cœur de chacun d’entre nous (la mère patrie, la mère qui ne peut plus nourrir ses enfants, …).
Bon, je vous laisse analyser, en attendant un travail plus approfondi sur ce que nous dit le Président…
Petite astuce pour créer des sous-jeux de données en fonction d’une variable de groupe :
Ici, le jeu de données complet est « tbl », notre variable de groupe « acteur ». On commence par créer un tableau récap’ des niveaux de la variable « acteur » :
acteur<-tbl%>%group_by(acteur)%>%
count(acteur)
Ensuite, on utilise une boucle for pour les différents niveaux de la variable, et la fonction « assign(le_nom, les_données) » nous permet de créer les différents jeux de données associés ! for(i in acteur$acteur){
assign(paste0("tbl",i),tbl%>%
filter(acteur==i))
}
Le corpus est constitué de phrases où chaque partie (mots) relève de catégories grammaticales différentes : des substantifs, des adjectifs, des verbes, des pronoms, …
Il peut être particulièrement intéressant d’identifier ces catégories. Par exemple, dans une analyse du sentiment, on peut souhaiter de ne s’intéresser qu’aux adjectifs pour ce concentrer sur les éléments expressifs du contenu, ou dans une analyse de topics de ne la réaliser que sur les verbes pour identifier des modalités d’action. Une des applications purement linguistique est d’employer l’étiquetage PoS pour des tâches de désambigüisation.
Dans r plusieurs solutions sont proposées. Une première est proposée par RDRPOSTagger que nous n’avons pas encore testé mais qui semble à première vue d’une grande simplicité d’usage. D’autres sont proposées sur cette page. Un autre exemple est donnée ici. pour aller plus loin lire ceci.
La publication d’ouvrages, en français, sur, avec, sous, de, pour r semble s’accélérer. Au moins deux sommes doivent être signalées, elles vont être des ressources précieuses :
Le premier est l’ouvrage monumental publié par Insee – Eurostat – sous la direction de Vincent Loonis et coordonné par Marie-Pierre de Bellefon. Il rassemble des ressources précieuses pour ceux qui sont amenés à utiliser des données géolocalisées et à manier la cartographie.
Manuel d’analyse spatiale – Théorie et mise en œuvre pratique avec R Insee Méthodes n° 131 – octobre 2018
Le second dirigé par François Husson est publié par les PUR
Une procédure de r en associe les éléments en produisant une visualisation d’une double typologie faite sur les lignes et les colonnes ( les individus et les variables. La fonction heatmap en donne les ressources.
Dans l’exemple, constitué par Elias Benavent – étudiant en histoire à l’Université de Bordeaux, il s’agit d’un tableau binaire donnant la participation de près de 300 artistes et techniciens aux albums de David Bowie. En voici le code ( détaillé) avec heatmap.2 qui demande le package gplot :
library(gplot)
x<-as.matrix(AlbumStrict)
heatmap.2(x,
notecol="black", # change font color of cell labels to black
density.info="none", # turns off density plot inside color legend
trace="none", # turns off trace lines inside the heat map
margins =c(12,9), # widens margins around plot
col=cm.colors(2), # use on color palette defined earlier
dendrogram="both", # draw a row and column dendrogram
cexRow=0.6,cexCol=0.8,
srtCol=45,
Colv=TRUE,
RowSideColors=cm.colors(48),ColSideColors=cm.colors(27))
D’autres représentations sont possibles, l’analyse d’un graphe bipartite avec igraph (et un layout mds) donne le résultat suivant.
library(reshape2)
Edge<-AlbumStrict
Edge$Artiste<-rownames(Edge)
Edge<-melt(Edge,by=c(Artiste)) #construire le fichier des arcs (Edge)
Edge<-subset(Edge, value==1) #ne garder que ceux qui sont effectifs
library(igraph)
#graphe bipartite
V(g)$type <- bipartite.mapping(g)$type
col <- c("white", "orange")
shape <- c("circle", "square")
plot(g, layout=layout.mds, vertex.label.cex=c(0.7), edge.arrow.size=0.2,vertex.size=c(8),
vertex.color = col[as.numeric(V(g)$type)+1],
vertex.shape = shape[as.numeric(V(g)$type)+1.5]
)
et le résultat
Ne reste plus qu’à identifier les groupes de musiciens et la logique de participation. Là c’est le travail de l’historien qui reprend la partie, l’analyse de l’outil n’est qu’un outil de clarification. Et pour aller plus loin dans la technique on ira lire le blog Digital History Methods
Et sur David Bowie on ira regarder le beau travail musicologique et quantitatif de Leah Kardos (données accessibles).
Le package treemap est particulièrement utile pour représenter une distribution entre de nombreux modalités, et sous-modalités, d’une variable qualitative.
On en trouvera des exemple ici. et la documentation là. Une bonne application avec la résolution de petits problèmes courants, est donnée dans r-blogger
Les voyages sont faits pour être vécus mais ce qui en reste ce sont des mots. Des livres de voyageurs, le journal de bord des marins, et aujourd’hui le commentaire des expériences de consommation. A l’heure du post-exotisme ( pas celui-ci), quand le touriste pense rencontrer une culture authentique mais bien souvent façonnée par son propre regard, ce qui compte est moins ce que l’on a vécu que ce que l’on en garde : des selfies et le commentaire des lieux de séjours. C’est certainement moins poétique que Cooket Gauguin, mais plus profitable pour l’industrie du tourisme.
Et c’est à l’occasion d’un de ces voyages, avec l’aide des collègues du Cetop, des étudiants du master de marketing de l’UPF, et l’écoute du team de Tahiti tourisme, que nous nous sommes lancés dans l’analyse des sentiments exprimés par les touristes à propos de leur séjour avec une petite incursion dans les packages de text mining de r. Il n’y avait pas de meilleure place pour apprécier la critiques des auberges du paradis.
Pour la méthode, il s’agit d’abord de scrapper, avec les ressources du package rvest, le site de TripAdvisor. La Polynésie est isolée, trouvant ses clients dans trois grands bassins à plus de 10h de vol : l’Asie , les EU et la France. Il y a environ 150 hôtels et 300 pensions. Les résultats donnés dans cette note, sont établis sur la base d’une première extraction centrée sur Tahiti et portant sur 7700 commentaires. On généralisera plus tard sur les 77000 commentaires sur l’ensemble des archipels.
Ce corpus fait l’objet de deux types d’analyses comme on commence à le faire systématiquement dans ce type d’exercice : mesurer la tonalité positive ou négative (le sentiment) et les sujets évoqués ( topic analysis). Pour la première, on emploie tidytext, pour la seconde le modèle LDA du package Topicmodels.
Voici la présentation de travail (demo), avec quelques éléments de code, rendez-vous au piurn 2018 pour une présentation plus complète.
Le choix des couleurs est souvent laissé aux options par défaut, pourtant à défaut d’un designer, l’usage de certaines palettes est utile pour un joli rendu.
On a un faible pour stargazerqui permet de présenter les résultats des estimations de plusieurs modèles de régression (de toutes sortes) dans des tableaux rigoureux en txt, latex ou html. La fonction peut se limiter à peu de chose ( mais si on plonge dans la syntaxe de très nombreux contrôles sont possibles).
Le tableau analysé comprend toutes les paires orientées (Prêteurs ->Emprunteurs) donc un identificateur prêteur et un autre emprunteur. 2500 paires (arcs) sont analysées. Chaque arc est caractérisé par le nombre de transactions effectuées.
Dans la première ligne on indique que le graphe est orienté et que les nœuds sont identifiés par id . La seconde ligne commande le mode de représentation. On a choisi ici un algorithme de force kk (kamada-kawai ). C’est un choix classique de représentation des similarités utile quand le nombre d’objets représentés est grand.
g <- graph.data.frame(G, directed=TRUE, vertice=Id)
l <- layout_with_kk(g)
V(g)$label <- NA
V(g)$size <- 1*log(Id$Total)
E(g)$arrow.size <- 0.2*G$pret #épaisseur des arcs en fonction du nb de prets entre deux personnes
plot(g,layout=l)
La signature du graphe est donnée dans l’histogramme suivant de la distribution du nombre d’arc accordées aux nœuds. C’est une distribution clairement négative exponentielle, peut-être puissance.Le graph log log avec le package poweRlaw, permet d’y répondre (on emprunte le code à Ruliana ).
deg <- degree(g, mode="all")
hist(deg, breaks=1:vcount(g)-1, main="Histogram of node degree",xlim=c(0,50))
library("poweRlaw")
library(ggplot2)
# Just loading my data
G.degrees <- degree(g)
# Let's count the frequencies of each degree
G.degree.histogram <- as.data.frame(table(G.degrees))
# Need to convert the first column to numbers, otherwise
# the log-log thing will not work (that's fair...)
G.degree.histogram[,1] <- as.numeric(G.degree.histogram[,1])
# Now, plot it!
ggplot(G.degree.histogram, aes(x = G.degrees, y = Freq)) +
geom_point() +
scale_x_continuous("Degree\n(nodes with this amount of connections)",
breaks = c(1, 3, 10, 30, 100, 300),
trans = "log10") +
scale_y_continuous("Frequency\n(how many of them)",
breaks = c(1, 3, 10, 30, 100, 300, 1000),
trans = "log10") +
ggtitle("Degree Distribution (log-log)") +
theme_bw()+ geom_smooth(method='lm')
On peut raffiner en sélectionnant des nœuds ou des arcs. Ici on supprime les arcs entre des paires à échange unique, ce qui éclaircit le graphique.
h <- delete_edges(g, E(g)[pret<2]) #supprime les arc inférieur à
plot(h,layout=l)
Identifier les influenceurs
On peut faire varier la taille des nœuds en fonction de leurs caractéristiques, dans l’exemple suivant on la définit comme proportionnelle au « degré » des nœuds en calculant d’abord cette variable à partir de la fonction degree et du graphe g. Ce qui met mieux en valeur les nœuds centraux, et le nuage des échanges uniques.
plot(g, vertex.size=deg*0.1)
L’analyse peut être un peu plus compliquée et on peut chercher à évaluer l’Autorité et la Centralité des agents qui échangent. On utilise pour cela les fonctions hub_score et authority_score, calculé comme le score sur la première composante de A’A, respectivement AA’, sur la base du modèle Hits de Jon Kleinberg, « Authoritative sources in a hyperlinked environment », Journal of the ACM, vol. 46, no 5, , p. 604-632 (DOI10.1145/324133.324140, lire en ligne).
hs <- as.data.frame(hub_score(g, weights=NA)$vector)
hs$owner_email<-row.names(hs)
hs$hub<-hs$`hub_score(g, weights = NA)$vector`
as <- as.data.frame(authority_score(g, weights=NA)$vector)
as$receiver_email<-row.names(as)
as$authority<-as$`authority_score(g, weights = NA)$vector`
par(mfrow=c(1,2)) #pour juxtaposer les graphes
plot(g, vertex.size=hs$hub, main="Hubs : prêtent à de nombreuses pers.")
plot(g, vertex.size=as$authority*8, main="Authorities : empruntent aux hubs")
Dernière étape : utiliser les scores pour prédire la réalisation des transactions. Dans quelle mesure la place des individus dans le réseaux détermine la conclusion de la transaction. En effet dans le jeu de données traitées, à chaque transaction est associé un code indiquant si elle s’est conclue effectivement par une transaction.
La transaction se réalisera en fonction des caractéristiques des acteurs, et notamment leur score de hub et d’autorité. C’est une première hypothèse. La seconde porte sur l’expérience :quand des acteurs répète un échange, en principe si tout ce passe bien la confiance s’installe avec l’habitude. Elle est indiquée par le nombre d’échanges précédant la transaction considérée.
Testons cela par un modèle logit dans lequel la variable dépendante est le caractère achevé ou non de l’échange, et les déterminants soit le nombre d’échanges déjà réalisés entre les co-échangeurs, leur score de hub pour le prêteur, celui d’autorité pour l’emprunteur.
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.2354367 0.0480797 -25.696 < 2e-16 *** NbEchanges 0.1027380 0.0130098 7.897 2.86e-15 *** emprunteur -0.1273704 0.0216152 -5.893 3.80e-09 *** preteur 0.0005308 0.0025613 0.207 0.836 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 5954.5 on 5505 degrees of freedom Residual deviance: 5827.3 on 5502 degrees of freedom AIC: 5835.3 Number of Fisher Scoring iterations: 4 Rcmdr> exp(coef(GLM.4)) # Exponentiated coefficients ("odds ratios")
(Intercept) pret.y emprunteur preteur
0.2907078 1.1082010 0.8804075 1.0005310
On s’aperçoit que l’expérience est un facteur clé, avec un odd radio de 1.108, de même le score d’autorité, mais dans un sens négatif : plus le score est élevé moins la probabilité de conclure est élevée. Ceci ce comprend dans la mesure où l’autorité reflète la propension des emprunteurs à beaucoup empruntés, ils sont en position de choix et d’une certaine manière mettent en concurrence les prêteurs. Quant à ces derniers, l’effet de réputation qui pourrait résulter de leur engagement (ils prêtent beaucoup) n’est pas significatif à ce stade.
Vous devez être connecté pour poster un commentaire.