텍스트마이닝 기법을 이용한 2024년 공화당 대선후보 수락 트럼프 연설내용 시각화하기

2024년 7월 19일(현지 일자)에 도널드 트럼프의 대선후보 수락 연설이 있었습니다. 이 스피치를 기반으로 R을 이용하여 텍스트마이닝 기법을 적용하여 시각화 작업을 해보았습니다. 이 작업을 위한 소스코드를 작성하고 스텝바이스텝으로 설명을 드리도록 하겠습니다.

이번 포스트에서 사용되는 텍스트마이닝 기법을 사용하여서 영문으로 작성된 각종 텍스트 정보에 대해 단어 빈도 분석, 워드클라우드 생성, 감성 분석, 바이그램 분석 등 다양한 분석을 시도해 보시기 바랍니다. 굳이 텍스트마이닝 사이트를 찾아 헤맬 필요가 없습니다.

데이터 시각화는 복잡한 데이터를 시각적으로 표현하여 이해를 돕는 중요한 기술입니다. 특히, 텍스트 데이터의 경우 시각화를 통해 숨겨진 패턴과 통찰을 발견할 수 있습니다. 트럼프의 연설을 분석하여 단어 빈도 등을 시각화함으로써 연설의 주요 주제와 분위기를 파악할 수 있습니다.

텍스트마이닝 기법을 위한 R 소스코드

필요한 패키지 설치 및 로드

먼저, 필요한 R 패키지를 설치하고 로드합니다. 이 코드는 필요한 패키지를 자동으로 설치하고 로드합니다.

# 필요한 패키지 설치 및 로드
required_packages <- c("tidytext", "dplyr", "ggplot2", "stringr", "igraph", "ggraph", "readr", "textdata", "wordcloud2", "htmlwidgets", "tidyr", "showtext")

