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.
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
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"
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.
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:
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
# 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
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
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?
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))
4. Berapa gaji tertinggi yang dihasilkan oleh seorang guru ?
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
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()
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?
# 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