Library:

> # install.packages("knitr")
> # install.packages("rmarkdown")
> # install.packages("prettydoc")
> # install.packages("equatiomatic")

1 PENDAHULUAN

1.1 Latar Belakang

Industri musik global saat ini dipengaruhi oleh berbagai faktor yang berperan dalam menentukan kesuksesan suatu lagu. Salah satu indikator utama yang mencerminkan popularitas lagu adalah Billboard Global 200, yang merangkum lagu-lagu terpopuler berdasarkan kinerja mereka di berbagai platform. Dalam era digital, platform seperti YouTube dan Spotify memiliki peran besar dalam menentukan posisi lagu di chart global. Oleh karena itu, pemahaman tentang faktor-faktor yang mempengaruhi kesuksesan lagu sangat penting bagi para produser, artis, dan pemangku kepentingan industri musik.

Beberapa variabel yang dapat digunakan untuk menganalisis kesuksesan lagu antara lain Total View YouTube, Total Like MV, Total Stream Spotify, dan Tempo Lagu (BPM). Variabel-variabel ini mencerminkan aspek penting dalam pencapaian popularitas lagu di platform digital. Total View YouTube dan Total Like MV menunjukkan bagaimana sebuah lagu diterima oleh audiens visual di platform YouTube, sedangkan Total Stream Spotify mencerminkan seberapa sering lagu tersebut diputar di platform streaming terbesar dunia. Tempo Lagu (BPM), sebagai elemen musikal, dapat berperan dalam menciptakan daya tarik terhadap pendengar yang lebih menyukai genre tertentu atau ritme yang cepat.

1.2 Rumusan Masalah

Apakah ada pola atau kelompok tertentu yang terbentuk dalam peta MDS yang menggambarkan hubungan antara popularitas lagu (berdasarkan variabel digital) dan karakteristik musik (seperti tempo lagu)?

1.3 Tujuan

Untuk menerapkan analisis Multidimensional Scaling (MDS) dalam mengidentifikasi pola atau kelompok tertentu yang menggambarkan hubungan antara popularitas lagu, yang diukur melalui variabel digital dan karakteristik musik pada lagu-lagu yang masuk dalam Billboard Global 200.

2 TINJAUAN PUSTAKA

2.1 Multidimensional Scaling (MDS)

Analisis Multidimensional Scaling (MDS) adalah teknik analisis multivariat yang berfungsi untuk menentukan posisi suatu objek relatif terhadap objek lain berdasarkan tingkat kemiripannya. Selain itu, MDS juga digunakan untuk mengidentifikasi hubungan saling ketergantungan atau interdependensi antar variabel atau data (Johnson, 1992). Cara kerja analisis Multidimensional Scaling (MDS) memiliki kesamaan dengan proses pemetaan objek berdasarkan tingkat kemiripannya. Dalam metode ini, jarak antara satu objek dengan objek lainnya dihitung berdasarkan derajat kemiripan mereka, sehingga objek yang lebih mirip akan diletakkan lebih dekat satu sama lain pada hasil pemetaan.

2.2 Jenis-jenis Analisis Multidimensional Scaling (MDS)

Jenis-jenis MDS untuk melakukan analisis data MDS digunakan nilai-nilai yang menggambarkan tingkat kemiripan atau tingkat ketakmiripan antar objek yang disebut proximity yang terbagi atas similarity (kemiripan) dan dissimilarity (ketakmiripan) (Bangsa, dkk., 2019). Berdasarkan tipe proximity yang digunakan, MDS terbagi menjadi dua jenis, yaitu multidimensional scaling metrik dan multidimensional scaling nonmetrik, yang masing-masing memiliki pendekatan berbeda dalam menganalisis hubungan antar objek.

Pada MDS metrik, data yang digunakan memiliki skala interval atau rasio, dengan jarak antar objek dianggap bersifat rasio. Sementara itu, pada MDS nonmetrik, data yang digunakan memiliki skala nominal atau ordinal, sehingga jarak antar objek dianggap bersifat ordinal. Oleh karena itu, dalam pemetaan MDS metrik, jarak antar objek harus sesuai dengan rasio yang sebenarnya. Sebagai contoh, jika objek A tiga kali lebih besar daripada objek B, maka pada pemetaan jarak objek A harus tepat tiga kali lebih jauh dari objek B. Di sisi lain, pada MDS nonmetrik, yang penting adalah urutan atau peringkat jarak antar objek. Sebagai contoh, jika objek A lebih besar daripada objek B, maka pemetaan hanya perlu menunjukkan bahwa objek A lebih jauh daripada objek B, tanpa memperhatikan apakah rasio jaraknya akurat.

2.3 Prosedur Analisis Multidimensional Scaling (MDS)

2.3.1 Matriks Jarak

Langkah awal dalam analisis MDS adalah membuat matriks jarak atau matriks \(\mathbf{D}\). Jarak yang digunakan dapat bermacam-macam, tetapi jarak yang paling sering digunakan adalah jarak euclidean. \[ \begin{align*} \text{Jarak Euclidean :}\\ \text{dist(x,y)} &= \sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} \end{align*} \]

2.3.2 Matriks Jarak Kuadrat

Setelah mendapatkan matriks \(\mathbf{D}\), hitung matriks \(\mathbf{D}^2 = d_{ij}^2\). Lalu dilanjutkan dengan menghitung beberapa komponen; \[ \begin{align*} \overline{d_{i.}^{2}} &=\frac{1}{n}\sum_{j}d_{ij}^{2}\\ \overline{d_{.j}^{2}} &=\frac{1}{n}\sum_{i}d_{ij}^{2}\\ \overline{d_{..}^{2}} &=\frac{1}{n^2}\sum_{i}d_{ij}^{2} \end{align*} \]

2.3.3 Matriks B

Langkah berikutnya setelah mendapatkan seluruh komponen dan matriks \(\mathbf{D}^2\), dicari matriks \(\mathbf{B}\) yang elemen nya \(b_{ij} = -\frac{1}{2}(d_{ij}^{2}-\overline{d_{i.}^{2}}-\overline{d_{.j}^{2}}+\overline{d_{..}^{2}})\).

2.3.4 Dekomposisi Eigen

Nilai eigen dan vektor eigen didapatkan dari Matriks \(\mathbf{B}\), banyak nya nilai eigen dan kolom eigen sesuai dengan banyaknya variabel yang digunakan. Nilai eigen dan vektor eigen didapatkan dengan \(\text{det}(\textbf{B}-\lambda \textbf{I})=0\) atau \(\text{det}(\lambda \textbf{I}-\textbf{B})=0\).

