1. Intro

Pada artikel ini, saya akan menganalisis data gaji guru di Louis Michigan. Data ini diambil dari kaggle. Penghasilan profesi guru di negara maju tentunya tidak sama antara satu dengan yang lain, oleh karena itu untuk melusuri lebih lanjut diperlukan pengolahan data, Eksplanatory Data Analysis, dan visualisasi data untuk mendapatkan insight dari dataset tersebut.

2. Pre-Processing Data

2.1 Import Dataset

Tahap pertama dalam melakukan pengolahan data adalah dengan melakukan import data set kemudian assign ke dalam objek yang bernama teacher

teacher <- read.csv("teacher.csv")
head(teacher)
##   id degree fte years  base    fica retirement    total
## 1  1     BA   1   5.0 45388 3472.18    7688.73 56548.91
## 2  2     MA   1  15.0 60649 4639.65   10273.94 75562.59
## 3  3     MA   1  16.0 60649 4639.65   10273.94 75562.59
## 4  4     BA   1  10.0 54466 4166.65    9226.54 67859.19
## 5  5     BA   1  26.0 65360 5000.04   11071.98 81432.02
## 6  6     BA   1  28.5 65360 5000.04   11071.98 81432.02

2.2 Eksplanatory Data Analysis (EDA)

Tahap selanjutnya setelah berhasil melakukan read data maka agar dapat menganalisis dan menemukan insight terlebih dahulu kita harus faham mengenai informasi, struktur, isi, dan gambaran umum yang terdapat di dataset kita.

# mengecek variabel-variabel yang terdapat dalam dataset
names(teacher)
## [1] "id"         "degree"     "fte"        "years"      "base"      
## [6] "fica"       "retirement" "total"

Dari fungsi names dapat diketahui bahwa dataset teacher memiliki variabel sebanyak 8, di antaranya adalah : 1. id : Kode identifikasi untuk setiap guru, diberikan secara acak. 2. degree : Gelar pendidikan tertinggi yang dicapai: BA (gelar sarjana) atau MA (gelar magister). 3. fte : Status pendaftaran penuh wakt: penuh waktu 1 atau paruh waktu 0,5. 4. years : Jumlah tahun yang dipekerjakan oleh distrik sekolah. 5. base : Gaji pokok tahunan, dalam dolar. 6. fica : Jumlah yang dibayarkan ke Jaminan Sosial dan Medicare per tahun melalui Undang-Undang Kontribusi Asuransi Federal (FICA), dalam dolar. 7. retirement : Jumlah yang dibayarkan ke dana pensiun guru per tahun, dalam dolar. 8. total : Total gaji tahunan guru, yang dihasilkan dari jumlah gaji pokok (base) + fica + pensiun (retirement), dalam dolar.

# mengecek struktur data
str(teacher)
## 'data.frame':    71 obs. of  8 variables:
##  $ id        : int  1 2 3 4 5 6 7 8 9 11 ...
##  $ degree    : chr  "BA" "MA" "MA" "BA" ...
##  $ fte       : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ years     : num  5 15 16 10 26 28.5 12 32 25 12 ...
##  $ base      : int  45388 60649 60649 54466 65360 65360 58097 68230 65360 58097 ...
##  $ fica      : num  3472 4640 4640 4167 5000 ...
##  $ retirement: num  7689 10274 10274 9227 11072 ...
##  $ total     : num  56549 75563 75563 67859 81432 ...

dari fungsi str diatas didapatkan informasi yang mencantumkan diantaranya: - jumlah pengamatan atau baris : sebanyak 71 objek - kolom : 8 variabel - tipe data dari masing-masing varibel

Dikarenakan kolom degree bertipe charackter sehingga perlu dicek terdapat berapa kelas. cara mengetahui kelas tersebut adalah dengan menggunakan fungsi unique

# mengecek banyaknya kelas kategori
unique(teacher$degree)
## [1] "BA" "MA"

dalam hal ini tipe masing-masing kolom data perlu dilakukan croscek ulang untuk disusaikan dengan keadaan data aslinya agar memudahakan dalam langkah pengolahan lebih lanjut

pada variabel degree,merupakan data yang bertipe kategorik karena memiliki 2 kelas sehingga perlu diubah tipe data nya terlebih dahulu menjadi factor

# mengubah tipe data degree dan fte ke factor
teacher$degree <- as.factor(teacher$degree)
class(teacher$degree)
## [1] "factor"

sedangkan untuk variabel fte memiliki kondisi 1 apabila fulltime dan 0.5 apabila parttime sehingga perlu diubah ke bentuk karakter faktor dengan menggunakan fungsi sapply dan switch

# mengecek keberadaan variabel fte dengan kategori 0.5 apakah ada atau tidak dengan melaukan subsetting
teacher[teacher$fte != 1 , ]
##    id degree fte years  base    fica retirement    total
## 36 37     MA 0.5     1 19900 1522.35    3371.06 24793.41

dari subsetting di atas ternyata diketahui variabel fte yang bertipe parttime hanya terdapat satu objek saja.

# mengubah sesuai definisi nama kategori

teacher$fte <- sapply(X = as.character(teacher$fte),
                      FUN = switch,
                      "1" = "Fulltime",
                      "0.5" = "Parttime")
teacher$fte
##  [1] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
##  [7] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
## [13] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
## [19] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
## [25] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
## [31] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Parttime"
## [37] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
## [43] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
## [49] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
## [55] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
## [61] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"
## [67] "Fulltime" "Fulltime" "Fulltime" "Fulltime" "Fulltime"

Variabel sudah berganti menjadi dalam bentuk kategori strig. untuk melakukan pengecekan apakah semua pemberian nama teraplikasikan maka dilakuka conditional subsetting

teacher[teacher$fte == "Parttime", ]
##    id degree      fte years  base    fica retirement    total
## 36 37     MA Parttime     1 19900 1522.35    3371.06 24793.41

dari subsetting di atas sudah sesuai dengan kondisi awal sebelum pengubahan nama kolom yaitu berjumlah satu, sehingga semua fungsi teraplikasikan dengan baik. Langkah selanjutnya adalah mengecek tipe data variabel fte yang telah dilakukan penamaan ulang

# cek tipe data fte 
class(teacher$fte)
## [1] "character"

dari pengecekan di atas dapat dilihat bahwa tipe data dalam bentuk character sehingga perlu disesuaikan terlebih dahulu menjadi tipe data format

# mengubah tipe data fte ke dalam factor
teacher$fte <- as.factor(teacher$fte)
class(teacher$fte)
## [1] "factor"

2.3 Cleansing Data

Setelah semua kolom sudah sesuai dengan tipe datanya masing-masing maka langkah selanjutnya adalah mengecek apakah terdapat missing value pada dataset tersebut degan menggunakan anyNA

# mengecek ada tidaknya missing value secara keseluruhan
anyNA(teacher)
## [1] FALSE
# mengecek jumlah missing value per variabel
colSums(is.na(teacher))
##         id     degree        fte      years       base       fica retirement 
##          0          0          0          0          0          0          0 
##      total 
##          0

Dari output di atas dapat disimpulkan bahwa tidak ada missing value secara keseluruhan maupun pada setiap variabel. sehingga tidak perlu dilakukan treatment tertentu.

3. Study Case

Setelah data sudah bersih dan dilakukan pengenalan data pada tahap EDA. maka langkah selanjutnya adalah menentukan study kasus untuk memperoleh insight apa yang mau diambil dari dataset tersebut.

head(teacher)
##   id degree      fte years  base    fica retirement    total
## 1  1     BA Fulltime   5.0 45388 3472.18    7688.73 56548.91
## 2  2     MA Fulltime  15.0 60649 4639.65   10273.94 75562.59
## 3  3     MA Fulltime  16.0 60649 4639.65   10273.94 75562.59
## 4  4     BA Fulltime  10.0 54466 4166.65    9226.54 67859.19
## 5  5     BA Fulltime  26.0 65360 5000.04   11071.98 81432.02
## 6  6     BA Fulltime  28.5 65360 5000.04   11071.98 81432.02

Questions:

  1. Berapa jumlah setiap kategori tingkat pendidikan seorang guru di Louis Michigan?
  2. Bagaimana persebaran dataset total gaji base menurut tingkat pendidikan seorang guru di district tertentu di Louis Michigan ?
  3. Bagaimana hubungan antara lama guru bekerja dengan gaji yang dihasilkan ?
  4. Berapa gaji tertinggi yang dihasilkan oleh seorang guru?
  5. Berdasarkan top gaji tertinggi bagaimana proporsi base, fica, dan retirement?

3.1 Data Aggregation

