TEXT MINING

Text mining adalah proses mengeksplorasi dan menganalisa sejumlah besar data teks untuk menemukan pola dan informasi yang berguna. Data teks dapat berupa dokumen, artikel, blog, ulasan, dan sebagainya. Text mining dapat digunakan untuk berbagai tujuan, seperti:

Analisis sentimen: untuk mengetahui opini atau perasaan orang terhadap suatu hal.Klasifikasi teks: untuk mengelompokkan dokumen berdasarkan tema atau kategori tertentu.Pengungkapan topik: untuk menemukan topik atau tema utama dalam kumpulan dokumen.Pengambilan informasi: untuk mengekstrak informasi tertentu dari dokumen.Teknik text mining dapat dibagi menjadi dua kategori utama, yaitu:

Teknik statistik: menggunakan teknik statistik untuk menemukan pola dalam data teks.Teknik kecerdasan buatan: menggunakan teknik kecerdasan buatan, seperti pembelajaran mesin, untuk menemukan pola dalam data teks.Teknik text mining telah banyak digunakan di berbagai bidang, seperti: Bisnis: untuk analisis pelanggan, analisis pasar, dan analisis persaingan. Kesehatan: untuk analisis data medis, diagnosis penyakit, dan penelitian klinis. Ilmu pengetahuan: untuk analisis data penelitian, deteksi penipuan, dan analisis sosial.Berikut adalah beberapa contoh penerapan text mining:

Perusahaan e-commerce dapat menggunakan text mining untuk menganalisis ulasan produk dari pelanggan. Informasi ini dapat digunakan untuk meningkatkan kualitas produk atau layanan perusahaan.Pusat layanan pelanggan dapat menggunakan text mining untuk menganalisis percakapan dengan pelanggan. Informasi ini dapat digunakan untuk meningkatkan kepuasan pelanggan dan mengurangi biaya layanan pelanggan.Pemerintah dapat menggunakan text mining untuk menganalisis media sosial untuk mendeteksi tanda-tanda kerusuhan atau ancaman keamanan.Text mining adalah bidang yang berkembang pesat dengan berbagai aplikasi yang potensial. Dengan semakin banyaknya data teks yang tersedia, text mining akan menjadi semakin penting untuk mengekstrak informasi dan pengetahuan yang berguna dari data tersebut.

Panggil semua packages dengan fungsi library (nama_packages)

library(wordcloud)
## Loading required package: RColorBrewer
library(tm)
## Loading required package: NLP
library(textclean)
library(tidytext)
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:NLP':
## 
##     annotate
library(parallel)
library(tokenizers)
library(tau)
library(NLP)
library(stringr)
library(devtools)
## Loading required package: usethis
library(quanteda)
## Package version: 3.3.1
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 4 of 4 threads used.
## See https://quanteda.io for tutorials and examples.
## 
## Attaching package: 'quanteda'
## The following object is masked from 'package:tm':
## 
##     stopwords
## The following objects are masked from 'package:NLP':
## 
##     meta, meta<-
library(kayadata)
library(syuzhet)
library(e1071)
library(sentimentr)
## 
## Attaching package: 'sentimentr'
## The following object is masked from 'package:syuzhet':
## 
##     get_sentences
library(SentimentAnalysis)
## 
## Attaching package: 'SentimentAnalysis'
## The following object is masked from 'package:base':
## 
##     write
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
library(pacman)
pacman::p_load(textstem, dplyr)

TENTANG DATA

Dataset yang digunakan adalah data yang diperolah dari hasil Crawling data Twitter.Dataset ini berisi 169 lebih tweet Tentang wacana penghapusan scripsi bagi mahasiswa oleh mentri pendidikan Nadiem Makarim. Data dapat di akses melalui link di bawah ini :https://drive.google.com/drive/folders/1ubsdrZCw7n76p3LXuDQeezq6cm_WSHiv

Import data ke dalam R untuk dilakukan analisis

setwd("C:/Users/kjl/Documents/Tugas Kuliah/Komputasi Lanjut Semester V")
skripsi <- read.csv("~/Tugas Kuliah/Komputasi Lanjut Semester V/pak-mentri-skripsi.csv", sep=";")
tweets<-skripsi$full_text
head(tweets)
## [1] "Bagus"                                                                                                                                                                                
## [2] "Bagus. Sudah benar."                                                                                                                                                                  
## [3] "Unas uda ditiadakan, sekarang skripsi, lama2 sekolah ditiadakan sekalian aja"                                                                                                         
## [4] "yup setuju jdi opsional ðŸ‘\215ðŸ‘\215"                                                                                                                                                     
## [5] "Kali ini ide mendikbud fresh banget. Tapi sayang, kalo keputusannya dari dah dulu, harusnya semester 5 th 2018 gw dah lulus wkwkwk but yg terjadi adalah semester 10 4 tahun 10 bulan"
## [6] "ganti jadi jurnal scopus aja pak. minimal sinta 2 deh ðŸ‘\215"

Membuat Dataframe dengan nama “tweets” dari data skripsi yang hanya berisi kolom Full_text.

Case Folding

Peran dari case folding adalah untuk menyamaratakan penggunaan huruf kapital. Misalnya data teks yang kita dapat berupa tulisan “DaTA Science” maka dengan case folding artinya kita mengubah semua huruf menjadi huruf kecil (lowercase) semua.

Lowercase

tweets <- tolower(tweets)
head(tweets)
## [1] "bagus"                                                                                                                                                                                
## [2] "bagus. sudah benar."                                                                                                                                                                  
## [3] "unas uda ditiadakan, sekarang skripsi, lama2 sekolah ditiadakan sekalian aja"                                                                                                         
## [4] "yup setuju jdi opsional ðÿ‘\215ðÿ‘\215"                                                                                                                                                     
## [5] "kali ini ide mendikbud fresh banget. tapi sayang, kalo keputusannya dari dah dulu, harusnya semester 5 th 2018 gw dah lulus wkwkwk but yg terjadi adalah semester 10 4 tahun 10 bulan"
## [6] "ganti jadi jurnal scopus aja pak. minimal sinta 2 deh ðÿ‘\215"

Mengembalikan Kata yang disingkat Menjadi Kata Aslinya