# 설치되지 않은 패키지 확인 및 설치
new_packages <- required_packages[!(required_packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)

# 패키지 로드
lapply(required_packages, require, character.only = TRUE)
showtext_auto()

이 코드는 필요한 모든 패키지를 설치하고 로드합니다. showtext_auto() 함수는 글꼴을 자동으로 로드하여 ggplot2 그래프에서 텍스트가 깨지지 않도록 합니다.

텍스트 파일 읽기

텍스트 파일을 읽고 단어로 토큰화합니다. 텍스트 파일은 뉴욕타임스에서 공개한 웹페이지를 활용하여서 만들었습니다.

# 텍스트 파일 읽기(file_path는 자신의 폴더에 맞추시기 바랍니다.)
file_path <- "C:\\R\\Trump_2024_RNC_Acceptance_Speech.txt"
text <- read_file(file_path)

# 텍스트를 단어로 토큰화
words <- tibble(text = text) %>%
unnest_tokens(word, text)

# 불용어 제거
data(stop_words)
words <- words %>%
anti_join(stop_words)

이 코드는 텍스트 파일을 읽어 들인 후, 텍스트를 단어 단위로 분리하고 불용어를 제거합니다. 불용어는 의미 없는 단어를 의미하는데 이를 제외하면 분석의 정확성을 높일 수 있습니다.

1. 단어 빈도 분석

단어 빈도 분석을 통해 연설에서 가장 자주 사용된 단어를 확인합니다.

# 단어 빈도 분석
word_freq <- words %>%
count(word, sort = TRUE)

ggplot(word_freq[1:20,], aes(x = reorder(word, n), y = n, label = n)) +
geom_col() +
geom_text(hjust = -0.1, color = "black") +
coord_flip() +
labs(title = "Top 20 Words in Trump's 2024 RNC Acceptance Speech", x = "Word", y = "Frequency")

이 코드는 상위 20개의 단어와 그 빈도를 그래프로 시각화합니다. 각 단어의 빈도를 막대그래프로 표시하고, 빈도 수를 레이블로 추가합니다.

단어 빈도 분석 텍스트마이닝 기법

이 막대 그래프는 도널드 트럼프의 2024년 RNC 수락 연설에서 가장 자주 등장한 상위 20개의 단어를 보여줍니다. 가장 두드러진 단어로는 “people(사람들)”, “country(국가)”, “we’re(우리는)”가 있으며, 이는 집단 정체성과 국가에 대한 초점을 나타냅니다. “America(미국)”, “world(세계)”, “administration(행정부)”와 같은 단어가 많이 등장하는 것은 정부와 글로벌 문제에 대한 주제를 암시합니다.

2. 워드클라우드 생성

워드클라우드를 사용하여 단어의 빈도를 시각적으로 나타냅니다.

# 워드클라우드 생성
set.seed(1234) # 재현 가능성을 위한 시드 설정
wordcloud_data <- word_freq %>%
filter(n > 1) %>% # 최소 2번 이상 등장한 단어만 포함
head(100) # 상위 100개 단어만 사용

# 워드클라우드 생성
wc <- wordcloud2(data = wordcloud_data,
size = 1,
color = "random-dark",
backgroundColor = "white",
rotateRatio = 0.3,
shape = "circle")

# HTML 파일로 저장
saveWidget(wc, "wordcloud_trump_2024.html", selfcontained = TRUE)

이 코드는 상위 100개의 단어로 워드클라우드를 생성합니다. wordcloud2 패키지를 사용하여 다양한 옵션을 설정할 수 있습니다.

워드클라우드 텍스트마이닝 기법

이 워드 클라우드는 연설에서 가장 많이 사용된 단어들을 시각화한 것으로, 단어의 크기는 빈도를 나타냅니다. “country(국가)”, “people(사람들)”, “we’re(우리는)”와 같은 주요 단어들이 두드러집니다. “love(사랑)”, “beautiful(아름다운)”, “America(미국)” 등 다양한 단어들이 포함되어 있으며, 이는 연설에서 애국심, 찬사, 긍정적 주제들이 강조되었음을 보여줍니다.

3. 감성 분석

연설의 감성을 분석하여 긍정적 또는 부정적인 단어의 빈도를 확인합니다.

# 감성 분석
sentiments <- get_sentiments("bing")
sentiment_analysis <- words %>%
inner_join(sentiments) %>%
count(sentiment) %>%
pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) %>%
mutate(sentiment = positive - negative)

print(sentiment_analysis)

이 코드는 연설에서 긍정적, 부정적 단어의 빈도를 계산하고, 그 차이를 통해 전체적인 감성을 평가합니다.

감성 분 텍스트마이닝 기법

이 표는 연설의 감성 분석을 요약한 것입니다. 연설에는 290개의 부정적인 단어와 329개의 긍정적인 단어가 포함되어 있으며, 이는 순 긍정 감성 점수 39를 나타냅니다. 이는 전반적으로 약간 더 긍정적인 톤을 보임을 의미합니다.

4. 바이그램 분석

단어 쌍(바이그램)을 분석하여 자주 함께 사용된 단어 쌍을 확인합니다.

# 바이그램 분석
bigrams <- tibble(text = text) %>%
unnest_tokens(bigram, text, token = "ngrams", n = 2)

bigram_counts <- bigrams %>%
separate(bigram, c("word1", "word2"), sep = " ") %>%
filter(!word1 %in% stop_words$word) %>%
filter(!word2 %in% stop_words$word) %>%
count(word1, word2, sort = TRUE)

# 상위 15개 바이그램 시각화
bigram_graph <- bigram_counts[1:15,] %>%
graph_from_data_frame()

ggraph(bigram_graph, layout = "fr") +
geom_edge_link(aes(edge_alpha = n), show.legend = FALSE) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), vjust = 1, hjust = 1) +
theme_void() +
labs(title = "Top 15 Bigrams in Trump's 2024 RNC Acceptance Speech")

