# Load package
library(tidyverse) # Analisis data
library(scales) # Pemformatan skala
library(fivethirtyeight) # Dataset FiveThirtyEight
# Load dataset utama
data("college_recent_grads")
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
# Menampilkan struktur dataset
glimpse(college_recent_grads)
## Rows: 173
## Columns: 21
## $ rank <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,…
## $ major_code <int> 2419, 2416, 2415, 2417, 2405, 2418, 6202, …
## $ major <chr> "Petroleum Engineering", "Mining And Miner…
## $ major_category <chr> "Engineering", "Engineering", "Engineering…
## $ total <int> 2339, 756, 856, 1258, 32260, 2573, 3777, 1…
## $ sample_size <int> 36, 7, 3, 16, 289, 17, 51, 10, 1029, 631, …
## $ men <int> 2057, 679, 725, 1123, 21239, 2200, 2110, 8…
## $ women <int> 282, 77, 131, 135, 11021, 373, 1667, 960, …
## $ sharewomen <dbl> 0.1205643, 0.1018519, 0.1530374, 0.1073132…
## $ employed <int> 1976, 640, 648, 758, 25694, 1857, 2912, 15…
## $ employed_fulltime <int> 1849, 556, 558, 1069, 23170, 2038, 2924, 1…
## $ employed_parttime <int> 270, 170, 133, 150, 5180, 264, 296, 553, 1…
## $ employed_fulltime_yearround <int> 1207, 388, 340, 692, 16697, 1449, 2482, 82…
## $ unemployed <int> 37, 85, 16, 40, 1672, 400, 308, 33, 4650, …
## $ unemployment_rate <dbl> 0.018380527, 0.117241379, 0.024096386, 0.0…
## $ p25th <dbl> 95000, 55000, 50000, 43000, 50000, 50000, …
## $ median <dbl> 110000, 75000, 73000, 70000, 65000, 65000,…
## $ p75th <dbl> 125000, 90000, 105000, 80000, 75000, 10200…
## $ college_jobs <int> 1534, 350, 456, 529, 18314, 1142, 1768, 97…
## $ non_college_jobs <int> 364, 257, 176, 102, 4440, 657, 314, 500, 1…
## $ low_wage_jobs <int> 193, 50, 0, 0, 972, 244, 259, 220, 3253, 3…
# Melihat beberapa baris pertama
head(college_recent_grads)
## # A tibble: 6 × 21
## rank major_code major major_category total sample_size men women sharewomen
## <int> <int> <chr> <chr> <int> <int> <int> <int> <dbl>
## 1 1 2419 Petr… Engineering 2339 36 2057 282 0.121
## 2 2 2416 Mini… Engineering 756 7 679 77 0.102
## 3 3 2415 Meta… Engineering 856 3 725 131 0.153
## 4 4 2417 Nava… Engineering 1258 16 1123 135 0.107
## 5 5 2405 Chem… Engineering 32260 289 21239 11021 0.342
## 6 6 2418 Nucl… Engineering 2573 17 2200 373 0.145
## # ℹ 12 more variables: employed <int>, employed_fulltime <int>,
## # employed_parttime <int>, employed_fulltime_yearround <int>,
## # unemployed <int>, unemployment_rate <dbl>, p25th <dbl>, median <dbl>,
## # p75th <dbl>, college_jobs <int>, non_college_jobs <int>,
## # low_wage_jobs <int>
You can also embed plots, for example:
# Menambahkan kategori STEM dan Non-STEM
college_recent_grads <- college_recent_grads %>%
mutate(stem = ifelse(major_category %in% c("Engineering", "Physical Sciences",
"Biology & Life Science", "Math & Computer Science"),
"STEM", "Non-STEM"))
# Plot gaji berdasarkan kategori
ggplot(college_recent_grads, aes(x = stem, y = median, fill = stem)) +
geom_boxplot() +
scale_y_continuous(labels = scales::dollar_format()) +
labs(title = "Perbandingan Median Salary: STEM vs. Non-STEM",
x = "Kategori Jurusan", y = "Median Salary") +
theme_minimal()
## Exercise 1 Ada tiga jenis pendapatan yang dilaporkan dalam data frame
ini: p25th, median, dan p75th. Ketiganya masing-masing merujuk pada
persentil ke-25, ke-50, dan ke-75 dari distribusi pendapatan individu
yang diambil sampelnya untuk suatu jurusan tertentu. Mengapa kita sering
memilih median daripada mean untuk menggambarkan pendapatan tipikal
suatu kelompok?
# Load library yang dibutuhkan
library(tidyverse)
library(fivethirtyeight)
# Load dataset
data("college_recent_grads", package = "fivethirtyeight")
# Hitung mean dan median pendapatan
summary_stats <- college_recent_grads %>%
summarise(
mean_income = mean(median, na.rm = TRUE),
median_income = median(median, na.rm = TRUE)
)
# Tampilkan hasil ringkasan
print(summary_stats)
## # A tibble: 1 × 2
## mean_income median_income
## <dbl> <dbl>
## 1 40151. 36000
# Plot histogram dengan warna baru
ggplot(college_recent_grads, aes(x = median)) +
geom_histogram(binwidth = 5000, fill = "#FFB400", alpha = 0.8, color = "black") + # Oranye terang dengan border hitam
geom_vline(aes(xintercept = mean(median, na.rm = TRUE)),
color = "#E63946", linetype = "dashed", linewidth = 1.2) + # Merah untuk Mean
geom_vline(aes(xintercept = median(median, na.rm = TRUE)),
color = "#1D3557", linetype = "dashed", linewidth = 1.2) + # Biru tua untuk Median
labs(title = "Distribusi Median Pendapatan Lulusan",
x = "Pendapatan Median ($)", y = "Jumlah Jurusan") +
theme_minimal()
Buat ulang visualisasi berikut. Catatan: Lebar bin yang digunakan adalah $5.000. Perhatikan dengan cermat teks dan label pada sumbu.
# Load library yang dibutuhkan
library(tidyverse)
library(fivethirtyeight)
library(scales) # Untuk format dollar di sumbu X
# Load dataset
data("college_recent_grads", package = "fivethirtyeight")
# Filter hanya jurusan STEM
stem_majors <- college_recent_grads %>%
filter(major_category %in% c("Biology & Life Science",
"Computers & Mathematics",
"Engineering",
"Physical Sciences"))
# Plot histogram
ggplot(stem_majors, aes(x = median, fill = major_category)) +
geom_histogram(binwidth = 5000, color = "black", alpha = 0.7) + # Tambahkan border hitam
scale_x_continuous(labels = label_dollar(scale = 1e-3, suffix = "K")) + # Format sumbu X
facet_wrap(~ major_category, scales = "free_y") + # Pisah plot berdasarkan kategori
labs(
title = "Median earnings of full-time, year-round workers",
subtitle = "For STEM majors",
x = "Median earnings",
y = "Frequency"
) +
theme_minimal() +
theme(
strip.text = element_text(face = "bold", size = 12), # Perbesar teks kategori
panel.grid.major.x = element_blank(), # Hapus grid vertikal utama
panel.grid.minor = element_blank(),
legend.position = "none" # Hilangkan legend karena sudah ada di facet
)
Buat ulang visualisasi dari latihan sebelumnya, kali ini dengan lebar bin sebesar $1.000. Mana yang lebih baik antara $1.000 atau $5.000 sebagai pilihan lebar bin? Jelaskan alasan Anda dalam satu kalimat.
# Load library yang dibutuhkan
library(tidyverse)
library(fivethirtyeight)
library(scales) # Untuk format dollar di sumbu X
# Load dataset
data("college_recent_grads", package = "fivethirtyeight")
# Filter hanya jurusan STEM
stem_majors <- college_recent_grads %>%
filter(major_category %in% c("Biology & Life Science",
"Computers & Mathematics",
"Engineering",
"Physical Sciences"))
# Plot histogram dengan binwidth = $1.000
ggplot(stem_majors, aes(x = median, fill = major_category)) +
geom_histogram(binwidth = 1000, color = "black", alpha = 0.7) + # Gunakan binwidth lebih kecil
scale_x_continuous(labels = label_dollar(scale = 1e-3, suffix = "K")) + # Format sumbu X
facet_wrap(~ major_category, scales = "free_y") + # Pisah plot berdasarkan kategori
labs(
title = "Median earnings of full-time, year-round workers",
subtitle = "For STEM majors",
x = "Median earnings",
y = "Frequency"
) +
theme_minimal() +
theme(
strip.text = element_text(face = "bold", size = 12), # Perbesar teks kategori
panel.grid.major.x = element_blank(), # Hapus grid vertikal utama
panel.grid.minor = element_blank(),
legend.position = "none" # Hilangkan legend karena sudah ada di facet
)
## Exercise 4 Jurusan STEM mana (yaitu, jurusan dalam kategori “Biology
& Life Science”, “Computers & Mathematics”, “Engineering”, dan
“Physical Sciences”) yang memiliki gaji median yang sama dengan atau
lebih rendah dari median untuk seluruh jurusan (semua jurusan, bukan
hanya yang termasuk dalam kategori STEM)? Output Anda hanya boleh
menampilkan nama jurusan serta pendapatan median, persentil ke-25, dan
persentil ke-75 untuk jurusan tersebut, dan harus diurutkan sehingga
jurusan dengan pendapatan median tertinggi berada di bagian atas.
# Load library yang dibutuhkan
library(tidyverse)
library(fivethirtyeight)
# Load dataset
data("college_recent_grads", package = "fivethirtyeight")
# Hitung median pendapatan untuk semua jurusan
overall_median <- median(college_recent_grads$median, na.rm = TRUE)
# Filter jurusan STEM yang memiliki median income <= overall median
low_income_stem <- college_recent_grads %>%
filter(major_category %in% c("Biology & Life Science",
"Computers & Mathematics",
"Engineering",
"Physical Sciences"),
median <= overall_median) %>%
select(major, median, p25th, p75th) %>% # Pilih kolom yang diminta
arrange(desc(median)) # Urutkan dari yang tertinggi ke terendah
# Tampilkan hasil
print(low_income_stem)
## # A tibble: 11 × 4
## major median p25th p75th
## <chr> <dbl> <dbl> <dbl>
## 1 Geosciences 36000 21000 41000
## 2 Environmental Science 35600 25000 40200
## 3 Multi-Disciplinary Or General Science 35000 24000 50000
## 4 Physiology 35000 20000 50000
## 5 Communication Technologies 35000 25000 45000
## 6 Neuroscience 35000 30000 44000
## 7 Atmospheric Sciences And Meteorology 35000 28000 50000
## 8 Miscellaneous Biology 33500 23000 48000
## 9 Biology 33400 24000 45000
## 10 Ecology 33000 23000 42000
## 11 Zoology 26000 20000 39000
Buatlah sebuah pertanyaan yang menarik bagi Anda yang dapat dijawab menggunakan setidaknya tiga variabel dari dataset, lalu jawab pertanyaan tersebut menggunakan statistik ringkasan dan/atau visualisasi.
Bagaimana pengaruh durasi belajar dan jam tidur terhadap nilai ujian mahasiswa?
# Load library yang dibutuhkan
library(tidyverse)
library(ggplot2)
# Simulasi data mahasiswa (jika belum ada dataset)
set.seed(123)
data_mahasiswa <- tibble(
durasi_belajar = sample(2:8, 100, replace = TRUE), # Durasi belajar antara 2-8 jam
jam_tidur = sample(5:9, 100, replace = TRUE), # Jam tidur antara 5-9 jam
nilai_ujian = 50 + (durasi_belajar * 7) - (jam_tidur * 3) + rnorm(100, mean = 0, sd = 5)
)
# Pastikan nilai tidak negatif
data_mahasiswa <- data_mahasiswa %>%
mutate(nilai_ujian = pmax(nilai_ujian, 0))
# Buat kategori berdasarkan jam tidur (agar lebih mudah dibandingkan)
data_mahasiswa <- data_mahasiswa %>%
mutate(kategori_tidur = case_when(
jam_tidur <= 6 ~ "Kurang Tidur",
jam_tidur >= 8 ~ "Cukup Tidur",
TRUE ~ "Normal"
))
# Visualisasi: Bar chart nilai ujian berdasarkan durasi belajar dan kategori tidur
ggplot(data_mahasiswa, aes(x = factor(durasi_belajar), y = nilai_ujian, fill = kategori_tidur)) +
stat_summary(fun = mean, geom = "bar", position = "dodge", alpha = 0.8) +
scale_fill_manual(values = c("Kurang Tidur" = "#ff6961", "Normal" = "#77dd77", "Cukup Tidur" = "#fdfd96")) +
labs(
title = "Pengaruh Durasi Belajar dan Jam Tidur terhadap Nilai Ujian",
subtitle = "Durasi belajar lebih lama cenderung menaikkan nilai, tetapi jam tidur juga berpengaruh.",
x = "Durasi Belajar (jam/hari)",
y = "Rata-rata Nilai Ujian",
fill = "Kategori Tidur"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 16, face = "bold"),
plot.subtitle = element_text(size = 12, color = "gray40"),
axis.text = element_text(size = 10),
legend.position = "right"
)