Skip to content

Instantly share code, notes, and snippets.

@mitrad
Last active November 26, 2020 04:43
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save mitrad/5895589 to your computer and use it in GitHub Desktop.
Save mitrad/5895589 to your computer and use it in GitHub Desktop.
뉴스타파에서 공개한 국정원 의심 계정의 트윗 데이터 분석
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