이 코드는 상위 15개의 단어 쌍을 시각화하여 연설에서 자주 함께 사용된 단어 쌍을 보여줍니다.

바이그램 시각화

이 그래프는 연설에서 가장 많이 사용된 상위 15개의 바이그램(두 단어로 이루어진 구)을 보여줍니다. “they’re coming(그들이 오고 있다)”, “border patrol(국경 순찰)”, “illegal aliens(불법 이민자)”와 같은 구절은 이민 문제에 대한 우려를 나타냅니다. “incredible people(놀라운 사람들)”, “worst administration(최악의 행정부)”와 같은 다른 중요한 바이그램은 칭찬과 비판의 주제를 드러냅니다.

5. TF-IDF 분석

TF-IDF 분석을 통해 문장에서 중요한 단어를 확인합니다.

r코드 복사# 문장을 단위로 나누기
sentences <- tibble(sentence = unlist(str_split(text, "\\. "))) %>%
mutate(sentence_id = row_number())

tfidf <- sentences %>%
unnest_tokens(word, sentence) %>%
count(sentence_id, word, sort = TRUE) %>%
bind_tf_idf(word, sentence_id, n)

# 상위 TF-IDF 단어 시각화
tfidf %>%
arrange(desc(tf_idf)) %>%
mutate(word = factor(word, levels = rev(unique(word)))) %>%
group_by(sentence_id) %>%
top_n(5) %>%
ungroup() %>%
ggplot(aes(word, tf_idf, fill = sentence_id)) +
geom_col(show.legend = FALSE) +
labs(x = NULL, y = "tf-idf", title = "Top TF-IDF Words by Sentence in Trump's Speech") +
facet_wrap(~sentence_id, ncol = 2, scales = "free") +
coord_flip()

이 코드는 각 문장에서 TF-IDF 값이 높은 단어를 시각화하여 중요한 단어를 파악합니다.(이 부분은 조금 더 보완이 필요할 것 같습니다.)

TF-IDF 시각화

이 플롯은 문장별로 상위 TF-IDF(용어 빈도-역 문서 빈도) 단어를 보여주며, 연설의 다양한 부분에서 사용된 독특하고 중요한 용어들을 강조합니다. 각 단어의 중요성은 TF-IDF 점수로 나타나며, “economy(경제)”, “jobs(일자리)”, “taxes(세금)”와 같은 단어들이 특정 문장에서 중요한 주제를 반영합니다.

6. 주제별 단어 빈도 분석

주제별로 단어 빈도를 분석하여 연설에서 다룬 주요 주제를 확인합니다.

# 주제별 단어 빈도 분석
topics <- c("economy", "immigration", "foreign_policy", "social_issues")
topic_words <- list(
economy = c("economy", "jobs", "taxes", "inflation", "business"),
immigration = c("border", "immigration", "illegal", "wall"),
foreign_policy = c("war", "peace", "military", "allies", "enemies"),
social_issues = c("education", "healthcare", "crime", "family", "values")
)

topic_frequency <- words %>%
mutate(topic = case_when(
word %in% topic_words$economy ~ "Economy",
word %in% topic_words$immigration ~ "Immigration",
word %in% topic_words$foreign_policy ~ "Foreign Policy",
word %in% topic_words$social_issues ~ "Social Issues",
TRUE ~ "Other"
)) %>%
count(topic) %>%
filter(topic != "Other")

ggplot(topic_frequency, aes(x = reorder(topic, n), y = n, fill = topic)) +
geom_col() +
coord_flip() +
labs(title = "Frequency of Topics in Trump's 2024 RNC Acceptance Speech",
x = "Topic", y = "Frequency") +
theme_minimal()

이 코드는 연설에서 다룬 주요 주제별 단어 빈도를 시각화하여, 각 주제의 중요성을 파악할 수 있습니다.

주제별 단어 빈도 시각화

