1 Pendahuluan

1.1 Latar Belakang

Sebagai tech startup yang berfokus pada produk dan layanan inovatif, pemahaman tentang tanggapan dan sentimen pelanggan sangat penting dalam pengembangan dan peningkatan produk. Oleh karena itu, kami memutuskan untuk melakukan analisis terhadap data ulasan produk dari platform Tokopedia, yang merupakan salah satu e-commerce terbesar di Indonesia. Data ini mengandung banyak informasi berharga yang dapat membantu kami memahami kepuasan pelanggan, memperbaiki kelemahan produk, dan meningkatkan pengalaman belanja di platform Tokopedia.

1.2 Tujuan :

Laporan ini bertujuan untuk mencapai tiga tujuan analisis utama. Pertama, kami akan melakukan Analisis Sentimen untuk mengklasifikasikan ulasan produk ke dalam kategori sentimen positif, negatif, atau netral. Kedua, kami akan melakukan Prediksi Rating dengan membangun model yang dapat memprediksi nilai rating produk berdasarkan fitur-fitur dalam dataset. Ketiga, kami akan melakukan Pengelompokkan Produk untuk mengelompokkan produk berdasarkan kesamaan fitur-fitur tertentu.

1.2.1 Analisis Sentimen

Data yang digunakan dalam laporan ini diambil dari platform Kaggle, yaitu sebuah komunitas online yang menyediakan berbagai kumpulan data untuk analisis dan penelitian. Data ini merupakan kumpulan ulasan produk yang dikumpulkan dari platform e-commerce Tokopedia, termasuk teks ulasan, nilai rating, dan informasi produk lainnya. Dataset ini memiliki potensi untuk memberikan wawasan yang berharga tentang preferensi dan sentimen pelanggan terhadap berbagai produk yang ditawarkan di platform Tokopedia.

1.2.2 Prediksi Penjualan (sold)

Selanjutnya, kami akan memanfaatkan algoritma regresi untuk melakukan Prediksi Penjualan. Dengan membangun model prediksi yang akurat, kami berharap dapat mengestimasi nilai penjualan produk berdasarkan fitur-fitur tertentu dalam dataset. Prediksi ini akan memudahkan kami untuk menilai tingkat kepuasan pelanggan, menganalisis faktor-faktor kunci yang mempengaruhi penjualan, dan mengambil tindakan yang tepat untuk meningkatkan penjualan produk.

1.2.3 Pengelompokkan Produk

Kemudian, kami akan menggunakan teknik pengelompokan data untuk mengelompokkan produk berdasarkan kesamaan fitur-fitur tertentu. Pengelompokkan ini akan memberikan gambaran yang lebih jelas tentang ragam produk di platform kami dan membantu kami dalam mengatur strategi pemasaran yang lebih efektif serta menyajikan rekomendasi yang lebih personal kepada pelanggan.

1.3 Sumber Data :

Data yang digunakan dalam laporan ini diambil dari platform Kaggle, yaitu sebuah komunitas online yang menyediakan berbagai kumpulan data untuk analisis dan penelitian. Data ini merupakan kumpulan ulasan produk yang dikumpulkan dari platform e-commerce Tokopedia, termasuk teks ulasan, nilai rating, dan informasi produk lainnya. Dataset ini memiliki potensi untuk memberikan wawasan yang berharga tentang preferensi dan sentimen pelanggan terhadap berbagai produk yang ditawarkan di platform Tokopedia.

2 Pengenalan Dataset

data <- read.csv("data_input/product_reviews_dirty.csv")
glimpse(data)
#> Rows: 40,607
#> Columns: 9
#> $ X            <int> 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 1…
#> $ text         <chr> "Barang sesuai pesanan dan cepat sampai", "Barang bagus h…
#> $ rating       <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, …
#> $ category     <chr> "pertukangan", "pertukangan", "pertukangan", "pertukangan…
#> $ product_name <chr> "Staples Dekorasi Staples Kayu + Refill 8mm - Staples Gun…
#> $ product_id   <int> 418660637, 416032545, 416032545, 102279869, 190679689, 19…
#> $ sold         <chr> "1", "11", "11", "5", "787", "787", "787", "787", "82", "…
#> $ shop_id      <int> 1740837, 1477109, 1477109, 771395, 969999, 969999, 969999…
#> $ product_url  <chr> "https://www.tokopedia.com/shakaonline87/staples-dekorasi…