Setelah mendapatkan nilai eigen, dilakukan perhitungan kumulatif varians, cara nya adalah mengurutkan nilai eigen dari yang terbesar hingga terkecil, lalu menghitung varians eigen (\(\frac{\lambda_i}{\sum_j^p{\lambda}}\)) dimana p adalah banyak nya variabel atau banyak nya \(\lambda\), selanjutnya dilakukan penjumlahan dari awal hingga akhir. Kumulatif varians digunakan untuk menentukan jumlah dimensi yang akan digunakan. Kumulatif nilai eigen dianggap sudah memenuhi kriteria jika bernilai \(> 0,8\).

2.3.5 Koordinat Objek

Bentuk koordinat objek merupakan prosedur terakhir dari MDS Metrik, prosedur selanjutnya setelah membentuk koordinat objek adalah prosedur MDS Non-Metrik. Banyak vektor eigen dan eigen yang digunakan tergantung pada dimensi yang digunakan, jika dimensi yang digunakan sebanyak 3, maka 3 nilai eigen terbesar dan 3 vektor eigen yang bersesuaian. \[\text{Koordinat Objek } (\mathbf{F}) = \widetilde{E}\Lambda ^{\frac{1}{2}}\] \(\Lambda ^{\frac{1}{2}}\) = diagonal akar eigen \(\to\) contoh : \(\begin{pmatrix} \sqrt{\lambda_1} & 0 \\ 0 & \sqrt{\lambda_2} \\ \end{pmatrix}\).

\(\widetilde{E}\) = Vektor eigen yang bersesuaian

2.3.6 Matrisk Disparities

Matriks Disparaties atau yang biasa disimbolkan dengan \(\widehat{\textbf{D}}\) merupakan matriks jarak dari koordinat objek \((\mathbf{F})\) yang digunakan untuk menghitung nilai stress. Jarak yang digunakan biasanya adalah jarak euclidean.

2.3.7 Nilai Stress

Nilai stress merupakan prosedur terakhir dari MDS Non-Metrik, nilai stress digunakan untuk mengidentifikasi seberapa baik pemetaan, semakin kecil nilai stress maka semakin baik pula pemetaan nya. \[ \begin{align*} &\text{Stress (q)} = \sqrt{\frac{\sum_{i}\sum_{k}(d_{ik}^{(q)}-\widehat{d_{ik}^{(q)}})^2}{\sum_{i}\sum_{k}[d_{ik}^{(q)}]^2}} \end{align*} \] q adalah indeks untuk dimensi yang digunakan

Tabel Kriteria Nilai Stress
Nilai Stress Kriteria
\(>\) 20% Buruk
10% - 20% Cukup
5,1% - 10% Baik
2,5% - 5% Sangat Baik
\(<\) 2,5% Sempurna

2.3.8 Koordinat Akhir [Konfiguarasi 2D]

Koordinat konfigurasi merupakan suatu cara untuk memudahkan pemetaan jika dimensi yang digunakan >2, cara nya adalah dengan mengambil 2 kolom pertama dari koordinat objek.

3 Data

> library(readxl)
> library(knitr)
> data <- read_excel("C:/Users/HP/Documents/Semester 5/Analisis Multivariat 1/Billboard Global 200 (25 Nov 2024).xlsx")
> kable(data, caption = "Data Lagu Billboard Global 200 Tanggal 25 Nov 2024")
Data Lagu Billboard Global 200 Tanggal 25 Nov 2024
Peringkat Judul Usia Lagu (Bulan) Total View YT Total Like MV Total Stream Spotify Tempo Lagu (BPM)
1 APT 1 422366676 9601382 423499204 149
2 Die With Smile 3 331554875 4983230 1038414572 158
3 Birds Of A Feather 2 107795331 1872442 1529822373 105
4 That’s So True 1 4847511 85279 178756545 109
6 Espresso 7 244705333 2562839 1617469558 104
7 Taste 3 119907154 2778791 561387760 113
13 Who 4 69688114 2533031 1068484108 116
17 Whiplash 1 72281662 1561026 68353406 126
19 Please Please Please 5 152677616 2153258 1033581656 107
21 All I Want For Christmas Is You 59 620125599 5785210 1891639661 150
23 Mantra 1 100679542 3311833 144300264 117
34 Last Christmas 181 921932239 5043718 1590462705 108
38 Drip 0 114212247 1929540 33109103 120
42 Yellow 161 1122224609 5985425 2649930249 173
50 Cruel Summer 63 217561876 1443369 2614949215 170

Data dalam penelitian ini diperoleh dari berbagai sumber. Jumlah views dan likes di YouTube dikumpulkan menggunakan perangkat lunak pihak ketiga YT Tracker, yang diakses melalui aplikasi YouTube pada tanggal 25 November 2024. Data jumlah stream Spotify diambil dari aplikasi Spotify pada tanggal yang sama. Informasi tentang tempo lagu (BPM) diperoleh dari situs songbpm, yang juga diakses pada 25 November 2024. Selain itu, variabel usia lagu (dalam bulan) dihitung berdasarkan selisih antara bulan perilisan lagu dengan bulan pengumpulan data. Jika lagu dirilis pada bulan yang sama dengan pengumpulan data, maka usia lagu dianggap 0 bulan.

4 SOURCE CODE

4.1 Source Code Lengkap

4.1.1 Library

> library(readxl)
> library(MASS)
> library(ggplot2)
> library(rgl)
> library(scatterplot3d)

4.1.2 Import Data

> data <- read_excel("C:/Users/HP/Documents/Semester 5/Analisis Multivariat 1/Billboard Global 200 (25 Nov 2024).xlsx")
> data
# A tibble: 15 × 7
   Peringkat Judul           `Usia Lagu (Bulan)` `Total View YT` `Total Like MV`
       <dbl> <chr>                         <dbl>           <dbl>           <dbl>
 1         1 APT                               1       422366676         9601382
 2         2 Die With Smile                    3       331554875         4983230
 3         3 Birds Of A Fea…                   2       107795331         1872442
 4         4 That's So True                    1         4847511           85279
 5         6 Espresso                          7       244705333         2562839
 6         7 Taste                             3       119907154         2778791
 7        13 Who                               4        69688114         2533031
 8        17 Whiplash                          1        72281662         1561026
 9        19 Please Please …                   5       152677616         2153258
