#heatmap Bowie and friends

bowie et ses musiciens

L’analyse multidimensionnelle est une vieille affaire des statistiques. Dès les années trente, avec naturellement les analyses typologiques de la biologie, l’analyse factorielle à la Thurstone, l’analyse multidimensionnelle des similarité (mds) à la Kruskall.

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))

Le Le code et les données sont ici.

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

bipartite rogneNe 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).

 

Publicités

Analyse des échanges collaboratifs avec igraph

blog1

analyse du réseau d’échange.

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)

blog01

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))

blog02

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')

blog03

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)

blog04

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)

blog05

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 ACMvol. 46, no 5,‎ p. 604-632  (DOI10.1145/324133.324140lire 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")

hub et authorité

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.