뉴스타파에서 공개한 국정원 의심 계정의 트윗 데이터 분석
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
library(KoNLP) | |
library(wordcloud) | |
library(plyr) | |
library(ggplot2) | |
library(scales) | |
tw <- read.delim('./data/NIS.csv', header=T, sep=',', stringsAsFactors=F) | |
tw.RT <- read.delim('./data/NIS_RT.csv', header=T, sep=',', stringsAsFactors=F) | |
tw.all <- read.delim('./data/NIS_withRT.csv', header=T, sep=',', | |
stringsAsFactors=F) | |
names(tw) <- c('No', 'ID', 'Date', 'TW') | |
names(tw.RT) <- names(tw.all) <- c('No', 'Kind', 'ID', 'original.ID', | |
'Date', 'TW') | |
# 사용자 사전에 새로운 단어 등록 | |
useSejongDic() | |
new.word <- c('종북','민주당','새누리당','나꼼수','대선후보', | |
'민통당','박후보','안교수','연평도','인권조례', | |
'인혁당','전교조','좌파','진보','천안함','통진당', | |
'한미동맹', '대한민국', '빨갱이','북한') | |
new.name <- c('안철수','박근혜','문재인','곽노현','금태섭','김대중', | |
'김영삼','노무현', '박정희', '이승만','이정희') | |
mergeUserDic(data.frame(new.word, c('ncn'))) | |
mergeUserDic(data.frame(new.name, c('nqpc'))) | |
reloadAllDic() | |
## 워드 클라우드 함수 정의 | |
wordcloud2 <- function(data=tw, filename="rPlot.png", ...){ | |
data$TW <- gsub("[[:space:]]"," ", data$TW) | |
key.words <- lapply(data$TW, extractNoun) | |
key.words <- unlist(key.words) | |
key.words <- key.words[nchar(key.words)>=2] | |
cnouns <- count(key.words) | |
cnouns$pct <- round(cnouns$freq/nrow(data) *100,3) | |
cnouns <- cnouns[order(cnouns$freq, decreasing=T), ] | |
name <- filename | |
png(name, width=800, height=800) | |
pal <- brewer.pal(8,"Dark2") | |
wordcloud(words=cnouns$x, freq=cnouns$freq, colors=pal, min.freq=10, | |
random.order=F, scale=c(8,0.2), rot.per=.15, max.words=1500) | |
dev.off() | |
return(cnouns) | |
} | |
# 워드 클라우드: 국정원 계정이 직접 작성한 대선 및 정치 관련 트윗 3,744개 | |
NIS1 <- wordcloud2(data=tw, filename="NIS.png", min.freq=10) | |
head(NIS1,10) | |
## 워드 클라우드: 국정원 계정이 작성하거나 RT한 대선 및 정치관련 트윗 59,383개 | |
NIS2 <- wordcloud2(data=tw.RT, filename="NIS2_with_RT.png", min.freq=50) | |
head(NIS2,10) | |
## 워드 클라우드: 국정원 계정이 작성하거나 RT한 대선 및 정치관련 트윗 59,383개 | |
## 중 RT한 트윗 | |
tw.RTonly <- subset(tw.RT, Kind == "리트윗") | |
NIS3 <- wordcloud2(data=tw.RTonly, filename="NIS2_RT_Only.png", min.freq=50) | |
## 워드 클라우드: 국정원 계정이 작성하거나 RT한 전체 트윗 237,494개 | |
NIS4 <- wordcloud2(data=tw.all, filename="NIS3_all.png", min.freq=100) | |
## 워드 클라우드: 국정원 계정이 작성하거나 RT한 전체 트윗 237,494개 중 리트윗 | |
tw.all.RTonly <- subset(tw.all, Kind == "리트윗") | |
NIS5 <- wordcloud2(data=tw.all.RTonly, filename="NIS3_all_RT_Only.png", | |
min.freq=50) | |
## 워드 클라우드: 국정원 계정이 작성하거나 RT한 전체 트윗 237,494개 중 직접 작성 | |
tw.all.NIS <- subset(tw.all, Kind == "직접 작성") | |
NIS6 <- wordcloud2(data=tw.all.NIS, filename="NIS3_all_not_RT.png", | |
min.freq=50) | |
## 정치글을 제외한 트윗글의 워드 클라우드 | |
tw.RT$flag <- 1 | |
tw.all$flag <- 1 | |
merge.set <- merge(tw.RT, tw.all, by = c('Kind', 'ID', 'original.ID', | |
'Date', 'TW'), all=T) | |
diff <- merge.set[which(is.na(merge.set$flag.x)),] | |
tw.diff <- wordcloud2(data=diff, filename="NIS3_all_not_RT.png", | |
min.freq=50) | |
##### | |
tw$Date <- strptime(tw$Date, format="%m/%d/%Y") | |
tw.RT$Date <- as.POSIXlt(tw.RT$Date) | |
tw.all$Date <- as.POSIXlt(tw.all$Date) | |
#### 트윗수 트랜드 | |
# 국정원 계정이 직접 작성한 대선 및 정치 관련 트윗 3,744개 | |
date.tab <- count(tw, vars="Date") | |
date.tab$Date <- as.Date(date.tab$Date) | |
p <- ggplot(date.tab, aes(x=Date, y=freq)) + | |
geom_point(alpha=1/3, size=2, shape=1) | |
p + geom_smooth(size=2, span=0.3, se=F, method="loess", col="#A41034") + | |
theme_bw() + | |
scale_x_date(labels = date_format("%y년 %m월")) + | |
# theme(axis.text.x = element_text(family="Apple SD Gothic Neo")) + | |
ylab("트윗 수") + xlab("") + | |
ggtitle("국정원 계정이 직접 작성한 대선 및 정치 관련 트윗 3,744개") | |
date.tab <- date.tab[order(date.tab$freq, decreasing=T),] | |
head(date.tab, 15) | |
# 국정원 계정이 작성하거나 RT한 대선 및 정치관련 트윗 59,383개 | |
tw.RT$Kind <- factor(tw.RT$Kind, level=c("직접 작성", "리트윗")) | |
date.tab <- count(tw.RT, vars=c("Date","Kind")) | |
date.tab$Date <- as.Date(date.tab$Date) | |
p <- ggplot(date.tab, aes(x=Date, y=freq, colour=Kind, group=Kind)) + | |
geom_point(alpha=.6, size=2, shape=1) + scale_colour_hue(l=50) + | |
facet_grid(Kind ~ . , scales="free_y") + | |
scale_x_date(labels = date_format("%y년 %m월")) + | |
xlab("") + ylab("트윗 수") + | |
theme_bw() | |
p + geom_smooth(size=2, span=.3, se=F, method="loess", show.guide=F) + | |
theme(legend.position="none") + | |
ggtitle("국정원 계정이 작성하거나 RT한 대선 및 정치관련 트윗 59,383개") | |
date.tab <- date.tab[order(date.tab$freq, decreasing=T),] | |
head(date.tab, 10) | |
range(tw.all$Date) | |
# 국정원 계정이 작성하거나 RT한 전체 트윗 237,494개 | |
tw.all$Kind <- factor(tw.all$Kind, level=c("직접 작성", "리트윗")) | |
date.tab <- count(tw.all, vars=c("Date","Kind")) | |
date.tab$Date <- as.Date(date.tab$Date) | |
p <- ggplot(date.tab, aes(x=Date, y=freq, colour=Kind, group=Kind)) + | |
geom_point(alpha=.6, size=2, shape=1) + scale_colour_hue(l=50) + | |
facet_grid(Kind ~ . , scales="free_y") + | |
scale_x_date(labels = date_format("%y년 %m월")) + | |
xlab("") + ylab("트윗 수") + | |
theme_bw() | |
p + geom_smooth(size=2, span=.3, se=F, method="loess", show.guide=F) + | |
theme(legend.position="none") + | |
ggtitle("국정원 계정이 작성하거나 RT한 전체 트윗 237,494개") | |
date.tab <- date.tab[order(date.tab$freq, decreasing=T),] | |
head(subset(date.tab, Kind == "직접 작성"), 10) | |
range(tw$Date) | |
###### | |
## 요일별 트윗수 | |
tw$weekday <- tw$Date$wday | |
tw.all$weekday <- tw.all$Date$wday | |
tw.RT$weekday <- tw.RT$Date$wday | |
ggplot(tw.all, aes(x=as.character(weekday), fill=Kind)) + | |
geom_histogram() + scale_colour_hue(l=50) + | |
guides(fill=guide_legend(reverse=T)) + | |
theme(axis.text.x = element_text(size=15)) + | |
scale_x_discrete(labels=c("일", "월", "화", "수", "목", "금", "토")) + | |
theme_bw() + xlab("") + ylab("트윗 수") + | |
theme(legend.title=element_blank()) | |
###### | |
# 가장 많은 트윗을 한 아이디 | |
ID.table1 <- count(tw.RT, vars=c("ID")) | |
ID.table1 <- ID.table1[order(ID.table1$freq, decreasing=T), ] | |
ggplot(head(ID.table1,10), aes(x=freq, y=reorder(ID,freq))) + | |
geom_segment(aes(yend=ID), xend=0, colour="grey50") + | |
geom_point(size=5, alpha=2/3, colour="darkred") + | |
theme_bw() + | |
theme(panel.grid.major.y = element_blank()) + | |
ylab("") + xlab("트윗 수") + xlim(0,max(ID.table1$freq)) | |
original <- subset(tw.RT, Kind=="직접 작성") | |
ID.table2 <- count(original, vars="ID") | |
ID.table2 <- ID.table2[order(ID.table2$freq, decreasing=T), ] | |
ggplot(head(ID.table2,10), aes(x=freq, y=reorder(ID,freq))) + | |
geom_segment(aes(yend=ID), xend=0, colour="grey50") + | |
geom_point(size=5, alpha=2/3, colour="darkgreen") + | |
theme_bw() + | |
theme(panel.grid.major.y = element_blank()) + | |
ylab("") + xlab("트윗 수") + xlim(0,max(ID.table1$freq)) | |
RT <- subset(tw.RT, Kind=="리트윗") | |
ID.table3 <- count(RT, vars="ID") | |
ID.table3 <- ID.table3[order(ID.table3$freq, decreasing=T), ] | |
ggplot(head(ID.table3,10), aes(x=freq, y=reorder(ID,freq))) + | |
geom_segment(aes(yend=ID), xend=0, colour="grey50") + | |
geom_point(size=5, alpha=2/3, colour="darkblue") + | |
theme_bw() + | |
theme(panel.grid.major.y = element_blank()) + | |
ylab("") + xlab("트윗 수") + xlim(0,max(ID.table1$freq)) | |
## | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment