Pendahuluan

Dokumen ini menganalisis data lulusan perguruan tinggi dengan fokus pada jurusan STEM.

Library dan Data

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'tibble' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'purrr' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## Warning: package 'stringr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dsbox)
library(scales)
## Warning: package 'scales' was built under R version 4.3.3
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
library(fivethirtyeight)
## Warning: package 'fivethirtyeight' was built under R version 4.3.3
data("college_recent_grads", package = "fivethirtyeight")
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…

Exercise 1

cat("Median lebih sering digunakan dibandingkan mean untuk menggambarkan pendapatan tipikal suatu kelompok karena median tidak terpengaruh oleh nilai ekstrem atau outlier dalam distribusi pendapatan.\n\n",
    "Pendapatan individu sering kali memiliki distribusi yang condong ke kanan (skewed right), di mana ada sejumlah kecil individu dengan pendapatan sangat tinggi yang dapat meningkatkan nilai mean secara signifikan. Akibatnya, mean bisa memberikan gambaran yang tidak akurat tentang pendapatan mayoritas individu dalam kelompok tersebut.\n\n",
    "Sebagai contoh:\n",
    "- Jika mayoritas individu dalam suatu jurusan memiliki pendapatan sekitar 50.000 USD, tetapi ada beberapa individu dengan pendapatan di atas 300.000 USD, maka 'mean' akan lebih tinggi dari 'median', sehingga menggambarkan kondisi yang lebih optimis daripada kenyataan.\n",
    "- Sebaliknya, 'median' (persentil ke-50) menunjukkan nilai tengah dari distribusi pendapatan, yang lebih mencerminkan pendapatan tipikal mayoritas lulusan.\n\n",
    "Oleh karena itu, dalam analisis pendapatan, median lebih disukai karena lebih 'robust terhadap outlier' dan lebih representatif untuk mayoritas individu dalam kelompok tersebut."
)
## Median lebih sering digunakan dibandingkan mean untuk menggambarkan pendapatan tipikal suatu kelompok karena median tidak terpengaruh oleh nilai ekstrem atau outlier dalam distribusi pendapatan.
## 
##  Pendapatan individu sering kali memiliki distribusi yang condong ke kanan (skewed right), di mana ada sejumlah kecil individu dengan pendapatan sangat tinggi yang dapat meningkatkan nilai mean secara signifikan. Akibatnya, mean bisa memberikan gambaran yang tidak akurat tentang pendapatan mayoritas individu dalam kelompok tersebut.
## 
##  Sebagai contoh:
##  - Jika mayoritas individu dalam suatu jurusan memiliki pendapatan sekitar 50.000 USD, tetapi ada beberapa individu dengan pendapatan di atas 300.000 USD, maka 'mean' akan lebih tinggi dari 'median', sehingga menggambarkan kondisi yang lebih optimis daripada kenyataan.
##  - Sebaliknya, 'median' (persentil ke-50) menunjukkan nilai tengah dari distribusi pendapatan, yang lebih mencerminkan pendapatan tipikal mayoritas lulusan.
## 
##  Oleh karena itu, dalam analisis pendapatan, median lebih disukai karena lebih 'robust terhadap outlier' dan lebih representatif untuk mayoritas individu dalam kelompok tersebut.

Exercise 2

library(ggplot2)
library(dplyr)
library(scales)

data_stem <- college_recent_grads %>%
  filter(major_category %in% c("Biology & Life Science", "Computers & Mathematics", "Engineering", "Physical Sciences"))

ggplot(data_stem, aes(x = median, fill = major_category)) +
  geom_histogram(binwidth = 5000, color = "black") +
  scale_x_continuous(labels = label_dollar(scale = 1e-3, prefix = "$", suffix = "K")) +
  facet_wrap(~ major_category, nrow = 4) +  
  labs(
    title = "Median earnings of full-time, year-round workers",
    subtitle = "For STEM majors",
    x = "Median earnings",
    y = "Frequency"
  ) +
  theme_minimal() +
  theme(legend.position = "none")  

Exercise 3

ggplot(data_stem, aes(x = median, fill = major_category)) +
  geom_histogram(binwidth = 1000, color = "black") +
  scale_x_continuous(labels = label_dollar(scale = 1e-3, prefix = "$", suffix = "K")) +
  facet_wrap(~ major_category, nrow = 4) +  
  labs(
    title = "Median earnings of full-time, year-round workers",
    subtitle = "For STEM majors",
    x = "Median earnings",
    y = "Frequency"
  ) +
  theme_minimal() +
  theme(legend.position = "none")  

cat("Lebar bin $1.000 memberikan detail yang lebih baik, tetapi dapat menghasilkan terlalu banyak variasi kecil yang membuat pola keseluruhan sulit dianalisis. Sementara itu, lebar bin $5.000 menyajikan data dengan lebih ringkas, sehingga mempermudah identifikasi pola utama dalam distribusi pendapatan.")
## Lebar bin $1.000 memberikan detail yang lebih baik, tetapi dapat menghasilkan terlalu banyak variasi kecil yang membuat pola keseluruhan sulit dianalisis. Sementara itu, lebar bin $5.000 menyajikan data dengan lebih ringkas, sehingga mempermudah identifikasi pola utama dalam distribusi pendapatan.

Exercise 4

median_all <- median(college_recent_grads$median, na.rm = TRUE)

stem_low_income <- college_recent_grads %>%
  filter(major_category %in% c("Biology & Life Science", "Computers & Mathematics", "Engineering", "Physical Sciences"),
         median <= median_all) %>%
  arrange(desc(median)) %>%
  select(major, median, p25th, p75th)

print(stem_low_income)
## # 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

Exercise 5

summary(data_stem %>% select(median, unemployment_rate, sharewomen))
##      median       unemployment_rate   sharewomen     
##  Min.   : 26000   Min.   :0.00000   Min.   :0.07745  
##  1st Qu.: 37875   1st Qu.:0.04704   1st Qu.:0.21703  
##  Median : 45000   Median :0.06092   Median :0.33336  
##  Mean   : 47861   Mean   :0.06377   Mean   :0.36976  
##  3rd Qu.: 56250   3rd Qu.:0.08149   3rd Qu.:0.53066  
##  Max.   :110000   Max.   :0.17723   Max.   :0.75047

Visualisasi

ggplot(data_stem, aes(x = reorder(major_category, median), y = median, fill = major_category)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(
    title = "Median Gaji pada 4 Jurusan STEM",
    x = "Jurusan",
    y = "Median Gaji"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

ggplot(data_stem, aes(x = reorder(major_category, unemployment_rate), y = unemployment_rate, fill = major_category)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(
    title = "Tingkat Pengangguran pada 4 Jurusan STEM",
    x = "Jurusan",
    y = "Tingkat Pengangguran"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

ggplot(data_stem, aes(x = reorder(major_category, sharewomen), y = sharewomen, fill = major_category)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(
    title = "Proporsi Perempuan pada 4 Jurusan STEM",
    x = "Jurusan",
    y = "Proporsi Perempuan"
  ) +
  theme_minimal() +
  theme(legend.position = "none")