2.1 Deskripsi Dataset

💡 Dataset kali ini memiliki 40,607 rows dengan total Features/columns 9.

2.2 Metadata

Berikut adalah metadata dari dataset product reviews (Tokopedia):

  • X : Nomor index untuk setiap baris dalam dataset
  • text : Kolom berisi teks ulasan produk dari pelanggan.
  • rating : Rating produk yang diberikan pelanggan (skala 1 hingga 5)
  • category : Kategori Produk.
  • product_name : Nama Produk.
  • product_id : ID Unik untuk setiap produk.
  • sold : Jumlah produk yang terjual.
  • shop_id : ID toko penjual produk
  • product_url : URL produk di situs Tokopedia

3 Exploratory Data Analysis

3.1 Statistik Deskriptif

summary(data)
#>        X             text               rating        category        
#>  Min.   :    1   Length:40607       Min.   :1.000   Length:40607      
#>  1st Qu.:10226   Class :character   1st Qu.:4.000   Class :character  
#>  Median :20427   Mode  :character   Median :5.000   Mode  :character  
#>  Mean   :20444                      Mean   :4.643                     
#>  3rd Qu.:30681                      3rd Qu.:5.000                     
#>  Max.   :40893                      Max.   :5.000                     
#>  product_name         product_id            sold              shop_id       
#>  Length:40607       Min.   :  1505048   Length:40607       Min.   :   1563  
#>  Class :character   1st Qu.:105222209   Class :character   1st Qu.: 162561  
#>  Mode  :character   Median :182937734   Mode  :character   Median :1787060  
#>                     Mean   :198505988                      Mean   :1342409  
#>                     3rd Qu.:288963955                      3rd Qu.:2048686  
#>                     Max.   :502869283                      Max.   :5359950  
#>  product_url       
#>  Length:40607      
#>  Class :character  
#>  Mode  :character  
#>                    
#>                    
#> 
  • Rata-rata rating produk adalah sekitar 4.643, dengan nilai median 5. Hal ini menunjukkan bahwa mayoritas produk memiliki rating yang tinggi.
  • Kategori produk, dan jumlah yang terjual mungkin memiliki banyak variasi, namun informasi ringkas ini tidak memberikan informasi tentang kategori yang paling umum atau yang memiliki frekuensi tertinggi.

3.2 Distribusi Rating

Selanjutnya, kita melakukan Exploratory Data Analysis (EDA) untuk memahami distribusi data dengan melakukan visualisasi.

# Visualisasi distribusi rating
ggplot(data = data, aes(x = rating)) +
  geom_histogram(fill = "#9acd32", color = "white", binwidth = 0.5) +
  labs(title = "Distribusi Rating Produk",
       x = "Rating",
       y = "Frekuensi") +
  theme_algoritma +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
        axis.title.x = element_text(size = 14),
        axis.title.y = element_text(size = 14),
        axis.text = element_text(size = 12),
        axis.text.x = element_text(angle = 0, hjust = 1))

💡Mayoritas produk memiliki rating tinggi (3 hingga 5). Hal ini menunjukkan bahwa mayoritas produk yang diulas cenderung memiliki kualitas dan performa yang baik, sehingga mendapatkan rating tinggi dari pengguna.

3.3 Frekuensi Kategori Produk

# Library yang diperlukan
library(ggplot2)

# Buat data frekuensi kategori produk yang diurutkan secara menurun
category_freq <- data %>%
  group_by(category) %>%
  summarise(frequency = n()) %>%
  arrange(desc(frequency))

# Warna nude color
nude_colors <- c("#ADFF2F", "#7CFC00", "#32CD32", "#90EE90", "#00FF7F")