이 막대 그래프는 트럼프 연설의 주제를 경제, 이민, 외교 정책, 사회 문제로 분류하여 주제별 빈도를 보여줍니다. 경제는 가장 많이 논의된 주제이며, 그 다음으로 이민, 외교 정책, 사회 문제가 뒤따릅니다. 이 분류는 연설의 주요 초점 영역을 드러내며, 경제 문제와 이민 문제에 대한 강조를 보여줍니다.

공통적인 실수와 해결 방법

데이터 전처리의 중요성

텍스트 데이터 분석에서 가장 중요한 것은 데이터 전처리입니다. 불용어 제거, 텍스트 정규화, 철자 수정 등은 분석의 정확성을 크게 향상시킵니다. 이러한 작업을 소홀히 하면 분석 결과가 왜곡될 수 있습니다.

적절한 시각화 도구 선택

분석 목적에 맞는 시각화 도구를 선택하는 것이 중요합니다. 예를 들어, 단어 빈도 분석에는 막대 그래프가 효과적이지만, 감성 분석에는 파이 차트나 막대 그래프가 더 적합할 수 있습니다. 다양한 시각화 도구를 사용하여 데이터를 다각도로 분석하는 것이 좋습니다.

전체 소스 코드 및 결과

위에서 다룬 모든 코드를 종합하여 다시 한번 요약합니다.

# 필요한 패키지 설치 및 로드
required_packages <- c("tidytext", "dplyr", "ggplot2", "stringr", "igraph", "ggraph", "readr", "textdata", "wordcloud2", "htmlwidgets", "tidyr", "showtext")
new_packages <- required_packages[!(required_packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)
lapply(required_packages, require, character.only = TRUE)
showtext_auto()

# 텍스트 파일 읽기
file_path <- "C:\\R\\Project\\secondlife-r\\Trump_2024_RNC_Acceptance_Speech.txt"
text <- read_file(file_path)

# 텍스트를 단어로 토큰화 및 불용어 제거
words <- tibble(text = text) %>%
unnest_tokens(word, text) %>%
anti_join(stop_words)

# 단어 빈도 분석
word_freq <- words %>%
count(word, sort = TRUE)
ggplot(word_freq[1:20,], aes(x = reorder(word, n), y = n, label = n)) +
geom_col() +
geom_text(hjust = -0.1, color = "black") +
coord_flip() +
labs(title = "Top 20 Words in Trump's 2024 RNC Acceptance Speech", x = "Word", y = "Frequency")

# 워드클라우드 생성
set.seed(1234)
wordcloud_data <- word_freq %>%
filter(n > 1) %>%
head(100)
wc <- wordcloud2(data = wordcloud_data, size = 1, color = "random-dark", backgroundColor = "white", rotateRatio = 0.3, shape = "circle")
saveWidget(wc, "wordcloud_trump_2024.html", selfcontained = TRUE)

# 감성 분석
sentiments <- get_sentiments("bing")
sentiment_analysis <- words %>%
inner_join(sentiments) %>%
count(sentiment) %>%
pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) %>%
mutate(sentiment = positive - negative)
print(sentiment_analysis)

# 바이그램 분석
bigrams <- tibble(text = text) %>%
unnest_tokens(bigram, text, token = "ngrams", n = 2)
bigram_counts <- bigrams %>%
separate(bigram, c("word1", "word2"), sep = " ") %>%
filter(!word1 %in% stop_words$word) %>%
filter(!word2 %in% stop_words$word) %>%
count(word1, word2, sort = TRUE)
bigram_graph <- bigram_counts[1:15,] %>%
graph_from_data_frame()
ggraph(bigram_graph, layout = "fr") +
geom_edge_link(aes(edge_alpha = n), show.legend = FALSE) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), vjust = 1, hjust = 1) +
theme_void() +
labs(title = "Top 15 Bigrams in Trump's 2024 RNC Acceptance Speech")

# TF-IDF 분석
sentences <- tibble(sentence = unlist(str_split(text, "\\. "))) %>%
mutate(sentence_id = row_number())
tfidf <- sentences %>%
unnest_tokens(word, sentence) %>%
count(sentence_id, word, sort = TRUE) %>%
bind_tf_idf(word, sentence_id, n)
tfidf %>%
arrange(desc(tf_idf)) %>%
mutate(word = factor(word, levels = rev(unique(word)))) %>%
group_by(sentence_id) %>%
top_n(5) %>%
ungroup() %>%
ggplot(aes(word, tf_idf, fill = sentence_id)) +
geom_col(show.legend = FALSE) +
labs(x = NULL, y = "tf-idf", title = "Top TF-IDF Words by Sentence in Trump's Speech") +
facet_wrap(~sentence_id, ncol = 2, scales = "free") +
coord_flip()

# 주제별 단어 빈도 분석
topics <- c("economy", "immigration", "foreign_policy", "social_issues")
topic_words <- list(
economy = c("economy", "jobs", "taxes", "inflation", "business"),
immigration = c("border", "immigration", "illegal", "wall"),
foreign_policy = c("war", "peace", "military", "allies", "enemies"),
social_issues = c("education", "healthcare", "crime", "family", "values")
)
topic_frequency <- words %>%
mutate(topic = case_when(
word %in% topic_words$economy ~ "Economy",
word %in% topic_words$immigration ~ "Immigration",
word %in% topic_words$foreign_policy ~ "Foreign Policy",
word %in% topic_words$social_issues ~ "Social Issues",
TRUE ~ "Other"
)) %>%
count(topic) %>%
filter(topic != "Other")
ggplot(topic_frequency, aes(x = reorder(topic, n), y = n, fill = topic)) +
geom_col() +
coord_flip() +
labs(title = "Frequency of Topics in Trump's 2024 RNC Acceptance Speech", x = "Topic", y = "Frequency") +
theme_minimal()

위 코드를 실행하면 트럼프의 연설을 다양한 측면에서 분석한 결과를 얻을 수 있습니다. 각 분석은 연설의 주요 단어, 감성, 바이그램, TF-IDF, 주제별 빈도 등을 시각화하여 연설의 전반적인 내용을 이해하는 데 도움을 줍니다.

마무리

전체적으로, 도널드 트럼프의 2024년 RNC 수락 연설은 “people(사람들)”, “country(국가)”, “America(미국)”와 같은 단어의 빈도가 높은 것을 통해 국가 정체성과 애국심 주제를 강하게 강조하고 있음을 알 수 있습니다. 연설은 이민 및 행정부 비판과 같은 문제들을 다루면서도 순 긍정 감성을 유지하고 있습니다. 특정 주제, 특히 경제와 이민에 대한 초점은 트럼프의 주요 정치적 우선순위와 일치합니다. TF-IDF 분석과 바이그램 시각화에서 확인된 상세한 단어 사용과 중요한 구절들은 이러한 주제를 더욱 부각시키며, 연설의 내용과 초점을 종합적으로 이해할 수 있게 합니다.

이번 포스트에서는 R을 사용하여 텍스트 데이터를 분석하고 시각화하는 방법을 다뤘습니다. 트럼프의 연설을 예시로 사용하여 다양한 텍스트마이닝 기법을 살펴보았습니다. 이 방법들을 통해 텍스트 데이터에서 유의미한 통찰을 얻을 수 있기를 바랍니다.

**RNC: “Republican National Committee”의 약자로, 미국 공화당의 전국 위원회를 의미합니다. RNC는 공화당의 공식 조직으로, 당의 전략을 기획하고 선거 캠페인을 지원하며 당의 주요 행사를 조직합니다. 여기에는 대선 후보를 지명하는 전당대회(Republican National Convention)도 포함됩니다.

유사한 게시물