Olimpiade Musim Panas 2024 telah usai. Olimpiade itu meninggalkan banyak cerita menarik. Salah satu yang banyak diperbincangkan adalah Kim Yeji dan Yusuf Dikeç. Atlet yang secara berturut-turut membela negara Turki dan Korea Selatan tersebut tidak hanya mengukir prestasi, tetapi juga meninggalkan bekas karena gaya dan penampilannya.
The Olympic #shootingsport stars we didn’t know we needed.
— The Olympic Games (@Olympics) 1 Agustus 2024
🇰🇷 Kim Yeji 🤝 Yusuf Dikeç 🇹🇷 pic.twitter.com/gfkyGjFg4I
Akan tetapi, kita tidak akan memperbincangkan kedua atlet itu. Di suasana peringatan kemerdekaan Republik Indonesia ini, kita akan melihat prestasi atlet-atlet Indonesia di Olimpiade Musim Panas. Pada Olimpiade Paris 2024, Indonesia berhasil menyabet dua medali emas dan satu perunggu. Dua medali emas tersebut disabet oleh Veddriq Leonardo (panjat tebing) dan Rizki Juniansyah (angkat besi) sedangkan medali perunggunya diraih oleh Gregoria Mariska Tunjung (bulu tangkis).
Bagaimana dengan pagelaran olimpiade-olimpiade sebelumnya? Kita akan menjawab pertanyaan ini dengan menggunakan data yang tersedia di laman Wikipedia.
Mempersiapkan Data
Kita akan melakukan analisis dan visualisasi data dengan pemrograman R. Pertama, kita panggil paket-paket yang diperlukan. Kita gunakan {rvest} untuk mengimpor data dari sebuah laman web, {tidyverse} untuk menganalisis dan memvisualisasikan data, dan {ggstream} untuk membuat diagram alir.
Mengimpor Data
Sekarang kita mengimpor datanya. Data tersebut berasal dari laman Wikipedia. Data yang kita impor adalah data jumlah medali berdasarkan olimpiade dan cabang olahraganya. Untuk melakukannya, kita menggunakan baris kode seperti berikut.
html <- read_html("https://id.wikipedia.org/w/index.php?title=Indonesia_pada_Olimpiade&oldid=26147360")
daftar_tabel <- html |>
html_elements(".wikitable") |>
html_table()
print(daftar_tabel)
[[1]]
# A tibble: 50 × 5
Medali Nama Olimpiade Olahraga Nomor
<chr> <chr> <chr> <chr> <chr>
1 01 Emas Hartono, RudyRudy Hartono Munich 1… Bulu ta… Tung…
2 01 Emas Chandra, AdeAde Chandra dan Christian … Munich 1… Bulu ta… Tung…
3 02 Perak Dewi, UtamiUtami Dewi Munich 1… Bulu ta… Tung…
4 03 Perunggu Hadinata, ChristianChristian Hadinata … Munich 1… Bulu ta… Gand…
5 02 Perak Sugiarto, IcukIcuk Sugiarto Seoul 19… Bulu ta… Tung…
6 02 Perak Handayani, LiliesLilies Handayani, Nur… Seoul 19… Panahan Tim …
7 02 Perak Dirc Talumewo Barcelon… Taekwon… Putr…
8 02 Perak Rahmi Kurnia Barcelon… Taekwon… Putr…
9 02 Perak Susilawati Barcelon… Taekwon… Putr…
10 03 Perunggu Jefi Tri Aji Barcelon… Taekwon… Putr…
# ℹ 40 more rows
[[2]]
# A tibble: 22 × 9
Olimpiade `Jumlah atlet` `Pembawa bendera` Jumlah cabangolahrag…¹ `01 Emas`
<chr> <chr> <chr> <chr> <chr>
1 Helsinki … 3 "" 3 0
2 Melbourne… 22 "" 6 0
3 Roma 1960 22 "" 8 0
4 Tokyo 1964 Tidak ikut "Tidak ikut" Tidak ikut Tidak ikut
5 Mexico Ci… 6 "" 2 0
6 München 1… 6 "Wiem Gommies" 5 0
7 Montreal … 7 "Donald Pandiang… 5 0
8 Moskwa 19… Tidak ikut "Tidak ikut" Tidak ikut Tidak ikut
9 Los Angel… 16 "Luki Niode" 6 0
10 Seoul 1988 29 "Tonny Maringgi" 11 0
# ℹ 12 more rows
# ℹ abbreviated name: ¹`Jumlah cabangolahraga yang diikuti`
# ℹ 4 more variables: `02 Perak` <chr>, `03 Perunggu` <chr>, Total <chr>,
# Peringkat <chr>
[[3]]
# A tibble: 5 × 5
Cabang Emas Perak Perunggu Total
<chr> <int> <int> <int> <int>
1 Bulu tangkis (detail) 8 6 8 22
2 Angkat besi (detail) 1 7 8 16
3 Panjat tebing (detail) 1 0 0 1
4 Panahan (detail) 0 1 0 1
5 Total (4 cabang) 10 14 16 40
Apa yang dilakukan baris kode di atas? Pertama, kita membaca html pada laman Wikipedia tersebut dan menyimpannya sebagai sebuah objek dengan nama html
. Setelah itu, objek html
tersebut kita cari elemennya yang bernama .wikitable
.1 Setelah elemen tersebut ditemukan, kita baca elemen tersebut sebagai tabel dengan fungsi html_table()
. Hasil dari proses ini kemudian kita namai sebagai daftar_tabel
. Untuk melihat apa isi daftar_tabel
tersebut, kita dapat menggunakan fungsi print()
.
Setelah kita lihat dengan print()
, ternyata daftar_tabel
merupakan sebuah daftar (list). Data yang kita inginkan, yaitu data jumlah medali berdasarkan olimpiade dan cabang olahraganya, merupakan elemen kedua dan ketiga dari daftar_tabel
. Untuk itu, kita dapat mengekstrak kedua data tersebut dengan daftar_tabel[[1]]
dan daftar_tabel[[2]]
. Kita namai hasilnya dengan data_dsr_olimpiade
dan data_dsr_cabang
.
Merapikan Data
Saat ini kita telah memiliki dua data, yaitu data_dsr_olimpiade
(data jumlah medali berdasarkan penyelenggaraan olimpiade) dan data_dsr_cabang
(data jumlah medali berdasarkan cabang olahraga). Kita rapikan kedua data tersebut. Untuk merapikan data_dsr_olimpiade
, kita lihat isi data tersebut dengan fungsi print()
.
# A tibble: 22 × 9
Olimpiade `Jumlah atlet` `Pembawa bendera` Jumlah cabangolahrag…¹ `01 Emas`
<chr> <chr> <chr> <chr> <chr>
1 Helsinki … 3 "" 3 0
2 Melbourne… 22 "" 6 0
3 Roma 1960 22 "" 8 0
4 Tokyo 1964 Tidak ikut "Tidak ikut" Tidak ikut Tidak ikut
5 Mexico Ci… 6 "" 2 0
6 München 1… 6 "Wiem Gommies" 5 0
7 Montreal … 7 "Donald Pandiang… 5 0
8 Moskwa 19… Tidak ikut "Tidak ikut" Tidak ikut Tidak ikut
9 Los Angel… 16 "Luki Niode" 6 0
10 Seoul 1988 29 "Tonny Maringgi" 11 0
# ℹ 12 more rows
# ℹ abbreviated name: ¹`Jumlah cabangolahraga yang diikuti`
# ℹ 4 more variables: `02 Perak` <chr>, `03 Perunggu` <chr>, Total <chr>,
# Peringkat <chr>
Data tersebut memiliki 22 baris dan 9 variabel/kolom. Kita dapat melihat beberapa baris terakhirnya dengan fungsi tail()
.
# A tibble: 6 × 9
Olimpiade `Jumlah atlet` `Pembawa bendera` Jumlah cabangolahrag…¹ `01 Emas`
<chr> <chr> <chr> <chr> <chr>
1 Rio de Jan… 28 "Maria Natalia L… "7" "1"
2 Tokyo 2020 28 "Rio Waida" "8" "1"
3 Paris 2024 29 "Maryam March Ma… "12" "2"
4 Los Angele… Pertandingan … "" "" ""
5 Brisbane 2… Pertandingan … "" "" ""
6 Total Total "Total" "Total" "9"
# ℹ abbreviated name: ¹`Jumlah cabangolahraga yang diikuti`
# ℹ 4 more variables: `02 Perak` <chr>, `03 Perunggu` <chr>, Total <chr>,
# Peringkat <chr>
Ternyata, data_dsr_olimpiade
tersebut juga memuat dua olimpiade yang belum terlaksana dan satu baris total. Kita hilangkan ketiga baris tersebut dengan menggunakan slice_head()
. Dengan demikian, kita hanya menggunakan 22 - 3 = 19 barisnya saja.
Untuk mengeceknya lagi, kita dapat menggunakan tail()
lagi.
# A tibble: 6 × 9
Olimpiade `Jumlah atlet` `Pembawa bendera` Jumlah cabangolahrag…¹ `01 Emas`
<chr> <chr> <chr> <chr> <chr>
1 Athena 2004 38 Christian Hadina… 14 1
2 Beijing 20… 24 Oka Sulaksana 7 1
3 London 2012 22 I Gede Siman Sud… 8 0
4 Rio de Jan… 28 Maria Natalia Lo… 7 1
5 Tokyo 2020 28 Rio Waida 8 1
6 Paris 2024 29 Maryam March Mah… 12 2
# ℹ abbreviated name: ¹`Jumlah cabangolahraga yang diikuti`
# ℹ 4 more variables: `02 Perak` <chr>, `03 Perunggu` <chr>, Total <chr>,
# Peringkat <chr>
Kita telah mengkonfirmasi bahwa data_dsr_olimpiade
sudah berisi baris-baris yang kita butuhkan saja. Selanjutnya, kita lihat gambaran umum data tersebut dengan fungsi glimpse()
.
Rows: 19
Columns: 9
$ Olimpiade <chr> "Helsinki 1952", "Melbourne 1956"…
$ `Jumlah atlet` <chr> "3", "22", "22", "Tidak ikut", "6…
$ `Pembawa bendera` <chr> "", "", "", "Tidak ikut", "", "Wi…
$ `Jumlah cabangolahraga yang diikuti` <chr> "3", "6", "8", "Tidak ikut", "2",…
$ `01 Emas` <chr> "0", "0", "0", "Tidak ikut", "0",…
$ `02 Perak` <chr> "0", "0", "0", "Tidak ikut", "0",…
$ `03 Perunggu` <chr> "0", "0", "0", "Tidak ikut", "0",…
$ Total <chr> "0", "0", "0", "Tidak ikut", "0",…
$ Peringkat <chr> "", "", "", "Tidak ikut", "", "",…
Setelah melihat hasilnya, kita gunakan lima variabel dari data_dsr_olimpiade
saja, yaitu Olimpiade
, 01 Emas
, 02 Perak
, 03 Perunggu
, dan Peringkat
. Setelah itu kita buat data tersebut menjadi data yang memanjang dengan pivot_longer()
dan kita rapikan isinya. Untuk memudahkan analisis data selanjutnya, kita tambahkan variabel tahun
. Variabel ini kita ekstrak dari variabel Olimpiade
karena nilai-nilai variabel tersebut memuat tahun, misalnya “Helsinki 1952” dan “Melbourne 1956”.
data_dsr_olimpiade <- data_dsr_olimpiade |>
select(Olimpiade, `01 Emas`, `02 Perak`, `03 Perunggu`, Peringkat) |>
pivot_longer(
cols = contains("0"),
names_to = "medali",
values_to = "banyak"
) |>
rename(
olimpiade = Olimpiade,
peringkat = Peringkat
) |>
mutate(
tahun = as.integer(str_extract(olimpiade, "\\d{4}")),
peringkat = ifelse(
peringkat == "" | peringkat == "Tidak ikut",
NA, as.integer(peringkat)
),
medali = substr(medali, 5, nchar(medali)),
banyak = ifelse(
banyak == "Tidak ikut",
NA, as.integer(banyak)
)
) |>
select(
tahun, olimpiade, medali, banyak, peringkat
)
print(data_dsr_olimpiade)
# A tibble: 57 × 5
tahun olimpiade medali banyak peringkat
<int> <chr> <chr> <int> <int>
1 1952 Helsinki 1952 Emas 0 NA
2 1952 Helsinki 1952 Perak 0 NA
3 1952 Helsinki 1952 Perunggu 0 NA
4 1956 Melbourne 1956 Emas 0 NA
5 1956 Melbourne 1956 Perak 0 NA
6 1956 Melbourne 1956 Perunggu 0 NA
7 1960 Roma 1960 Emas 0 NA
8 1960 Roma 1960 Perak 0 NA
9 1960 Roma 1960 Perunggu 0 NA
10 1964 Tokyo 1964 Emas NA NA
# ℹ 47 more rows
data_dsr_olimpiade
telah siap tersaji. Sekarang saatnya kita beralih ke data_dsr_cabang
. Sebelum merapikan data ini, kita lihat datanya terlebih dahulu.
# A tibble: 5 × 5
Cabang Emas Perak Perunggu Total
<chr> <int> <int> <int> <int>
1 Bulu tangkis (detail) 8 6 8 22
2 Angkat besi (detail) 1 7 8 16
3 Panjat tebing (detail) 1 0 0 1
4 Panahan (detail) 0 1 0 1
5 Total (4 cabang) 10 14 16 40
Untuk merapikan data tersebut, kita dapat melakukan beberapa hal. Pertama, kita hapus baris dan kolom terakhirnya (baris dan kolom total). Kedua, kita rapikan isi dari variabel Cabang
. Ketiga, kita buat data tersebut menjadi data yang memanjang. Terakhir, kita konsistenkan nama variabelnya.
data_dsr_cabang <- data_dsr_cabang |>
select(-Total) |>
filter(Cabang != "Total (4 cabang)") |>
mutate(
Cabang = str_trim(str_remove(Cabang, " \\(detail\\)"))
) |>
pivot_longer(
cols = -Cabang,
names_to = "medali",
values_to = "banyak"
) |>
rename(cabang = Cabang)
print(data_dsr_cabang)
# A tibble: 12 × 3
cabang medali banyak
<chr> <chr> <int>
1 Bulu tangkis Emas 8
2 Bulu tangkis Perak 6
3 Bulu tangkis Perunggu 8
4 Angkat besi Emas 1
5 Angkat besi Perak 7
6 Angkat besi Perunggu 8
7 Panjat tebing Emas 1
8 Panjat tebing Perak 0
9 Panjat tebing Perunggu 0
10 Panahan Emas 0
11 Panahan Perak 1
12 Panahan Perunggu 0
data_dsr_cabang
sekarang sudah rapi. Saatnya kita lanjut ke tahapan berikutnya—visualisasi data.
Visualisasi Data
Pada Bagian 1 kita telah mengimpor dan merapikan data tentang banyaknya medali yang diperoleh Indonesia berdasarkan perhelatan olimpiade dan cabang-cabang olahraganya. Selanjutnya, kita akan memvisualisasikan kedua data tersebut.
Medali dan Perhelatan Olimpiade
Bagaimana perolehan medali Indonesia di setiap keikutsertaannya di olimpiade? Untuk menjawab pertanyaan ini, kita dapat membuat diagram batang dengan menggunakan data_dsr_olimpiade
. Perhatikan Gambar 1!
data_dsr_olimpiade |>
ggplot(aes(x = tahun, y = banyak, fill = medali)) +
geom_col(position = "dodge") +
scale_x_continuous(
breaks = seq(1952, 2024, 4)
) +
scale_y_continuous(
limits = c(0, 4.2),
expand = c(0, 0)
) +
scale_fill_manual(
name = "Medali",
values = c(
"Emas" = "#FCC861",
"Perak" = "#E5E5E5",
"Perunggu" = "#DCB386"
)
) +
theme_minimal() +
theme(
legend.position = "bottom",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.line.x = element_line(),
axis.ticks.x = element_line(),
axis.text.x = element_text(
angle = 90,
vjust = .5
),
axis.title.x = element_blank()
) +
labs(
y = "Banyak perolehan medali"
)
Berdasarkan Gambar 1 tersebut, Indonesia pertama kali meraih medali pada tahun 1988 meskipun telah ikut olimpiade sejak 1952. Selain itu, Indonesia dapat meraih medali emas sebanyak dua kali untuk pertama kalinya pada tahun 1992. Capaian ini diulang kembali pada olimpiade terakhir, yaitu pada tahun 2024.
Bagaimana kalau kita ingin melihat tren perolehan medali emas, perak, dan perunggu setiap penyelenggaraan olimpiadenya? Perhatikan Gambar 2!
data_dsr_olimpiade |>
ggplot(aes(x = tahun, y = banyak, col = medali)) +
geom_line(
linewidth = 1
) +
scale_y_continuous(
limits = c(0, 4.2),
expand = c(0, 0)
) +
scale_color_manual(
name = "Medali",
values = c(
"Emas" = "#FCC861",
"Perak" = "#E5E5E5",
"Perunggu" = "#DCB386"
)
) +
facet_grid(~medali) +
theme_minimal() +
theme(
legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank()
) +
labs(
x = "Tahun",
y = "Banyak perolehan medali"
)
Kita dapat menggabungkan fokus informasi yang disampaikan diagram batang pada Gambar 1 dan diagram garis pada Gambar 2 dengan menggunakan diagram alir.
data_dsr_olimpiade |>
ggplot(aes(x = tahun, y = banyak, fill = medali)) +
geom_vline(
aes(xintercept = tahun),
color = "grey",
linewidth = .25
) +
geom_stream() +
geom_stream_label(aes(label = medali)) +
geom_text(
aes(label = olimpiade),
y = -4.9,
angle = 90,
hjust = 0,
nudge_x = -1.2,
color = "grey"
) +
scale_fill_manual(
name = "Medali",
values = c(
"Emas" = "#FCC861",
"Perak" = "#E5E5E5",
"Perunggu" = "#DCB386"
)
) +
scale_x_continuous(
limits = c(1948, 2026),
expand = c(0, 0)
) +
scale_y_continuous(
limits = c(-5, 3),
expand = c(0, 0)
) +
theme_void() +
theme(
legend.position = "none"
)
Kita telah memvisualisasikan perolehan medali Indonesia di olimpiade. Selanjutnya kita akan memvisualisasikan distribusi medali untuk cabang-cabang olahraganya.
Medali dan Cabang Olahraga
Cabang olahraga apa saja yang menyumbangkan medali bagi Indonesia? Bagaimana distribusinya? Untuk menjawab pertanyaan-pertanyaan ini, kita dapat menggambarkan distribusinya dengan diagram batang.
data_dsr_cabang |>
mutate(
cabang = fct_relevel(
cabang,
"Bulu tangkis", "Angkat besi", "Panjat tebing", "Panahan"
)
) |>
ggplot(aes(x = cabang, y = banyak)) +
geom_col(aes(fill = medali)) +
scale_y_continuous(
expand = c(0, 0)
) +
scale_fill_manual(
name = "Medali",
values = c(
"Emas" = "#FCC861",
"Perak" = "#E5E5E5",
"Perunggu" = "#DCB386"
)
) +
theme_minimal() +
theme(
legend.position = "bottom",
axis.line.x = element_line(),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank()
) +
labs(
x = "Cabang olahraga",
y = "Banyak perolehan medali"
)
Berdasarkan Gambar 4, kita dapat melihat bahwa ada empat cabang olahraga yang berkontribusi bagi perolehan medali Indonesia. Keempat cabang olahraga tersebut jika diurutkan berdasarkan perolehan medalinya adalah bulu tangkis, angkat besi, panjat tebing, dan panahan.
Catatan Akhir
Di suasana riuh rendah peringatan HUT ke-79 kemerdekaan Republik Indonesia dan Olimpiade Paris 2024 ini, bersama-sama kita telah melihat prestasi Indonesia di perhelatan olimpiade mulai tahun 1952 sampai 2024. Untuk melihatnya, kita awali dengan mempersiapkan data pada Bagian 1. Di tahapan ini, kita melakukan impor data dari Wikipedia pada Bagian 1.1 dan merapikan datanya pada Bagian 1.2.
Setelah data rapi, kita melakukan visualisasi data pada Bagian 2. Terdapat dua macam informasi yang kita visualisasikan. Pertama adalah banyak medali di setiap pagelaran olimpiade yang Indonesia ikuti (Bagian 2.1). Kedua adalah distribusi medali berdasarkan cabang olahraganya (Bagian 2.2).
Catatan Kaki
Bagaimana cara menemukan nama elemen dari objek yang ingin kita impor? Salah satunya adalah dengan membaca kode sumber laman webnya. Selain itu, jika kita menggunakan Google Chrome, kita juga dapat memanfaatkan Developer tools-nya.↩︎