rev <- replace_contraction(tweets)
head(rev)
## [1] "bagus"                                                                                                                                                                                
## [2] "bagus. sudah benar."                                                                                                                                                                  
## [3] "unas uda ditiadakan, sekarang skripsi, lama2 sekolah ditiadakan sekalian aja"                                                                                                         
## [4] "yup setuju jdi opsional ðÿ‘\215ðÿ‘\215"                                                                                                                                                     
## [5] "kali ini ide mendikbud fresh banget. tapi sayang, kalo keputusannya dari dah dulu, harusnya semester 5 th 2018 gw dah lulus wkwkwk but yg terjadi adalah semester 10 4 tahun 10 bulan"
## [6] "ganti jadi jurnal scopus aja pak. minimal sinta 2 deh ðÿ‘\215"

“replace_word_elongation” Fungsi ini berfungsi untuk menggantikan kata-kata yang memiliki elongasi (pemakaian berulang dari huruf yang sama, misalnya “sorryyyyyyy”) dengan bentuk yang lebih singkat.Atau dapat diartikan mengembalikan kata aslinya.

Mengembalikan Kata yang Mengalami Perpanjangan Menjadi Kata Aslinya

rev<- replace_word_elongation(rev)
head(rev)
## [1] "bagus"                                                                                                                                                                                
## [2] "bagus. sudah benar."                                                                                                                                                                  
## [3] "unas uda ditiadakan, sekarang skripsi, lama2 sekolah ditiadakan sekalian aja"                                                                                                         
## [4] "yup setuju jdi opsional ðÿ‘\215ðÿ‘\215"                                                                                                                                                     
## [5] "kali ini ide mendikbud fresh banget. tapi sayang, kalo keputusannya dari dah dulu, harusnya semester 5 th 2018 gw dah lulus wkwkwk but yg terjadi adalah semester 10 4 tahun 10 bulan"
## [6] "ganti jadi jurnal scopus aja pak. minimal sinta 2 deh ðÿ‘\215"

Menghilangkan karakter khusus, tanda baca, dan simbol yang tidak diperlukan untuk mengembalikan pada makna dasar pada teks.

hapus url

rev <- rev %>% 
  replace_html() %>%   
  replace_url()
rev

rev <- strip(rev)
head(rev)

Menghapus simbol

rev <- strip(rev)
head(rev)
## [1] "bagus"                                                                                                                                                              
## [2] "bagus sudah benar"                                                                                                                                                  
## [3] "unas uda ditiadakan sekarang skripsi lama sekolah ditiadakan sekalian aja"                                                                                          
## [4] "yup setuju jdi opsional ðÿ‘\215ðÿ‘\215"                                                                                                                                   
## [5] "kali ini ide mendikbud fresh banget tapi sayang kalo keputusannya dari dah dulu harusnya semester th gw dah lulus wkwkwk but yg terjadi adalah semester tahun bulan"
## [6] "ganti jadi jurnal scopus aja pak minimal sinta deh ðÿ‘\215"

stemming/lemmatizing = kata dasar

Mengubah kata-kata ke bentuk dasarnya. Stemming mereduksi kata-kata menjadi bentuk dasar dengan menghapus akhiran, sedangkan lemmatization menggunakan kamus untuk mengubah kata-kata ke bentuk dasar.

#stemming/lemmatizing = kata dasar
stem_strings(rev)
lemmatize_strings(rev)

cetak tweet dengan html yang dikonversi di index

replace_html(replace_emoji(rev))

melakukan tugas penggantian seluruh variabel teks

rev<- rev%>% 
  replace_emoji(.) %>% 
  replace_html(.)

hapus mentions

Tahapan yang harus dilalui untuk membersihkan data tweets adalah sebagai berikut : Menghilangkan substring ’’ dengan fungsi gsub() lalu mengganti nama data yang sudah bersih dari substring ’’ menjadi tweets Menghilangkan link-link html dan url, emoji, hashtag, dan mention pada tweets Berikut adalah syntax yang digunakan:

rev <- rev %>% 
  replace_tag(rev, pattern = "@([A-Za-z0-9_]+)",replacement="") %>%  # remove mentions
  replace_hash(rev, pattern = "#([A-Za-z0-9_]+)",replacement="")      # remove hashtags
rev

##strip simbol

rev <- strip(rev)

Tokenization

Memecah teks menjadi unit-unit yang lebih kecil yang disebut token. Token bisa berupa kata, frasa, atau karakter tergantung pada kebutuhan analisis.

menghapus kata penghubung atau kata yang tidak baku

rev <-removeWords(rev, c("di","dan","yang","akan","agar","seperti","yaitu","kami","kami",
                         "mari","pada","jelang","dimana","dengan","sudah","ini","seluruh",
                         "diminta","tak","itu","hai","bisa","wib","oleh","mai","jam", "aug",
                         "masa","berikut","kalau","klik","ibodwq","terd","httpstconvv","tue","wed",
                         "httpstcoxu","yzmrlyx","tahapan","refaabdi","kota","kpu","kpuid","rt","hingga",
                         "saat", "belum","apa","sih","suara","pesta","dindap","http","httpstco",
                         "asn","bakal","wkwk","wkwkw","aug","iya","uu","i","ada","ngene","yang","bjir",
                         "ðÿðÿ","un","anjir","tahi","tbtb","my","wios","sialan","wkwkwkwk","sip","omo",
                         "like","plss","ket","e","after","ha","pakðÿ", "but","rill","cashback",
                         "allah","and","o","ðÿ'^ðÿ","nya","ya","ðÿ","no","nuruk","ki","jir",
                         "anjing","biar","kagak","sayang","mah","anjay","ngaruh","kalo","gua","thesis",
                         "skripsiðÿ","duh","ih","ots","a","pft","plis","plan","ra","rabi","o", 
                         "skripshit","duit","sih","nih", "amp", "ï","tuh","tau","â","â","aaaa","deh","ðÿº",
                         "coba","dll","iki","gue","kena","oon","pas","sad","up","wkwkwk","waleh","ajg",
                         "ah","adaâ","alaala","alah","alamðÿ","allahâ","ayo","end","bu","biak","is"))