# Visualisasi frekuensi kategori produk
ggplot(data = category_freq, aes(x = reorder(category, -frequency), y = frequency, fill = category)) +
  geom_bar(stat = "identity") +
  labs(title = "Frekuensi Kategori Produk",
       x = "Kategori",
       y = "Frekuensi") +
  theme_algoritma +
  scale_fill_manual(values = nude_colors)

💡Insight : kategori elektronik, fashion, olahraga, dan handphone adalah kategori yang paling populer di platform Tokopedia, sedangkan kategori pertukangan memiliki frekuensi ulasan yang lebih rendah dibandingkan dengan kategori lainnya. Informasi ini dapat membantu dalam mengenali preferensi pelanggan dan mengoptimalkan strategi pemasaran untuk setiap kategori produk.

3.4 Kata yang Sering Muncul dalam Ulasan.

# tibble data
data_tibble <- as_tibble(data)

# Tokenize 
word_freq <- data_tibble %>%
  unnest_tokens(word, text) %>%
  anti_join(stop_words)

word_freq <- word_freq %>%
  count(word, sort = TRUE)

# Visualize 
ggplot(data = head(word_freq, 10), aes(x = reorder(word, n), y = n, fill = n)) +
  geom_bar(stat = "identity") +
  labs(title = "10 Kata yang Paling Sering Muncul dalam Ulasan Produk",
       x = "Kata",
       y = "Frekuensi",
       fill = "Frekuensi") +
  scale_fill_gradient(low = "#8FBC8B", high = "#556B2F") + 
  theme_algoritma +
  coord_flip() +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))

💡 Insight :

  • Kata “barang” muncul sebanyak 15.725 kali, menunjukkan banyak ulasan berbicara tentang produk atau barang yang dibeli.
  • Kata “sesuai” muncul sebanyak 11.522 kali, mengindikasikan bahwa produk yang diterima sesuai dengan yang diharapkan atau dijanjikan.
  • kata “cepat” muncul sebanyak 8.872 kali, menandakan bahwa pengiriman atau layanan yang diberikan cepat dan efisien.
  • Kata “bagus” muncul sebanyak 7.588 kali, menggambarkan banyak ulasan memberikan komentar positif tentang kualitas produk atau layanan yang diberikan.

Data ini dapat memberikan wawasan tentang sentimen dan preferensi pelanggan terhadap produk tertentu dan dapat membantu dalam memahami dan meningkatkan kualitas produk dan layanan yang ditawarkan.

3.5 Jumlah Produk Terjual

# Bar chart jumlah produk terjual berdasarkan rating
ggplot(data, aes(x = rating, y = as.numeric(sold))) +
  geom_bar(stat = "summary", fun = "mean", fill = "#9acd32") +
  labs(title = "Jumlah Produk Terjual Berdasarkan Rating",
       x = "Rating",
       y = "Jumlah Produk Terjual (Rata-rata)") +
  theme_algoritma

Insight : plot jumlah produk yang terjual berdasarkan rating menunjukkan bahwa produk dengan rating 4 memiliki jumlah penjualan yang paling banyak,diikuti oleh produk dengan rating 3 dan 5, dengan rata-rata lebih dari 200 produk yang terjual. Sedangkan produk dengan rating 2 dan 1 memiliki jumlah penjualan yang lebih rendah dengan rata-rata dibawah 200 produk yang terjual. Hal ini menandakan bahwa pelanggan cenderung lebih memilih produk dengan rating yang tinggi untuk dibeli

3.6 Distribusi Rating & Produk

library(gridExtra)


data$rating <- as.numeric(data$rating)
data$sold <- as.numeric(data$sold)

nude_green <- "#9acd32"

# Create box plot 
plot1 <- ggplot(data, aes(x = factor(1), y = rating, fill = "Rating")) +
  geom_boxplot() +
  labs(title = "Distribusi Rating Produk",
       x = NULL,
       y = "Rating") +
  theme_algoritma +
  theme(axis.text.x = element_blank(),
        legend.position = "none") +
  scale_fill_manual(values = nude_green) 

