ch0nny_log

[빅데이터분석] R _ 42. 데이터 시각화 7 (워드 클라우드 그래프 (2)) 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 42. 데이터 시각화 7 (워드 클라우드 그래프 (2))

chonny 2024. 7. 4. 11:05
★ 점심시간 문제
cbs 라디오 그대와 여는 아침에 노래는 주로 어떤 노래들이 반복해서 선곡되는지 워드 클라우드로 확인하세요.
김용신의_그대와_여는_아침_선곡표_7월부터_9월까지.txt
0.08MB



김용신의_그대와_여는_아침_선곡표_7월부터_9월까지

install.packages("wordcloud2")
install.packages("tm")
install.packages("RColorBrewer")
install.packages("plyr")
install.packages("data.table")

# 라이브러리 로드
library(wordcloud2)
library(tm)
library(RColorBrewer)
library(plyr)
library(data.table)

# 텍스트 데이터 로드
setwd("c:\\data") 
file_path <- "김용신의_그대와_여는_아침_선곡표_7월부터_9월까지.txt"
txt <- readLines(file_path, encoding = "UTF-8")

# 특수문자 제거 및 공백 처리
cleaned_txt <- iconv(txt, "UTF-8", "UTF-8", sub="")
cleaned_txt <- gsub("[^[:alnum:][:space:]]", " ", cleaned_txt)
cleaned_txt <- gsub("\\s+", " ", cleaned_txt)  # 연속된 공백 제거

# 텍스트를 Corpus로 변환
corpus <- Corpus(VectorSource(cleaned_txt))

# 데이터 전처리
corpus <- tm_map(corpus, content_transformer(tolower))  # 소문자로 변환
corpus <- tm_map(corpus, removePunctuation)  # 구두점 제거
corpus <- tm_map(corpus, removeNumbers)  # 숫자 제거
corpus <- tm_map(corpus, removeWords, stopwords("en"))  # 영어 불용어 제거
corpus <- tm_map(corpus, stripWhitespace)  # 여백 제거

# 불필요한단어 빼기

# 단어 행렬 생성
dtm <- TermDocumentMatrix(corpus)
m <- as.matrix(dtm)
word_freqs <- sort(rowSums(m), decreasing = TRUE)
word_freq_df <- data.frame(word = names(word_freqs), freq = word_freqs)


# 워드 클라우드 생성 (하트 모양)
wordcloud2(data = word_freq_df, shape = "heart", color = brewer.pal(8, "Dark2"))​

■ 감정분석 데이터 분석
문제 1. 조바이든 연설문을 워드 클라우드로 시각화 하시오 

joe.txt
0.00MB
trump.txt
0.00MB



# 패키지 설치 및 라이브러리 로드
install.packages("wordcloud2")
install.packages("tm")
install.packages("RColorBrewer")
install.packages("htmlwidgets")
install.packages("webshot")
install.packages("magick")
install.packages("ggplot2")
install.packages("grid")

library(wordcloud2)
library(tm)                    # 문자를 정제하고 전처리하기 위해 필요
library(RColorBrewer)    
library(htmlwidgets)       # html 위젯을 생성하기 위해 필요합니다.
library(webshot)            # html 파일을 png 그림파일로 저장하기 위해
library(magick)              # 이미지 파일을 읽고 변환하기 위한 패키지
library(ggplot2)
library(grid)                  # 두개의 그래프를 하나의 화면에 출력하기 위해 필요

# PhantomJS 설치
webshot::install_phantomjs()   # webshot 패키지를 위해 필요한 패키지

# 텍스트 데이터 로드
setwd("c:\\data")
biden_file_path <- "joe.txt"
biden_txt <- readLines(biden_file_path, encoding = "UTF-8")

# 특수문자 제거 및 공백 처리
cleaned_txt <- iconv(biden_txt, "UTF-8", "UTF-8", sub="")
cleaned_txt <- gsub("[^[:alnum:][:space:]]", " ", cleaned_txt)
cleaned_txt <- gsub("\\s+", " ", cleaned_txt)

# 텍스트를 Corpus로 변환
corpus <- Corpus(VectorSource(cleaned_txt))

# 데이터 전처리
corpus <- tm_map(corpus, content_transformer(tolower))  # 소문자변환
corpus <- tm_map(corpus, removePunctuation)  # 구두점 제거
corpus <- tm_map(corpus, removeNumbers)  # 숫자 제거
corpus <- tm_map(corpus, removeWords, stopwords("en")) # 불용어 제거
corpus <- tm_map(corpus, stripWhitespace)  # 공백만 있는 행 제거

# 단어 행렬 생성
dtm <- TermDocumentMatrix(corpus)  # 단어 행렬 만들기
m <- as.matrix(dtm)                         # 행렬형태로 변환
word_freqs <- sort(rowSums(m), decreasing = TRUE)  # 빈도수 높은 단어로 정렬
word_freq_df <- data.frame(word = names(word_freqs), freq = word_freqs) 
word_freq_df