head(rev)
## [1] "bagus"                                                                                                                                        
## [2] "bagus  benar"                                                                                                                                 
## [3] "unas uda ditiadakan sekarang skripsi lama sekolah ditiadakan sekalian aja"                                                                    
## [4] "yup setuju jdi opsional ‘\215‘\215"                                                                                                                 
## [5] "kali  ide mendikbud fresh banget tapi   keputusannya dari dah dulu harusnya semester th gw dah lulus   yg terjadi adalah semester tahun bulan"
## [6] "ganti jadi jurnal scopus aja pak minimal sinta  ‘\215"

Menyimpang data yang sudah dibersihkan

write.csv(rev,file = "C:/Users/kjl/Documents/data-bersih.csv", row.names = F) 

Menggunakan fungsi write.csv untuk menulis data yang telah dibersihkan ke dalam file CSV. File CSV tersebut kemudian disimpan di lokasi yang di tentukan, yaitu “C:/Users/kjl/Documents/data-bersih1.csv”

Visualisasi dengan WordCloud

Word cloud adalah visualisasi yang menampilkan kata-kata dari teks yang diberikan, dengan ukuran font yang lebih besar untuk kata-kata yang lebih sering muncul. Word cloud dapat digunakan untuk berbagai tujuan, seperti:

Untuk memberikan gambaran umum tentang topik atau tema teks. Misalnya, word cloud dapat digunakan untuk menunjukkan topik-topik yang sedang hangat dibicarakan di media sosial.

Untuk mengidentifikasi kata-kata atau frasa yang paling penting dalam teks. Misalnya, word cloud dapat digunakan untuk mengidentifikasi kata-kata yang paling sering digunakan dalam ulasan produk.

Untuk membuat konten yang menarik dan informatif. Word cloud dapat digunakan untuk membuat poster, presentasi, atau bahkan karya seni

Mengubah Data Frame Menjadi Data Faktor

tdm <- TermDocumentMatrix(rev)
m <- as.matrix(tdm)
v <- sort(rowSums(m),decreasing = TRUE)

##Mengubah Data Faktor Menjadi Data Frame

d <- data.frame(word = names(v), freq = v)

Membuast visual Worcloud

Word Cloud memperhatikan frekuensi setiap kata dalam pembuatannya, maka diperlukan sebuah matriks yang dapat menyajikan frekuensi setiap kata. Matriks tersebut dapat diperoleh dengan fungsi TermDocumentMatrix()

Selanjutnya, matriks tersebut diurutkan berdasarkan frekuensi kata dari yang terbesar. Untuk mempermudah pemahaman terhadap kata yang paling sering muncul, dapat dibuat sebuah dataframe dengan syntax seperti berikut :

Mengubah Data Frame Menjadi Data Faktor

wordcloud(d$word, d$freq,
          random.order = FALSE,
          max.words = 500,
          colors = brewer.pal(name="Dark2",8))

Dengan Word Cloud di atas terlihat bahwa kata Skripsi, baru, dan lulus adalah kata yang paling sering dikaitkan dengan Skripsi pada cuitan pengguna twitter akhir-akhir ini. Berdasarkan Word Cloud ini dapat diambil sebuah informasi penting bahwa saat ini tengah ramai tentang wacana penghapusan skripsi dibicarakan oleh masyarakat Indonesia khususnya pengguna twitter.

Informasi-informasi ini dapat dijadikan fondasi dasar untuk analisis data teks atau analisis wacana lanjutan seperti analisis sentimen untuk melihat kecenderungan arah opini masyarakat.

tdm <-TermDocumentMatrix (rev,
                        control = list(wordLengths= c (1, inf)))
tdm

Frequent Words and Association

periksa kata-kata yang sering muncul

(freq.terms <- findFreqTerms(tdm, lowfreq = 14))
##  [1] "aja"       "skripsi"   "dah"       "dulu"      "lulus"     "pak"      
##  [7] "baru"      "udah"      "skripsian" "kenapa"    "gak"       "aku"
term.freq <- rowSums(as.matrix(tdm))
term.freq <- subset(term.freq, term.freq >= 14)
df <- data.frame(term = names(term.freq), freq = term.freq)
ggplot(df, aes(x = term, y = freq)) + geom_bar(stat = "identity") +
  xlab("Terms") + ylab("Count") + coord_flip()

terlihat pada hasil diagram di atas bahwa kata yang sering muncul dari tweets di twitter data Wacana penghapusan skripsi adalah kata “Skripsi, baru, dan Lulus”

Menghapus istilah-istilah yang jarang?

tdm2 <- removeSparseTerms(tdm, sparse = 0.95)
m2 <- as.matrix(tdm2)

ANALISIS CLUSTER

Analisis Cluster adalah salah satu teknik multivariat yang bertujuan mengklasifikasi suatu objek-objek ke dalam suatu kelompok-kelompok yang berbeda antara lain antara kelompok satu dengan lainnya. Objek-objek yang telah memiliki kedekatan jarak relatif sama dengan objek lainnya (Qonitatin & Novita, 2017). Karakteristik objek-objek dalam satuan kelompok memiliki tingkat kemiripan yang tinggi, sedangkan karakteristik antar objek pada suatu kelompok dengan kelompok lain memiliki tingkat kemiripan yang rendah (Mattjik & Sumertajaya, 2011).

ANALISIS CLUSTER HIERARKI Analisis cluster hierarki adalah suatu metode pengelompokkan data yang dimulai dengan mengelompokkan dua atau lebih obyek yang memiliki kesamaan paling dekat, kemudian proses diteruskan ke obyek lain yang mempunyai kesamaan paling dekat dengan kedua obyek tersebut, dan seterusnya. Proses ini dilakukan secara berulang-ulang hingga semua obyek telah digabungkan menjadi satu kelompok.

Analisis cluster hierarki dapat digunakan untuk berbagai tujuan, seperti:

Untuk mengelompokkan pelanggan berdasarkan perilaku pembelian mereka. Untuk mengelompokkan produk berdasarkan fitur atau karakteristiknya. Untuk mengelompokkan data medis berdasarkan gejala atau kondisinya.

distMatrix <- dist(scale (m2))
fit <- hclust (distMatrix, method = "ward")
## The "ward" method has been renamed to "ward.D"; note new "ward.D2"
plot(fit) 
rect.hclust(fit, k = 2)

dari gambar diatas terlihat bahwa pemotongan yang tepat akan menghasilkan 2 cluster, dimana pada cluster 1 sebanyak 1 kata dan cluster 2 sebanyak 15 kata.

