Materi ini akan membahas pengenalan meta-package
tidyverse yang merupakan kumpulan dari 8 package inti,
yaitu
readr digunakan untuk membaca data tabular seperti
csv,tsv dan fwfdplyr digunakan untuk memanipulasi dataggplot2 digunakan untuk visualisasi data berbasiskan
Grammar of Graphicstidyr digunakan untuk merapihkan (tidying) datapurrr digunakan untuk functional programmingtibble digunakan sebagai alternatif
data.frame yang lebih konsistenforcats digunakan untuk memanipulasi data berupa yang
bertipe factorstringr digunakan untuk memanipulasi data bertipe
stringLibrary (atau package) dalam R adalah kumpulan fungsi, data, dan dokumentasi yang memperluas kemampuan dasar R. Library memungkinkan pengguna untuk menambahkan fungsi-fungsi spesifik tanpa harus menulis kode dari awal.
Pada penggunaan pertama, silahkan install terlebih dulu package yang akan digunakan dengan cara menuliskan code berikut:
Kaggle
Kaggle adalah platform komunitas data science yang sangat populer di kalangan praktisi ML dan analisis data. Platform ini tidak hanya menyediakan ribuan dataset publik yang mencakup berbagai domain mulai dari kesehatan, finansial, hingga data sosial, tetapi juga menyelenggarakan kompetisi data science berhadiah yang menarik para ahli dari seluruh dunia. Yang membedakan Kaggle adalah ekosistemnya yang lengkap - setiap dataset biasanya dilengkapi dengan notebook contoh (kernel), diskusi komunitas, dan voting system untuk menilai kualitas dataset. Untuk pengguna R, Kaggle menyediakan akses mudah melalui API resmi atau download manual file CSV/JSON yang kemudian dapat di-load ke dalam environment R.
UCI Machine Learning Repository
UCI Machine Learning Repository merupakan gudang dataset historis yang menjadi standar emas dalam penelitian akademis dan pengembangan algoritma machine learning. Dikelola oleh University of California, Irvine, repository ini menyediakan dataset-dataset yang sudah terkurasi dengan dokumentasi lengkap dan sering digunakan sebagai benchmark untuk paper penelitian. Dataset-dataset seperti Iris, Wine, dan Adult Census Income telah menjadi semacam “hello world” dalam komunitas ML. Untuk analis R, dataset dari UCI biasanya tersedia dalam format text file yang bersih dan mudah diimpor menggunakan fungsi dasar seperti read.csv() atau read.table().
Google Dataset Search
Google Dataset Search berfungsi sebagai mesin pencari meta yang mengindeks dataset dari berbagai sumber di seluruh web. Platform ini tidak menyimpan dataset secara langsung, melainkan mengumpulkan metadata dari publisher data seperti pemerintah, lembaga penelitian, dan organisasi lainnya. Keunggulan utamanya adalah kemampuannya untuk melakukan pencarian semantik across multiple sources dan menyediakan informasi tentang lisensi, tanggal update, serta format data. Bagi pengguna R, ini sangat membantu untuk menemukan dataset spesifik yang mungkin tersembunyi di berbagai website, kemudian mengimpornya melalui URL langsung atau download manual.
Government Open Data Portals
Portal data pemerintah seperti Data.go.id (Indonesia), data.gov (AS), dan data.gov.uk (UK) menyediakan data resmi yang dikumpulkan oleh instansi pemerintah. Data-data ini mencakup statistik demografi, indikator ekonomi, data geospasial, dan informasi publik lainnya yang dikumpulkan menggunakan anggaran negara. Keuntungan utama data pemerintah adalah otoritas sumbernya yang terpercaya, periodisitas yang teratur (bulanan/tahunan), dan cakupan nasional yang komprehensif. Untuk analis R, data ini biasanya tersedia dalam format CSV atau melalui API yang dapat diakses langsung menggunakan packages seperti httr atau jsonlite.
API-Based Platforms
Platform berbasis API seperti Yahoo Finance, Alpha Vantage, dan Twitter API menyediakan akses real-time atau near-real-time ke data dinamis. Platform finansial menawarkan data pasar saham, nilai tukar, dan indikator ekonomi dengan latensi rendah, sementara platform media sosial menyediakan akses ke data interaksi sosial terkini. Keunikan platform ini adalah sifat datanya yang selalu diperbarui dan kemampuan untuk mengambil data historis mendalam. Di R, developer telah membuat packages khusus seperti quantmod untuk data finansial dan rtweet untuk data Twitter yang menyederhanakan proses autentikasi dan query API.
Specialized Domain Platforms
Platform khusus domain seperti NOAA untuk klimatologi, NIH untuk kesehatan, dan NASA untuk data antariksa menyediakan dataset yang sangat spesifik dan teknis. Data dari platform ini biasanya dikumpulkan menggunakan instrumentasi khusus, melalui penelitian bertahun-tahun, atau dengan metodologi yang kompleks. Nilai utamanya terletak pada kedalaman dan akurasi data yang sulit ditemukan di platform umum. Untuk bekerja dengan data ini di R, seringkali diperlukan packages tambahan yang khusus dibuat untuk menangani format data niche seperti NetCDF untuk data iklim atau DICOM untuk data medis.
R Built-in Datasets dan Packages Data
R sendiri datang dengan puluhan dataset built-in yang siap digunakan untuk tujuan pembelajaran dan prototyping. Dataset seperti mtcars, iris, dan airquality telah menjadi bahan latihan bagi generasi analis data. Selain itu, ecosystem R memiliki packages yang khusus berisi dataset seperti nycflights13 (data penerbangan), gapminder (data perkembangan negara), dan palmerpenguins (data penguin). Kelebihan dataset ini adalah kesiapan pakainya - sudah dalam format yang bersih, terdokumentasi dengan baik, dan terintegrasi sempurna dengan tidyverse ecosystem, membuatnya ideal untuk demonstrasi teknik analisis dan visualisasi.
Dataset komprehensif ini menyediakan informasi mendalam tentang berbagai negara di seluruh dunia, yang mencakup beragam indikator sosio-ekonomi, demografis, dan geografis. Data ini meliputi statistik kependudukan, indikator ekonomi makro, faktor lingkungan, metrik kesehatan masyarakat, statistik pendidikan, serta struktur perekonomian nasional. Dengan cakupan 227 negara dari berbagai belahan dunia, dataset ini menawarkan perspektif global yang holistik tentang karakteristik masing-masing negara, memungkinkan analisis komparatif dan studi lintas sektor yang mendalam.
Country: Nama resmi negara
Region: Kelompok wilayah geografis negara
Population: Total jumlah penduduk negara
Area (sq. mi.): Luas wilayah dalam mil persegi
Pop. Density (per sq. mi.): Kepadatan penduduk per mil persegi
Coastline (coast/area ratio): Rasio panjang garis pantai terhadap luas wilayah
Net migration: Migrasi bersih per 1000 penduduk
Infant mortality (per 1000 births): Angka kematian bayi per 1000 kelahiran
GDP ($ per capita): Pendapatan per kapita dalam dollar AS
Literacy (%): Persentase penduduk melek huruf
Phones (per 1000): Jumlah telepon per 1000 penduduk
Arable (%): Persentase lahan cocok untuk pertanian
Crops (%): Persentase lahan untuk tanaman permanen
Other (%): Persentase lahan untuk penggunaan non-pertanian
Climate: Kode klasifikasi iklim (1-4)
Birthrate: Angka kelahiran per 1000 penduduk
Deathrate: Angka kematian per 1000 penduduk
Agriculture: Kontribusi sektor pertanian terhadap GDP (proporsi)
Industry: Kontribusi sektor industri terhadap GDP (proporsi)
Service: Kontribusi sektor jasa terhadap GDP (proporsi)
Data dapat diperoleh dengan mendownload link dibawah ini
Berikut materi lengkap untuk 20 fungsi tidyverse dengan contoh menggunakan dataset “Countries of the World”:
Fungsi: Menampilkan preview dataset dengan informasi struktur data, tipe variabel, dan beberapa nilai contoh. Sangat useful untuk eksplorasi data awal yang lebih readable dibanding str().
## Rows: 227
## Columns: 20
## $ Country <chr> "Afghanistan", "Albania", "Algeri…
## $ Region <chr> "ASIA (EX. NEAR EAST)", "EASTERN …
## $ Population <dbl> 31056997, 3581655, 32930091, 5779…
## $ `Area (sq. mi.)` <dbl> 647500, 28748, 2381740, 199, 468,…
## $ `Pop. Density (per sq. mi.)` <chr> "48,0", "124,6", "13,8", "290,4",…
## $ `Coastline (coast/area ratio)` <chr> "0,00", "1,26", "0,04", "58,29", …
## $ `Net migration` <chr> "23,06", "-4,93", "-0,39", "-20,7…
## $ `Infant mortality (per 1000 births)` <dbl> 16307, 2152, 31, 927, 405, 19119,…
## $ `GDP ($ per capita)` <dbl> 700, 4500, 6000, 8000, 19000, 190…
## $ `Literacy (%)` <dbl> 360, 865, 700, 970, 1000, 420, 95…
## $ `Phones (per 1000)` <chr> "3,2", "71,2", "78,1", "259,5", "…
## $ `Arable (%)` <chr> "12,13", "21,09", "3,22", "10", "…
## $ `Crops (%)` <chr> "0,22", "4,42", "0,25", "15", "0"…
## $ `Other (%)` <dbl> 8765, 7449, 9653, 75, 9778, 9735,…
## $ Climate <dbl> 1, 3, 1, 2, 3, NA, 2, 2, 3, 4, 2,…
## $ Birthrate <dbl> 466, 1511, 1714, 2246, 871, 4511,…
## $ Deathrate <dbl> 2034, 522, 461, 327, 625, 242, 53…
## $ Agriculture <chr> "0,38", "0,232", "0,101", NA, NA,…
## $ Industry <chr> "0,24", "0,188", "0,6", NA, NA, "…
## $ Service <chr> "0,38", "0,579", "0,298", NA, NA,…
Fungsi: Memilih kolom tertentu dari dataset berdasarkan nama atau kriteria tertentu. Dapat juga digunakan untuk merename kolom dan mengubah urutan kolom.
# Memilih kolom tertentu
countries_selected <- countries %>%
select(Country, Population, `GDP ($ per capita)`, Region)
countries_selected# Memilih kolom dengan pattern
countries_econ <- countries %>%
select(Country, contains("GDP"), contains("rate"))
countries_econFungsi: Operator pipe yang mentransform output dari fungsi sebelah kiri menjadi input pertama untuk fungsi sebelah kanan. Membuat kode lebih readable dan sequential.
# Tanpa pipe (nested function)
result1 <- arrange(filter(countries, Population > 100000000), desc(`GDP ($ per capita)`))
# Dengan pipe (lebih mudah dibaca)
result2 <- countries %>%
filter(Population > 100000000) %>%
arrange(desc(`GDP ($ per capita)`))
result1 Fungsi: Menyaring baris data berdasarkan kondisi logika tertentu. Dapat menggunakan multiple conditions dengan operator &, |, !.
# Filter negara dengan GDP tinggi dan populasi besar
rich_countries <- countries %>%
filter(`GDP ($ per capita)` > 30000 & Population > 10000000)
rich_countries# Filter negara dari region tertentu
asian_countries <- countries %>%
filter(str_detect(Region, "ASIA"))
asian_countriesFungsi: Mengurutkan baris data berdasarkan satu atau lebih kolom. Default ascending, gunakan desc() untuk descending.
# Urutkan berdasarkan GDP tertinggi
countries_rich_first <- countries %>%
arrange(desc(`GDP ($ per capita)`))
countries_rich_first# Urutkan berdasarkan region lalu GDP
countries_sorted <- countries %>%
arrange(Region, desc(`GDP ($ per capita)`))
countries_sortedFungsi: Membuat kolom baru atau memodifikasi kolom existing. Dapat menggunakan operasi aritmatika, fungsi, atau conditional logic.
{r} # Membuat kolom baru} countries_modified <- countries %>% mutate( GDP_total = Population * `GDP ($ per capita)`, development_level = ifelse(`GDP ($ per capita)` > 20000, "Developed", "Developing") ) countries_modified
Fungsi: Membuat summary statistics untuk satu atau lebih kolom. Biasanya dipakai dengan group_by().
# Summary statistics untuk seluruh dataset
summary_stats <- countries %>%
summarise(
avg_gdp = mean(`GDP ($ per capita)`, na.rm = TRUE),
max_pop = max(Population, na.rm = TRUE),
total_countries = n()
)
summary_statseconomic_summary <- countries %>%
summarise(
total_population_world = sum(Population, na.rm = TRUE),
avg_gdp_per_capita = mean(`GDP ($ per capita)`, na.rm = TRUE),
median_gdp_per_capita = median(`GDP ($ per capita)`, na.rm = TRUE),
sd_gdp = sd(`GDP ($ per capita)`, na.rm = TRUE),
min_gdp = min(`GDP ($ per capita)`, na.rm = TRUE),
max_gdp = max(`GDP ($ per capita)`, na.rm = TRUE),
total_countries = n(),
countries_with_high_gdp = sum(`GDP ($ per capita)` > 20000, na.rm = TRUE),
percentage_high_gdp = round(mean(`GDP ($ per capita)` > 20000, na.rm = TRUE) * 100, 1),
avg_literacy = mean(`Literacy (%)`, na.rm = TRUE),
avg_infant_mortality = mean(`Infant mortality (per 1000 births)`, na.rm = TRUE) )
economic_summary %>% print()## # A tibble: 1 × 11
## total_population_world avg_gdp_per_capita median_gdp_per_capita sd_gdp min_gdp
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6524044551 9690. 5550 10049. 500
## # ℹ 6 more variables: max_gdp <dbl>, total_countries <int>,
## # countries_with_high_gdp <int>, percentage_high_gdp <dbl>,
## # avg_literacy <dbl>, avg_infant_mortality <dbl>
countries_clean <- countries %>%
mutate(
`Phones (per 1000)` = as.numeric(str_replace(`Phones (per 1000)`, ",", ".")),
`GDP ($ per capita)` = as.numeric(str_replace(`GDP ($ per capita)`, ",", ".")),
`Literacy (%)` = as.numeric(str_replace(`Literacy (%)`, ",", ".")),
`Infant mortality (per 1000 births)` = as.numeric(str_replace(`Infant mortality (per 1000 births)`, ",", "."))
)
# Analisis dengan data yang sudah dibersihkan
regional_analysis_clean <- countries_clean %>%
mutate(
gdp_category = case_when(
`GDP ($ per capita)` >= 25000 ~ "High Income",
`GDP ($ per capita)` >= 10000 ~ "Upper Middle Income",
`GDP ($ per capita)` >= 2500 ~ "Lower Middle Income",
`GDP ($ per capita)` < 2500 ~ "Low Income",
TRUE ~ "Unknown"
)
) %>%
group_by(Region, gdp_category) %>%
summarise(
number_of_countries = n(),
total_population = sum(Population, na.rm = TRUE),
avg_gdp = mean(`GDP ($ per capita)`, na.rm = TRUE),
avg_literacy = mean(`Literacy (%)`, na.rm = TRUE),
avg_infant_mortality = mean(`Infant mortality (per 1000 births)`, na.rm = TRUE),
median_phones = median(`Phones (per 1000)`, na.rm = TRUE),
.groups = 'drop'
) %>%
arrange(Region, desc(avg_gdp))
regional_analysis_clean %>% head(10)Fungsi: Mengelompokkan data berdasarkan satu atau lebih kolom kategorikal. Biasanya diikuti dengan summarize().
# Rata-rata GDP per region - nama chunk tanpa comment
gdp_by_region <- countries %>%
group_by(Region) %>%
summarise(
avg_gdp = mean(`GDP ($ per capita)`, na.rm = TRUE),
count_countries = n()
) %>%
arrange(desc(avg_gdp))
gdp_by_regionFungsi: Menghitung frekuensi untuk kombinasi nilai dalam kolom. Shortcut untuk group_by() + summarise(n()).
# Count dengan multiple columns
region_development <- countries %>%
mutate(development = ifelse(`GDP ($ per capita)` > 20000, "Developed", "Developing")) %>%
count(Region, development)
region_count Fungsi: Mendeteksi pattern teks dalam string. Return logical vector yang sangat useful untuk filtering.
library(stringr)
# Filter negara dengan nama mengandung "land"
land_countries <- countries %>%
filter(str_detect(Country, "land"))
land_countriesFungsi: Membuat conditional statements kompleks dengan multiple conditions. Lebih powerful dari ifelse().
# Klasifikasi negara berdasarkan GDP
countries_classified <- countries %>%
mutate(
income_group = case_when(
`GDP ($ per capita)` >= 30000 ~ "High Income",
`GDP ($ per capita)` >= 10000 ~ "Upper Middle",
`GDP ($ per capita)` >= 2500 ~ "Lower Middle",
`GDP ($ per capita)` < 2500 ~ "Low Income",
TRUE ~ "Unknown"
)
)
countries_classifiedFungsi: Rename kolom berdasarkan function atau pattern. Useful untuk cleaning nama kolom.
# Rename menghapus spesial karakter
countries_clean2 <- countries %>%
rename_with(~ str_remove_all(., "\\(|\\)|\\$| per capita"))
countries_clean2Fungsi: Melakukan operasi yang sama pada multiple columns yang memenuhi kondisi tertentu.
# Convert semua kolom numeric ke integer
countries_int <- countries %>%
mutate(across(where(is.numeric), as.integer))
countries_int# Rata-rata untuk semua kolom numeric per region
numeric_summary <- countries %>%
group_by(Region) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE))
numeric_summaryFungsi: Mengambil unique rows berdasarkan kombinasi kolom. Useful untuk menghilangkan duplikat.
# Unique combinations
unique_combinations <- countries %>%
distinct(Region, Climate)
unique_combinationsFungsi: Memilih baris tertentu berdasarkan posisi/index. Juga bisa slice_min/max/head/tail.
# 5 negara dengan GDP tertinggi
top5_gdp <- countries %>%
slice_max(`GDP ($ per capita)`, n = 5)
top5_gdp # 10% negara dengan populasi terkecil
bottom_10pct <- countries %>%
slice_min(Population, prop = 0.1)
bottom_10pctFungsi: Mengubah urutan kolom dalam dataset. Sangat useful untuk reorganisasi data.
# Pindah kolom Region ke depan
countries_reordered <- countries %>%
relocate(Region, .before = Country)
countries_reordered# Pindah beberapa kolom ke depan
countries_reordered2 <- countries %>%
relocate(where(is.character), .before = where(is.numeric))
countries_reordered2Fungsi: Extended contoh case_when untuk multiple conditions dalam pembuatan variabel.
countries_complex <- countries %>%
mutate(
country_category = case_when(
`GDP ($ per capita)` > 30000 & `Literacy (%)` > 95 ~ "Developed High Literacy",
`GDP ($ per capita)` > 30000 & `Literacy (%)` <= 95 ~ "Developed Medium Literacy",
`GDP ($ per capita)` <= 30000 & `Infant mortality (per 1000 births)` < 10 ~ "Developing Low Mortality",
TRUE ~ "Developing High Mortality"
)
)
countries_complexFungsi: Menggabungkan data frames secara vertikal (rows) atau horizontal (columns).
# Pisah data menjadi dua bagian
asia_countries <- countries %>% filter(str_detect(Region, "ASIA"))
europe_countries <- countries %>% filter(str_detect(Region, "EUROPE"))
# Gabungkan kembali
combined <- bind_rows(asia_countries, europe_countries)
# Tambahkan kolom ID
countries_with_id <- countries %>%
bind_cols(country_id = 1:nrow(.), .)Fungsi pivot_longer digunakan untuk mentransformasi
dataset yang berbentuk wide ke dataset yang berbentuk long. Sebaliknya
pivot_wider digunakan untuk mentransformasi dataset yang
berbentuk long ke dataset yang berbentuk wide. Kedua fungsi ini berasal
dari package tidyr.
# Wide to long - pivot economic indicators
countries_long <- countries %>%
select(Country, `GDP ($ per capita)`, `Literacy (%)`, `Infant mortality (per 1000 births)`) %>%
pivot_longer(
cols = c(`GDP ($ per capita)`, `Literacy (%)`, `Infant mortality (per 1000 births)`),
names_to = "indicator",
values_to = "value" )
countries_long # Long to wide kembali
countries_wide <- countries_long %>%
pivot_wider(
names_from = indicator,
values_from = value
)
countries_wideFungsi: Mengambil nilai pertama yang tidak-NA dari sekumpulan vektor. Useful untuk handling missing values.
# Contoh dengan data yang dimodifikasi
countries_with_na <- countries %>%
mutate(
GDP_alternative = ifelse(Country %in% c("Afghanistan", "Somalia"), NA, `GDP ($ per capita)`)
)
countries_with_na # Gunakan coalesce untuk prioritaskan GDP asli
countries_fixed <- countries_with_na %>%
mutate(
GDP_final = coalesce(`GDP ($ per capita)`, GDP_alternative, 0)
)
countries_fixed Soal 1: Bersihkan dataset dengan melakukan beberapa operasi sekaligus: ubah koma menjadi titik pada kolom numeric, hapus spasi berlebih pada kolom teks, dan isi missing values dengan median untuk numeric atau modus untuk kategorikal. Tampilkan summary sebelum dan setelah cleaning.
Soal 2: Ubah dataset dari wide format menjadi long format dimana semua indikator ekonomi (GDP, Literacy, Infant Mortality) menjadi satu kolom “Indicator” dan nilainya di kolom “Value”. Kemudian kembalikan ke format semula tanpa kehilangan data.
Soal 3: Bandingkan negara-negara dalam region yang sama dengan membuat kolom baru yang menunjukkan peringkat GDP per kapita dalam regionnya, selisih GDP dari rata-rata region, dan status apakah GDP negara tersebut di atas atau di bawah median region.
Soal 4: Pisahkan region utama dan sub-region (jika ada), normalisasi penulisan (kapitalisasi yang konsisten), dan hitung frekuensi setiap kombinasi region-subregion.
Soal 5: Kelompokkan negara berdasarkan multiple conditions: “High Income-Low Population” (GDP > $15,000 & Population < 10 juta), “Low Income-High Population” (GDP < $5,000 & Population > 50 juta), dan “Medium All”. Hitung statistik deskriptif untuk setiap kelompok.
Soal 6:Identifikasi dan perbaiki data yang tidak konsisten: nilai GDP yang tidak masuk akal (misal: $0 atau > $100,000), persentase yang melebihi 100%, dan kombinasi Agriculture+Industry+Service yang tidak sama dengan 1.
Soal 7: Group oleh Region dan Climate, kemudian hitung: rata-rata GDP, jumlah negara, negara dengan GDP tertinggi & terendah, dan range GDP untuk setiap kombinasi group.
Soal 8: Cari negara-negara yang memenuhi minimal 3 dari 4 kriteria: Literacy > 90%, Infant Mortality < 10, Phones > 500, dan Net Migration positif. Tampilkan dalam bentuk ranked list.
Soal 9:Dalam satu pipeline berurutan: seleksi kolom, filter baris, buat 3 kolom baru (log transformation untuk Population, kategori untuk Density, flag untuk Coastal countries), dan group summary statistics.
Soal 10: Asumsikan ada dataset tambahan berisi ibukota dan bahasa resmi setiap negara. Gabungkan dengan dataset existing, handle missing matches, dan buat analisis perbandingan antara negara dengan dan tanpa data lengkap.