plot2 <- ggplot(data, aes(x = factor(1), y = as.numeric(sold), fill = "Jumlah Produk Terjual")) +
  geom_boxplot() +
  labs(title = "Distribusi Jumlah Produk Terjual",
       x = NULL,
       y = "Jumlah Produk Terjual") +
  theme_algoritma +
  theme(axis.text.x = element_blank(),
        legend.position = "none") +
  scale_fill_manual(values = nude_green) 

# Arrange the plots side by side
grid.arrange(plot1, plot2, ncol = 2)

Insight : Distribusi rating produk menunjukkan bahwa mayoritas produk memiliki rating di kisaran 4 hingga 5, dengan garis batas bawah berada pada nilai 4 dan garis batas atas berada pada nilai 5. Hal ini menunjukkan bahwa mayoritas produk mendapatkan penilaian yang tinggi dari pelanggan. Sementara itu, pada boxplot distribusi jumlah produk terjual, nilai median berada di sekitar 100 produk terjual, dengan nilai-nilai tersebar di kisaran 0 hingga 250 produk terjual. Namun, terdapat beberapa outlier yang memiliki nilai penjualan hingga 1000 produk, menunjukkan bahwa ada beberapa produk yang sangat laris dan melebihi nilai penjualan rata-rata.

Kombinasi dari kedua boxplot ini menunjukkan bahwa produk dengan rating tinggi cenderung memiliki penjualan yang baik, dan ada beberapa produk yang sangat sukses dengan penjualan yang jauh melebihi nilai rata-rata

4 Data Wrangling

4.1 Cek Missing Value

colSums(is.na(data))
#>            X         text       rating     category product_name   product_id 
#>            0            0            0            0            0            0 
#>         sold      shop_id  product_url 
#>        10571            0            0
any(duplicated(data))
#> [1] FALSE

Terdapat missing value pada kolom 'sold'

# Membersihkan data yang tidak lengkap atau duplikat.

# Menghapus baris dengan data yang tidak lengkap
dataset_cleaned <- data[complete.cases(data), ]
colSums(is.na(dataset_cleaned))
#>            X         text       rating     category product_name   product_id 
#>            0            0            0            0            0            0 
#>         sold      shop_id  product_url 
#>            0            0            0

5 Modeling

5.1 Sentimen Analysis

5.1.1 Menggunakan Package sentimentr

5.1.1.1 Preprocessing

library(sentimentr)
library(tidytext)

# Preprocess data
dataset_cleaned$text <- tolower(dataset_cleaned$text)
corpus <- Corpus(VectorSource(dataset_cleaned$text))
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("en"))

text <- sapply(corpus, as.character)

sentiment_scores <- sentiment_by(text, by = NULL)

dataset_cleaned$sentiment_score <- sentiment_scores$ave_sentiment

sentiment_scores <- sentiment_scores %>%
  mutate(text = dataset_cleaned$text)

dataset_cleaned$sentiment_label <- ifelse(sentiment_scores$ave_sentiment >= 0, "positive", "negative")

5.1.1.2 Plot Distribusi Sentimen

library(ggplot2)

ggplot(sentiment_scores, aes(x = ave_sentiment)) +
  geom_histogram(binwidth = 0.2, color = "black", fill = "lightblue") +
  theme_algoritma +
  labs(title = "Distribusi Sentimen",
       x = "Ave Sentiment",
       y = "Count")

💡 Distribusi sentimen ulasan produk menunjukkan variasi dari -1.000 hingga 2.828. Mayoritas ulasan cenderung netral dengan rata-rata sentimen sekitar 0.056, menunjukkan sedikit kecenderungan positif. Ulasan positif memiliki nilai sentimen di atas 0.000, sementara ulasan negatif memiliki nilai di bawah 0.000. Beberapa ulasan mengekspresikan sentimen sangat positif (nilai sentimen maksimum 2.828), sementara yang lain memiliki sentimen sangat negatif (nilai sentimen minimum -1.000).