ANALISIS CLUSTER K-MEANS K-Means Clustering merupakan salah satu metode data clustering non hirarki yang berusaha mempartisi data yang ada ke dalam bentuk satu atau lebih cluster atau kelompok sehingga data yang memiliki karakteristik yang sama dikelompokkan ke dalam satu cluster yang sama dan data yang mempunyai karakteristik yang berbeda dikelompokkan ke dalam kelompok lainnya. K-Means adalah metode clustering berbasis jarak yang membagi data ke dalam sejumlah cluster dan algoritma ini hanya bekerja pada data dengan atribut numerik. Algoritma K-Means termasuk partitioning clustering yang memisahkan data ke k daerah bagian yang terpisah. Algoritma K-Means sangat terkenal karena kemudahan dan kemampuannya meng-cluster data yang besar dan data outlier dengan sangat cepat. K-Means merupakan metode non hirarki yang pada awalnya mengambil sebagian banyaknya komponen populasi untuk dijadikan pusat cluster awal. Berikutnya K-Means menguji masing-masing komponen di dalam populasi data dan menandai komponen tersebut ke salah satu pusat cluster yang telah didefinisikan tergantung dari jarak minimum antar komponen dengan tiap-tiap cluster. Posisi pusat cluster akan dihitung kembali sampai semua komponen data digolongkan ke dalam tiap-tiap pusat cluster dan terakhir akan terbentuk posisi pusat cluster yang baru.