# 상위 100개의 단어만 선택
word_freq_df <- head(word_freq_df, 100)

# 워드 클라우드 생성
word_cloud <- wordcloud2(data = word_freq_df, shape = "circle", color = brewer.pal(8, "Dark2"))

# htmlwidgets로 워드 클라우드를 저장
saveWidget(word_cloud, "biden_cloud.html", selfcontained = TRUE)

# 워드 클라우드를 이미지로 저장
webshot("biden_cloud.html", file = "biden_cloud.png", delay = 10)

# magick으로 이미지 불러오기
biden_img <- image_read("biden_cloud.png")

# ggplot으로 이미지 변환
biden_plot <- ggplot() + 
  annotation_custom(rasterGrob(biden_img, width=unit(1,"npc"), height=unit(1,"npc"))) + 
  theme_void()

# 플롯 출력
print(biden_plot)
biden_cloud.html
0.08MB
문제 2. 위와같이 트럼프 연설문도 시각화하시오.
# 패키지 설치 및 라이브러리 로드
install.packages("wordcloud2")
install.packages("tm")
install.packages("RColorBrewer")
install.packages("htmlwidgets")
install.packages("webshot")
install.packages("magick")
install.packages("ggplot2")
install.packages("grid")

library(wordcloud2)
library(tm)
library(RColorBrewer)
library(htmlwidgets)
library(webshot)
library(magick)
library(ggplot2)
library(grid)

# PhantomJS 설치
webshot::install_phantomjs()

# 텍스트 데이터 로드
setwd("c:\\data")
biden_file_path <- "joe.txt"
positive_words_file <- "positive-words.txt"

biden_txt <- readLines(biden_file_path, encoding = "UTF-8")

#긍정단어 불러오기
positive_words <- readLines(positive_words_file, encoding = "UTF-8")

# 특수문자 제거 및 공백 처리
cleaned_txt <- iconv(biden_txt, "UTF-8", "UTF-8", sub="")
cleaned_txt <- gsub("[^[:alnum:][:space:]]", " ", cleaned_txt)
cleaned_txt <- gsub("\\s+", " ", cleaned_txt)

# 텍스트를 Corpus로 변환
corpus <- Corpus(VectorSource(cleaned_txt))

# 데이터 전처리
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("en"))
corpus <- tm_map(corpus, stripWhitespace)

# 단어 행렬 생성
dtm <- TermDocumentMatrix(corpus)
m <- as.matrix(dtm)
word_freqs <- sort(rowSums(m), decreasing = TRUE)
word_freq_df <- data.frame(word = names(word_freqs), freq = word_freqs)

# 긍정 단어 필터링
positive_word_freq_df <- word_freq_df[word_freq_df$word %in% positive_words, ]

# 상위 100개의 단어만 선택
positive_word_freq_df <- head(positive_word_freq_df, 100)

# 워드 클라우드 생성
positive_cloud <- wordcloud2(data = positive_word_freq_df, shape = "circle", color = brewer.pal(8, "Dark2"))

# htmlwidgets로 워드 클라우드를 저장
saveWidget(positive_cloud, "positive_cloud.html", selfcontained = TRUE)

# 워드 클라우드를 이미지로 저장
webshot("positive_cloud.html", file = "positive_cloud.png", delay = 10)

# magick으로 이미지 불러오기
positive_img <- image_read("positive_cloud.png")

# ggplot으로 이미지 변환
positive_plot <- ggplot() + 
  annotation_custom(rasterGrob(positive_img, width=unit(1,"npc"), height=unit(1,"npc"))) + 
  theme_void()

# 플롯 출력
print(positive_plot)​
 
trump_cloud.html
0.08MB
문제 3. 조바이든 연설문에는 긍정단어가 얼마나 나오는지 워드 클라우드로 시각화 하시오
데이터: 영문 긍정단어, 영문 부정단어

negative-words.txt
0.05MB











문제 3. 트럼프 연설문에는 긍정단어가 얼마나 나오는지 워드 클라우드로 시각화 하시오
데이터: 영문 긍정단어, 영문 부정단어
# 패키지 설치 및 라이브러리 로드
install.packages("wordcloud2")
install.packages("tm")
install.packages("RColorBrewer")
install.packages("htmlwidgets")
install.packages("webshot")
install.packages("magick")
install.packages("ggplot2")
install.packages("grid")

library(wordcloud2)
library(tm)
library(RColorBrewer)
library(htmlwidgets)
library(webshot)
library(magick)
library(ggplot2)
library(grid)

# PhantomJS 설치
webshot::install_phantomjs()

# 텍스트 데이터 로드
setwd("c:\\data")
trump_file_path <- "trump.txt"
positive_words_file <- "positive-words.txt"