10        21 All I Want For…                  59       620125599         5785210
11        23 Mantra                            1       100679542         3311833
12        34 Last Christmas                  181       921932239         5043718
13        38 Drip                              0       114212247         1929540
14        42 Yellow                          161      1122224609         5985425
15        50 Cruel Summer                     63       217561876         1443369
# ℹ 2 more variables: `Total Stream Spotify` <dbl>, `Tempo Lagu (BPM)` <dbl>

4.1.3 Memilih Kolom Numerik untuk Analisis

> data_mds <- data[, c("Total View YT", "Total Like MV", "Total Stream Spotify", "Tempo Lagu (BPM)")] 
> data_mds
# A tibble: 15 × 4
   `Total View YT` `Total Like MV` `Total Stream Spotify` `Tempo Lagu (BPM)`
             <dbl>           <dbl>                  <dbl>              <dbl>
 1       422366676         9601382              423499204                149
 2       331554875         4983230             1038414572                158
 3       107795331         1872442             1529822373                105
 4         4847511           85279              178756545                109
 5       244705333         2562839             1617469558                104
 6       119907154         2778791              561387760                113
 7        69688114         2533031             1068484108                116
 8        72281662         1561026               68353406                126
 9       152677616         2153258             1033581656                107
10       620125599         5785210             1891639661                150
11       100679542         3311833              144300264                117
12       921932239         5043718             1590462705                108
13       114212247         1929540               33109103                120
14      1122224609         5985425             2649930249                173
15       217561876         1443369             2614949215                170

4.1.4 Normalisasi Data

> data_scaled <- scale(data_mds)

4.1.5 Menghitung Matriks Jarak (D)

> dist_matrix <- as.matrix(dist(data_scaled))

4.1.6 Menhitung Matriks B dan Nilai Eigen

> A <- dist_matrix^2
> n <- nrow(dist_matrix)
> I <- diag(n)
> J <- matrix(rep(1, n), nrow=n, ncol=n)
> V <- I - (1/n) * J
> 
> aa <- V %*% A
> BB <- aa %*% V          
> B <- (-1/2) * BB
> eigen_result <- eigen(B)
> eigenvalues <- eigen_result$values
> eigenvectors <- eigen_result$vectors

4.1.7 Menampilkan Nilai Eigen

> print(eigenvalues)
 [1]  3.476741e+01  1.147179e+01  7.561201e+00  2.199594e+00  2.223907e-15
 [6]  2.097246e-15  2.060377e-15  8.166747e-16  7.841399e-16  6.073141e-16
[11]  4.961872e-16  1.345465e-16 -4.397301e-16 -4.687139e-16 -2.481387e-15
> print(eigenvectors)
             [,1]         [,2]         [,3]        [,4]         [,5]
 [1,] -0.24702566  0.677425656  0.159586919 -0.37151724 -0.338161030
 [2,] -0.15412900  0.127394506  0.336288212  0.01648328  0.357932773
 [3,]  0.15073532 -0.231108162 -0.185904319 -0.34610620 -0.142892579
 [4,]  0.34624494 -0.065195786  0.045040586  0.32771128 -0.424548554
 [5,]  0.08416218 -0.187322539 -0.291011974 -0.30978003  0.364326065
 [6,]  0.17634224  0.074177849 -0.034190051 -0.04171145 -0.305736314
 [7,]  0.14335935 -0.072462176 -0.003327308 -0.24569077  0.106059195
 [8,]  0.22970804  0.078952122  0.205245214  0.34949695  0.003872018
 [9,]  0.16599083 -0.087441222 -0.153449874 -0.12607677 -0.138092641
[10,] -0.31234987  0.007171149  0.001107526 -0.10447408 -0.231786174
[11,]  0.18778856  0.216479686  0.049915325  0.03995925  0.053677518
[12,] -0.20384697  0.054810036 -0.654399354  0.24257603 -0.280281821
[13,]  0.22918708  0.124217237  0.105502797  0.32430009  0.060708094
[14,] -0.60988190 -0.152372769 -0.057989148  0.37923393  0.092056936
[15,] -0.18628514 -0.564725585  0.477585448 -0.13440425 -0.391160105
              [,6]         [,7]        [,8]         [,9]        [,10]
 [1,]  0.000000000  0.000000000  0.00000000  0.000000000  0.000000000
 [2,] -0.227118204  0.149023396  0.32974703 -0.264627908  0.272937273
 [3,]  0.163660780 -0.219315535  0.41115698 -0.530840065 -0.096628817
 [4,]  0.088164796 -0.126882658 -0.28479162 -0.104747464  0.329575547
 [5,] -0.306307233  0.156230689 -0.48171231 -0.081801645 -0.119358063
 [6,]  0.004596151 -0.008649291 -0.27575653 -0.217115070 -0.092646961
 [7,]  0.100199983  0.307703046 -0.03592672 -0.009970573  0.728583294
 [8,]  0.137746748  0.409211410  0.05053810 -0.252315899 -0.002346738
 [9,] -0.389333263 -0.381885971  0.28175330  0.033126518  0.308264030
[10,] -0.349378372 -0.007829289 -0.33439683 -0.098438093  0.248965491
[11,] -0.315318077  0.105665712 -0.10595760 -0.579680946 -0.203910224
[12,] -0.192148246  0.490214005  0.29292185  0.022917708  0.007189831
[13,] -0.557142612 -0.212575749  0.12380442  0.192743205 -0.047976290
[14,]  0.089540468 -0.317747378 -0.13919941 -0.364364427  0.148277534
[15,] -0.250165007  0.288877973  0.07897424  0.048596841 -0.175924965
              [,11]       [,12]       [,13]       [,14]       [,15]
 [1,]  0.0000000000  0.00000000  0.00000000  0.00000000  0.44969642
 [2,]  0.5540887236 -0.07662599  0.11589006  0.22885395 -0.11313986
 [3,]  0.1882616150 -0.01741031 -0.08840109 -0.39969798  0.10352955
 [4,]  0.3517643683 -0.32423329 -0.22752732  0.17566137  0.22391419
 [5,]  0.1930150153 -0.09625223  0.15487056  0.02157019  0.44972844
 [6,]  0.2531539467  0.65406926  0.38449905  0.15517128 -0.26710745
 [7,] -0.2263461495  0.37387037 -0.24229757 -0.10756838  0.06586421
 [8,] -0.2526263298 -0.14688424  0.53863290 -0.31214927  0.22606060
 [9,] -0.3386843086 -0.11948607  0.43521649  0.33189611  0.06935850
[10,] -0.0005035845 -0.29522340  0.10595865 -0.48698060 -0.44338372
[11,] -0.3958144059 -0.04663491 -0.40099428  0.25268494 -0.16728827
[12,]  0.1140817435  0.02741796 -0.06980928  0.08249458  0.02732779
[13,]  0.1034957204  0.34823097 -0.18371485 -0.43562488  0.21490603
[14,] -0.1376256988  0.23839190  0.01679496  0.03783549  0.29762537
[15,] -0.0580303498  0.08841462 -0.07735978  0.11957518  0.17371140

4.1.8 Menghitung Tingkat Kumulatif Variasi

> cumulative_variance <- cumsum(eigenvalues) / sum(eigenvalues)
> print(cumulative_variance)
 [1] 0.6208467 0.8257001 0.9607215 1.0000000 1.0000000 1.0000000 1.0000000
 [8] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[15] 1.0000000

4.1.9 Koordinat Objek

> fit <- cmdscale(dist_matrix, k = 3)
> data$MDS1 <- fit[, 1]
> data$MDS2 <- fit[, 2]
> data$MDS3 <- if (ncol(fit) >= 3) fit[, 3] else NA

4.1.10 Matriks Disparities

> disparities <- as.matrix(dist(fit))
> 
> for (i in 1:n) {
+   for (j in 1:n) {
+     disparities[i, j] <- sqrt(sum((fit[i, ] - fit[j, ])^2))
+   }
+ }

4.1.11 Menghitung Stress

> stress <- sqrt(sum((dist_matrix - disparities)^2) / sum(dist_matrix^2))
> cat("Nilai Stress:", stress, "\n")
Nilai Stress: 0.04060914 

4.1.12 Hitung Nilai Stress Untuk Setiap Dimensi

> max_dim <- 5  # Jumlah dimensi maksimum yang ingin diuji
> stress_values <- numeric(max_dim)
> for (k in 1:max_dim) {
+   fit_k <- cmdscale(dist_matrix, k = k)  # MDS untuk dimensi k
+   disparities_k <- as.matrix(dist(fit_k))  # Hitung jarak pada konfigurasi k dimensi
+   stress_values[k] <- sqrt(sum((dist_matrix - disparities_k)^2) / sum(dist_matrix^2))  # Nilai stress
+ }

4.1.13 Plot grafik stress

> plot(1:max_dim, stress_values, type = "b", pch = 19, col = "blue",
+      xlab = "Dimensi", ylab = "Nilai Stress",
+      main = "Grafik Stress Setiap Dimensi")
> abline(h = 0.01, col = "red", lty = 2)  # Garis referensi untuk stress < 0.1

Grafik Stress Setiap Dimensi dapat digunakaan untuk mengidentifikasi dimensi yang paling optimal.

4.1.14 Visualisasi Dalam 2 Dimensi

> plot(
+   data$MDS1, data$MDS2,
+   type = "n",
+   main = "Visualisasi MDS Lagu Billboard Global 200 (2D)",
+   xlab = "Dimensi 1",
+   ylab = "Dimensi 2"
+ )
> abline(h = 0, col = "red", lty = 2)
> abline(v = 0, col = "red", lty = 2)
> points(data$MDS1, data$MDS2, pch = 16, col = "blue")
> text(data$MDS1, data$MDS2, labels = data$Judul, cex = 0.8, pos = 3)

Visualisasi Dalam 2 Dimensi digunakan untuk memudahkan visualisasi koordinat.

4.1.15 Visualisasi Dalam 3 Dimensi

4.1.15.1 3 Dimensi Interaktif

> if (!is.na(data$MDS3[1])) {
+   plot3d(
+     x = data$MDS1, 
+     y = data$MDS2, 
+     z = data$MDS3, 
+     type = "s", 
+     col = "blue", 
+     size = 1, 
+     xlab = "Dimensi 1", 
+     ylab = "Dimensi 2", 
+     zlab = "Dimensi 3",
+     main = "Visualisasi MDS 3D Lagu Billboard Global 200"
+   )
+   text3d(
+     x = data$MDS1, 
+     y = data$MDS2, 
+     z = data$MDS3, 
+     texts = data$Judul, 
+     cex = 0.8, 
+     col = "red"
+   )
+ } else {
+   cat("Dimensi 3 tidak tersedia untuk visualisasi 3D.\n")
+ }

4.1.15.2 Proyeksi 3 Dimensi

> scatterplot3d(
+   x = data$MDS1, 
+   y = data$MDS2, 
+   z = data$MDS3, 
+   color = "blue", 
+   pch = 16, 
+   xlab = "Dimensi 1", 
+   ylab = "Dimensi 2", 
+   zlab = "Dimensi 3", 
+   main = "Visualisasi MDS (Proyeksi 3D)"
+ )
> 
> # Menambahkan teks di dekat titik
> scatterplot3d_obj <- scatterplot3d(
+   x = data$MDS1, 
+   y = data$MDS2, 
+   z = data$MDS3, 
+   color = "blue", 
+   pch = 16, 
+   xlab = "Dimensi 1", 
+   ylab = "Dimensi 2", 
+   zlab = "Dimensi 3", 
+   main = "Visualisasi MDS (Proyeksi 3D)"
+ )
> 
> scatterplot3d_obj$points3d(
+   x = data$MDS1, 
+   y = data$MDS2, 
+   z = data$MDS3, 
+   pch = "", 
+   col = "red"
+ )
> 
> # Menambahkan label
> text(
+   scatterplot3d_obj$xyz.convert(data$MDS1, data$MDS2, data$MDS3), 
+   labels = data$Judul, 
+   cex = 0.8, 
+   col = "red", 
+   pos = 4
+ )

Proyeksi 3 Dimensi digunakan untuk melihat bentuk 3 dimensi dari salah satu perspektif

4.2 Tabel Penjelasan