m3 <- t(m2) # transpose the matrix to cluster documents (tweets)
m3
##      Terms
## Docs  aja skripsi dari dulu lulus tapi pak kampus baru sidang udah skripsian
##   1     0       0    0    0     0    0   0      0    0      0    0         0
##   2     0       0    0    0     0    0   0      0    0      0    0         0
##   3     1       1    0    0     0    0   0      0    0      0    0         0
##   4     0       0    0    0     0    0   0      0    0      0    0         0
##   5     0       0    1    1     1    1   0      0    0      0    0         0
##   6     1       0    0    0     0    0   1      0    0      0    0         0
##   7     0       0    0    0     0    0   0      0    0      0    0         0
##   8     0       0    0    0     0    0   0      0    0      0    0         0
##   9     1       1    0    0     0    0   0      0    0      0    0         0
##   10    0       0    0    0     0    0   0      1    0      0    0         0
##   11    0       0    0    0     0    0   0      0    0      0    0         0
##   12    0       0    0    0     0    0   0      1    0      0    0         0
##   13    0       0    0    0     0    0   0      0    1      1    1         0
##   14    0       1    0    0     2    1   0      0    0      0    0         0
##   15    0       0    0    0     0    0   0      0    0      0    1         1
##   16    0       0    0    0     0    0   0      0    1      0    0         0
##   17    0       1    1    0     1    0   0      0    0      0    0         0
##   18    0       0    0    0     0    0   0      0    0      0    0         0
##   19    0       0    0    0     0    0   0      0    0      0    0         0
##   20    0       0    0    0     0    0   0      0    0      0    0         0
##   21    0       0    0    0     0    0   0      0    0      0    0         0
##   22    0       0    0    0     0    0   0      0    0      0    0         0
##   23    0       1    0    0     0    1   0      2    0      0    0         0
##   24    0       0    0    0     0    0   0      0    0      0    0         0
##   25    0       1    0    0     0    0   0      0    0      0    0         0
##   26    0       0    0    0     0    0   0      0    0      0    0         0
##   27    0       0    0    0     0    0   1      0    0      0    0         0
##   28    0       1    0    0     0    0   0      0    0      0    0         0
##   29    0       0    0    0     0    0   0      0    1      0    0         0
##   30    0       0    0    0     0    0   0      0    0      0    0         1
##   31    0       0    0    0     0    0   0      0    0      0    0         0
##   32    0       0    0    0     0    0   0      0    0      1    0         0
##   33    0       0    0    0     0    0   1      0    0      0    0         0
##   34    0       0    0    0     0    0   0      0    0      0    0         0
##   35    0       1    0    1     0    1   0      0    0      0    0         0
##   36    0       0    0    0     0    0   0      0    0      0    0         0
##   37    0       0    1    0     0    0   0      0    1      0    0         0
##   38    0       1    0    0     0    1   0      0    0      0    0         1
##   39    0       0    0    0     0    0   1      0    0      0    0         0
##   40    0       0    0    0     0    0   0      0    0      0    0         0
##   41    0       0    0    1     0    0   0      0    0      0    0         0
##   42    0       0    0    0     0    0   0      0    0      0    0         0
##   43    1       0    1    0     0    0   2      0    0      0    0         0
##   44    0       1    0    0     1    0   0      0    0      0    0         0
##   45    0       1    0    1     0    0   0      0    0      0    0         0
##   46    0       0    0    0     0    0   0      0    0      0    0         0
##   47    0       0    0    0     0    0   0      0    0      0    0         0
##   48    0       0    0    0     0    0   0      0    0      0    0         0
##   49    0       0    0    0     0    0   0      0    0      0    0         0
##   50    0       0    0    0     0    0   0      0    1      0    0         0
##   51    0       0    0    0     0    0   0      0    0      0    0         0
##   52    0       0    0    0     0    0   0      0    0      0    0         0
##   53    0       0    0    0     0    0   0      0    0      0    0         0
##   54    0       0    0    0     0    0   0      0    0      0    0         0
##   55    0       0    0    0     0    0   0      0    0      0    0         0
##   56    1       0    0    0     0    0   0      0    1      0    0         0
##   57    0       0    0    0     0    0   0      0    0      0    0         0
##   58    0       0    0    0     0    0   0      0    0      0    0         0
##   59    0       0    0    0     1    0   0      0    1      0    1         0
##   60    0       0    1    0     0    1   0      0    0      0    0         0
##   61    0       0    0    0     0    0   0      0    0      0    0         0
##   62    0       0    0    0     0    0   0      0    0      0    0         0
##   63    0       0    0    0     0    0   0      0    0      0    0         0
##   64    0       0    0    0     0    0   0      0    0      0    0         0
##   65    0       0    0    0     0    0   0      0    0      0    0         0
##   66    0       0    0    1     0    0   0      1    0      0    0         0
##   67    0       1    0    0     0    0   0      0    0      0    0         0
##   68    0       0    0    0     0    0   0      0    0      0    0         0
##   69    0       1    0    0     0    0   0      0    0      1    0         0
##   70    0       0    0    0     0    0   0      0    0      0    0         0
##   71    0       0    0    0     0    0   0      0    0      0    0         0
##   72    0       0    0    0     0    0   0      0    1      0    0         0
##   73    0       0    0    0     0    0   0      0    0      0    0         0
##   74    0       0    0    1     0    0   0      0    0      0    1         0
##   75    0       0    0    0     0    0   0      0    0      0    0         0
##   76    0       0    0    0     1    0   2      0    1      0    1         0
##   77    0       0    0    0     0    0   0      0    0      0    1         1
##   78    0       0    0    0     0    0   0      0    0      0    0         0
##   79    0       0    0    0     0    0   0      0    1      1    0         0
##   80    0       0    0    0     0    0   0      0    0      0    1         0
##   81    0       1    0    1     0    0   0      0    0      0    0         0
##   82    0       0    0    0     0    0   0      0    0      0    0         0
##   83    0       0    0    0     0    0   1      0    0      0    0         0
##   84    0       0    0    0     1    0   0      0    1      0    1         0
##   85    0       0    0    0     1    0   0      0    0      1    1         0
##   86    0       0    0    0     0    0   0      0    0      0    0         0
##   87    0       0    0    0     0    0   0      0    0      0    0         0
##   88    0       0    0    0     0    0   0      0    0      0    0         0
##   89    0       0    0    0     0    0   0      0    0      0    0         0
##   90    0       0    0    0     1    0   0      0    0      0    1         0
##   91    0       0    1    0     0    0   0      0    0      0    0         0
##   92    1       1    0    0     0    1   0      0    0      0    0         0
##   93    0       0    0    0     1    0   0      0    0      0    0         0
##   94    0       0    0    0     0    0   0      0    0      0    0         0
##   95    0       0    1    0     0    0   0      0    0      0    0         0
##   96    0       0    0    0     0    0   0      0    0      0    0         0
##   97    0       0    0    0     0    0   0      0    0      0    0         0
##   98    0       0    0    0     0    0   0      0    0      0    0         0
##   99    0       1    0    0     0    0   1      0    1      1    0         0
##   100   0       1    0    0     0    0   0      0    0      0    0         0
##   101   0       0    0    0     0    0   0      0    0      0    0         0
##   102   0       0    0    0     0    0   0      0    0      0    0         0
##   103   0       0    0    0     0    0   0      0    0      0    1         0
##   104   0       0    0    0     0    0   0      0    1      0    0         0
##   105   0       0    0    0     0    0   0      0    0      0    0         0
##   106   0       0    0    1     0    0   0      0    1      0    0         0
##   107   0       0    0    0     0    0   0      0    0      0    0         0
##   108   0       0    0    0     0    0   0      0    0      0    0         0
##   109   1       0    0    0     0    0   0      0    1      0    0         0
##   110   0       0    0    0     0    0   1      0    0      0    0         0
##   111   0       0    0    0     0    0   0      0    0      0    0         0
##   112   0       0    0    0     0    0   0      0    0      0    0         0
##   113   0       0    0    0     0    0   0      0    0      1    0         0
##   114   0       0    0    0     0    0   0      0    0      0    0         0
##   115   1       0    0    1     1    0   0      1    0      0    0         0
##   116   0       0    0    0     0    0   0      0    0      0    0         0
##   117   0       1    0    0     1    0   0      0    0      0    0         0
##   118   0       0    0    0     0    0   0      0    0      0    0         0
##   119   0       0    0    0     0    0   0      0    0      0    0         0
##   120   2       2    0    0     0    1   1      0    0      0    0         0
##   121   0       0    0    0     1    0   0      0    0      0    0         0
##   122   0       0    0    0     0    0   0      0    0      0    0         0
##   123   0       0    0    0     0    0   0      1    1      0    0         0
##   124   0       0    0    0     0    0   0      0    0      0    0         0
##   125   0       0    0    0     0    0   0      0    0      0    0         0
##   126   0       0    0    0     0    0   0      0    0      0    0         1
##   127   0       0    0    0     0    0   0      0    0      0    0         0
##   128   0       0    0    0     0    0   0      0    0      0    0         0
##   129   0       0    0    0     0    0   0      0    0      0    0         0
##   130   0       1    0    0     0    0   0      0    1      0    0         0
##   131   0       0    0    0     0    0   0      0    0      0    0         1
##   132   0       0    0    0     0    0   0      0    0      0    0         0
##   133   0       0    0    0     0    0   0      0    0      0    0         0
##   134   0       0    0    0     0    0   0      0    0      0    0         0
##   135   0       0    0    0     0    0   0      0    0      0    0         0
##   136   0       0    0    0     1    0   1      0    0      0    1         1
##   137   0       0    0    0     0    0   1      0    0      0    0         0
##   138   0       1    0    0     0    0   0      0    0      0    0         0
##   139   0       0    0    0     1    0   0      0    0      0    0         0
##   140   0       0    0    0     0    0   0      0    0      0    0         1
##   141   0       0    0    0     0    0   0      0    0      0    0         0
##   142   0       0    0    0     0    0   0      0    0      0    0         0
##   143   0       1    0    0     0    0   0      0    1      1    0         0
##   144   0       0    0    0     0    0   0      0    0      0    0         0
##   145   0       0    0    0     1    0   0      0    0      0    0         0
##   146   0       0    0    0     0    0   0      0    0      0    0         0
##   147   1       0    0    0     0    0   1      1    0      0    0         0
##   148   0       0    0    0     0    0   0      0    0      0    1         0
##   149   0       1    0    1     0    0   0      0    0      0    0         0
##   150   0       1    0    0     0    0   0      0    1      1    0         0
##   151   0       0    0    0     0    1   0      0    0      0    0         0
##   152   0       0    0    0     0    0   0      0    0      0    0         0
##   153   0       0    0    0     0    0   0      0    0      0    0         0
##   154   0       0    0    0     0    0   1      0    0      0    1         0
##   155   0       0    0    0     0    0   0      0    0      0    0         0
##   156   0       0    0    0     0    0   0      0    0      0    0         0
##   157   0       0    0    0     0    0   0      0    0      0    0         0
##   158   0       0    0    0     0    0   0      0    0      0    0         0
##   159   0       0    0    0     0    0   0      0    0      0    0         0
##   160   0       0    0    0     0    1   0      0    0      0    0         0
##   161   0       0    0    0     0    0   1      0    0      0    0         0
##   162   0       0    0    0     0    0   0      0    0      0    0         0
##   163   0       1    0    0     0    1   0      1    0      0    0         0
##   164   0       0    1    1     0    0   0      0    0      0    0         0
##   165   0       0    0    0     0    0   0      0    0      0    0         0
##   166   0       0    0    0     0    0   0      0    0      0    0         0
##   167   0       0    0    0     0    0   0      0    0      0    0         0
##   168   0       0    0    0     0    0   0      0    0      0    0         1
##   169  10      12    5    4    10    1   9      2   10      3    5         5
##      Terms
## Docs  kenapa telat gak aku
##   1        0     0   0   0
##   2        0     0   0   0
##   3        0     0   0   0
##   4        0     0   0   0
##   5        0     0   0   0
##   6        0     0   0   0
##   7        0     0   0   0
##   8        0     0   0   0
##   9        0     0   0   0
##   10       0     0   0   0
##   11       0     0   0   0
##   12       0     0   0   0
##   13       0     0   0   0
##   14       0     0   0   0
##   15       0     0   0   0
##   16       1     0   0   0
##   17       0     0   0   0
##   18       0     0   0   0
##   19       0     0   0   0
##   20       0     0   0   0
##   21       0     0   0   0
##   22       0     0   0   0
##   23       0     0   0   0
##   24       0     0   0   0
##   25       0     0   0   0
##   26       0     1   0   0
##   27       0     0   0   0
##   28       0     0   1   0
##   29       1     0   0   0
##   30       0     0   0   0
##   31       0     0   0   0
##   32       0     0   0   0
##   33       0     0   0   0
##   34       0     0   0   0
##   35       0     0   0   2
##   36       0     0   0   0
##   37       0     0   0   0
##   38       0     0   0   1
##   39       0     0   1   1
##   40       0     0   0   0
##   41       0     0   0   0
##   42       0     1   0   0
##   43       1     1   1   0
##   44       0     0   0   0
##   45       0     0   0   0
##   46       0     0   1   0
##   47       0     0   0   0
##   48       0     0   0   0
##   49       0     0   0   0
##   50       0     0   0   0
##   51       0     0   0   0
##   52       0     0   0   0
##   53       0     1   0   0
##   54       0     0   0   0
##   55       0     0   0   0
##   56       0     0   0   1
##   57       0     0   0   0
##   58       0     0   0   0
##   59       0     0   0   0
##   60       0     0   0   0
##   61       0     0   0   1
##   62       0     0   0   0
##   63       0     0   0   0
##   64       0     0   0   0
##   65       0     1   0   0
##   66       0     0   1   0
##   67       0     0   0   0
##   68       0     0   0   0
##   69       0     0   0   0
##   70       0     0   0   0
##   71       0     0   0   0
##   72       0     0   0   0
##   73       0     0   0   0
##   74       0     0   0   0
##   75       0     0   0   0
##   76       0     0   0   0
##   77       0     0   0   0
##   78       0     0   0   0
##   79       0     0   0   0
##   80       0     0   0   0
##   81       1     0   0   0
##   82       0     0   0   0
##   83       0     0   0   0
##   84       0     0   0   0
##   85       0     0   0   0
##   86       0     0   0   0
##   87       0     0   0   0
##   88       0     1   0   0
##   89       0     0   0   0
##   90       0     0   0   0
##   91       0     0   0   0
##   92       0     0   0   0
##   93       0     0   0   0
##   94       0     0   0   0
##   95       0     0   0   0
##   96       0     0   0   0
##   97       0     0   0   0
##   98       0     1   0   0
##   99       0     0   0   0
##   100      0     0   3   0
##   101      0     0   0   0
##   102      0     0   0   0
##   103      0     0   0   0
##   104      0     0   0   0
##   105      0     0   0   0
##   106      1     0   0   0
##   107      0     0   0   0
##   108      0     0   0   0
##   109      0     0   0   0
##   110      0     0   0   1
##   111      0     0   0   0
##   112      0     0   0   1
##   113      0     0   0   0
##   114      0     0   0   0
##   115      0     0   0   0
##   116      0     0   0   0
##   117      0     0   0   0
##   118      0     0   0   0
##   119      0     0   0   0
##   120      0     0   1   0
##   121      0     0   0   0
##   122      0     0   0   0
##   123      0     0   0   0
##   124      0     0   0   0
##   125      0     0   0   0
##   126      1     0   0   0
##   127      0     0   0   0
##   128      0     0   0   1
##   129      0     0   0   0
##   130      0     0   0   0
##   131      0     0   1   0
##   132      0     0   0   0
##   133      0     0   0   0
##   134      0     0   0   0
##   135      0     0   0   0
##   136      0     1   1   0
##   137      0     0   0   0
##   138      0     0   0   0
##   139      0     0   0   0
##   140      0     0   1   0
##   141      0     0   0   0
##   142      0     0   0   1
##   143      0     0   0   0
##   144      0     0   0   0
##   145      1     0   0   0
##   146      0     0   0   0
##   147      0     0   1   0
##   148      0     0   0   0
##   149      0     0   0   0
##   150      1     0   0   0
##   151      0     0   0   0
##   152      0     0   0   0
##   153      0     0   0   0
##   154      0     1   0   0
##   155      0     0   0   0
##   156      0     0   0   0
##   157      0     0   0   0
##   158      0     0   0   0
##   159      0     0   0   0
##   160      0     0   0   0
##   161      0     0   0   0
##   162      0     0   0   0
##   163      0     0   0   0
##   164      1     0   0   0
##   165      0     0   0   0
##   166      0     0   0   0
##   167      0     0   0   0
##   168      0     0   0   0
##   169      9     1   2   7
set.seed(122)
k<- 3
kmeansResult<-kmeans(m3, k)
round(kmeansResult$centers, digits=3)
##      aja skripsi  dari dulu  lulus  tapi   pak kampus   baru sidang udah
## 1  0.038   0.139 0.044 0.07  0.095 0.063 0.038  0.051  0.108  0.051 0.07
## 2 10.000  12.000 5.000 4.00 10.000 1.000 9.000  2.000 10.000  3.000 5.00
## 3  0.500   0.400 0.100 0.00  0.200 0.100 1.100  0.100  0.200  0.100 0.30
##   skripsian kenapa telat   gak   aku
## 1     0.051  0.051 0.038 0.032 0.057
## 2     5.000  9.000 1.000 2.000 7.000
## 3     0.100  0.100 0.300 0.800 0.100
for (i in 1:k) {
  cat(paste("cluster ", i, ": ", sep = ""))
  s <- sort(kmeansResult$centers[i, ], decreasing = T)
  cat(names(s)[1:5], "\n")
  # print the tweets of every cluster
  # print(tweets[which(kmeansResult£cluster==i)])
}
## cluster 1: skripsi baru lulus dulu udah 
## cluster 2: skripsi aja lulus baru pak 
## cluster 3: pak gak aja skripsi udah