trump_txt <- readLines(trump_file_path, encoding = "UTF-8")
positive_words <- readLines(positive_words_file, encoding = "UTF-8")

# 특수문자 제거 및 공백 처리
cleaned_txt <- iconv(trump_txt, "UTF-8", "UTF-8", sub="")
cleaned_txt <- gsub("[^[:alnum:][:space:]]", " ", cleaned_txt)
cleaned_txt <- gsub("\\s+", " ", cleaned_txt)

# 텍스트를 Corpus로 변환
corpus <- Corpus(VectorSource(cleaned_txt))

# 데이터 전처리
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("en"))
corpus <- tm_map(corpus, stripWhitespace)

# 단어 행렬 생성
dtm <- TermDocumentMatrix(corpus)
m <- as.matrix(dtm)
word_freqs <- sort(rowSums(m), decreasing = TRUE)
word_freq_df <- data.frame(word = names(word_freqs), freq = word_freqs)

# 긍정 단어 필터링
positive_word_freq_df <- word_freq_df[word_freq_df$word %in% positive_words, ]

# 상위 100개의 단어만 선택
positive_word_freq_df <- head(positive_word_freq_df, 100)

# 워드 클라우드 생성
positive_cloud <- wordcloud2(data = positive_word_freq_df, shape = "circle", color = brewer.pal(8, "Dark2"))

# htmlwidgets로 워드 클라우드를 저장
saveWidget(positive_cloud, "positive_cloud.html", selfcontained = TRUE)

# 워드 클라우드를 이미지로 저장
webshot("positive_cloud.html", file = "positive_cloud.png", delay = 10)

# magick으로 이미지 불러오기
positive_img <- image_read("positive_cloud.png")

# ggplot으로 이미지 변환
positive_plot <- ggplot() + 
  annotation_custom(rasterGrob(positive_img, width=unit(1,"npc"), height=unit(1,"npc"))) + 
  theme_void()

# 플롯 출력
print(positive_plot)​

문제 4. 바이든 연설문에서 긍정단어를 워드클라우드로 그리는데 하나의 화면에 같이 출력되게하시오. 
# 패키지 설치 및 라이브러리 로드
install.packages("wordcloud2")
install.packages("tm")
install.packages("RColorBrewer")
install.packages("plyr")
install.packages("data.table")
install.packages("patchwork")
install.packages("htmlwidgets")
install.packages("webshot")
install.packages("magick")
install.packages("ggplot2")
install.packages("grid")

library(wordcloud2)
library(tm)
library(RColorBrewer)
library(plyr)
library(data.table)
library(patchwork)
library(htmlwidgets)
library(webshot)
library(magick)
library(ggplot2)
library(grid)

# PhantomJS 설치
webshot::install_phantomjs()

# 텍스트 데이터 로드
biden_file_path <- "joe.txt"
positive_words_file <- "positive-words.txt"
negative_words_file <- "negative-words.txt"

biden_txt <- readLines(biden_file_path, encoding = "UTF-8")
positive_words <- readLines(positive_words_file, encoding = "UTF-8")
negative_words <- readLines(negative_words_file, encoding = "UTF-8")

# 특수문자 제거 및 공백 처리
cleaned_txt <- iconv(biden_txt, "UTF-8", "UTF-8", sub="")
cleaned_txt <- gsub("[^[:alnum:][:space:]]", " ", cleaned_txt)
cleaned_txt <- gsub("\\s+", " ", cleaned_txt)

# 텍스트를 Corpus로 변환
corpus <- Corpus(VectorSource(cleaned_txt))

# 데이터 전처리
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("en"))
corpus <- tm_map(corpus, stripWhitespace)

# 단어 행렬 생성
dtm <- TermDocumentMatrix(corpus)
m <- as.matrix(dtm)
word_freqs <- sort(rowSums(m), decreasing = TRUE)
word_freq_df <- data.frame(word = names(word_freqs), freq = word_freqs)

# 긍정 단어 및 부정 단어 필터링
positive_word_freq_df <- word_freq_df[word_freq_df$word %in% positive_words, ]
negative_word_freq_df <- word_freq_df[word_freq_df$word %in% negative_words, ]

# 상위 100개의 단어만 선택
positive_word_freq_df <- head(positive_word_freq_df, 100)
negative_word_freq_df <- head(negative_word_freq_df, 100)

# 워드 클라우드 생성
positive_cloud <- wordcloud2(data = positive_word_freq_df, shape = "circle", color = brewer.pal(8, "Dark2"))
negative_cloud <- wordcloud2(data = negative_word_freq_df, shape = "circle", color = brewer.pal(8, "Reds"))

# htmlwidgets로 각각의 워드 클라우드를 저장
saveWidget(positive_cloud, "positive_cloud.html", selfcontained = TRUE)
saveWidget(negative_cloud, "negative_cloud.html", selfcontained = TRUE)