Tabel Penjelasan Source Code
Source Code Pembahasan
library(readxl) Memuat readxl untuk membaca file Excel
library(MASS) Memuat MASS untuk mendukung analisis MDS
library(ggplot2) Memuat ggplot2 untuk membuat visualisasi data
library(rgl) Memuat rgl untuk membuat plot 3D interaktif
library(scatterplot3d) Memuat scatterplot3d untuk membuat grafik 3D dalam bentuk proyeksi 2D.
data <- read_excel(“lokasi file/ nama file.xlsx”) Membaca dataset dari file Excel dan menyimpannya ke dalam variabel data
data_mds <- data[, c(“Total View YT”, “Total Like MV”, “Total Stream Spotify”, “Tempo Lagu (BPM)”)] Memilih kolom numerik yang relevan untuk analisis, yaitu Total View YT, Total Like MV, Total Stream Spotify, dan Tempo Lagu (BPM).
data_scaled <- scale(data_mds) Menormalisasi data agar setiap variabel memiliki rata-rata 0 dan standar deviasi 1 untuk skala yang seragam.
dist_matrix <- as.matrix(dist(data_scaled)) Menghitung matriks jarak antara objek menggunakan metode Euclidean dan mengkonversinya ke dalam bentuk matriks.
A <- dist_matrix^2 Menghitung kuadrat dari matriks jarak.
n <- nrow(dist_matrix) Menghitung jumlah baris pada matriks jarak, yang sama dengan jumlah objek (lagu).
I <- diag(n) Membuat matriks identitas berukuran n x n
J <- matrix(rep(1, n), nrow=n, ncol=n) Membuat matriks J berukuran n x n yang berisi angka 1.
V <- I - (1/n) * J Menghitung matriks centering V, digunakan untuk menghilangkan komponen rata-rata dari matriks jarak.
aa <- V %*% A Mengalikan matriks V dengan A untuk mendapatkan hasil tengah untuk analisis.
BB <- aa %*% V Mengalikan hasil dari aa dengan V untuk memperoleh matriks B.
B <- (-1/2) * BB Mengalikan matriks BB dengan -1/2 untuk mendapatkan matriks B yang siap untuk analisis eigen.
eigen_result <- eigen(B) Menghitung nilai eigen dan vektor eigen dari matriks B.
eigenvalues <- eigen_result$values Menyimpan nilai eigen yang dihitung dalam variabel eigenvalues.
eigenvectors <- eigen_result$vectors Menyimpan vektor eigen yang dihitung dalam variabel eigenvectors
print(eigenvalues) Menampilkan nilai eigen untuk melihat kontribusi variabel terhadap dimensi baru
print(eigenvectors) Menampilkan vektor eigen untuk memahami kontribusi setiap variabel terhadap komponen utama.
cumulative_variance <- cumsum(eigenvalues) / sum(eigenvalues) Menghitung tingkat variasi kumulatif untuk melihat seberapa banyak variasi yang dijelaskan oleh dimensi-dimensi pertama.
print(cumulative_variance) Menampilkan tingkat variasi kumulatif untuk mengevaluasi berapa dimensi yang cukup untuk representasi data.
fit <- cmdscale(dist_matrix, k = 3) Melakukan Multidimensional Scaling (MDS) untuk menghasilkan koordinat objek dalam 3 dimensi.
data$MDS1 <- fit[, 1] Menyimpan koordinat MDS dimensi 1 dalam kolom MDS1 pada data.
data$MDS2 <- fit[, 2] Menyimpan koordinat MDS dimensi 2 dalam kolom MDS2 pada data.
data$MDS3 <- if (ncol(fit) >= 3) fit[, 3] else NA Menyimpan koordinat MDS dimensi 3 dalam kolom MDS3, jika ada.
disparities <- as.matrix(dist(fit)) Menghitung jarak antar objek berdasarkan koordinat MDS yang dihasilkan.
for (i in 1:n) { for (j in 1:n) { disparities[i, j] <- sqrt(sum((fit[i, ] - fit[j, ])^2)) } } Menghitung jarak antara setiap pasangan objek dalam ruang MDS secara manual untuk menghitung disparitas.
stress <- sqrt(sum((dist_matrix - disparities)^2) / sum(dist_matrix^2)) Menghitung nilai stress yang mengukur seberapa baik model MDS menggambarkan jarak yang ada pada data asli.
cat(“Nilai Stress:”, stress, “”) Menampilkan nilai stress, yang mengindikasikan kualitas pengurangan dimensi.
max_dim <- 5 Menetapkan jumlah dimensi maksimum yang ingin diuji (5 dimensi).
stress_values <- numeric(max_dim) Menyediakan vektor untuk menyimpan nilai stress untuk setiap dimensi.
for (k in 1:max_dim) { … } Perulangan untuk menghitung nilai stress pada setiap dimensi dari 1 hingga 5.
plot(1:max_dim, stress_values, type = “b”, pch = 19, col = “blue”, …) Membuat grafik stress untuk memvisualisasikan bagaimana stress berubah dengan bertambahnya dimensi.
abline(h = 0.01, col = “red”, lty = 2) Menambahkan garis horizontal pada nilai stress 0.01 untuk memberikan referensi visual.
plot(data$MDS1, data$MDS2, type = “n”, …) Membuat plot kosong untuk visualisasi 2D berdasarkan dimensi pertama dan kedua.
points(data$MDS1, data$MDS2, pch = 16, col = “blue”) Menambahkan titik data pada plot 2D dengan warna biru.
text(data$MDS1, data$MDS2, labels = data$Judul, cex = 0.8, pos = 3) Menambahkan label pada plot 2D untuk setiap titik menggunakan nama lagu.
if (!is.na(data$MDS3[1])) Mengecek apakah dimensi ketiga tersedia dan melakukan visualisasi 3D jika ada.
plot3d(x = data$MDS1, y = data$MDS2, z = data$MDS3, …) Membuat visualisasi 3D interaktif menggunakan rgl untuk tiga dimensi pertama.
text3d(x = data$MDS1, y = data$MDS2, z = data$MDS3, …) Menambahkan label pada plot 3D untuk masing-masing titik data.
cat(“Dimensi 3 tidak tersedia untuk visualisasi 3D.”) Menampilkan pesan jika dimensi ketiga tidak tersedia untuk visualisasi 3D.
scatterplot3d(x = data$MDS1, …) Membuat grafik scatterplot 3D dalam bentuk 2D menggunakan data pada sumbu x, y, dan z dari koordinat hasil MDS.
scatterplot3d_obj <- scatterplot3d(…) Menyimpan grafik scatterplot3d ke dalam sebuah objek.
scatterplot3d_obj$points3d(…) Menambahkan elemen tambahan ke grafik.
text(scatterplot3d_obj$xyz.convert(…), …) Mengonversi koordinat 3D ke 2D menggunakan, lalu menambahkan label pada grafik di dekat masing-masing titik.