Berdasarkan hasil klastering k-means yang telah dilakukan dengan mentode centers,dapat disimpulkan sebagai berikut :

Cluster 1: Kata kunci dominan termasuk “skripsi,” Kemungkinan terkait dengan isu-isu wacana penghapusan skripsi bagi mahasiswa.

Cluster 2: Kata kunci dominan termasuk “skripsian”,“baru”, dan “lulus” “prabowo,”. Kemungkinan terkait dengan isu-isu yang mencakup wacana penghapusan skripsi bagi mahasiswa membuat perubahan baru bahwa skripsian tidak lagi menjadi penentu untuk kelulusan mahasiswa.

Analysis Sentiment

Analisis di bawah ini menggunakan algoritma Naive Bayes untuk melakukan klasifikasi tweet negatif,positif,dan netral menggunakan dataset tweet tentang wacana penghapusan skripsi di indonesia.

Buat DataFrame hanya untuk komentar positif

tweets.positive<-data.frame(
  word= c( "skripsi","lulus ", "setuju", "skripsian","ganti","sidang", "kuliah", "alhamdulillah", "kelar", "mahasiswa", "bikin",
           "harus","mantap","seru","bagus", "keren", "baik","aman","semoga","dihilangkan","setuju", "laksanakan", "cepat",
           "segera", "solusi","mulai","akhirnya", "dosen", "pasti","cinta","sayang","projeck","serunya", "sarjana", 
           "mari", "bahagia","prodi","sidang","enak", "hati", "nyaman","ayo","bisa","berhasil","semangat", "hidup", "mudah",
           "merdeka ","hapus","lanjutkan","tenang", "asyik", "keunggukan","kejelasan","efisiensi","berhasil","inspirasi",
           "optimis", "disiplin", "pemimpim"),
  freq= c (38, 30,25, 20,18, 16,14,13,13,9,8,7,6,6,6,5,5,5,5,4,4,4,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))
