1. Executive Summary

Laporan ini bertujuan untuk menyajikan analisis eksplorasi data awal (Exploratory Data Analysis) sebagai langkah dasar pengembangan algoritma prediksi kata dan aplikasi web Shiny. Proyek ini memproses corpus teks bahasa Inggris yang terdiri dari tiga sumber data: dokumen blogs, news, dan twitter. Fokus utama analisis ini adalah pembersihan data, pembuatan struktur N-gram, serta perencanaan model prediktif yang efisien dan ringan memori.

2. Basic Data Summary

Berikut adalah tabel statistik dasar dari ketiga dataset teks asli sebelum proses sampling dan pembersihan data dilakukan:

# Menghitung statistik file asli
size_blogs <- file.info("en_US.blogs.txt")$size / (1024^2)
size_news <- file.info("en_US.news.txt")$size / (1024^2)
size_twitter <- file.info("en_US.twitter.txt")$size / (1024^2)

blogs <- readLines("en_US.blogs.txt", encoding = "UTF-8", skipNul = TRUE)
news <- readLines("en_US.news.txt", encoding = "UTF-8", skipNul = TRUE)
twitter <- readLines("en_US.twitter.txt", encoding = "UTF-8", skipNul = TRUE)

summary_table <- data.frame(
  File_Name = c("en_US.blogs.txt", "en_US.news.txt", "en_US.twitter.txt"),
  File_Size_MB = round(c(size_blogs, size_news, size_twitter), 2),
  Line_Count = c(length(blogs), length(news), length(twitter)),
  Word_Count = c(sum(stri_count_words(blogs)), sum(stri_count_words(news)), sum(stri_count_words(twitter)))
)

kable(summary_table, caption = "Tabel 1: Statistik Ringkasan Dataset Teks")
Tabel 1: Statistik Ringkasan Dataset Teks
File_Name File_Size_MB Line_Count Word_Count
en_US.blogs.txt 200.42 899288 37546806
en_US.news.txt 196.28 1010206 34761151
en_US.twitter.txt 159.36 2360148 30096690

3. Exploratory Data Analysis & Visualizations

Untuk keperluan pemrosesan yang efisien, diambil sampel sebesar 1% dari total data. Teks diseragamkan menjadi huruf kecil, tanda baca serta angka dihapus, kemudian dipisah menjadi struktur unigram, bigram, dan trigram.

set.seed(123)
sample_blogs <- sample(blogs, length(blogs) * 0.01)
sample_news <- sample(news, length(news) * 0.01)
sample_twitter <- sample(twitter, length(twitter) * 0.01)

raw_sample <- c(sample_blogs, sample_news, sample_twitter)

corpus <- VCorpus(VectorSource(raw_sample))
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, stripWhitespace)

df_sample <- data.frame(text = unlist(sapply(corpus, `[`, "content")), stringsAsFactors = FALSE)

unigrams <- df_sample %>% unnest_tokens(word, text) %>% count(word, sort = TRUE)
bigrams <- df_sample %>% unnest_tokens(bigram, text, token = "ngrams", n = 2) %>% count(bigram, sort = TRUE)
trigrams <- df_sample %>% unnest_tokens(trigram, text, token = "ngrams", n = 3) %>% count(trigram, sort = TRUE)

Top 15 Unigram (Kata Tunggal)

unigrams %>%
  head(15) %>%
  ggplot(aes(x = reorder(word, n), y = n)) +
  geom_col(fill = "steelblue") +
  coord_flip() +
  labs(title = "Top 15 Unigram Paling Sering Muncul", x = "Kata", y = "Frekuensi") +
  theme_minimal()

Top 15 Bigram (Pasangan 2 Kata)

bigrams %>%
  head(15) %>%
  ggplot(aes(x = reorder(bigram, n), y = n)) +
  geom_col(fill = "darkgreen") +
  coord_flip() +
  labs(title = "Top 15 Bigram Paling Sering Muncul", x = "Bigram", y = "Frekuensi") +
  theme_minimal()

Top 15 Trigram (Pasangan 3 Kata)

trigrams %>%
  head(15) %>%
  ggplot(aes(x = reorder(trigram, n), y = n)) +
  geom_col(fill = "coral") +
  coord_flip() +
  labs(title = "Top 15 Trigram Paling Sering Muncul", x = "Trigram", y = "Frekuensi") +
  theme_minimal()

4. Next Steps: Pemodelan & Aplikasi Shiny

Berdasarkan temuan eksplorasi data di atas, langkah selanjutnya yang akan dilakukan adalah:

  1. Pengembangan Model Prediksi:
  1. Pengembangan Aplikasi Shiny: