1. Bonjour amis R-addicts,
Nous vous proposons de nous retrouver tous
ensemble le jeudi 2 Avril autour de victuailles pour
conter les glorieuses batailles que nous avons
menées avec R !
2. Meestup R-Addict de l'Avrill ,
de l'An de Grace MMXV
La Grande Queste du Nombre de Participants,
par Sir Barthélémy-François
Oyez, Oyez++ !
3. Historique
● 21 mars 2013 : naissance du Meetup R-Addict
● 3 avril 2014 : premier anniversaire
– Présentation mémorable sur les meetups R dans le monde
– Quels sont les facteurs qui influencent la réussite d'un meetup ?
4.
5.
6. Qui suis-je ?
● Barthélémy-François
● Arrière^36 petit-fils de
Charlemagne
● Docteur ès Sciences
Cognitives de l'Université
Joseph Fourier
● Membre de la confrérie des
chefs de projets R&D
● Spécialisé dans les données
RH
7. La Grande Queste du Nombre
de Participants
● Objectif :
A partir des données collectées sur les différents meetups R dans le monde par Timeri et François,
déterminer quels facteurs influencent le succès d'une rencontre meetup R
● Armes :
– library("plyr")
– library("reshape2")
– library("ggplot2")
– library("tm")
– library("koRpus")
– library("SnowballC")
– library("zoo")
– library("compiler")
– library("indicoio")
10. Acte 1 : l'assault de la grotte du Temps
où comment l'on s'aperçoit que plus le
temps passe et moins il y a de
participants...
11. Qu'est-ce que le temps ?
● events$Date <- as.Date(events$Date) #comme ça c'est clair..
## Calcul du temps entre l'évènement et la création du meetup
● deltaD <-ddply(events,.(Id),.fun = function(x)
{data.frame(tryCatch(x$Date[1]-x$Date, error = function(e) NA))}
,.drop = FALSE)
● events$DateFromOnset <-
as.numeric(deltaD$tryCatch.x.Date.1....x.Date..error...function.e..NA.)
12. L'assaut de la grotte du temps
● Objectif : étudier l'évolution du nombre de
participants aux évènements en fonction de la
date de création du meetup
● Armes :
– library("zoo")
– library("plyr")
– library("ggplot2")
13. Qu'est-ce que le temps ?
● events$Date <- as.Date(events$Date) #comme ça c'est clair..
● ## Calcul du temps entre l'évènement et la création du meetup
● deltaD <-ddply(events,.(Id),.fun = function(x)
{data.frame(tryCatch(x$Date[1]-x$Date, error = function(e) NA))}
,.drop = FALSE)
● events$DateFromOnset <-
as.numeric(deltaD$tryCatch.x.Date.1....x.Date..error...function.e..NA.)
14. Qu'est-ce que le temps ?
● events$Date <- as.Date(events$Date) #comme ça c'est clair..
● ## Calcul du délais depuis le début du groupe
● deltaD <-ddply(events,.(Id),.fun = function(x)
{data.frame(tryCatch(x$Date[1]-x$Date, error = function(e) NA))}
,.drop = FALSE)
● events$DateFromOnset <-
as.numeric(deltaD$tryCatch.x.Date.1....x.Date..error...function.e..NA.)
15. Qu'est-ce que le temps ?
● events$Date <- as.Date(events$Date) #comme ça c'est clair..
● ## Calcul du délais depuis le début du groupe
● deltaD <-ddply(events,.(Id),.fun = function(x)
{data.frame(tryCatch(x$Date[1]-x$Date, error = function(e) NA))}
,.drop = FALSE)
● events$DateFromOnset <-
as.numeric(deltaD$tryCatch.x.Date.1....x.Date..error...function.e..NA.)
17. L'assault du temps
● Essais multiples pour trouver "l'espace de
représentation" offrant le plus possible une
"corrélation" d'"aspect linéaire"
● "meilleur aspect" => log(users) en fonction du
temps
20. Acte 2 : le combast du sac de Mots
où l'on apprend qu'il ne faut surtout pas prononcer
le mot hackaton...
21. Le combast du Sac de Mots
● Objectif : etudier l'influence de la description de
la rencontre sur le nombre de participants
● Armes :
– library("tm")
– library("wordcloud")
– library("slam")
– library("plyr")
22. Unstructured Data & Semantic Analysis: A Behind-the-Scenes Look
Jessica Williamson
Do you understand semantic analysis? Do you want to understand how
raw text is translated into behavioral data? This talk will give you an
intro to the cognitive and behavioral research methods used in semantic
analysis of text data. Examples will be included using manual and
automated techniques to identify patterns. Small and larger scale data
sets will be discussed including the use of algorithms in Hadoop and
MapReduce. Once the raw text is translated into quantitative data,
statistical analyses can be performed on the end product in programs like
R. This talk will focus on the research methods.
BEER and PIZZA will be provided so come and get to know your fellow
Austin UseRs.
Thanks to Revolution Analytics (http://www.revolutionanalytics.com/)
and Bazaarvoice (http://www.bazaarvoice.com/) for their sponsorship!
Thanks to Infochimps (http://www.infochimps.com/) for hosting us!
Un exemple
23. Qu'est-ce qu'un sac de mots ?
● Sac de mot = représentation d'un texte comme une collection
de mots (sans considérer leur ordre)
● Objectif : trouver les mots des descriptions qui attirent le
chaland
● Stratégie :
– Calculer un score de succès pour chaque évènement
– regrouper les descriptions d'évènements en fonction de ce score
– Etudier les sur/sous représentations des mots utilisés dans les
groupes formés
24. Calcul d'un score de succès
● Préliminaire : calculer un score d'intérêt
res <- ddply(events,.(Id),.fun = function(x)
{data.frame(tryCatch((lm(UsersFromOnsetLog~DateFromOns
et,x)$residuals),error = function(e) rep(NA,times = dim(x)[1])))}
,.drop =FALSE)
● events$Interest <-
res$tryCatch..lm.UsersFromOnsetLog...DateFromOnset..x..resi
duals...
25. Constitution de groupes
summary(events$Interest)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-3.93800 -0.28940 0.05662 0.00000 0.36830 2.52200 75
> events$Group <- cut(events$Interest,quantile(events$Interest,na.rm=T))
●
●
●
●
●
●
●
●
●
●
● v qplot(Interest, data=events, color = Group,geom="histogram",binwidth = 0.05)
26. Création de la matrice termes /
documents pour tout le corpus
data <- Corpus(VectorSource(events$Description))
● meta(data,tag = 'Group',type = "local") <- events$Group
● data <- tm_map(data,tolower)
● data <- tm_map(data,stripWhitespace)
● data <- tm_map(data,removePunctuation)
● data <- tm_map(data,removeNumbers)
● data <- tm_map(data,removeWords,stopwords("english"))
● data <- tm_map(data,stemDocument)
● tdm <- TermDocumentMatrix(data)
28. Le tour de passe-passe du renard
● Idée : étudier la sur/sous représentation des mots en fonction
des groupes d'intérêt => chi2 sur une table de contingence
● library("slam")
● tdmG <- rollup(tdm,MARGIN = 2L,events$Group,sum)
#equivalent de la fonction apply pour les matrices creuses
● tdmGl <- removeSparseTerms(tdmG,0.50)
● mattdmGl <- (as.matrix(tdmGl))
30. Le chi2 de Saint Antoine
● res <- chisq.test(mattdmGl)# ce qu'on fait d'habitude
● # Ce qu'on fait pour devenir un saint le temps d'une seconde
test <- apply(as.data.frame(res$expected),1,min)
expWords <- data.frame(res$residuals[as.vector(test)>5,])
● Le résultat :
negwords <- rownames(expWords[expWords$X..3.94..0.289. >2,])
poswords <- rownames(expWords[expWords$X.0.368.2.52. >2,])
33. Quelques recommandations
Préférer plutôt :
"How to forecast the use of Hadoop in Google
Big Data Analytics"
à :
"The friday automn hackaton on using julia to
handle sql requests in a simulink project"
34. tdmpos <- TermDocumentMatrix(data,list(dictionary = poswords))#un seul n a dictionary
res <- findAssocs(tdmpos,poswords[1:64],corlimit = 0.11)
keep <- data.frame(lapply(res,length))
keep <- keep[,keep>0]
par_init <- par()
par(mfrow=c(1,1),cex =0.2)
plot(tdmpos, names(keep), corThreshold=0.11,weighting = T)
35. Acte 3 : la prise de Coeur de Pigeon
où l'on apprend que les sentiments sont plus forts
que les mots...
36. Ya pas que les grands qui s'aiment !
● Sentiment analysis : Sentiment analysis (also known
as opinion mining) refers to the use of natural
language processing, text analysis and
computational linguistics to identify and extract
subjective information in source materials. (wikipédia)
● Par exemple :
– Caractere positif/négatif du discours
– Identification d'émotions (colère, surprise, joie, etc.)
37. La prise de Coeur de Lion
● Objectif : étudier l'influence de l'émotion
dominante du discours sur la participation à un
événement
● Armes :
– library("indicoio")
38. Calcul de l'indice emotionnel du
discours
● ###Sentiment analysis
● sent_score <- vector(mode ="numeric",length =
length(events$Description))
● for (i in 1:length(events$Description))
● {sent_score[i] <-
tryCatch(sentiment(events$Description[i]), error =
function(e) NA)}
● events$Sentiment <- sent_score