##Membuat Word Cloud komentar Positif
#Mengubah Data Frame Menjadi Data Faktor
tdm_pos <- TermDocumentMatrix(tweets.positive)
tdm_pos
## <<TermDocumentMatrix (terms: 65, documents: 2)>>
## Non-/sparse entries: 65/65
## Sparsity           : 50%
## Maximal term length: 16
## Weighting          : term frequency (tf)
m_pos <- as.matrix(tdm_pos)
View(m_pos)
v_pos <- sort(rowSums(m_pos),decreasing = TRUE)
head(v_pos)
##      "berhasil",        "setuju",        "sidang",              13, 
##                2                2                2                2 
##      "akhirnya", "alhamdulillah", 
##                1                1
#Mengubah Data Faktor Menjadi Data Frame
d_pos <- data.frame(word = names(v_pos), freq = v_pos)
head(d_pos)
##                              word freq
## "berhasil",           "berhasil",    2
## "setuju",               "setuju",    2
## "sidang",               "sidang",    2
## 13,                           13,    2
## "akhirnya",           "akhirnya",    1
## "alhamdulillah", "alhamdulillah",    1

Menampilkan visual wordcloud

wordcloud(tweets.positive$word, d$freq,
          random.order = FALSE,
          max.words = 500,
          colors = brewer.pal(name = "Dark2",8 ))  

Term Dokument Matriks

tdm_positif <- TermDocumentMatrix(tweets.positive,
                          control = list(wordLengths = c(1, Inf)))
tdm_positif
## <<TermDocumentMatrix (terms: 76, documents: 2)>>
## Non-/sparse entries: 76/76
## Sparsity           : 50%
## Maximal term length: 16
## Weighting          : term frequency (tf)

inspect frequent words

(freq.terms <- findFreqTerms(tdm_positif, lowfreq = 1))
##  [1] "\","                "\"akhirnya\","      "\"alhamdulillah\","
##  [4] "\"aman\","          "\"asyik\","         "\"ayo\","          
##  [7] "\"bagus\","         "\"bahagia\","       "\"baik\","         
## [10] "\"berhasil\","      "\"bikin\","         "\"bisa\","         
## [13] "\"cepat\","         "\"cinta\","         "\"dihilangkan\","  
## [16] "\"disiplin\","      "\"dosen\","         "\"efisiensi\","    
## [19] "\"enak\","          "\"ganti\","         "\"hapus\","        
## [22] "\"harus\","         "\"hati\","          "\"hidup\","        
## [25] "\"inspirasi\","     "\"kejelasan\","     "\"kelar\","        
## [28] "\"keren\","         "\"keunggukan\","    "\"kuliah\","       
## [31] "\"laksanakan\","    "\"lanjutkan\","     "\"lulus"           
## [34] "\"mahasiswa\","     "\"mantap\","        "\"mari\","         
## [37] "\"merdeka"          "\"mudah\","         "\"mulai\","        
## [40] "\"nyaman\","        "\"optimis\","       "\"pasti\","        
## [43] "\"pemimpim\")"      "\"prodi\","         "\"projeck\","      
## [46] "\"sarjana\","       "\"sayang\","        "\"segera\","       
## [49] "\"semangat\","      "\"semoga\","        "\"seru\","         
## [52] "\"serunya\","       "\"setuju\","        "\"sidang\","       
## [55] "\"skripsian\","     "\"solusi\","        "\"tenang\","       
## [58] "c(\"skripsi\","     "1)"                 "1,"                
## [61] "13,"                "14,"                "16,"               
## [64] "18,"                "2,"                 "20,"               
## [67] "25,"                "3,"                 "30,"               
## [70] "4,"                 "5,"                 "6,"                
## [73] "7,"                 "8,"                 "9,"                
## [76] "c(38,"
term.freq <- rowSums(as.matrix(tdm_positif))
term.freq <- subset(term.freq, term.freq >= 1)
df <- data.frame(term = names(term.freq), freq = term.freq)
ggplot(df, aes(x = term, y = freq)) + geom_bar(stat = "identity") +
  xlab("Terms Positif") + ylab("Count") + coord_flip()

