Library

library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Set Location

setwd("C:\\Users\\FARHAN ABDILLAH\\Documents\\SURE 2024")

Data

data <- read_excel("Data Gelarrasa (1).xlsx")
head(data)
## # A tibble: 6 × 2
##   full_text                                                              Label…¹
##   <chr>                                                                  <chr>  
## 1 "ANGKA AMIN PREDIKSI SLOVAKIA 01 NOVEMBER  2023  • ANGKA MAIN • 1… N      
## 2 "@Melihat_Indo Apa aku bilang kan.dukungan utk pak Ganjar selalu ada"  P      
## 3 "@Gus_Raharjo Fokus untuk memenangkan pak ganjar mahfud untuk indones… P      
## 4 "@KangManto123 @jokowi @ganjarpranowo @prabowo @aniesbaswedan @susipu… P      
## 5 "@ariaranti ï¸\u008fï¸\u008f  Engga apa-apa lah, partai yang satu itu… P      
## 6 "@AlianiFebriana @prabowo @kikysaputrii salam dari WT https://t.co/w9… P      
## # … with abbreviated variable name ¹​Labeling

Eksplorasi Data

label_counts <- data %>%
  count(Labeling)

# Membuat plot
ggplot(label_counts, aes(x = Labeling, y = n, fill = Labeling)) +
  geom_bar(stat = "identity") +
  labs(title = "Distribusi Labeling",
       x = "Labeling",
       y = "Frekuensi") +
  theme_minimal()

Data Pre-processing

Filtering Data

data <- data %>% 
  filter(!is.na(Labeling))

Remove Punctuation