5 HASIL DAN PEMBAHASAN

5.1 Penentuan Matriks Jarak

Pertama, tentukan matriks \(D\) berukuran \(n \times n\) yakni \(15 \times 15\) dengan elemen matriks \(d_{ij}\), yaitu jarak Euclidean antar objek.

> round(dist_matrix, 2)
      1    2    3    4    5    6    7    8    9   10   11   12   13   14   15
1  0.00 2.08 3.98 4.44 3.73 3.31 3.46 3.63 3.68 2.38 3.08 3.22 3.53 3.75 4.33
2  2.08 0.00 2.66 3.16 2.51 2.21 2.14 2.35 2.44 1.38 2.19 2.77 2.39 3.10 2.39
3  3.98 2.66 0.00 1.75 0.51 1.21 0.75 1.88 0.60 2.92 1.76 2.78 1.81 4.63 2.94
4  4.44 3.16 1.75 0.00 2.08 1.25 1.47 0.95 1.37 3.95 1.40 3.79 0.96 5.65 3.82
5  3.73 2.51 0.51 2.08 0.00 1.32 0.95 2.09 0.75 2.58 1.84 2.29 1.98 4.27 2.95
6  3.31 2.21 1.21 1.25 1.32 0.00 0.62 0.93 0.65 2.89 0.55 2.85 0.75 4.74 3.35
7  3.46 2.14 0.75 1.47 0.95 0.62 0.00 1.28 0.47 2.71 1.11 2.85 1.23 4.55 2.89
8  3.63 2.35 1.88 0.95 2.09 0.93 1.28 0.00 1.39 3.32 0.82 3.49 0.32 5.06 3.44
9  3.68 2.44 0.60 1.37 0.75 0.65 0.47 1.39 0.00 2.87 1.20 2.68 1.27 4.65 3.15
10 2.38 1.38 2.92 3.95 2.58 2.89 2.71 3.32 2.87 0.00 3.04 1.99 3.29 1.98 2.45
11 3.08 2.19 1.76 1.40 1.84 0.55 1.11 0.82 1.20 3.04 0.00 3.08 0.60 4.90 3.65
12 3.22 2.77 2.78 3.79 2.29 2.85 2.85 3.49 2.68 1.99 3.08 0.00 3.31 2.99 3.80
13 3.53 2.39 1.81 0.96 1.98 0.75 1.23 0.32 1.27 3.29 0.60 3.31 0.00 5.06 3.60
14 3.75 3.10 4.63 5.65 4.27 4.74 4.55 5.06 4.65 1.98 4.90 2.99 5.06 0.00 3.31
15 4.33 2.39 2.94 3.82 2.95 3.35 2.89 3.44 3.15 2.45 3.65 3.80 3.60 3.31 0.00

5.2 Nilai Eigen dan Vektor

Selanjutnya, mendapatkan nilai eigen dan vektor eigen dengan mencari matriks \(B\)

> print(eigenvalues)
 [1]  3.476741e+01  1.147179e+01  7.561201e+00  2.199594e+00  2.223907e-15
 [6]  2.097246e-15  2.060377e-15  8.166747e-16  7.841399e-16  6.073141e-16
[11]  4.961872e-16  1.345465e-16 -4.397301e-16 -4.687139e-16 -2.481387e-15
> print(eigenvectors)
             [,1]         [,2]         [,3]        [,4]         [,5]
 [1,] -0.24702566  0.677425656  0.159586919 -0.37151724 -0.338161030
 [2,] -0.15412900  0.127394506  0.336288212  0.01648328  0.357932773
 [3,]  0.15073532 -0.231108162 -0.185904319 -0.34610620 -0.142892579
 [4,]  0.34624494 -0.065195786  0.045040586  0.32771128 -0.424548554
 [5,]  0.08416218 -0.187322539 -0.291011974 -0.30978003  0.364326065
 [6,]  0.17634224  0.074177849 -0.034190051 -0.04171145 -0.305736314
 [7,]  0.14335935 -0.072462176 -0.003327308 -0.24569077  0.106059195
 [8,]  0.22970804  0.078952122  0.205245214  0.34949695  0.003872018
 [9,]  0.16599083 -0.087441222 -0.153449874 -0.12607677 -0.138092641
[10,] -0.31234987  0.007171149  0.001107526 -0.10447408 -0.231786174
[11,]  0.18778856  0.216479686  0.049915325  0.03995925  0.053677518
[12,] -0.20384697  0.054810036 -0.654399354  0.24257603 -0.280281821
[13,]  0.22918708  0.124217237  0.105502797  0.32430009  0.060708094
[14,] -0.60988190 -0.152372769 -0.057989148  0.37923393  0.092056936
[15,] -0.18628514 -0.564725585  0.477585448 -0.13440425 -0.391160105
              [,6]         [,7]        [,8]         [,9]        [,10]
 [1,]  0.000000000  0.000000000  0.00000000  0.000000000  0.000000000
 [2,] -0.227118204  0.149023396  0.32974703 -0.264627908  0.272937273
 [3,]  0.163660780 -0.219315535  0.41115698 -0.530840065 -0.096628817
 [4,]  0.088164796 -0.126882658 -0.28479162 -0.104747464  0.329575547
 [5,] -0.306307233  0.156230689 -0.48171231 -0.081801645 -0.119358063
 [6,]  0.004596151 -0.008649291 -0.27575653 -0.217115070 -0.092646961
 [7,]  0.100199983  0.307703046 -0.03592672 -0.009970573  0.728583294
 [8,]  0.137746748  0.409211410  0.05053810 -0.252315899 -0.002346738
 [9,] -0.389333263 -0.381885971  0.28175330  0.033126518  0.308264030
[10,] -0.349378372 -0.007829289 -0.33439683 -0.098438093  0.248965491
[11,] -0.315318077  0.105665712 -0.10595760 -0.579680946 -0.203910224
[12,] -0.192148246  0.490214005  0.29292185  0.022917708  0.007189831
[13,] -0.557142612 -0.212575749  0.12380442  0.192743205 -0.047976290
[14,]  0.089540468 -0.317747378 -0.13919941 -0.364364427  0.148277534
[15,] -0.250165007  0.288877973  0.07897424  0.048596841 -0.175924965
              [,11]       [,12]       [,13]       [,14]       [,15]
 [1,]  0.0000000000  0.00000000  0.00000000  0.00000000  0.44969642
 [2,]  0.5540887236 -0.07662599  0.11589006  0.22885395 -0.11313986
 [3,]  0.1882616150 -0.01741031 -0.08840109 -0.39969798  0.10352955
 [4,]  0.3517643683 -0.32423329 -0.22752732  0.17566137  0.22391419
 [5,]  0.1930150153 -0.09625223  0.15487056  0.02157019  0.44972844
 [6,]  0.2531539467  0.65406926  0.38449905  0.15517128 -0.26710745
 [7,] -0.2263461495  0.37387037 -0.24229757 -0.10756838  0.06586421
 [8,] -0.2526263298 -0.14688424  0.53863290 -0.31214927  0.22606060
 [9,] -0.3386843086 -0.11948607  0.43521649  0.33189611  0.06935850
