library("ggplot2")
library("ggfortify")
## Warning: package 'ggfortify' was built under R version 4.4.2
library("gridExtra")
## Warning: package 'gridExtra' was built under R version 4.4.1
library("carData")
library("car")
library("factoextra")
## Warning: package 'factoextra' was built under R version 4.4.1
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library("corrplot")
## corrplot 0.92 loaded
library(readr)
decathlon_3 <- read_csv("C:/Users/LENOVO/Downloads/decathlon-3.csv")
## Rows: 41 Columns: 14
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): Athlets, Competition
## dbl (12): 100m, Long.jump, Shot.put, High.jump, 400m, 110m.hurdle, Discus, P...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(decathlon_3)
Untuk analisis lebih lanjut, saya akan membuat subset individu aktif (baris 1:40) dan variabel aktif (kolom 1:11) dari set data decathlon3, oleh karena itu saya akan membuat set data baru decathlon3.active untuk melakukan analisis komponen utama.
data(decathlon_3)
## Warning in data(decathlon_3): data set 'decathlon_3' not found
decathlon_3.active <- decathlon_3[1:40, 1:11]
head(decathlon_3.active)
## # A tibble: 6 × 11
## Athlets `100m` Long.jump Shot.put High.jump `400m` `110m.hurdle` Discus
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 SEBRLE 11.0 7.58 14.8 2.07 49.8 14.7 43.8
## 2 CLAY 10.8 7.4 14.3 1.86 49.4 14.0 50.7
## 3 KARPOV 11.0 7.3 14.8 2.04 48.4 14.1 49.0
## 4 BERNARD 11.0 7.23 14.2 1.92 48.9 15.0 40.9
## 5 YURKOV 11.3 7.09 15.2 2.1 50.4 15.3 46.3
## 6 WARNERS 11.1 7.6 14.3 1.98 48.7 14.2 41.1
## # ℹ 3 more variables: Pole.vault <dbl>, Javeline <dbl>, `1500m` <dbl>
summary(decathlon_3.active)
## Athlets 100m Long.jump Shot.put
## Length:40 Min. :10.44 Min. :6.610 Min. :12.68
## Class :character 1st Qu.:10.85 1st Qu.:7.060 1st Qu.:13.85
## Mode :character Median :10.97 Median :7.300 Median :14.53
## Mean :10.99 Mean :7.274 Mean :14.47
## 3rd Qu.:11.13 3rd Qu.:7.482 3rd Qu.:15.00
## Max. :11.64 Max. :7.960 Max. :16.36
## High.jump 400m 110m.hurdle Discus
## Min. :1.850 Min. :46.81 Min. :13.97 Min. :37.92
## 1st Qu.:1.917 1st Qu.:48.90 1st Qu.:14.20 1st Qu.:41.70
## Median :1.960 Median :49.38 Median :14.45 Median :44.41
## Mean :1.978 Mean :49.53 Mean :14.59 Mean :44.22
## 3rd Qu.:2.045 3rd Qu.:50.18 3rd Qu.:14.96 3rd Qu.:45.77
## Max. :2.150 Max. :51.67 Max. :15.67 Max. :51.65
## Pole.vault Javeline 1500m
## Min. :4.200 Min. :50.31 Min. :262.1
## 1st Qu.:4.575 1st Qu.:55.12 1st Qu.:270.7
## Median :4.800 Median :58.06 Median :278.0
## Mean :4.771 Mean :58.31 Mean :278.6
## 3rd Qu.:4.940 3rd Qu.:61.00 3rd Qu.:282.8
## Max. :5.400 Max. :70.52 Max. :317.0
Menunjukkan performa atlet yang bervariasi dalam berbagai cabang olahraga. Statistik deskriptif membantu memahami distribusi performa untuk setiap cabang, seperti waktu tercepat dan terlambat atau jarak lompatan terpendek dan terpanjang. Rentang antar kuartil (IQR = Q3 - Q1) memberikan wawasan tentang sebaran data, sementara median dan mean menunjukkan nilai tengah dan rata-rata performa atlet.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
##
## recode
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Periksa struktur data
str(decathlon_3.active)
## tibble [40 × 11] (S3: tbl_df/tbl/data.frame)
## $ Athlets : chr [1:40] "SEBRLE" "CLAY" "KARPOV" "BERNARD" ...
## $ 100m : num [1:40] 11 10.8 11 11 11.3 ...
## $ Long.jump : num [1:40] 7.58 7.4 7.3 7.23 7.09 7.6 7.3 7.31 6.81 7.56 ...
## $ Shot.put : num [1:40] 14.8 14.3 14.8 14.2 15.2 ...
## $ High.jump : num [1:40] 2.07 1.86 2.04 1.92 2.1 1.98 2.01 2.13 1.95 1.86 ...
## $ 400m : num [1:40] 49.8 49.4 48.4 48.9 50.4 ...
## $ 110m.hurdle: num [1:40] 14.7 14.1 14.1 15 15.3 ...
## $ Discus : num [1:40] 43.8 50.7 49 40.9 46.3 ...
## $ Pole.vault : num [1:40] 5.02 4.92 4.92 5.32 4.72 4.92 4.42 4.42 4.92 4.82 ...
## $ Javeline : num [1:40] 63.2 60.1 50.3 62.8 63.4 ...
## $ 1500m : num [1:40] 292 302 300 280 276 ...
# Pastikan hanya kolom numerik yang digunakan
decathlon_3.active <- decathlon_3.active %>%
mutate_if(is.factor, as.numeric) %>%
mutate_if(is.character, as.numeric) %>%
select(where(is.numeric))
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `Athlets = .Primitive("as.double")(Athlets)`.
## Caused by warning:
## ! NAs introduced by coercion
# Periksa hasil perubahan
str(decathlon_3.active)
## tibble [40 × 11] (S3: tbl_df/tbl/data.frame)
## $ Athlets : num [1:40] NA NA NA NA NA NA NA NA NA NA ...
## $ 100m : num [1:40] 11 10.8 11 11 11.3 ...
## $ Long.jump : num [1:40] 7.58 7.4 7.3 7.23 7.09 7.6 7.3 7.31 6.81 7.56 ...
## $ Shot.put : num [1:40] 14.8 14.3 14.8 14.2 15.2 ...
## $ High.jump : num [1:40] 2.07 1.86 2.04 1.92 2.1 1.98 2.01 2.13 1.95 1.86 ...
## $ 400m : num [1:40] 49.8 49.4 48.4 48.9 50.4 ...
## $ 110m.hurdle: num [1:40] 14.7 14.1 14.1 15 15.3 ...
## $ Discus : num [1:40] 43.8 50.7 49 40.9 46.3 ...
## $ Pole.vault : num [1:40] 5.02 4.92 4.92 5.32 4.72 4.92 4.42 4.42 4.92 4.82 ...
## $ Javeline : num [1:40] 63.2 60.1 50.3 62.8 63.4 ...
## $ 1500m : num [1:40] 292 302 300 280 276 ...
# menghapus kolom pertama
decathlon_3.active <- decathlon_3.active[, -1]
# menjalankan PCA
res.pca <- prcomp(decathlon_3.active, scale = TRUE)
print(res.pca)
## Standard deviations (1, .., p=10):
## [1] 1.8275374 1.2279496 1.2057137 1.0275844 0.8263005 0.7985897 0.6914141
## [8] 0.6492426 0.4797529 0.4385443
##
## Rotation (n x k) = (10 x 10):
## PC1 PC2 PC3 PC4 PC5
## 100m -0.41128012 0.04201309 -0.2405308 0.09772622 0.40974015
## Long.jump 0.38738359 -0.12053650 0.3098075 -0.18133606 0.06010917
## Shot.put 0.37261846 0.33447770 -0.3003039 -0.12309083 0.16810709
## High.jump 0.31623994 0.09560703 -0.3508037 0.18626323 0.51100047
## 400m -0.35701225 0.44504612 -0.1888084 0.04406545 -0.23199630
## 110m.hurdle -0.39579995 0.12785729 -0.2031302 -0.25437863 0.21591601
## Discus 0.36486642 0.28843592 -0.2009729 0.29438630 -0.01656842
## Pole.vault -0.01039982 0.35753803 0.4659386 -0.51797215 0.45696722
## Javeline 0.15639896 0.06332042 -0.4426223 -0.65773319 -0.40100118
## 1500m 0.01089779 0.65820824 0.3203196 0.23130031 -0.26226116
## PC6 PC7 PC8 PC9 PC10
## 100m -0.21316916 -0.3364339 0.49769682 -0.02226472 0.43239374
## Long.jump 0.35919423 -0.5854105 0.08870115 -0.45357529 0.13267964
## Shot.put -0.26595699 0.2835060 -0.30934955 -0.41030393 0.44780703
## High.jump 0.59402099 0.1380332 0.09768763 0.27220800 -0.12813563
## 400m 0.31561393 0.1275902 0.22777504 -0.56262045 -0.31424337
## 110m.hurdle 0.11173996 -0.4162170 -0.68331638 0.07433038 -0.12742110
## Discus -0.47014098 -0.4333342 0.07001755 0.03474396 -0.49135385
## Pole.vault -0.17367030 0.1760758 0.19465302 0.07625332 -0.27014258
## Javeline 0.05766052 -0.1182726 0.27277938 0.29420830 0.06261139
## 1500m 0.18795674 -0.1496408 -0.05644795 0.36834795 0.38101319
summary(res.pca)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 1.828 1.2279 1.2057 1.0276 0.82630 0.79859 0.69141
## Proportion of Variance 0.334 0.1508 0.1454 0.1056 0.06828 0.06377 0.04781
## Cumulative Proportion 0.334 0.4848 0.6301 0.7357 0.80402 0.86779 0.91560
## PC8 PC9 PC10
## Standard deviation 0.64924 0.47975 0.43854
## Proportion of Variance 0.04215 0.02302 0.01923
## Cumulative Proportion 0.95775 0.98077 1.00000
eig.val<-get_eigenvalue(res.pca)
eig.val
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 3.3398929 33.398929 33.39893
## Dim.2 1.5078603 15.078603 48.47753
## Dim.3 1.4537455 14.537455 63.01499
## Dim.4 1.0559297 10.559297 73.57428
## Dim.5 0.6827726 6.827726 80.40201
## Dim.6 0.6377455 6.377455 86.77947
## Dim.7 0.4780534 4.780534 91.56000
## Dim.8 0.4215160 4.215160 95.77516
## Dim.9 0.2301629 2.301629 98.07679
## Dim.10 0.1923211 1.923211 100.00000
fviz_eig(res.pca, col.var="blue")
Berdasarkan scree plot yang ditampilkan, dapat disimpulkan bahwa komponen utama pertama hingga ketiga menjelaskan sebagian besar varians dalam data, dengan komponen pertama menyumbang proporsi yang paling signifikan. Setelah komponen ketiga, kontribusi varians yang dijelaskan semakin kecil, menunjukkan bahwa komponen-komponen selanjutnya memiliki peran yang semakin tidak signifikan. Oleh karena itu, dapat dipilih 3 atau 4 komponen utama sebagai komponen yang signifikan, yang sudah cukup untuk menggambarkan sebagian besar informasi dalam data.
# Ambil komponen utama pertama dan kedua
pca_data <- as.data.frame(res.pca$x[, 1:2])
# Tambahkan label atau informasi jika ada
pca_data$Athletes <- rownames(pca_data)
# Buat scatter plot
ggplot(pca_data, aes(x = PC1, y = PC2)) +
geom_point() +
labs(title = "Scatter Plot of First and Second Principal Components",
x = "Principal Component 1", y = "Principal Component 2") +
theme_minimal()
Berdasarkan scatter plot antara komponen utama pertama dan kedua, terlihat bahwa data tidak membentuk kluster yang jelas atau pola pengelompokan tertentu. Titik-titik data tersebar relatif merata di seluruh bidang, tanpa adanya kelompok yang terpisah secara signifikan. Ini menunjukkan bahwa data tidak menunjukkan struktur kluster yang kuat ketika diproyeksikan pada dua komponen utama pertama. Oleh karena itu, data ini mungkin tidak memiliki pola kluster yang jelas berdasarkan dua dimensi tersebut, atau mungkin kluster tersebut hanya bisa terlihat dengan menggunakan lebih banyak komponen utama.
var <- get_pca_var(res.pca)
var
## Principal Component Analysis Results for variables
## ===================================================
## Name Description
## 1 "$coord" "Coordinates for the variables"
## 2 "$cor" "Correlations between variables and dimensions"
## 3 "$cos2" "Cos2 for the variables"
## 4 "$contrib" "contributions of the variables"
Cos2 disebut kosinus kuadrat (koordinat kuadrat) dan sesuai dengan kualitas representasi variabel. Cos2 variabel pada semua dimensi menggunakan paket corrplot ditampilkan di bawah, serta diagram batang variabel cos2 menggunakan fungsi fviz_cos2().
head(var$cos2)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## 100m 0.5649473 0.002661524 0.08410658 0.010084566 0.114628636
## Long.jump 0.5012045 0.021907776 0.13953152 0.034721891 0.002466934
## Shot.put 0.4637258 0.168692374 0.13110230 0.015998765 0.019295148
## High.jump 0.3340150 0.013782906 0.17890259 0.036634417 0.178286592
## 400m 0.4256952 0.298655943 0.05182400 0.002050366 0.036748381
## 110m.hurdle 0.5232196 0.024649727 0.05998429 0.068327615 0.031830669
## Dim.6 Dim.7 Dim.8 Dim.9 Dim.10
## 100m 0.028979851 0.054109811 0.104410404 0.0001140958 0.035957196
## Long.jump 0.082282242 0.163831530 0.003316443 0.0473515356 0.003385599
## Shot.put 0.045109732 0.038423856 0.040337876 0.0387477647 0.038566377
## High.jump 0.225035486 0.009108429 0.004022473 0.0170544244 0.003157671
## 400m 0.063527206 0.007782353 0.021868869 0.0728561681 0.018991501
## 110m.hurdle 0.007962775 0.082816332 0.196814780 0.0012716512 0.003122552
library("corrplot")
corrplot(var$cos2, is.corr=FALSE)
fviz_cos2(res.pca, choice = "var", axes = 1:2)
fviz_pca_var(res.pca,
col.var = "cos2", # Color by the quality of representation
gradient.cols = c("darkorchid4", "gold", "darkorange"),
repel = TRUE
)
Kualitas representasi variabel dapat digambar pada peta faktor, di mana nilai cos2 berbeda berdasarkan warna gradien. Variabel dengan nilai cos2 rendah akan diwarnai “darkorchid4”, nilai cos2 sedang - “emas”, nilai co2 tinggi - “darkorange”. Variabel yang berkorelasi positif dikelompokkan bersama, sedangkan variabel yang berkorelasi negatif diposisikan pada sisi berlawanan dari titik asal plot. Jarak antara variabel dan titik asal mengukur kualitas variabel pada peta faktor. Variabel yang jauh dari titik asal terwakili dengan baik pada peta faktor.
# Contributions of variables to PC1
a<-fviz_contrib(res.pca, choice = "var", axes = 1)
# Contributions of variables to PC2
b<-fviz_contrib(res.pca, choice = "var", axes = 2)
grid.arrange(a,b, ncol=2, top='Contribution of the variables to the first two PCs')
Garis putus-putus merah pada grafik di atas menunjukkan kontribusi rata-rata yang diharapkan. Untuk komponen tertentu, variabel dengan kontribusi yang melebihi tolok ukur ini dianggap penting dalam memberikan kontribusi pada komponen tersebut. Dapat dilihat bahwa variabel X100m, 110m.hurde, dan 1500m memberikan kontribusi paling besar pada kedua dimensi.
ind <- get_pca_ind(res.pca)
ind
## Principal Component Analysis Results for individuals
## ===================================================
## Name Description
## 1 "$coord" "Coordinates for the individuals"
## 2 "$cos2" "Cos2 for the individuals"
## 3 "$contrib" "contributions of the individuals"
fviz_pca_ind(res.pca,
col.ind = "cos2", # Color by the quality of representation
gradient.cols = c("darkorchid4", "gold", "darkorange"),
repel = TRUE
)
# Total contribution on PC1 and PC2
fviz_contrib(res.pca, choice = "ind", axes = 1:2)
Berdasarkan diagram “Contribution of Individuals to Dim-1-2”, dapat dilihat bahwa sebagian besar individu memiliki kontribusi yang relatif kecil terhadap dua komponen utama pertama (Dim-1-2). Hanya beberapa individu yang memiliki kontribusi besar, dengan nilai kontribusi terbesar lebih dari 10%. Seiring bergeraknya ke individu-individu berikutnya, kontribusinya semakin berkurang, dengan sebagian besar individu menunjukkan kontribusi di bawah 3% yang digambarkan oleh garis merah putus-putus. Ini menunjukkan bahwa sebagian besar data memberikan kontribusi kecil terhadap dua komponen utama pertama, sementara beberapa individu memberikan kontribusi yang lebih besar dalam pembentukan struktur dimensi tersebut. Hal ini juga mengindikasikan bahwa sebagian kecil individu mungkin lebih berpengaruh dalam membentuk varians yang dijelaskan oleh dua komponen utama pertama.
Ringkasan analisis PCA di atas untuk kedua variabel (disiplin olahraga) dan individu (atlet) ditampilkan dalam plot korelasi (plot otomatis) dari paket ggfortify wirg yang merujuk ke dimensi 1 dan 2.
autoplot(res.pca, loadings=TRUE, loadings.colour='darkorchid4', loadings.label=TRUE, loadings.label.size=3)
Tujuan dari proyek ini adalah untuk membedakan atlet mana yang memperoleh hasil terbaik di antara seluruh kelompok. Sejauh ini, Analisis Komponen Utama telah dilakukan untuk kedua variabel (disiplin olahraga) dan individu (atlet) dengan menggunakan perhitungan prcomp(), ekstraksi nilai eigen, kosinus kuadrat, dan kontribusi. Dengan mempertimbangkan PC yang dihitung, saya akan meringkasnya dalam kluster melalui metode pengelompokan k-means. Untuk tujuan tersebut, saya akan menggunakan fungsi eclust() dengan 4 kluster sebagai asumsi dan autoplot() untuk pengamatan 2D.
kmeans<-eclust(decathlon_3.active, k=4)
autoplot(res.pca, data=kmeans, colour="cluster")
Kelompok yang paling dekat dengan titik asal (biru) menunjukkan atlet dengan hasil terbaik dalam disiplin olahraga. Kelompok ungu menunjukkan atlet dengan hasil rata-rata, sedangkan kelompok yang tersisa (hijau dan merah) menunjukkan atlet terburuk.
# Ambil komponen utama pertama dan kedua
pca_data <- as.data.frame(res.pca$x[, 1:2])
# Tambahkan label atau informasi jika ada
pca_data$Athletes <- rownames(pca_data)
# Buat scatter plot
ggplot(pca_data, aes(x = PC1, y = PC2)) +
geom_point() +
labs(title = "Scatter Plot of First and Second Principal Components",
x = "Principal Component 1", y = "Principal Component 2") +
theme_minimal()
Berdasarkan scatter plot antara komponen utama pertama dan kedua,
terlihat bahwa data tidak membentuk kluster yang jelas atau pola
pengelompokan tertentu. Titik-titik data tersebar relatif merata di
seluruh bidang, tanpa adanya kelompok yang terpisah secara
signifikan.
c) dari hasil PCA yang diperoleh didapatkan bahwa variabel X100m,
110m.hurdle, dan 1500m memberikan kontribusi paling besar pada kedua
dimensi.
d) Komponen utama yang paling berkaitan dengan performa atlit adalah
komponen utama pertama dan komponen utama kedua. e) Urutan atlit yang
memiliki performa terbaik adalah 1,5,33,40,25,4,31,29,27,22,10,14,15,16
yaitu Sebrle, Bernard, Karpov, Pogorelov, Martineau, Burguignon, Sebrle,
Clay, Barras, Averyanov, Pogorelov, Smirnov, Drews, Korkizoglou.
Kelompok yang paling dekat dengan titik asal (biru) menunjukkan atlet
dengan hasil terbaik dalam disiplin olahraga.