Cleaning adalah proses di mana karakter yang dianggap tidak penting seperti nama pengguna (@), hashtag (#), URL, tanda baca, angka, dan emoticon dihapus dari teks.

library(stringr)

clean_text <- function(text) {
  if (!is.na(text) && !is.null(text)) {
    text <- str_replace_all(text, "@\\S+", "")  # remove @username
    text <- str_replace_all(text, "#\\w+", "")  # remove #hashtag
    text <- str_replace_all(text, "http\\S+|www.\\S+", "")  # remove urls
    text <- str_replace_all(text, "[^a-zA-Z]", " ")  # remove non alphabetic characters
  } else {
    text <- ""
  }
  return(text)
}

data$full_text <- sapply(data$full_text, clean_text)
data <- as.data.frame(data)
head(data)
##                                                                                                                                                                                                                                    full_text
## 1 ANGKA AMIN PREDIKSI SLOVAKIA    NOVEMBER            ANGKA MAIN               ANGKA IKUT               COLOK BEBAS        amp         TOP    LINE  D                                                                       SHIO     MONYET 
## 2                                                                                                                                                                                      Apa aku bilang kan dukungan utk pak Ganjar selalu ada
## 3                                                                                                                                                                  Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju
## 4                                                                                                                                                lah jgn koar  palestiana nih sodara yg dekat dulu perlu di perbaiki ketahanan pangan nya   
## 5                                                       Engga apa apa lah  partai yang satu itu kan hiburan banget  Mana seragamnya lucu lucu  Salam kenal  Ranti  Jadi selama ini  pernah dapat pengalaman paling tak terlupakan           
## 6                                                                                                                                                                                                                             salam dari WT 
##   Labeling
## 1        N
## 2        P
## 3        P
## 4        P
## 5        P
## 6        P
str(data)
## 'data.frame':    1000 obs. of  2 variables:
##  $ full_text: chr  "ANGKA AMIN PREDIKSI SLOVAKIA    NOVEMBER            ANGKA MAIN               ANGKA IKUT               COLOK BEB"| __truncated__ " Apa aku bilang kan dukungan utk pak Ganjar selalu ada" " Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju" "      lah jgn koar  palestiana nih sodara yg dekat dulu perlu di perbaiki ketahanan pangan nya   " ...
##  $ Labeling : chr  "N" "P" "P" "P" ...

Tokenize

library(tokenizers)
## Warning: package 'tokenizers' was built under R version 4.2.3
data$tokens <- tokenize_words(data$full_text)
head(data,3)
##                                                                                                                                                                                                                                    full_text
## 1 ANGKA AMIN PREDIKSI SLOVAKIA    NOVEMBER            ANGKA MAIN               ANGKA IKUT               COLOK BEBAS        amp         TOP    LINE  D                                                                       SHIO     MONYET 
## 2                                                                                                                                                                                      Apa aku bilang kan dukungan utk pak Ganjar selalu ada
## 3                                                                                                                                                                  Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju
##   Labeling
## 1        N
## 2        P
## 3        P
##                                                                                                               tokens
## 1 angka, amin, prediksi, slovakia, november, angka, main, angka, ikut, colok, bebas, amp, top, line, d, shio, monyet
## 2                                                     apa, aku, bilang, kan, dukungan, utk, pak, ganjar, selalu, ada
## 3                                fokus, untuk, memenangkan, pak, ganjar, mahfud, untuk, indonesia, yang, lebih, maju
# Menghapus kata yang kurang dari 4 huruf dari setiap baris token
data$tokens <- lapply(data$tokens, function(tokens) {
  tokens <- subset(tokens, nchar(tokens) >= 4)
  return(tokens)
})

head(data$tokens)
## [[1]]
##  [1] "angka"    "amin"     "prediksi" "slovakia" "november" "angka"   
##  [7] "main"     "angka"    "ikut"     "colok"    "bebas"    "line"    
## [13] "shio"     "monyet"  
## 
## [[2]]
## [1] "bilang"   "dukungan" "ganjar"   "selalu"  
## 
## [[3]]
##  [1] "fokus"       "untuk"       "memenangkan" "ganjar"      "mahfud"     
##  [6] "untuk"       "indonesia"   "yang"        "lebih"       "maju"       
## 
## [[4]]
## [1] "koar"       "palestiana" "sodara"     "dekat"      "dulu"      
## [6] "perlu"      "perbaiki"   "ketahanan"  "pangan"    
## 
## [[5]]
##  [1] "engga"      "partai"     "yang"       "satu"       "hiburan"   
##  [6] "banget"     "mana"       "seragamnya" "lucu"       "lucu"      
## [11] "salam"      "kenal"      "ranti"      "jadi"       "selama"    
## [16] "pernah"     "dapat"      "pengalaman" "paling"     "terlupakan"
## 
## [[6]]
## [1] "salam" "dari"

Stopwords

library(quanteda)
## Warning: package 'quanteda' was built under R version 4.2.3
## Warning in stringi::stri_info(): Your current locale is not in the list
## of available locales. Some functions may not work properly. Refer to
## stri_locale_list() for more details on known locale specifiers.

## Warning in stringi::stri_info(): Your current locale is not in the list
## of available locales. Some functions may not work properly. Refer to
## stri_locale_list() for more details on known locale specifiers.
## Package version: 3.3.1
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 8 of 8 threads used.
## See https://quanteda.io for tutorials and examples.
# Baca file stopwords
stopwords_path <- "stopwords_id_satya.txt"
custom_stopwords <- scan(stopwords_path, what = "character", sep = "\n")

# Tambahkan stopwords tambahan
custom_stopwords <- c(custom_stopwords, 'prabowo', 'prabowo subianto', 'subianto', 'gibran', 'anis', 'amin', 'ganjar', 'mahfud', 'politik', 'pemilu', 'kpu', 'presiden', 'pdip', 'partai', 'jokowi')

# Menghapus kata-kata penghubung dari tokenisasi teks
data$tokens <- lapply(data$tokens, function(tokens) {
  tokens <- tokens[!tolower(tokens) %in% custom_stopwords]
  return(tokens)
})

head(data$tokens)
## [[1]]
##  [1] "angka"    "prediksi" "slovakia" "november" "angka"    "main"    
##  [7] "angka"    "ikut"     "colok"    "bebas"    "line"     "shio"    
## [13] "monyet"  
## 
## [[2]]
## [1] "bilang"   "dukungan"
## 
## [[3]]
## [1] "fokus"       "untuk"       "memenangkan" "untuk"       "indonesia"  
## [6] "maju"       
## 
## [[4]]
## [1] "koar"       "palestiana" "sodara"     "perlu"      "perbaiki"  
## [6] "ketahanan"  "pangan"    
## 
## [[5]]
##  [1] "engga"      "satu"       "hiburan"    "banget"     "seragamnya"
##  [6] "lucu"       "lucu"       "salam"      "kenal"      "ranti"     
## [11] "jadi"       "pengalaman" "terlupakan"
## 
## [[6]]
## [1] "salam"

Stemming & Lemmanization

# Fungsi stemming
stem_word <- function(word) {
  # List of common prefixes and suffixes
  prefixes <- c("meng", "me", "peng", "pen", "pem", "di", "ter", "ke", "ber", "bel", "per")
  suffixes <- c("kan", "i", "an", "kah", "lah", "tah", "nya", "mu")

  # Remove prefixes
  for (prefix in prefixes) {
    if (startsWith(word, prefix)) {
      word <- substr(word, nchar(prefix) + 1, nchar(word))
      break
    }
  }
  
  # Remove suffixes
  for (suffix in suffixes) {
    if (endsWith(word, suffix)) {
      word <- substr(word, 1, nchar(word) - nchar(suffix))
      break
    }
  }
  
  return(word)
}

# Melakukan stemming pada setiap token
data$tokens <- lapply(data$tokens, function(tokens) {
  tokens <- sapply(tokens, stem_word)
  return(tokens)
})

head(data$tokens)
## [[1]]
##      angka   prediksi   slovakia   november      angka       main      angka 
##    "angka"  "prediks" "slovakia" "november"    "angka"     "main"    "angka" 
##       ikut      colok      bebas       line       shio     monyet 
##     "ikut"    "colok"    "bebas"     "line"     "shio"   "monyet" 
## 
## [[2]]
##   bilang dukungan 
## "bilang" "dukung" 
## 
## [[3]]
##       fokus       untuk memenangkan       untuk   indonesia        maju 
##     "fokus"     "untuk"    "menang"     "untuk" "indonesia"      "maju" 
## 
## [[4]]
##         koar   palestiana       sodara        perlu     perbaiki    ketahanan 
##       "koar" "palestiana"     "sodara"         "lu"       "baik"      "tahan" 
##       pangan 
##       "pang" 
## 
## [[5]]
##      engga       satu    hiburan     banget seragamnya       lucu       lucu 
##    "engga"     "satu"    "hibur"   "banget"  "seragam"     "lucu"     "lucu" 
##      salam      kenal      ranti       jadi pengalaman terlupakan 
##    "salam"      "nal"     "rant"      "jad"     "alam"     "lupa" 
## 
## [[6]]
##   salam 
## "salam"
# Hapus kata yang kurang dari 4 huruf dari setiap baris token
data$tokens <- lapply(data$tokens, function(tokens) {
  tokens <- subset(tokens, nchar(tokens) >= 4)
  return(tokens)
})

head(data$tokens)
## [[1]]
##      angka   prediksi   slovakia   november      angka       main      angka 
##    "angka"  "prediks" "slovakia" "november"    "angka"     "main"    "angka" 
##       ikut      colok      bebas       line       shio     monyet 
##     "ikut"    "colok"    "bebas"     "line"     "shio"   "monyet" 
## 
## [[2]]
##   bilang dukungan 
## "bilang" "dukung" 
## 
## [[3]]
##       fokus       untuk memenangkan       untuk   indonesia        maju 
##     "fokus"     "untuk"    "menang"     "untuk" "indonesia"      "maju" 
## 
## [[4]]
##         koar   palestiana       sodara     perbaiki    ketahanan       pangan 
##       "koar" "palestiana"     "sodara"       "baik"      "tahan"       "pang" 
## 
## [[5]]
##      engga       satu    hiburan     banget seragamnya       lucu       lucu 
##    "engga"     "satu"    "hibur"   "banget"  "seragam"     "lucu"     "lucu" 
##      salam      ranti pengalaman terlupakan 
##    "salam"     "rant"     "alam"     "lupa" 
## 
## [[6]]
##   salam 
## "salam"

Data Vizualization

head(data)
##                                                                                                                                                                                                                                    full_text
## 1 ANGKA AMIN PREDIKSI SLOVAKIA    NOVEMBER            ANGKA MAIN               ANGKA IKUT               COLOK BEBAS        amp         TOP    LINE  D                                                                       SHIO     MONYET 
## 2                                                                                                                                                                                      Apa aku bilang kan dukungan utk pak Ganjar selalu ada
## 3                                                                                                                                                                  Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju
## 4                                                                                                                                                lah jgn koar  palestiana nih sodara yg dekat dulu perlu di perbaiki ketahanan pangan nya   
## 5                                                       Engga apa apa lah  partai yang satu itu kan hiburan banget  Mana seragamnya lucu lucu  Salam kenal  Ranti  Jadi selama ini  pernah dapat pengalaman paling tak terlupakan           
## 6                                                                                                                                                                                                                             salam dari WT 
##   Labeling
## 1        N
## 2        P
## 3        P
## 4        P
## 5        P
## 6        P
##                                                                                           tokens
## 1 angka, prediks, slovakia, november, angka, main, angka, ikut, colok, bebas, line, shio, monyet
## 2                                                                                 bilang, dukung
## 3                                                   fokus, untuk, menang, untuk, indonesia, maju
## 4                                                    koar, palestiana, sodara, baik, tahan, pang
## 5                       engga, satu, hibur, banget, seragam, lucu, lucu, salam, rant, alam, lupa
## 6                                                                                          salam
library(wordcloud)
## Warning: package 'wordcloud' was built under R version 4.2.3
## Loading required package: RColorBrewer
# Menggabungkan semua token menjadi satu teks
all_tokens <- unlist(data$tokens)
all_text <- paste(all_tokens, collapse = " ")

# Membuat Wordcloud
wordcloud(words = all_tokens, freq = table(all_tokens), max.words = 50, random.order = FALSE)

Introduction to Sentiment Analysis

head(data)
##                                                                                                                                                                                                                                    full_text
## 1 ANGKA AMIN PREDIKSI SLOVAKIA    NOVEMBER            ANGKA MAIN               ANGKA IKUT               COLOK BEBAS        amp         TOP    LINE  D                                                                       SHIO     MONYET 
## 2                                                                                                                                                                                      Apa aku bilang kan dukungan utk pak Ganjar selalu ada
## 3                                                                                                                                                                  Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju
## 4                                                                                                                                                lah jgn koar  palestiana nih sodara yg dekat dulu perlu di perbaiki ketahanan pangan nya   
## 5                                                       Engga apa apa lah  partai yang satu itu kan hiburan banget  Mana seragamnya lucu lucu  Salam kenal  Ranti  Jadi selama ini  pernah dapat pengalaman paling tak terlupakan           
## 6                                                                                                                                                                                                                             salam dari WT 
##   Labeling
## 1        N
## 2        P
## 3        P
## 4        P
## 5        P
## 6        P
##                                                                                           tokens
## 1 angka, prediks, slovakia, november, angka, main, angka, ikut, colok, bebas, line, shio, monyet
## 2                                                                                 bilang, dukung
## 3                                                   fokus, untuk, menang, untuk, indonesia, maju
## 4                                                    koar, palestiana, sodara, baik, tahan, pang
## 5                       engga, satu, hibur, banget, seragam, lucu, lucu, salam, rant, alam, lupa
## 6                                                                                          salam
# Filter data berdasarkan sentimen
sentimen_positif <- data[data$Labeling == "P", ]
sentimen_negatif <- data[data$Labeling == "N", ]
sentimen_netral <- data[data$Labeling == "R", ]
# Menggabungkan token-token dari setiap kategori sentimen menjadi satu teks
all_tokens_positif <- unlist(sentimen_positif$tokens)
all_text_positif <- paste(all_tokens_positif, collapse = " ")

all_tokens_negatif <- unlist(sentimen_negatif$tokens)
all_text_negatif <- paste(all_tokens_negatif, collapse = " ")

all_tokens_netral <- unlist(sentimen_netral$tokens)
all_text_netral <- paste(all_tokens_netral, collapse = " ")

Sentimen Positif

# Membuat wordcloud untuk masing-masing sentimen
wordcloud(words = all_tokens_positif, freq = table(all_tokens_positif), max.words = 50, random.order = FALSE, main = "Wordcloud Sentimen Positif")

Sentimen Negatif

wordcloud(words = all_tokens_negatif, freq = table(all_tokens_negatif), max.words = 50, random.order = FALSE, main = "Wordcloud Sentimen Negatif")

Sentimen Netral

wordcloud(words = all_tokens_netral, freq = table(all_tokens_netral), max.words = 50, random.order = FALSE, main = "Wordcloud Sentimen Netral")