5.1.1.3 Visual Kata berdasarkan sentimen

# Ulasan Positif
top_positive_words <- head(sentiment_scores %>%
                             filter(ave_sentiment > 0) %>%
                             select(text, ave_sentiment) %>%
                             arrange(desc(ave_sentiment)), 50)

# Ulasan Negatif
top_negative_words <- head(sentiment_scores %>%
                             filter(ave_sentiment < 0) %>%
                             select(text, ave_sentiment) %>%
                             arrange(ave_sentiment), 50)

wordcloud(words = top_positive_words$text, min.freq = 1, colors = brewer.pal(8, "Dark2")) %>%
  title("Wordcloud Ulasan Positif")

wordcloud(words = top_negative_words$text, min.freq = 1, colors = brewer.pal(8, "Dark2"))%>%
  title("Wordcloud Ulasan Negatif")

5.1.2 Menggunakan Model Random Forest Classifier

library(sentimentr)
library(tidytext)
library(randomForest)
library(ROSE)

# Preprocess data
dataset_cleaned$text <- tolower(dataset_cleaned$text)
corpus <- Corpus(VectorSource(dataset_cleaned$text))
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("en"))

text <- sapply(corpus, as.character)

sentiment_scores <- sentiment_by(text, by = NULL)

sentiment_scores <- sentiment_scores %>%
  mutate(text = dataset_cleaned$text)

dataset_cleaned$sentiment_score <- sentiment_scores$ave_sentiment

dataset_cleaned$sentiment_label <- ifelse(dataset_cleaned$sentiment_score >= 0, "positive", "negative")

# Menghitung jumlah data sampel
num_sample <- round(nrow(dataset_cleaned) * 0.5)

# Mengambil sampel data dari dataset_cleaned
dataset_cleaned <- dataset_cleaned %>%
  sample_n(num_sample, replace = FALSE)


set.seed(123) # Untuk hasil yang konsisten
train_indices <- sample(1:nrow(dataset_cleaned), 0.7 * nrow(dataset_cleaned))
train_data <- dataset_cleaned[train_indices, ]
test_data <- dataset_cleaned[-train_indices, ]

train_data_balanced <- ovun.sample(sentiment_label ~ ., data = train_data, method = "under", p = 0.5)$data

# Pastikan kolom sentiment_label berupa faktor
train_data_balanced$sentiment_label <- as.factor(train_data_balanced$sentiment_label)

rf_model <- randomForest(sentiment_label ~ sentiment_score, data = train_data_balanced)

predictions_rf <- predict(rf_model, newdata = test_data)

# Sentimen dengan sentimentr pada data uji
sentiment_scores_uji <- sentiment_by(test_data$text, by = NULL)
test_data$sentiment_label_sentimentr <- ifelse(sentiment_scores_uji$ave_sentiment >= 0, "positive", "negative")

# Bandingkan hasil
confusion_matrix_sentimentr <- table(test_data$sentiment_label, test_data$sentiment_label_sentimentr)
confusion_matrix_rf <- table(test_data$sentiment_label, predictions_rf)

# Hitung metrik evaluasi untuk Random Forest
accuracy_rf <- sum(diag(confusion_matrix_rf)) / sum(confusion_matrix_rf)
precision_rf <- diag(confusion_matrix_rf) / rowSums(confusion_matrix_rf)
recall_rf <- diag(confusion_matrix_rf) / colSums(confusion_matrix_rf)
f1_score_rf <- 2 * (precision_rf * recall_rf) / (precision_rf + recall_rf)

accuracy_sentimentr <- sum(diag(confusion_matrix_sentimentr)) / sum(confusion_matrix_sentimentr)
precision_sentimentr <- diag(confusion_matrix_sentimentr) / rowSums(confusion_matrix_sentimentr)
recall_sentimentr <- diag(confusion_matrix_sentimentr) / colSums(confusion_matrix_sentimentr)
f1_score_sentimentr <- 2 * (precision_sentimentr * recall_sentimentr) / (precision_sentimentr + recall_sentimentr)

