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.
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.
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.
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.
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.
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.
<- read.csv("data_input/product_reviews_dirty.csv")
data 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…
💡 Dataset kali ini memiliki 40,607 rows dengan total Features/columns 9.
Berikut adalah metadata dari dataset product reviews (Tokopedia):
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
#>
#>
#>
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.
# Library yang diperlukan
library(ggplot2)
# Buat data frekuensi kategori produk yang diurutkan secara menurun
<- data %>%
category_freq group_by(category) %>%
summarise(frequency = n()) %>%
arrange(desc(frequency))
# Warna nude color
<- c("#ADFF2F", "#7CFC00", "#32CD32", "#90EE90", "#00FF7F")
nude_colors
# 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.
# tibble data
<- as_tibble(data)
data_tibble
# Tokenize
<- data_tibble %>%
word_freq 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 :
barang
” muncul sebanyak 15.725 kali, menunjukkan
banyak ulasan berbicara tentang produk atau barang yang dibeli.sesuai
” muncul sebanyak 11.522 kali,
mengindikasikan bahwa produk yang diterima sesuai dengan yang diharapkan
atau dijanjikan.cepat
” muncul sebanyak 8.872 kali, menandakan
bahwa pengiriman atau layanan yang diberikan cepat dan efisien.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.
# 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
library(gridExtra)
$rating <- as.numeric(data$rating)
data$sold <- as.numeric(data$sold)
data
<- "#9acd32"
nude_green
# Create box plot
<- ggplot(data, aes(x = factor(1), y = rating, fill = "Rating")) +
plot1 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)
<- ggplot(data, aes(x = factor(1), y = as.numeric(sold), fill = "Jumlah Produk Terjual")) +
plot2 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
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
<- data[complete.cases(data), ]
dataset_cleaned 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
library(sentimentr)
library(tidytext)
# Preprocess data
$text <- tolower(dataset_cleaned$text)
dataset_cleaned<- 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"))
corpus
<- sapply(corpus, as.character)
text
<- sentiment_by(text, by = NULL)
sentiment_scores
$sentiment_score <- sentiment_scores$ave_sentiment
dataset_cleaned
<- sentiment_scores %>%
sentiment_scores mutate(text = dataset_cleaned$text)
$sentiment_label <- ifelse(sentiment_scores$ave_sentiment >= 0, "positive", "negative") dataset_cleaned
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).
# Ulasan Positif
<- head(sentiment_scores %>%
top_positive_words filter(ave_sentiment > 0) %>%
select(text, ave_sentiment) %>%
arrange(desc(ave_sentiment)), 50)
# Ulasan Negatif
<- head(sentiment_scores %>%
top_negative_words 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")
library(sentimentr)
library(tidytext)
library(randomForest)
library(ROSE)
# Preprocess data
$text <- tolower(dataset_cleaned$text)
dataset_cleaned<- 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"))
corpus
<- sapply(corpus, as.character)
text
<- sentiment_by(text, by = NULL)
sentiment_scores
<- sentiment_scores %>%
sentiment_scores mutate(text = dataset_cleaned$text)
$sentiment_score <- sentiment_scores$ave_sentiment
dataset_cleaned
$sentiment_label <- ifelse(dataset_cleaned$sentiment_score >= 0, "positive", "negative")
dataset_cleaned
# Menghitung jumlah data sampel
<- round(nrow(dataset_cleaned) * 0.5)
num_sample
# Mengambil sampel data dari dataset_cleaned
<- dataset_cleaned %>%
dataset_cleaned sample_n(num_sample, replace = FALSE)
set.seed(123) # Untuk hasil yang konsisten
<- sample(1:nrow(dataset_cleaned), 0.7 * nrow(dataset_cleaned))
train_indices <- dataset_cleaned[train_indices, ]
train_data <- dataset_cleaned[-train_indices, ]
test_data
<- ovun.sample(sentiment_label ~ ., data = train_data, method = "under", p = 0.5)$data
train_data_balanced
# Pastikan kolom sentiment_label berupa faktor
$sentiment_label <- as.factor(train_data_balanced$sentiment_label)
train_data_balanced
<- randomForest(sentiment_label ~ sentiment_score, data = train_data_balanced)
rf_model
<- predict(rf_model, newdata = test_data)
predictions_rf
# Sentimen dengan sentimentr pada data uji
<- sentiment_by(test_data$text, by = NULL)
sentiment_scores_uji $sentiment_label_sentimentr <- ifelse(sentiment_scores_uji$ave_sentiment >= 0, "positive", "negative")
test_data
# Bandingkan hasil
<- table(test_data$sentiment_label, test_data$sentiment_label_sentimentr)
confusion_matrix_sentimentr <- table(test_data$sentiment_label, predictions_rf)
confusion_matrix_rf
# Hitung metrik evaluasi untuk Random Forest
<- sum(diag(confusion_matrix_rf)) / sum(confusion_matrix_rf)
accuracy_rf <- diag(confusion_matrix_rf) / rowSums(confusion_matrix_rf)
precision_rf <- diag(confusion_matrix_rf) / colSums(confusion_matrix_rf)
recall_rf <- 2 * (precision_rf * recall_rf) / (precision_rf + recall_rf)
f1_score_rf
<- sum(diag(confusion_matrix_sentimentr)) / sum(confusion_matrix_sentimentr)
accuracy_sentimentr <- diag(confusion_matrix_sentimentr) / rowSums(confusion_matrix_sentimentr)
precision_sentimentr <- diag(confusion_matrix_sentimentr) / colSums(confusion_matrix_sentimentr)
recall_sentimentr <- 2 * (precision_sentimentr * recall_sentimentr) / (precision_sentimentr + recall_sentimentr)
f1_score_sentimentr
# Buat dataframe
<- data.frame(
evaluation_df 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
library(reshape2)
<- melt(evaluation_df, id.vars = "Method", variable.name = "Metric", value.name = "Value")
evaluation_df_melted
<- ggplot(evaluation_df_melted, aes(x = Metric, y = Value, fill = Method)) +
plot_evaluation 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
<- table(predictions_rf)
sentiment_distribution <- as.data.frame(sentiment_distribution)
sentiment_df 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")
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
<- sample(1:nrow(dataset_cleaned), 0.7 * nrow(dataset_cleaned))
train_indices <- dataset_cleaned[train_indices, ]
train_data <- dataset_cleaned[-train_indices, ]
test_data
<- trainControl(method = "cv", number = 5)
ctrl
# Linear Regression
<- train(rating ~ sentiment_score, data = train_data, method = "lm", trControl = ctrl)
lm_model
# Train the Support Vector Regression (SVR) model
<- train(rating ~ sentiment_score, data = train_data, method = "svmRadial", trControl = ctrl)
svr_model
# Random Forest Regression
<- randomForest(rating ~ ., data = train_data)
rf_model
# Evaluasi model
<- predict(lm_model, newdata = test_data)
lm_predictions <- predict(svr_model, newdata = test_data)
svr_predictions <- predict(rf_model, newdata = test_data)
rf_predictions
# evaluasi
<- postResample(pred = lm_predictions, obs = test_data$rating)
lm_metrics <- postResample(pred = svr_predictions, obs = test_data$rating)
svr_metrics <- postResample(pred = rf_predictions, obs = test_data$rating)
rf_metrics
# buat jadi dataframe
<- data.frame(
performance_df 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.
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
<- randomForest(rating ~ ., data = train_data)
rf_model_cv
<- predict(rf_model_cv, newdata = train_data)
rf_predictions_cv
# evaluaasi
<- mean(abs(rf_predictions_cv - train_data$rating))
mae_rf_cv <- cor(rf_predictions_cv, train_data$rating)^2
rsquared_rf_cv <- sqrt(mean((rf_predictions_cv - train_data$rating)^2))
rmse_rf_cv
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.
<- data.frame(Actual_Rate = train_data$rating, Predicted_Rate = rf_predictions_cv)
visualization_data
# 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.