Banyak cara orang memulai aktivitas di pagi hari dengan dengan banyak cara. Menikmati minuman hangat di pagi hari salah satu hal baik yang dilakukan untuk menyegarkan tubuh, salah satunya menikmati secangkir teh atau kopi di pagi hari. Kafein dari teh maupun kopi yang dikonsumsi oleh dewasa kalangan usia lanjut, memiliki fungsi fisik yang jauh lebih baik ketika masuk pada usia tua. Dimana penelitian ini dipimpin oleh Profesor Koh Woon Puay dari program riset kesehatan hidup lebih lama di Sekolah Kedokteran Yong Loo Lin di Universitas Nasional Singapura dan diterbitkan pada 21 juli 2023 di Journal of the American Medical Directors Association (JAMDA).
Kopi sendiri yang sudah ada sejak dulu, kini semakin banyak dan terus bertambah penikmatnya dari waktu ke waktu. Sehingga konsumsi dan produksinya pun terus meningkat dan memberikan keuntungan bagi petani kopi itu sendiri hingga ke customer sebagai penikmat nya. Dimana hal tersebut berdasarkan data dari International Coffee Organization (ICO) atau icocoffee.org, diperkirakan pada tahun 2023/2024 pasar kopi dunia akan meningkat 2,2% menjadi 177,0 juta kantong dengan surplus sebesar 1,.0 juta kantong kopi.
Sedangkan data di Indonesia sendiri, berdasarkan data dari databoks.katadata.co.id, menunjukkan bahwa Indonesia menjadi produsen kopi terbesar ke-3 di dunia pada 2022/2023 yang telah memproduksi kopi sebanyak 11,85 juta kantong. Dengan demikian, memicu semakin banyaknya permintaan pada biji kopi dan semakin meningkatnya jumlah usaha coffee shop di Indonesia. Hal tersebut disampaikan oleh Asosiasi Pengusaha Kopi dan Cokelat Indonesia (APKCI) yang memperkirakan pada tahun 2023, jumlah kedai kopi di Indonesia akan mencapai 10 ribu toko dengan pendapatan dari bisnis coffee shop diperkirakan akan mencapai 80 triliun rupiah.
Tidak hanya biji kopi yang memiliki banyak peningkatan permintaan, namun alat-alatnya pun semakin banyak di gandrungi oleh banyak orang yang ingin meracik atau membuat secangkir kopi dari hasil racikannya sendiri. Hal tersebut menjadi peluang yang cukup bagus untuk menciptakan serta menyediakan alat-alat dalam peracikan kopi, hingga banyak memunculkan brand-brand yang bersaing yang membuat konsumennya harus lebih selektif dan juga cermat dalam memilih berbagai produk yang ada di pasaran sesuai dengan kebutuhan serta kualitas dari barang itu sendiri.
Dan pada era serba digital saat ini, konsumen kini memiliki kecenderungan suatu pilihan berdasarkan keputusan mereka pada review produk yang mereka baca di internet. Berdasarkan informasi referensi dari beberapa sumber menunjukkan bahwa :
> Powerreviews.com, Research Power of Reviews 2023
*74% konsumen mengatakan bahwa, penilaian dan ulasan adalah cara utama mereka mempelajari produk yang belum pernah mereka beli sebelumnya.*
*98% pembeli mengatakan ulasan adalah sumber penting saat membuat keputusan pembelian.*
*Hampir 45% konsumen tidak akan membeli suatu produk jika tidak ada ulasan yang tersedia untuk produk tersebut.*
> Bazaarvoice.com, Blog Exploring The Bazaarvoice Shopper Experience Index 2022
*Pada tahun 2022 menunjukkan bahwa sebanyak 36% customer ingin membaca review, photo dan juga video dari customer lain.*
> Spiegel Medill North Western.edu, How Online Reviews Influence Sales
*Saat produk mulai menampilkan ulasan, tingkat konversi meningkat dengan cepat. Kemungkinan membeli produk dengan lima ulasan adalah 270% lebih besar dibandingkan kemungkinan membeli produk tanpa ulasan.*
Berdasarkan informasi tersebut dan dengan seiringnya perkembangan teknologi, perusahaan dapat menggunakan metode analisis sentimen dan pemodelan topik untuk memahami preferensi konsumen melalui review produk yang tersedia secara online. Sehingga dengan melihat banyaknya barang pembelian berdasarkan produk yang banyak di review, maka alternative brewing dapat menambah atau menjalin kerjasama dengan brand lain yang belum joint kerjasama. Sehingga akan menambah penawaran kepada customer preferensi pilihan barang lain. Dan ini juga menjadi salah satu evaluasi yang baik untuk perkembangan brand-brand coffee maker tersebut.
Project ini akan menggunakan dataset dari web https://alternativebrewing.com.au/ yang berisi review produk alat-alat kopi dan kopi dari berbagai macam brand. Adapun untuk datanya sendiri di tarik dengan cara metode web scrapping otomatis dan manual. Dalam project ini menggunakan Text Mining, salah satu metode analisis data yang fokus utamanya adalah mencari informasi dan pola-pola dari data yang tidak terstruktur, yaitu data teks sebagai variabel prediktornya dan Unsupervised Learning, dimana tidak memiliki target variabel. Dan selanjutnya dataset tersebut akan diproses dan dianalisis lebih lanjut menggunakan R. Saya juga akan menggunakan pendekatan Lexicon Based dan metode Support Vector Machine (SVM) untuk analisis sentimen, serta Latent Dirichlet Allocation (LDA) untuk pemodelan topik. Analisis sentimen Lexicon dan SVM akan memberikan gambaran tentang emosi positif dan negatif yang ada dalam review produk. Sedangkan LDA akan membantu dalam menentukan topik utama yang dibahas dalam review tersebut. Ini berarti project ini bertujuan untuk mengidentifikasi sentimen utama dari review serta topik-topik yang paling sering dibahas oleh konsumen.
Analisis sentimen dan review produk pada alternative brewing ini memiliki potensi untuk memberikan dampak bisnis sebagai berikut:
– Pemahaman konsumen yang Lebih Baik : Dengan memahami sentimen konsumen terhadap produk atau brand tertentu, perusahaan dapat lebih memahami kebutuhan dan keinginan konsumen mereka. Ini dapat membantu dalam pengembangan produk baru atau peningkatan produk yang ada.
– Pengembangan Produk : Analisis ulasan dapat membantu perusahaan mengidentifikasi fitur atau aspek produk yang paling disukai atau tidak disukai oleh konsumen. Informasi ini dapat digunakan untuk menginformasikan brand untuk mendesain dan pengembangan produk di masa mendatang.
– Peningkatan Layanan konsumen : Dengan memahami masalah atau keluhan yang sering muncul dalam ulasan, perusahaan dapat berusaha untuk memperbaiki area tersebut dan meningkatkan kepuasan konsumen.
Proyek ini berpotensi untuk memberikan nilai yang signifikan bagi perusahaan dalam industri kopi, membantu mereka untuk menerapkan serta meningkatkan strategi pemasaran yang tepat, lebih responsif terhadap kebutuhan dan preferensi konsumen, dan akhirnya meningkatkan kepuasan konsumen dan hasil bisnis. Seluruh aktivitas yang berfokus pada persepsi dan opini pelanggan akan sangat membantu pelaku usaha online untuk mendapatkan lebih banyak customer dan menjaga para customer tersebut agar tetap loyal.
Target pengguna dari project ini adalah perusahaan dan pemasar yang tertarik untuk memahami persepsi konsumen terhadap produk mereka. Analisis ini dapat membantu mereka memahami sentimen konsumen dan topik yang paling banyak dibahas dalam review produk, memberikan gambaran yang jelas tentang apa yang dihargai oleh konsumen, apa yang tidak mereka sukai, dan apa yang bisa diperbaiki. Sebagai contoh, jika pemodelan topik menunjukkan bahwa banyak review yang membahas tentang keluhan kualitas alat atau kopi dari brand tertentu, ini adalah tanda bahwa perusahaan mungkin perlu melihat dan mereview kembali produk yang mereka buat tersebut. Adapun manfaat yang diperoleh dari project ini adalah kemudahan pengolahan data review customer yang dikaitkan dengan jenis produk. User juga mendapatkan insight serta visualisasi data yang mudah dipahami dan digunakan untuk melakukan analisis.
Tujuan dari project ini adalah untuk memberikan gambaran menyeluruh tentang sentimen dan topik dalam review produk brand alat kopi pada alternative brewing. Kami akan membuat sebuah program dengan R yang mampu melakukan analisis sentimen menggunakan Lexicon Based dan SVM dan pemodelan topik menggunakan LDA. Output dari project ini akan berupa dashboard interaktif yang memvisualisasikan hasil analisis sentimen dan pemodelan topik. Dashboard ini akan menunjukkan distribusi sentimen dalam review produk dan topik-topik utama yang dibahas. Output ini tidak hanya memberikan wawasan yang bermanfaat bagi perusahaan brand kopi tersebut, tetapi juga dapat digunakan sebagai alat yang efektif dalam pembuatan keputusan bisnis baik untuk perusahaan brand kopi atau alternative brewing.
library(rvest)
library(dplyr)
library(tidyr)
library(ggplot2)
library(plotly)
library(lubridate)
library(GGally)
library(RColorBrewer)
library(tidyverse)
library(syuzhet)
library(topicmodels)
library(textmineR)
library(wordcloud2)
library(wordcloud)
library(ggwordcloud)
library(factoextra)
library(FactoMineR)
library(ggiraphExtra)
library(xml2)
library(tm)
library(tmap)
library(tidytext)Hal pertama yang harus kita lakukan yaitu import data kita terlebih
dahulu read.csv.
Kita gunakan
head()untuk melihat urutan data teratas dan gunakantail()untuk melihat urutan data paling bawah.
Cek struktur tipe data yang kita miliki menggunakan
glimpse()
#> Rows: 1,920
#> Columns: 11
#> $ No <int> 1, 2, 3, 4, 5, 6, 31, 32, 33, 34, 35, 36, 13, 14,…
#> $ product.category <chr> "Manual Brewing", "Manual Brewing", "Manual Brewi…
#> $ product.name <chr> "AeroPress Coffee Maker", "AeroPress Coffee Maker…
#> $ product.price <int> 456000, 456000, 456000, 456000, 456000, 456000, 5…
#> $ review.count <int> 1199, 1199, 1199, 1199, 1199, 1199, 205, 205, 205…
#> $ review.author <chr> "Joseph M.", "DEAN S.", "Dimuth H.", "Benjamin T.…
#> $ review.title <chr> "Great aeropress", "Aero magic", "Minimalist perf…
#> $ review.content <chr> "Great product, does an amazing job", "Love the A…
#> $ review.date <chr> "9/30/2023", "9/25/2023", "9/12/2023", "9/6/2023"…
#> $ review.helpfullness <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0…
#> $ review.unhelpfulness <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
Dari fungsi glimpse() yang telah kita jalankan diatas,
kita mendapatkan informasi bahwa terdapat 1.920 baris dan 11 kolom.
Memuat informasi columns sebagai berikut :
No : No urut data
product.category : Kategori produk
product.name : Nama produk
product.price : Harga produk
review.count : Jumlah ulasan atau review
review.author : Nama penulis ulasan atau review
review.title : Judul ulasan atau review
review.content : Isi ulasan atau review
review.date : Tanggal dipublikasikannya ulasan atau review
review.helpfullness : Jumlah ulasan atau review yang dianggap membantu (jumlah like ulasan)
review.unhelpfulness: Jumlah ulasan atau review yang dianggap tidak membantu (jumlah unlike ulasan)
Mengambil Kolom dan Meriksa Struktur Data
Dan dari data tersebut, kita tidak akan menggunakan semua data. Kita
hanya akan berfokus pada data yang ingin kita gunakan saja yaitu
product.name, review.helpfullness,
review.content. Adapun Untuk bagian kolom, kita hanya akan
menggunakan data review.content dan
review.helpfullness untuk analisanya, dan untuk
observasinya kita akan menggunakan struktur data data_ab
yang ada.
#> [1] 7
#> [1] 70
Selanjutnya dengan menggunakan fungsi
anyNA()atausum(is.na())kita akan mengecheck apakah terdapat missing value atau tidak.
#> [1] FALSE
#> [1] 0
Dari hasil tersebut menunjukkan output FALSE atau
0 yang artinya tidak terdapat missing value.
Pemilihan observasi data berfokus pada Hario produk
dengan jumlah observasi yang paling banyak untuk dianalisa.
data_coffee <- data_ab2[grepl("Hario", data_ab2$product.name, ignore.case = TRUE), ]
length(unique(data_coffee$product.name))#> [1] 8
data <- data_coffee %>%
filter(!is.na(review.content)) %>%
distinct()
product_populer <- data %>%
group_by(product.name) %>%
summarise(n = n()) %>%
arrange(desc(n))
product_populerDari product_populer kita mendapatkan data bahwa produk
Delter Cold Drip Coffee MakerHario Cold Brew Pot 1L
memiliki total review paling banyak yaitu 943
selected_product <- data_coffee %>%
filter(product.name %in% c("Hario Cold Brew Pot 1L")) %>%
select(review.content, review.helpfullness)
selected_productPada proses selanjutnya kita akan membersihkan kolom
review.content. Dimana pada kaolom tersebut merupakan kolom
yang berisi review dari pembelian produk oleh konsumen Untuk dianalisa
lebih lanjut, sehingga hasilnya pu lebih akurat. Maka kita perlu
melakukan pembersihan data pada kolom tersebut yaitu dengan : - Membuat
corpus. - Mengubah semua karakter string kata ke format huruf kecil
semua (lowercase). Hal ini bertujuan agar kata yang sama memiliki makna
yang sama pula. - Menghilangkan angka, karena karakter ini tidak
dibutuhkan dalam analisis teks selanjutnya. - Menghilangkan tanda baca
(punctuation). - Menghilangkan kata hubung yang sering muncul tapi tidak
punya arti yang signifikan (Stopwords).
selected_product$review.content <- selected_product$review.content %>% str_replace_all("’", "'")
corpus <- Corpus(VectorSource(selected_product$review.content))
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("english"))
remove_uninformative_words <- function(corpus) {
uninformative_words <- c("can", "will", "didn't", "'re", "'m", "get", "'ve", "'s", "like", "don't", "just")
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removeWords, uninformative_words)
return(corpus)}
corpus <- remove_uninformative_words(corpus)
head(corpus$content, 3)#> [1] "great product really easy use minimal pieces making super easy clean use regret didnt sooner drinking bitter coffee long"
#> [2] "absolutely love brew last days every coffee lover needs one"
#> [3] "easy order quick delivery easy use enjoying cold brew day width splash coconut milk ice barista back day testify cold brew jug job"
Sekarang kita membuat wordcloud untuk melihat kata apa yang sering
muncul. Wordcloud adalah gambar yang menunjukkan daftar kata-kata yang
digunakan dalam sebuah teks, umumnya semakin banyak kata yang digunakan
semakin besar ukuran kata tersebut dalam gambar. Dan untuk wordcloud ini
datanya tidak kami ambil dari corpus, melainkan menggunakan
data data_ab2 yang memiliki lebih banyak kosa kata.
Setelah product.name kita proses, maka kita masukkan
kembali ke dalam dataset.
process_reviews <- sapply(corpus, as.character)
selected_product$review.content <- process_reviews
head(selected_product)Kita akan menggunakan pendekatan lexicon-based dan metode SVM untuk analisis sentimen kita. Untuk menganalisis sentimen menggunakan pendekatan lexicon-based dan SVM, kita bisa menggunakan library syuzhet dalam R. Syuzhet menggunakan empat metode berbeda untuk ekstraksi sentimen: metode “syuzhet”, “bing”, “afinn”, dan “nrc”. Project ini akan menggunakan metode bing. Metode bing ini didasarkan pada pendekatan lexicon yang dikembangkan oleh Bing Liu dan kolaboratornya. Lexicon ini hanya berisi daftar kata-kata yang dianggap positif atau negatif, dan analisis sentimen dilakukan dengan menghitung frekuensi kata-kata positif dan negatif dalam teks.
#sentiment reviews
sentiment.score <- get_sentiment(selected_product$review.content, method = "bing")
#add sentiment reviews to the data frame
selected_product$sentiment.score <- sentiment.score
selected_productSetelah mendapatkan sentiment.count nya, kita coba
bandingkan dengan variabel di dalam data: review.count.
Asumsinya semakin tinggi review.count yang diberikan, maka
sentiment.count meningkat pula.
ggplot(selected_product, aes(x = sentiment.score)) +
geom_histogram(binwidth = 1) +
theme_minimal() +
xlab("Review Count") +
ylab("Count") +
ggtitle("Distribution of Sentiment Count")# Calculate average sentiment count
mean_sentiment.score <- mean(selected_product$sentiment.score, na.rm = TRUE)
mean_sentiment.score#> [1] 2.007498
Data sentimen count nya berdistribusi normal. Karena nilai signifikansinya lebih dari 0,05.
Sekarang kita coba lihat kecenderungannya dari sentiment count lebih banyak ke arah positif atau negatif. Nilai 0 dianggap masuk ke sentimen negatif karena dianggap tidak merekomendasikan produknya.
selected_product$sentiment.category <- ifelse(selected_product$sentiment.score > 1, "Positive", "Negative")
table(selected_product$sentiment.category)#>
#> Negative Positive
#> 603 864
Dari hasil data tersebut dapat diketahui bahwa, terdapat lebih banyak review positive sebanyak 864. Dan memiliki review negative lebih sedikit sebanyak 603. Oleh karena itu model ini bisa dikembangkan lebih lanjut untuk mengetahui bobot mana yang lebih tinggi sebagai informasi yang paling kuat.
Membuat visualisasi persebaran sentiment score terhadap product rating dengan boxplot.
ggplot(selected_product,
aes(y = factor(review.helpfullness), x = sentiment.score)) +
geom_boxplot() +
labs(title = "Persebaran Sentiment Scores terhadap Review Helpfullness",
y = "Review Helpfullness",
x = "Sentiment Score") +
theme_minimal()Topic modeling adalah metode yang berguna untuk menemukan topik atau tema utama dalam kumpulan dokumen atau teks. Dalam konteks ini, kita akan menggunakan model topik untuk mencari tahu apa saja topik yang umum dalam ulasan yang memiliki sentimen negatif. Proyek ini akan menggunakan metode Latent Dirichlet Allocation (LDA), yang merupakan metode yang umum digunakan dalam pembuatan model topik.
Pertama-tama, kita perlu memilih ulasan yang kita ingin analisis. Karena kita tertarik pada ulasan dengan sentimen negatif, kita akan memilih ulasan ini dari data kita.
negative.reviews <- selected_product[selected_product$sentiment.category == "Negative",]
negative.reviewsSebelum kita dapat menjalankan model topik, kita perlu mengubah teks kita menjadi format yang bisa dipahami oleh algoritma. Salah satu cara untuk melakukan ini adalah dengan membuat document-term matrix (DTM), yang mencatat berapa kali setiap kata muncul di setiap ulasan.
corp_negative <- Corpus(VectorSource(negative.reviews$review.content))
dtm <- DocumentTermMatrix(corp_negative)
corp_negative#> <<SimpleCorpus>>
#> Metadata: corpus specific: 1, document level (indexed): 0
#> Content: documents: 603
Sekarang, kita dapat menjalankan model topik menggunakan LDA. Kita perlu memutuskan jumlah topik yang ingin kita hasilkan. Sebagai awal, kita mungkin memutuskan untuk mencari 5 topik utama dalam ulasan negatif. Jumlah 5 (nilai k=5) ini masih berdasarkan nilai dipilih secara subjektif. Nantinya nilai k yang optimum akan dicari setelah modelnya dibangun.
6.7.2.1 Menggunakan model topiC models LDA (Latent Dirichlet Allocation)
#memeriksa semua baris 0
raw.sum=apply(dtm,1,FUN=sum) #sum by raw each raw of the table
dtm=dtm[raw.sum!=0,]lda_model <- LDA(dtm, k = 10) #Change 'k' to select a different number of topics
terms(lda_model, 20) #Change '5' to select a different number of terms per topic#> Topic 1 Topic 2 Topic 3 Topic 4 Topic 5
#> [1,] "coffee" "product" "simple" "great" "cold"
#> [2,] "cold" "cold" "use" "coffee" "brew"
#> [3,] "brew" "brew" "beans" "awesome" "perfect"
#> [4,] "make" "excellent" "really" "cold" "little"
#> [5,] "iced" "service" "brew" "arrived" "coffee"
#> [6,] "delicious" "brewing" "easy" "pot" "fridge"
#> [7,] "instructions" "one" "now" "gift" "way"
#> [8,] "made" "coffee" "cold" "makes" "water"
#> [9,] "recommend" "second" "effective" "ordered" "home"
#> [10,] "way" "cant" "money" "brew" "highly"
#> [11,] "brewing" "bought" "value" "tasting" "filter"
#> [12,] "full" "hario" "first" "fantastic" "make"
#> [13,] "used" "christmas" "thing" "amazing" "fits"
#> [14,] "hours" "days" "instructions" "loves" "making"
#> [15,] "now" "fault" "summer" "black" "good"
#> [16,] "one" "hot" "clean" "friend" "wanted"
#> [17,] "japanese" "alternative" "proof" "box" "summer"
#> [18,] "english" "brewed" "cup" "item" "much"
#> [19,] "love" "first" "coffee" "hario" "tastes"
#> [20,] "drink" "never" "need" "purchased" "partner"
#> Topic 6 Topic 7 Topic 8 Topic 9 Topic 10
#> [1,] "brew" "happy" "use" "good" "cold"
#> [2,] "cold" "brew" "easy" "quick" "brew"
#> [3,] "love" "quality" "cold" "exactly" "makes"
#> [4,] "pot" "cold" "brew" "delivery" "coffee"
#> [5,] "coffee" "hario" "coffee" "first" "make"
#> [6,] "much" "pot" "day" "time" "good"
#> [7,] "makes" "purchase" "love" "came" "jug"
#> [8,] "really" "time" "job" "ive" "though"
#> [9,] "dont" "side" "jug" "already" "easily"
#> [10,] "cheap" "filter" "filter" "work" "best"
#> [11,] "need" "service" "morning" "one" "started"
#> [12,] "want" "cheap" "next" "really" "ive"
#> [13,] "drip" "now" "making" "quickly" "without"
#> [14,] "hario" "results" "says" "summer" "look"
#> [15,] "daily" "first" "tasty" "second" "one"
#> [16,] "filter" "really" "quick" "arrived" "far"
#> [17,] "time" "extremely" "ice" "purchasing" "using"
#> [18,] "keep" "couldnt" "put" "looking" "day"
#> [19,] "enjoying" "apart" "ground" "online" "delivery"
#> [20,] "courier" "easier" "pot" "brewing" "forward"
Hasil topic modeling yang diperoleh tampaknya sudah cukup bagus karena banyak kata yang tampak relevan dengan konteks review.
6.7.2.2 Menggunakan FitLdaModel
Fungsi FitLdaModel digunakan di sini berasal dari paket textmineR di R, sedangkan sebelumnya kita menggunakan fungsi LDA dari paket topicmodels. Mereka berdua melakukan hal yang sama, yaitu melakukan Latent Dirichlet Allocation (LDA) pada sebuah Document-Term Matrix (DTM), tetapi mereka memiliki sedikit perbedaan dalam hal bagaimana mereka melakukan hal tersebut dan apa saja argumen dan output yang mereka berikan.
dtm_fitl <- Matrix::Matrix(as.matrix(dtm), sparse = T)
set.seed(123)
fitl_model <- FitLdaModel(dtm_fitl,
k = 5,
iterations = 1000,
burnin = 500,
calc_coherence = T)
glimpse(fitl_model)#> List of 7
#> $ phi : num [1:5, 1:1037] 0.0048166 0.0020381 0.0000441 0.000053 0.0000524 ...
#> ..- attr(*, "dimnames")=List of 2
#> .. ..$ : chr [1:5] "t_1" "t_2" "t_3" "t_4" ...
#> .. ..$ : chr [1:1037] "back" "barista" "brew" "coconut" ...
#> $ theta : num [1:602, 1:5] 0.9822 0.0118 0.9822 0.0118 0.9822 ...
#> ..- attr(*, "dimnames")=List of 2
#> .. ..$ : chr [1:602] "1" "2" "3" "4" ...
#> .. ..$ : chr [1:5] "t_1" "t_2" "t_3" "t_4" ...
#> $ gamma : num [1:5, 1:1037] 0.64576 0.33111 0.00742 0.00783 0.00788 ...
#> ..- attr(*, "dimnames")=List of 2
#> .. ..$ : chr [1:5] "t_1" "t_2" "t_3" "t_4" ...
#> .. ..$ : chr [1:1037] "back" "barista" "brew" "coconut" ...
#> $ data :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
#> .. ..@ i : int [1:5374] 0 2 4 10 28 78 326 0 2 4 ...
#> .. ..@ p : int [1:1038] 0 7 11 256 259 529 554 580 676 685 ...
#> .. ..@ Dim : int [1:2] 602 1037
#> .. ..@ Dimnames:List of 2
#> .. ..@ x : num [1:5374] 1 1 1 1 1 1 1 1 1 1 ...
#> .. ..@ factors : list()
#> $ alpha : Named num [1:5] 0.1 0.1 0.1 0.1 0.1
#> ..- attr(*, "names")= chr [1:5] "t_1" "t_2" "t_3" "t_4" ...
#> $ beta : Named num [1:1037] 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 ...
#> ..- attr(*, "names")= chr [1:1037] "back" "barista" "brew" "coconut" ...
#> $ coherence: Named num [1:5] 0.0778 0.0866 0.0803 0.0674 0.0881
#> ..- attr(*, "names")= chr [1:5] "t_1" "t_2" "t_3" "t_4" ...
#> - attr(*, "class")= chr "lda_topic_model"
Berikut adala beberapa atribut yang diperoleh dari Model LDA: -
phi adalah atribut yang menerangkan kemungkinan
per-topik-per-kata. - theta adalah atribut yang menerangkan
kemungkinan per-dokumen-per-topik. - coherence adalah
atribut yang menerangkan coherence-per-topik.
block <-
fitl_terms %>%
rownames_to_column("id") %>%
mutate(id = as.numeric(id)) %>%
pivot_longer(-id, names_to = "topic", values_to = "term") %>%
ggplot(aes(label = term, size = rev(id), alpha = rev(id))) +
geom_text_wordcloud (seed = 123) +
facet_wrap(~topic, scales = "free") +
scale_alpha_continuous(range = c(0.4, 1)) +
theme_minimal() +
theme(strip.background = element_rect(fill = "red"),
strip.text.x = element_text(colour = "white"))
blockfitl_terms %>%
rownames_to_column("id") %>%
mutate(id = as.numeric(id)) %>%
pivot_longer(-id, names_to = "topic", values_to = "term") %>%
mutate(topic = factor(topic)) %>%
group_by(topic) %>%
mutate(term_freq = n()) %>%
ungroup() %>%
group_by(term) %>%
summarise(term_freq = sum(term_freq)) %>%
wordcloud2()Nilai theta yang tinggi pada term menunjukkan bahwa term tersebut memiliki probabilitas yang tinggi dihasilkan dari topik tersebut. Hal ini juga mengindikasikan bahwa term tersebut memiliki asosiasi yang kuat kepada topik tertentu. Interpretasi topik dilakukan tidak hanya melihat kata-kata yang paling sering muncul, namun juga mempertimbangkan konteks dari review dengan menggunakan top 10 review pada setiap topik berdasarkan nilai thetanya.
# Menyimpan Theta per Topik
rating_low_theta <-
fitl_model$theta %>%
as.data.frame() %>%
rownames_to_column("document")
rating_low_thetaKarena jumlah row pada data negative.reviews terdapat
603 row , sedangkan pada rating_low_theta terdapat 602 row.
Maka kita tambahkan 1 row lagi agar data antara
negative.reviews dan `rating_low_theta menjadi belance.
Selanjutnya menggabungkan nilai Theta dengan data awal untuk mendapatkan isi review yang lengkap.
rating_review <- rating_low_theta2 %>%
cbind(negative.reviews, deparse.level = 0)
head(rating_review, 10)Menginterpretasikan 10 ulasan teratas pada setiap topik. > 6.7.4.1 Topik 1
#> [1] "cold" "brew" "make" "easy" "delivery"
#> [6] "use" "quick" "perfect" "way" "simple"
#> [11] "good" "instructions" "coffee" "arrived" "gift"
#> [16] "christmas" "ordered" "jug" "order" "day"
#> [21] "summer" "item" "easily" "ice" "job"
#> [26] "ive" "product" "partner" "got" "doesnt"
#> [31] "loves" "iced" "home" "came" "japanese"
#> [36] "due" "milk"
6.7.4.2 Topik 2
#> [1] "brew" "cold" "coffee" "good" "really"
#> [6] "simple" "need" "great" "use" "filter"
#> [11] "first" "little" "pot" "beans" "easy"
#> [16] "makes" "fridge" "grind" "water" "time"
#> [21] "tasty" "perfect" "dont" "got" "though"
#> [26] "morning" "value" "much" "even" "ground"
#> [31] "money" "super" "instructions" "grounds" "enjoying"
#> [36] "seems" "size"
6.7.4.3 Topik 3
#> [1] "cold" "brew" "use" "coffee" "great" "easy"
#> [7] "makes" "product" "awesome" "excellent" "love" "pot"
#> [13] "simple" "making" "day" "hario" "next" "way"
#> [19] "started" "quickly" "delicious" "less" "exactly" "delivered"
#> [25] "recommend" "also" "arrived" "tasting" "highly" "jug"
#> [31] "filter" "fridge" "using" "put" "amazing" "days"
#> [37] "taste"
6.7.4.4 Topik 4
#> [1] "great" "cold" "product" "brew" "happy" "service"
#> [7] "quality" "coffee" "hario" "purchase" "one" "brewing"
#> [13] "exactly" "pot" "ive" "batch" "first" "best"
#> [19] "second" "also" "jug" "make" "well" "never"
#> [25] "days" "looking" "drinking" "wanted" "cant" "bought"
#> [31] "cheap" "without" "ever" "hot" "beans" "item"
#> [37] "look"
6.7.4.5 Topik 5
#> [1] "brew" "cold" "love" "coffee" "one"
#> [6] "pot" "brewing" "easy" "made" "used"
#> [11] "much" "hario" "now" "time" "buy"
#> [16] "ive" "first" "hours" "recommend" "delicious"
#> [21] "make" "fridge" "buying" "purchase" "another"
#> [26] "quality" "alternative" "filter" "glass" "door"
#> [31] "doesnt" "instructions" "using" "always" "daily"
#> [36] "something" "english"