# 두 개의 htmlwidgets을 한 화면에 표시
webshot("positive_cloud.html", file = "positive_cloud.png", delay = 10)
webshot("negative_cloud.html", file = "negative_cloud.png", delay = 10)

# magick으로 이미지 불러오기
positive_img <- image_read("positive_cloud.png")
negative_img <- image_read("negative_cloud.png")

# ggplot으로 이미지 변환
positive_plot <- ggplot() + 
  annotation_custom(rasterGrob(positive_img, width=unit(1,"npc"), height=unit(1,"npc"))) + 
  theme_void()

negative_plot <- ggplot() + 
  annotation_custom(rasterGrob(negative_img, width=unit(1,"npc"), height=unit(1,"npc"))) + 
  theme_void()

# patchwork로 두 이미지를 하나의 화면에 표시
combined_plot <- positive_plot + negative_plot

# 플롯 출력
print(combined_plot)​


문제 5. 트럼연설문에서 긍정단어를 워드클라우드로 그리는데 하나의 화면에 같이 출력되게하시오.
# 패키지 설치 및 라이브러리 로드
install.packages("wordcloud2")
install.packages("tm")
install.packages("RColorBrewer")
install.packages("plyr")
install.packages("data.table")
install.packages("patchwork")
install.packages("htmlwidgets")
install.packages("webshot")
install.packages("magick")
install.packages("ggplot2")
install.packages("grid")

library(wordcloud2)
library(tm)
library(RColorBrewer)
library(plyr)
library(data.table)
library(patchwork)
library(htmlwidgets)
library(webshot)
library(magick)
library(ggplot2)
library(grid)

# PhantomJS 설치
webshot::install_phantomjs()

# 텍스트 데이터 로드
trump_file_path <- "trump.txt"
positive_words_file <- "positive-words.txt"
negative_words_file <- "negative-words.txt"

trump_txt <- readLines(trump_file_path, encoding = "UTF-8")
positive_words <- readLines(positive_words_file, encoding = "UTF-8")
negative_words <- readLines(negative_words_file, encoding = "UTF-8")

# 특수문자 제거 및 공백 처리
cleaned_txt <- iconv(trump_txt, "UTF-8", "UTF-8", sub="")
cleaned_txt <- gsub("[^[:alnum:][:space:]]", " ", cleaned_txt)
cleaned_txt <- gsub("\\s+", " ", cleaned_txt)

# 텍스트를 Corpus로 변환
corpus <- VCorpus(VectorSource(cleaned_txt))

# 데이터 전처리
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("en"))
corpus <- tm_map(corpus, stripWhitespace)

# 단어 행렬 생성
dtm <- TermDocumentMatrix(corpus)
m <- as.matrix(dtm)
word_freqs <- sort(rowSums(m), decreasing = TRUE)
word_freq_df <- data.frame(word = names(word_freqs), freq = word_freqs)

# 긍정 단어 및 부정 단어 필터링
positive_word_freq_df <- word_freq_df[word_freq_df$word %in% positive_words, ]
negative_word_freq_df <- word_freq_df[word_freq_df$word %in% negative_words, ]

# 상위 100개의 단어만 선택
positive_word_freq_df <- head(positive_word_freq_df, 100)
negative_word_freq_df <- head(negative_word_freq_df, 100)

# 워드 클라우드 생성
positive_cloud <- wordcloud2(data = positive_word_freq_df, shape = "circle", color = brewer.pal(8, "Dark2"))
negative_cloud <- wordcloud2(data = negative_word_freq_df, shape = "circle", color = brewer.pal(8, "Reds"))

# htmlwidgets로 각각의 워드 클라우드를 저장
saveWidget(positive_cloud, "positive_cloud.html", selfcontained = TRUE)
saveWidget(negative_cloud, "negative_cloud.html", selfcontained = TRUE)

# 두 개의 htmlwidgets을 한 화면에 표시
webshot("positive_cloud.html", file = "positive_cloud.png", delay = 10)
webshot("negative_cloud.html", file = "negative_cloud.png", delay = 10)

# magick으로 이미지 불러오기
positive_img <- image_read("positive_cloud.png")
negative_img <- image_read("negative_cloud.png")

# ggplot으로 이미지 변환
positive_plot <- ggplot() + 
  annotation_custom(rasterGrob(positive_img, width=unit(1,"npc"), height=unit(1,"npc"))) + 
  theme_void()

negative_plot <- ggplot() + 
  annotation_custom(rasterGrob(negative_img, width=unit(1,"npc"), height=unit(1,"npc"))) + 
  theme_void()

# patchwork로 두 이미지를 하나의 화면에 표시
combined_plot <- positive_plot + negative_plot

# 플롯 출력
print(combined_plot)​