Analisis ini bertujuan untuk mengelompokkan universitas di seluruh dunia berdasarkan stabilitas performa mereka selama tiga tahun terakhir (2013-2015) menggunakan tiga algoritma berbeda: K-Means, DBSCAN, dan Fuzzy C-Means.
Tahap awal adalah memuat library yang diperlukan untuk manipulasi data, perhitungan algoritma clustering, dan visualisasi hasil.
library(tidyverse) # Manipulasi data & ggplot2
## Warning: package 'tidyverse' was built under R version 4.5.3
## Warning: package 'readr' was built under R version 4.5.3
## Warning: package 'lubridate' was built under R version 4.5.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(cluster) # Algoritma clustering & silhouette
library(factoextra)# Visualisasi cluster
## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
library(dbscan) # Algoritma DBSCAN
## Warning: package 'dbscan' was built under R version 4.5.3
##
## Attaching package: 'dbscan'
##
## The following object is masked from 'package:stats':
##
## as.dendrogram
library(e1071) # Algoritma Fuzzy C-Means
## Warning: package 'e1071' was built under R version 4.5.3
##
## Attaching package: 'e1071'
##
## The following object is masked from 'package:ggplot2':
##
## element
library(gridExtra) # Mengatur tata letak grafik
##
## Attaching package: 'gridExtra'
##
## The following object is masked from 'package:dplyr':
##
## combine
Sebelum pengolahan, perlu melihat struktur data asli terlebih dahulu untuk memahami variabel apa saja yang tersedia.
# Membaca file CSV
data_raw <- read.csv("cwurData.csv")
# Menampilkan 6 data teratas
head(data_raw)
## world_rank institution country national_rank
## 1 1 Harvard University USA 1
## 2 2 Massachusetts Institute of Technology USA 2
## 3 3 Stanford University USA 3
## 4 4 University of Cambridge United Kingdom 1
## 5 5 California Institute of Technology USA 4
## 6 6 Princeton University USA 5
## quality_of_education alumni_employment quality_of_faculty publications
## 1 7 9 1 1
## 2 9 17 3 12
## 3 17 11 5 4
## 4 10 24 4 16
## 5 2 29 7 37
## 6 8 14 2 53
## influence citations broad_impact patents score year
## 1 1 1 NA 5 100.00 2012
## 2 4 4 NA 1 91.67 2012
## 3 2 2 NA 15 89.50 2012
## 4 16 11 NA 50 86.17 2012
## 5 22 22 NA 18 85.21 2012
## 6 33 26 NA 101 82.50 2012
Interpretasi: Data awal bersifat longitudinal (satu universitas muncul di beberapa baris untuk tahun yang berbeda). Kolom seperti
quality_of_educationhinggapatentsmenggunakan skala peringkat (1 = Terbaik), sedangkanscoreadalah nilai absolut (100 = Terbaik).
Tahap ini menggabungkan data tahun 2013, 2014, dan 2015. Dengan mengambil nilai rata-rata,mendapatkan gambaran stabilitas universitas, sehingga hasil clustering tidak terpengaruh oleh fluktuasi peringkat yang hanya terjadi sesaat.
# Agregasi data: Satu baris per Universitas
data_cleaned <- data_raw %>%
filter(year >= 2013 & year <= 2015) %>%
group_by(institution) %>%
summarise(across(c(quality_of_education, alumni_employment, quality_of_faculty,
publications, influence, citations, broad_impact, patents, score),
mean, na.rm = TRUE)) %>%
ungroup()
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `across(...)`.
## ℹ In group 1: `institution = "AGH University of Science and Technology"`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
##
## # Previously
## across(a:b, mean, na.rm = TRUE)
##
## # Now
## across(a:b, \(x) mean(x, na.rm = TRUE))
# Menghilangkan kolom nama (non-numerik) untuk perhitungan
df_final <- data_cleaned %>% select(-institution)
# Scaling data: Menyamakan rentang nilai semua variabel
df_scaled <- scale(df_final)
Menggunakan Elbow Method untuk melihat di mana penambahan cluster tidak lagi memberikan penurunan varians yang signifikan (mencari titik “siku”).
fviz_nbclust(df_scaled, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2, color = "red") +
labs(title = "Elbow Method: Menyarankan k=4")
> Penjelasan: Titik siku biasanya ditemukan pada
\(k=4\). Ini membagi universitas secara
logis menjadi kelompok: Elit, Riset Kuat, Menengah, dan Regional.
Algoritma ini membagi data secara tegas berdasarkan jarak ke pusat massa (centroid).
set.seed(123)
km_res <- kmeans(df_scaled, centers = 4, nstart = 25)
Berbeda dengan K-Means, DBSCAN mengelompokkan data berdasarkan kerapatan. Data yang berada di area sepi akan dianggap sebagai noise (anomali).
# Menentukan epsilon (jarak tetangga)
kNNdistplot(df_scaled, k = 5)
# Eksekusi DBSCAN
db_res <- dbscan(df_scaled, eps = 1.3, minPts = 5)
Dalam algoritma ini, satu universitas bisa memiliki derajat keanggotaan di lebih dari satu cluster.
set.seed(123)
fcm_res <- cmeans(df_scaled, centers = 4, m = 2)
Tahap ini menampilkan ketiga hasil tersebut berdampingan untuk melihat bagaimana masing-masing algoritma memandang struktur data universitas dunia.
plot_km <- fviz_cluster(km_res, data = df_scaled, main = "K-Means (k=4)")
plot_db <- fviz_cluster(db_res, data = df_scaled, main = "DBSCAN (Density-Based)")
plot_fcm <- fviz_cluster(list(data = df_scaled, cluster = fcm_res$cluster),
main = "Fuzzy C-Means (Membership)")
plot_km
Interpretasi K-Means Clustering :
Berdasarkan Gambar hasil K-Means (\(k=4\)), data terbagi menjadi empat wilayah yang terpisah secara spasial berdasarkan jarak ke centroid. - Klaster 4 (Ungu): Terletak di koordinat Dim1 dan Dim2 paling negatif. Kelompok ini memiliki sebaran paling jauh dari pusat massa utama, menunjukkan karakteristik unik yang sangat berbeda dari kelompok lain (Universitas Elit/Top Tier). - Klaster 3 (Biru Muda): Memiliki kepadatan menengah dan berada di antara Klaster 4 dan Klaster 1. - Klaster 1 (Merah) & Klaster 2 (Hijau): Terletak di area dengan nilai Dim1 positif. Kedua klaster ini memiliki area overlap yang cukup besar, menunjukkan adanya kemiripan karakteristik antar anggota di kelompok menengah dan bawah.
plot_db
Interpretasi DBSCAN (Density-Based) :
Hasil DBSCAN menunjukkan struktur data yang didominasi oleh satu massa jenis yang sangat besar.
plot_fcm
Interpretasi Fuzzy C-Means (Membership):
Grafik FCM menunjukkan pembagian wilayah yang mirip dengan K-Means, namun dengan batas area yang lebih dinamis karena konsep soft clustering. Area arsiran (poligon) menunjukkan derajat keanggotaan. Perhatikan area perbatasan antara Klaster 2 (Hijau) dan Klaster 1 (Merah); terdapat tumpang tindih poligon yang menunjukkan bahwa universitas di area tersebut memiliki probabilitas keanggotaan ganda. Ini mencerminkan adanya universitas “transisi” yang memiliki profil antara kategori satu dengan lainnya.
Silhouette Plot Visualisasi diperlukan untuk bagian Asumsi dan Evaluasi. Tanpa ini, kita tidak bisa membuktikan secara objektif metode mana yang paling akurat. Jika batang siluet lebar dan mendekati angka 1, maka pengelompokan sudah sangat baik.Jika banyak batang negatif, berarti banyak universitas yang “salah masuk” klaster.
# Menghitung Silhouette Score
dist_matrix <- dist(df_scaled)
sil_km <- mean(silhouette(km_res$cluster, dist_matrix)[, 3])
sil_fcm <- mean(silhouette(fcm_res$cluster, dist_matrix)[, 3])
cat("Silhouette Score K-Means:", round(sil_km, 4), "\n")
## Silhouette Score K-Means: 0.3299
cat("Silhouette Score FCM:", round(sil_fcm, 4), "\n")
## Silhouette Score FCM: 0.236
sil_km <- silhouette(km_res$cluster, dist(df_scaled))
fviz_silhouette(sil_km) +
labs(title = "K-Means",
subtitle = paste("Average Silhouette Width:", round(mean(sil_km[,3]), 4))) +
theme_minimal()
## cluster size ave.sil.width
## 1 1 362 0.22
## 2 2 486 0.40
## 3 3 156 0.31
## 4 4 19 0.62
(Hanya menghitung data yang bukan noise/0)
db_clusters <- db_res$cluster
# Menghitung jumlah klaster unik selain noise (0)
n_clusters_db <- length(unique(db_clusters[db_clusters != 0]))
if(n_clusters_db > 1) {
sil_db <- silhouette(db_clusters[db_clusters != 0],
dist(df_scaled[db_clusters != 0, ]))
fviz_silhouette(sil_db) +
labs(title = "DBSCAN",
subtitle = paste("Average Silhouette Width:", round(mean(sil_db[,3]), 4))) +
theme_minimal()
} else {
# Tampilkan pesan jika tidak bisa dihitung
plot.new()
text(0.5, 0.5, "DBSCAN hanya menemukan 1 klaster.\nSilhouette tidak dapat dihitung.")
}
sil_fcm <- silhouette(fcm_res$cluster, dist(df_scaled))
fviz_silhouette(sil_fcm) +
labs(title = "Fuzzy C-Means",
subtitle = paste("Average Silhouette Width:", round(mean(sil_fcm[,3]), 4))) +
theme_minimal()
## cluster size ave.sil.width
## 1 1 244 0.19
## 2 2 133 0.26
## 3 3 287 0.17
## 4 4 359 0.31
Berdasarkan hasil analisis multivariat terhadap data World University Rankings periode 2013-2015 menggunakan tiga metode clustering, dapat ditarik beberapa kesimpulan utama:
Struktur Kelompok: Performa universitas dunia secara objektif paling baik dijelaskan dalam 4 kelompok berdasarkan Elbow Method. Terdapat stratifikasi yang jelas antara universitas dengan performa riset dan reputasi alumni yang ekstrem (Klaster 4 pada K-Means) dengan universitas yang memiliki performa rata-rata (Klaster 1 dan 2).
Efektivitas Algoritma:
K-Means unggul dalam memberikan batas segmentasi yang tegas dan mudah dipahami untuk kebijakan pemetaan institusi secara umum.
DBSCAN terbukti paling efektif dalam mendeteksi institusi anomali. Banyaknya outlier yang terdeteksi menunjukkan bahwa kualitas universitas top dunia memang sangat jauh melampaui rata-rata institusi lainnya, sehingga tidak bisa dikelompokkan dalam satu massa densitas yang sama.
Fuzzy C-Means memberikan perspektif tambahan mengenai adanya universitas yang memiliki karakteristik campuran, yang tidak bisa dipisahkan secara kaku oleh garis batas linier.
Evaluasi Metode: Penggunaan standarisasi data (scaling) terbukti krusial dalam menyamakan pengaruh variabel peringkat (seperti patents) dengan variabel skor, sehingga hasil clustering tidak didominasi oleh satu variabel dengan rentang nilai besar saja.