Load Library
library(tidyverse)
library(car)
library(MVN)
library(heplots)
library(emmeans)
library(gridExtra)
Import Data
data <- read.csv("6 class csv.csv")
Data Cleaning & Rename Columns
# Merapikan nama kolom agar tidak ada spasi atau karakter khusus
colnames(data) <- c("Temperature", "Luminosity", "Radius", "Abs_Magnitude",
"Star_Type", "Star_Color", "Spectral_Class")
# Mengubah Spectral_Class menjadi variabel kategori (factor)
data$Star_Type <- as.factor(data$Star_Type)
# Melihat struktur data
str(data)
## 'data.frame': 240 obs. of 7 variables:
## $ Temperature : int 3068 3042 2600 2800 1939 2840 2637 2600 2650 2700 ...
## $ Luminosity : num 0.0024 0.0005 0.0003 0.0002 0.000138 0.00065 0.00073 0.0004 0.00069 0.00018 ...
## $ Radius : num 0.17 0.154 0.102 0.16 0.103 ...
## $ Abs_Magnitude : num 16.1 16.6 18.7 16.6 20.1 ...
## $ Star_Type : Factor w/ 6 levels "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Star_Color : chr "Red" "Red" "Red" "Red" ...
## $ Spectral_Class: chr "M" "M" "M" "M" ...
# Visualisasi Distribusi Suhu dan Kecerahan berdasarkan Kelas Spektral
p1 <- ggplot(data, aes(x = Star_Type, y = Temperature, fill = Star_Type)) +
geom_boxplot() +
labs(title = "Suhu Mutlak (K) vs Tipe Bintang", x = "Tipe Bintang", y = "Suhu (K)") +
theme_minimal() + theme(legend.position = "none")
p2 <- ggplot(data, aes(x = Star_Type, y = Abs_Magnitude, fill = Star_Type)) +
geom_boxplot() +
labs(title = "Magnitudo Absolut vs Tipe Bintang", x = "Tipe Bintang", y = "Magnitudo Absolut") +
theme_minimal() + theme(legend.position = "none")
grid.arrange(p1, p2, ncol = 2)
# Scatter plot: Pengaruh Radius (Kovariat) terhadap Magnitudo
ggplot(data, aes(x = Radius, y = Abs_Magnitude, color = Star_Type)) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Hubungan Radius dan Magnitudo Absolut per Tipe Bintang",
x = "Radius (R/Ro)", y = "Magnitudo Absolut") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
# Menyiapkan matriks Variabel Dependen (Y)
Y_matrix <- data %>% select(Temperature, Abs_Magnitude)
# 1. Uji Normalitas Multivariat
mvn_result <- mvn(data = Y_matrix)
# Menampilkan semua tabel secara otomatis
print(mvn_result)
## $multivariate_normality
## Test Statistic p.value Method MVN
## 1 Henze-Zirkler 18.256 <0.001 asymptotic ✗ Not normal
##
## $univariate_normality
## Test Variable Statistic p.value Normality
## 1 Anderson-Darling Temperature 18.212 <0.001 ✗ Not normal
## 2 Anderson-Darling Abs_Magnitude 13.109 <0.001 ✗ Not normal
##
## $descriptives
## Variable n Mean Std.Dev Median Min Max 25th
## 1 Temperature 240 10497.462 9552.425 5776.000 1939.00 40000.00 3344.250
## 2 Abs_Magnitude 240 4.382 10.533 8.313 -11.92 20.06 -6.232
## 75th Skew Kurtosis
## 1 15055.500 1.313 3.834
## 2 13.698 -0.121 1.354
##
## $data
## Temperature Abs_Magnitude
## 1 3068 16.120
## 2 3042 16.600
## 3 2600 18.700
## 4 2800 16.650
## 5 1939 20.060
## 6 2840 16.980
## 7 2637 17.220
## 8 2600 17.400
## 9 2650 17.450
## 10 2700 16.050
## 11 3600 10.690
## 12 3129 11.790
## 13 3134 13.210
## 14 3628 10.480
## 15 2650 11.782
## 16 3340 13.070
## 17 2799 14.790
## 18 3692 10.800
## 19 3192 13.530
## 20 3441 11.180
## 21 25000 10.580
## 22 7740 14.020
## 23 7220 14.230
## 24 8500 14.500
## 25 16500 11.890
## 26 12990 12.230
## 27 8570 14.200
## 28 7700 14.470
## 29 11790 12.590
## 30 7230 14.080
## 31 39000 -4.700
## 32 30000 -4.200
## 33 15276 -1.970
## 34 9700 0.160
## 35 5800 5.050
## 36 8052 2.420
## 37 6757 2.410
## 38 6380 2.930
## 39 5936 4.460
## 40 5587 5.030
## 41 3826 -6.930
## 42 3365 -6.200
## 43 3270 -6.020
## 44 3200 -7.220
## 45 3008 -6.000
## 46 3600 -6.600
## 47 3575 -6.780
## 48 3574 -5.240
## 49 3625 -6.740
## 50 33750 -6.100
## 51 3490 -9.400
## 52 3750 -7.630
## 53 3834 -9.200
## 54 3749 -8.050
## 55 3650 -7.790
## 56 3450 -11.750
## 57 3660 -11.920
## 58 3450 -11.280
## 59 3752 -11.240
## 60 3535 -11.360
## 61 3341 16.230
## 62 3432 16.940
## 63 2983 16.090
## 64 2835 16.960
## 65 2935 18.890
## 66 3295 17.130
## 67 2945 18.340
## 68 2817 16.450
## 69 2774 17.390
## 70 2871 19.430
## 71 3345 12.300
## 72 3607 10.120
## 73 3304 13.200
## 74 3150 11.940
## 75 3550 10.890
## 76 3180 11.760
## 77 2890 13.460
## 78 3342 11.870
## 79 2621 12.810
## 80 3158 13.980
## 81 7100 14.090
## 82 10574 12.020
## 83 8930 13.780
## 84 17200 12.450
## 85 14100 12.170
## 86 9675 13.980
## 87 12010 12.130
## 88 10980 11.190
## 89 13720 12.970
## 90 19860 11.340
## 91 5300 5.490
## 92 4526 6.506
## 93 4077 6.228
## 94 4980 4.780
## 95 9030 1.450
## 96 11250 -2.300
## 97 5112 4.680
## 98 7720 2.440
## 99 12098 0.020
## 100 36108 -4.400
## 101 33300 -6.500
## 102 40000 -6.230
## 103 23000 -5.760
## 104 17120 -6.890
## 105 11096 -5.910
## 106 14245 -6.120
## 107 24630 -5.830
## 108 12893 -6.340
## 109 24345 -6.240
## 110 33421 -5.790
## 111 3459 -10.700
## 112 3605 -10.810
## 113 3615 -11.330
## 114 3399 -10.920
## 115 3610 -10.860
## 116 3553 -11.030
## 117 4015 -11.390
## 118 3625 -10.250
## 119 6850 -10.070
## 120 3780 -10.700
## 121 3323 17.160
## 122 3531 19.940
## 123 3218 20.020
## 124 3146 16.920
## 125 3511 17.120
## 126 3225 19.630
## 127 2935 16.880
## 128 2861 16.710
## 129 2856 19.560
## 130 2731 18.090
## 131 3095 10.870
## 132 3607 10.340
## 133 3100 11.170
## 134 2989 13.120
## 135 3542 14.230
## 136 3243 14.750
## 137 3091 11.430
## 138 3598 14.260
## 139 3324 12.230
## 140 3541 14.330
## 141 13420 13.670
## 142 21020 11.520
## 143 18290 12.780
## 144 14520 11.920
## 145 11900 11.380
## 146 8924 14.870
## 147 12912 12.830
## 148 14732 12.890
## 149 7723 14.810
## 150 12984 11.230
## 151 29560 -4.010
## 152 8945 0.120
## 153 14060 -2.040
## 154 16390 -3.320
## 155 25070 -3.980
## 156 28700 -4.090
## 157 26140 -3.800
## 158 20120 -3.400
## 159 13023 -1.380
## 160 37800 -4.560
## 161 25390 -5.920
## 162 11567 -6.245
## 163 12675 -5.620
## 164 5752 -6.630
## 165 8927 -7.340
## 166 7282 -7.220
## 167 19923 -5.690
## 168 26373 -5.830
## 169 17383 -6.090
## 170 9373 -5.990
## 171 3570 -7.580
## 172 3500 -8.180
## 173 4287 -9.200
## 174 26000 -9.100
## 175 3600 -7.890
## 176 3614 -7.710
## 177 18000 -8.300
## 178 11000 -9.900
## 179 12100 -7.840
## 180 24490 -8.240
## 181 2831 16.210
## 182 2914 18.390
## 183 3419 17.560
## 184 3218 17.340
## 185 3453 17.080
## 186 2889 16.930
## 187 2968 17.450
## 188 3484 16.670
## 189 2778 19.450
## 190 3523 16.350
## 191 3462 11.470
## 192 3257 10.730
## 193 2994 13.450
## 194 3212 12.854
## 195 3523 12.430
## 196 3598 13.667
## 197 3142 14.120
## 198 3496 14.940
## 199 3324 12.780
## 200 3463 14.776
## 201 16790 12.870
## 202 15680 11.920
## 203 14982 12.230
## 204 13340 12.900
## 205 18340 11.220
## 206 19920 11.340
## 207 24020 10.550
## 208 23092 10.180
## 209 17920 11.660
## 210 19360 11.620
## 211 22350 -3.670
## 212 10012 0.013
## 213 13089 -0.120
## 214 22012 -2.550
## 215 34190 -4.570
## 216 32460 -4.360
## 217 9320 1.236
## 218 19400 -3.080
## 219 17140 -2.640
## 220 8250 -0.980
## 221 23678 -6.270
## 222 12749 -7.020
## 223 9383 -6.980
## 224 23440 -5.975
## 225 16787 -6.350
## 226 18734 -7.450
## 227 9892 -7.262
## 228 10930 -6.224
## 229 23095 -5.905
## 230 21738 -7.346
## 231 24145 -8.840
## 232 38234 -9.290
## 233 32489 -10.840
## 234 27739 -7.590
## 235 21904 -7.670
## 236 38940 -9.930
## 237 30839 -10.630
## 238 8829 -10.730
## 239 9235 -11.230
## 240 37882 -7.800
##
## $subset
## NULL
##
## $outlierMethod
## [1] "none"
##
## attr(,"class")
## [1] "mvn"
# 2. Uji Homogenitas Matriks Kovarians (Box's M Test)
# Menguji apakah varians-kovarians antar kelas spektral itu sama
box_m <- boxM(Y_matrix, data$Star_Type)
print(box_m)
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: Y_matrix by data$Star_Type
## Chi-Sq (approx.) = 675.87, df = 15, p-value = < 2.2e-16
# 3. Uji Homogenitas Varians Univariat (Levene's Test)
leveneTest(Temperature ~ Star_Type, data = data)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 5 16.063 1.316e-13 ***
## 234
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Abs_Magnitude ~ Star_Type, data = data)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 5 30.877 < 2.2e-16 ***
## 234
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Meskipun hasil uji menunjukkan data tidak berdistribusi normal (p < 0.001) dan varians tidak homogen (p < 0.05), analisis tetap dilanjutkan menggunakan Pillai’s Trace pada MANOVA karena sifatnya yang tangguh(robust) terhadap pelanggaran asumsi tersebut.
# Model MANOVA
model_manova <- manova(cbind(Temperature, Abs_Magnitude) ~ Star_Type, data = data)
# Menggunakan test Pillai (Lebih robust jika Box's M terlanggar)
summary(model_manova, test = "Pillai")
## Df Pillai approx F num Df den Df Pr(>F)
## Star_Type 5 1.1926 69.124 10 468 < 2.2e-16 ***
## Residuals 234
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Melihat efek pada masing-masing variabel dependen secara terpisah
summary.aov(model_manova)
## Response Temperature :
## Df Sum Sq Mean Sq F value Pr(>F)
## Star_Type 5 6.9960e+09 1399192099 22.104 < 2.2e-16 ***
## Residuals 234 1.4813e+10 63301318
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response Abs_Magnitude :
## Df Sum Sq Mean Sq F value Pr(>F)
## Star_Type 5 25709 5141.8 1496.5 < 2.2e-16 ***
## Residuals 234 804 3.4
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil Pillai’s Trace menunjukkan p-value < 2.2e-16. Ini membuktikan adanya perbedaan karakteristik fisik (suhu dan kecerahan) yang sangat nyata di antara berbagai tipe bintang.
A. Uji Asumsi Homogenitas Slope (Interaksi antara Faktor dan Kovariat)
# Menggunakan Star_Type (Tipe Bintang) sebagai faktor agar sebaran data seimbang
data$Star_Type <- as.factor(data$Star_Type)
# 1. Ubah Pengaturan Contrast Bawaan R (Wajib untuk Tipe III)
options(contrasts = c("contr.sum", "contr.poly"))
# 2. Uji Asumsi Interaksi (Homogenitas Slope)
model_interaksi <- aov(Abs_Magnitude ~ Radius * Star_Type, data = data)
Anova(model_interaksi, type = "III")
## Anova Table (Type III tests)
##
## Response: Abs_Magnitude
## Sum Sq Df F value Pr(>F)
## (Intercept) 421.60 1 236.3632 <2e-16 ***
## Radius 0.30 1 0.1698 0.6807
## Star_Type 2103.25 5 235.8325 <2e-16 ***
## Radius:Star_Type 395.21 5 44.3140 <2e-16 ***
## Residuals 406.68 228
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 3. Model ANCOVA Utama (Ganti tanda bintang * menjadi plus +)
model_ancova <- aov(Abs_Magnitude ~ Radius + Star_Type, data = data)
Anova(model_ancova, type = "III")
## Anova Table (Type III tests)
##
## Response: Abs_Magnitude
## Sum Sq Df F value Pr(>F)
## (Intercept) 812.8 1 236.1744 <2e-16 ***
## Radius 2.1 1 0.6084 0.4362
## Star_Type 15886.8 5 923.2261 <2e-16 ***
## Residuals 801.9 233
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model ANCOVA Utama
# Menghilangkan interaksi (*) dan menggantinya dengan (+)
emm_ancova <- emmeans(model_ancova, "Star_Type")
print(emm_ancova)
## Star_Type emmean SE df lower.CL upper.CL
## 0 17.350 0.401 233 16.56 18.141
## 1 12.327 0.401 233 11.54 13.117
## 2 12.369 0.401 233 11.58 13.160
## 3 -0.577 0.398 233 -1.36 0.207
## 4 -6.538 0.364 233 -7.25 -5.821
## 5 -8.636 1.340 233 -11.27 -6.000
##
## Confidence level used: 0.95
C. Estimated Marginal Means (EMMeans)
# Melihat rata-rata Magnitudo yang sudah "dibersihkan" dari efek perbedaan Radius
emm_ancova <- emmeans(model_ancova, "Star_Type")
print(emm_ancova)
## Star_Type emmean SE df lower.CL upper.CL
## 0 17.350 0.401 233 16.56 18.141
## 1 12.327 0.401 233 11.54 13.117
## 2 12.369 0.401 233 11.58 13.160
## 3 -0.577 0.398 233 -1.36 0.207
## 4 -6.538 0.364 233 -7.25 -5.821
## 5 -8.636 1.340 233 -11.27 -6.000
##
## Confidence level used: 0.95
# Plot EMMeans
plot(emm_ancova, comparisons = TRUE) +
labs(title = "Estimated Marginal Means dari Magnitudo Absolut",
x = "EMMean Magnitudo Absolut", y = "Tipe Bintang") +
theme_minimal()
Uji interaksi menunjukkan slope yang tidak homogen (p < 2e-16). Pada model ANCOVA utama, terlihat bahwa tipe bintang menentukan kecerahan bintang secara signifikan, sementara faktor radius tidak memberikan pengaruh tambahan yang berarti secara univariat pada variabel ini.
Model MANCOVA
model_mancova <- manova(cbind(Temperature, Abs_Magnitude) ~ Radius + Star_Type, data = data)
Uji Multivariat Pillai’s Trace
summary(model_mancova, test = "Pillai")
## Df Pillai approx F num Df den Df Pr(>F)
## Radius 1 0.9331 1617.95 2 232 < 2.2e-16 ***
## Star_Type 5 1.1385 61.58 10 466 < 2.2e-16 ***
## Residuals 233
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Uji Efek Individu (Univariat) setelah dikontrol Radius
summary.aov(model_mancova)
## Response Temperature :
## Df Sum Sq Mean Sq F value Pr(>F)
## Radius 1 8.9931e+07 89931390 1.4234 0.2341
## Star_Type 5 6.9979e+09 1399585081 22.1528 <2e-16 ***
## Residuals 233 1.4721e+10 63178593
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response Abs_Magnitude :
## Df Sum Sq Mean Sq F value Pr(>F)
## Radius 1 9824.5 9824.5 2854.63 < 2.2e-16 ***
## Star_Type 5 15886.8 3177.4 923.23 < 2.2e-16 ***
## Residuals 233 801.9 3.4
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil MANCOVA menunjukkan bahwa baik radius maupun tipe bintang berpengaruh sangat signifikan terhadap karakteristik fisik bintang secara simultan (p < 2.2e-16). Ini menunjukkan pentingnya mempertimbangkan ukuran radius dalam model klasifikasi bintang yang lebih kompleks.
Berdasarkan serangkaian pengujian statistik multivariat yang telah dilakukan pada dataset klasifikasi bintang, dapat ditarik beberapa kesimpulan utama sebagai berikut:
Kondisi Asumsi Data : Pengujian awal menunjukkan bahwa data bintang memiliki sebaran yang tidak berdistribusi normal secara multivariat dan memiliki varians/kovarians yang tidak homogen. Adanya pelanggaran pada asumsi homogenitas slope regresi juga ditemukan. Namun, hal ini sangat wajar terjadi pada data riil astronomi yang rentan terhadap observasi ekstrem (outlier alami seperti bintang maha-raksasa). Penggunaan statistik Pillai’s Trace terbukti menjadi solusi yang tangguh (robust) untuk tetap menguji hipotesis dengan presisi tinggi pada kondisi data tersebut.
Pengaruh Tipe Bintang (MANOVA) : Tipe bintang (Star_Type) terbukti memberikan pengaruh yang sangat signifikan terhadap karakteristik fisik bintang, yang dalam hal ini diwakili oleh kombinasi Suhu Mutlak dan Magnitudo Absolut (Kecerahan). Setiap tipe bintang memiliki profil suhu dan kecerahan yang secara statistik berbeda nyata satu sama lain.
Peran Radius secara Univariat (ANCOVA) : Ketika analisis difokuskan hanya pada satu variabel dependen, yaitu Magnitudo Absolut, hasil ANCOVA menunjukkan bahwa variabel tipe bintang tetap menjadi penentu utama kecerahan. Menariknya, variabel kontrol berupa ukuran bintang (Radius) secara univariat tidak memberikan pengaruh tambahan yang signifikan (p = 0.4362). Hal ini mengindikasikan bahwa jika kita hanya ingin memprediksi kecerahan mutlak, mengetahui tipe bintangnya saja sudah cukup representatif.
Peran Radius secara Multivariat (MANCOVA) : Situasi berubah drastis ketika Suhu Mutlak dan Magnitudo Absolut dianalisis secara bersamaan (multivariat). Hasil MANCOVA membuktikan bahwa ukuran Radius ternyata memegang peranan pengontrol yang sangat krusial dan signifikan (p < 2.2e-16) terhadap kombinasi kedua variabel fisik tersebut.
Secara keseluruhan, analisis ini menyimpulkan bahwa klasifikasi bintang adalah fenomena multivariat yang kompleks. Kita tidak bisa sepenuhnya memahami karakteristik termal dan luminositas sebuah bintang hanya dengan melihat tipenya saja, melainkan harus selalu mempertimbangkan faktor ukuran (radius) yang mengontrol pergerakan suhu dan kecerahan tersebut secara simultan di alam semesta.