Herzlich Willkommen

Live processing contents

Wednesday, January 23, 2013

Mining Tweet Media dengan R

CLUSTER TWEET MEDIA in R


CODE :

#mengambil paket twitteR
require(twitteR)
#mengambil jumlah tweet pada HashTag
aaa2011 <- br="" n="150)" searchtwitter="" urabaya=""># konvert ke frame data
df <- aaa2011="" as.data.frame="" br="" do.call="" lapply="" rbind=""># mendapatkan nama kolum
names(df)
# melihat isi 3 kolum pertama
head(df,3)


# melihat berapa banyak akun twitter yang unik see 
length(unique(df$screenName))


# membuat sebuah kolom nilai random atas username dan menggambar plot 
# melihat berapa banyak nilai random yang kita butuhkan 
n <- br="" df="" length="" screenname="" unique=""># menggenerate sebuah vektor dengan nilai radom untuk me-replace nama tersebut. kita akan mendapatkan  2 digits nilai 
randuser <- 10="" 50="" br="" n="" round="" runif=""># Melakukan matching antara nomor random dengan sebuah username
screenName <- br="" df="" screenname="" unique="">screenName <- as.character="" br="" sapply="" screenname="">randuser <- br="" cbind="" randuser="" screenname=""># sekarang melakukan random dengan nilai data twitter yang ada dan melakukan matching  dengan nilai  pada username 
rand.df  <- br="" by="screenName" df="" merge="" nbsp="" randuser="">

# menentukan frekuensi tweets per akun 
counts <- br="" rand.df="" randuser="" table=""># membuat sebuah frame data urut untuk manipulasi data dan plotting  
countsSort <- count="sort(counts," data.frame="" decreasing="TRUE)," row.names="NULL)<br" user="unlist(dimnames(counts)),"># membuat sebuah subset terhadap siapa yang melakukan tweet paling sedikit 5 kali tweet
countsSortSubset <- count="" countssort="" subset=""> 0)
# melakukan ektrak dan menghitung berapa banyak tweet dari setiap akun yang me-retweet 
# melakukan pembersihan data twitter dengan meremove karakter noise (aneh) 
rand.df$text <- br="" function="" iconv="" rand.df="" row="" sapply="" text="" to="UTF-8"># meremove simbol @ dari username 
trim <- br="" function="" sub="" x="">
require(stringr)
rand.df$to <- br="" function="" name="" rand.df="" sapply="" text="" trim=""># ektraksi data retweet
rand.df$rt <- br="" function="" rand.df="" sapply="" text="" tweet="">  trim(str_match(tweet,"^RT (@[[:alnum:]_]*)")[2]))
# mereplace nama dengan nilai anonim 
randuser <- br="" data.frame="" randuser="">rand.df$rt.rand <- as.character="" br="" match="" rand.df="" randuser="" rt="">                                                         as.character(randuser$screenName))]
# membuat sebuah table yang menganonimasi ID dan nilai RT pada setiap akun
countRT <- br="" rand.df="" rt.rand="" table="">countRTSort <- br="" countrt="" sort=""># melakukan subset tweet RT 
countRTSortSubset <- countrt="" countrtsort="" subset="">2)
# membuat sebuah data frame untuk ploting 
countRTSortSubset.df <-data .frame="" rt_count="as.numeric(unlist(countRTSortSubset)))<br" user="as.factor(unlist(dimnames(countRTSortSubset))),"># mengkombinasikan tweet dan retweet pada data frame 
countUser <- br="" by.x="randuser" by.y="user" countssortsubset="" merge="" randuser="">TweetRetweet <- all.x="TRUE)<br" by.x="randuser" by.y="user" countrtsortsubset.df="" countuser="" merge=""># membuat plot cleveland dari tweet count dan count akun tweet 
# data poin solid = jumlah tweet, R = jumlah retweets
require(ggplot2)
require(grid)
ggplot() + 
  geom_point(data = TweetRetweet, mapping =  aes(reorder(randuser, count), count), size = 3) +
  geom_point(data = TweetRetweet, mapping =  aes(randuser, RT_count), size = 4, shape = "R") +
  xlab("Author") +
  ylab("Number of messages") +
  coord_flip() +
  theme_bw() +
  theme(axis.title.x = element_text(vjust = -0.5, size = 14)) +
  theme(axis.title.y = element_text(size = 14, angle=90)) +
  theme(plot.margin = unit(c(1,1,2,2), "lines"))