[10,] -0.0005035845 -0.29522340  0.10595865 -0.48698060 -0.44338372
[11,] -0.3958144059 -0.04663491 -0.40099428  0.25268494 -0.16728827
[12,]  0.1140817435  0.02741796 -0.06980928  0.08249458  0.02732779
[13,]  0.1034957204  0.34823097 -0.18371485 -0.43562488  0.21490603
[14,] -0.1376256988  0.23839190  0.01679496  0.03783549  0.29762537
[15,] -0.0580303498  0.08841462 -0.07735978  0.11957518  0.17371140
> print(cumulative_variance)
 [1] 0.6208467 0.8257001 0.9607215 1.0000000 1.0000000 1.0000000 1.0000000
 [8] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[15] 1.0000000

Setelah nilai eigen dan vektor eigen diperoleh, dapat ditentukan jumlah dimensi yang akan digunakan dengan menghhitung tingkat kumulatif variasi. Tiga nilai pertama telah memenuhi kriteria kesesuaian yang baik, yaitu 0.8, sehingga menggunakan 3 dimensi sudah sesuai digunakan.

5.3 Titik Koordinat

Langkah selanjutnya adalah mencari titik koordinat

> fit <- cmdscale(dist_matrix, k = 3)
> print(fit)
         [,1]        [,2]         [,3]
1  -1.4565596  2.29444299  0.438826324
2  -0.9088047  0.43148562  0.924713131
3   0.8887942 -0.78276413 -0.511192956
4   2.0415952 -0.22081835  0.123850971
5   0.4962530 -0.63446207 -0.800214175
6   1.0397826  0.25124063 -0.094014563
7   0.8453026 -0.24542963 -0.009149310
8   1.3544482  0.26741110  0.564375848
9   0.9787466 -0.29616371 -0.421950899
10 -1.8417366  0.02428871  0.003045436
11  1.1072745  0.73321743  0.137255352
12 -1.2019612  0.18564178 -1.799443615
13  1.3513764  0.42072420  0.290107765
14 -3.5961015 -0.51608709 -0.159456456
15 -1.0984098 -1.91272747  1.313247147

5.4 Disparities

Langkah selanjutnya adalah menghitung disparities D yang merupakan jarak Euclidean dari koordinat yang terbentuk.

> disparities <- as.matrix(dist(fit))
> disparities
          1        2         3         4         5         6         7
1  0.000000 2.001682 3.9840212 4.3200505 3.7319142 3.2696055 3.4569068
2  2.001682 0.000000 2.6014593 3.1259783 2.4669426 2.2061929 2.0993346
3  3.984021 2.601459 0.0000000 1.4310883 0.5095246 1.1251672 0.7366598
4  4.320050 3.125978 1.4310883 0.0000000 1.8474523 1.1286866 1.2039148
5  3.731914 2.466943 0.5095246 1.8474523 0.0000000 1.2564281 0.9481379
6  3.269605 2.206193 1.1251672 1.1286866 1.2564281 0.0000000 0.5400981
7  3.456907 2.099335 0.7366598 1.2039148 0.9481379 0.5400981 0.0000000
8  3.467908 2.297624 1.5737058 0.9511053 1.8471546 0.7298999 0.9225865
9  3.658264 2.430191 0.5028275 1.1971732 0.7002349 0.6410298 0.4367910
10 2.343473 1.373187 2.8933673 3.8929343 2.5583929 2.8920721 2.7005696
11 3.016888 2.185339 1.6632555 1.3354097 1.7671286 0.5388345 1.0236277
12 3.085728 2.750893 2.6398216 3.7927470 2.1342356 2.8174824 2.7535914
13 3.378971 2.347607 1.5180413 0.9568804 1.7416819 0.5228435 0.8884967
14 3.582549 3.048751 4.5065646 5.6525278 4.1439050 4.6994144 4.4521812
15 4.311979 2.383746 2.9247870 3.7599004 2.9400052 3.3518667 2.8821229
           8         9       10        11       12        13       14       15
1  3.4679080 3.6582642 2.343473 3.0168885 3.085728 3.3789709 3.582549 4.311979
2  2.2976242 2.4301909 1.373187 2.1853392 2.750893 2.3476070 3.048751 2.383746
3  1.5737058 0.5028275 2.893367 1.6632555 2.639822 1.5180413 4.506565 2.924787
4  0.9511053 1.1971732 3.892934 1.3354097 3.792747 0.9568804 5.652528 3.759900
5  1.8471546 0.7002349 2.558393 1.7671286 2.134236 1.7416819 4.143905 2.940005
6  0.7298999 0.6410298 2.892072 0.5388345 2.817482 0.5228435 4.699414 3.351867
7  0.9225865 0.4367910 2.700570 1.0236277 2.753591 0.8884967 4.452181 2.882123
8  0.0000000 1.1964985 3.254197 0.6786032 3.482751 0.3142250 5.064163 3.366055
9  1.1964985 0.0000000 2.870268 1.1784976 2.623949 1.0769442 4.587647 3.152581
10 3.2541969 2.8702678 0.000000 3.0359939 1.919457 3.2304081 1.842881 2.453812
11 0.6786032 1.1784976 3.035994 0.0000000 3.063203 0.4249725 4.875505 3.639921
12 3.4827514 2.6239492 1.919457 3.0632029 0.000000 3.3077215 2.985614 3.755359
13 0.3142250 1.0769442 3.230408 0.4249725 3.307722 0.0000000 5.055419 3.534581
14 5.0641627 4.5876470 1.842881 4.8755046 2.985614 5.0554189 0.000000 3.218373
15 3.3660548 3.1525814 2.453812 3.6399210 3.755359 3.5345811 3.218373 0.000000

5.5 Hitung Stress