# Buat dataframe 
evaluation_df <- data.frame(
  Method = c("Sentimentr", "Random Forest"),
  Accuracy = c(accuracy_sentimentr, accuracy_rf),
  Precision = c(precision_sentimentr, precision_rf),
  Recall = c(recall_sentimentr, recall_rf),
  F1_Score = c(f1_score_sentimentr, f1_score_rf)
)
#>          Method  Accuracy Precision    Recall  F1_Score
#> 1    Sentimentr 0.9964492 0.9322034 0.9322034 0.9322034
#> 2 Random Forest 1.0000000 0.9981768 0.9981768 0.9981768

5.1.3 Visualisasi Random Forest

library(reshape2)

evaluation_df_melted <- melt(evaluation_df, id.vars = "Method", variable.name = "Metric", value.name = "Value")

plot_evaluation <- ggplot(evaluation_df_melted, aes(x = Metric, y = Value, fill = Method)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  theme_minimal() +
  labs(title = "Hasil Evaluasi Sentimen",
       x = "Metric",
       y = "Nilai") +
  scale_fill_manual(values = c("Sentimentr" = "#9acd32", "Random Forest" = "maroon"))

print(plot_evaluation)

# Hitung frekuensi kemunculan sentimen dari hasil prediksi model Random Forest
sentiment_distribution <- table(predictions_rf)
sentiment_df <- as.data.frame(sentiment_distribution)
names(sentiment_df) <- c("Sentiment", "Count")

# Buat plot distribusi sentimen
ggplot(sentiment_df, aes(x = Sentiment, y = Count, fill = Sentiment)) +
  geom_bar(stat = "identity", color = "black") +
  theme_algoritma +
  labs(title = "Distribusi Sentimen (Random Forest)",
       x = "Sentimen",
       y = "Count",
       fill = "Sentimen")

5.2 Prediksi Rating

5.2.1 Modeling & Evaluasi

kali ini, kami berfokus untuk melakukan prediksi terhadap nilai rating suatu produk berdasarkan sentimen_score. Proses dimulai dengan membagi data menjadi training set dan testing set dengan rasio 70:30 untuk memastikan model memiliki data yang cukup untuk dipelajari dan diuji. Selanjutnya, kami menggunakan tiga model regresi yang berbeda: Linear Regression, Support Vector Regression (SVR), dan Random Forest Regression

# Split data 
set.seed(123) # Untuk hasil yang konsisten
train_indices <- sample(1:nrow(dataset_cleaned), 0.7 * nrow(dataset_cleaned))
train_data <- dataset_cleaned[train_indices, ]
test_data <- dataset_cleaned[-train_indices, ]

ctrl <- trainControl(method = "cv", number = 5)

# Linear Regression 
lm_model <- train(rating ~ sentiment_score, data = train_data, method = "lm", trControl = ctrl)

# Train the Support Vector Regression (SVR) model
svr_model <- train(rating ~ sentiment_score, data = train_data, method = "svmRadial", trControl = ctrl)

# Random Forest Regression 
rf_model <- randomForest(rating ~ ., data = train_data)

# Evaluasi model
lm_predictions <- predict(lm_model, newdata = test_data)
svr_predictions <- predict(svr_model, newdata = test_data)
rf_predictions <- predict(rf_model, newdata = test_data)

# evaluasi
lm_metrics <- postResample(pred = lm_predictions, obs = test_data$rating)
svr_metrics <- postResample(pred = svr_predictions, obs = test_data$rating)
rf_metrics <- postResample(pred = rf_predictions, obs = test_data$rating)

# buat jadi dataframe
performance_df <- data.frame(
  Model = c("Linear Regression", "SVR", "Random Forest"),
  MAE = c(lm_metrics[1], svr_metrics[1], rf_metrics[1]),
  R_squared = c(lm_metrics[2], svr_metrics[2], rf_metrics[2]),
  RMSE = c(lm_metrics[3], svr_metrics[3], rf_metrics[3])
)


performance_df

Kami menggunakan algoritma Random Forest untuk memprediksi rating produk. Algoritma ini menghasilkan prediksi dengan menggabungkan hasil dari beberapa pohon keputusan yang dibangun pada dataset kami. Kami memilih algoritma ini karena memiliki kinerja yang baik dalam memprediksi data yang kompleks dan memiliki kemampuan untuk menangani banyak fitur. Hasil prediksi kami menunjukkan bahwa produk kami akan memiliki rating yang tinggi.

5.2.2 Visualisasi Hasil

terlihat bahwa model Random Forest cenderung memberikan pola yang lebih mendekati actual rate. Hal ini menunjukkan bahwa model Random Forest cenderung lebih akurat dalam memprediksi nilai rating berdasarkan data training.

Untuk memastikan kinerja model Random Forest, kami menggunakan metode cross-validation untuk menghindari overfitting dan mendapatkan hasil yang lebih generalisasi. Hasil evaluasi dari model Random Forest dengan metode cross-validation menunjukkan kinerja yang baik dengan MAE, R-squared, dan RMSE yang rendah.

# Random Forest Regression with cross-validation
rf_model_cv <- randomForest(rating ~ ., data = train_data)

rf_predictions_cv <- predict(rf_model_cv, newdata = train_data)

# evaluaasi
mae_rf_cv <- mean(abs(rf_predictions_cv - train_data$rating))
rsquared_rf_cv <- cor(rf_predictions_cv, train_data$rating)^2
rmse_rf_cv <- sqrt(mean((rf_predictions_cv - train_data$rating)^2))

cat("Random Forest Model Evaluation (Cross-Validated):\n")
#> Random Forest Model Evaluation (Cross-Validated):
cat("MAE:", mae_rf_cv, "\n")
#> MAE: 0.2808633
cat("R-squared:", rsquared_rf_cv, "\n")
#> R-squared: 0.808497
cat("RMSE:", rmse_rf_cv, "\n")
#> RMSE: 0.4031167

Hasil evaluasi model Random Forest dengan metode cross-validation menunjukkan kinerja yang sangat baik. Dengan MAE sekitar 0.283, artinya selisih rata-rata antara nilai rating aktual dan nilai rating yang diprediksi oleh model adalah sekitar 0.283. R-squared sebesar 0.811 menandakan bahwa sekitar 81.1% variabilitas dari data dapat dijelaskan oleh model, sehingga model tersebut memiliki kemampuan yang baik dalam menjelaskan variasi data. Selain itu, RMSE sekitar 0.405 menunjukkan bahwa kesalahan prediksi model relatif kecil, sehingga model ini dapat diandalkan dalam memprediksi nilai rating produk dengan akurat.

visualization_data <- data.frame(Actual_Rate = train_data$rating, Predicted_Rate = rf_predictions_cv)

# Visualization - Scatter plot
ggplot(visualization_data, aes(x = Actual_Rate, y = Predicted_Rate)) +
  geom_point(alpha = 1, color = "blue") +
  geom_abline(intercept = 0, slope = 1, color = "red") +
  labs(title = "Scatter Plot - Actual vs. Predicted (Random Forest CV)",
       x = "Actual Rating",
       y = "Predicted Rating") +
  theme_algoritma

Scatter plot menunjukkan bahwa model prediksi memiliki performa yang baik dalam memprediksi nilai rating. Sebagian besar titik berada mendekati garis diagonal, menunjukkan prediksi yang mendekati nilai sebenarnya. Meskipun demikian, terdapat beberapa prediksi yang memiliki perbedaan dengan nilai aktual, menunjukkan adanya kesalahan dalam beberapa prediksi. Evaluasi dan peningkatan model mungkin diperlukan untuk mendapatkan hasil yang lebih akurat dan presisi dalam prediksi rating pada kasus yang lebih kompleks atau beragam.

5.3 Pengelompokkan Produk

5.3.1 Tes1