# menghitung jumlah follower dari setiap akun twitter  
# ekstrak username dari data set non anonim 
users <- br="" df="" screenname="" unique="">users <- as.character="" br="" sapply="" users=""># membuat sebuah data frame untuk manipulasi lebih lanjut 
users.df <- data.frame="" followers="" stringsasfactors="FALSE)<br" users="users,"># melakukan looping untuk mempopulasikan  users$followers dengan sebuah count follower dari twitter API
for (i in 1:nrow(users.df))
{
  # memunculkan peringatan untuk men-skip user jika akunnya terproteksi 
  # atau jika terdapat beberapa error 
  result <- followerscount="" getuser="" i="" silent="FALSE);<br" try="" users.df="" users="">  if(class(result) == "try-error") next;
  # mendapakan jumlah followeer dari setiap user 
  users.df$followers[i] <- br="" followerscount="" getuser="" i="" users.df="" users=""> 
  print('Sleeping for 60 seconds...')
  Sys.sleep(60);
}
# melakukan merging follower akun dengan jumlah tweet per authors 
followerCounts <- br="" by.x="screenName" by.y="users" merge="" users.df="" weetretweet=""># melakukan konversi menjadi numerik untuk analisis lebih lanjut 
followerCounts$followers <- as.numeric="" br="" followercounts="" followers="">followerCounts$counts <- as.numeric="" br="" counts="" followercounts="" nbsp="">
# membuat sebuah plot
ggplot(data = followerCounts, aes(count, followers)) +
  geom_text(aes(label = randuser, size = RT_count)) +
  scale_size(range=c(3,10)) +
  scale_x_log10(breaks = c(10,20,40,60,80,100)) +
  scale_y_log10(breaks = c(10,100,seq(1000,7000,1000))) +
  xlab("Number of Messages") +
  ylab("Number of Followers") +
  theme_bw()  +
  theme(axis.title.x = element_text(vjust = -0.5, size = 14)) +
  theme(axis.title.y = element_text(size = 14, angle=90)) +
  theme(plot.margin = unit(c(1,1,2,2), "lines"))



# Rasio retweet untuk tweet 
#
# membuat tabel dengan nilai count tweet per orang 
t <- as.data.frame="" br="" nbsp="" rand.df="" randuser="" table=""># membuat tabel dengan count retweet per orang 
rt <- as.data.frame="" br="" nbsp="" rand.df="" rt.rand="" table=""># melakukan kombinasi tweet count dan retweet count per orang 
t.rt <- br="" by="Var1" merge="" rt="" t=""># membuat kolom baru dan menambahkan rasio tweet atau retweet 
t.rt["ratio"] <- br="" req.x="" req.y="" t.rt=""># mengurutkan isi kolom  dan menaruh nama dengan ratio urut 
sort.t.rt <- br="" order="" ratio="" t.rt=""># terkecuali dengan count tweet brjumlah 2 atau lebih sedikit 
sort.t.rt.subset <- req.x="" sort.t.rt="" subset="">2)
#
# menghapus level leftover yang tidak digunakan dari subset 
sort.t.rt.subset.drop <- br="" droplevels="" sort.t.rt.subset=""># melakukan plot  akun secara berurut  terhadap tweets user > 5 tweet
# people > 5 tweets
ggplot(sort.t.rt.subset.drop, aes(reorder(Var1, ratio), ratio)) +
  xlab("Author") +
  ylab("Ratio of messages retweeted by others to original messages")+
  geom_point() +
  coord_flip() +
  theme_bw()  +
  theme(axis.title.x = element_text(vjust = -0.5, size = 14)) +
  theme(axis.title.y = element_text(size = 14, angle=90)) +
  theme(plot.margin = unit(c(1,1,2,2), "lines"))




# ekstraksi pasangan tweeter dan retweet 
rt <- data.frame="" rt="rand.df$rt.rand)<br" user="rand.df$randuser,"># pengambilan hanya pada pasangan unik
rt.u <- br="" na.omit="" rt="" unique=""># mulai melakukan plotting analisys sosial network 
require(igraph)
require (sna)
degree <- br="" sna::degree="">g <- directed="F)<br" graph.data.frame="" rt.u="">g <- as.undirected="" br="" g="">g.adj <- br="" g="" get.adjacency=""># plot grafik network 
gplot(g.adj, usearrows = FALSE,
      vertex.col = "grey",vertex.border = "black",
      displaylabels = FALSE, edge.lwd = 0.01, edge.col 
      = "grey30", vertex.cex = 0.5)
# mendapatkan beberapa atribut network 
gden(g.adj) # density
grecip(g.adj) # reciprocity
gtrans(g.adj) # transitivity
centralization(g.adj, degree)
# menghitung univariate conditional dengan test grafik 
# density
print(cug.gden   <- br="" cug.test="" g.adj="" gden="">plot(cug.gden)
range(cug.gden$rep.stat)
# reciprocity
print(cug.recip   <- br="" cug.test="" g.adj="" grecip="">plot(cug.recip)
range(cug.recip$rep.stat)
# transistivity
print(cug.gtrans <- br="" cug.test="" g.adj="" gtrans="">plot(cug.gtrans)
range(cug.gtrans$rep.stat)
# centralisation
print(cug.cent <- centralization="" cug.test="" fun.arg="list(FUN=degree)))<br" g.adj="">
# mencari berapa komunitas yang eksis dalam network menggunakan walktrap 
g.wc <- g="" modularity="TRUE)<br" steps="1000," walktrap.community="">plot(as.dendrogram(g.wc))
max(g.wc$membership)+1


#-------------------------------------------- END -------------------------------------------------#

No comments:

Post a Comment