Sebelum data divisualisasikan, dilakukan penyiapan data dengan melakukan wrangling dan agregasi pengolahan data terlebih dahulu agar menjadi grafik yan tepat

1. Berapa jumlah setiap kategori tingkat pendidikan seorang guru di Louis Michigan Untuk menjawab pertanyaan pertama, maka perlu mengetahu frekuensi dari setiap kategori dari variabel degree

Data Aggregation

# Agregasi data
Quest1 <- as.data.frame(table(teacher$degree))
names(Quest1) <- c("Degree_Edu","Freq")
Quest1
##   Degree_Edu Freq
## 1         BA   39
## 2         MA   32

Data Visualization

library(ggplot2)
ggplot(data = Quest1, mapping = aes(x = Degree_Edu, y = Freq)) +
  geom_col(aes(fill = Freq)) +
  labs(title = "Banyaknya guru menurut Tingkat Pendidikan", x = "Degree", y = "Banyaknya Guru" , fill = "Banyaknya Guru")+
  theme(plot.title = element_text(hjust = 0.5)) 

### Interpretation - Jumlah guru yang memiliki tingkat pendidikan BA (Bachelor Academy) lebih banyak daripada jumlah guru dengan tingkat pendidikan MA (Magister Academy) - Guru dengan tingkat pendidikan BA (Bachelor Academy) ada sebanyak 39 - Guru dengan tingkat pendidikan MA (Master Academy) ada sebanyak 32

2. Bagaimana persebaran dataset total gaji base menurut tingkat pendidikan seorang guru di district tertentu di Louis Michigan

Data Visualization

library(ggplot2)
ggplot(teacher, aes(x = degree, y = total)) +
   geom_boxplot(aes(fill = degree)) +
   #scale_y_log10() +
   labs(title = "Total Salary by Degree of Teacher", x= "Degree", y= "Total Salary", fill = "Degree Education",
        subtitle = "Garis merah menunjukkan rata-rata nilai total gaji") +
   theme(plot.title = element_text(hjust = 0.5)) +
   geom_hline(yintercept = mean(teacher$total), color = "red", linetype = 5)

###Interpretarion: - pada guru dengan tingkat pendidikan Magister (MA) terdapat nilai outlier gaji yang menyimpang rendah diantara data yang tersebar - Nilai tengah perebaran data gaji guru berada di atas rata-rata gaji guru baik di kategori Bachelor maupun Magoster - Pada guru yang berpendidikan Bachelor persebaran gaji nya lebih banyak berada di bawah rata-rata - varians dari gaji guru yang berpendidikan Bachelor cukup besar daripada varians gaji guru yang berpendidikan Magister

3. Bagaimana hubungan antara lama guru bekerja dengan gaji yang dihasilkan di setiap tingkat pendidikannya?

Data Visualization

ggplot(data = teacher, mapping = aes(x = years, y = total)) +
   geom_jitter(aes(col = degree))+
   #abline(lm(teacher$total ~ teacher$years))+
   #facet_wrap(~degree, scales = "free")+
   labs(title = "Years Vs Total Salary", x="Years", y= "Total Salary" )+
   theme(plot.title = element_text(hjust = 0.5))

Interpretation:

  • Jika dilihat dari lama menjadi guru dengan besar gaji yang dihasilkan, tidak ada perbedaan yang jauh antara guru dengan tingkat pendidikan Bachelor maupun guru dengan tingkat pendidikan Magister. Msekipun guru dengan pendidikan Magister memiliki total selery yang lebih besar. tetapi perbedaannya pun tidak terpaut jauh
  • Semakin lama guru tersebut mengajar semakin tinggi juga salay yang dihasilkan.

4. Berapa gaji tertinggi yang dihasilkan oleh seorang guru ?

Data Aggregation

Quest4 <- aggregate(x = total ~ id + degree,
                    data = teacher,
                    FUN = sum)
Quest4ord <- Quest4[order(x = Quest4$total, decreasing = T), ]
Quest4ord <- head(Quest4ord,15)
Quest4ord
##    id degree    total
## 42  8     MA 85007.76
## 44 18     MA 85007.76
## 46 20     MA 85007.76
## 50 28     MA 85007.76
## 52 32     MA 85007.76
## 53 34     MA 85007.76
## 71 72     MA 85007.76
## 3   5     BA 81432.02
## 4   6     BA 81432.02
## 6   9     BA 81432.02
## 10 14     BA 81432.02
## 12 17     BA 81432.02
## 13 23     BA 81432.02
## 14 24     BA 81432.02
## 15 26     BA 81432.02

