Pada era digital saat ini, perusahaan-perusahaan kecantikan, khususnya yang bergerak di industri skincare, memiliki tantangan besar untuk memahami kebutuhan dan persepsi konsumennya. Penggunaan produk skincare telah menjadi bagian penting dalam rutinitas sehari-hari banyak orang dan dengan berbagai pilihan produk yang ada di pasaran, konsumen kini lebih selektif dan cermat dalam memilih produk yang akan mereka gunakan. Sebagian besar konsumen kini mendasarkan keputusan mereka pada review produk yang mereka baca di internet.
BrightLocal’s “Local Consumer Review Survey” pada tahun 2020 menunjukkan bahwa 87% konsumen membaca review online sebelum membeli produk atau menggunakan layanan. Meskipun studi ini tidak secara spesifik ditujukan untuk produk skincare, kita bisa mengasumsikan bahwa tren ini juga berlaku di industri skincare. Referensi: BrightLocal, Local Consumer Review Survey 2020
Studi dari Spiegel Research Center di Northwestern University menunjukkan bahwa pembelian produk dapat meningkat hingga 270% setelah produk menerima setidaknya lima review. Referensi: Spiegel Research Center, How Online Reviews Influence Sales
Laporan dari “Think with Google” menunjukkan bahwa 60% konsumen millennial mengaku bahwa mereka akan membeli produk setelah menonton video review produk. Ini menunjukkan betapa pentingnya review dalam pengambilan keputusan pembelian, baik dalam bentuk teks atau video. Referensi: Think with Google, Why Online Video Is a Must-Have for Your Mobile Marketing Strategy
Studi oleh Bazaarvoice menunjukkan bahwa 54% pembeli online pada tahun 2020 mengatakan bahwa mereka membaca review sebelum melakukan pembelian. Referensi: Bazaarvoice, Shopper Experience Index
Seiring dengan perkembangan teknologi, perusahaan dapat menggunakan metode analisis sentimen dan pemodelan topik untuk memahami preferensi konsumen melalui review produk yang tersedia secara online.
Project ini akan menggunakan dataset dari Kaggle yang berisi review produk skincare dari Sephora. Dataset tersebut akan diproses dan dianalisis menggunakan R. Kami akan menggunakan pendekatan Lexicon untuk analisis sentimen dan Latent Dirichlet Allocation (LDA) untuk pemodelan topik. Analisis sentimen Lexicon akan memberikan gambaran tentang emosi positif, negatif, atau netral 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 skincare ini memiliki potensi untuk memberikan dampak bisnis sebagai berikut:
– Pemahaman konsumen yang Lebih Baik: Dengan memahami sentimen konsumen terhadap produk skincare 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 desain 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 skincare, membantu mereka untuk merapkan strategi pemasaran yang tepat, lebih responsif terhadap kebutuhan dan preferensi konsumen, dan akhirnya meningkatkan kepuasan konsumen dan hasil bisnis.
Target pengguna dari project ini adalah perusahaan skincare dan pemasar yang tertarik untuk memahami persepsi konsumen terhadap produk mereka. Analisis ini dapat membantu mereka memahami sentimen konsumen dan topik yang paling 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 efek iritasi dari produk tertentu, ini adalah tanda bahwa perusahaan mungkin perlu melihat kembali formulasi produk tersebut.
Tujuan dari project ini adalah untuk memberikan gambaran menyeluruh tentang sentimen dan topik dalam review produk skincare dari Sephora. Kami akan membuat sebuah program dengan R yang mampu melakukan analisis sentimen menggunakan Lexicon 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 skincare, tetapi juga dapat digunakan sebagai alat yang efektif dalam pembuatan keputusan bisnis.
Langkah pertama, kita siapkan library dari package di R yang dibutuhkan.
Kemudian langkah berikutnya adalah adalah pra-pemrosesan data.
Pertama, kita akan memuat dataset menggunakan fungsi
read.csv dalam R. Setelah itu, kita akan memeriksa struktur
dan karakteristik dasar dari data menggunakan fungsi seperti
str dan summary. Selanjutnya, kita akan
melakukan pembersihan data awal yang melibatkan penghapusan data yang
hilang atau duplikat, serta transformasi data jika diperlukan.
Prapemrosesan data ini penting untuk memastikan bahwa data kita siap
untuk analisis lebih lanjut dan pemodelan.
#Read data
product <- read.csv("archive-10/product_info.csv")
review1 <- read.csv("archive-10/reviews_0_250.csv")
review2 <- read.csv("archive-10/reviews_250_500.csv")
review3 <- read.csv("archive-10/reviews_500_750.csv")
review4 <- read.csv("archive-10/reviews_750_1000.csv")
review5 <- read.csv("archive-10/reviews_1000_1500.csv")
review6 <- read.csv("archive-10/reviews_1500_end.csv")#Satukan data
review <- rbind(review1,review2,review3,review4,review5,review6 )
head(review)str(review)#> 'data.frame': 1301136 obs. of 19 variables:
#> $ X : int 0 1 2 3 4 5 6 7 8 9 ...
#> $ author_id : chr "1741593524" "31423088263" "5061282401" "6083038851" ...
#> $ rating : int 5 1 5 5 5 4 2 5 5 5 ...
#> $ is_recommended : num 1 0 1 1 1 1 0 1 1 1 ...
#> $ helpfulness : num 1 NA NA NA NA 1 0.25 NA 1 1 ...
#> $ total_feedback_count : int 2 0 0 0 0 1 8 0 1 2 ...
#> $ total_neg_feedback_count: int 0 0 0 0 0 0 6 0 0 0 ...
#> $ total_pos_feedback_count: int 2 0 0 0 0 1 2 0 1 2 ...
#> $ submission_time : chr "2023-02-01" "2023-03-21" "2023-03-21" "2023-03-20" ...
#> $ review_text : chr "I use this with the Nudestix “Citrus Clean Balm & Make-Up Melt“ to double cleanse and it has completely changed"| __truncated__ "I bought this lip mask after reading the reviews and the hype. Unfortunately, it did not meet my expectations a"| __truncated__ "My review title says it all! I get so excited to get into bed and apply this lip mask. I do see a difference be"| __truncated__ "I’ve always loved this formula for a long time. I honestly don’t even use it for night time. I use it as an eve"| __truncated__ ...
#> $ review_title : chr "Taught me how to double cleanse!" "Disappointed" "New Favorite Routine" "Can't go wrong with any of them" ...
#> $ skin_tone : chr "" "" "light" "" ...
#> $ eye_color : chr "brown" "" "brown" "brown" ...
#> $ skin_type : chr "dry" "" "dry" "combination" ...
#> $ hair_color : chr "black" "" "blonde" "black" ...
#> $ product_id : chr "P504322" "P420652" "P420652" "P420652" ...
#> $ product_name : chr "Gentle Hydra-Gel Face Cleanser" "Lip Sleeping Mask Intense Hydration with Vitamin C" "Lip Sleeping Mask Intense Hydration with Vitamin C" "Lip Sleeping Mask Intense Hydration with Vitamin C" ...
#> $ brand_name : chr "NUDESTIX" "LANEIGE" "LANEIGE" "LANEIGE" ...
#> $ price_usd : num 19 24 24 24 24 24 24 24 24 24 ...
Nama-nama dalam kolom di dataset sudah mencerminkan variabel yang dimaksud.
Tampak bahwa setelah disatukan, data terdiri dari 19 kolom dan
1.301.136 baris observasi. Jumlah ini sangat besar. Kita tidak akan
menggunakan semua data. Maka kita pilih variabel dan data yang akan kita
gunakan saja. Untuk kolom, kita hanya akan menggunakan
review_text untuk dianalisa. Sedangkan untuk data
observasi, kita akan
#Melihat struktur data
length(unique(review$product_name))#> [1] 2334
Keterangan dataset: Nama-nama kolom sudah mencerminkan variabel data yang dimaksud.
Project memilih data 1 produk perawatan untuk wajah berjerawat dengan jumlah observasi yang paling banyak untuk dianalisa.
Produk perawatan kulit berfokus pada berbagai jenis masalah kulit, dan setiap produk memiliki target demografis dan kebutuhan kulit tertentu. Jerawat adalah salah satu masalah kulit yang paling umum dihadapi oleh banyak orang, terutama remaja dan orang dewasa muda, tetapi juga dapat mempengaruhi individu di semua usia. Produk yang dirancang untuk mengatasi masalah jerawat umumnya menargetkan konsumen dengan jenis kulit berminyak atau kombinasi, dan bisa memiliki penjualan yang tinggi dan dampak yang signifikan di pasar. Oleh karena itu, memilih produk ini untuk analisis akan memungkinkan kita untuk mendapatkan pemahaman yang lebih baik tentang apa yang dicari konsumen dalam produk perawatan jerawat dan bagaimana mereka merespons produk tersebut.
Selain itu, memilih produk dengan jumlah ulasan terbanyak memberikan keuntungan lain. Semakin banyak ulasan yang kita miliki, semakin baik kita bisa memahami persepsi konsumen tentang produk tersebut. Dengan jumlah ulasan yang besar, kita bisa mendapatkan gambaran yang lebih lengkap dan akurat tentang pendapat konsumen, karena kita memiliki data yang cukup untuk mengurangi bias yang mungkin ada dalam ulasan. Juga, produk yang mendapatkan banyak ulasan cenderung menjadi produk yang populer atau yang banyak dibeli, yang berarti wawasan yang kita dapatkan dari analisis ini dapat memiliki dampak bisnis yang signifikan.
Dengan memilih produk untuk jerawat dengan ulasan terbanyak, kita bisa mendapatkan wawasan yang berharga tentang bagaimana konsumen dengan masalah kulit jerawat merespon produk skincare, apa yang mereka cari dalam produk ini, dan bagaimana kita bisa memperbaiki produk atau memasarkan mereka lebih efektif. Ini dapat membantu perusahaan untuk merancang produk yang lebih baik, memperkuat strategi pemasaran mereka, dan pada akhirnya meningkatkan penjualan dan kepuasan pelanggan.
data_observe <- review[grepl("acne", review$product_name, ignore.case = TRUE), ]
length(unique(data_observe$product_name))#> [1] 69
library(tidyverse)
data <- data_observe %>%
filter(!is.na(review_text)) %>%
distinct()
most_reviewed_product <- data %>%
group_by(product_name) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
top_n(1)
most_reviewed_product Kita akan mengambil review 1 produk perawatan wajah berjerawat yang mendapatkan review terbanyak.
selected_product <- data_observe %>%
filter(product_name %in% c("Salicylic Acid Acne Healing Dots")) %>%
#select(review_text, brand_name,product_name, rating, is_recommended)
select(review_text,rating)Kolom review_text merupakan kolom yang berisi review konsumen. Untuk dianalisa lebih lanjut agar hasilnya akurat, kita perlu melakukan pembersihan data text 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 kata hubung yang sering muncul tapi tidak punya arti yang signifikan. - Menghilangkan tanda baca.
#Membuat corpus dan membersihkan teks
selected_product$review_text <- selected_product$review_text %>% str_replace_all("’", "'")
corpus <- Corpus(VectorSource(selected_product$review_text))
corpus <- tm_map(corpus, content_transformer(tolower))
#corpus <- tm_map(corpus, removeWords, "'ve")
#orpus <- tm_map(corpus, removeWords, "doesn't")
#corpus <- tm_map(corpus, removeWords, "product")
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("'m", "'ve", "'s", "don't", "get", "just", "can", "see", "will", "didn't", "put", "like", "now", "'re", "product", "acne", "pimple", "pimples", "ive", "one")
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] " using patches salicylic acid part interesting usually hydrocolloid ones better"
#> [2] "amazing patches think might best patches ever tried really helped clear spots really stood well stuck skin werent sticky stayed stuck skin well unlike patches especially applying skincare"
#> [3] "thanks influenster complimentary great day youre going wear face base call clean face dot makeup otherwise youll edge defeats purpose"
Sekarang kita membuat wordcloud untuk melihat kata apa yang sering muncul.
# Membuat wordcloud
wordcloud(corpus, min.freq = 100,width = 800, height = 800, random.order = FALSE, warning= FALSE, colors = brewer.pal(8, "Dark2"))Setelah review_text kita proses, maka kita masukkan kembali ke dalam dataset.
processed_text <- sapply(corpus, as.character)
selected_product$review_text <- processed_text
head(selected_product)Kita akan menggunakan pendekatan lexicon-based untuk analisis
sentimen kita. Untuk menganalisis sentimen menggunakan pendekatan
lexicon-based, kita bisa menggunakan paket 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.
# Load library
library(syuzhet)
# Extract sentiment scores
sentiment_scores <- get_sentiment(selected_product$review_text, method = "bing")
# Add sentiment scores to the data frame
selected_product$sentiment_scores <- sentiment_scores
selected_productSetelah mendapatkan score sentimen, kita coba bandingkan dengan
variabel di dalam data: rating. Asumsinya semakin tinggi
rating yang diberikan, mak sentiment_score meningkat pula.
# Look at the distribution of sentiment scores
ggplot(selected_product, aes(x=sentiment_scores)) +
geom_histogram(binwidth = 1) +
theme_minimal() +
xlab("Sentiment Score") +
ylab("Count") +
ggtitle("Distribution of Sentiment Scores")# Calculate average sentiment score
mean_sentiment_score <- mean(selected_product$sentiment_scores, na.rm = TRUE)Data sentiment score terdistribusi normal.
Sekarang kita coba lihat kecenderungannya dari sentiment score lebih banyak ke arah positif atau negatif. Nilai 0 dianggap masuk ke sentimen negatif karena dianggap tidak merekomendasikan produknya.
# Find the number of positive, negative, and neutral reviews
selected_product$sentiment_category <- ifelse(selected_product$sentiment_scores > 1, "Positive", "Negative")
table(selected_product$sentiment_category)#>
#> Negative Positive
#> 2378 2198
Membuat visualisasi persebaran sentiment score terhadap product rating dengan boxplot
ggplot(selected_product, aes(y = factor(rating), x = sentiment_scores)) +
geom_boxplot() +
labs(title = "Persebaran Sentiment Scores terhadap Rating",
y = "Rating",
x = "Sentiment Score") +
theme_minimal()
Di sini dapat dilihat ada kecenderungan bahwa seiring rating meningkat,
nilai median sentiment score semakin tinggi. Tetapi terdapat boxplot di
mana terjadi skewness menunjukkan bahwa sebagian besar
sentiment score rendah tetapi ada beberapa sentimen score yang sangat
tinggi, dan sebaliknya.
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', ]Sebelum 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.
# Create a text corpus from the negative reviews
corpus_neg <- Corpus(VectorSource(negative_reviews$review_text))
# Create a Document-Term Matrix
dtm <- DocumentTermMatrix(corpus_neg)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.
# Load library
library(topicmodels)
#Build the LDA model
lda_model <- LDA(dtm, k = 7) # 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 Topic 6
#> [1,] "dots" "dots" "work" "skin" "overnight" "skin"
#> [2,] "really" "night" "dots" "work" "skin" "really"
#> [3,] "patches" "dont" "spot" "pop" "used" "use"
#> [4,] "use" "next" "even" "first" "little" "zit"
#> [5,] "gone" "cystic" "skin" "nothing" "work" "little"
#> [6,] "white" "used" "used" "patches" "time" "night"
#> [7,] "overnight" "work" "time" "tried" "away" "help"
#> [8,] "tried" "dot" "morning" "face" "help" "morning"
#> [9,] "dont" "help" "blemish" "little" "using" "overnight"
#> [10,] "using" "didnt" "dont" "definitely" "didnt" "love"
#> [11,] "love" "use" "love" "cystic" "much" "didnt"
#> [12,] "healing" "healing" "really" "days" "make" "definitely"
#> [13,] "morning" "zit" "definitely" "works" "really" "away"
#> [14,] "face" "gone" "less" "anything" "day" "amazing"
#> [15,] "dot" "love" "tried" "day" "healing" "nothing"
#> [16,] "think" "great" "didnt" "morning" "zit" "face"
#> [17,] "size" "two" "picking" "never" "great" "best"
#> [18,] "hours" "red" "red" "time" "helps" "wont"
#> [19,] "best" "much" "breakout" "completely" "love" "hours"
#> [20,] "night" "morning" "night" "around" "morning" "day"
#> Topic 7
#> [1,] "dots"
#> [2,] "gone"
#> [3,] "work"
#> [4,] "skin"
#> [5,] "patches"
#> [6,] "tried"
#> [7,] "night"
#> [8,] "also"
#> [9,] "really"
#> [10,] "overnight"
#> [11,] "dot"
#> [12,] "use"
#> [13,] "day"
#> [14,] "didnt"
#> [15,] "used"
#> [16,] "blemish"
#> [17,] "dont"
#> [18,] "spot"
#> [19,] "big"
#> [20,] "face"
Hasil topic modeling yang diperoleh tampaknya sudah cukup bagus karena banyak kata yang tampak relevan dengan konteks review produk skincare. Namun, masih ada beberapa kata yang bisa dipertimbangkan untuk dibersihkan untuk memperjelas topik-topik yang dihasilkan, seperti stop words atau kata-kata yang sangat umum dalam Bahasa Inggris dan biasanya tidak membawa makna semantik yang signifikan, misalnya ‘one’, ‘using’, ‘will’, ‘just’, ‘m’, ’ve, ’s, dan lainnya. Maka mari kita bersihkan lagi (kembali ke Corpus di atas)
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.
Berikut adalah beberapa perbedaan utama:
Fungsi dan sintaksis: Dalam topicmodels::LDA, kita hanya perlu menyediakan jumlah topik dan metode yang digunakan (Gibbs atau VEM). Dalam textmineR::FitLdaModel, kita perlu menyediakan jumlah iterasi dan burnin yang digunakan, serta menentukan apakah kita ingin menghitung koherensi atau tidak.
Parameter input: FitLdaModel membutuhkan lebih banyak parameter. Ini termasuk iterasi (jumlah kali algoritma akan berjalan), burnin (jumlah iterasi awal yang akan diabaikan), dan apakah menghitung koherensi atau tidak. Koherensi adalah ukuran yang digunakan untuk menilai kualitas topik yang dihasilkan.
Parameter output: Output yang dihasilkan oleh dua fungsi ini juga berbeda. LDA menghasilkan objek bertipe “LDA_VEM” atau “LDA_Gibbs” yang bisa dipakai untuk inferensi lebih lanjut, sedangkan FitLdaModel menghasilkan list yang berisi banyak informasi, seperti topik per dokumen, per kata, dan koherensi
library(textmineR)
dtm_fitlda <- Matrix::Matrix(as.matrix(dtm), sparse = T)
set.seed(123)
fitlda_model <- FitLdaModel(dtm_fitlda,
k = 5,
iterations = 1000,
burnin = 500,
calc_coherence = T
)
glimpse(fitlda_model)#> List of 7
#> $ phi : num [1:5, 1:4804] 0.00000407 0.0054329 0.00000742 0.00009771 0.00000491 ...
#> ..- attr(*, "dimnames")=List of 2
#> .. ..$ : chr [1:5] "t_1" "t_2" "t_3" "t_4" ...
#> .. ..$ : chr [1:4804] "brand" "great" "products" "specially" ...
#> $ theta : num [1:2378, 1:5] 0.0222 0.1467 0.68 0.6 0.1294 ...
#> ..- attr(*, "dimnames")=List of 2
#> .. ..$ : chr [1:2378] "1" "2" "3" "4" ...
#> .. ..$ : chr [1:5] "t_1" "t_2" "t_3" "t_4" ...
#> $ gamma : num [1:5, 1:4804] 0.00102 0.97539 0.00106 0.0215 0.00103 ...
#> ..- attr(*, "dimnames")=List of 2
#> .. ..$ : chr [1:5] "t_1" "t_2" "t_3" "t_4" ...
#> .. ..$ : chr [1:4804] "brand" "great" "products" "specially" ...
#> $ data :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
#> .. ..@ i : int [1:49931] 0 50 114 208 220 287 288 310 356 365 ...
#> .. ..@ p : int [1:4805] 0 44 215 311 314 417 462 642 726 870 ...
#> .. ..@ Dim : int [1:2] 2378 4804
#> .. ..@ Dimnames:List of 2
#> .. ..@ x : num [1:49931] 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:4804] 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 ...
#> ..- attr(*, "names")= chr [1:4804] "brand" "great" "products" "specially" ...
#> $ coherence: Named num [1:5] 0.0879 0.0408 0.0873 0.0453 0.0391
#> ..- attr(*, "names")= chr [1:5] "t_1" "t_2" "t_3" "t_4" ...
#> - attr(*, "class")= chr "lda_topic_model"
Berikut adala beberapa atrribut 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
# To get the top terms for each topic, we can use the GetTopTerms function.
fitlda_terms <- GetTopTerms(fitlda_model$phi, 20) %>%
as.data.frame()
# %>% set_names(paste("Topic", 1:5))head(fitlda_terms, 10) %>%
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), color = topic, 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 = "black"),
strip.text.x = element_text(colour = "white"))library(wordcloud2)
fitlda_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
fitlda_theta <-
fitlda_model$theta %>%
as.data.frame() %>%
# set_names(paste("Topic", 1:5)) %>%
rownames_to_column("document")Selanjutnya menggabungkan nilai Theta dengan data awal untuk mendapatkan isi review yang lengkap.
fitlda_theta_review <-
fitlda_theta %>% cbind(negative_reviews, deparse.level = 0)
head(fitlda_theta_review, 10)# Top 20 Terms
fitlda_terms[,1]#> [1] "morning" "dots" "gone" "night" "used" "first" "skin"
#> [8] "red" "work" "day" "really" "two" "dot" "next"
#> [15] "time" "face" "didnt" "away" "try" "spot"
# Review
fitlda_theta_review %>%
arrange(desc(`t_1`)) %>%
select(`t_1`, review_text) %>%
head(5)# Review
fitlda_theta_review %>%
arrange(desc(`t_2`)) %>%
select(`t_2`, review_text) %>%
head(5)Kita akan mencoba menginterpretasikan 10 ulasan teratas pada setiap topik.