> stress <- sqrt(sum((dist_matrix - disparities)^2) / sum(dist_matrix^2))
> cat("Nilai Stress:", stress, "\n")
Nilai Stress: 0.04060914 

Nilai stress yang diperoleh sebesar 4.06% menunjukkan hasil yang sangat baik, karena berada di selang 2.5% hingga 5%.

5.6 Grafik Stress

> plot(1:max_dim, stress_values, type = "b", pch = 19, col = "blue",
+      xlab = "Dimensi", ylab = "Nilai Stress",
+      main = "Grafik Stress Setiap Dimensi")
> abline(h = 0.01, col = "red", lty = 2)

Penurunan stress signifikan terjadi dari dimensi(q) 2 ke dimensi(q) 3, menunjukkan bahwa menambah dimensi hingga q = 3 memberikan representasi yang jauh lebih baik terhadap data.Namun, setelah dimensi(q) 3, penurunan stress menjadi sangat kecil hingga mendekati 0.

5.7 Visualisasi 2 Dimensi

> plot(
+   data$MDS1, data$MDS2,
+   type = "n",
+   main = "Visualisasi 2 Dimensi MDS Lagu Billboard Global 200 (2D)",
+   xlab = "Dimensi 1",
+   ylab = "Dimensi 2"
+ )
> abline(h = 0, col = "red", lty = 2)
> abline(v = 0, col = "red", lty = 2)
> points(data$MDS1, data$MDS2, pch = 16, col = "blue")
> text(data$MDS1, data$MDS2, labels = data$Judul, cex = 0.8, pos = 3)

Plot MDS ini memvisualisasikan hubungan relatif antar-lagu dari Billboard Global 200 dalam dua dimensi berdasarkan data seperti “Total View YT”, “Total Like MV”, dll. Lagu-lagu yang berdekatan, seperti “Mantra” dan “Whiplash”, memiliki karakteristik serupa, sementara lagu-lagu yang berjauhan, seperti “APT” atau “Cruel Summer”, menunjukkan perbedaan yang signifikan dibandingkan lagu lainnya. Kuadran dalam plot menunjukkan grup karakteristik berbeda, dengan garis merah sebagai sumbu nol untuk Dimensi 1 dan Dimensi 2 sebagai referensi. Analisis ini membantu mengidentifikasi pola kesamaan atau perbedaan karakteristik antar-lagu dalam dataset.

Berdasarkan Kemiripan atau Ketidakmiripan Karakteristik Lagu dapat dikelompokkan menjadi:

  • Kelompok 1: Mantra, Drip, Taste, Whiplash, Who, Please Please Please, Espresso, Birds Of A Feather, dan That’s So True. Lagu-lagu dalam kelompok ini cenderung memiliki karakteristik yang serupa karena saling berdekatan dalam grafik MDS. Bisa jadi, mereka memiliki pola atau atribut yang mirip, seperti genre, tempo, atau popularitas.

  • Kelompok 2: All I Want For Christmas Is You, Last Christmas, dan Die With Smile. Lagu-lagu ini berada dalam kelompok yang lebih kecil dan mungkin mewakili kategori khusus, misalnya lagu-lagu bertema musiman (seperti Natal) atau memiliki karakteristik umum lainnya.

  • Kelompok 3: APT. Lagu ini berdiri sendiri, menunjukkan bahwa karakteristiknya sangat berbeda dibandingkan dengan kelompok lain. Kemungkinan, atributnya unik atau tidak memiliki kemiripan dengan lagu lain.

  • Kelompok 4: Yellow. Sama seperti APT, lagu ini berdiri sendiri, mengindikasikan perbedaan signifikan dalam karakteristiknya dibandingkan dengan lagu lain.

  • Kelompok 5: Cruel Summer. Lagu ini juga berdiri sendiri, menunjukkan bahwa atribut atau karakteristiknya sangat berbeda dari semua lagu lainnya.

5.8 Visualisasi 3 Dimensi

> scatterplot3d_obj <- scatterplot3d(
+   x = data$MDS1, 
+   y = data$MDS2, 
+   z = data$MDS3, 
+   color = "blue", 
+   pch = 16, 
+   xlab = "Dimensi 1", 
+   ylab = "Dimensi 2", 
+   zlab = "Dimensi 3", 
+   main = "Visualisasi MDS (Proyeksi 3D)"
+ )
> 
> scatterplot3d_obj$points3d(
+   x = data$MDS1, 
+   y = data$MDS2, 
+   z = data$MDS3, 
+   pch = "", 
+   col = "red"
+ )
> 
> text(
+   scatterplot3d_obj$xyz.convert(data$MDS1, data$MDS2, data$MDS3), 
+   labels = data$Judul, 
+   cex = 0.8, 
+   col = "red", 
+   pos = 4
+ )

Visualisasi 3 dimensi dapat dilakukan karena dimensi optimalnya \(\geq\) 3. Representasi dalam ruang 3 dimensi memberikan gambaran yang lebih akurat mengenai hubungan kedekatan antar objek (lagu) dibandingkan visualisasi dua dimensi.

Kelompok yang didapatkan dari visualisasi 3 dimensi adalah :

  • Kelompok 1: Mantra, Drip, Taste, Whiplash, Who, Please Please Please, Espresso, Birds Of A Feather, dan That’s So True

  • Kelompok 2: All I Want For Christmas Is You

  • Kelompok 3: Last Christmas

  • Kelompok 4: Die With Smile

  • Kelompok 5: APT

  • Kelompok 6: Yellow

  • Kelompok 7: Cruel Summer

6 KESIMPULAN

Kelompok yang didapatkan dari visualisasi 2 dimensi

Kelompok yang didapatkan dari visualisasi 3 dimensi

7 DAFTAR PUSTAKA

Bangsa, T. K., Thayf, M. S., & Marlina. (2019). SISTEM PENDUKUNG KEPUTUSAN MENENTUKAN KUALITAS BIJI KAKAO DENGAN MENGGUNAKAN METODE MULTIDIENSIONAL SCALING (STUDI KASUS: PT. TANAH MAS CELEBES INDAH KABUPATEN POSO). JITU : Journal Informatic Technology And Communication, 46-51.

Cabral, R. (2024). Billboard Global 200. Retrieved from https://www.billboard.com/charts/billboard-global-200/

Johnson, R. A., & Wichern, D. W. (2007). Applied Multivariate Statistical Analysis. United States of America: Pearson Education Inc.