Data Visualization

ggplot(data = Quest4ord, mapping = aes(x = reorder(Quest4ord$id, Quest4ord$total), y= total))+
   geom_col(aes(fill =degree))+
   # facet_grid(~ degree, scales = "free_y")+
   #geom_point(aes(col=price))+
   #geom_text(aes(label= comma(host$number_of_reviews)), hjust=-0.4, size = 3)+
   labs(title ="Top 15 Total Salary",
        x="Total Salary", y= "Teacher Id")+
   theme(plot.title = element_text(hjust = 0.5))+
   coord_flip()

Interpretasi:

  • Dai plot di atas dapat disimpulkan bahwa, gaji tertinggi top 8 diduduki oleh guru yang berpendidikan Magister (MA)
  • Top 7 total gaji guru memiliki nominal yang sama persis yaitu sebesar USD$ 85007.76
  • Top 8 hingga top 15 nominal total gaji guru sama persis yaitu sebesar USD$ 81432.02

Dikarenakan terdapat kesamaan total salary guru, sehingga kita ingin melihat apakah proporsi fica dan retirement juga memiliki kesamaan

5. Berdasarkan top gaji tertinggi bagaimana proporsi base, fica, dan retirement?

Data Aggregation

# melakukan subsetting dan pemilihan data yang dubutuhkan
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
Quest5 <- teacher %>% 
   select(id, base, fica, retirement) %>% 
   filter(id %in% c(8,17,19,27,31,33,71,5,6,9))
Quest5
##    id  base    fica retirement
## 1   5 65360 5000.04   11071.98
## 2   6 65360 5000.04   11071.98
## 3   8 68230 5219.60   11558.16
## 4   9 65360 5000.04   11071.98
## 5  17 65360 5000.04   11071.98
## 6  19 64440 4929.66   10916.14
## 7  27 52653 4027.95    8919.42
## 8  31 61729 4722.27   10456.89
## 9  33 59914 4583.42   10149.43
## 10 71 48330 3697.24    8187.10
# melakukan wrangling pada data gaji
library(tidyr)
Quest5agg <- Quest5 %>% 
  pivot_longer(cols = c("base", "fica", "retirement"), # kolom yang mau di transformasi dari wide menjadi long
              names_to = "salary", # untuk mengganti nama kolom name hasil pivot_longer
              values_to = "value")
Quest5agg
## # A tibble: 30 × 3
##       id salary      value
##    <int> <chr>       <dbl>
##  1     5 base       65360 
##  2     5 fica        5000.
##  3     5 retirement 11072.
##  4     6 base       65360 
##  5     6 fica        5000.
##  6     6 retirement 11072.
##  7     8 base       68230 
##  8     8 fica        5220.
##  9     8 retirement 11558.
## 10     9 base       65360 
## # … with 20 more rows
# membuat tabel untuk menghitung proporsi
Quest5agg$prop <- round(Quest5agg$value/sum(Quest5agg$value)*100,2)
Quest5agg
## # A tibble: 30 × 4
##       id salary      value  prop
##    <int> <chr>       <dbl> <dbl>
##  1     5 base       65360   8.51
##  2     5 fica        5000.  0.65
##  3     5 retirement 11072.  1.44
##  4     6 base       65360   8.51
##  5     6 fica        5000.  0.65
##  6     6 retirement 11072.  1.44
##  7     8 base       68230   8.88
##  8     8 fica        5220.  0.68
##  9     8 retirement 11558.  1.5 
## 10     9 base       65360   8.51
## # … with 20 more rows
ggplot(data = Quest5agg, mapping = aes(x = prop, y = reorder(id, prop))) +
  geom_col(aes(fill = salary), position = "fill") +
  
  labs(title = "Youtube Trending Videos Ranks",
       subtitle = "based on category and publish time",
       x = "video count",
       y = "category",
       fill = "publish time")

### Intrepretasi: - Ternyata top 10 guru yang berpenhasilan tinggi, gaji total yang berasal dari base, fica, dan retirement memilliki proporsi yang sama

4. Conclusion

5. Reference

dataset: https://www.kaggle.com/datasets/utkarshx27/teacher-salaries-in-st-louis-michigan?resource=download