Buat DataFrame hanya untuk komentar negatif

tweets.negatif<- data.frame(
  word =c("telat","jangan","tidak","susah", "pusing", "mentalku","percuma","sulit","gagal","bohong", "malas", "jelek",
          "susah","sakit","sia-sia","kesal", "marah", "sengsara","sedih","gagal","wacana","hancur"),
  freq= c(15,11, 9, 8, 8, 6, 6, 6, 6, 5, 4, 4, 4, 4, 3, 3, 2, 2, 1, 1, 1,1))

inspect frequent words

##Membuat Word Cloud komentar negatif
#Mengubah Data Frame Menjadi Data Faktor
tdm_neg <- TermDocumentMatrix(tweets.negatif)
tdm_neg
## <<TermDocumentMatrix (terms: 22, documents: 2)>>
## Non-/sparse entries: 22/22
## Sparsity           : 50%
## Maximal term length: 11
## Weighting          : term frequency (tf)
m_neg <- as.matrix(tdm_neg)
View(m_neg)
v_neg <- sort(rowSums(m_neg),decreasing = TRUE)
head(v_neg)
##  "gagal",  "susah", "bohong", "hancur") "jangan",  "jelek", 
##         2         2         1         1         1         1

#Mengubah Data Faktor Menjadi Data Frame

d_neg <- data.frame(word = names(v_neg), freq = v_neg)
head(d_neg)
##                word freq
## "gagal",   "gagal",    2
## "susah",   "susah",    2
## "bohong", "bohong",    1
## "hancur") "hancur")    1
## "jangan", "jangan",    1
## "jelek",   "jelek",    1

Menampilkan visual wordcloud

wordcloud(tweets.negatif$word, d$freq,
          random.order = FALSE,
          max.words = 500,
          colors = brewer.pal(name = "Dark2",8 )) 

#Mengubah Data Faktor Menjadi Data Frame

tdm_negatif <- TermDocumentMatrix(tweets.negatif,
                                  control = list(wordLengths = c(1, Inf)))
tdm_negatif
## <<TermDocumentMatrix (terms: 31, documents: 2)>>
## Non-/sparse entries: 31/31
## Sparsity           : 50%
## Maximal term length: 11
## Weighting          : term frequency (tf)

Inspect frequent words

(freq.terms <- findFreqTerms(tdm_negatif, lowfreq = 1))
##  [1] "\"bohong\","   "\"gagal\","    "\"hancur\")"   "\"jangan\","  
##  [5] "\"jelek\","    "\"kesal\","    "\"malas\","    "\"marah\","   
##  [9] "\"mentalku\"," "\"percuma\","  "\"pusing\","   "\"sakit\","   
## [13] "\"sedih\","    "\"sengsara\"," "\"sia-sia\","  "\"sulit\","   
## [17] "\"susah\","    "\"tidak\","    "\"wacana\","   "c(\"telat\"," 
## [21] "1)"            "1,"            "11,"           "2,"           
## [25] "3,"            "4,"            "5,"            "6,"           
## [29] "8,"            "9,"            "c(15,"
term.freq <- rowSums(as.matrix(tdm_negatif))
term.freq <- subset(term.freq, term.freq >= 1)
df <- data.frame(term = names(term.freq), freq = term.freq)
ggplot(df, aes(x = term, y = freq)) + geom_bar(stat = "identity") +
  xlab("Terms Negatif") + ylab("Count") + coord_flip()

Buat DataFrame hanya untuk komentar Neutral

tweets.neutral<- data.frame(
  word =c("telat","wacana","semoga","susah", "pusing","terserah","percuma","mahasiswa","gagal","bohong", "malas", "jelek", "susah","sakit","sia-sia","kesal"),
  freq= c(12,11,11,11,7,7,6,6,5,5,4,4,1,1,1,1))
#Membuat Word Cloud komentar Neutral
#Mengubah Data Frame Menjadi Data Faktor
tdm_neutral <- TermDocumentMatrix(tweets.neutral)
tdm_neutral
## <<TermDocumentMatrix (terms: 17, documents: 2)>>
## Non-/sparse entries: 17/17
## Sparsity           : 50%
## Maximal term length: 12
## Weighting          : term frequency (tf)
m_neutral <- as.matrix(tdm_neutral)
View(m_neutral)
v_neutral <- sort(rowSums(m_neutral),decreasing = TRUE)
head(v_neutral)
##       11,  "susah", "bohong",  "gagal",  "jelek",  "kesal") 
##         3         2         1         1         1         1

#Mengubah Data Faktor Menjadi Data Frame

d_neutral <- data.frame(word = names(v_neutral), freq = v_neutral)
head(d_neutral)
##                word freq
## 11,             11,    3
## "susah",   "susah",    2
## "bohong", "bohong",    1
## "gagal",   "gagal",    1
## "jelek",   "jelek",    1
## "kesal")   "kesal")    1
wordcloud(tweets.neutral$word, d$freq,
          random.order = FALSE,
          max.words = 500,
          colors = brewer.pal(name = "Dark2",8 )) 

PEMBAGIAN DATA

#set nilai random generator

set.seed(122)

library(caret)
## Warning: package 'caret' was built under R version 4.3.2
## Loading required package: lattice
library(Matrix)

Membagi data 80% training, 20% testing

Membagi Data: Dataset dibagi menjadi data latih (train) dan data uji (test) dengan proporsi 80:20 menggunakan fungsi createDataPartition() dari paket ‘caret’.

` #set nilai random generator