Visualisasi Data Transjakarta
Welcome!!
Halo semua! Kembali lagi bersama sayaa, Brigitta Carmen :D
Pada LBB: Data Visualization kali ini, saya akan mencoba untuk memvisualisasikan data mengenai penumpang Bus Transjakarta pada bulan April. Transjakarta merupakan salah satu moda transportasi utama bagi warga Jakarta dan sekitarnya.
Transjakarta sendiri adalah perusahaan transportasi publik dari Indonesia yang berlokasi di Ibukota Negara, Jakarta. Angkutan Transjakarta sendiri terbagi menjadi tiga kategori, yaitu bus berukuran besar (BRT), bus berukuran medium (non-BRT), dan mini-bus (Mikrotrans). Metode pembayaran yang digunakan oleh Moda Transportasi Transjakarta adalah Tap-In dan Tap-Out menggunakan kartu pembayaran elektronik.
Harapannya, setelah membuat beberapa visualisasi dari data ini, kita sebagai kaum awam mendapat wawasan lebih mengenai para penumpang Transjakarta dan metode pembayarannya.
Data ini merupakan data dummy yang saya ambil dari Kaggle dengan link sebagai berikut: https://www.kaggle.com/datasets/dikisahkan/transjakarta-transportation-transaction.
Saya menggunakan data dummy ini dikarenakan setelah dicari tahu, ternyata pihak Transjakarta tidak menyebarluaskan data milik mereka.
Anda penasaran? Yuk selami LBB ini lebih lanjut! :)))
Read The Data
Hal yang pertama kita harus lakukan adalah membaca datanya terlebih dahulu. Karena data berbentuk csv, maka kita akan menggunakan read.csv.
Data akan kita beri nama ‘data_tj’.
# read data csv
data_tj <- read.csv("data_input/dfTransjakarta180kRows.csv")
head(data_tj)tail(data_tj)Penjelasan Nama Kolom Data
Setelah kita melihat head dari ‘data_tj’, saya akan memberikan penjelasan mengenai nama-nama kolom yang digunakan oleh ‘data_tj’.
- ‘transID’ : ID bus Transjakarta yang digunakan.
- ‘payCardID’ : ID kartu pembayaran yang digunakan oleh penumpang.
- ‘payCardBank’ : Jenis kartu pembayaran yang digunakan oleh penumpang.
- ‘payCardName’ : Nama yang tertera pada kartu pembayaran yang digunakan oleh penumpang.
- ‘payCardSex’ : Jenis kelamin yang nama pemegang kartu pembayaran yang digunakan oleh penumpang.
- ‘payCardBirthDate’ : Tahun kelahiran pemegang kartu pembayaran yang digunakan oleh penumpang.
- ‘corridorID’ : ID koridor perjalanan yang diambil oleh penumpang.
- ‘corridorName’ : Nama koridor perjalanan yang diambil oleh penumpang.
- ‘direction’ : Arah berangkat (sesuai dengan nama koridor atau arah sebaliknya. 0 untuk arah berangkat dan 1 untuk arah sebaliknya).
- ‘tapInStops’ : Kode halte tempat penumpang menaiki bus.
- ‘tapInStopsName’ : Nama halte tempat penumpang menaiki bus.
- ‘tapInStopsLat’ : Titik koordinat (garis lintang) lokasi halte tempat penumpang menaiki bus.
- ‘tapInStopsLon’ : Titik koordinat (garis bujur) lokasi halte tempat penumpang menaiki bus.
- ‘stopStartSeq’ : Tidak ada keterangan untuk kolom ini. Kolom akan dihapus.
- ‘tapInTime’ : Waktu penumpang melakukan Tap-In di halte keberangkatan.
- ‘tapOutStops’ : Kode halte tempat penumpang turun dari bus.
- ‘tapOutStopsName’ : Nama halte tempat penumpang turun dari bus.
- ‘tapOutStopsLat’ : Titik koordinat (garis lintang) lokasi halte tempat penumpang turun dari bus.
- ‘tapOutStopsLon’ : Titik koordinat (garis bujur) lokasi halte tempat penumpang turun dari bus.
- ‘stopEndSeq’ : Tidak ada keterangan untuk kolom ini. Kolom akan dihapus.
- ‘tapOutTime’ : Waktu penumpang melakukan Tap-Out di halte tujuan.
- ‘payAmount’ : Jumlah biaya yang dikeluarkan oleh penumpang Transjakarta.
Mengecek dimensi data
dim(data_tj)## [1] 189500 22
Berdasarkan output dari fungsi diatas, maka kita mendapatkan informasi bahwa ‘data_tj’ memiliki 189500 baris dan 22 kolom.
Penyesuaian Tipe Data
Tahap selanjutnya yang harus kita kerjakan adalah penyesuaian tipe-tipe data yang terdapat dalam data frame.
Sebelum melakukan penyesuaian, kita dapat mengecek tipe data yang terdapat dalam ‘data_tj’ terlebih dahulu menggunakan fungsi ‘glimpse()’
glimpse(data_tj)## Rows: 189,500
## Columns: 22
## $ transID <chr> "VRPJ892P3M98RA", "ZWCH834I6M26HS", "YRLD835V6L82GO",…
## $ payCardID <dbl> 3.561408e+15, 3.477281e+14, 3.771055e+14, 4.486493e+1…
## $ payCardBank <chr> "dki", "emoney", "emoney", "dki", "bni", "bni", "dki"…
## $ payCardName <chr> "Dr. Janet Nashiruddin, M.Ak", "Balamantri Rahayu", "…
## $ payCardSex <chr> "M", "M", "F", "M", "F", "F", "M", "F", "F", "M", "M"…
## $ payCardBirthDate <int> 2010, 2002, 1993, 1980, 1997, 1993, 1966, 2011, 2009,…
## $ corridorID <chr> "4", "JAK.28", "B13", "8K", "", "JAK.117", "9F", "JAK…
## $ corridorName <chr> "Pulo Gadung 2 - Tosari", "Kp. Rambutan - Taman Wilad…
## $ direction <dbl> 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0,…
## $ tapInStops <chr> "P00167", "B04633P", "B02192P", "B03637P", "", "B0427…
## $ tapInStopsName <chr> "Pemuda Rawamangun", "Sekolah Islam PB Soedirman", "M…
## $ tapInStopsLat <dbl> -6.193488, -6.314293, -6.247861, -6.194813, -6.186792…
## $ tapInStopsLon <dbl> 106.8916, 106.8630, 106.9921, 106.7821, 106.8351, 106…
## $ stopStartSeq <int> 12, 27, 6, 16, 2, 17, 5, 55, 10, 46, 35, 40, 9, 24, 0…
## $ tapInTime <chr> "2023-04-03 06:53:02", "2023-04-03 05:59:19", "2023-0…
## $ tapOutStops <chr> "P00127", "B00865P", "B00108P", "", "B02755P", "B0481…
## $ tapOutStopsName <chr> "Layur", "Jln. Ar Ridho", "Bandar Djakarta Bekasi", "…
## $ tapOutStopsLat <dbl> -6.193539, -6.308148, -6.227085, -6.198896, -6.180673…
## $ tapOutStopsLon <dbl> 106.8991, 106.8693, 106.9968, 106.7689, 106.8264, 106…
## $ stopEndSeq <dbl> 13, 30, 9, 26, 5, 21, 7, 56, 37, 52, 47, 45, 37, 33, …
## $ tapOutTime <chr> "2023-04-03 07:13:28", "2023-04-03 06:57:06", "2023-0…
## $ payAmount <dbl> 3500, 0, 20000, 3500, 3500, 0, 0, 0, 0, 0, 0, 0, 0, 0…
Berikut adalah list tipe data yang harus kita ubah: - payCardBank : dari chr menjadi factor, karena hanya terdapat enam levels. - payCardSex : dari chr menjadi factor, karena hanya terdapat dua jenis gender. - direction : dari dbl menjadi factor, karena hanya terdapat dua jenis direction (1 dan 0) - tapInTime : dari chr menjadi date, menggunakan library ‘lubridate’ - tapOutTime : dari chr menjadi date, menggunakan library ‘lubridate’
data_tj$payCardBank <- as.factor(data_tj$payCardBank)
data_tj$payCardSex <- as.factor(data_tj$payCardSex)
data_tj$direction <- as.factor(data_tj$direction)
data_tj$tapInTime <- ymd_hms(data_tj$tapInTime)
data_tj$tapOutTime <- ymd_hms(data_tj$tapOutTime)Setelah itu, kita dapat mengecek dataframe kembali untuk memastikan bahwa tipe data yang kita inginkan untuk berubah telah berubah.
head(data_tj)Bisa dilihat bahwa kolom-kolom yang kita inginkan untuk berubah telah berubah tipe-datanya.
Menghapus Kolom yang Tidak Diperlukan
Sesuai dengan keterangan kolom yang telah saya tuliskan sebelumnya, maka akan ada dua kolom yang kita hapus, yaitu kolom ‘stopStartSeq’ dan ‘stopEndSeq’.
data_tj <- data_tj[ , -c(14, 20)]Setelah itu, kita dapat mengecek data lewat head() untuk
memastikan kolom yang kita inginkan hilang sudah hilang atau belum.
# panggil data kembali untuk memastikan apakah kolom sudah hilang atau belum
head(data_tj)Jumlah kolom data yang awalnya 22 telah berubah menjadi 20. Berarti kedua kolom yang ingin kita hapus telah hilang.
(Feature Engineering) Menambah kolom dalam data
Karena terlihat bahwa tidak terdapat data usia penumpang, maka kita akan menambahkan kolom ‘age’ untuk mengetahui usia penumpang (didapat dari 2023 dikurangi tahun kelahiran.)
data_tj$age <- 2023 - (data_tj$payCardBirthDate)Cek data:
head(data_tj)Mencari tahu usia penumpang termuda dan tertua:
min(data_tj$age)## [1] 11
max(data_tj$age)## [1] 77
Insight: Usia penumpang termuda adalah 11 tahun dan usia penumpang tertua adalah 77 tahun.
Kolom telah bertambah satu; kolom ‘age’.
Setelah itu, kita akan menambah kolom lagi bernama ‘ageCategory’ untuk mengkategorikan umur pemegang kartu pembayaran.
Kolom ‘ageCategory’ akan dibuat menjadi 4 kategori sebagai berikut:
0 - 17 tahun18 - 35 tahun36 - 65 tahunlebih dari 65 tahun
Langkah yang akan saya dilakukan: 1. Membuat fungsi untuk
mengkategorikan usia menggunakan if-else() 2. Menerapkan
fungsi tersebut ke seluruh data 3. Memasukkan kategori yang terbentuk ke
kolom baru (ageCategory)
if(kondisi){ (statement) } else if (kondisi){ (statement) } else if (kondisi) (statement) } else{ (statement) }
# x = data
usia <- function(x){
if(x < 18){
x <- "0 - 17 tahun" # penumpang berusia 0 hingga 17 tahun
}else if(x >= 18 & x < 36){
x <- "18 - 35 tahun" # penumpang berusia 18 hingga 35 tahun
}else if(x >= 36 & x < 66){
x <- "36 - 65 tahun" # penumpang berusia 36 hingga 65 tahun
}else{
x <- "66 - 90 tahun" # penumpang berusia diatas 65 tahun
}
}# gunakan `sapply()` untuk aplikasi ke seluruh baris
data_tj$ageCategory <- sapply(data_tj$age, FUN = usia)
# ubah ke factor
data_tj$ageCategory <- as.factor(data_tj$ageCategory)Cek kembali dataframe
head(data_tj)Kolom telah bertambah, menandakan kita berhasil menambahkan kolom ageCategory.
Mulai Visualisasi Data
Pada tahap ini, kita akan mulai melakukan visualisasi data menggunakan plot-plot. Sebelum mulai memvisualisasi, ada baiknya tahap ini dimulai dengan Business Question.
Saya telah menyiapkan beberapa Business Question yang akan kita coba jawab disini:
Berapa banyak pengguna moda transportasi Transjakarta berdasarkan kategori usia?
Melanjutkan pertanyaan nomor 1, berapa jumlah penumpang laki-laki dan wanita menurut kategori usia?
Tampilkan grafik jumlah penggunaan kartu pembayaran moda transportasi Transjakarta!
Bank BCA adalah bank pemilik kartu pembayaran
Flazz. Bantu BCA untuk menganalisis kategori usia target pemasaran Flazz dari para pembayar Transjakarta yang masih menggunakan metodeonline!
First Business Question
Pertanyaan: Berapa banyak pengguna moda transportasi Transjakarta berdasarkan kategori usia?
Kolom yang akan kita gunakan untuk menjawab business question ini
adalah kolom ageCategory yang telah kita buat tadi.
Plot akan dibuat menggunakan library(ggplot2).
Pertama, kita buat data framenya terlebih dahulu.
# buat data frame
tj_ageCat <- as.data.frame(table(data_tj$ageCategory))
tj_ageCat# rename kolom
names(tj_ageCat) <- c("ageCategory", "count")
tj_ageCat# buat plot
ggplot(tj_ageCat, aes(x = ageCategory, y = count)) +
geom_col(aes(fill = "indianred4"), col = "black") +
geom_label(aes(label = count)) +
labs(
title = "Grafik Usia Penumpang Bus Transjakarta",
subtitle = "April, 2023",
x = "Kategori Usia",
y = "Jumlah Penumpang",
caption = "Source: kaggle.com"
) +
theme(legend.position="none") +
scale_fill_brewer(palette = 14)Insight:
Dari grafik diatas, dapat kita ketahui bahwa terdapat dua kategori usia yang terlihat lebih dominan, yaitu kategori usia 18 - 35 tahun (tertinggi) dan kategori usia 36 - 65 tahun (kedua tertinggi)
Second Business Question
Pertanyaan: Berapa jumlah penumpang laki-laki dan wanita menurut kategori usia?
Kolom yang akan kita gunakan untuk menjawab business question ini
adalah kolom payCardSex dan data tj_ageCat
yang telah kita buat tadi.
Plot akan dibuat menggunakan library(ggplot2).
Pertama, kita buat siapkan datanya terlebih dahulu.
# aggregasi data
# head(vids_u)
tj_agg <- as.data.frame(table(data_tj$ageCategory, data_tj$payCardSex))
tj_agg# perbaiki nama kolom
names(tj_agg) <- c("ageCat", "gender", "count")
# menampilkan data hasil agregasi
tj_aggLalu buat visualisasi data dengan multivariate plot.
ggplot(tj_agg, mapping = aes(x = count, y = ageCat)) +
geom_col(aes(fill = gender), position = "dodge") +
labs(
title = "Grafik Data Penumpang Transjakarta",
subtitle = "April, 2023",
x = "Jumlah Penumpang",
y = NULL,
fill = "Gender",
caption = "Source: kaggle.com"
) +
scale_fill_brewer(palette = 14) +
theme_light()Insight:
Pada grafik diatas dapat kita ketahui bahwa penumpang perempuan paling banyak berada pada rentang usia 18-35 tahun, sementara penumpang laki-laki paling banyak berada pada rentang usia 36 - 65 tahun.
Third Business Question
Pertanyaan: Tampilkan grafik jumlah penggunaan kartu pembayaran moda transportasi Transjakarta!
Kolom yang akan kita gunakan untuk menjawab business question ini
adalah kolom payCardBank.
Sederhananya, bila langsung ingin menjawab pertanyaan tersebut kita
dapat menggunakan geom_col() yang terdapat dalam package
ggplot. Berikut implementasinya:
# buat data frame terlebih dahulu
tj_cardbank <- as.data.frame(table(data_tj$payCardBank))
tj_cardbank# rename nama kolom
names(tj_cardbank) <- c("cardBank", "count")
tj_cardbank# lalu kita buat plotnya
ggplot(tj_cardbank, mapping = aes(x = count, y = reorder(cardBank, count))) +
geom_col(aes(fill = -count), show.legend = FALSE) +
scale_fill_gradient(low = "darkred", high = "burlywood1") +
geom_label(aes(label = count)) +
labs(
title = "Jumlah Penumpang Transjakarta menurut Metode Pembayaran",
subtitle = "April, 2023",
x = "Jumlah Penumpang",
y = NULL,
fill = "Gender",
caption = "Source: kaggle.com"
) +
theme_light()
Insights:
Metode pembayaran tertinggi dipegang oleh Bank DKI dengan jumlah pengguna sebanyak 95.126 penumpang.
Hasil ini sudah selesai. Tetapi dapat kita aggregasikan untuk mencari tahu proporsi penumpang laki-laki dan penumpang perempuan di setiap metode pembayarannya.
# aggregasi data
# head(vids_u)
tj_agg2 <- as.data.frame(table(data_tj$payCardBank, data_tj$payCardSex))
tj_agg2# perbaiki nama kolom
names(tj_agg2) <- c("cardBank", "gender", "count")
# menampilkan data hasil agregasi
tj_agg2Lalu buat visualisasi data dengan multivariate plot.
ggplot(tj_agg2, mapping = aes(x = count, y = reorder(cardBank, count))) +
geom_col(aes(fill = gender), position = "dodge") +
labs(
title = "Jumlah Penumpang Transjakarta menurut Metode Pembayaran",
subtitle = "April, 2023",
x = "Jumlah Penumpang",
y = NULL,
fill = "Gender",
caption = "Source: kaggle.com"
) +
scale_fill_brewer(palette = 14) +
theme_light()
Insights:
Pada setiap metode pembayarannya, lebih banyak pengguna perempuan daripada pengguna laki-laki.
Fourth Business Question
Pertanyaan: Bank BCA adalah bank pemilik kartu pembayaran
Flazz. Bantu BCA untuk menganalisis kategori usia target
pemasaran Flazz dari para pembayar Transjakarta yang masih menggunakan
metode online!
Pertama, kita analisis dahulu para pengguna metode pembayaran ‘online’ berdasarkan kategori usianya.
tj_online <- data_tj[data_tj$payCardBank == "online", ]
tj_online# kita buat data framenya
tj_online2 <- as.data.frame(table(tj_online$ageCategory))
names(tj_online2) <- c("ageCat", "count")
tj_online2# lalu kita buat plotnya
ggplot(tj_online2, mapping = aes(x = count, y = reorder(ageCat, count))) +
geom_col(aes(fill = -count), show.legend = FALSE) +
scale_fill_gradient(low = "darkred", high = "burlywood1") +
geom_label(aes(label = count)) +
labs(
title = "Jumlah Penumpang Transjakarta dengan Metode Pembayaran Online",
subtitle = "April, 2023",
x = "Jumlah Penumpang",
y = NULL,
fill = "Gender",
caption = "Source: kaggle.com"
) +
theme_light()Insights:
Dengan mengambil informasi dari plot diatas, maka kita dapat memberi saran kepada Bank BCA untuk melakukan advertising kepada target utama kategori usia 18 hingga 35 tahun.
Karena target merupakan kelompok usia Gen-Z dan Millenial, maka promosi dapat dilakukan banyak di media sosial, berbentuk kampanye atau yang lainnya.
Penutup
Terima kasih telah meluangkan waktu untuk mereview LBB: Data Visualization milik saya! Semoga berkenan dan mudah dipahami yaaa :))
Salam,
Brigitta Carmen