Halo, selamat datang di course perkenalan DQLab yang menandai perjalanan Anda
sebagai Data Scientist! Data Scientist sendiri adalah profesi yang sangat menjanjikan
saat ini, dimana Anda akan merubah data-data yang sebelumnya tidak kelihatan
berguna menjadi informasi yang berharga.Untuk mewujudkan hal itu, seorang data
scientist tetap memerlukan suatu software yang penggunaan cukup simpel namun
kuat (simple but powerful). Nah, software tersebut dinamakan R yang merupakan
software pemrograman untuk data.
4. "Hello World"
Dalam setiap pembelajaran pemograman, memunculkan tulisan "Hello World"
sebagai tradisi dunia pada saat mulai belajar programming :)Mari kita lakukan hal
yang sama untuk R dengan halaman Live Code Editor ini.
Tugas Praktek
Cobalah ketikkan "Hello World" (tulis persis dengan huruf besar, huruf kecil dan
tanda kutipnya) pada bagian Code Editor.
Klik tombol Run Code untuk menjalankan R dan mengeluarkan hasil di
bagian Console.
"Hello World"
5. Praktek Angka dan Perhitungan
Mari kita lanjutkan kembali praktek sederhana dengan R, kali ini Anda
diminta untuk melakukan perhitungan sederhana dengan angka dan penjumlahan
sederhana.
Tugas Praktek
Ketikkan pada code editor rumus 10 + 7, dan jalankan dengan tombol Run Code.
Jika lancar, hasilnya akan terlihat pada Console sebagai berikut.
> 10+7
[1] 17
Dimana 17 adalah hasil perhitungan dari rumus 10 + 7. Abaikan simbol > dan [1] untuk saat ini.
10 + 7
6. Variable dalam R
Penggunaan variable pada pemrograman sangat penting untuk menampung angka
maupun teks di R dengan suatu nama.
Tugas Praktek
Pada Code Editor masukan code untuk membuat variable a sebagai berikut:
a=5
Ini artinya variable a diisi dengan angka 5. Selanjutnya tambahkan lagi pada Code Editor
perintah berikut.
print(a)
Ini digunakan untuk mencetak isi variable a. Klik tombol Run Code dan amati yang dimuncul di
console.
a=5
print (a)
7. Comment pada R
Cobalah dijalankan dengan Run Code, dan jika lancar, maka Anda akan mendapatkan hasil
berikut.
Dari proses ini kelihatan bahwa comment tidak diproses oleh R, jadi yang ditampilkan hanya
hasil perhitungan matematika.
8. Vector pada R
Vector adalah suatu struktur data yang dapat menyimpan lebih dari satu data yang
digunakan pada di R.Penggunaannya sangat sederhana, yaitu menggunakan
fungsi c disertai data-data yang ingin disimpan.
ini artinya Anda menyimpan nilai 5, 10 dan 20 dalam satu struktur. Dan jika Anda ingin
menyimpan rangkaian
angka yang terutut, misalkan angka 1 sampai dengan 20 dapat diketikkan sebagai berikut.
c(1:20)
Terlihat perintah c(3, 10, 15) ini membuat tiga rangkaian angka yaitu 3, 10 dan 15 yang disimpan
dan ditampilkan bersamaan dalam suatu vector.
c(1:5)
> c(1:5)
[1] 1 2 3 4 5
Terlihat perintah c(1:5) membuat vector dengan lima rangkaian angka yang dimulai dari 1 dan
diakhiri nilai 5.
c (1:5)
10. Menggunakan Fungsi Summary
Kekuatan di R adalah fungsi analisa yang kaya, salah satunya adalah fungsi
bernama summary yang bisa digunakan
untuk mensimpulkan data yang lagi kita proses.
Cobalah ketik perintah untuk melihat karakteristik dari vector berikut.
summary(c(1:5))
Jalankan dan Anda akan mendapatkan hasil pada Console seperti berikut. Scroll ke bawah untuk
penjelasannya.
Ini artinya dari vector tersebut terdapat angka paling kecil 1 (Min), angka paling besar 5 (Max),
angka rata-rata 3 (Mean), dan angka tengah 3 (Median). Untuk 1st Qu dan 3rd Qu kita abaikan
dulu.
summary (c(1:5))
Course "R Fundamental for Data Science" ini adalah course pembuka DQLab untuk topik
pengolahan data menggunakan R.
Dengan durasi singkat, 15 menit. Anda akan mempelajari dan mendapatkan hal-hal berikut
pada course ini
1. Mengerti apa dan kenapa R digunakan oleh para data scientist dan dicari oleh
perusahaan besar dunia.
2. Menguasai dasar bahasa R seperti penggunaan teks, angka, dan rumus.
3. Menguasai penggunaan tipe data fundamental R.
4. Mengerti bagaimana membaca file Excel.
5. Mengenali bagaimana grafik dihasilkan di R.
6. Sertifikat pencapaian dari PHI-Integration dan Universitas Multimedia Nusantara
(Kompas Group).
7.
R adalah nama sebuah bahasa pemrograman sekaligus software untuk pengolahan data dan
grafik. R sangat popular saat ini karena memiliki jumlah fitur yang sangat besar - mencapai
puluhan ribu fitur.
Mulai dari membaca file teks, membaca database, menghasilkan berbagai grafik,
menghasilkan dashboard yang menarik, sampai ke penggunaan machine learning - semuanya
tersedia di R.
Selain itu, R bersifat gratis dan open source. Artinya, dengan R kita tidak perlu biaya lisensi
macam-macam untuk menggunakannya secara bebas dan luas.
Data Scientist dan R
Dunia saat ini penuh dengan data, akibat meluasnya penggunaan aplikasi smartphone dan
juga pemakaian sistem pada seluruh perusahaan. Namun data-data ini belum tentu menjadi
informasi yang dibutuhkan oleh organisasi dan bisnis bila tidak bisa diolah dengan baik.
Sekarang muncul sebuah disiplin ilmu untuk menjawab permasalahan tersebut, ilmu yang
mempelajari bagaimana mengolah data menjadi informasi yang berguna, yaitu data science.
Seseorang yang bekerja dengan dibekali ilmu data science dinamakan data scientist - saat ini
merupakan salah satu profesi paling hot menurut LinkedIn.
Untuk membantu pekerjaannya, data scientist perlu dibekali dengan aplikasi yang bagus - R
dengan segala kekayaan adalah jawabannya.
Lebih Cepat (Faster): Banyak fungsi R memberikan hasil jauh lebih cepat
dibandingkan dengan aplikasi lain.
Contoh: R dapat menghasilkan berbagai visualisasi yang menarik dalam waktu
singkat, sehingga data scientist dapat jauh lebih produktif dalam memahami data dan
menghasilkan informasi.
Lebih kaya fitur (Richer): Dengan puluhan ribu fitur yang terus berkembang, hampir
semua permasalahan data dapat dijawab oleh R. Sebagai contoh, untuk mengatasi
permasalahan optimasi stok di e-commerce, R memiliki fungsi menghasilkan
rekomendasi product packaging.
Telah terbukti (Proven): R sudah digunakan oleh banyak data scientist perusahaan
besar seperti Anz, Uber, dan Facebook dan memberikan solusi riil. Tidak heran jika
akhirnya dari kisah sukses ini, banyak lowongan data scientist mencamtumkan R
sebagai syarat keterampilan yang harus dimiliki.
Berbekal alasan-alasan tersebut, kami yakin Anda akan lebih percaya diri dengan membekali
diri belajar R!
1. Cobalah ketik teks atau code "Hello World" pada bagian panel Code Editor persis di
bawah bagian lesson ini.
2. Jalankan dengan menekan tombol .
3. Jika berjalan dengan lancar, Anda akan mendapatkan hasil seperti pada gambar
berikut.
Nomor 3 adalah output yang Anda akan dapatkan dimana teks "Hello World" dikirimkan ke
sistem DQLab dan dijalankan.
Sekarang mari kita tambahkan perintah berupa perhitungan matematika, ketik 1+5 di bawah
"Hello World".
Jalankan code tersebut, dan jika berhasil maka akan muncul hasil berikut di Console.
"Hello World"
1+5
9
"Budi"
> 9
[1] 9
> "Budi"
[1] "Budi"
9 Menampilkan angka 9
9 * 3
Klik tombol dan pada panel Console akan muncul hasil seperti berikut.
> 9 * 3
[1] 27
27 Hasil output.
Tampilan hasil terakhir harusnya terlihat sebagai berikut. Klik tombol Submit Code dan
lanjutkan ke bagian berikutnya.
9
"Budi"
9*3
print("Hello World")
print(3 + 4)
Dengan demikian, hasilnya akan sama apabila kita langsung mengetikkan teks ataupun
formula tersebut. Klik tombol Submit Code untuk melanjutkan ke bagian berikutnya.
print ("Hello World")
print (3+4)
01 dan 1 adalah dua angka yang dianggap berbeda pada saat pengiriman jawaban.
"12-01-1987" dan "12-1-1987" adalah hal berbeda pada saat mengirimkan jawaban.
Mari kita praktekkan dengan mengetikkan enam perintah berikut di code editor dan klik
"Submit Code" untuk mengirimkan jawaban.
01
1
"01-01-1980"
"1-1-1980"
"Budi"
"BUDI"
01
"01-01-1980"
"1-1-1980"
"Budi"
"BUDI"
Function
Kali ini kita akan belajar apa yang dinamakan function. Function adalah perintah R yang
memiliki dan menerima beberapa nilai teks maupun angka sebagai parameternya.
Mari kita lihat satu fuction yang akan kita sering kita gunakan, yaitu c. Fungsi c ini digunakan
untuk membuat urutan angka maupun teks.
Ketikkan perintah c(10:40) berikut pada bagian Code Editor. Perintah ini berguna untuk
membuat rangkaian angka dari 10 s/d 40.
c(10:40)
Klik tombol dan pada panel Console akan muncul tambahan output sebagai berikut.
> c(10:40)
[1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [26]
35 36 37 38 39 40
Sekarang ubahlah perintah di atas merubah huruf c menjadi C (dari hurf kecil menjadi huruf
besar).
C(10:40)
Klik tombol Run dan pada panel R Console akan muncul tambahan output sebagai berikut.
> C(10:40)
object not interpretable as a factor
Ini artinya perintah tersebut tidak dapat dijalankan dan mengakibatkan error atau kesalahan. Huruf c
dan C disini memiliki arti yang sangat berbeda.
Tugas Praktek
Hapus seluruh perintah pada Code Editor, kemudian buat suatu rangkaian angka 5 s/d 10
pada Code Editor dengan menggunakan function c.
c(5:10)
Variable
Angka-angka yang kita gunakan dapat juga disimpan dengan sesuatu yang
dinamakan variable. Variable memiliki nama yang dapat kita definisikan dan gunakan untuk
mengambil nilainya kembali.
Untuk memahami hal ini, cobalah ketik perintah berikut pada Code Editor.
budi_berat_kg <- 68
budi_berat_kg
santi_berat_kg
Jalankan keempat perintah di atas dengan mengklik dan hasilnya adalah sebagai berikut.
> budi_berat_kg
[1] 68
> santi_berat_kg
[1] 54.5
Penjelasan Hasil
Tugas
Lanjutkan penambahan code pada code editor dengan dua perintah berikut.
Jalankan dan jika muncul hasil sebagai berikut, klik tombol (submit) untuk
mengirimkan code ke sistem DQLab dan melakukan scoring apakah code Anda sudah benar
atau tidak.
> budi_berat_kg
[1] 68
> santi_berat_kg
[1] 54.5
> pi
[1] 3.14
budi_berat_kg <- 68
budi_berat_kg
santi_berat_kg
pi <- 3.14
pi
Comment pada R
Comment atau komentar adalah teks yang bisa dimasukkan di R, tapi tidak dianggap sebagai
code yang bisa dieksekusi. Comment ini biasanya digunakan sebagai catatan untuk
menjelaskan potongan code yang ada.
Membuat comment sangat mudah. Caranya adalah menuliskan tanda pagar (#) yang
kemudian diikuti dengan tulisan apapun.
Berikut adalah contoh perhitungan matematika yang diikuti oleh sebuah comment.
Ketik contoh tersebut dan jika berjalan dengan lancar maka Anda akan mendapatkan hasil
berikut.
Kesimpulan
Selamat, Anda telah menyelesaikan bab pertama mengenai apa itu R, hubungan dengan data
science dan kenapa data scientist menggunakannya sebagai alat bantu utama.
Selain itu, Anda juga telah menguasai keterampilan dasar R dengan beberapa praktek
berikut:
Vector
Vector adalah jenis data di R dengan struktur yang menyimpan deretan nilai (lebih dari satu
nilai) dengan tipe data sama. Jadi, jika tipe datanya teks maka seluruh data harus bertipe
teks. Demikian juga jika tipenya angka maka seluruh data angka semua.
Vector didefinisikan dengan nama function yang memilki satu huruf saja: c. Sebagai contoh
untuk membuat vector yang isinya angka dengan nilai 2, 5, dan 7, maka perintahnya
adalah c(2, 5, 7).
Cobalah ketik perintah tersebut di bagian bawah komentar "Ini adalah contoh vector untuk
angka numerik dengan 3 data c(4, 5, 6)" sehingga tampilan code editor tampak sebagai
berikut.
Jalankan perintah tersebut sehingga Anda akan mendapatkan hasil pada Console seperti
gambar berikut.
Ini artinya Anda telah membuat dan menambilkan sebuah vector yang berisi tiga 3 angka: 4, 5
dan 6. Terlihat tiga angka tersebut semua ditampilkan dalam satu baris.
Sekarang kita akan simpan vector ini ke dalam variable angka dan ditampilkan bukan
dengan menggunakan fungsi print pada bagian bawah comment "# Variable bernama angka
dengan input berupa vector".
# Ini adalah contoh vector untuk angka numerik dengan 3 data c(4, 5, 6)
c(4,5,6)
print (angka)
Jalankan perintah tersebut, jika berhasil akan muncul tampilan sebagai berikut.
> print(angka1)
[1] 1 2 3 4 5 6 7 8 9 10
> print(angka2)
[1] 1 2 3 4 5 6 7 8 9 10
Terlihat walaupun diisi dengan cara berbeda, tampilan isi dari kedua variable tersebut sama.
angka1 <- c(1,2,3,4,5,6,7,8,9,10)
print (angka1)
print (angka2)
print(nama_mahasiswa)
Jika berhasil dijalankan dengan baik, kita akan memperoleh hasil seperti berikut.
> print(nama_mahasiswa)
[1] "Amira" "Budi" "Charlie"
Terlihat vector yang ditampilkan adalah urutan teks "Amira", "Budi", dan "Charlie". Ini
menunjukkan bahwa vector bisa berisi teks selain angka.
# Variable nama_mahasiswa dengan input character
print(nama_mahasiswa)
Untuk mengambil isi vector, kita harus mengambil dari posisinya. Posisi ini diwakili
oleh angka urutan – yang disebut sebagai index.
Cara penulisan index di variable adalah angka yang diapit dengan kurung siku tunggal
atau ganda. Penulisan ini selanjutnya disebut sebagai accessor.
Jika index yang ingin diambil lebih dari satu, maka hanya boleh menggunakan kurung
siku tunggal.
Mari kita langsung contohkan agar lebih jelas. Pada code editor kita telah membuat suatu
variable vector angka dengan isi berupa angka numerik 20 sampai dengan 30.
yang jika ditampilkan akan terlihat sebagai berikut - cobalah jalankan code untuk
mendapatkan hasil ini.
> print(angka)
[1] 20 21 22 23 24 25 26 27 28 29 30
Terlihat nilai dari urutan ketiga pada vector angka ini adalah angka 22, bagaimana kita
mengambil nilai ini? Seperti petunjuk di atas, kita bisa gunakan accessor dan index dengan
perintah berikut.
print(angka[3])
Cobalah ketik perintah tersebut di bawah comment "# Tampilkan isi variable angka pada
posisi ke 3", dan jalankan code dengan tombol Run.
Jika berjalan dengan lancar maka akan tampil hasil sebagai berikut.
> print(angka[3])
[1] 22
print(angka[[5]])
> print(angka[[5]])
[1] 24
Bagaimana dengan indeks angka lebih dari satu dan berurutan, misalkan saya ingin
mengambil posisi keempat, kelima dan keenam dan menampilkannya?
Berikut adalah perintah yang perlu Anda ketikkan - dengan indeks menggunakan operator
titik dua (:).
print(angka[4:6])
Tambahkan perintah tersebut di bawah comment "# Tampilkan isi variable angka pada posisi
ke 4 s/d 6" dan jalankan. Jika berhasil maka akan keluar output berikut ini.
> print(angka[4:6])
[1] 23 24 25
Sekarang kita coba beralih ke vector teks. Buatlah variable dengan nama kode_prodi dengan
isi "DKV","ILKOM", dan "ICT" pada code editor - di bawah comment "# Buat vector teks
dengan nama kode_prodi yang diisi sesuai petunjuk soal".
Jangan jalankan dulu, cobalah Anda ketik sendiri perintah untuk menampilkan nilai urutan
ketiga pada variable kode_prodi ini di bawah comment "# Tampilkan isi indeks ketiga dari
kode_prodi" .
# Buat vector variable bernama angka yang isinya 20 s/d 30
print(angka)
print(angka[3])
print(angka[[5]])
print(angka[4:6])
# Buat vector teks dengan nama kode_prodi yang diisi sesuai petunjuk soal
print(kode_prodi[3])
Named Vector
Selain dengan angka, indeks pada vector juga dapat dilengkapi dengan nama untuk tiap
elemennya dengan menggunakan format penulisan name=value.
Mari kita langsung praktekkan dengan contoh, ketik named vector berikut - dimana kita
membuat vector angka dengan tiap urutan diberi nama.
Dengan mudah Anda mungkin bisa melihat bahwa vector ini mewakili nilai-nilai untuk mata
kuliah "statistik", "fisika" dan "ilmukomunikasi".
Code untuk membuat dan menampilkan named vector ini telah ada pada code editor.
Jalankan dan jika berhasil, maka akan muncul output berikut.
> print(nilai)
statistik fisika ilmukomunikasi
89 95 100
print(nilai["fisika"])
> print(nilai["fisika"])
fisika
95
nama = "Budi"
tempat_tinggal = "Jakarta"
tingkat_pendidikan = "S1"
print(nilai)
print(nilai["fisika"])
print(profil)
List
List adalah jenis data di R yang mirip dengan vector, perbedaannya adalah list dapat
menyimpan lebih dari satu jenis data.Untuk memasukkan isi ke dalam struktur data ini kita
gunakan function list.
Sebagai contoh, untuk membuat list yang isinya campuran jenis data angka 2, "Budi", dan
angka 4 – maka perintahnya adalah sebagai berikut.
list(2, "Budi", 4).
Panel code editor telah dilengkapi rangkaian contoh code untuk menghasilkan list dan
komentarnya sekaligus menjelaskan apa yang dilakukan. Jalankan dengan tombol
untuk melihat hasilnya.
Catatan: Perhatikan hasil eksekusi seperti di bawah. Terlihat outputnya agak berbeda dengan
vector - dimana tiap output terdapat dua tampilan accessor (kurung siku tunggal dan ganda).
Tugas
list_random
dati2
# Buat variable kota sesuai permintaan soal
Kota
List Index
Untuk mengambil isi list, kita bisa mengambil dari posisi index-nya, ketentuan dan caranya
sama persis dengan vector.
Contoh: Untuk mengambil posisi kedua dari variable list list_saya kita bisa gunakan
list_saya[2]
atau
list_saya[[2]].
Panel code editor telah dilengkapi rangkaian contoh code untuk list dan cara akses indeksnya
beserta penjelasan dalam bentuk comment. Jalankan dengan tombol untuk melihat
hasilnya.
Tugas
Buatlah variable dengan nama list_satu dengan isi angka 1, character “Online”, dan nilai
logical TRUE. Tampilkan index pertama dari list tersebut dengan accessor kurung siku
tunggal.
# Membentuk list dengan 2 angka dan 1 character
list_saya[2]
list_saya[[2]]
# Menampilkan index kedua s/d ketiga
list_saya[2:3]
list_satu[[1]]
Data Frame
Data frame adalah jenis struktur data yang dirancang untuk representasi table, yang terdiri
dari banyak kolom dengan tiap kolom berisi list ataupun vector dengan jumlah data yang
sama.
Untuk membuat data frame kita bisa gunakan function data.frame.
Panel code editor telah dilengkapi contoh code untuk membuat data frame untuk data
mahasiswa. Jalankan dengan tombol untuk melihat hasilnya.
Tugas
Tambahkan pada code editor, tugas-tugas berikut. Code-code yang sebelumnya ada di code
editor tidak boleh dihapus
fakultas <- c("Bisnis", "D3 Perhotelan", "ICT", "Ilmu Komunikasi", "Seni dan Desain")
info_mahasiswa
info_mahasiswa
Klik tombol (submit) untuk mengirimkan code ke sistem DQLab dan melakukan
scoring apakah code Anda sudah benar atau tidak.
fakultas <- c("Bisnis", "D3 Perhotelan", "ICT", "Ilmu Komunikasi", "Seni dan Desain")
info_mahasiswa$jumlah_mahasiswa
info_mahasiswa$fakultas
Kesimpulan
Anda telah belajar mengenai tiga tipe data fundamental yang sangat penting di R pada bab
ini, yaitu vector, list dan data frame. Tiga tipe data ini dapat diisi dengan lebih dari satu nilai.
Ringkasan dari tipe-tipe data tersebut adalah sebagai berikut.
Vector hanya bisa diisi dengan salah satu tipe data saja di seluruh elemennya,
misalkan angka ataupun teks. Pembuatan vector menggunakan fungsi c, dan bisa
diakses dengan accessor dengan angka indeks yang diapit kurung siku. Namun jika
berupa named vector, maka indeksnya adalah berupa teks.
List adalah tipe data yang bisa diisi dengan lebih dari satu tipe data di seluruh
elemennya, dengan campuran teks dan angka misalnya. Pembuatan list adalah
menggunakan fungsi list, dan seperti vector elemen pada list diakses dengan accessor
yang diapit kurung siku.
Data Frame adalah tipe data yang terdiri dari satu atau beberapa vector ataupun list.
Untuk membuat data frame kita gunakan fungsi data.frame, dan kita bisa mengakses
menggunakan accessor $ diikuti nama kolom, dan juga angka indeks.
Dengan memahami penggunaan vector, list dan data frame kita siap mempelajari
penggunaan banyak fungsi advanced di R, seperti menghasilkan grafik dan penggunaan
algoritma machine learning.
Package ggplot2
Pada dua bab sebelumnya, kita telah mampu menggunakan banyak perintah yang masih
dalam paket standard di R. Untuk kebanyakan kasus, fungsi-fungsi standard ini tidak cukup.
Nah, untuk fungsi yang lebih powerful seperti menghasilkan grafik yang advanced - kita perlu
menggunakan apa yang dinamakan package.
Untuk memahami konsep package ini, pada editor terdapat potongan code untuk
menghasilkan grafik. Cobalah jalankan, dan Anda akan mendapatkan error seperti ini.
Terlihat ada tampilan error berwarna merah yang menyatakan bahwa fungsi ggplot tidak
ditemukan. Ini karena fungsi tersebut bukan fungsi standar, tapi harus
menggunakan package ggplot2 dengan fungsi library.
Tambahkan code tersebut di bawah comment "#Menggunakan package ggplot2" dan
jalankan kembali.
library("ggplot2")
Jika berhasil, maka akan muncul grafik berikut yang menunjukkan jumlah mahasiswa
berdasarkan fakultas di salah satu universitas di Tangerang.
Dari grafik tersebut, terlihat Seni dan Desain adalah fakultas paling favorit dengan jumlah
mahasiswa terbanyak :)
fakultas <- c("Bisnis", "D3 Perhotelan", "ICT", "Ilmu Komunikasi", "Seni dan Desain")
info_mahasiswa
library("ggplot2")
#Membuat kanvas
gambar
Disini terlihat hasil ggplot2 disimpan pada variable gambar. Variable ini yang akan
menyimpan seluruh grafik dan digunakan untuk menggambar ketika digunakan sendiri pada
code editor dengan perintah berikut.
gambar
Penambahan bentuk, warna dan ukuran dilakukan dengan menggunakan tanda operator
plus ( + ) diikuti fungsi terkait. Sebagai contoh, untuk menggambar bentuk bar chart di atas
"kanvas" kita gunakan fungsi geom_barSebagai contoh, untuk menggambar bar chart di
atas "kanvas" kita gunakan fungsi
Berikut adalah penjelasan lengkap dari code yang terdapat pada code editor.
Code Penjelasan
Latihan Praktek
Mari kita sedikit improvisasi dari gambar plot tersebut dengan penambahan-penambahan
berikut ini.
Mari kita tambahkan judul "Jumlah Mahasiswa per Fakultas" pada chart untuk
memperjelas konteksnya. Ini bisa dilakukan dengan menambahkan lapisan judul
pada variable gambar dengan function ggtitle("Jumlah Mahasiswa per
Fakultas") sebagai berikut
Dengan cara yang sama, cobalah tambahkan sendiri lapisan untuk merubah caption
"jumlah_mahasiswa" menjadi "Jumlah Mashasiswa" dengan perintah ylab("Jumlah
Mahasiswa"). Jika berhasil maka caption sumbu Y akan berubah seperti berikut.
fakultas <- c("Bisnis", "D3 Perhotelan", "ICT", "Ilmu Komunikasi", "Seni dan Desain")
info_mahasiswa
library(ggplot2)
#Membuat kanvas
#Menggambar grafik
gambar
library(openxlsx)
mahasiswa <-
read.xlsx("https://storage.googleapis.com/dqlab-dataset/mahasiswa.xlsx",sheet =
"Sheet 1")
Dari code di atas, file yang dibaca dengan fungsi read.xlsx dan kemudian disimpan sebagai
variable mahasiswa (yang merupakan tipe data frame). File yang dibaca adalah
"mahasiswa.xlsx" pada sheet "Sheet 1".
#Menggunakan package ggplot2
library(ggplot2)
library(openxlsx)
#Membaca file mahasiswa.xlsx
#Menampilkan data
print(mahasiswa)
print(mahasiswa$Prodi)
Item Membuat Grafik Sebaran Membuat Grafik Sebaran Mahasiswa (2) Keterangan
Mahasiswa (1)
Hasil
Grafik
library(ggplot2)
library(openxlsx)
#Menggambar grafik
Gambar
Terlihat dari tahun yang mengalami peningkatan secara konsiten adalah fakultas "ICT" dan
"Seni dan Desain". Terlihat juga, fakultas "D3 perhotelan" baru ada di tahun 2017. Untuk
fakultas "Bisnis" dan "Ilmu Komunikasi" fluktuatif selama tiga tahun.
Catatan: Jika Anda tidak dapat melihat keseluruhan chart karena keterbatasan panel seperti
berikut, maka Anda bisa menggeser gutter sehingga dapat gambar penuh (lihat gambar
berikutnya).
Berikut adalah gambar penuh dari chart setelah kita mengatur layout panel dengan
menggeser gutter.
library(ggplot2)
#Menggunakan package openxlsx
library(openxlsx)
summarybyfakultas$tahun = as.factor(summarybyfakultas$tahun)
Pie Chart
Pie chart masih merupakan chart favorit bagi banyak analis untuk menunjukkan proporsi data.
Kebetulan, jumlah mahasiswa per fakultas adalah kasus proporsi yang bisa ditampilkan dengan pie
chart.
Pada code editor kita telah diisi dengan code yang menghasilkan pie chart dengan menggunakan
fungsi ggplot dan coord_polar. Cobalah jalankan code tersebut, dimana kita akan mendapatkan hasil
berikut.
Terlihat porsi fakultas "Seni dan Desain" dan "Ilmu Komunikasi" menempati porsi terbesar. Angka 0
s/d 5000 di luar dari pie chart menunjukkan rentang jumlah mahasiswa secara akumulatif.
Mari kita lihat contoh, mari kita lihat untuk fakultas Bisnis yang menempati porsi pie chart pada angka
0 dan di bawah 1000 (ditunjukkan dengan anak panah merah).
Ini konsisten dengan informasi dari grafik histogram sebelumnya, bahwa jumlah mahasiswa memang
di bawah angka 1000.
Dan kalau secara insting dari grafik tersebut, jika kita tambahkan jumlah mahasiswa fakultas "Bisnis",
"D3 Perhotelan", dan "ICT" maka totalnya tidak akan mencapai 2000 mahasiswa. Ini juga sudah
tergambarkan di pie chart ini.
library(ggplot2)
library(openxlsx)
#Membaca file mahasiswa.xlsx
mahasiswa <- read.xlsx("https://storage.googleapis.com/dqlab-dataset/mahasiswa.xlsx",sheet = "Sheet
1")
Filtering
Praktek sekaligus demo terakhir adalah mengenai filtering data sebelum ditampilkan dalam
bentuk grafik.
Cara untuk melakukan filtering di data frame adalah dengan menambahkan operator %in%
dengan input berupa vector. Contoh untuk melakukan filtering ini sudah terdapat pada script
di Code Editor.
Jalankan seluruh code tersebut, jika berjalan dengan lancar maka hasilnya akan terlihat
sebagai berikut.
Grafiknya sama dengan subbab "Tren Jumlah Mahasiswa dari Tahun ke Tahun" tapi sudah
dengan filter dua fakultas, yaitu "ICT" dan "Ilmu Komunikasi".
Ini semua bisa terjadi karena ada filtering dengan perintah berikut.
summarybyfakultas$tahun = as.factor(summarybyfakultas$tahun)
summarybyfakultas[summarybyfakultas$fakultas %in% c("ICT", "Ilmu Komunikasi"),]
Penutup
Dengan berakhirnya demo grafik terakhir, berakhir juga modul R Fundamental for Data
Science". Sepanjang kursus ini Anda sudah mendapatkan keterampilan R sebagai berikut:
Perjalanan awal ini telah membekali Anda untuk menguasai fitur R lainnya seperti advanced
data visualization (dashboard dan map), machine learning, dan otomatisasi big data.
Dataset kependudukan.dki dalam bentuk file teks (csv, tsv) dan dalam bentuk Excel.
Semuanya dengan isi data yang sama, namun ketika menggunakan R untuk
membaca, akan ditunjukkan karakteristik masing-masing yang perlu diperhatikan.
Dataset pelanggan dalam bentuk file Excel, dimana kita akan melakukan beberapa
proses pengolahan text dan tanggal di dataset ini.
Dataset transaksi dalam bentuk database MySQL, dimana penguasaan skillset SQL
yang diperlukan dapat dicapai.
Penutup
Data preparation atau data wrangling adalah proses yang memakan waktu dan tenaga paling
besar bagi seorang data scientist, yaitu sampai 80 persen. Detilnya, pembacaan sumber data
memakan waktu sampai 20 persen, dan mengorganisasikan dan membersihkan data
memakan waktu sampai 60 persen.
Dengan demikian, skillset untuk data wrangling ini merupakan suatu yang mutlak dikuasai
oleh para data scientist.
R menyediakan banyak function yang bisa digunakan untuk memudahkan Anda dalam
menguasai skillset data wrangling ini.
Course ini akan mencakup cukup banyak praktek data wrangling sebagai bekal untuk
mengolah data sehari-hari. Dimulai dari pemahaman mengenai konsep missing data (data
yang kosong) dan factor sebagai tipe data yang penting, Anda akan diajak tahap demi tahap
menguasai pengolahan teks, bekerja dengan tanggal, menggabungkan data, dan
mentransformasi struktur data.
Selamat memulai pelajaran data wrangling dengan R ini, happy learning!
Missing Value in R
Pendahuluan
Dalam perjalanan Anda sebagai data scientist ataupun data engineer, pasti akan menghadapi
kolom dengan sebagian data tidak terisi atau kosong. Ini disebut dengan missing value atau
nilai yang hilang.
Menyadari hal ini adalah satu tahap penting karena kita akan sadar bahwa hal tersebut
adalah lumrah terjadi.
Tahap selanjutnya, kita perlu dua hal:
Bagaimana missing value direpresentasikan, ini penting sehingga kita bisa identifikasi
apakah nilai hilang karena dari awal memang ga ada, apakah karena operasi
matematika, dan lain-lain.
Dengan mengetahui representasi ini, kita dapat melakukan sesuatu terhadapnya.
Atau singkat dapat dikelola (manage) dengan baik.
Kedua hal tersebut sangat penting terutama bagi Anda yang berangkat dari SQL ataupun
bahasa programming lain, dimana ada satu reprentasi missing value saja, yaitu NULL.
Sepanjang bab ini kita akan membahas representasi yang bisa dianggap missing value yaitu
NA, NULL dan NaN. Dan bagaimana kita melakukan banyak hal dengan missing value ini.
NA (Not Available)
NA adalah representasi utama dari missing value di R, dan merupakan suatu nilai atomik.
Artinya posisi NA sama dengan contoh nilai-nilai atomik bilangan seperti 1, 2 atau 100. Juga
sama dengan contoh nilai karakter seperti "a", "b", atau "g".
Karena angka dan karakter seperti contoh di atas sering disebut sebagai konstanta, maka NA
adalah konstanta untuk missing value.
Dengan demikian, secara singkat NA adalah:
Representasi missing value
Merupakan konstanta atau nilai atomik
NA tidak bisa digunakan sebagai variable karena merupakan keyword, dan perhatikan
penulisan NA dimana kedua karakter adalah huruf besar.
> NA
[1] NA
Angka [1] adalah posisi index dari konstanta (yang selalu bernilai 1) dan NA adalah nilainya
sendiri. Dan NA ini secara default adalah representasi missing value untuk tipe data logical.
Ini kita bisa cek dengan perintah yang menggunakan function typeof, sebagai berikut.
typeof(NA)
Hasilnya akan muncul sebagai berikut:
> typeof(NA)
[1] "logical"
Tentunya, NA adalah representasi missing value untuk seluruh tipe lain, tapi secara default
adalah untuk logical dulu. Namun akan kita jelaskan lebih jauh di bagian lain pada bab ini.
#Ketik nilai NA
NA
x <- 3
x == 3
Maka hasil eksekusi perintah di atas akan menghasilkan nilai TRUE seperti terlihat dari
potongan code lengkap berikut.
x <- 3
> x == 3
[1] TRUE
Nah, ini tidak berlaku untuk NA. Jadi jika nilai x kita isi dan cek dengan cara yang sama
sebagai berikut.
x <- NA
x == NA
is.na(NA)
c(1, 2, FALSE, 3)
[1] 1 2 0 3
Terlihat bahwa FALSE di atas dikonversi (beradaptasi) menjadi 0. Adaptasi ini juga disebut
dengan coerce di dokumentasi R.
Lalu bagaimana dengan missing value NA?
NA juga memiliki konstanta yang digunakan untuk beradaptasi, yaitu:
typeof(NA_real_)
> typeof(NA_real_)
[1] "double"
Namun jika menggunakan is.na maka seluruhnya akan mengembalikan hasil TRUE.
Untuk lebih jelasnya mari kita lakukan praktek berikut.
Tugas Praktek
Cobalah ketikkan empat function typeof untuk menggantikan bagian […1…] s/d […4…] code
editor, dengan masing-masing secara berurut mengecek NA_integer_, NA_real_,
NA_complex_ dan NA_character_.
Kemudian ketikkan lagi function is.na untuk menggantikan bagian […5…] s/d […8…] code
editor secara berurut untuk NA_integer_, NA_real_, NA_complex_ dan NA_character_.
Jika berhasil dijalankan, masing-masing baris perintah akan mengeluarkan hasil berikut.
[1] "integer"
[1] "double"
[1] "complex"
[1] "character"
[1] TRUE
[1] TRUE
[1] TRUE
[1] TRUE
typeof(NA_integer_)
typeof(NA_real_)
typeof(NA_complex_)
typeof(NA_character_)
is.na(NA_integer_)
is.na(NA_real_)
is.na(NA_complex_)
is.na(NA_character_)
c(1, 2, NA, 4, 5)
maka sebenarnya konstanta NA di atas akan diganti menjadi NA_real_. Namun tentunya ini
ga akan terlihat, hanya terjadi sebagai proses di belakang layar oleh R.
Tugas Praktek
Isi bagian […1…] pada code editor dengan variable bernama isi.vector yang isinya
c(1,2,3,NA,3,1). Kemudian kita akan menggunakan konstruksi lapply untuk mengecek semua
tipe, isi […2…] dengan variable yang telah kita buat, dan […3…] dengan function typeof.
Terakhir isi bagian […4…] dengan function is.na dan isi dengan variable isi.vector.
Jika berjalan dengan baik maka deretan hasil yang muncul adalah sebagai berikut.
[[1]]
[1] "double"
[[2]]
[1] "double"
[[3]]
[1] "double"
[[4]]
[1] "double"
[[5]]
[1] "double"
[[6]]
[1] "double"
[1] FALSE FALSE FALSE TRUE FALSE FALSE
#Membuat vector bernama isi.vector dengan isi bilangan, dimana salah satunya memiliki
missing value
NULL
NULL adalah nilai yang banyak digunakan di bahasa pemrograman lain ataupun SQL
(Structured Query Language) untuk merepresentasikan objek yang tidak ada atau null object
(missing object) atau nilai yang tidak ada (missing value).
Di dalam R, missing value telah direpresentasikan dengan NA. Nah, untuk missing object
inilah kita menggunakan NULL di R.
Atau lebih detilnya, NULL adalah suatu object khusus di R yang digunakan untuk
merepresentasikan nilai atau object yang tidak terdefinisikan.
Jika kita menampilkan isinya, maka akan terlihat hasil sebagai berikut.
> isi.vector
[1] 1 2 3 NA 5 7
Terlihat dari tampilan, tidak ada NULL disana. Mari kita pastikan lagi dengan menghitung
jumlah isi dari vector dengan function length.
> length(isi.vector)
[1] 6
Hasilnya adalah 6, padahal kita memasukkan 7 elemen. Dengan demikian terlihat bahwa
NULL memang mewakili undefined object dan tidak dianggap oleh vector. Dengan demikian
tidak menjadi bagian dari vector.
NA N
Apa itu? Adalah sebuah konstanta (variable yang tidak bisa Sebuah object unt
diubah lagi nilainya) sebagai indikator dari missing merepresentasika
value terdefinisi"
Variasi NA dapat berubah menjadi representasi variasi missing Tidak ada variasi
value dengan daftar berikut:
NA_integer_ untuk tipe data "integer"
NA_real_ untuk tipe data "double"
NA_complex_ untuk tipe data "complex"
NA_character_ untuk tipe data "character"
NA N
Contoh kasus ketika kita Ketika kita membaca data yang tidak memiliki nilai Ketika mengakses
akan menemukan object ini? tidak terdapat pad
Keterangan:
Artinya NA adalah representasi missing value yang "masih" memiliki nilai logika –
yang berfungsi sebagai indikator.
NULL sendiri adalah objek tidak berbentuk, maka itu tidak terdefinisi dan panjangnya
0.
Salah satu operasi yang akan menghasilkan NULL adalah pada saat kita mengakses nama
element yang tidak terdapat di dalam suatu list.
> isi.list
[[1]]
[1] 1
[[2]]
NULL
[[3]]
[1] 3
[[4]]
[1] NA
[[5]]
[1] 5
Terlihat dari tampilan, NULL diisi pada list di indeks kedua. Dan dengan demikian, jika
dihitung jumlah elemennya akan mendapatkan hasil 5.
> length(isi.list)
[1] 5
> 1/0
[1] Inf
> -20/0
[1] -Inf
5/0
> 0/0
[1] NaN
> log(100)
[1] 4.60517
> log(-100)
[1] NaN
Fungsi is.nan
Seperti halnya NA, jika kita membadingkan nilai NaN dengan menggunakan == maka hasilnya
bukan TRUE/FALSE tapi menjadi NA, seperti pada contoh berikut.
> NaN == NaN
[1] NA
Untuk membandingkan NaN kita bisa gunakan function is.nan, seperti pada contoh berikut.
> is.nan(NaN)
[1] TRUE
> is.na(NaN)
[1] TRUE
Dengan demikian, secara umum pada R bisa dikatakan NaN juga adalah missing value.
Namun tidak sebaliknya, semua nilai NA tidak akan mengembalikan nilai TRUE jika diperiksa
dengan fungsi is.nan.
> is.nan(NA)
[1] FALSE
Dengan level yang jelas seperti ini, kita bisa memisahkan mana missing values dan kemudian
mana saja bagian yang merupakan perhitungan yang menghasilkan angka yang tidak bisa
didefinisikan (not a number).
is.na(NaN)
is.nan(NA)
Menghitung Jumlah Missing Values dari satu
Vector
Setelah mengenal semua representasi missing value – dalam hal ini NA dan NaN – dan fungsi
untuk mengidentifikasinya, kita dapat melakukan banyak hal.
Salah satunya adalah mengetahui jumlah missing value yang terdapat pada data kita. Akan
banyak contoh pada bagian-bagian berikutnya, tapi untuk memulai kita gunakan contoh
vector.
Untuk melakukan perhitungan banyaknya nilai missing value di vector, kita gunakan
gabungan function sum dan is.na sebagai berikut:
sum(is.na( variable_vector ) == TRUE)
Penjelasan konstruksi tersebut adalah sebagai berikut.
Komponen Keterangan
Function untuk menjumlahkan banyaknya
sum(…)
elemen
Konstruksi untuk mengidentifikasi elemen
is.na(…) == TRUE
mana yang merupakan missing value
Adalah variable yang isinya adalah vector
variable_vector
dengan deklarasi c(…)
Kesimpulan
Selamat, dengan telah melewati bab ini maka Anda telah menguasai dasar untuk mengenal
dan menangani missing value.
Ini penting karena tanpa pengetahuan yang cukup mengenai missing value ini, Anda akan
mengalami kesulitan ketika berhadapan dengan beragam jenis data dan proses perhitungan
yang pada kenyataannya memang tidak rapi.
Mari kita rangkum apa yang telah Anda tempuh sejauh ini:
Dengan bekal materi tersebut, kita telah siap untuk mengolah data pada saat membaca
berbagai variasi data yang memiliki missing value.
Factor
Pendahuluan
Factor adalah suatu tipe variabel yang intensif digunakan di R – dengan demikian menjadi
sangat penting untuk mempelajari Factor ini.
Walaupun awalnya kelihatan sederhana, namun Factor adalah salah satu bagian dari R yang
paling sering ditanyakan. Penyebabnya karena fungsi analisa dan grafik yang banyak
memanfaatkan factor dan kadang hasilnya tidak sesuai – contoh kasus dan solusinya
termasuk yang akan dibahas pada bab ini.
Secara keseluruhan, berikut adalah apa yang akan Anda pelajari mengenai factor pada bab
ini:
Dengan menguasai keterampilan menggunakan factor ini, Anda akan lebih siap untuk
melakukan banyak hal di R.
Dengan demikian, factor menyimpan nilai-nilai yang terbatas (diskrit). Nama bulan terdiri
dari 12 nilai yaitu dari Januari s/d Desember.
Jika tidak terbatas atau kontinu, misalkan angka berat seperti 64.5 kg, 11.2 kg, 80.39 kg, dan
seterusnya – maka ini tidak bisa digolongkan sebagai factor.
Karena sifat data dengan nilai terbatas ini, factor sering disebut juga sebagai categorical
variable atau variabel kategorik.
Membuat Factor di R
Factor dapat dibuat di R dengan function factor, dengan syntax paling sederhana sebagai
berikut:
factor( x = vector)
atau
factor(vector)
Sebagai contoh, untuk membuat factor dari tiga nama bulan pertama pada kalender kita
gunakan perintah berikut:
factor(c("Jan","Feb","Mar"))
Terlihat ada dua hasil, yaitu nilai yang dimasukkan dan ada satu lagi output Levels. Berikut
adalah penjelasan dari hasil di atas.
Hasil Keterangan
[1] adalah tampilan output dengan hasil
tampilan dimulai pada indeks ke 1
[1] Jan Feb Mar
Jan Feb Mar adalah tampilan dari nilai
factor
Levels: Feb Jan Mar Levels: adalah atribut yang menempel
pada setiap faktor dan berisi daftar diskrit
dari variasi nilai-nilai yang terdapat pada
faktor.
Untuk kasus ini terdapat tiga nilai variasi
yaitu Feb Jan Mar – dan kebetulan sama
dengan jumlah nilai yang terdapat pada
factor saat ini, tetapi dengan urutan yang
berbeda dengan tampilan isian factor.
#Buatlah factor dengan isi nilai teks "Jan", "Feb", dan "Mar"
$levels
[1] "Feb" "Jan" "Mar"
$class
[1] "factor"
#Variable factor bernama faktor.bulan dengan nilai teks "Jan", "Feb", dan "Mar"
attributes(faktor.bulan)
levels(variable)
class(variable)
levels(faktor.bulan)
class(faktor.bulan)
factor(c("Jan","Feb","Mar","Jan","Mar","Jan"))
Untuk penjelasannya, mari kita perhatikan ilustrasi dari perintah factor berikut:
factor(c("Jan","Feb","Mar"))
Proses ini diilustrasikan pada gambar berikut. Untuk penjelasan, lihat paragraf setelah
gambar ini.
Proses dari terjemahan perintah di atas:
Dan mari kita perhatikan satu lagi contoh ilustrasi dari pengembangan factor di atas:
factor(c("Jan","Feb","Mar","Jan","Mar"))
Dengan demikian, kita simpulkan kembali dari ilustrasi di atas bahwa nilai dari factor
sebenarnya adalah nilai bilangan bulat (integer) dengan nilai-nilai kategoris disimpan pada
atribut levels.
as.integer(variable factor)
as.integer(factor.bulan)
Jika kita ingin ganti "Jan" (posisi ke 2 pada levels) menjadi "Januari", maka perintah yang
kita gunakan adalah:
levels(factor.bulan)
[2] <- "Januari"
#Mengganti levels
factor.bulan
factor.umur
Na dan NaN akan menjadi bagian dari isi factor, NULL akan dihilangkan
Hanya NaN yang akan dikenali sebagai levels
Terlihat nilai NULL dibuang di tampilan isi factor, kemudian pada levels nilai NA juga
dibuang.
#Buatlah variable factor.lokasi dengan isi berupa vector c("Bandung", "Jakarta", NA, "Jakarta", NaN,
"Medan", NULL, NULL, "Bandung")
factor.lokasi <- factor(c("Bandung", "Jakarta", NA, "Jakarta", NaN, "Medan", NULL, NULL, "Bandung"))
#Tampilkan factor.lokasi
factor.lokasi
Hanya nilai NULL yang tidak terhitung sebagai bagian dari factor.
#Buatlah variable factor.lokasi dengan isi berupa vector c("Bandung", "Jakarta", NA, "Jakarta", NaN,
"Medan", NULL, NULL, "Bandung")
factor.lokasi <- factor(c("Bandung", "Jakarta", NA, "Jakarta", NaN, "Medan", NULL, NULL, "Bandung"))
length(factor.lokasi)
factor(…, levels = …)
Sebagai contoh, agar levels bernilai urut dari "Jan" s/d "Mar" maka pada saat membuat
factor kita harus sisipkan argumen labels sebagai berikut:
Cobalah perhatikan contoh ilustrasi dari dua pembuatan factor, dengan dan tanpa argumen
levels.
#Variable factor dengan isi vector c("Jan","Feb","Mar","Jan","Mar")
Kesimpulan
Factor adalah suatu tipe variabel yang intensif digunakan di R – dengan demikian menjadi
sangat penting untuk mempelajari Factor ini.
Dari praktek keseluruhan yang telah dilakukan, kita telah mencapai tujuan untuk
mempelajari factor dari aspek berikut:
Dengan menguasai keterampilan menggunakan factor ini, Anda sudah lebih siap untuk
melakukan banyak hal di R.
Teks file dengan format csv (comma separated value) dengan nama
dkikepadatankelurahan2013.csv.
Teks file dengan format tsv (tab separated value) dengan nama
dkikepadatankelurahan2013.tsv.
File Excel dengan format xlsx dengan nama dkikepadatankelurahan2013.xlsx.
Fokus untuk bab ini adalah membaca ketiga sumber data saja tanpa pengolahan lebih lanjut
– agar materi bisa lebih terfokus.
Beberapa bagian dari bab ini hampir sama dari sisi function yang digunakan pada bab
Introduction to R dan Data Visualization with ggplot2, namun lebih detil melihat struktur data
hasil dari pembacaan file.
Dataset Kependudukan Jakarta
Dataset yang akan kita gunakan sepanjang praktek course ini adalah data wilayah dan
kepadatan kependudukan pemerintah provinsi DKI Jakarta tahun 2013.
DQLab sudah mengambil dan konversi file ini untuk digunakan dalam praktek kita.
Namun jika diinginkan, sumber dataset ini dapat didownload dari data.go.id dengan url
lengkap berikut:
https://storage.googleapis.com/dqlab-dataset/datakependudukandki-dqlab.csv
Data kependudukan dipilih karena hampir seluruh organisasi, termasuk bisnis dan institusi
pemerintah memerlukan ini untuk mengambil keputusan strategik. Sebagai contoh, dimana
saya perlu membuka toko atau kantor cabang? Produk apa yang bakal laku di area tersebut?
Kemudian struktur dari dataset ini perlu diolah lebih lanjut agar optimal. Atas dasar kedua
alasan inilah, data kependudukan dipilih untuk course data wrangling with R.
Berikut adalah tampilan data kependudukan DKI Jakarta tersebut jika dibuka di aplikasi
Notepad. Perhatikan tanda pemisah antar kolom adalah menggunakan koma.
Dan ini adalah tampilan jika data tersebut dibuka di aplikasi Excel.
Terlihat bahwa ada 12 kolom (header dengan huruf H s/d S) yang kosong. Ini akan terbaca
sebagai missing value.
Data tersebut memiliki 25 variable kolom dengan penjelasan sebagai berikut:
TAHUN: Tahun
NAMA PROVINSI: Nama provinsi di DKI Jakarta, dan nilainya hanya ada satu
NAMA KABUPATEN/KOTA: Nama kabupaten/kota di DKI Jakarta
NAMA KECAMATAN: Nama kecamatan di DKI Jakarta
NAMA KELURAHAN: Nama kelurahan di DKI Jakarta
LUAS WILAYAH (KM2): Luas wilayah (km persegi)
KEPADATAN (JIWA/KM2): Kepadatan penduduk (jiwa/km2)
35-39 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 35-39 tahun
35-39 Perempuan: Jumlah penduduk perempuan dengan rentang umur 35-39 tahun
40-44 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 40-44 tahun
40-44 Perempuan: Jumlah penduduk perempuan dengan rentang umur 40-44 tahun
45-49 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 45-49 tahun
45-49 Perempuan: Jumlah penduduk perempuan dengan rentang umur 45-49 tahun
50-54 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 50-54 tahun
50-54 Perempuan: Jumlah penduduk perempuan dengan rentang umur 50-54 tahun
55-59 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 55-59 tahun
55-59 Perempuan: Jumlah penduduk perempuan dengan rentang umur 55-59 tahun
60-64 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 60-64 tahun
60-64 Perempuan: Jumlah penduduk perempuan dengan rentang umur 60-64 tahun
65-69 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 65-69 tahun
65-69 Perempuan: Jumlah penduduk perempuan dengan rentang umur 65-69 tahun
70-74 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 70-74 tahun
70-74 Perempuan: Jumlah penduduk perempuan dengan rentang umur 70-74 tahun
>75 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur di atas 75 tahun
>75 Perempuan: Jumlah penduduk perempuan dengan rentang umur di atas 75
tahun
Hampir seluruh kolom berisi nilai angka, kecuali empat kolom berikut: NAMA
PROVINSI, NAMA KABUPATEN/KOTA, NAMA KECAMATAN, dan NAMA KELURAHAN.
Komponen Deskripsi
nama variable yang digunakan untuk menampung
penduduk.dki
data dari contoh dataset
read.csv function yang digunakan untuk membaca contoh
dataset yang berupa file
lokasi dataset yang terdapat di web DQLab. Jika
lokasi file dan aplikasi R terdapat di komputer lokal
https://storage.googleapis.com/dqlab-
Anda, maka gantilah dengan lokasi file di lokal.
dataset/customer_segments.txt Misalkan c:\data\customer_segments.txt
Jika terjadi error berikut, cobalah periksa kembali penulisan code – huruf besar, huruf kecil
dan juga penulisan lokasi file – dengan teliti.
Error in file(file, "rt") : cannot open the connection
Jika tidak terjadi error maka langkah selanjutnya adalah menampilkan isi data dengan
mengetikkan nama variable pelanggan pada code editor sebagai berikut.
penduduk.dki
Hasil eksekusi perintah ini sebagian akan tampak sebagai berikut.
Terlihat isi data dari tujuh kolom pertama dan terdapat nomor baris pada tiap data yang
ditampilkan.
#Membaca dataset dengan read.csv dan dimasukkan ke variable penduduk.dki
str(penduduk.dki)
Tugas Praktek
Gantilah bagian […1…] pada code editor dengan perintah str yang menggunakan input
variable penduduk.dki.
Jika berjalan dengan lancar, maka outputnya sebagian akan terlihat sebagai berikut.
> str(penduduk.dki)
'data.frame': 267 obs. of 37 variables:
$ TAHUN : int 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
$ NAMA.PROVINSI : Factor w/ 1 level "PROVINSI DKI JAKARTA": 1 1 1 1 1 1 1 1 1 1 ...
$ NAMA.KABUPATEN.KOTA : Factor w/ 6 levels "JAKARTA BARAT",..: 6 6 6 6 6 6 2 2 2
2 ...
$ NAMA.KECAMATAN : Factor w/ 44 levels "CAKUNG","CEMPAKA PUTIH",..: 22 22 22 21 21 21
9 9 9 9 ...
$ NAMA.KELURAHAN : Factor w/ 267 levels "ANCOL","ANGKE",..: 165 164 163 168 167 166
55 24 195 194 ...
$ LUAS.WILAYAH..KM2. : num 0.91 3.76 3.59 0.59 1.57 1.39 2.58 1.26 1.12 1.14 ...
$ KEPADATAN..JIWA.KM2.: int 6779 1705 628 3625 3084 1968 1350 14584 18987 14465 ...
$ X : logi NA NA NA NA NA NA ...
$ X.1 : logi NA NA NA NA NA NA ...
$ X.2 : logi NA NA NA NA NA NA ...
…
Untuk baris di bawahnya adalah penjelasan dari tiap kolom/variable data yang terdiri dari:
Nama kolom
Tipe data kolom
Isi dari kolom tersebut
Jika Factor maka ada tambahan indexnya
Berikut penjelasan hasil dalam bentuk ilustrasi dari 3 kolom, yaitu TAHUN,
NAMA.KELURAHAN, dan X.
summary(penduduk.dki)
Dataset file untuk contoh tsv ini dapat Anda download di url berikut:
https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.tsv
Untuk membaca file tersebut dengan perintah read.csv adalah sebagai berikut.
penduduk.dki <-
read.csv("https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan20
13.tsv", sep="\t")
#Membaca dataset dengan read.csv dan dimasukkan ke variable penduduk.dki
penduduk.dki <-
read.csv("https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.tsv", sep="\t")
penduduk.dki
library(openxlsx)
#Membaca dataset dengan read.xlsx dan dimasukkan ke variable penduduk.dki
penduduk.dki.xlsx <-
read.xlsx(xlsxFile="https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.xlsx")
str(penduduk.dki.xlsx)
Kesimpulan
Anda telah menyelesaikan bab tentang membaca sumber data dengan tiga format, yaitu:
Walaupun terlihat sederhana dan pendek dibanding bab lain, namun beberapa praktek pada
bab ini memiliki metodologi dan fungsi penting yakni:
Bagaimana kita melakukan profil dengan function str dari tiap kali pembacaan file.
Dapat mengerti output yang dihasilkan oleh function str.
Dengan demikian, kita menjadi aware atau lebih perhatian karena perilaku yang
berbeda ketika menangani kolom kosong dan juga pada saat penamaan variable
kolom.
Structure Transformation
Pendahuluan
Pada bab sebelumnya, terlihat file teks dan Excel yang dibaca memiliki masalahnya sendiri-
sendiri. Sebagai contoh, read.csv mengakomodir kolom-kolom kosong sehingga harus kita
buang. Sedangkan read.xlsx tidak menghasilkan Factor sehingga kita perlu waktu dan tenaga
tambahan untuk mengidentifikasi dan mengolah kolom yang bersifat kategorik tersebut
dengan melakukan konversi kolom tersebut menjadi Factor.
Selain itu terlihat juga ada beberapa kolom yang harusnya bisa dijumlahkan menjadi satu
kolom – yaitu kolom 35-39.Perempuan, 40-44.Perempuan, dan seterusnya – menjadi kolom
jumlah. Kemudian informasi umur di nama kolom tersebut sebenarnya dapat kita pisahkan
menjadi kolom tersendiri.
Perkenalan function dan latihan untuk transformasi struktur seperti ini akan dilakukan
sepanjang bab ini.
Function names
Pada bab sebelumnya, kita menggunakan function str untuk melihat ringkasan dari struktur
nama, tipe data, dan isi dari data.frame hasil pembacaan file.
Namun jika kita hanya ingin melihat nama-nama kolom saja, bisa menggunakan function
bernama names, dengan konstruksi berikut.
names(variable)
#Membaca dataset csv
penduduk.dki.csv
<-read.csv("https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.csv", sep=",")
#Menggunakan names untuk variable penduduk.dki.csv
names(penduduk.dki.csv)
Dengan posisi adalah nomor indeks dari posisi nama kolom yang ingin diubah. Berikut
adalah contoh dimana kita merubah nama kolom dari TAHUN ke PERIODE (posisi 1) dari
dataset kita.
names(penduduk.dki.csv)[1] <- "PERIODE"
penduduk.dki.csv <-read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv",
sep=",")
names(penduduk.dki.csv)
Dengan rentang_posisi adalah daftar nomor dari posisi indeks dari nama kolom yang ingin
diubah. Berikut adalah contoh dimana kita merubah nama kolom dari TAHUN ke PERIODE
(posisi 1) dari dataset kita.
penduduk.dki.csv <-read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv",
sep=",")
names(penduduk.dki.csv)
Komponen Deskripsi
Variable data
frame dari hasil
penduduk.dki.csv
pembacaan
dataset
Artinya data
frame
[ , …]
mengambil
kolom ke …
! Tanda bukan
Daftar dari
semua kolom
names(penduduk.dki.csv) dari variable
penduduk.dki.cs
v
Operator untuk
mengambil data
%in%
dari vector
setelahnya
Vector dari
c("X","X.1","X.2","X.3","X.4","X.5","X.6","X.7","X.8","X.9","X. nama semua
10") kolom yang
akan dibuang
Atau terjemahan dari seluruh konstruksi tersebut adalah mengambil data dari data.frame
penduduk.dki.csv dengan kolom-kolom yang tidak termasuk pada "X", "X.1", "X.2", "X.3", dan
seterusnya sampai dengan "X.10".
#Membaca dataset csv
penduduk.dki.csv <-read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv",
sep=",")
as.factor(data.frame$namakolom)
library(openxlsx)
penduduk.dki.xlsx <-
read.xlsx(xlsxFile="https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.xlsx")
penduduk.dki.xlsx$NAMA.PROVINSI <-as.factor(penduduk.dki.xlsx$NAMA.PROVINSI)
str(penduduk.dki.xlsx)
Dengan ada pola nama seperti itu, kita bisa mengambil dengan function grep dengan syntax
berikut.
Pola teks yang digunakan oleh grep adalah menggunakan regular expression (regex). Regex
sendiri adalah konstruksi pola yang sangat komplit untuk mengolah teks, namun untuk case
kita gunakan teks sederhana saja sebagai berikut:
[1] 9 11 13 15 17 19 21 23 25
Yang merupakan daftar posisi dari nama kolom yang mengandung teks "perempuan".
library(openxlsx)
penduduk.dki.xlsx <-
read.xlsx(xlsxFile="https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.xlsx")
names(penduduk.dki.xlsx[pola_nama_perempuan])
names(penduduk.dki.xlsx[pola_nama_laki_laki])
penduduk.dki.xlsx$PEREMPUAN35TAHUNKEATAS
Kolom baru ini kita bisa isi, misalkan dengan penjumlahan dari kolom-kolom dari dataset itu
sendiri meggunakan function rowSums dari kolom-kolom data.frame. Syntaxnya adalah
sebagai berikut:
rowSums(data.frame)
Sebagai contoh – menyambung dari praktek sebelumnya juga – untuk menjumlahkan kolom
yang mengandung teks "perempuan" sebagai berikut:
rowSums(penduduk.dki.xlsx[,grep(pattern="perempuan", x = names(penduduk.dki.xlsx),
ignore.case=TRUE)])
Dan untuk menambahkan hasil penjumlahan ini ke kolom baru di atas, kita gabungkan
perintahnya dalam bentuk sebagai berikut.
penduduk.dki.xlsx$PEREMPUAN35TAHUNKEATAS <-
rowSums(penduduk.dki.xlsx[grep(pattern="perempuan", x = names(penduduk.dki.xlsx),
ignore.case=TRUE)])
Tugas Praktek
library(openxlsx)
penduduk.dki.xlsx <-
read.xlsx(xlsxFile="https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.xlsx")
penduduk.dki.xlsx$PEREMPUAN35TAHUNKEATAS <-
rowSums(penduduk.dki.xlsx[pola_nama_perempuan])
Kita mulai dari tahap pertama pada praktek kali ini, dimana kita akan merubah struktur data
di atas menjadi berikut.
NAMA.KECAMATAN NAMA.KELURAHAN DEMOGRAFIK JUMLAH
GAMBIR GAMBIR 35-39.Laki-Laki 166
GAMBIR GAMBIR 35-39.Perempuan 174
GAMBIR CIDENG 35-39.Laki-Laki 850
GAMBIR CIDENG 35-39.Perempuan 748
GAMBIR PETOJO UTARA 35-39.Laki-Laki 954
GAMBIR PETOJO UTARA 35-39.Perempuan 920
Terlihat nama kolom "35-39.Laki-Laki" dan "35-39.Perempuan" dipivot menjadi nilai baris
data di bawah kolom "DEMOGRAFIK".
Kemudian angka-angka jumlah penduduk yang tadinya di bawah kedua kolom tersebut
sekarang ada di bawah kolom "JUMLAH".
Untuk melakukan transformasi struktur ini, kita akan gunakan function melt dari package
reshape2. Berikut adalah contoh penggunaannya:
library(reshape2)
penduduk.dki.xlsx <-
read.xlsx(xlsxFile="https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.xlsx")
penduduk.dki.transform
Split Fields
Pada praktek sebelumnya, kita telah melakukan transformasi data kolom ke baris seperti
berikut.
NAMA.KECAMATAN NAMA.KELURAHAN DEMOGRAFIK JUMLAH
GAMBIR GAMBIR 35-39.Laki-Laki 166
GAMBIR GAMBIR 35-39.Perempuan 174
GAMBIR CIDENG 35-39.Laki-Laki 850
GAMBIR CIDENG 35-39.Perempuan 748
GAMBIR PETOJO UTARA 35-39.Laki-Laki 954
GAMBIR PETOJO UTARA 35-39.Perempuan 920
Tahap selanjutnya adalah memisahkan kolom "DEMOGRAFIK" yang memiliki dua informasi
ini menjadi dua kolom – yaitu "RENTANG UMUR" dan "JENIS KELAMIN".
NAMA.KECAMATAN NAMA.KELURAHAN RENTANG.UMUR JENIS.KELAMIN JUMLAH
GAMBIR GAMBIR 35-39. Laki-Laki 166
GAMBIR GAMBIR 35-39 Perempuan 174
GAMBIR CIDENG 35-39 Laki-Laki 850
GAMBIR CIDENG 35-39 Perempuan 748
GAMBIR PETOJO UTARA 35-39 Laki-Laki 954
GAMBIR PETOJO UTARA 35-39 Perempuan 920
Untuk mencapai tujuan ini, kita akan menggunakan tiga konstruksi perintah.
Perintah pertama adalah menggunakan function colsplit sebagai berikut.
colsplit(penduduk.dki.transform$DEMOGRAFIK,"\\.",c("RENTANG.UMUR","JENIS.KELAMIN"))
Komponen Deskripsi
Function untuk memecah satu variable menjadi
colsplit
beberapa variable
penduduk.dki.transform$DEMOGRAFI
Artinya data frame mengambil kolom ke …
K
Karakter pemisah, dalam hal ini tanda titik (.).
"\\." Khusus untuk tanda titik harus diisi dengan
didahului backslash dua kali
c("RENTANG.UMUR", Vector yang berisi nama-nama variable baru hasil
"JENIS.KELAMIN") pemecahan variable
Perintah kedua adalah perintah untuk memasukkan variable hasil pecahan ke dalam dua
kolom di data.frame dengan cara berikut.
Komponen Deskripsi
penduduk.dki.transform Artinya data frame mengambil kolom ke …
[…] Simbol karakter untuk index
c("RENTANG.UMUR",
Vector yang berisi nama-nama variable baru
"JENIS.KELAMIN")
Dan perintah ketiga adalah menghilangkan kolom DEMOGRAFIK dari data frame sebagai
berikut.
Dengan memasukkan NULL maka kolom akan DEMOGRAFIK akan dihilangkan dari
data.frame penduduk.dki.transform.
library(openxlsx)
library(reshape2)
penduduk.dki.xlsx <-
read.xlsx(xlsxFile="https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.xlsx")
Kesimpulan
Pada bab ini Anda telah mempelajari bagaimana merubah struktur suatu data.frame
sehingga nantinya akan lebih mudah untuk diolah pada proses berikutnya.
Operasi perubahan itu antara lain adalah:
Kami sarankan agar Anda sering melakukan latihan untuk hal ini. Sehingga pada saat masuk
ke materi Part 2 dari data wrangling akan lebih lancar.
Missing Value.
Struktur data kategori bernama Factor.
Membaca file-file teks dan Excel – yang paling banyak ditemui sehari-hari.
Melakukan perubahan struktur data sehingga cocok digunakan lebih lan
Dasar-dasar Statistik
Pendahuluan
Statistika adalah ilmu yang mempelajari cara pengumpulan data, menganalisis data untuk
mendapatkan kesimpulan informasi sampai dapat dijadikan dasar pembuatan kebijakan.
Definisi diatas mirip dengan tugas dari seorang Data Science yaitu mulai dari ekplorasi data,
modelling untuk mendapatakan pola yang tersembunyi dari data kemudian
menemukan Insight untuk dasar kebijakan (data-driven).
Kenapa harus belajar statistik ?
Ilmu Statistik fungsinya untuk mengolah data, yang bisa angka maupun bukan angka.
Statistik merupakan pondasi awal sebelum belajar Data Science. Alasannya, banyak tools
data science merupakan pengembangan dari teknik statistik, mulai dari sederhana sampai
yang rumit.
Agar dapat memahami konsep-konsep tersebut, pada bab ini juga disertakan satu dataset file
dengan nama data_intro.csv yang akan dijadikan file praktek di R.
Gambaran diatas dapat menjelaskan fungsi dari statistik, yaitu kita dapat mengetahui
karakteristik dari populasi melalui sampel yang kita miliki.
Kemudian untuk mengukur karakteristik dari sampel dan populasi, dengan melihat nilai
statistik dan parameter. Untuk lebih jelasnya dapat dilihat pengertian berikut
Perbedaan antara statistik dan parameter adalah sebagai berikut:
Statistik lebih banyak di cari nilainya daripada parameter, alasannya adalah lebih
menghemat biaya,waktu dan tenaga. Selain itu, pengambilan sampel sebenarnya sudah
dapat mewakili populasi.
Dan secara praktis, kita tidak mungkin melakukan pengambilan populasi karena dapat
bersifat merusak. Contoh: pengambilan sample dari produksi seluruh bola lampu untuk
menguji kandungan di dalamnya. Atau pengambilan seluruh populasi udang dari suatu
tambak.
Nilai estimasi didapatkan dari data kuantitatif dan kualitatif, untuk mengetahui perbedaanya
akan dijelaskan pada subbab selanjutnya.
Data Kuantitatif dan Kualitatif
Kualitatif dan Kuantitatif
Selanjutnya bagaimana untuk mendapatkan nilai karakteristik dari data kuantitatif dan
kualitatif, jawabanya yaitu kita harus menggolongkan kedalam skala pengukuran data.
Kenapa harus dilakukan?
Agar data mudah untuk diolah sehingga mendapatkan nilai statistik
Nominal: adalah skala yang diberikan hanya sebagai label saja, tidak mengandung
pengertian tingkatan.
Contoh: Jika pria =1 dan wanita = 2, artinya disini 1 dan 2 adalah nominal yang
mewakili pria dan wanita. Disini nilai 2 tidak lebih besar dari nilai 1.
Interval: adalah skala yang mempunyai sifat ordinal dan mengandung jarak(interval).
Misalnya: harga pakaian merk A 100 ribu, harga pakaian merk C 200 ribu, artinya harga
pakian merk A dan C memiliki interval 100 ribu
Rasio: adalah skala yang mempunyai sifat nominal, ordinal, dan interval, serta
mempunyai nilai rasio antar objek yang diukur.
Contoh: harga pakaian merk A 100 ribu, harga pakaian merk C 200 ribu. Rasio harga
pakaian A dengan pakaian C adalah ½. Sehingga dapat dikatakan bahwa harga
pakaian C harganya 2 kali pakaian A.
Dari penjelasan diatas dapat kita simpulkan bahwa data kualitatif dapat kita golongkan
menjadi skala nominal dan ordinal. Sedangkan untuk data kuantitatif maka digolongkan
menjadi Interval dan Rasio.Skala pengukuran nominal dan ordinal pada R di definisikan
sebagai factor atau sering disebut data kategorik sedangkan interval dan rasio di definisikan
sebagai numerik.
Dataset Tingkat Kepuasan Pelanggan
Dataset yang akan di pakai dalam course ini adalah data tentang kepuasan konsumen
terhadap suatu produk pakaian. Dataset ini ada dalam file bentuk format file CSV dengan
nama https://storage.googleapis.com/dqlab-dataset/data_intro.csv. Data ini juga dilengkapi
karakteristik umum dari konsumen.
Berikut adalah tampilan dari dataset tersebut jika dibuka dengan aplikasi notepad.
Terlihat pemisah antar kolomnya menggunakan tanda titik koma. Terdiri dari sembilan
kolom dan 20 baris data
Dan berikut adalah tampilan dari dataset tersebut jika dibuka dengan aplikasi spreadsheet.
ID Pelanggan: Kode pelanggan yang sifatnya unik, tidak ada data lain dengan kode
yang sama. Kode ini dalam bentuk yang sangat sederhana berupa angka integer
(bilangan bulat).
Nama: Nama pelanggan dalam bentuk teks
Jenis Kelamin: Jenis kelamin dari pelanggan, dalam bentuk angka integer. Disini 1
mewakili laki-laki dan 2 mewakili perempuan.
Pendapatan: Nilai pendapatan per bulan dari tiap pelanggan (??).
Produk: Produk yang disurvei.
Harga: Harga produk yang dibeli.
Jumlah: Jumlah produk yang dibeli.
Total: Total harga pembelian.
Tingkat Kepuasan: Indeks tingkat kepuasan pelanggan tersebut terhadap produk
yang dibeli.
Dengan data sederhana ini diharapkan dapat mengasah kempuan analisis statistik.
Kemampuan analisis statistik akan terlatih dengan Learning By Doing. Metode belajar ini
sangat efektif untuk pemahaman ilmu statistika.
data_intro
str(data_intro)
data_intro$ID.Pelanggan<- as.character(data_intro$ID.Pelanggan)
data_intro$Nama<- as.character(data_intro$Nama)
str(data_intro$ID.Pelanggan)
str(data_intro$Nama)
## Melihat apakah sudah berhasil dalam mengubah variabel tersebut dengan menggunakan function str
str(data_intro$Jenis.Kelamin)
str(data_intro$Produk)
str(data_intro$Tingkat.Kepuasan)
data_intro
str(data_intro)
Estimasi karakteristik
Ukuran pemusatan (mean,modus,median, presentil)
Contoh
Data : 2, 2, 5, 7, 9, 9, 9, 10, 10, 11, 12
Modus = 9
Median = 9
Mean = 7,81
Mode(data_intro$Produk)
Mode(data_intro$Tingkat.Kepuasan)
Tugas Praktek
## carilah median untuk kolom Pendapatan dari variable data_intro
median(data_intro$Pendapatan)
median(data_intro$Harga)
median(data_intro$Jumlah)
median(data_intro$Total)
mean(data_intro$Pendapatan)
## carilah mean untuk kolom Harga pada variable data_intro
mean(data_intro$Harga)
mean(data_intro$Jumlah)
mean(data_intro$Total)
max(data_intro$Pendapatan) - min(data_intro$Pendapatan)
var adalah function yang digunakan untuk mendapatkan nilai varians dari data.
var(data_intro$Pendapatan)
sd adalah function yang digunakan untuk mendapatkan nilai simpangan baku dari
data.
sd(data_intro$Pendapatan)
Kesimpulan
Dari pembahasan materi diatas maka kesimpulannya sebagai berikut:
summary (data_intro)
Analisis Deskriptif Menggunakan Visualisasi
Setelah melakukan analisis deskriptif sebelumnya, agar lebih jelas bagaimana
gambaran/sebaran dari data maka kita perlu membuat grafik dari masing-masing variabel.
Grafik disini juga dapat sebagai analisis eskplorasi yang akan membantu dalam membangun
hipotesis.
Untuk mendapatkan visualisasi dasar dari setiap variabel pada R bisa menggunakan perintah
berikut
plot(data_intro$Jenis.Kelamin)
hist(data_intro$Pendapatan)
Berikut penjelasan function diatas:
Tujuan dari plot dan hist adalah untuk mengetahui sebaran data.
## Carilah sebaran data kolom Jenis.Kelamin dari variable data_intro
plot(data_intro$Jenis.Kelamin)
hist(data_intro$Pendapatan)
plot(data_intro$Produk)
hist(data_intro$Harga)
hist(data_intro$Total)
plot(data_intro$Tingkat.Kepuasan)
Dari hasil statistik deskriptif diatas kita dapat membangun hipotesis, agar analisis data yang
kita lakukan kaya informasi yang didapatkan. Pembangunan hipotesis berdasarkan intuisi
kita terhadap data yang sudah kita lakukan eksplorasi.
Contoh hipotesis yang dapat kita bangun berdasarkan data diatas adalah sebagai berikut:
Sumber gambar: https://www.slideshare.net/rhandyprasetyo/statistikauji-hipotesis
a. Statistik Deskriptif adalah statistik yang digunakan untuk analisa data dengan cara
menggambarkan data sampel dengan tanpa membuat kesimpulan untuk data
populasi. Beberapa hal yang dapat dilakukan adalah penyajian data melalui tabel,
grafik, perhitungan modus, median, mean, perhitungan penyebaran data melalui
perhitungan rata-rata dan standar deviasi. Statistik Deskriptif digunakan untuk
eksplorasi data.
b. Statistik Inferensia adalah yaitu statistik yang digunakan untuk menganalisis data
sampel dan hasilnya diberlakukan untuk populasi. Beberapa hal yang dapat dilakukan
adalah menguji hipotesis dengan statistik uji, seperti chi-square test, student-t test, f-
test, z-score test.
Statistik Inferensia dapat digunakan untuk konfirmasi dari hasil statistik deskriptif.
Scatter Plot
Sebelum melakukan analisis korelasi sebaiknya kita melihat hubungan dari dua variabel
numerik menggunakan scatter plot. Scatter plot dapat disebut juga analisis deskriptif.
Untuk melakukan scatter plot pada R menggunakan perintah plot seperti berikut.
plot(data_intro$Pendapatan,data_intro$Total)
Variabel pertama yaitu data_intro$Pendapatan akan diplot untuk sumbu x,sedangkan
variabel kedua yaitu data_intro$Total untuk sumbu y.
plot(data_intro$Pendapatan, data_intro$Total)
cor.test(data_intro$Pendapatan, data_intro$Total)
Next >
H0 : tidak ada hubungan antara jenis produk dan tingkat kepuasan.
Ha : terdapat hubungan antara jenis produk dan tingkat kepuasan
## Carilah tabulasi silang antara kolom jenis produk (Produk) dan tingkat kepuasan
(Tingkat.Kepuasan) dari variable data_intro
table(data_intro$Produk, data_intro$Tingkat.Kepuasan)
## Analisis bagaimana hubungan jenis produk dengan tingkat kepuasan mengunakan uji korelasi
chisq.test(table(data_intro$Produk, data_intro$Tingkat.Kepuasan))
Selanjutnya analisis inferensia yaitu untuk mengetahui apakah ada perbedaan rata-rata total
belanja pada laki-laki dan perempuan maka digunakan statistik uji t-test.
Untuk melakukan visualisasi boxplot dan uji statistik t-test pada R tahapannya sebagai
berikut
boxplot(Total~Jenis.Kelamin,data = data_intro)
t.test(Total~Jenis.Kelamin,data = data_intro)
Function boxplot digunakan untuk melihat secara grafik rata-rata total belanja pada laki-laki
dan perempuan, sedangkan perintah t.test digunakan untuk melihat hubungan secara
statistik. Penggunaan kedua fungsi diatas yaitu variabel pertama yang bertipe numerik,
sedangkan variabel kedua variabel kategorik. Hipotesis t-test sebagai berikut :
Null hipotesis : tidak ada perbedaan rata-rata total belanja antara laki-laki dan
perempuan
Hipotesis alternatif : ada perbedaan rata-rata total belanja antara laki-laki dan
perempuan
t.test(Total~Jenis.Kelamin, data=data_intro)
Kesimpulan
Selamat! Dengan menyelesaikan bab kedua ini maka Anda sudah menyelesaikan course
Introduction to Statictics with R yang singkat namun padat ini!
Dari pembahasan materi diatas maka kesimpulannya sebagai berikut:
Sebelum memulai menganalisis data harus dilihat summary per tiap variabel.
Analisis Deskriptif digunakan untuk membangun sebuah hipotesis.
Analisis Inferensia digunakan untuk menguji hipotesis.
Mengenal ggplot2
Pendahuluan
Selamat datang di course Data Visualization with ggplot2, sebuah library tambahan di R yang
sangat populer digunakan untuk visualisasi – populer karena grafik dapat dihasilkan dengan
struktur perintah yang sangat generik tapi jelas dan rapi.
Sepanjang course ini Anda akan mempelajari
Dan untuk mempelajari ggplot ini disarankan mengikuti pengantar dan prakteknya secara
terurut, bab demi bab. Ini dikarenakan function-function penting akan dicicil
sepanjang course sebagai strategi penyampaian materi – dengan tujuan agar Anda tidak
terlalu terbebani dengan materi yang disampaikan selanjutnya.
Dengan dasar yang diperkenalkan di course ini, diharapkan Anda dapat memiliki kemampuan
untuk memahami dan berkreativitas lebih lanjut dengan ggplot untuk menghasilkan
berbagai grafik yang menarik.
Dan dari contoh grafik awal, terlihat tidak semua kolom itu ditampilkan. Yang diperlukan
hanya dua kolom, yaitu Luas Wilayah (KM2) dan Kepadatan (Jiwa / KM2).
Kolom Luas Wilayah (KM2) akan mengisi absis (sumbu-x) dan Kepadatan (Jiwa / KM2) akan
mengisi ordinat (sumbu-y). Dan kita gunakan kolom ketiga, yaitu Nama Kabupaten/Kota
untuk pembeda warna (color).
Komponen-komponen x, y dan color disebut komponen grafik atau aesthetic di ggplot2.
Dan penggunaan ketiga kolom data ini ke dalam aesthetic disebut aesthetic mapping.
Dengan adanya plot, data, dan aesthetic mapping ini menjadi bahan baku untuk melakukan
step berikutnya: menggambar grafik itu sendiri dengan layer!
Layer
Layer adalah objek grafik itu sendiri. Sesuai namanya, objek-objek tersebut disusun dalam
bentuk lapisan (layer).
Setiap lapisan memiliki objek-objek berikut:
Geom: Bentuk geometri seperti garis (line), batang (bar), titik (point), dan lain-lain.
Stat: Atau suatu fungsi untuk melakukan transformasi statistik terhadap data input.
Contoh paling sederhana adalah transformasi data untuk kepadatan jiwa dari angka menjadi
range atau inverval per lima ribuan. Jadi data input dengan angka 8041 diubah menjadi
interval angka 8001-8500. Transformasi ini disebut dengan bin.
Position: Posisi dari beberapa data yang memiliki nilai yang sama. Jika diplot sebagai
scatter plot misalnya, tentunya data-data tersebut akan menumpuk di satu titik.
Apakah perlu ditambahkan nilai acak tertentu sehingga pas digambarkan, terlihat
datanya lebih tersebar? Jika iya, maka ini namanya jitter. Jika kita tidak ingin
mengubah apa-apa, ini dinamakan identity.
Nah, kembali ke contoh di atas. Jika layer ditambahan ke plot objek menggunakan point
maka bentuknya menjadi berikut.
Dengan objek plot yang sama, jika tambahkan dengan variasi layer lain – yaitu dengan geom
histogram – maka dapatnya adalah grafik berikut.
Untuk memperjelas, berikut adalah diagram summary untuk proses tampilan grafik dan
komponen yang terlibat.
Dengan mengerti akan fitur fundamental ini, kita dapat membuat banyak grafik yang lebih
kompleks dengan ggplot dengan cepat.
Kesimpulan
Selamat, Anda telah menyelesaikan bab penjelasan tentang ggplot2 dengan materi berikut:
Bab ini akan membahas bagaimana kita menghasilkan kanvas, menambahkan judul, label,
menggunakan variable untuk objek plot, dan melihat detil dari objek plot dengan
function summary.
library(ggplot2)
library(ggplot2)
library(ggplot2)
plot.jakarta <- plot.jakarta + labs ( x="Luas Wilayah(km2)", y="Kepadatan Jiwa per km2")
plot.jakarta
data: [x]
faceting: facet_null()
library(ggplot2)
plot.jakarta <- plot.jakarta + labs(x = "Luas Wilayah (km2)", y="Kepadatan Jiwa per km2")
summary(plot.jakarta)
Kesimpulan
Plot adalah komponen paling dasar di ggplot2, tanpa plot seluruh grafik tidak akan bisa
ditampilkan. Dengan demikian, plot adalah "kanvas" grafik. Untuk membuat plot kita
gunakan fungsi bernama ggplot()
Kita dapat tambahkan komponen grafik lain di atas plot. Dan pada bab ini kita telah
menambahkan:
Selain itu juga ditunjukkan bagaimana sebaiknya objek plot disimpan ke variable. Dengan
cara ini, kita bisa mengolahnya dengan lebih rapi. Terakhir, kita menampilkan informasi plot
ini dengan menggunakan fungsi summary.
Pada gambar terlihat banyak kolom informasi seperti TAHUN, NAMA PROVINSI, NAMA
KABUPATEN/KOTA, dll.
Ada tiga kolom yang di-highlight dengan warna kuning, hijau dan biru muda. Ketiga kolom ini
masing-masing akan dipetakan di dalam grafik untuk komponen visual x, y dan color (warna).
Pemetaan data ini disebut dengan aesthetic mapping.
Pada praktek selanjutnya, kita akan membaca data dan melakukan pemetaan. Input data
pada ggplot2 harus bertipe data.frame, tidak boleh yang lain.
Perhatikan seluruh kolom berisi informasi berupa angka, kecuali empat kolom berikut: NAMA
PROVINSI, NAMA KABUPATEN/KOTA, NAMA KECAMATAN, dan NAMA KELURAHAN. Dataset
ini memiliki detil sampai ke tingkat kelurahan. Contoh yang cukup bagus untuk kita olah.
penduduk.dki <-
read.csv("https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.csv"
, sep=",")
Berikut adalah penjelasan dari perintah di atas
Komponen
Deskripsi
Jika terjadi error berikut, cobalah periksa kembali penulisan code – huruf besar, huruf kecil
dan juga penulisan lokasi file – dengan teliti.
Error in file(file, "rt") : cannot open the connection
Jika tidak terjadi error maka langkah selanjutnya adalah menampilkan isi data dengan
mengetikkan nama variable.
penduduk.dki
penduduk.dki[c("NAMA.KECAMATAN","NAMA.KELURAHAN")]
maka akan muncul hasil sebanyak 267 baris data, dimana sebagian datanya terlihat sebagai
berikut:
NAMA.KECAMATAN NAMA.KELURAHAN
1 KEP. SERIBU UTR P. PANGGANG
2 KEP. SERIBU UTR P. KELAPA
3 KEP. SERIBU UTR P. HARAPAN
4 KEP. SERIBU SLT P. UNTUNG JAWA
5 KEP. SERIBU SLT P. TIDUNG
6 KEP. SERIBU SLT P. PARI
7 GAMBIR GAMBIR
8 GAMBIR CIDENG
9 GAMBIR PETOJO UTARA
10 GAMBIR PETOJO SELATAN
11 GAMBIR KEBON KELAPA
12 GAMBIR DURI PULO
13 SAWAH BESAR PASAR BARU
14 SAWAH BESAR KARANG ANYAR
15 SAWAH BESAR KARTINI
16 SAWAH BESAR GUNUNG SAHARI UTARA
17 SAWAH BESAR MANGGA DUA SELATAN
18 KEMAYORAN KEMAYORAN
19 KEMAYORAN KEBON KOSONG
…
library(ggplot2)
# Tampilkan data frame dari kolom " NAMA.KELURAHAN " dan "LUAS.WILAYAH..KM2."
penduduk.dki[c("NAMA.KELURAHAN", "LUAS.WILAYAH..KM2.")]
# Masukkan data ke dalam plot dan simpan sebagai variable plot.dki, dan tampilkan summary dari plot
tersebut
summary(plot.dki)
Komponen Deskripsi
Kembali ke awal kebutuhan kita, mari kita lihat gambar berikut. Terlihat kita ingin
memetakan x, y dan color ke kolom NAMA KABUPATEN/KOTA, LUAS WILAYAH (KM2) dan
KEPADATAN (JIWA/KM2).
Tetapi kita lihat di bagian bawah gambar, nama-nama kolom yang akan dimapping
mengalami sedikit perubahan ketika dibaca di R, dimana spasi dan non huruf maupun angka
diubah menjadi titik. Sebagai contoh, NAMA KABUPATEN/KOTA diubah menjadi
NAMA.KABUPATEN.KOTA.
Berikut adalah contoh penggunaan aes berdasarkan kebutuhan tersebut.
aes(x = LUAS.WILAYAH..KM2., y=KEPADATAN..JIWA.KM2., color=NAMA.KABUPATEN.KOTA)
Dan function aes ini harus dipasangkan dengan function ggplot yang telah memiliki data,
sehingga konstruksi lengkap codenya adalah sebagai berikut.
ggplot(data=penduduk.dki, aes(x = LUAS.WILAYAH..KM2.,
y=KEPADATAN..JIWA.KM2., color=NAMA.KABUPATEN.KOTA))
Untuk lebih jelasnya mari kita lakukan tugas praktek berikut.
library(ggplot2)
summary(plot.dki)
plot.dki
Kesimpulan
Plot memerlukan dua input sebagai bahan bakunya agar bisa digunakan lebih jauh, yaitu
data dan aesthetic mapping (pemetaan beberapa kolom data ke elemen visual).
Geom: Bentuk geometri seperti garis (line), batang (bar), titik (point), dan lain-lain.
Stat: Atau suatu fungsi untuk melakukan transformasi statistik terhadap data input.
Contoh paling sederhana adalah transformasi data untuk kepadatan jiwa dari angka
menjadi range atau inverval per lima ribuan. Jadi data input dengan angka 8041
diubah menjadi interval angka 8001-8500. Transformasi ini disebut dengan bin. Jika
kita tidak ingin mengubah apa-apa, stat yang kita gunakan adalah identity.
Position: Posisi dari beberapa data yang memiliki nilai yang sama. Jika diplot sebagai
scatter plot misalnya, tentunya data-data tersebut akan menumpuk di satu titik.
Apakah perlu ditambahkan nilai acak tertentu sehingga pas digambarkan, terlihat
datanya lebih tersebar? Jika iya, maka ini namanya jitter. Jika kita tidak ingin
merubah posisi, maka kita gunakan identity.
Berikut adalah diagram summary untuk proses menampilkan grafik dengan objek plot dan
layer.
Klik tombol Next untuk melanjutkan
Keterangan
Komponen Deskripsi
Ganti bagian […] pada editor dengan code tersebut. Jika berhasil dijalankan, maka Anda
harusnya mendapatkan output grafik sebagai berikut.
Terlihat grafik titik (scatter plot) dihasilkan data-data kependudukan diambil Luas Wilayah
untuk sumbu x, Kepadatan untuk sumbu y, dan pewarnaan dilakukan sesuai Nama
Kabupaten.
library(ggplot2)
#Membaca data csv dan dimasukkan ke variable penduduk.dki
penduduk.dki <-
read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")
#Menambahkan data dan aesthetic mapping
plot.dki <- ggplot(data=penduduk.dki, aes(x = LUAS.WILAYAH..KM2.,
y=KEPADATAN..JIWA.KM2., color=NAMA.KABUPATEN.KOTA))
geom_point()
Catatan: Stat dan position tidak perlu diisi, karena fungsi geom_point ini secara otomatis
akan memiliki nilai "identity" untuk stat dan position. Berbeda ketika menggunakan layer,
dimana parameter stat dan position harus diisi lengkap.
Ketik geom_point() untuk menggantikan bagian […] Jika berjalan dengan baik, grafik yang
sama dengan praktek sebelumnya akan dihasilkan sebagai berikut.
library(ggplot2)
#Membaca data csv dan dimasukkan ke variable penduduk.dki
penduduk.dki <-
read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")
Kita bisa merubah label ini sesuai dengan keinginan kita menggunakan function labs yang
sudah kita pelajari sebelumnya.
Gantilah bagian … pada code editor dengan function labs dengan parameter-parameter
berikut.
Kesimpulan
Layer diperlukan agar grafik sebenarnya dapat digambar di atas objek plot. Layer dibuat
dengan function layer. Parameter function layer yang harus diisi terdiri
dari geom, stat dan position.
Dengan pengisian nilai yang berbeda-beda terhadap tiga parameter ini, kita bisa
menghasilkan berbagai macam grafik. Pada bab ini, grafik yang kita hasilkan adalah "scatter
plot" dimana parameter geom bernilai "point", stat dan position bernilai "identity".
Selain menggunakan function layer, tiap objek juga memiliki function yang memiliki prefix
geom_, stat_ , dan position_. Misalkan, untuk geom bertipe point memiliki function
geom_point. Ini dibuat dengan tujuan agar beberapa nilai default untuk tiap-tiap objek
sudah dispesifikasikan di function-function berprefix.
Dan bab ditutup dengan praktek dimana kita bisa menyelesaikan satu grafik lengkap dengan
judul, dan label-label yang lebih mudah dibaca.
Histogram
Pendahuluan
Histogram adalah tipe visualisasi yang sangat cocok untuk menggambarkan data distribusi
dari jumlah populasi data. Dan dataset kependudukan adalah contoh yang baik dimana kita
bisa menggambarkan distribusi kepadatan penduduk dengan jumlah kelurahan.
Untuk membuat histogram, kita gunakan geom bertipe histogram dan stat bin, yang bisa
diwakili oleh function geom_histogram.
library(ggplot2)
penduduk.dki <-
read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")
library(ggplot2)
penduduk.dki <-
read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")
Kesimpulan
Histogram adalah tipe visualisasi yang sangat cocok untuk menggambarkan data distribusi
dari jumlah populasi data. Dan dataset kependudukan adalah contoh yang baik dimana kita
bisa menggambarkan distribusi kepadatan penduduk dengan jumlah kelurahan.
Praktek pada bab ini cukup simpel dan straightforward, dimana kita telah menggunakan
function geom_histogram dengan parameter binwidth untuk menghasilkan grafik distribusi.
Visualisasi Trend dengan Line Chart
Pendahuluan
Line chart atau grafik garis adalah tipe visualisasi yang sangat baik untuk menggambarkan
apa impact (pengaruh) dari perubahan suatu variable dari satu titik ke titik lain atau trend–
dan variable yang paling umum digunakan adalah waktu.
Sebagai contoh, di bidang ekonomi untuk menggambarkan inflasi dari bulan ke bulan.
Namun tentunya tidak harus selalu waktu. Perubahan lain, misalkan pengaruh kecepatan lari
dengan peningkatan detak jantung.
Untuk membuat line chart standar, kita gunakan geom bertipe line dan stat identity, yang
bisa diwakili oleh function geom_line.
Pada bab berikut kita akan gunakan dataset tambahan, yaitu tingkat inflasi bulanan tahun
2017 untuk negara Indonesia dan Singapura. Selain plotting, diperkenalkan juga konsep
factoring untuk menangani data dan grouping untuk grafik.
Dataset Inflasi
Untuk dataset untuk inflasi kita akan "loncat" sedikit ke dataset lain, yaitu dataset inflasi
sepanjang tahun 2017 untuk negara Indonesia dan Singapore. Dataset ini dikumpulkan oleh
DQLab untuk keperluan pelatihan dan dapat didownload di:
https://storage.googleapis.com/dqlab-dataset/inflasi.csv
Dataset ini hanya memiliki tiga kolom, yaitu:
File ini berbentuk csv dan akan dibaca dengan menggunakan function read.csv.
inflasi.indo.sing
Berikut adalah tugas praktek yang coba kita lakukan. Untuk praktek kali ini, sengaja kita buat
hasilnya error.
Tugas Praktek
Tambahkan layer untuk line chart pada bagian […] di code editor yang telah dilengkapi
dengan plot, data, dan aesthetic mapping.
Jika berjalan dengan baik, maka akan muncul dua hasil, satu grafik berupa plot kosong dan
satu tampilan error sebagai berikut.
geom_path: Each group consists of only one observation. Do you need to adjust the group
aesthetic?
Ini artinya sistem kebingungan karena tiap Bulan pada sumbu x memiliki dua data
(observation). Kondisi ini akan kita perbaiki pada praktek selanjutnya.
library(ggplot2)
#Membaca data csv dan dimasukkan ke variable inflasi.indo.sing
#Menambahkan layer
plot.inflasi + geom_line()
Penyebabnya adalah sistem kebingungan karena data untuk tiap bulan memiliki dua titik
data, yang akan menjadi kendala karena tiap line perlu satu titik data untuk sumbu x dan y.
Ini karena kita belum membagi data dengan aesthetic grouping dengan konstruksi berikut.
Walaupun pada gambar kita sudah memiliki aesthetic color yang membagi Indonesia dan
Singapura, tapi kita masih perlu memiliki aesthetic group sebagai berikut:
aes(…, group=Negara)
Dimana … mewakili pasangan aesthetic mapping lainnya.
Tugas Praktek
Tambahkan aesthetic group dengan Negara pada bagian […] di code editor, sehingga jika
dijalankan akan menghasilkan grafik berikut.
Catatan: Perhatikan jika teks Bulan pada sumbu X masih pada urutan yang salah. Jangan
kuatir, ini akan kita perbaiki di praktek berikutnya.
library(ggplot2)
#Menambahkan Layer
plot.inflasi + geom_line()
Kita dapat secara manual merubah urutan ini dengan factor dan parameter levels
dimasukkan manual.
Dengan data bulan dari Jan s/d Oct 2017 maka konstruksi factor adalah sebagai berikut.
Ini perlu dimasukkan kembali ke kolom bulan untuk merubah urutannya dengan perintah
berikut.
Tugas Praktek
Gantilah bagian […] dengan factoring sehingga hasil output terakhir yang tampil adalah
sebagai berikut, sehingga data akan siap untuk ditampilkan.
library(ggplot2)
str(inflasi.indo.sing)
library(ggplot2)
inflasi.indo.sing$Bulan = factor(inflasi.indo.sing$Bulan,
Kolom-kolom ini akan butuh banyak data treatment atau data preparation sebelum dapat
digunakan untuk kepentingan penggunaan grafik kita untuk bab ini.
Oleh sebab itu, DQLab telah melakukan proses tersebut sehingga datanya menjadi seperti
bentuk berikut.
Catatan: Detil transformasi data yang dilakukan akan dibahas di course "Data Preparation /
Wrangling with R"
Berikut adalah nama kolom dataset tersebut.
1. TAHUN: Tahun
2. NAMA PROVINSI: Nama provinsi di DKI Jakarta, dan nilainya hanya ada satu
3. NAMA KABUPATEN/KOTA: Nama kabupaten/kota di DKI Jakarta
4. NAMA KECAMATAN: Nama kecamatan di DKI Jakarta
5. NAMA KELURAHAN: Nama kelurahan di DKI Jakarta
6. LUAS WILAYAH (KM2): Luas wilayah (km persegi)
7. KEPADATAN (JIWA/KM2): Kepadatan penduduk (jiwa/km2)
8. JENIS KELAMIN: Jenis kelamin dari populasi
9. RENTANG UMUR: Rentang umur dari populasi
10. JUMLAH: Jumlah penduduk
Dengan demikian, dataset ini telah kita ubah strukturnya tanpa menghilangkan informasi
aslinya. File csv dari dataset ini dapat didownload di url berikut:
https://storage.googleapis.com/dqlab-dataset/datakependudukandki-dqlab.csv
Klik tombol Next untuk melanjutkan ke praktek berikutnya.
plot.dki + geom_bar()
Mengisi aesthetic y dengan kolom grouping yang kita inginkan - yaitu kolom
bernama JUMLAH - pada plot (ggplot).
y=JUMLAH
Mengisi parameter stat dengan nilai identity pada bagian layer (geom_bar)..
stat="identity"
Tugas Praktek
Di dalam code editor telah tersedia code yang perlu kita lengkapi. Ganti bagian […] dengan
contoh code yang sesuai dengan penjelasan di atas sehingga dapat menghasilkan bar chart
berikut.
library(ggplot2)
#Membuat plot
plot.dki + geom_bar(stat="identity")
Kita abaikan label yang menumpuk terlebih dahulu, terlihat bar chart ini telah memiliki
informasi jumlah penduduk, dengan series berdasarkan jenis kelamin dan kemudian
dikategorikan berdasarkan nama kabupaten / kota.
Untuk melakukan hal ini, ada dua hal yang mesti kita lakukan:
Tugas Praktek
Di dalam code editor telah tersedia code yang perlu kita lengkapi. Ganti bagian […] dengan
code yang sesuai sehingga dapat menghasilkan bar chart seperti terlihat pada bagian Lesson.
library(ggplot2)
#Bagian plot
Fungsi Aggregate
Data frame yang kita gunakan pada plot, sering sekali harus dilakukan summary terlebih
sehingga dapat diproses lebih mudah oleh layer di ggplot.
Fungsi summary yang bisa kita gunakan adalah function aggregate, yang memiliki minimal
tiga input sebagai berikut:
x: merupakan list dari kolom data yang ingin kita jadikan summary
FUN: function summary yang bisa kita gunakan, misalkan sum, mean, dan lain-lain
by: list berisi pasangan daftar field yang ingin kita gunakan
aggregate(x=list(RATARATA=penduduk.dki$JUMLAH), FUN=mean, by =
list(NAMA.KABUPATEN.KOTA=penduduk.dki$NAMA.KABUPATEN.KOTA,
JENIS.KELAMIN=penduduk.dki$JENIS.KELAMIN))
Komponen Deskripsi
#Melakukan agregasi
aggregate(x=list(JUMLAH=penduduk.dki$JUMLAH), FUN=sum,
by=list(NAMA.KABUPATEN.KOTA=penduduk.dki$NAMA.KABUPATEN.KOTA,
JENIS.KELAMIN=penduduk.dki$JENIS.KELAMIN))
Ini dapat menggunakan tambahan komponen tema berikut yang belum dibahas di bab-bab
sebelumnya untuk menghasilkan grafik tersebut:
komponen Keterangan
Menggunakan fungsi aggregate yang
aggregate(…)
dibahas pada praktek sebelumnya
theme(…) Function untuk mengatur teks pada grafik
#Melakukan agregasi
#Plot grafik
plot.dki <- plot.dki + labs(title="Jumlah Penduduk DKI Jakarta Umur > 35 - Tahun 2013", x="Kabupaten /
Kota", y="Jumlah Penduduk")
plot.dki
Nah, bayangkan grafik ini kemudian diputar ke dalam koordinat polar sehingga menjadi
seperti berikut.
Perputaran ini membuat bar chart tadi ditransformasikan menjadi pie chart.
Walaupun terlihat tidak sempurna, untuk saat ini kita tidak akan membahas terlalu jauh lagi
mengenai pie chart kecuali Anda melakukan tugas praktek untuk menghasilkan grafik di atas.
Tugas Praktek
Di dalam code editor terdapat code lengkap dari seluruh komponen di atas. Anda tinggal
pelajari detilnya untuk memahami apa saja yang diperlukan, tidak ada yang perlu dirubah
atau ditambahkan.
library(ggplot2)
#Melakukan agregasi
plot.dki
Kesimpulan
Pada bab ini, kita telah menyelesaikan teori dan praktek untuk membuat bar chart dan pie
chart.
Walaupun kelihatan sederhana, untuk menghasilkan bar chart kita perlu mengerti beberapa
function dan proses sebagai berikut:
Dataset kependudukan yang telah kita gunakan pada bab-bab sebelumnya sangat
sulit digunakan dan perlu ditransformasikan terlebih dahulu.
Geom bar secara default hanya memerlukan aesthetic mapping x, karena secara
internal geom bar ini menggunakan stat = "count".
Jika ingin menghitung agregasi sum, lebih baik kita gunakan variable baru yang
menampung hasil agregasi dengan function aggregate.
Untuk membuat bar chart dengan grouping yang bersisian, kita gunakan aesthetic
mapping fill dan positioning dodge.
Bar chart dan pie chart adalah grafik dari ggplot2 yang memiliki karakteristik yang
hampir sama, kecuali koordinat polarnya.
Dua gambar berikut adalah contoh faceting dari scatter plot tunggal menjadi 6 potongan
scatter plot, dipotong berdasarkan kolom NAMA.KABUPATEN.KOTA.
Bab berikut akan membahas penggunaan praktis dari faceting.
Klik tombol Next untuk melanjutkan ke materi.
library(ggplot2)
#Menambahkan layer
plot.dki <- plot.dki + labs(x="Luas Wilayah (km2)", y="Kepadatan Jiwa (km2)", color="Kabupaten/Kota")
plot.dki + facet_wrap(~NAMA.KABUPATEN.KOTA,ncol=2)
#Menambahkan layer
plot.dki <- plot.dki + geom_histogram(binwidth=10000)
Penutup
Kesimpulan
Selamat, Anda telah menyelesaikan seluruh teori pengantar dan praktek mengenai
visualisasi dengan ggplot2.
Sepanjang course ini Anda telah mempelajari fundamental data visualisasi ggplot2 dengan
pembelajaran kunci sebagai berikut:
Dengan dasar ini kita sudah dapat menghasilkan berbagai grafik yang dapat bercerita
mengenai informasi dari data yang dikandungnya.
Gambar 1: Heatmap menggambarkan transaksi kumulatif harian selama satu tahun. Grafik
ini tidak menampilkan data secara detail karena tujuan utamanya adalah memperlihatkan
pada jam berapa transaksi tertinggi dan terendah terjadi.
Sebaliknya, visual eksploratif bertujuan memaparkan proses yang dilakukan untuk
mendapatkan hasil akhir yang tepat. Penyajiannya dibuat serinci dan seakurat mungkin
untuk meyakinkan bahwa prosesnya benar.
Visual eksploratif cenderung menampilkan banyak data. Audiensnya pun tidak sembarang
orang karena butuh waktu lebih lama untuk mencerna kompleksitas data tersebut. Visual ini
lebih ditujukan untuk orang-orang yang memang memahami data atau bisa menginvestigasi
data tersebut. Contoh visual eksploratif dapat dilihat pada Gambar 2.
Gambar 2: Grafik transaksi harian selama satu tahun. Grafik menggunakan elemen secara
detail untuk memperlihatkan performa per jam setiap hari.
Baik visual naratif maupun eksploratif ini memiliki tantangan tersendiri dalam
pengerjaannya. Untuk grafis naratif, sudah jelas bahwa kekuatan penyajiannya terletak
pada cerita dan pesan dari narasi yang disampaikan. Cerita dan pesan itu akan mudah
dipahami apabila didukung dengan paparan yang tidak bertele-tele dan kemasan visual
"menuntun" audiens pada tujuan yang sama. Wujudnya bisa berupa infografik, annual report,
materi promosi, hingga company profile.
Adapun visual eksploratif haruslah menonjolkan kekuatan analisis, hubungan sebab-akibat
perubahan data, dan proses lain. Detail data ditampilkan untuk mendukung kesahihan
analisis.
Memetakan tujuan
Aku baru selesai membaca pengantar awal isi modul mengenai visualisasi data. Lalu
kutemukan hasil survei yang menarik untuk kujadikan bahan praktik awal. Aku pun mencoba
menyampaikan keinginanku pada Senja.(lihat Gambar 1).
Gambar 1: Grafik batang ganda menunjukkan nilai hasil survei terhadap orangtua dan siswa.
“Nja, ini aku mau coba praktik pakai data antusiasme orangtua dan murid terhadap kegiatan
sekolah,” ujarku setelah membaca modul visualisasi data dari Senja.
“Boleh. Itu praktiknya ada di berkas studi kasus ya, bisa kamu cek.”
“Iya, ini ditulis kalau sekolah A berharap bahwa murid-murid menunjukkan antusiasme lebih
besar dibanding orangtua untuk semua kegiatan yang diadakan di sekolah. Dari grafik ini,
awalnya pihak sekolah tidak menyadari bahwa ternyata respons murid terhadap kegiatan
religi tidak setinggi harapan orangtua. Itu karena grafik yang dimiliki sekolah tidak
memperlihatkan perbedaan yang jelas satu sama lain.”
“Oke, sudah ada kasusnya. Sudah paham harus diolah seperti apa visualisasinya, Aksara?”
Aku terdiam untuk berpikir sebentar.
“Aku akan mengubah desain grafiknya. Aku akan membuat slope graph (lihat Gambar 2)
untuk memperlihatkan pertanyaan/kategori apa yang memperlihatkan respons murid lebih
rendah ketimbang orangtua untuk menunjukkan secara jelas perbedaannya,” jawabku.
“Kenapa memilih grafik itu, Aksara? Bisa jelaskan alasannya?”
“Aku menggunakan slope graph agar keterangan kegiatan dapat diletakkan di samping (kiri)
dari angka-angka tersebut. Jika aku paksa menggunakan column chart, aku bisa menyusun
urutan angkanya secara vertikal. Tetapi, di sekolah juga akan mengalami kesulitan yang
sama seperti grafik sebelumnya. Grafik batang maupun kolom seharusnya menempatkan
angka nol pada garis dasar, baik vertikal maupun horizontal. Ini bisa menjadi masalah karena
perbedaan persentase respons pada antarkegiatan tidak terlalu besar, hanya sekian persen.
Sekolah pun akan sulit melihat bedanya secara sekilas. Dengan slope graph, aku dapat
menghilangkan garis zero based dan fokus pada kisaran angka persentase dalam data,”
jelasku panjang lebar.
Senja tersenyum dan mempersilakanku untuk mulai mengerjakan studi kasusku dengan hasil
seperti ini:
Gambar 2: Slope graph merupakan salah satu cara membandingkan dua kategori/kelompok
dengan berbagai variabel.
“Gimana menurutmu hasilnya, Nja?” ujarku sambil menunjukkan hasil visualisasiku.
“Hmmm, menurut saya, kamu bisa menampilkan angka persentase dari murid dan orangtua
dari item kegiatan religi saja. Yang lain bisa kamu jelaskan tanpa harus menampilkan
grafiknya. Contohnya seperti ini agar menjadi lebih simpel (lihat Gambar 3)."
Aku membiarkan Senja mengambil alih hasil kerjaku sebentar. Setelah diubah sedikit oleh
Senja, aku mendapati gambar jadi lebih simpel dan langsung memperlihatkan pesan yang
ingin disampaikan.
Gambar 3: Dengan mengandalkan kekuatan teks dan warna, pesan dalam grafik dapat
terlihat dengan jelas meskipun desainnya sederhana.
Jenis Grafik dan Penggunaannya
Pilah-pilih grafik
Membaca grafik bukanlah satu pekerjaan mudah bagi sebagian orang, terutama yang tidak
terbiasa melihat data. Melihat dua garis saling bersinggungan, misalnya, bisa menimbulkan
arti berbeda bagi orang yang tidak memahami data.
Oleh karena itu, penting sekali memperkenalkan visualisasi data dengan sesederhana
mungkin agar alur membaca dan mengambil kesimpulan atas elemen visual yang
ditampilkan dengan lebih mudah.
Ada berbagai macam cara menampilkan data, entah dalam bentuk grafik, angka, atau teks.
Cara menampilkannya tergantung pada pesan yang ingin disampaikan kepada audiens.
Berikut penjelasan singkat tentang sejumlah pilihan visualisasi data.
Jenis Grafik Bentuk Keterangan
Hanya
menonjolkan satu
nilai variabel
Menunjukkan
peringkat/ranking
Menunjukkan dua
variabel atau
lebih
Membandingkan
dengan nilai
tertentu
(benchmark)
Perbandingan
(komparasi)
antarkategori
Menampilkan
hasil survei
Menunjukkan
proporsi bagian
dari jumlah total
Menunjukkan
perubahan nilai
pada satu variabel
Menampilkan
simpangan
(deviasi) data
Menggunakan
teks sebagai data
utama
Menampilkan
perubahan nilai
dari waktu ke
waktu (tren)
Effective Data Visualization, The Right Chart for The Right Data (Stephanie DH Evergreen - 2017 -
SAGE Publication, Inc)
Karakter Visual
Setelah berhasil memilih grafik yang benar sesuai tujuan penyajian data, tantangan
berikutnya adalah bagaimana membuat grafik tersebut menjadi mudah dipahami oleh
audiens. Di sini kata kuncinya adalah audiens, yang karakternya berbeda-beda.
Karena itu, sangat penting bagi seorang pemapar data untuk memahami karakter audiens.
Seseorang yang terbiasa melihat data, tentu saja akan lebih mudah mencerna grafik apa pun
yang ada di hadapannya, bukan? Sebaliknya, orang yang tak biasa menyaksikan gambar-
gambar disertai angka, apalagi disertai rumus atau perhitungan rumit, tentu membutuhkan
waktu lebih lama menerjemahkan sajian grafis tentang data.
Karena karakter audiens yang beragam, maka cara mereka membaca data dan grafik pun
tidak sama satu sama lain. Karena itu, dalam menyajikan data, seorang analisis sebisa
mungkin "mengarahkan" pembaca. Mengarahkan di sini berarti harus dapat membawa alam
pikir audiens seturut dengan logika analisis data hingga menyimpulkan hasilnya. Juga
mengarahkan mata pembaca dalam menelusuri sajian visual atas analisis data dan
kesimpulan tersebut.
Gambar 1: Grafik garis ini menggambarkan tren penjualan tiga produk selama satu tahun.
Alih-alih menonjolkan garis teratas (produk A) yang memiliki nilai lebih tinggi, grafik ini justru
menonjolkan produk B dengan warna terang yang mencolok mata.
Lihatlah dua ilustrasi grafik pada Gambar 1 dan Gambar 2. Pada Gambar 1, tidak ada
petunjuk jelas tentang bagaimana cara membaca grafik tersebut. Karena tidak ada ketentuan
khusus, orang yang melihatnya akan membacanya dengan cara berbeda-beda. Mungkin ada
yang membacanya mulai dari judul grafik, tetapi ada pula yang langsung mengarahkan
perhatian pada garis berwarna cerah di bagian tengah.
Gambar 2: Simulasi urutan membaca grafik oleh audiens. Urutan ini tidak baku, tergantung
pada karakter audiens yang melihatnya. Namun, penggunaan warna terang pada garis di
tengah akan mengarahkan pembaca untuk fokus pada garis tersebut.
Gambar 2 memperlihatkan contoh pola membaca grafik tersebut. Belum tentu semua orang
akan menggunakan alur baca yang sama seperti ilustrasi tersebut. Namun, setidaknya
penggunaan warna, tebal-tipis garis, maupun besar-kecil ukuran huruf, menuntun audiens
untuk menentukan bagian mana yang perlu dibaca lebih dulu.
Coba bayangkan bila semua garis pada grafik tersebut memiliki ketebalan dan warna yang
sama. Demikian ukuran huruf pada judul, penjelasan grafik, legenda, hingga keterangan di
masing-masing sumbu. Sudah dapat dipastikan, tidak ada bagian yang paling menonjol
dalam grafik tersebut, bukan? Kalau begitu kondisinya, dapat dipastikan pula setiap orang
yang membacanya akan punya cara sendiri-sendiri untuk mencerna grafik tersebut.
Mini project
Visualisasi Data 1
Terdapat sejumlah data tentang karyawan di perusahaan A. Lalu aku diminta untuk
mempresentasikan sebagian data itu kepada pimpinan. Salah satu data yang hendak
ditampilkan adalah jumlah karyawan berdasarkan jenis kelamin dalam kelompok usia
tertentu. Pimpinan perusahaan ingin melihat postur jumlah karyawan laki-laki dan
perempuan berdasarkan rentang usia mereka.
Aku pun diminta menampilkan grafik yang simpel, tetapi padat informasi. Grafik itu
membandingkan banyaknya jumlah karyawan laki-laki dan perempuan dalam setiap
kelompok umur yang sama.
Tantangannya adalah, grafik tersebut harus menunjukkan postur jumlah karyawan
berdasarkan jenis kelamin dan rentang usianya sekaligus.
Dengan menggunakan Microsoft Excel, tentunya aku bisa dengan mudah membuat grafik
seperti pada Gambar 1. Sayangnya, grafik ini boros tempat karena banyaknya kategori
rentang usia membuatnya melebar. Ukuran huruf untuk keterangan pada masing-masing
sumbu pun menjadi kecil dan kurang terbaca.
Target
1. Grafik yang lebih simpel dan hemat ruang.
2. Komparasi jumlah karyawan laki-laki dan perempuan berdasarkan rentang usia.
Berikut adalah data karyawan di perusahaan A.
21-25 tahun 45
Dengan menggunakan data karyawan di atas, aku bisa mengerjakan dengan menggunakan
applikasi Google spreadsheet, Excel, LibreOffice atau OpenOffice untuk memplotkan data ini,
tentunya di laptop/komputer ku nantinya.
Akan tetapi kali ini aku akan melakukannya dengan menggunakan ggplot (salah satu library
plotting bahasa pemrograman R). Aku pun tidak khawatir karena aku hanya akan diminta
mengetikkan ulang kode yang telah diberikan.
library(ggplot2)
arrange(desc(Kelompok.Usia))
aes(x = factor(tabel$Kelompok.Usia,
levels = tabel$Kelompok.Usia))) +
geom_bar(stat = "identity",
width = 0.8,
fill = "blue",
aes(y = Laki.laki)) +
geom_text(aes(x = Kelompok.Usia,
y = Laki.laki + 27,
label = abs(Laki.laki)),
colour = "white") +
geom_bar(stat = "identity",
width = 0.8,
fill = "orange",
aes(y = Perempuan)) +
geom_text(aes(x = Kelompok.Usia,
y = Perempuan - 27,
label = Perempuan),
colour = "white") +
ylim(-550, 550) +
coord_flip() +
label="Laki-laki", colour="blue") +
label="Perempuan", colour="orange") +
axis.text.x = element_blank(),
axis.ticks = element_blank(),
legend.position = "bottom")
options(repr.plt.width = 10, repr.plt.height = 2)
plt
Gambar: Hasil akhir dari perbaikan grafik untuk Praktek Visualisasi Data 1.
Visualisasi Data 2
Pimpinan perusahaan merasa kesal karena setiap kali rapat, analis data
mempresentasikan data report yang bertele-tele. Selain itu, ia selalu meragukan kesahihan
kesimpulan dalam laporan itu karena analisis tidak dilakukan secara detail.
Ketika analis data itu memberikan data lebih detail, pimpinan perusahaan semakin kesal
karena yang ditampilkan adalah data mentah yang masih sangat kotor dan harus ia
simpulkan sendiri.
Pimpinan tersebut juga berkali-kali bertanya tentang data, yang disajikan dalam bentuk
grafik tiga dimensi, atau grafik yang penuh dengan label data dengan garis dan blok warna-
warni yang mencolok mata.
Kali ini aku mendapat tugas dari Senja untuk memperbaiki laporan dari contoh kasus
tersebut. Tujuannya menyajikan visualisasi data yang enak dilihat, alur narasinya tepat, dan
kesimpulannya benar.
Kali ini tugasnya mencari karyawan dengan tren produktivitas paling baik selama satu tahun
lalu untuk mendapatkan reward sebagai best employee.
Masalahnya aku masih hanya bisa menggunakan Microsoft Excel dan PowerPoint untuk
membuat presentasi laporan. Aku terbiasa menggunakan desain template dari kedua
aplikasi itu. Yang aku tahu hanyalah jenis-jenis grafik bawaan yang disediakan pada aplikasi
tersebut, contohnya seperti Gambar 1.
Tujuan
1. Memilih jenis grafik yang benar
2. Menyederhanakan tampilan grafik
3. Memilah dan menonjolkan informasi yang diperlukan
Berikut adalah data karyawan di perusahaan.
Dengan menggunakan data karyawan di atas, aku dapat mengerjakan dengan menggunakan
aplikasi Google spreadsheet, Excel, LibreOffice atau OpenOffice untuk memplotkan data ini,
tentunya di laptop/komputer nantinya.
Akan tetapi kali ini aku akan melakukannya dengan menggunakan ggplot (salah satu library
plotting bahasa pemrograman R). Tapi, aku tidak merasa khawatir karena akan ada panduan
untuk mengetikkan ulang kode yang telah diberikan.
library(dplyr)
library(ggplot2)
tabel <-
read.csv("https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/lo5_m01_mp02.csv")
%>%
Karyawan.A = Karyawan.A/1000,
Karyawan.B = Karyawan.B/1000,
Karyawan.C = Karyawan.C/1000,
Karyawan.D = Karyawan.D/1000,
Karyawan.E = Karyawan.E/1000)
plt <- ggplot(data = tabel,
colour = "gray",
size = 1) +
colour = "gray",
size = 1.25) +
colour = "gray",
size = 0.75) +
colour = "gray",
size = 1.5) +
colour = "darkblue",
size = 2) +
ylim(10, 40) +
# Produktivitas tertinggi
colour="darkblue", size=0.5) +
annotate("text", x=7.5, 38, size=3, hjust=0, colour="darkblue",
label=paste("Produktivitas\ntertinggi\n",
toString(max(tabel$Karyawan.E)))) +
# Karyawan A
y=tabel$Karyawan.A[12], yend=tabel$Karyawan.A[12]-1.5) +
label=paste("avg:", toString(mean(tabel$Karyawan.A)))) +
# Karyawan B
y=tabel$Karyawan.B[12], yend=tabel$Karyawan.B[12]+1.5) +
label=paste("avg:", toString(mean(tabel$Karyawan.B)))) +
# Karyawan C
y=tabel$Karyawan.C[12], yend=tabel$Karyawan.C[12]+1.5) +
annotate("text", x=12.2, y=tabel$Karyawan.C[12]+2,
label=paste("avg:", toString(mean(tabel$Karyawan.C)))) +
# Karyawan D
y=tabel$Karyawan.D[12], yend=tabel$Karyawan.D[12]-1.5) +
label=paste("avg:", toString(mean(tabel$Karyawan.D)))) +
# Karyawan E
y=tabel$Karyawan.E[12], yend=tabel$Karyawan.E[12]+0.5) +
label=paste("avg:", toString(mean(tabel$Karyawan.E)))) +
axis.ticks.x = element_blank(),
Desain ini dipilih karena tujuannya adalah mencari satu karyawan yang memiliki
produktivitas tertinggi. Produktivitas itu dapat terlihat dari tren kenaikan jumlah produksi
dari awal hingga akhir tahun. Bisa pula terlihat dari rata-rata jumlah produksi.
Setelah satu karyawan terbaik terpilih, grafik untuk karyawan lain dapat disamarkan dengan
warna lebih tipis, demikian pula tebal garisnya.
Bagaimana dengan zero baseline yang tidak dimulai dari angka nol? Di sinilah fleksibilitas
grafik garis dibandingkan dengan grafik batang. Dengan grafik batang, garis dasar nol pada
sumbu X wajib digunakan. Dalam contoh ini, nilai minimum sumbu Y dimulai dengan angka
10 (ribuan) dan garis sumbu X dihilangkan karena garis tersebut sering diasumsikan sebagai
garis nol.
Hasil akhir dari perbaikan grafik tersebut dapat dilihat pada Gambar 2.
Hasil Belajarku :)
Akhirnya, modul Introduction to Data Visualization telah ku selesaikan dengan baik.
Berdasarkan materi-materi yang telah ku pelajari dan pahami serta praktekkan dalam modul
ini, aku telah mendapatkan pengetahuan (knowledge) dan praktek (skill) yang diantaranya:
Prolog
Prolog
Bahasa R memiliki berbagai sistem untuk membuat grafik, baik grafik statis maupun grafik
interaktif. Pada grafik statis misalnya terdapat sistem base, lattice, ggplot, dan lainnya. Di
dalam modul ini Anda akan diajak untuk mengenal salah satu sistem grafik yang paling
populer di R, yaitu ggplot.
Sistem pembuatan grafik dengan ggplot dapat dilakukan dengan menggunakan
paket ggplot2 yang merupakan implementasi dari konsep Grammar of Graphic untuk bahasa
pemrograman R. Pada prinsipnya, konsep Grammar of Graphic mengajak kita untuk
merekonstruksi pembuatan grafik dengan menggunakan kaidah tata bahasa sehingga tidak
terikat pada nama jenis grafik (contoh: scatterplot, line-chart, bar-chart, dll.) seperti yang
umumnya dilakukan. Taukah Anda bahwa Tableu merupakan salah satu aplikasi/program
yang menerapkan konsep tersebut?
Next >
Mengingat Kembali
Taukah Anda bahwa pada ggplot2 terdapat satu fungsi yang dapat digunakan untuk
membuat grafik dengan cepat? Fungsi tersebut adalah qplot()! Sesuai dengan
namanya, quick plot, sangat bermanfaat untuk membuat grafik dengan ringkas dan cepat.
Penggunaannya juga lebih mudah bagi yang sudah terbiasa dengan fungsi plot() dari sistem
grafik base.
Anda diminta untuk membuat sebuah grafik dengan menggunakan data diamonds yang
tersedia dalam paket ggplot2. Anda dapat melihat isi serta dokumentasi dari dataset tersebut
dengan menjalankan diamonds dan ?diamonds di konsol R (atau klik tautan ini jika untuk
dokumentasi daring). Setelah Anda membaca dokumentasi data diamonds tersebut, isilah
bagian ___ untuk membuat grafik hubungan antara berat (sumbu x), harga (sumbu y) dan
kejernihan intan! Apakah nama dari grafik apakah yang Anda dapatkan?
library(ggplot2)
ggplot(data = diamonds,
geom_point()
Kode 3 Rupa
Salah satu kelebihan dari ggplot2 terletak pada fleksibiltas penulisan kodenya. Perhatikan
baris kode yang telah Anda buat sebelumnya sebagai berikut:
Anda dapat menuliskan ulang kode di atas dan menghasilkan grafik yang persis serupa
dengan menggunakan cara penulisan berikut:
Grafik yang akan dihasilkan oleh tiga cara penulisan tersebut adalah identik. Namun, jika
diperhatikan lebih mendalam dengan menggunakan fungsi summary() akan tampak
perbedaan diantara ketiganya.
Simpanlah grafik dari masing-masing cara penulisan tersebut ke dalam obyek
bernama diamonds_c1, diamonds_c2, dan diamonds_c3. Kemudian jalankan
fungsi summary() terhadap tiga obyek tersebut! Apakah yang Anda temukan?
library(ggplot2)
# Cara 1
diamonds_c1 <-
ggplot(data = diamonds,
summary(diamonds_c1)
# Cara 2
diamonds_c2 <-
ggplot(data=diamonds) +
summary(diamonds_c2)
# Cara 3
diamonds_c3 <-
ggplot() +
geom_point(
data = diamonds,
summary(diamonds_c3)
Sedangkan untuk fungsi ggplot(), penulisan kode dapat digeneralisasi dalam tiga bentuk
sebagai berikut:
Cara 1
Cara 2
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))
Cara 3
ggplot() +
<GEOM_FUNCTION>(data = <DATA>, mapping = aes(<MAPPINGS>)
1. Data
2. Mapping
3. Statistic
4. Scales
5. Geometries
6. Facets
7. Coordinates
8. Theme
Paket dplyr
Terdapat beberapa fungsi utama dari paket dplyr untuk melakukan transformasi data,
diantaranya:
select()
filter()
arrange()
mutate()
summarise()
group_by()
Transformasi Data
Transformasi data umumnya merupakan sebuah rangkaian yang terdiri lebih dari satu
proses. Oleh karena itu, dalam tranformasi data menggunakan dplyr sering digunakan
operator pipe (%>%) untuk menghubungkan antara satu fungsi ke fungsi selanjutnya. Sebagai
ilustrasi, Anda akan diminta untuk melakukan transformasi data storms (dari paket dplyr)
dengan dan tanpa menggunakan operator pipe:
Tanpa menggunakan %>%
library(dplyr)
glimpse(storms)
glimpse(storms_nopipe)
# Menggunakan %>%
storms_pipe <-
storms %>%
filter(between(year,2000,2015)) %>%
group_by(month) %>%
summarise(
avg_wind = mean(wind),
avg_pressure = mean(pressure)
glimpse(storms_pipe)
Operator Pipe
Berikut merupakan baris kode transformasi menggunakan operator pipe yang sebelumnya
telah Anda jalankan:
storms %>%
select(year, month, wind, pressure) %>%
filter(between(year, 2000, 2015)) %>%
mutate(month = factor(month.name[month], levels = month.name)) %>%
group_by(month) %>%
summarise(
avg_wind = mean(wind),
avg_pressure = mean(pressure)
)
INDO-DAPOER
Tentang Data
Mari kita mulai! Sekarang Anda akan ditantang untuk melakukan eksplorasi dan visualisasi
data INDO-DAPOER, yaitu akronim dari Indonesia Database for Policy and Economic Research.
Data tersebut disediakan oleh The World Bank dan tersedia dalam pranala ini.
Singkatnya, INDO-DAPOER merupakan data yang berisikan indikator ekonomi dan sosial
pada level provinsi serta kota/kabupaten di Indonesia. Ada empat kategori utama yang
terhimpun di dalam data ini, yaitu: fiskal, ekonomi, sosial-demografi, serta infrastuktur.
Import Dataset
Di dalam modul ini dataset INDO-DAPOER disediakan dalam bentuk yang telah
disederhanakan dan dikompresi dikarenakan ukurannya yang relatif besar. Anda akan
memerlukan paket readr untuk mengimpor berkas indodapoer.tsv.gz yang telah
disediakan, yaitu "https://storage.googleapis.com/dqlab-dataset/indodapoer.tsv.gz".
Pergunakan fungsi read_tsv() dan simpanlah hasilnya ke dalam obyek R
bernama indodapoer!
library(readr)
nrow(indodapoer)
ncol(indodapoer)
library (janitor)
head(colnames(indodapoer), 15)
head(colnames(indodapoer), 15)
Mudah, bukan?
Dengan satu fungsi clean_names() Anda dapat merapikan nama-nama kolom sehingga akan
lebih mudah digunakan untuk analisis atau visualisasi data.
Indonesia Negeriku
Produk Domestik Regional Bruto
Anda tertarik untuk melihat perkembangan Produk Domestik Regional Bruto (PDRB) Non-
Migas dari provinsi-provinsi di pulau Jawa. Informasi PDRB Non-Migas tersebut tersimpan
pada kolom total_gdp_excluding_oil_and_gas_in_idr_million_constant_price .
Sebelum memulai membuat visualisasi, ekstraklah data tersebut
menjadi pdrb_pjawa dengan cara melengkapi baris kode yang tersedia!
library(stringr)
library(dplyr)
pdrb_pjawa <-
indodapoer %>%
filter(
area_name %in% c(
"Banten, Prop.",
) %>%
transmute(
tahun = year,
pdrb_nonmigas = total_gdp_excluding_oil_and_gas_in_idr_million_constant_price
) %>%
filter(!is.na(pdrb_nonmigas))
glimpse(pdrb_pjawa)
Grafik PDRB Non-Migas
Dengan menggunakan data pdrb_pjawa kita akan membuat grafik tren PDRB Non-Migas
dengan baris kode berikut:
ggplot(
pdrb_pjawa,
aes(tahun, pdrb_nonmigas, colour = provinsi)
) +
geom_line()
Apakah Anda menemukan kejanggalan pada grafik tersebut? Ya! Urutan nama provinsi pada
legenda tidak mempresentasikan urutan yang ditampilkan pada grafik. Bayangkan jika Anda
memiliki lebih banyak nama provinsi yang ditampilkan pada grafik, akan sulit untuk dapat
mencocokan nama pada legenda dan garis pada grafik.
Solusi pertama yang dapat Anda lakukan adalah dengan cara mengurutkan nama provinsi
berdasarkan besaran PDRB Non-Migas pada tahun terakhir. Bagaimanakah caranya? Silakan
Anda lengkapi baris kode berikut! Anda juga perlu mengaktifkan paket forcats terlebih
dahulu ya!
library(dplyr)
library(ggplot2)
library(forcats)
pdrb_pjawa %>%
mutate(
) %>%
geom_line()
Direct Labeling
Solusi kedua untuk mengatasi permasalahan pada grafik sebelumnya dalah dengan
menggunakan direct labeling. Hal ini lebih direkomendasikan karena salah satu prinsip
dalam merancang grafik adalah “sebisa mungkin rancang grafik yang tidak memerlukan
legenda”. Anda dapat memanfaatkan fungsi geom_dl() dari paket directlabels untuk
membuat direct labeling di ggplot2. Adapun aesthetic mapping yang diperlukan
dalam geom_dl() tersebut adalah label. Sekarang buatlah grafik serupa namun
menggunakan direct labeling! Serta jangan lupa untuk menghapus legenda nama provinsi
dengan cara menambahkan argumen show.legend = FALSE pada geom_line().
library(ggplot2)
library(dplyr)
library(directlabels)
pdrb_pjawa %>%
ggplot(aes(tahun, pdrb_nonmigas)) +
geom_dl(
aes(label = provinsi),
method = "last.points",
Finalisasi Grafik
Selamat Anda telah berhasil membuat grafik menggunakan direct labeling! Selain itu, apakah
Anda menyadari bahwa pada beberapa kode sebelumnya suatu data (tanpa atau dengan
transformasi) langsung diarahkan ke ggplot() dengan menggunakan operator pipe (%>%)?
Fitur tersebut tentu sangat mempermudah dalam aktivitas transformasi dan visualisasi data,
apakah Anda setuju?
Sekarang saatnya Anda melakukan finalisasi untuk grafik yang telah dibuat. Ada beberapa
hal yang harus Anda lakukan, termasuk memperbaiki teks nama provinsi yang terpotong
pada kanvas. Jalankanlah langkah-langkah di bawah ini!
library(ggplot2)
library(dplyr)
library(directlabels)
library(hrbrthemes)
pdrb_pjawa %>%
geom_dl(
aes(label = provinsi),
method = "last.points",
)+
labs(
x = NULL,
y = NULL,
coord_cartesian(clip = "off") +
Seluas Apa?
Indonesia merupakan negara kepulauan yang sangat luas, tentu Anda telah mengetahui akan
hal tersebut. Namun bagaimanakah perbandingan luas provinsi-provinsi di Indonesia?
Dalam data indodapoer, data luas wilayah tersedia dalam kolom total_area_in_km2. Data
termutakhir adalah pada tahun 2009. Dapatkah Anda mengekstrak data tersebut menjadi
obyek R bernama luas_provinsi?
library(dplyr)
library(stringr)
luas_provinsi <-
indodapoer %>%
filter(year==2009) %>%
transmute(
luas_wilayah = total_area_in_km
glimpse(luas_provinsi)
library(ggplot2)
library(dplyr)
luas_provinsi %>%
ggplot(aes(area=luas_wilayah)) +
geom_treemap() +
geom_treemap_text(aes(label=provinsi))
Modifikasi Grafik
Luar biasa! Anda telah berhasil membuat grafik dasar dari treemap luas provinsi! Sekarang
mari lakukan beberapa modifikasi untuk mempercantik tampilan grafik tersebut:
library(ggplot2)
library(hrbrthemes)
library(dplyr)
library(treemapify)
library(scales)
luas_provinsi %>%
ggplot(aes(
area = luas_wilayah,
fill = luas_wilayah)
)+
geom_treemap() +
geom_treemap_text(
aes(label = provinsi),
colour = "white",
reflow = TRUE,
grow = TRUE
)+
scale_fill_viridis_c(
guide = guide_colourbar(
barwidth = 30,
barheight = 0.8
),
labels = label_number(
big.mark = ".",
decimal.mark = ",",
)+
labs(
fill = "Luas\nwilayah",
)+
theme_ipsum() +
theme(legend.position = "bottom")
Perjalanan Ini
Menarik bukan? Pembuatan kode di ggplot() sangat fleksibel dan ada banyak konfigurasi
grafik yang dapat dilakukan didalamnya. Nah, seperti telah disinggung sebelumnya
bahwasanya dalam membuat visualisasi seringkali ada aktivitas lain yang juga tak kalah
penting. Apakah Anda masih ingat apa itu? Transformasi data!
Pada sub-bab ini, Anda akan banyak melakukan proses transformasi data sebelum akhirnya
membuat visualisasi yang menarik. Anda diminta untuk mengamati kondisi infrastruktur
jalan raya di seluruh kabupatan dan kota di Indonesia. Menarik bukan? Berikut merupakan
baris kode untuk melihat nama-nama kolom yang berkaitan dengan informasi yang Anda
cari:
library(dplyr)
library(stringr)
jalan_kabkota <-
indodapoer %>%
transmute(
kabkota = area_name,
jalan_rusak_parah = length_of_district_road_bad_damage_in_km_bina_marga_data,
jalan_rusak_ringan = length_of_district_road_light_damage_in_km_bina_marga_data,
jalan_cukup_baik = length_of_district_road_fair_in_km_bina_marga_data ,
jalan_sangat_baik = length_of_district_road_good_in_km_bina_marga_data
)
glimpse(jalan_kabkota)
Pivot
Selanjutnya Anda diminta untuk melakukan pivot pada data jalan_kabkota tersebut
sehingga menghasilkan sebuah dataframe dengan tiga kolom, yaitu: kabkota, kondisi,
dan panjang_jalan. Anda dapat melakukan hal tersebut dengan menggunakan
fungsi pivot_longer() dari paket tidyr. Lengkapi baris kode berikut dan simpanlah
hasilnya sebagai jalan_kabkota (nama yang sama seperti sebelumnya). Berapa banyak baris
serta kolom dari data tersebut sebelum dan setelah dilakukan pivot?
library(tidyr)
library(dplyr)
glimpse(jalan_kabkota)
jalan_kabkota <-
jalan_kabkota %>%
pivot_longer(
cols = starts_with("jalan_"),
names_to = "kondisi",
names_prefix = "jalan_",
values_to = "panjang_jalan"
glimpse(jalan_kabkota)
library(stringr)
jalan_kabkota <-
jalan_kabkota %>%
mutate(
status = case_when(
TRUE ~ NA_character_
),
kondisi = factor(
kondisi,
glimpse(jalan_kabkota)
library(ggplot2)
library(dplyr)
library(ggridges)
jalan_kabkota_plot <-
jalan_kabkota %>%
ggplot(aes(panjang_jalan, kondisi)) +
facet_wrap(~status) +
geom_density_ridges_gradient(
aes(fill = after_stat(x)),
show.legend = FALSE
jalan_kabkota_plot
Transformasi Logaritmik
That’s the idea! Di ridgeline plot Anda dapat melakukan komparasi distribusi jalan
kabupaten/kota berdasarkan berdasarkan kondisinya dengan mudah. Namun, dalam grafik
tersebut masih ada beberapa hal yang harus diperbaiki. Contohnya adalah transformasi pada
sumbu-x untuk menangani permasalahan nilai kecil vs nilai besar serta penambahan teks
judul, subjudul, dan caption.
Lakukan transformasi logaritmik basis 10 pada sumbu-x menggunakan
fungsi scale_x_continous(). Aturlah argumen trans = "log10" pada fungsi tersebut.
Selain itu, Anda diminta untuk menambahkan garis vertikal untuk menandai panjang jalan
100 km. Pergunakanlah fungsi geom_vline() untuk melakukan hal tersebut!
install.packages("ggridges",repos = "http://cran.us.r-project.org")
library(ggplot2)
library(dplyr)
library(ggridges)
jalan_kabkota_plot <-
jalan_kabkota %>%
ggplot(aes(panjang_jalan, kondisi)) +
facet_wrap(~status) +
geom_density_ridges_gradient(
aes(fill = after_stat(x)),
show.legend = FALSE
jalan_kabkota_plot +
scale_x_continuous(trans = "log10")
Finalisasi
Jauh lebih baik, bukan? Anda juga dapat menggunakan scale_x_log10() yang
merupakan wrapper dari fungsi scale_x_continuous(trans = "log10"). Ada berbagai
transformasi yang dapat Anda lakukan pada axis grafik di ggplot2() dan banyak diantaranya
telah tersedia pada paket scales.
Sekarang merupakan tahap finalisasi yang perlu Anda lakukan pada grafik ridgeline tersebut:
install.packages("ggridges",repos = "http://cran.us.r-project.org")
library(ggplot2)
library(dplyr)
library(ggridges)
library(hrbrthemes)
jalan_kabkota_plot <-
jalan_kabkota %>%
ggplot(aes(panjang_jalan, kondisi)) +
facet_wrap(~status) +
geom_density_ridges_gradient(
aes(fill = after_stat(x)),
show.legend = FALSE
jalan_kabkota_plot +
scale_x_continuous(trans = "log10") +
scale_fill_viridis_c(option = "magma") +
labs(
y = NULL,
)+
library(ggplot2)
library(tidyr)
library(stringr)
library(forcats)
faskes_kalimantan <-
indodapoer %>%
transmute(
rumahsakit = number_of_hospitals,
polindes = number_of_polindes_poliklinik_desa_village_polyclinic,
puskesmas = number_of_puskesmas_and_its_line_services
) %>%
pivot_longer(
cols = -provinsi,
names_to = "faskes",
values_to = "jumlah"
) %>%
filter(!is.na(jumlah)) %>%
mutate(
glimpse(faskes_kalimantan)
Waffle Charts
Waffle charts dapat dibuat di ggplot2 dengan menggunakan bantuan
paket waffle. geom_waffle() yang memiliki dua aesthetic mappings wajib,
yakni fill dan values, merupakan fungsi utama dalam pembuatan jenis grafik tersebut.
Sekarang buatlah basis grafik tersebut dengan menggunakan data faskes_kalimantan yang
telah Anda siapkan!
Penuhilah ketentuan berikut: * faskes sebagai aesthetic
mapping warna fill * provinsi sebagai argumen dalam facet_wrap() * Simpan hasilnya
sebagai faskes_kalimantan_plot
install.packages("waffle", repos = "https://cinc.rud.is")
library(waffle)
library(ggplot2)
library(dplyr)
faskes_kalimantan_plot <-
faskes_kalimantan %>%
facet_wrap(~provinsi) +
geom_waffle(colour = "white")
faskes_kalimantan_plot
Selain hal di atas, pada kode yang tersedia Anda juga akan mengatur judul, subjudul,
dan caption grafik. Simpanlah grafik hasil modifikasi tersebut ke dalam obyek R
bernama faskes_kalimantan_plot (sama seperti obyek awal)!
install.packages("waffle", repos = "https://cinc.rud.is")
library(waffle)
library(ggplot2)
library(dplyr)
faskes_kalimantan_plot <-
faskes_kalimantan %>%
facet_wrap(~provinsi) +
geom_waffle(colour = "white")
faskes_kalimantan_plot <-
faskes_kalimantan_plot +
scale_fill_manual(
values = c(
"polindes" = "seagreen3",
"puskesmas" = "steelblue",
"rumahsakit" = "cyan4"
),
labels = c(
"puskesmas" = "Puskesmas",
)+
labs(
fill = NULL,
subtitle = "Berdasarkan data tahun 2011, satu petak menyatakan ±10 faskes",
faskes_kalimantan_plot
library(waffle)
library(ggplot2)
library(dplyr)
faskes_kalimantan_plot <-
faskes_kalimantan %>%
facet_wrap(~provinsi) +
geom_waffle(colour = "white")
faskes_kalimantan_plot <-
faskes_kalimantan_plot +
scale_fill_manual(
values = c(
"polindes" = "seagreen3",
"puskesmas" = "steelblue",
"rumahsakit" = "cyan4"
),
labels = c(
"puskesmas" = "Puskesmas",
)+
labs(
fill = NULL,
subtitle = "Berdasarkan data tahun 2011, satu petak menyatakan ±10 faskes",
faskes_kalimantan_plot +
coord_equal() +
theme(
plot.title.position = "plot",
legend.position = "bottom",
panel.background = element_blank(),
panel.grid = element_blank(),
strip.background = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank()
)
Epilog
Anda telah berhasil membuat beberapa grafik mengenai data INDO-DAPOER
menggunakan ggplot2! Saya berharap Anda menemukan beberapa informasi menarik dari
data tersebut. Berlimpahnya informasi pada data INDO-DAPOER tentunya membuat Anda
tertarik untuk melakukan eksplorasi labih dalam, kan? Pastinya akan banyak grafik-grafik
berisi informasi menarik yang dapat Anda buat dengan menggunakan data tersebut.
Nah, sebagai bekal tambahan bagi Anda, pada bab terakhir ini akan ditunjukan beberapa tips
dan trik untuk mengasah kemampuan Anda membuat visualisasi dengan ggplot2. Namun,
pada bab penutup ini Anda tidak akan menggunakan data INDO-DAPOER seperti
sebelumnya. Lantas data apakah yang akan digunakan?
Anda akan menggunakan data Instagram! Data instagram dapat diambil dengan
menggunakan teknik scrapping, loh! Apakah Anda pernah menggunakan teknik ini?
Next >
Kon(teks)
Data yang akan digunakan adalah mengenai hashtags dalam konten Instagram. Data
tersebut tersedia sebagai berkas CSV bernama hastags.csv. Anda akan ditunjukan
bagaimana cara membuat sebuah awan kata (worldcloud) dengan bantuan
paket ggworldcloud berdasarkan data tersebut.
Selain itu, Anda juga akan ditunjukan bagaimana cara menggunakan fonta yang berbeda
pada grafik dengan menggunakan bantuan paket showtext. Anda akan menggunakan
sebuah fonta dari Google bernama “Lacquer” dengan memanfaatkan
fungsi font_add_google(). Ingat! Anda harus menjalankan showtext_auto() sebelum
menjalankan baris kode pembuatan grafik agar fonta yang diimpor tersebut dapat
ditampilkan dengan baik.
Berikut potongan codes yang dapat Anda praktikkan langsung pada RStudio yang sudah
terinstall pada desktop Anda masing-masing
library(ggwordcloud)
library(showtext)
font_add_google("Lacquer")
showtext_auto()
hashtags %>%
ggplot(
aes(
label = hashtags,
size = count,
colour = contains_data_word
)
) +
geom_text_wordcloud_area(family = "Lacquer", shape = "square") +
scale_size_area(max_size = 20) +
scale_colour_manual(values = c("#009AB3", "#B0E601")) +
theme_void() +
theme(plot.background = element_rect(fill = "#1E1E1E"))
Next >
library(ggtext)
library(forcats)
library(ggplot2)
library(dplyr)
library(readr)
glimpse(igstats)
igstats_plot <-
igstats %>%
ggplot() +
geom_segment(aes(
x = 0,
xend = avglikes,
y = day,
yend = day
),
colour = "white",
linetype = "longdash"
)+
geom_point(
size = 18,
colour = "white",
show.legend = FALSE
)+
geom_text(
colour = "white",
family = "Lacquer",
size = 7
)+
geom_text(
colour = "white",
nudge_y = 0.15,
hjust = "left",
family = "Lacquer"
)+
geom_curve(
aes(
x = 185,
xend = 174,
y = 6.3,
yend = 6
),
colour = "white",
curvature = -0.3,
)+
geom_curve(
aes(
x = 185,
xend = 230,
y = 6.8,
yend = 7.2
),
colour = "white",
curvature = -0.25,
)+
annotate(
geom = "richtext",
x = 200,
y = 6.5,
fill = NA,
label.colour = NA,
colour = "white",
family = "Lacquer",
size = 4
)+
annotate(
geom = "text",
x = 200,
y = 3,
colour = "white",
hjust = "center",
family = "Lacquer",
size = 15
)+
theme_void() +
igstats_plot
Jati Diri
Apa pendapat Anda mengenai grafik tersebut? Apakah hasilnya sepadan dengan kerumitan
dalam proses pembuatannya?
Sekarang marilah berikan sentuhan akhir pada grafik tersebut dengan menambahkan logo!
Ada berbagai cara yang dapat digunakan untuk menambahkan logo pada grafik ggplot2,
salah satunya adalah dengan menggunakan fungsi draw_image() dari paket cowplot. Logo
yang akan digunakan beralamat di
“https://storage.googleapis.com/dqlab-dataset/assets/images/logo-dqlab.png”. Silakan
pergunakan alamat tersebut sebagai argumen image di draw_image()!
install.packages("cowplot",repos = "http://cran.us.r-project.org")
library(cowplot)
ggdraw(igstats_plot) +
draw_image(
image = "https://academy.dqlab.id/assets/images/logo-dqlab.png",
x = 0.425,
y = -0.44,
scale = 0.1
Melintasi Ruang
Eits! Sebagai penutup izinkan saya mendemonstrasikan cara membuat animasi sederhana
menggunakan ggplot melalui paket gganimate ya? Tentunya Anda dipersilakan untuk
menyalin kode berikut pada RStudio yang sudah terinstall pada desktop Anda masing-
masing
Next >
Selamat!
Selamat Anda telah berhasil menyelesaikan modul ini! Melalui modul ini Anda telah
mengenal sedikit lebih dalam mengenai fleksibilitas di ggplot2() dan bagaimana melakukan
kostumisasi grafik sesuai dengan keinginan. Selain itu, Anda juga telah berhasil melakukan
proses-proses tranformasi data yang cukup kompleks sebagai rangkaian dari tahapan
pembuatan grafik.
Visualisasi data merupakan area yang sangat kompleks dan luas. Oleh karena itu, topik yang
disajikan dalam modul ini tentunya masih sangat sedikit dan belum menyeluruh menyentuh
aspek-aspek penting lainnya dari visualisasi data. Sekarang giliran Anda untuk bereksplorasi
tentunya! Silakan tag akun DQLab (IG: @dqlab & LinkedIn: linkedin.com/company/dqlab/)
dan saya, Aswan (IG: @aswansyahputra_ & LinkedIn: linkedin.com/in/aswansyahputra/),
karena kami sangat bersemangat menantikan karya-karya terbaik Anda!
Untuk memperkecil resiko kredit ini, biasanya dilakukan proses yang disebut dengan credit
scoring dan credit rating terhadap pihak peminjam. Output proses ini akan menjadi basis
untuk menentukan apakah aplikasi pengajuan pinjaman baru diterima atau ditolak.
Credit Score
Credit score adalah nilai resiko yang diberikan kepada seorang individu atau organisasi yang
mengajukan pinjaman berdasarkan rekam jejak pinjaman dan pembayaran yang dilakukan.
Proses pemberian credit score ini biasanya disebut sebagai credit scoring.
Perhitungan credit score biasanya dibuat berdasarkan data historis lamanya keterlambatan
pembayaran dan yang tidak bayar sama sekali (bad debt). Bad debt biasanya mengakibatkan lembaga
pemberian kredit harus menyita aset atau melakukan write off .
Risk Rating
Kadang banyak lembaga yang menggunakan risk rating atau tingkat resiko. Terbalik
dengan credit score, semakin tinggi rating ini menunjukkan resiko yang semakin meningkat.
Selain itu kodifikasi juga dibuat lebih simpel dibandingkan rentang nilai sehingga keputusan
yang bisa diambil lebih cepat. Contoh, misalkan penggunaan kombinasi seperti huruf AAA,
AA+, P-1, dan seterusnya. Atau untuk banyak internal lembaga peminjam, kategorisasi hanya
menggunakan rentang angka yang kecil misalkan 1 sampai dengan 5.
Dari sini juga beberapa kolom juga diambil oleh analis untuk mencari pola keterkaitannya
terhadap rating ini, yaitu:
Jika jumlah tanggungan berjumlah kurang dari 5 orang , dan durasi pinjaman kurang
dari 24 bulan maka rating diberikan nilai 2 dan pengajuan pinjaman diterima.
Jika jumlah tanggungan berjumlah lebih dari 4 orang dan durasi pinjaman lebih dari
24 bulan maka maka rating diberikan nilai 5 dan pengajuan pinjaman ditolak.
Jika jumlah tanggungan berjumlah kurang dari 5, dan durasi pinjaman kurang dari 36
bulan maka maka rating diberikan nilai 3 dan diberikan pinjaman.
Nah, tiga aturan itu kita sebut sebagai model untuk memprediksi nilai risk rating dan menjadi
basis pengambilan keputusan terhadap aplikasi pinjaman baru.
Dengan model ini, lembaga pinjaman akan semakin cepat mengambil keputusan dan dengan
tingkat kesalahan pengambilan keputusan yang lebih minim.
Kesimpulan
Credit risk adalah resiko yang harus ditanggung oleh seorang individu atau lembaga ketika
memberikan pinjaman - biasanya dalam bentuk uang - ke individu atau pihak lain.
Resiko ini berupa tidak bisa dibayarkannya pokok dan bunga pinjaman, sehingga
mengakibatkan kerugian berikut:
Credit score dan risk rating adalah dua penilaian yang dilakukan meminimalkan resiko dari
pihak pemberi kredit. Karena berdasarkan kedua model penilaian tersebut, akan diputuskan
apakah aplikasi peminjaman seseorang disetujui atau ditolak.
Pada subbab berikutnya, kita akan melihat bagaimana model penilaian ini distrukturkan
dalam bentuk decision tree.
Next >
Desicion Tree
Decision Tree
Pada bab sebelumnya telah disebutkan sedikit mengenai proses pengambilan keputusan
dengan konstruksi rangkaian "Jika kondisi x maka .... selain itu .... " atau dikenal dengan
"IF ... ELSE ... ".
Dari contoh bab satu, rangkaiannya terlihat sebagai berikut:
Jika jumlah tanggungan berjumlah kurang dari 2 orang , dan durasi pinjaman kurang
dari 42 bulan maka rating diberikan nilai 1 dan pengajuan pinjaman diterima.
Jika jumlah tanggungan berjumlah lebih dari 4 orang dan durasi pinjaman lebih dari
30 bulan maka maka rating diberikan nilai 5 dan pengajuan pinjaman ditolak.
Jika jumlah tanggungan berjumlah kurang dari 5, dan durasi pinjaman kurang dari 30
bulan maka maka rating diberikan nilai 3 dan diberikan pinjaman.
Nah, rangkaian ini sebenarnya bisa dimodelkan kembali dengan apa yang dinamakan
struktur pohon keputusan atau decision tree, seperti ditampilkan secara visual sebagai
berikut.
Disini, proses pengambilan keputusan adalah melihat dari kondisi paling atas, yaitu berapa
jumlah tanggungan. Jika tanggungannya berjumlah 3 atau 4 maka akan langsung ke kotak
bawah paling kanan yang menunjukkan rating 3.
Dan kalau kita telusuri lagi, untuk jumlah tanggungan 5 dan durasi pinjaman kurang dari 30
maka akan masuk ke rating nilai 4. Lebih mudah dan cepat dimengerti, bukan?
Mari kita melangkah ke subbab berikutnya untuk melihat komponen dari decision tree.
Mengerti komponen-komponen ini sangat penting untuk nanti memahami output dari
algoritma machine learning yang digunakan.
Decision tree:
jumlah_tanggungan > 4:
:...durasi_pinjaman_bulan <= 24: 4 (112/30)
: durasi_pinjaman_bulan > 24: 5 (140/55)
jumlah_tanggungan <= 4:
:...jumlah_tanggungan > 2: 3 (246/22)
jumlah_tanggungan <= 2:
:...durasi_pinjaman_bulan <= 36: 1 (294/86)
durasi_pinjaman_bulan > 36:
:...jumlah_tanggungan <= 0: 2 (41/8)
jumlah_tanggungan > 0: 3 (67/4)
Ini adalah bentuk representasi tree dalam bentuk teks. Dimana pengecekan akan dimulai dari
variable jumlah_tanggungan. Sebagai contoh, jika jumlah tanggungan lebih dari 4 dan durasi
pinjaman sampai dengan maksimal 24 bulan maka rating diberikan nilai 4.
library("openxlsx")
library("C50")
#Mempersiapkan data
Kesimpulan
Decision tree adalah struktur model untuk pengambilan keputusan dimana kita mengikuti
alur dari suatu titik awal (yang disebut root node), kondisi-kondisi berikutnya, sampai
mencapai kesimpulan.
Komponen-komponen dari decision tree ini adalah sebagai berikut:
Root node
Branch atau split
Node
Leaf node
Ini adalah model output yang cocok dihasilkan para analis untuk membantu
mengidentifikasi risk rating. Dan beruntungnya, model ini bisa otomatis dihasilkan dari
algoritma machine learning dengan input data historis credit. Dan ini telah ditunjukkan
dengan contoh menggunakan algoritma bernama C5.0.
Algoritma C5.0
Apa itu algoritma C5.0?
C5.0 adalah kode penamaan suatu algoritma untuk decision tree. Banyak algoritma lain
seperti random forest, CART, CHAID, MARS, dan lain-lain. Namun C5.0 adalah algoritma yang
sangat populer karena memiliki performa yang sangat baik dari sisi kecepatan maupun
akurasi.
Algoritma ini sering dikategorikan sebagai classification, dimana tujuannya adalah untuk
mengkategorikan atau mengklasifikan sesuatu - pada contoh kita risk rating - berdasarkan
input dari data-data lain.
Pada bab sebelumnya, kita sudah melihat hasil output dari algoritma ini sebagai berikut.
Decision tree:
jumlah_tanggungan > 4:
:...durasi_pinjaman_bulan <= 24: 4 (112/30)
: durasi_pinjaman_bulan > 24: 5 (140/55)
jumlah_tanggungan <= 4:
:...jumlah_tanggungan > 2: 3 (246/22)
jumlah_tanggungan <= 2:
:...durasi_pinjaman_bulan <= 36: 1 (294/86)
durasi_pinjaman_bulan > 36:
:...jumlah_tanggungan <= 0: 2 (41/8)
jumlah_tanggungan > 0: 3 (67/4)
Sepanjang bab ini dan berikutnya, kita akan fokus melakukan praktek bagaimana
menghasilkan model ini, mengerti output-output yang dikeluarkan, dan mengevaluasi
akurasi model berdasarkan output tersebut.
Tujuan kita sepanjang course ini adalah memprediksi nilai pada kolom risk rating (7)
berdasarkan data-data lain yang menyertai (1 s/d 6). Dengan demikian, risk rating disebut
sebagai class variable. Kolom-kolom lainnya disebut sebagai input variables. Input variables
bisa digunakan sebagian saja, namun class variable harus selalu digunakan untuk
membentuk model.
Dan pada algoritma C5.0 di R, class variable harus selalu berupa factor. Jadi jika dibaca
sebagai tipe data lain, maka harus dikonversi terlebih dahulu menjadi factor.
Untuk class variable kita, yaitu risk_rating ternyata masih dibaca dalam bentuk numerik.
Untuk menjadi class variable yang digunakan pada algoritma C5.0, maka in perlu dikonversi
menjadi factor. Ini bisa dilakukan dengan menggunakan perintah berikut.
Cobalah masukkan perintah ini untuk menggantikan bagian #[...] pada code editor dan klik
tombol Run. Jika berjalan dengan lancar, maka outputnya akan terlihat seperti berikut.
#Mempersiapkan data
str(dataCreditRating)
str(dataCreditRating)
Catatan: kode_kontrak harusnya tidak dipilih karena unik untuk keseluruhan data, dan tidak
menjadi penentu untuk membentuk pola. Tetapi ini dimasukkan dengan tujuan untuk
menunjukkan C5.0 memiliki kemampuan untuk membuang variable input yang tidak relevan
secara otomatis.
Tambahkan ketiga perintah tersebut untuk menggantikan #[...] pada code editor. Dan
jalankan code ini, jika berhasil maka akan muncul tampilan berikut.
library("openxlsx")
#Mempersiapkan data
str(dataCreditRating)
str(datafeed)
Training set: adalah porsi dataset yang digunakan oleh algoritma untuk dianalisa dan
menjadi input untuk pembentukan model.
Testing set: adalah porsi dataset yang tidak digunakan untuk membentuk model, tapi
untuk menguji model yang telah dibentuk.
set.seed(100)
indeks_training_set <- sample(900, 800)
dimana:
set.seed(100) adalah perintah untuk menyeragamkan pengambilan bilangan acak di
seluruh aplikasi R.
sample(900, 800) adalah membuat urutan acak dengan rentang nilai 1 sampai
dengan 900, tetapi diambil sebanyak 800 nilai.
Masukkan kedua perintah di atas untuk menggantikan bagian #[...1...] pada code editor.
Langkah kedua adalah membuat variable untuk training set (input dan class variable) dan
testing set (input variable saja) berdasarkan index di atas dengan perintah berikut.
dimana:
Masukkan kedua perintah tersebut ke dalam code editor untuk menggantikan bagian
#[...2...]. Jalankan dan lihat hasilnya, jika berjalan dengan lancar maka akan tampil dua
struktur dataset dimana satunya berjumlah 800 row dan satunya berjumlah 100.
> str(input_training_set)
'data.frame': 800 obs. of 2 variables:
$ durasi_pinjaman_bulan: num 36 24 12 36 48 24 24 36 24 12 ...
$ jumlah_tanggungan : num 2 0 3 4 6 4 3 2 1 4 ...
> str(class_training_set)
Factor w/ 5 levels "1","2","3","4",..: 2 1 3 2 5 3 3 2 2 3 ...
> str(input_testing_set)
'data.frame': 100 obs. of 2 variables:
$ durasi_pinjaman_bulan: num 12 48 24 12 36 24 24 48 36 12 ...
$ jumlah_tanggungan : num 0 3 5 0 5 5 5 0 2 4 ...
library("openxlsx")
#Mempersiapkan data
set.seed(100)
str(input_training_set)
str(class_training_set)
str(input_testing_set)
C5.0(input_variables, class_variables)
Dengan menggunakan dataset yang sudah kita siapkan maka perintah untuk membentuk
model dan sekaligus menyimpannya dalam satu variable bernama risk_rating_model adalah
sebagai berikut:
Namun kita belum selesai, setelah pembentukan model coba tampilkan overview model tersebut
dengan perintah summary.
summary(risk_rating_model)
Masukkan kedua code yang telah dicontohkan ke dalam code editor untuk menggantikan bagian
#[...1...] dan jalankan. Jika semua berjalan dengan lancar, maka output yang dihasilkan adalah
sebagai berikut. Detil output ini akan kita bahas pada bab berikutnya.
Decision tree:
jumlah_tanggungan > 4:
:...durasi_pinjaman_bulan <= 24: 4 (98/25)
: durasi_pinjaman_bulan > 24: 5 (129/49)
jumlah_tanggungan <= 4:
:...jumlah_tanggungan > 2: 3 (219/17)
jumlah_tanggungan <= 2:
:...durasi_pinjaman_bulan <= 36: 1 (259/80)
durasi_pinjaman_bulan > 36:
:...jumlah_tanggungan <= 0: 2 (37/7)
jumlah_tanggungan > 0: 3 (58/2)
Decision Tree
----------------
Size Errors
6 180(22.5%) <<
Attribute usage:
100.00% jumlah_tanggungan
72.62% durasi_pinjaman_bulan
library("openxlsx")
library("C50")
#Mempersiapkan data
summary(risk_rating_model)
Dengan code praktek yang telah kita lakukan - dimana model kita namakan
risk_rating_model - maka perintah tersebut kita sesuaikan menjadi.
plot(risk_rating_model)
Ketikkan perintah tersebut untuk menggantikan bagian #[...1...] dari code editor. Jalankan,
dan jika berhasil Anda akan mendapatkan diagram decision tree sebagai berikut.
Arti dari output diagram ini akan kita jelaskan pada bab berikutnya. Klik tombol Submit Code
untuk melanjutkan.
library("openxlsx")
library("C50")
#Mempersiapkan data
plot(risk_rating_model)
Kesimpulan
Algoritma C5.0 adalah algoritma machine learning yang digunakan untuk membentuk model
pohon keputusan (decision tree) secara otomatis, dan cocok untuk memodelkan dan sebagi
alat prediksi credit rating.
Karena algoritma ini masuk ke dalam kategori classification, variable yang diperlukan oleh
algoritma ini ada dua macam:
Class variable, yaitu variable yang berisi nilai yang ingin kita klasifikasikan. Variable
ini harus berisi tipe factor.
Input variables, yaitu variable-variable yang berisi nilai input.
Dan untuk mengukur akurasi dari model yang kita hasilkan, kita sebaiknya membagi dataset
yang ada menjadi dua porsi secara random:
Setelah semua persiapan dataset ini selesai, pada penutup bab dataset ini kita menggunakan
fungsi C5.0 untuk membentuk model risk rating. Dan untuk mencetak hasil yang bisa dibaca
atas model ini, kita gunakan fungsi summary. Sedangkan untuk menghasilkan diagram
decision tree kita gunakan perintah plot. Semua function ini dari package C50.
Decision tree:
jumlah_tanggungan > 4:
:...durasi_pinjaman_bulan <= 24: 4 (98/25)
: durasi_pinjaman_bulan > 24: 5 (129/49)
jumlah_tanggungan <= 4:
:...jumlah_tanggungan > 2: 3 (219/17)
jumlah_tanggungan <= 2:
:...durasi_pinjaman_bulan <= 36: 1 (259/80)
durasi_pinjaman_bulan > 36:
:...jumlah_tanggungan <= 0: 2 (37/7)
jumlah_tanggungan > 0: 3 (58/2)
Decision Tree
----------------
Size Errors
6 180(22.5%) <<
Attribute usage:
100.00% jumlah_tanggungan
72.62% durasi_pinjaman_bulan
Ini artinya class variable kita dilabelkan atau dinamakan sebagai outcome. Jika kita kita ingin
merubah label yang lebih mewakili, yaitu "Risk Rating", maka bisa kita tambahkan
parameter control dengan input berupa fungsi C5.0Control dan parameter label sebagai
berikut.
Tambahkan code ini ke bagian [...1...] dari code editor, dimana sudah dimasukkan seluruh
code dari bab sebelumnya - dan jalankan. Jika berjalan dengan baik, maka akan muncul
bagian output class label sebagai berikut.
Terlihat label class kita sudah berubah menjadi "Risk Rating". Klik tombol Next untuk
melanjutkan ke pembahasan output berikutnya.
library("openxlsx")
library("C50")
#Mempersiapkan data
#menghasilkan model
summary(risk_rating_model)
Hasil ini artinya kita membaca 800 baris data. Ini karena kita mengambil 800 dari 900 data
kita menggunakan function sample berikut.
sample(900, 800)
Kemudian untuk bagian 3 attributes, ini artinya kita memiliki tiga variable, yaitu:
class variable: risk_rating
Untuk undefined.data bisa kita abaikan saja, karena bagian ini harusnya berisi informasi
file .data dari program C5.0 yang asli. Jika ingin mengetahui lebih lanjut mengenai hal ini bisa
dilihat pada url https://www.rulequest.com/see5-unix.html dan fokus ke bagian preparing
data.
Cobalah Anda ganti dua hal berikut pada code editor:
Cobalah jalankan dan harusnya Anda akan mendapatkan output baru sebagai berikut.
Perhatikan jumlah cases dan attributes sudah berubah.
kpr_aktif = TIDAK:
:...durasi_pinjaman_bulan <= 24: 1 (189/45)
: durasi_pinjaman_bulan > 24: 2 (136/47)
kpr_aktif = YA:
:...jumlah_tanggungan <= 4: 3 (259/4)
jumlah_tanggungan > 4:
:...durasi_pinjaman_bulan <= 24: 4 (87/15)
durasi_pinjaman_bulan > 24: 5 (109/31)
library("openxlsx")
library("C50")
#Mempersiapkan data
#menghasilkan model
summary(risk_rating_model)
Decision tree:
jumlah_tanggungan > 4:
:...durasi_pinjaman_bulan <= 24: 4 (98/25)
: durasi_pinjaman_bulan > 24: 5 (129/49)
jumlah_tanggungan <= 4:
:...jumlah_tanggungan > 2: 3 (219/17)
jumlah_tanggungan <= 2:
:...durasi_pinjaman_bulan <= 36: 1 (259/80)
durasi_pinjaman_bulan > 36:
:...jumlah_tanggungan <= 0: 2 (37/7)
jumlah_tanggungan > 0: 3 (58/2)
Untuk membantu penjelasan, DQLab melakukan format ulang hasil tersebut dengan
memberikan pewarnaan.
Decision tree:
jumlah_tanggungan > 4:
:...durasi_pinjaman_bulan <= 24: 4 (98/25)
: durasi_pinjaman_bulan > 24: 5 (129/49)
jumlah_tanggungan <= 4:
:...jumlah_tanggungan > 2: 3 (219/17)
jumlah_tanggungan <= 2:
:...durasi_pinjaman_bulan <= 36: 1 (259/80)
durasi_pinjaman_bulan > 36:
:...jumlah_tanggungan <= 0: 2 (37/7)
jumlah_tanggungan > 0: 3 (58/2)
Warna biru adalah node dan kondisi splitnya. Hubungan antar node (connector) ditulis
dengan karakter titik dua dan titik berulang (:...).
Warna merah adalah leaf node atau klasifikasinya.
Warna ungu adalah statistik kesalahannya dalam bentuk (jumlah_klasifikasi /
jumlah_kesalahan).
Mari kita ambil contoh satu alur yang telah diwarnai berikut.
Decision tree:
jumlah_tanggungan > 4:
:...durasi_pinjaman_bulan <= 24: 4 (98/25)
: durasi_pinjaman_bulan > 24: 5 (129/49)
jumlah_tanggungan <= 4:
:...jumlah_tanggungan > 2: 3 (219/17)
jumlah_tanggungan <= 2:
:...durasi_pinjaman_bulan <= 36: 1 (259/80)
durasi_pinjaman_bulan > 36:
:...jumlah_tanggungan <= 0: 2 (37/7)
jumlah_tanggungan > 0: 3 (58/2)
Dari sini alur pengambilan keputusan untuk menentukan risk rating adalah: Jika jumlah
tanggungan >lebih dari 4 maka perlu dilihat kondisi berikutnya yaitu:
1. Jika durasi pinjaman sampai dengan 24 bulan, maka klasifikasi risk ratingnya adalah
4.
Dari dataset training, alur ini mengklasifikasikan 98 data, namun 25 diantara 98 data
ini salah klasifikasi. Berikut adalah tampilan data asal kita, terlihat beberapa kondisi
yang terpenuhi namun bukan dengan nilai risk rating 4 (warna merah).
2. Jika durasi pinjaman lebih dari 24 bulan, maka klasifikasi risk ratingnya adalah 5.
Dari dataset training, alur ini mengklasifikasikan 129 data, namun 49 diantara 129
data ini salah klasifikasi. Berikut adalah tampilan data asal kita, terlihat beberapa
kondisi yang terpenuhi namun bukan dengan nilai risk rating 5 (warna merah).
Dengan demikian, model yang dibentuk untuk melakukan otomatisasi untuk klasifikasi atau
prediksi ini tetap memiliki tingkat resiko kesalahan. Pada bab berikutnya kita akan
melakukan evaluasi apakah dengan persentase kesalahan ini masih dalam toleransi yang
baik, sehingga model layak digunakan.
Decision Tree
----------------
Size Errors
6 180(22.5%) <<
Confusion Matrix
Tampilan output berikutnya adalah semacam tabel yang disebut dengan confusion
matrix dengan ukuran 5 x 5.
Confusion matrix atau error matrix adalah tabel yang menunjukkan hasil dari klasifikasi yang
dilakukan model versus (dibandingkan) dengan data klasifikasi sebenarnya, dengan
demikian menunjukkan seberapa akurat model melakukan klasifikasi atau prediksi.
Confusion matrix ini terdiri dari jumlah kolom dan row yang sama. Dimana header dari row
dan kolom adalah merupakan representasi dari nilai class variable - untuk contoh kita adalah
representasi risk_rating. Untuk kasus kita dimana class variable ada 5, maka tabelnya
berukuran 5 x 5 seperti terlihat di atas.
Untuk lebih jelasnya, mari kita diskusikan arti dari nilai-nilai pada baris pertama dari matrix
ini.
Angka 179 pada kolom pertama baris pertama menunjukkan jumlah data yang benar
klasifikasi atau prediksinya, dimana:
o klasifikasi model terhadap data mendapatkan risk_rating 1
o pada data aktual juga nilai risk_rating-nya 1
Angka 1 pada kolom kedua baris pertama menunjukkan jumlah data yang salah
prediksi, dimana:
o klasifikasi model terhadap data mendapatkan risk_rating 2
o pada data aktual ternyata nilai risk_rating-nya 1
Angka 5 pada kolom ketiga baris pertama menunjukkan jumlah data yang salah
prediksi, dimana:
o klasifikasi model terhadap data mendapatkan risk_rating 3
o pada data aktual ternyata nilai risk_rating-nya 1
Angka 5 pada kolom keempat baris pertama menunjukkan jumlah data yang salah
prediksi, dimana:
o klasifikasi model terhadap data mendapatkan risk_rating 4
o pada data aktual ternyata nilai risk_rating-nya 1
Angka 6 pada kolom kelima baris pertama menunjukkan jumlah data yang salah
prediksi, dimana:
o klasifikasi model terhadap data mendapatkan risk_rating 5
o pada data aktual ternyata nilai risk_rating-nya 1
Kita bisa ambil kesimpulan dari penjelasan di atas, jika perpotongan kolom dan baris jatuh
pada label yang sama maka klasifikasi dari model itu benar. Sedangkan jika beda label maka
salah.
Dari kesimpulan di atas juga, maka kita bisa ambil keseimpulan lanjutan kalau diagonal ke
kanan bawah di confusion matrix menunjukkan seluruh prediksi yang benar dari model,
karena berpotongan di label yang sama, seperti terlihat pada angka-angka yang diwarnai
biru sebagai berikut. Untuk angka yang berwarna merah merupakan representasi jumlah
data yang salah prediksi.
Total adalah 800 data, sesuai dengan statistik sebenarnya. Angka 180 yang merupakan error
juga konsisten dengan hasil output di subbab sebelumnya.
Merubah Label Class Variable
Label risk rating pada confusion matrix kita saat ini adalah 1 sampai dengan 5. Ini karena
kebetulan contoh class variable kita adalah angka terurut seperti itu.
Agar tidak bingung mari kita ubah isi dari variable risk_rating dari 1, 2, 3, 4, dan 5 menjadi
"satu", "dua", "tiga", "empat" dan "lima" dengan perintah-perintah berikut.
Tiap perintah ini memiliki tiga bagian, kita akan ambil contoh untuk perintah pertama:
Dengan demikian, arti dari perintah pertama adalah memasukkan teks "satu" ke variable
risk_rating dengan indeks dimana nilai risk_rating bernilai "1".
Masukkan kelimat perintah tersebut untuk menggantikan #[...1...] pada code editor kita dan
jalankan. Jika berhasil, perhatikan output confusion matrix dimana labelnya - ditandai
dengan warna biru - sudah berubah menjadi teks "dua", "empat", "lima", "satu", dan "tiga"
(diurutkan berdasarkan alfabet).
Demikian praktek kita kali ini, yang bertujuan untuk memperjelas output confusion matrix
dari summary C5.0. Label "satu", "dua", dstnya hanya untuk menunjukkan, tapi tidak akan
digunakan di content berikutnya.
library("openxlsx")
library("C50")
#Mempersiapkan data
#menghasilkan model
summary(risk_rating_model)
Variable-variable Penentu
Output terakhir adalah daftar variable-variable yang digunakan oleh model decision tree.
Attribute usage:
100.00% jumlah_tanggungan
72.62% durasi_pinjaman_bulan
Pada subbab berikutnya, kita akan bahas mengenai potongan dari diagram ini. Klik tombol
Next untuk melanjutkan.
Kesimpulan
Bab ini memfokuskan diri untuk memberi penjelasan output dari model yang meliputi aspek
berikut:
Dengan tingkat error 22.5 persen, model ini harusnya cukup layak digunakan. Dari confusion
matrix juga terlihat banyak sekali yang diprediksi dengan benar, terutama untuk nilai
risk_rating 4 dan 5. Pada bab berikutnya, kita akan evaluasi model ini dengan memprediksi
nilai dari testing set.
Evaluasi Model
Pendahuluan
Confusion Matrix yang terdapat pada output model kita sebelumnya adalah evaluasi model
menggunakan training set. Namun, kita perlu evaluasi model ini terhadap testing set yang
telah kita siapkan.
Bab ini akan fokus ke melakukan hal ini dengan cara menggunakan model ini untuk prediksi
class variable dari data test kita dan kemudian membandingkan dengan nilai sebenarnya.
Klik tombol Next untuk melanjutkan.
Next >
predict(model, test_set)
dan untuk contoh kita, maka tampilan lengkapnya adalah sebagai berikut.
predict(risk_rating_model, input_testing_set)
Gantilah bagian #[...1...] pada code editor dengan perintah di atas dan jalankan. Jika berjalan
dengan baik, maka tampilan hasilnya adalah sebagai berikut.
Terlihat hasil prediksi semua sesuai dengan posisi baris data dari testing set. Dan ini juga
sesuai dengan rentang nilai risk_rating, yaitu 1 sampai dengan 5.
Pada bagian berikutnya kita akan menyimpan hasil ini ke dalam variable data
frame input_testing_set.
library("openxlsx")
library("C50")
#Mempersiapkan data
#menghasilkan model
predict(risk_rating_model, input_testing_set)
Catatan: Ingat jika -index_training_set (dengan tanda minus di depan) menunjukkan angka-
angka indeks untuk testing set.
Kemudian gunakan perintah kedua untuk menyimpan nilai prediksi ke dalam kolom
hasil_prediksi.
Masukkan perintah tersebut untuk menggantikan bagian #[...1...] pada code editor. Setelah
itu coba ganti bagian [...2...] dengan perintah untuk menampilkan seluruh isi variable
input_testing_set dengan perintah berikut.
print(input_testing_set)
Jika semua berjalan lancar maka akan tampil output sebagai berikut. Dengan kolom
risk_rating dan hasil_prediksi bersampingan, kita bisa langsung bandingkan data awal
dengan hasil prediksi. Terlihat ada rating yang sama (prediksi benar) dan berbeda (prediksi
salah). Kita akan evaluasi tingkat akurasi dari kedua kolom ini dengan
menghasilkan confusion matrix pada bagian selanjutnya.
library("openxlsx")
library("C50")
#Mempersiapkan data
print(input_testing_set)
Dan untuk kasus kita, maka modifikasi perintahnya adalah sebagai berikut.
hasil_prediksi 1 2 3 4 5
1 1 29 6 0 0 0
2 2 1 3 0 0 0
3 3 0 7 29 0 0
4 4 1 3 0 9 1
5 5 0 1 0 5 5
Header kolom yang berwarna ungu menunjukkan risk_rating hasil prediksi, sedangkan
header baris warna ungu menunjukkan data risk_rating sebenarnya. Diagonal warna biru
menunjukkan jumlah data yang terprediksi dengan benar, dan warna merah menunjukkan
data yang salah terprediksi.
Sekilas terlihat jumlah yang terprediksi dengan benar jauh lebih besar porsinya dibandingkan
yang salah. Namun untuk yang 4 dan 5 ada sedikit catatan diman prediksi 5 itu kadang jatuh
ke 4. Namun ini bisa kita abaikan, karena 4 dan 5 memang beresiko tinggi.
Untuk rasio persentase kebenaran dan kesalahan prediksi lebih detil akan kita hitung pada
bagian berikutnya.
library("openxlsx")
library("C50")
library("reshape2")
#Mempersiapkan data
#menghasilkan model
#menyimpan risk_rating dari data awal dan hasil prediksi testing set ke dalam kolom hasil_prediksi
input_testing_set$risk_rating==input_testing_set$hasil_prediksi
Disini kita gunakan operator == untuk membandingkan. Cobalah ketik perintah tersebut
untuk menggantikan bagian [...1...] dan jalankan. Jika berhasil maka akan keluar input
tersebut.
> input_testing_set$risk_rating==input_testing_set$hasil_prediksi
[1] TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
[13] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE FALSE TRUE
[25] TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[37] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE
[49] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE
[61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[73] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
[85] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
[97] TRUE TRUE TRUE TRUE
Ini artinya kalau TRUE maka data pada posisi tersebut prediksinya benar dan FALSE untuk
sebaliknya, data pada posisi tersebut salah prediksinya. Namun ini masih belum dalam
bentuk yang kita inginkan. Kita masih perlu beberapa tambahan perintah tersebut untuk
mengeluarkan persentase prediksi yang tepat.
Langkah berikutnya, adalah menyaring data frame tersebut dengan hasil tadi dengan
perintah berikut.
input_testing_set[input_testing_set$risk_rating==input_testing_set$hasil_prediksi,]
Jika dijalankan dan berhasil dengan baik, maka akan muncul sebagian hasil output berikut.
nrow(input_testing_set[input_testing_set$risk_rating==input_testing_set$hasil_prediks
i,])
Jika berjalan dengan lancar, maka hasil outputnya adalah sebagai berikut.
>
nrow(input_testing_set[input_testing_set$risk_rating==input_testing_set$hasil_prediks
i,])
[1] 75
Angka 75 ini menunjukkan jumlah data dengan prediksi yang benar terhadap testing set.
Karena testing set berjumlah 100, maka persentase prediksi yang benar adalah 75%, dan
error rate atau persentase yang salah adalah 25%.
Mari kita cek hasil tersebut dengan menjumlahkan posisi diagonal pada confusion matrix kita
sebelumnya.
hasil_prediksi 1 2 3 4 5
1 1 29 6 0 0 0
2 2 1 3 0 0 0
3 3 0 7 29 0 0
4 4 1 3 0 9 1
5 5 0 1 0 5 5
Hasilnya juga 75 yang merupakan hasil dari operasi penjumlah 29 + 3 + 29 + 9 + 5. Klik tombol
Submit Code untuk melanjutkan.
library("openxlsx")
library("C50")
#Mempersiapkan data
#menghasilkan model
#menyimpan risk_rating dari data awal dan hasil prediksi testing set ke dalam kolom hasil_prediksi
> nrow(input_testing_set[input_testing_set$risk_rating!
=input_testing_set$hasil_prediksi,])
[1] 25
Terlihat bahwa jumlah prediksi error ada 25. Hasil ini konsisten jika dibandingkan dengan
jumlah 75 dari prediksi yang benar, dimana total keduanya adalah 100 - yang merupakan
jumlah data untuk testing set. Klik tombol Submit Code untuk melanjutkan ke bagian
berikutnya.
library("openxlsx")
library("C50")
#Mempersiapkan data
#menghasilkan model
#menyimpan risk_rating dari data awal dan hasil prediksi testing set ke dalam kolom hasil_prediksi
nrow(input_testing_set[input_testing_set$risk_rating!=input_testing_set$hasil_prediksi,])
Kesimpulan
Bab ini berisi praktek yang cukup singkat, namun menjadi bagian yang sangat penting yaitu
untuk pertama kalinya kita melakukan prediksi dengan function predict terhadap porsi data
testing set.
Tujuannya adalah mengukur akurasi dari hasil prediksi dengan data awal. Ini digunakan
dengan menggunakan confusion matrix juga dan menghitung jumlah prediksi data yang
benar dan salah secara agak "manual". Pendekatan terakhir adalah membandingkan data
awal dan hasil prediksi di data frame dengan operator ==, !=, dan nrow.
Dengan tingkat error 25%, dan walaupun ada catatan untuk klasifikasi 4 dan 5, namun secara
garis besar kita anggap model ini cukup baik. Dan dengan keputusan ini, saatnya kita
mengadopsi model ini untuk melakukan prediksi per data aplikasi kredit baru yang masuk.
jumlah_tanggungan
durasi_pinjaman_bulan
Keduanya dalam bentuk numerik (angka). Dan berikut adalah contoh membentuk data frame
dengan dua variable tersebut.
Code tersebut sudah terdapat pada code editor. Namun, Anda perlu tampilkan variable
tersebut dengan perintah print. Jika berhasil jalankan dengan lancar maka akan muncul hasil
sebagai berikut.
jumlah_tanggungan durasi_pinjaman_bulan
1 6 12
Kita akan gunakan data frame ini sebagai input untuk prediksi di bagian berikutnya.
#Membuat data frame aplikasi baru
print(aplikasi_baru)
Melakukan Prediksi terhadap Data Pengajuan
Baru
Data aplikasi baru yang telah kita buat sebelumnya akan diprediksi nilai risk_rating-nya
dengan fungsi predict, dimana cara penggunaannya masih sama dengan cara yang
ditunjukkan pada bab evaluasi model, yaitu dengan syntax berikut.
predict(model, dataframe)
Code editor telah terisi code-code yang digunakan untuk membentuk model dan data frame
aplikasi baru. Gantilah bagian [...1...] dengan code untuk melakukan prediksi. Sesuaikan
perintah di atas dengan nama model dan variable yang digunakan.
Variable risk_rating_model sebagai model dan aplikasi_baru sebagai data frame yang akan di
prediksi.
Jika berjalan dengan lancar maka output dari perintah tersebut akan muncul sebagai
berikut.
[1] 4
Levels: 1 2 3 4 5
Ini artinya hasil prediksi risk_rating untuk aplikasi baru ini adalah 4, dari kemungkinan 1, 2, 3,
4 dan 5. Nilai 4 ini adalah nilai resiko yang cukup tinggi, jadi bisa saja aplikasi baru ini ditolak
sesuai dengan kebijakan lembaga peminjam.
library("openxlsx")
library("C50")
#Mempersiapkan data
#melakukan prediksi
predict(risk_rating_model, aplikasi_baru)
library("openxlsx")
library("C50")
#Mempersiapkan data
#melakukan prediksi
predict(risk_rating_model, aplikasi_baru)
library("openxlsx")
library("C50")
#Mempersiapkan data
#melakukan prediksi
predict(risk_rating_model, aplikasi_baru)
Kesimpulan
Bab ini telah menunjukkan bagaimana kita melakukan prediksi nilai resiko kredit
(risk_rating) terhadap data aplikasi baru.
Fungsi yang digunakna sangat sederhana, tetapi kita perlu ketat dengan syarat ketika
menyiapkan input:
Jika syarat tidak terpenuhi, misalkan kita memiliki kelebihan satu kolom data frame yang
tidak digunakan pada saat memberikan input ke model akan berakibat error pada saat
melakukan prediksi.
Next >
Penutup
Kesimpulan
Selamat, Anda sudah berhasil menyelesaikan seluruh content pada course ini. Pada course
ini Anda telah mempelajari mengenai kasus bisnis resiko kredit pada dunia finance. Dengan
mengerti apa pengertian credit risk, credit scoring, risk rating dan problem-problem yang
dihadapi kita dapat maju ke pencarian solusi yang tepat.
Problem yang dihadapi adalah lambatnya analisa resiko sehingga lembaga kredit bisa
kehilangan kesempatan (lost opportunity) ketika calon peminjam tidak jadi bertransaksi.
Solusi machine learning denga algoritma decision tree sangat cocok diterapkan untuk
membantu memprediksi credit risk dengan cepat. Konkritnya adalah penggunaan algoritma
C5.0 di R.
Terkait hal tersebut, sepanjang bab ini Anda telah menempuh perjalanan sebagai seorang
data scientist yang menerapkan solusi tersebut:
Semua hal ini bertujuan untuk meningkatkan penjualan sekaligus memecahkan masalah
inventory – karena produk yang tidak begitu laku jika dipasangkan dengan tepat akan lebih
menarik dan punya kemungkinan besar dibeli dalam satu paket. Proses ini merupakan
proses analisa yang disebut dengan Market Basket Analysis (MBA).
items transactionID
[1] {Pet Food,Sirup,Teh Celup} #01
[2] {Gula,Teh Celup} #02
[3] {Pet Food,Sirup} #03
[4] {Sirup,Teh Celup} #04
[5] {Gula,Sirup,Teh Celup} #05
[6] {Pet Food,Teh Celup} #06
[7] {Pet Food,Sirup,Teh Celup} #07
[8] {Teh Celup} #08
[9] {Gula,Teh Celup} #09
[10] {Gula,Pet Food,Sirup} #10
Dan hasil pemaketan produk yang disarankan terlihat seperti berikut .
Hasil pada baris pertama dan kedua menunjukkan produk "Pet Food" cocok dipasangkan dengan
"Sirup". Lebih detilnya mengenai hasil ini akan dijelaskan pada bab-bab berikutnya.
library(arules)
inspect(transaksi)
inspect(subset(mba, lift>1))
Kesimpulan
Market Basket Analysis (MBA) adalah teknik analisa yang digunakan oleh bisnis di bidang
ritel untuk mencari asosiasi produk yang kuat, atau dengan kata lain menemukan paket
produk yang bisa berdampak besar pada penjualan.
Algoritma yang bisa digunakan di R untuk melakukan MBA ini adalah apriori dari
package arules. Data yang diperlukan hanya dua, yaitu data transaksi dan data produk.
Dengan paket produk yang ditemukan, bisnis dapat melakukan beberapa hal berikut:
Algoritma Apriori
Algoritma Apriori dan Association Rules
Bicara mengenai pemaketan produk sebenarnya adalah mencari produk-produk yang
memiliki hubungan atau asosiasi kuat di dalam transaksi. Hubungan "kuat" disini akan
dilihat berdasarkan proporsi jumlah kemunculan kombinasi produk yang akan dipaketkan
dengan keseluruhan transaksi.
Mari kita lihat contoh pada gambar berikut. Nomor transaksi (1 s/d 5) menunjukkan nomor
struk belanja. Sedangkan gambar buah yang berwarna menunjukkan produk atau item yang
dibeli.
Pada gambar terlihat ada dua transaksi dimana terdapat buah rambutan dan pisang. Dan
dimana terdapat pisang maka ada rambutan, dan sebaliknya. Ini menunjukkan hubungan
atau asosiasi yang kuat diantara dua produk buah ini.
Apel sendiri terdapat di seluruh transaksi, sehingga ada atau tidak ada produk buah lain tidak
menjadi "masalah" buat Apel. Istilahnya, untuk laku maka Apel jual mahal... tidak
memerlukan apapun jadi pendampingnya. Bisa dikatakan, tidak ada asosiasi antara apel
dengan produk apapun. Jeruk, apel dan rambutan ada dua kali muncul, tapi jeruk bisa
muncul sendirian juga bersama apel. Sehingga kombinasi paket jeruk, apel dan rambutan
walaupun ada asosiasi tapi tidak sekuat apel dan rambutan.
Nah, terlihat kan ada kombinasi-kombinasi yang perlu diperiksa? Untuk 4 item dari contoh
transaksi kita, dengan minimal 2 item per transaksi maka ada 9 kombinasi yang perlu dicek.
Dengan makin banyaknya item maka kombinasi juga akan berkembang cepat.
Sebagai gambaran buat Anda, jika terdapat 1.000 item, maka kemungkinan terdapat jutaan
kombinasi yang harus diproses. Jumlah sebesar ini tentunya tidak bisa manual dan butuh
bantuan algoritma komputer untuk memprosesnya.
Dan algoritma yang bisa kita gunakan adalah algoritma apriori yang merupakan algoritma di
kategori association rules pada literatur machine learning. Algoritma ini akan menghasilkan
kombinasi-kombinasi yang kemudian disusun dalam bentuk rule "Jika membeli ini.... maka
akan juga membeli... ".
Ada cukup banyak penerapan dari association rules , seperti di dunia cyber security untuk
mendeteksi intrusi jaringan, di bidang sales marketing untuk pemaketan produk, mencari
pola pemakaian web, dan lain-lain.
items transactionID
[1] {Pet Food,Sirup,Teh Celup} #01
[2] {Gula,Teh Celup} #02
[3] {Pet Food,Sirup} #03
[4] {Sirup,Teh Celup} #04
[5] {Gula,Sirup,Teh Celup} #05
[6] {Pet Food,Teh Celup} #06
[7] {Pet Food,Sirup,Teh Celup} #07
[8] {Teh Celup} #08
[9] {Gula,Teh Celup} #09
[10] {Gula,Pet Food,Sirup} #10
Nah, untuk mendapatkan gambaran berapa kombinasi produk yang mungkin terjadi cobalah
jalankan code berikut sehingga Anda akan melihat hasil sebagai berikut.
items support
[1] {Gula,Pet Food} 0.1
[2] {Gula,Sirup} 0.2
[3] {Gula,Teh Celup} 0.3
[4] {Pet Food,Sirup} 0.4
[5] {Pet Food,Teh Celup} 0.3
[6] {Sirup,Teh Celup} 0.4
[7] {Gula,Pet Food,Sirup} 0.1
[8] {Gula,Sirup,Teh Celup} 0.1
[9] {Pet Food,Sirup,Teh Celup} 0.2
Terlihat ada sembilan kombinasi produk dengan nilai support adalah rasio dari kombinasi
tersebut terhadap keseluruhan transaksi.
Sebagai contoh, kombinasi {Pet Food, Sirup} memiliki support 0.4 yang artinya kombinasi ini
terdapat di 4 dari 10 transaksi yang tercatat.
#Menggunakan library arules
library(arules)
#Menampilkan jumlah kombinasi dari produk yang terdapat pada daftar transaksi yang ada
items transactionID
[1] {Baju Kaos Olahraga,
Baju Renang Pria Dewasa,
Baju Renang Wanita Dewasa,
Celana Jogger Casual,
Dompet Card Holder,
Kaos,
Sepatu Sport merk Z,
Serum Vitamin,
Shampo Biasa} #1
[2] {Baju Batik Wanita,
Baju Kemeja Putih,
Celana Jogger Casual,
Celana Pendek Jeans,
Dompet Card Holder,
Dompet STNK Gantungan,
Flat Shoes Ballerina,
Hair Dryer,
Jeans Jumbo,
Kaos,
Wedges Hitam} #10
[3] {Baju Renang Wanita Dewasa,
Celana Jogger Casual,
Dompet Card Holder,
Dompet Flip Cover,
Hair Dryer,
Hair Tonic,
Sepatu Sandal Anak,
Sepatu Sport merk Y,
Sepatu Sport merk Z,
Shampo Biasa,
Tali Pinggang Anak} #100
...
[999] {Baju Batik Wanita,
Baju Kaos Anak - Superheroes,
Blouse Denim,
Dompet Flip Cover,
Hair Dryer,
Kuas Makeup ,
Sepatu Sandal Anak,
Serum Vitamin,
Sunblock Cream,
Tali Pinggang Gesper Pria,
Tas Pinggang Wanita,
Tas Travel} #998
[1000] {Baju Batik Wanita,
Baju Kaos Anak - Karakter Kartun,
Celana Pendek Jeans,
Celana Tactical ,
Cover Koper,
Tank Top,
Tas Tangan} #999
Keseluruhan transaksi ini merupakan kombinasi dari 70 item produk. Dan kalau kita analisa
dengan syarat support 0.03 (minimal muncul 30 kali dari 1000 transaksi) maka jumlah
kombinasi yang dihasilkan adalah 1248. Semakin kecil support yang kita masukkan akan
semakin banyak kombinasi yang muncul.
items support
[1] {Shampo Biasa,
Tas Makeup} 0.031
[2] {Tank Top,
Tas Tangan} 0.032
[3] {Celana Pendek Jeans,
Tas Tangan} 0.031
[4] {Cover Koper,
Tas Tangan} 0.030
[5] {Baju Batik Wanita,
Celana Panjang Format Hitam} 0.037
...
[1246] {Baju Batik Wanita,
Blouse Denim,
Sepatu Sandal Anak,
Serum Vitamin,
Shampo Biasa} 0.031
[1247] {Baju Batik Wanita,
Baju Kemeja Putih,
Sepatu Sandal Anak,
Serum Vitamin,
Shampo Biasa} 0.030
[1248] {Atasan Kaos Putih,
Baju Renang Pria Dewasa,
Gembok Koper,
Tank Top,
Tas Travel,
Wedges Hitam} 0.044
Dengan jumlah kombinasi yang sedemikian besar untuk kita analisa, akan sulit bagi kita jika
kita lakukan secara manual. Inilah alasan kenapa proses ini perlu diotomatisasi dengan
bantuan algoritma.
Cobalah jalankan code yang telah tampil berikut untuk menghasilkan output seperti di atas,
dan lakukan analisa. Jika sudah selesai silahkan klik tombol Submit Code untuk melanjutkan
ke subbab berikutnya.
Catatan: Dataset besar ini tidak akan digunakan untuk pembelajaran selanjutnya.
#Menggunakan library arules
library(arules)
#Menampilkan jumlah kombinasi dari produk yang terdapat pada daftar transaksi yang ada
Kesimpulan
Algoritma apriori adalah salah satu algoritma yang merupakan penerapan praktis dari Market
Basket Analysis (MBA). Algoritma ini digunakan untuk menganalisa banyaknya kombinasi
produk yang terjadi di dalam transaksi ritel, yang akan sulit dan lama jika dilakukan secara
manual.
Secara teknis, algoritma apriori akan mencari tingkat asosiasi antar item di dalam banyak
kombinasi kelompok data secara otomatis. Kombinasi ini juga bisa disusun dengan suatu
aturan (rule) asosiasi "Jika membeli ini produk A maka akan membeli produk B", sehingga
algoritma ini dikategorikan sebagai Association Rules di ranah machine learning.
Dengan menemukan paket produk yang asosiasinya kuat, Anda sebagai seorang data
scientist dapat menyarankan kepada bisnis dapat melakukan berbagai action item seperti
membuat paket produk dengan penawaran khusus, mendekatkan produk-produk tersebut
saling berdekatan dalam satu rak, mengeluarkan rekomendasi produk di sistem e-commerce,
mengurangi masalah stok, dan lain-lain.
Setelah mengerti hal fundamental penggunaan ini, saatnya kita masuk Item, Itemset and
Rules. Klik tombol Next untuk melanjutkan.
Walaupun tampilan cukup ringkas, tapi banyak konsep dan peristilahan yang mungkin cukup
"memusingkan" Anda, seperti lhs (left hand side), rhs (right hand side), item seperti Pet
Food, itemset seperti {Gula, Pet Food} dan rule seperti {Pet Food} => {Sirup}, dan lain-lain.
Apa arti dari tiap istilah tersebut?
Kesimpulan
Anda telah menyelesaikan bab yang berisi konsep-konsep fundamental yang sangat penting
mengenai item, itemset dan rule. Mari kita review konsep dan contohnya dengan tampilan
output berikut.
items transactionID
[1] {Pet Food,Sirup,Teh Celup} #01
[2] {Gula,Teh Celup} #02
[3] {Pet Food,Sirup} #03
[4] {Sirup,Teh Celup} #04
[5] {Gula,Sirup,Teh Celup} #05
[6] {Pet Food,Teh Celup} #06
[7] {Pet Food,Sirup,Teh Celup} #07
[8] {Teh Celup} #08
[9] {Gula,Teh Celup} #09
[10] {Gula,Pet Food,Sirup} #10
Output ini adalah tampilan dari dataset yang berjumlah sepuluh transaksi, dengan dua
kolom yang terdiri dari:
Kolom pertama adalah itemset yang berisi item-item yang dibeli pada transaksi
tertentu.
Kolom kedua berisi kode struk transaksi yang menjadi penanda unik untuk tiap
transaksi.
Contoh Dataset
Untuk menjalankan semua praktek bab berikut, kita perlu satu contoh dataset dalam bentuk
file teks yang terlihat sebagai berikut.
transaksi_tabular <-
read.csv("https://storage.googleapis.com/dqlab-dataset/data_transaksi.txt", sep="\t")
transaksi_tabular: nama variable yang digunakan untuk menampung data dari contoh
dataset
csv: function yang digunakan untuk membaca contoh dataset yang berupa file
https://storage.googleapis.com/dqlab-dataset/data_transaksi.txt: lokasi dataset yang
terdapat di web DQLab. Jika lokasi file dan aplikasi R terdapat di komputer lokal Anda, maka
gantilah dengan lokasi file di lokal. Misalkan c:\data\data_transaksi.txt
sep: separator character atau karakter pemisah antar kolom, untuk file ini karakter
pemisahnya adalah tab atau dalam notasi di R ditulis dengan "\t".
Jika dijalankan, perintah di atas belum menghasilkan output apapun. Untuk menampilkan
isinya, kita gunakan fungsi print diikuti variable yang kita gunakan.
print(transaksi_tabular)
Ketikkan perintah tersebut untuk menggantikan bagian #[...2...] pada code editor dan
jalankan. Jika semua berjalan dengan lancar, maka akan muncul hasil seperti berikut.
Kode.Transaksi Item
1 #01 Teh Celup
2 #01 Sirup
3 #01 Pet Food
4 #02 Teh Celup
5 #02 Gula
6 #03 Sirup
7 #03 Pet Food
8 #04 Teh Celup
9 #04 Sirup
10 #05 Teh Celup
11 #05 Sirup
12 #05 Gula
13 #06 Teh Celup
14 #06 Pet Food
15 #07 Teh Celup
16 #07 Sirup
17 #07 Pet Food
18 #08 Teh Celup
19 #09 Teh Celup
20 #09 Gula
21 #10 Sirup
22 #10 Pet Food
23 #10 Gula
Terlihat output dengan dua kolom yaitu "Kode.Transaksi" dan "Item". Terdapat juga nomor
baris untuk tiap data yang ditampilkan. Perhatikan ada beberapa kode yang sama pada
beberapa baris, ini menunjukkan satu transaksi yang sama.
Sebagai contoh, untuk kode transaksi #01 terdapat tiga baris data. Tiap baris data mewakili
satu item, jadi pada transaksi tersebut ada tiga item, yaitu "Teh Celup", "Sirup" dan "Pet
Food".
#Membaca file yang berlokasi di https://academy.dqlab.id/dataset/data_transaksi.txt dengan fungsi
read.csv, dan kemudian disimpan pada variable transaksi_tabular
print(transaksi_tabular)
read.transactions(file="https://storage.googleapis.com/dqlab-dataset/
data_transaksi.txt", format="single", sep="\t", cols=c(1,2), skip=1)
Keterangan code:
File : Parameter lokasi file yang bisa berasal dari url di web satau lokal. Pada contoh ini dibaca
file data_transaksi.txt yang berlokasi di website academy.dqlab.id.
https://storage.googleapis.com/dqlab-dataset/data_transaksi.txt: lokasi dataset yang
terdapat di web DQLab. Jika lokasi file dan aplikasi R terdapat di komputer lokal Anda, maka
gantilah dengan lokasi file di lokal. Misalkan c:\data\data_transaksi.txt
format: Format bisa "single" atau "basket".
o "single" artinya tiap item transaksi dituliskan terpisah baris demi baris, dan ini cocok
dengan format dari file kita.
o "basket" artinya seluruh item per transaksi ditulis per baris.
sep: separator character atau karakter pemisah antar kolom, untuk file ini karakter
pemisahnya adalah tab atau dalam notasi di R ditulis dengan "\t".
cols: indeks dari kolom-kolom yang digunakan. Untuk format single maka kolom harus dua
saja, kolom pertama adalah kode transaksi sedangkan kolom kedua menunjukkan item
transaksi. Penulisan c(1,2) pada contoh kita artinya kolom pertama dan kedua yang kita
gunakan.
skip: jumlah baris yang dilewati sebelum mulai membaca data. Untuk dataset kita, baris
pertama adalah header dan tidak diperlukan, jadi kita masukkan 1 sebagai input.
Keterangan hasil:
library(arules)
transaksi@itemInfo
Sekarang, tambahkan perintah tersebut pada code editor dan jalankan. Jika berjalan dengan
lancar, maka akan muncul hasil seperti gambar berikut.
labels
1 Gula
2 Pet Food
3 Sirup
4 Teh Celup
Terlihat ada empat item yang terdapat di seluruh data transaksi kita, yaitu Gula, Pet
Food, Sirup dan Teh Celup.
library(arules)
transaksi@itemInfo
transaksi@itemsetInfo
Tambahkan perintah tersebut di dalam code editor kita. Jika berhasil dijalankan, maka akan
muncul tampilan berikut.
transactionID
1 #01
2 #02
3 #03
4 #04
5 #05
6 #06
7 #07
8 #08
9 #09
10 #10
Terlihat ada sepuluh kode transaksi di seluruh transaksi kita yaitu kode #01 sampai
dengan #10.
Catatan: #01, #02 dan seterusnya bukan format tampilan dari R, tapi hasil dari pembacaan
file transaksi kita.
library(arules)
transaksi@itemsetInfo
transaksi@data
Tambahkan perintah di atas pada code editor dan jalankan. Jika berhasil dijalankan,
harusnya muncul tampilan matrix sebagai berikut.
labels
1 Gula
2 Pet Food
3 Sirup
4 Teh Celup
dengan demikian, item Gula diwakili [1,], Pet Food diwakili [2,], dan seterusnya.
Untuk lebih jelasnya mari kita lihat penulisan ulang dari output di atas sebagai berikut. Kali
ini garis-garis pada transaksi item ke-1 (Gula) ditandai warna biru.
Tanda garis ini terdapat pada transaksi ke 2, 5, 9, dan 10. Apakah benar? Mari kita buktikan
dengan melihat kembali output dari file data frame berikut - dimana item Gula diberi
penanda warna biru. Sama bukan?
Kode.Transaksi Item
1 #01 Teh Celup
2 #01 Sirup
3 #01 Pet Food
4 #02 Teh Celup
5 #02 Gula
6 #03 Sirup
7 #03 Pet Food
8 #04 Teh Celup
9 #04 Sirup
10 #05 Teh Celup
11 #05 Sirup
12 #05 Gula
13 #06 Teh Celup
14 #06 Pet Food
15 #07 Teh Celup
16 #07 Sirup
17 #07 Pet Food
18 #08 Teh Celup
19 #09 Teh Celup
20 #09 Gula
21 #10 Sirup
22 #10 Pet Food
23 #10 Gula
Dengan penjelasn ini, kita semakin paham apa arti dari matrix ini yang dapat membantu kita
menganalisa distribusi item-item pada seluruh transaksi yang ada dengan lebih ringkas.
library(arules)
transaksi@data
Item Frequency
Setelah mengetahui bagaimana caranya menampilkan informasi daftar transaksi, kode
transaksi, item dan distribusi item pada transaksi, kita harusnya ingin juga mengetahui item
dengan jumlah kemunculannnya pada keseluruhan transaksi. Informasi ini disebut
sebagai item frequency.
Untuk menghasilkan informasi ini kita gunakan fungsi itemFrequency dengan input objek
transaction, dan hasilnya berupa named vector atau vector yang bisa diakses dengan nama.
Berikut adalah contoh penggunaan fungsi itemFrequency untuk kasus kita.
itemFrequency(transaksi)
Cobalah tambahkan perintah tersebut pada code editor kita dan jalankan. Jika berhasil,
maka akan muncul tampilan berikut.
> itemFrequency(transaksi)
Gula Pet Food Sirup Teh Celup
0.4 0.5 0.6 0.8
Hasil ini menunjukkan bahwa frekuensi kemunculan Gula adalah 0.4 atau 40 persen dari porsi
seluruh transaksi yang ada, Pet Food menempati 50 persen, dan seterusnya.
Lalu bagaimana jika bukan persentase yang ingin kita tampilkan, tapi jumlah item dalam
angka sebenarnya?
Tentunya bisa dilakukan. Caranya adalah menambahkan parameter type="absolute" ke
dalam fungsi itemFrequency sebagai berikut.
itemFrequency(transaksi, type="absolute")
Ubahlah fungsi itemFrequency pada code editor sesuai dengan tambahan parameter ini dan
jalankan. Jika berhasil, maka akan muncul tampilan berikut.
Ini artinya Gula memiliki kemunculan 4 kali dari seluruh transaksi yang ada, Pet Food muncul
sebanyak 5 kali, Sirup sebanyak 6 kali, dan Teh Celup sebanyak 8 kali.
Fungsi itemFrequency ini sangat penting untuk membantu kita menganalisa transaksi yang
lebih kompleks dimana item yang terlibat lebih banyak dan transaksi yang terjadi lebih besar
dari contoh kita saat ini. Klik tombol Submit Code untuk melanjutkan ke bagian berikutnya.
library(arules)
itemFrequency(transaksi, type="absolute")
Statistik Top 3
Statistik sederhana untuk menjawab pertanyaaan seperti "Mana 3 item yang memiliki jumlah
terbanyak di seluruh transaksi?" tidak bisa langsung dilakukan dengan satu fungsi di R, tapi
perlu penggabungan beberapa perintah dimana salah satunya adalah fungsi sort.
Kita akan bahas ini sambil melakukan praktek sampai bisa menampilkan statistik top 3 item
yang memiliki jumlah terbanyak seperti berikut.
Nama.Produk Jumlah
1 Teh Celup 8
2 Sirup 6
3 Pet Food 5
Mari kita mulai praktekkan, dimulai dari menjalankan code yang telah ada pada code editor.
Code ini berfungsi untuk menampilkan data_item yang merupakan variable yang nilainya
merupakan hasil pemanggilan fungsi itemFrequency.
Cobalah jalankan code tersebut, dan jika berhasil maka akan muncul tampilan berikut.
> print(data_item)
Gula Pet Food Sirup Teh Celup
4 5 6 8
Terlihat empat item yang masih berupa vector dan belum terurut dari jumlah terbanyak.
Sekarang, gantilah bagian #[...1...] dengan fungsi sort untuk nengurutkan item dari jumlah
terbesar ke terkecil, dan disimpan kembali ke variable data_item.
> print(data_item)
Teh Celup Sirup Pet Food Gula
8 6 5 4
Terlihat item sudah terurut, tapi masih ada empat item ketimbang tiga item yang kita
inginkan. Untuk mengambil tiga item saja bisa menggunakan konstruksi index [1:3] dari
variable data_item yang artinya mengambil index pertama sampai dengan ketiga.
Berikut adalah perintah lengkapnya, perhatikan hasil pengambilan disimpan kembali
ke data_item.
Gantilah bagian #[...2...] pada code editor dengan perintah ini dan jalankan, jika berhasil
maka akan muncul tampilan sebagai berikut.
> print(data_item)
Teh Celup Sirup Pet Food
8 6 5
Dari tampilan ini terlihat kita sudah berhasil mengambil tiga item dengan jumlah terbanyak.
Tahap terakhir adalah merubah hasil yang berupa vector ini ke dalam data frame.
Kalau dilihat kembali permintaan di atas, maka dua kolom dari data frame yang akan kita
buat dinamakan "Nama Produk" dan "Jumlah". Berikut adalah perintah untuk memenuhi
permintaan ini.
Nama.Produk Jumlah
Sirup Sirup 6
Pet Food Pet Food 5
Gantilah bagian #[...3...] pada code editor dengan perintah terakhir tersebut, dan jalankan.
Jika berhasil, maka akan muncul tampilan output berikut.
Nama.Produk Jumlah
1 Teh Celup 8
2 Sirup 6
3 Pet Food 5
Dengan demikian, kita telah berhasil menghasilkan tampilan statistik ini dengan tambahan
tiga perintah. Klik tombol Submit Code untuk melanjutkan ke subbab berikutnya.
library(arules)
#Konversi data_item menjadi data frame dengan kolom Nama_Produk dan Jumlah
print(data_item)
Namun jangan kuatir, karena output-nya berupa file. Klik tombol "Download Output File"
seperti ditunjukkan pada gambar berikut.
Akan muncul window "List Output Files", carilah file bernama "top3_item_retail.txt" dan klik
nama file tersebut untuk diunduh (download).
Buka file yang didownload tersebut dengan notepad, jika berhasil maka tampilannya terlihat
sebagai berikut.
#Konversi data_item menjadi data frame dengan kolom Nama_Produk dan Jumlah
itemFrequencyPlot(transaksi)
Tambahkan perintah tersebut pada code editor pada bagian di bawah comment "#Tampilan
item frequency plot". Jika berhasil, maka akan muncul gambar berikut.
Dari distribusi ini, terlihat item Teh Celup paling laku dan Gula paling sedikit transaksinya.
library(arules)
itemFrequencyPlot(transaksi)
Kesimpulan
Pada bab praktek awal ini, kita telah mengolah data transaksi berupa file teks dengan
beberapa langkah penting berikut:
1. Membaca file dataset dengan read.csv dan menganalisa statistik
sebaran item dan transaksi secara manual.
2. Membaca kembali file tersebut dengan read.transactions yang
menghasilkan objek yang lebih mudah dianalisa di R.
3. Dengan objek yang dihasilkan oleh read.transactions kita dapat
menganalisa jumlah item dan transaksi, daftar detil item, daftar
detil transaksi, dan juga distribusinya.
Dengan bekal ini kita siap untuk masuk ke tahap berikutnya, yaitu mengelola apa yang
dinamakan kombinasi item dalam itemset dan mencari kombinasi terbaik.
Next >
inspect(transaksi)
Tambahkan perintah ini pada code editor - di bawah comment "#Menggunakan inspect
terhadap transaksi". Jika berhasil dijalankan, maka akan muncul hasil berikut.
items transactionID
[1] {Pet Food,Sirup,Teh Celup} #01
[2] {Gula,Teh Celup} #02
[3] {Pet Food,Sirup} #03
[4] {Sirup,Teh Celup} #04
[5] {Gula,Sirup,Teh Celup} #05
[6] {Pet Food,Teh Celup} #06
[7] {Pet Food,Sirup,Teh Celup} #07
[8] {Teh Celup} #08
[9] {Gula,Teh Celup} #09
[10] {Gula,Pet Food,Sirup} #10
Ini merupakan daftar itemset dari sepuluh transaksi kita. Kolom items berisi item-item yang
terjadi pada transaksi, dan transactionID berisi kode transaksi. Sebagai contoh, pada kode
transaksi #01 terdapat itemset yang terdiri dari Pet Food, Sirup dan Teh Celup.
Format penulisan tiap itemset terdiri dari notasi kurung kurawal pembuka dan penutup, yang
di dalamnya terdapat daftar item yang dipisahkan tanda koma untuk tiap itemnya.
library(arules)
inspect(transaksi)
apriori(transaksi)
Tambahkan perintah ini pada code editor - di bawah comment "#Menghasilkan associaton
rules" - dan jalankan. Jika semua berjalan lancar, maka akan muncul hasil berikut.
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen
0.8 0.1 1 none FALSE TRUE 5 0.1 1 10
target ext
rules FALSE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1 TRUE TRUE FALSE TRUE 2 TRUE
Banyak sekali informasi dari output yang dihasilkan. Namun untuk saat ini, perhatikan baris
terakhir dimana tertulis "set of 3 rules". Ini artinya dengan fungsi apriori ini, kita
mendapatkan tiga rules. Kita akan ulas lebih jauh mengenai tiga rules ini pada praktek
berikutnya.
library(arules)
apriori(transaksi)
inspect(mba)
Tambahkan perintah tersebut pada code editor - di bagian bawah comment "#Melihat isi dari
rules dengan menggunakan fungsi inspect" dan jalankan. Jika berhasil, maka akan muncul
hasil sebagai berikut.
rekomendasikan kepada setiap pelanggan yang membeli Pet Food untuk membeli
Sirup.
rak display Pet Food dan Sirup bisa didekatkan.
Pet Food dan Sirup dipaketkan bersama dan dijual dengan harga khusus.
library(arules)
inspect(mba)
Filter RHS
Dari hasil inspect objek mba yang bertipe association rules di praktek sebelumnya, kita
sekarang mengerti bahwa objek tersebut mengandung banyak informasi termasuk itemset
yang terdapat di left hand side dan right hand side.
Ini penting untuk bisnis, misalkan untuk inventory. Kita ingin menjawab, adakah item yang
kurang laku sebelumnya ada di dalam itemset dari rules yang dihasilkan oleh apriori? Jika
ada, mungkin saya bisa paketkan bersama sehingga kemungkinan besar terjual lebih banyak.
Untuk melakukan ini kita akan melakukan filter atau subsetting dari rules. Banyak cara, salah
satunya adalah dengan menggunakan gabungan function inspect, subset dan operator %in
% dengan format berikut.
Kita langsung contohkan saja dengan kasus kita. Misalkan kita ingin mengambil rules yang
kolom rhs-nya mengandung Sirup, maka perintahnya adalah sebagai berikut.
library(arules)
Filter LHS
Filter dari praktek sebelumnya hanya berfokus kepada rhs, tentunya bisa juga dengan lhs.
Berikut adalah contoh perintah inspect untuk filter lhs dengan item Gula.
inspect(subset(mba, lhs %in% "Gula"))
Tugas Praktek
Tambahkan pada code editor perintah untuk melakukan filter objek mba dimana itemset
pada sisi lhs memiliki item Gula.
Jika berhasil maka rule yang muncul adalah sebagai berikut. Terlihat disini ada satu rules
dimana lhs nya sama-sama memiliki item Sirup.
Tugas Praktek
Tambahkan pada code editor perintah untuk melakukan filter objek mba dimana itemset lhs
memiliki item Pet Food dan rhs memiliki item Sirup.
Jika berhasil maka rule yang muncul adalah sebagai berikut.
library(arules)
Metrik-metrik ini adalah support, confidence dan lift. Apa sebenarnya itu? Kenapa kita harus
mengerti dan menggunakannya lebih lanjut?
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen
0.5 0.1 1 none FALSE TRUE 5 0.1 1 10
target ext
rules FALSE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1 TRUE TRUE FALSE TRUE 2 TRUE
Perhatikan pada akhir baris output, terdapat 16 rule. Lebih banyak dibandingkan eksekusi
perintah apriori sebelumnya yang hanya menghasilkan 3 rule.
library(arules)
Terlihat dengan merubah parameter pada function apriori, kita mendapatkan jumlah rules
yang berbeda.
library(arules)
transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",
format="single", sep="\t", cols=c(1,2), skip=1)
inspect(mba)
Terdapat 9 rule sebagai hasil filter dan jika kita gunakan informasi support, confidence dan
lift… maka kandidat yang bagus mungkin hanya rule ke 8 dimana nilai lift lebih dari 1 ({Pet
Food, Teh Celup} => {Sirup}).
library(arules)
Hanya terdapat 1 rule sebagai hasil filter dan paket produk ini cukup menjanjikan, dimana
Teh Celup menjadi komponen dari itemset di lhs.
library(arules)
inspect(subset(mba, (lhs %in% "Teh Celup" | rhs %in% "Teh Celup") & lift>1))
Hanya terdapat 1 rule sebagai hasil filter, dan dengan lift di atas 1 dan support 0.1 (10%) rule
ini bisa dianggap layak untuk meghasilkan rekomendasi item, yaitu Sirup.
Jadi orang yang membeli Gula dan Pet Food, bisa ditawarin Sirup.
library(arules)
Lingkaran disini adalah titik pertemuan (asosiasi) dari item-item yang ada, dimana terdapat
tanda panah sebagai garis penghubungnya. Tiap Item disini berupa teks.
Besarnya bulatan menunjukkan popularitas, dan intensitas warna menunjukkan lift. Terlihat
disini Gula ke Sirup, dan Pet Food ke Sirup memiliki lift yang relatif tinggi tapi supportnya
tidak terlalu besar.
Tugas Praktek
Grafik di atas dihasilkan oleh perintah berikut.
plot(subset(mba, lift>1.1), method="graph")
Perhatikan fungsi plot ini merupakan pengembangan dari package arules. Method graph
menunjukkan bahwa plot ini harus menghasilkan visualisasi dengan tipe jaringan.
Ketiklah perintah di atas di code editor dan jalankan.
library(arules)
library(arulesViz)
Kesimpulan
Dengan rangkaian praktek yang telah kita lakukan sejauh ini, Anda telah menyelesaikan
dasar penggunaan algoritma apriori untuk membantu di bidang retail.
Sepanjang course ini kita telah mendapatkan beberapa keterampilan hal berikut:
Tiga keterampilan penting ini siap menjadi modal Anda sebagai data scientist untuk
berkontribusi meningkatkan omset penjualan di perusahaan ritel.
Customer Segmentation
Selamat Datang
Selamat Datang di course Machine Learning for Marketing: Customer Segmentation, dimana
Anda akan diberikan materi step by step dan langsung praktek dengan berbagai fitur DQLab –
yang memang dirancang untuk membantu Anda agar mudah menyerap materi dan
memanfaatkannya dalam pekerjaan sehari-hari.
Course ini dirancang dengan menggunakan dataset dari kasus skenario nyata di Indonesia.
Untuk course, dataset yang digunakan cukup kecil dengan tujuan Anda dapat lebih mudah
memahami dataset ini dan mampu beradaptasi ketika dihadapkan dataset yang lebih
kompleks – seperti Anda akan temukan di bagian project DQLab.
Apa yang akan Anda pelajari sepanjang course ini?
Pelajari contoh dataset dalam course, karena walaupun kecil tapi mencerminkan
Kerjakan soal dan praktek sesuai dengan irama yang Anda rasa nyaman
Submit soal sesuai dengan permintaan soal
Tekan hint jika Anda merasa kesulitan
Ikut serta dan menyelesaikan project karena memiliki tingkat kompleksitas yang lebih
tinggi dan mencerminkan kasus riil
Kesimpulan
Customer segmentation adalah proses penting yang diperlukan di
bisnis untuk mengenal customer dengan lebih baik
Dengan demikian proses bisnis di marketing (pemasaran) dan CRM
(customer relationship management) bisa dilakukan lebih tajam.
Contoh: pesan marketing bisa lebih personal untuk setiap segment
dengan biaya lebih optimal.
Dengan proses yang lebih tajam, performa bisnis berpotensi tinggi
menjadi lebih baik juga.
Untuk menemukan segmentasi yang baik, perlu proses analisa data
dari profile customer yang cukup banyak dan rutin. Ini bisa dibantu
dengan algoritma komputer.
Persiapan Data
Pengantar
Persiapan data adalah langkah pertama yang kita lakukan sebelum menggunakan algoritma
apapun untuk melakukan analisa data.
Ini dikarenakan tiap implementasi algoritma menuntut struktur dan tipe data yang berbeda.
Dan untuk kasus algoritma K-Means yang akan kita gunakan untuk otomatisasi clustering,
maka struktur datanya adalah data.frame atau matrix yang di dalamnya berisi angka semua.
Tidak ada yang boleh bertipe karakter.
Namun pada kasus riil, hal ini tentulah tidak mungkin. Contoh, isi data profesi seperti
"Professional", "Ibu Rumah Tangga" adalah teks. Dan ini perlu dikonversi dulu ke numerik,
namun jika diperlukan tetap bisa kembali mengambil data teks.
Nah, untuk lebih jelasnya. Kita akan lakukan langkah-langkah praktek yang akan kita lakukan
berikut ini adalah untuk mempersiapkan data sebelum dapat digunakan algoritma
clustering:
Customer ID: Kode pelanggan dengan format campuran teks CUST- diikuti angka
Nama Pelanggan: Nama dari pelanggan dengan format teks tentunya
Jenis Kelamin: Jenis kelamin dari pelanggan, hanya terdapat dua isi data kategori yaitu Pria
dan Wanita
Umur: Umur dari pelanggan dalam format angka
Profesi: Profesi dari pelanggan, juga bertipe teks kategori yang terdiri dari Wiraswasta,
Pelajar, Professional, Ibu Rumah Tangga, dan Mahasiswa.
Tipe Residen: Tipe tempat tinggal dari pelanggan kita, untuk dataset ini hanya ada dua
kategori: Cluster dan Sector.
NilaiBelanjaSetahun: Merupakan
Terlihat kalau ada kolom yang berisi angka saja, yaitu Umur dan NilaiBelanjaSetahun.
Sisanya diisi data kategori untuku kolom "Jenis Kelamin", "Profesi" dan "Tipe Residen".
Sedangkan "Customer ID" dan "Nama Pelanggan" kita anggap memiliki nilai yang unik untuk
tiap baris data dan mewakili tiap individu.
Karena kolom "Customer ID" dan "Nama Pelanggan" karena unik maka tidak akan dijadikan
variable penentu segmentasi yang kita lakukan, namun sisa kolom lainnya akan digunakan.
Nah dengan contoh dataset inilah, kita akan mencoba mencari jumlah segmentasi yang
paling optimal – dimana antar tiap data pelanggan dalam segmen memiliki kemiripan tinggi
– sepanjang course ini.
Next >
pelanggan: nama variable yang digunakan untuk menampung data dari contoh dataset
csv: function yang digunakan untuk membaca contoh dataset yang berupa file
https://storage.googleapis.com/dqlab-dataset/customer_segments.txt : lokasi dataset yang
terdapat di web DQLab. Jika lokasi file dan aplikasi R terdapat di komputer lokal Anda, maka
gantilah dengan lokasi file di lokal. Misalkan c:\data\customer_segments.txt
Jika terjadi error berikut, maka periksa kembali penulisan code – huruf besar, huruf kecil dan
juga penulisan lokasi file – dengan teliti.
Error in file(file, "rt") : cannot open the connection
Jika tidak terjadi error maka langkah selanjutnya adalah menampilkan isi data dengan
mengetikkan nama variable pelanggan pada code editor sebagai berikut.
pelanggan
Hasil eksekusi perintah ini akan tampak sebagai berikut.
Terlihat isi data dengan enam kolom dan terdapat nomor baris pada tiap data yang
ditampilkan.
Perhatikan jika nama kolom asal terdapat karakter spasi, akan diubah menjadi tanda titik
setelah dibaca dengan read.csv. Sebagai contoh, "Nama Pelanggan" diubah menjadi
"Nama.Pelanggan".
Jika kita hanya ingin menampilkan beberapa kolom tertentu, misalkan untuk kolom
"Jenis.Kelamin" dan "Profesi" maka perintahnya adalah sebagai berikut.
pelanggan[c("Nama.Pelanggan","Profesi")]
Praktek:
pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")
pelanggan[c("Jenis.Kelamin","Umur","Profesi","Tipe.Residen")]
#Buat variable field_yang_digunakan dengan isi berupa vector "Jenis.Kelamin", "Umur" dan "Profesi"
#Tampilan data pelanggan dengan nama kolom sesuai isi vector field_yang_digunakan
pelanggan[field_yang_digunakan]
data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi")])
Terlihat, teks "Pria" diubah menjadi angka 1, "Wanita" diubah menjadi angka 2, "Wiraswasta"
diubah menjadi angka 5, dan seterusnya.
Tugas Praktek
Gantilah tulisan […]pada editor dengan code yang sesuai.
Buatlah variable pelanggan_matrix yang diisi dengan konversi teks menjadi numerik dari
variable pelanggan pada kolom "Jenis.Kelamin", "Profesi", dan "Tipe.Residen".
pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt",sep="\t")
#Penggabungan data
Pelanggan
#Normalisasi Nilai
pelanggan$NilaiBelanjaSetahun = pelanggan$NilaiBelanjaSetahun/1000000
Kesimpulan
Selamat, Anda sudah menjalankan praktek-praktek yang menjadi dasar dari semua hal
sebelum penggunaan analisa data, yaitu tahap persiapan data atau data preparation.
Untuk algoritma clustering k-means yang akan kita gunakan di R, maka tahap data
preparationnya adalah menyiapkan data yang di dalamnya harus berisi numerik.
Namun pada banyak kasus riil, data tidak sepenuhnya berisi numerik seperti telah kita lihat
sendiri dan praktekkan dengan contoh dataset yang digunakan pada bab ini dengan langkah-
langkah berikut:
1. Mengenal Contoh File Dataset Pelanggan, dimana kita mengerti dulu bagaimana
bentuk dan isi dari contoh yang digunakan.
2. Membaca File dengan read.csv, dimana kita membaca suatu file teks dengan pemisah
berupa tab menggunakan fungsi read.csv.
3. Vector untuk Menyimpan Nama Field, dimana nama-nama field bisa disimpan dalam
bentuk vector sehingga bisa digunakan berulang ketika kita buturh referensi nama-
nama field yang sama.
4. Konversi Data dengan data.matrix, dimana kita bisa melakukan konversi data dari
kategori teks menjadi numerik.
5. Menggabungkan Hasil Konversi, dimana hasil konversi ini perlu kita gabungkan
kembali ke variable asal agar kita tidak kehilangan referensinya.
6. Menormalisasikan Nilai Belanja, dimana kita merubah skala data nilai belanja dari
jutaan menjadi puluhan dengan tujuan penyederhanaan perhitungan namun tidak
mengurangi akurasi.
7. Membuat Data Master, dimana kita meringkas data kategori dan numerik ke dalam
variable-variable yang kita sebut sebagai data master.
Pengelompokan manusia berdasarkan umur: bayi, balita, anak, remaja, dewasa, tua.
Pengelompokan customer berdasarkan daya belinya: regular dan premium.
Pengelompokan makanan berdasarkan kandungan gizinya: biji-bijian, sayuran, buah-
buahan, minyak, protein, dan lain-lain.
Banyak algoritma telah dikembangkan untuk melakukan clustering secara otomatis, salah
satu yang sangat populer adalah K-Means yang akan menjadi fokus utama course kita.
K-means adalah algoritma yang membagi data menjadi sejumlah partisi dengan cara
sederhana: mencari kedekatan dari tiap titik pada suatu cluster dengan sejumlah nilai rata-
rata atau mean.
Ada dua konsep kunci yang juga menjadi nama asal k-means:
Jumlah partisi yang diinginkan, diwakili oleh huruf k
Mencari "jarak" kedekatan tiap titik ke sejumlah nilai rata-rata cluster yang diamati,
diwakili oleh means
Algoritma k-means sudah ada di paket dasar R dalam bentuk function bernama kmeans.
Sepanjang bab ini, kita akan menggunakan function ini dan menganalisa output yang
dihasilkan.
Fungsi kmeans
Praktek kali ini kita akan melakukan segmentasi langsung pada data pelanggan – yang telah
kita lakukan persiapan datanya pada bab sebelumnya – dengan menggunakan
function kmeans.
Function kmeans memerlukan minimal 2 parameter, yaitu:
x: data yang digunakan, dimana semua isi datanya harus berupa numerik.
centers: jumlah cluster yang diinginkan.
Dan fungsi kmeans ini biasanya disertai dengan pemanggilan function seet.seed. Ini berguna
agar kita "menyeragamkan" daftar nilai acak yang sama dari kmeans sehingga kita
mendapatkan output yang sama.
Berikut adalah contoh penggunaan fungsi kombinasi set.seed dan kmean.
set.seed(100)
kmeans(x=pelanggan[c("Umur","Profesi.1")], centers=3)
Ini artinya kita membagi data pelanggan berdasarkan "Umur" dan "Profesi" menjadi 3
segmen.
Kadang kala berdasarkan pengalaman DQLab, parameter data dan jumlah segmen saja tidak
cukup. Perlu digunakan parameter ketiga yaitu nstart, yang merupakan jumlah kombinasi
acak yang dihasilkan secara internal oleh R. Berdasarkan jumlah yang diberikan, algoritma
akan memilih mana yang terbaik dari kombinasi-kombinasi tersebut.
Kata terbaik berarti jarak antara tiap titik ke mean dari clusternya sendiri lebih kecil
dibandingkan ke mean dari cluster lain.
Perlu untuk diingat bahwa mean atau nilai rata-rata di sini sering disebut juga
dengan centroid pada berbagai literatur data science.
Berikut adalah modifikasi pemanggilan fungsi dengan parameter tambahan nstart sebesar
25.
Tugas Praktek
Code editor telah dilengkapi dengan potongan code untuk data preparation, dan kita perlu
melengkapi […] dengan fungsi kmeans.
Sesuai contoh pada Lesson, lengkapi fungsi kmeans tersebut dengan:
Ketika dieksekusi dengan lancar, Anda harusnya mendapatkan hasil seperti gambar di bawah
ini.
Hasil ini dapat dibagi dalam lima bagian, dengan penjelasan sesuai nomor urut pada gambar
sebagai berikut:
#Bagian K-Means
set.seed(100)
#fungsi kmeans untuk membentuk 5 cluster dengan 25 skenario random dan simpan ke dalam variable
segmentasi
Segmentasi
Clustering vector ini adalah rangkaian vector yang berisi angka cluster. Dari hasil kita, vector
berisi angka 1 sampai dengan 5, maksimum sesuai dengan jumlah cluster yang kita inginkan.
Vector ini dimulai dari angka 2, yang artinya data pertama dari dataset kita akan dialokasikan
pada nomor cluster 2. Dari gambar juga terlihat isi vector kedua bernlai 1, ini artinya data
kedua dari dataset kita dialokasikan pada nomor cluster 1, dan seterusnya. Posisi data
terakhir (ke-50) memiliki nomor cluster 5.
Hasil ini dapat diakses dengan komponen cluster dari objek hasil seperti berikut:
segmentasi$cluster
#Bagian K-Means
set.seed(100)
segmentasi$cluster
str(pelanggan)
Ini artinya dengan k-means kita telah membagi dataset pelanggan dengan 5 cluster, dimana:
which(pelanggan$cluster == 1)
[1] 2 6 15 20 31 33 34 37 39 40 41 44 45 46
Hasil di atas menunjukkan 14 angka posisi data untuk cluster 1. Banyaknya angka pada
deretan ini sesuai ukuran untuk cluster ke-1 dari informasi di atas.
Sekarang cobalah hitung jumlah deretan dengan menambahkan perintah length pada fungsi
which seperti berikut:
length(which(pelanggan$cluster == 1))
#Bagian K-Means
set.seed(100)
segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)
#Analisa hasil
which(pelanggan$cluster == 1)
length(which(pelanggan$cluster == 2))
dimana ada 14 data denangan seluruh data berjenis kelamin wanita dan umur antara 14 s/d
25 tahun. Penghasilan, profesi, nilai belanja dan tipe residen cukup bervariasi.
Dan ubahlah perintah untuk melihat cluster ke-2.
pelanggan[which(pelanggan$cluster == 2),]
Akan tampil data sebagai berikut, dimana terlihat umur mayoritas sudah masuk usia 50
tahun ke atas dan kebanyakan adalah wiraswasta kecuali satu yang ibu rumah tangga. Dan
rata-rata nilai belanja adalah sekitar 9 juta, kecuali yang berprofesi ibu rumah tangga.
#Bagian K-Means
set.seed(100)
#Analisa hasil
pelanggan[which(pelanggan$cluster==1),]
pelanggan[which(pelanggan$cluster==2),]
pelanggan[which(pelanggan$cluster==3),]
pelanggan[which(pelanggan$cluster==4),]
pelanggan[which(pelanggan$cluster==5),]
Kolom pertama yang berisi angka 1 sampai dengan 5 adalah mewakili nomor cluster.
Kolom Kelamin.1 menunjukkan nilai rata-rata dari data jenis kelamin yang telah
dikonversi menjadi numerik, dengan angka 1 mewakili Pria dan angka 2 mewakili
wanita.
Pada cluster 1 terlihat bahwa hanya ada angka 2, artinya cluster 1 hanya berisi data dengan
profil berjenis kelamin wanita. Nah, untuk cluster ke-2 berupa angka 1.40 artinya data
bersifat campuran namun cenderung ke Pria (1).
Kedua interpretasi angka ini sesuai dengan hasil praktek "Melihat Data pada Cluster-N".
Kolom Tipe.Residen.1 menunjukkan representasi data Tipe.Residen yang telah
dikonversi menjadi numerik dengan angka 1 mewakili Cluster dan 2 mewakili Sector.
Ini juga didapatkan dari hasil konversi data menjadi numerik pada praktek
sebelumnya.
Untuk seluruh cluster, terlihat data cukup tersebar antara Sector dan Cluster
terutama untuk cluster ke-4 dimana nilai kolom ini di angka 1.555.
Ini mungkin target customer yang bisa lebih disasar melalui marketing campaign, karena
cluster ke-2 saat ini hanya berisi 5 data. Cukup kecil proporsinya, dan ingin ditingkatkan.
Ini terlihat dari hasil output kmeans bagian pertama yang menunjukkan distribusi jumlah
data dari tiap cluster:
Tugas Praktek
Cobalah melihat hasil dari cluster means ini dengan langsung mengakses
variable segmentasi pada komponen centers.
#Bagian Data Preparation
#Bagian K-Means
set.seed(100)
#Analisa hasil
segmentasi$centers
Konsep sum of squares (SS) adalah jumlah "jarak kuadrat" perbedaan tiap titik data dengan
mean atau centroidnya. SS ini bisa dengan mean atau centroid untuk tiap cluster atau secara
keseluruhan data. Sum of squares dalam literatur data science lain sering disebut dengan
Sum of Squared Errors (SSE).
Semakin besar nilai SS menyatakan semakin lebarnya perbedaan antar tiap titik data di
dalam cluster tersebut.
Berdasarkan konsep tersebut, berikut adalah penjelasan untuk hasil output kmeans di atas:
1. Nilai 316.73367 adalah SS untuk cluster ke-1, 58.21123 adalah SS untuk cluste ke-2,
dan seterusnya. Semakin kecil nilainya berpotensi semakin baik.
2. total_SS: adalah SS untuk seluruh titik terhadap nilai rata-rata global, bukan untuk
per cluster. Nilai ini selalu tetap dan tidak terpengaruh dengan jumlah cluster.
3. between_SS: adalah total_SS dikurangi dengan jumlah nilai SS seluruh cluster.
4. (between_SS / total_SS) adalah rasio antara between_SS dibagi dengan total_SS.
Semakin besar persentasenya, ummnya semakin baik.
Ini adalah metrik yang bisa kita gunakan untuk menjawab seberapa baik jumlah cluster yang
kita bentuk? Apakah dibagi 2, 5, 10 atau 30?
Teknik penggunaan metrik ini cukup panjang, namun untuk kepentingan praktis kali ini kita
hanya melihat perbedaan nilai ini dengan contoh.
Tugas Praktek
Gantilah […] pada code editor dengan empat perintah berikut.
set.seed(100)
kmeans(x=pelanggan[field_yang_digunakan], centers=2, nstart=25)
set.seed(100)
kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)
Jika berjalan dengan baik, bandingkan hasil antara kedua cluster tersebut. Anda harusnya
dapat membandingkan hasil. Gambar akan membantu.
Terlihat untuk 2 cluster (k=2), SS per cluster lebih besar dibandingkan jika data dibagi
menjadi 5 cluster (k=5). Perhatikan juga persentase rasio antara between_SS dan total_SS,
dimana k=5 juga lebih besar.
#Bagian Data Preparation
set.seed(100)
set.seed(100)
Available Components
Analisa terakhir kita dari code adalah bagian kelimat, yaitu sembilan komponen objek yang
bisa kita gunakan untuk lihat detil dari objek k-means.
Berikut adalah penjelasan singkat dari sembilan komponen tersebut.
Komponen Deskripsi Contoh
Vector dari cluster untuk tiap titik [1] 2 1 5 5 4 1 2 5 3 3 5 5 2 2 1 3
cluster
data 323
Merupakan informasi titik centroid
Lihat contoh pada "Analisa
centers dari tiap cluster, seperti pada bagian
Hasil Cluster Means"
"Analisa Hasil Cluster Means"
Total Sum of Squares (SS) untuk
totss [1] 10990.97
seluruh titik data
[1] 316.73367 58.21123
withinss Total Sum of Squares per cluster 174.85164 171.67372
108.49735
Total penjumlahan dari tiap SS dari
tot.withinss [1] 829.9676
withinss
Perbedaan nilai antara totss dan
betweenss [1] 10161.01
tot.withinss
size Jumlah titik data pada tiap cluster [1] 14 5 12 9 10
Jumlah iterasi luar yang digunakan
iter 2
oleh kmeans
ifault Nilai integer yang menunjukkan 0 jika tidak ada masalah
indikator masalah pada algoritma
Seluruh komponen tersebut bisa diakses dengan menggunakan aksesor $. Contoh, dengan
variable kmeans kita bernama segmentasi dan kita ingin mengakses komponen withinss,
maka kita bisa gunakan perintah berikut yang sudah terdapat pada code editor.
segmentasi$withinssr
#Bagian K-Means
set.seed(100)
segmentasi$withinss
segmentasi$cluster
segmentasi$tot.withinss
Kesimpulan
Pada bab ini Anda telah menyelesaikan penggunaan algoritma K-Means dengan function
kmeans dari dataset yang telah dipersiapkan pada bab kedua.
Function kmeans sederhana digunakan tapi outputnya memiliki informasi yang kaya yaitu:
Dengan menganalisa hasil output ini, kita mampu menggabungkan nomor cluster ke data
asal. Selain itu kita juga mengetahui bagaimana kedekatan tiap titik data dari clusternya
sehingga menjadi bekal kita untuk menentukan jumlah cluster yang optimal.
Untuk yang disebutkan terakhir, kita akan lakukan pada bab berikut
Jika dimasukkan ke dalam grafik garis, maka plotting dari total SS untuk tiap cluster
berbentuk sebagai berikut.
Titik paling kiri adalah jumlah SS untuk 1 jumlah cluster, titik kedua adalah untuk 2 jumlah
cluster, dan seterusnya.Perhatikan semakin ke kanan perbedaan jarak antar tiap titik
semakin mengecil.
Grafik garis ini memiliki bentuk seperti siku tangan, dan untuk optimal jumlah cluster
biasanya kita mengambil titik sikunya. Pada contoh di atas kita bisa mengambil 4 atau 5.
Proses pengambilan keputusan berdasarkan plotting siku ini biasa kita sebut Elbow Effect
atau Elbow Method.
Next >
Komponen Deskripsi
Tugas Praktek
Gantilah […] pada code editor dengan code lengkap sapply di atas, dan tambahkan juga
perintah untuk melihat isi variable sse.
Dan jika berhasil dieksekusi, maka hasilnya akan tampak sebagai vector berikut.
pelanggan$NilaiBelanjaSetahun <-pelanggan$NilaiBelanjaSetahun/1000000
#Bagian K-Means
set.seed(100)
Sse
jumlah_cluster_max <- 10
ssdata = data.frame(cluster=c(1:jumlah_cluster_max),sse)
ggplot(ssdata, aes(x=cluster,y=sse)) +
geom_line(color="red") + geom_point() +
ylab("Within Cluster Sum of Squares") + xlab("Jumlah Cluster") +
geom_text(aes(label=format(round(sse, 2), nsmall = 2)),hjust=-0.2,
vjust=-0.5) +
scale_x_discrete(limits=c(1:jumlah_cluster_max))
Berikut adalah gambaran grafik yang akan dihasilkan – dengan pasangan indikator nomor
yang menunjukkan perintah dan komponen grafik yang dihasilkan. Sebagai contoh,
penomoran nomor 1 yaitu geom_line(color="red") menghasilkan grafik garis berwarna
merah.
Tugas Praktek
Gantilah […] pada code editor code lengkap sapply di atas.
Dan jika berhasil dieksekusi, maka akan muncul grafik berbentuk siku seperti berikut.
Terlihat jika jumlah cluster optimal yang bisa kita gunakan adalah 5, dan ini menjadi
keputusan kita sebagai jumlah segmentasi pelanggan.
library(ggplot2)
#Bagian K-Means
set.seed(100)
jumlah_cluster_max <- 10
ssdata = data.frame(cluster=c(1:jumlah_cluster_max),sse)
ggplot(ssdata, aes(x=cluster,y=sse)) +
geom_line(color="red") + geom_point() +
scale_x_discrete(limits=c(1:jumlah_cluster_max))
Kesimpulan
Dengan memanfaatkan nilai Sum of Squares (SS) atau Sum of Squared Errors (SSE) kita bisa
mengambil keputusan jumlah segmentasi optimal yang kita gunakan.
Ini dilakukan dengan membuat simulasi iterasi jumlah cluster dari 1 sampai dengan jumlah
maksimum yang kita inginkan. Pada contoh di bab ini, kita gunakan angka iterasi 1 sampai
dengan 10.
Setelah mendapatkan nilai SS dari tiap jumlah cluster, kita bisa plotting ke grafik garis dan
menggunakan elbow method untuk menentukan jumlah cluster optimal.
Tahap berikutnya adalah mempaketkan objek kmeans ini dan semua informasi yang
berkaitan sehingga dapat digunakan untuk operasional.
Next >
"Pemaketan" Model K-Means
Pengantar
Setelah berhasil mempersiapkan data, menggunakan algoritma kmeans, dan akhirnya bisa
memutuskan jumlah cluster terbaik.
Maka tahapan berikutnya adalah "memaketkan" atau "membungkus" seluruh referensi hasil
konversi dan objek kmeans ini supaya bisa digunakan untuk mengolah data baru dan
berguna di bisnis.
Untuk ini tahapannya adalah sebagai berikut:
Next >
Menamakan Segmen
Pada praktek kali ini kita akan menamakan segmen sesuai dengan karakteristiknya. Untuk
membantu, gambar berikut menunjukkan nilai mean tiap kolom yang digunakan tiap cluster
dan juga nilai kolom sebelum konversi.
Mari kita coba namakan cluster 1 s/d 5 sebagai berikut:
Cluster 1 : Silver Youth Gals: alasannya adalah karena umurnya rata-rata adalah 20,
wanita semua, profesinya bercampur antar pelajar dan professional serta
pembelanjaan sekitar 6 juta.
Cluster 2 : Diamond Senior Member: alasannya adalah karena umurnya rata-rata
adalah 61 tahun dan pembelanjaan di atas 8 juta.
Cluster 3 : Gold Young Professional: alasannya adalah karena umurnya rata-rata
adalah 31 tahun, professional dan pembelanjaan cukup besar.
Cluster 4 : Diamond Profesional: alasannya adalah karena umurnya rata-rata adalah
42 tahun, pembelanjaan paling tinggi dan semuanya professional.
Cluster 5 : Silver Mid Professional: alasannya adalah karena umurnya rata-rata adalah
52 tahun dan pembelanjaan sekitar 6 juta.
Kita akan masukkan ini sebagai named vector pada praktek berikut.
Tugas Praktek
Buatlah satu variable data frame bernama Segmen.Pelanggan yang terdiri dari dua kolom:
Menggabungkan Referensi
Sejauh ini kita telah mempelajari pembentukan aset-aset data sebagai berikut:
Dataset pelanggan yang telah "diperkaya" dengan tambahan kolom hasil konversi
teks menjadi numerik, dan menormalisasikan field NilaiBelanjaSetahun.
Objek kmeans dengan k=5, dipilih berdasarkan metodologi menggunakan metrik
Sum of Squares (SS).
Membuat variable referensi atau pemetaan numerik dan teks asli (kategori) dari
kolom Jenis Kelamin, Profesi dan Tipe Residen.
Variable data.frame dengan nama Pelanggan yang berisi penamaan cluster sesuai
analisa karakteristik dari centroid kolom-kolom pelanggan yang digunakan.
Vector dari field yang digunakan.
Akan sangat baik jika semuanya digabungkan di satu variable dengan tipe list, dan ini akan
jadi model kita yang dapat disimpan ke dalam file dan digunakan ketika diperlukan.
Pada tugas berikut, kita akan namakan list ini dengan Identitas.Cluster. Perintahnya adalah
sebagai berikut:
Tugas Praktek
Buatlah variable Identitas.Cluster dengan mengganti bagian […] ini dengan perintah seperti
pada contoh di atas, kemudian isinya.
#Membaca data csv dan dimasukkan ke variable pelanggan
pelanggan$NilaiBelanjaSetahun = pelanggan$NilaiBelanjaSetahun/1000000
#Bagian K-Means
set.seed(100)
saveRDS(Identitas.Cluster,"cluster.rds")
pelanggan$NilaiBelanjaSetahun = pelanggan$NilaiBelanjaSetahun/1000000
#Bagian K-Means
set.seed(100)
saveRDS(Identitas.Cluster, "cluster.rds")
Kesimpulan
Pada penutup bab ini, Anda sudah menggabungkan seluruh aset yang diperlukan untuk
membentuk suatu model.
Model ini adalah objek yang bisa digunakan untuk mengolah data baru dan terdiri dari objek
kmeans, variable referensi hasil konversi teks ke numerik, dan juga penamaan cluster.
Mengoperasionalkan Model K-Means
Pengantar
Apa yang dimaksud dengan mengoperasionalkan seperti judul pada bab ini?
Ini artinya objek hasil pengolahan algoritma K-Means dan variable-variable terkait yang kita
hasilkan sebelumnya harus dapat digunakan ke kasus riil sehingga satu siklus lengkap
terjadi.
Kasus riil untuk clustering kita adalah cukup sederhana: bagaimana data baru dapat
otomatis membantu tim marketing dan CRM untuk mengidentifikasi segmen mana
pelanggan tersebut berada dengan cepat.
Dengan kecepatan identifikasi, maka organisasi atau bisnis dapat dengan cepat bergerak
dengan pesan marketing yang efektif dan memenangkan persaingan.
Next >
Data Baru
Pada teks sebelumnya, disebutkan data pelanggan baru harus cepat dipetakan ke segmen.
Dengan asumsi tiap data pelanggan baru diinput ke dalam sistem, maka pengolahan adalah
per record. Pada praktek kali ini, kita akan membuat data.frame dengan satu data dimana
nama-nama kolomnya persis dengan dataset awal.
Tugas Praktek
Ketik perintah kedua perintah berikut pada code editor, masing-masing mengisi data.frame
dan menampilkannya.
databaru
readRDS(file="cluster.rds")
Lakukan tugas berikut untuk membaca dan menampilkan objek dari cluster.rds.
Tugas Praktek
Baca objek dari file cluster.rds dengan menggunakan function readRDS, dan simpan sebagai
variable dengan nama Identitas.Cluster. Setelah itu, tampilkan isi dari Identitas.Cluster.
Jika eksekusi berhasil, maka hasil yang muncul adalah sebagai berikut.
$Profesi
Profesi Profesi.1
1 Wiraswasta 5
2 Pelajar 3
3 Professional 4
17 Ibu Rumah Tangga 1
31 Mahasiswa 2
$Jenis.Kelamin
Jenis.Kelamin Jenis.Kelamin.1
1 Pria 1
2 Wanita 2
$Tipe.Residen
Tipe.Residen Tipe.Residen.1
1 Sector 2
2 Cluster 1
$Segmentasi
K-means clustering with 5 clusters of sizes 14, 5, 12, 9, 10
Cluster means:
Jenis.Kelamin.1 Umur Profesi.1 Tipe.Residen.1 NilaiBelanjaSetahun
1 2.00 20.07143 3.571429 1.357143 5.901089
2 1.40 61.80000 4.200000 1.400000 8.696132
3 1.75 31.58333 3.916667 1.250000 7.330958
4 2.00 42.33333 4.000000 1.555556 8.804791
5 1.70 52.50000 3.800000 1.300000 6.018321
Clustering vector:
[1] 2 1 5 5 4 1 2 5 3 3 5 5 2 2 1 3 3 2 3 1 4 5 3 4 3 5 3 4 5 4 1 4 1 1 4 3 1 4 1 1
1 3 3 1 1
[46] 1 5 4 3 5
Available components:
$Segmen.Pelanggan
cluster Nama.Segmen
1 1 Silver Youth Gals
2 2 Diamond Senior Member
3 3 Gold Young Professional
4 4 Diamond Professional
5 5 Silver Mid Professional
$field_yang_digunakan
[1] "Jenis.Kelamin.1" "Umur" "Profesi.1"
"Tipe.Residen.1"
[5] "NilaiBelanjaSetahun"
Identitas.Cluster <- readRDS(file="cluster.rds")
Identitas.Cluster
merge(databaru, Identitas.Cluster$Profesi)
Cobalah ketik perintah ini ke code editor dan lanjutkan perintahnya untuk menggabungkan
juga variable Identitas.Cluster$Jenis.Kelamin dan Identitas.Cluster$Tipe.Residen. Kemudian
tampilkan data akhirnya.
Jika eksekusi berjalan dengan lancar, hasil akhir akan terlihat sebagai berikut.
databaru <- data.frame(Customer_ID="CUST-100", Nama.Pelanggan="Rudi
Wilamar",Jenis.Kelamin="Wanita",Profesi="Pelajar",Tipe.Residen="Cluster",NilaiBelanjaSetahun=3.5)
databaru
Menentukan Cluster
Kini saatnya penentuan untuk melakukan praktek terpenting bagi bisnis: data baru ini masuk
ke segmen mana?
Gampang!
Yaitu dengan tahapan berikut:
dimana:
Mungkin Anda masih akan perlu memahami ini karena konstruksinya yang mungkin sedikit
aneh tapi sebenarnya prinsipnya sederhana. Cobalah lakukan corat coret dan berkunjung
kembali ke halaman ini dengan account DQLab untuk memahami rumusan ini.
Untuk saat ini…agar tidak membuang waktu, kita coba terapkan secara praktis pada tugas
berikut.
Tugas Praktek
Perintah untuk menentukan cluster seperti pada contoh di atas untuk kasus kita telah terisi
pada code editor berikut.
Jalankan code tersebut, dan hasil akhir adalah tampilan nomor cluster yang isinya 1.
Rubahlah umur pelanggan pada databaru dengan 32, jalankan kembali dan lihat hasilnya.
Kemudian jadikan perintah which.min(…) sebagai index pada referensi nama cluster
(Segmen.Pelanggan) sehingga tampilan tidak mengeluarkan nomor cluster, tetapi nama
cluster.
Petunjuk:
Index yang menggunakan which.min(…) sebagai index harus mengikuti format berikut.
Perhatikan koma di penutup kurung siku.
Identitas.Cluster$Segmen.Pelanggan[which.min(…),]
Kesimpulan
Praktek terakhir menunjukkan bagaimana data pelanggan baru dianalisa oleh model kita dan
mengeluarkan nomor cluster atau segmen.
Dengan berakhirnya praktek ini, berarti menunjukkan kita sudah menjalani siklus tahap demi
tahap memodelkan dan menggunakan customer segmentation terhadap data kita.
Penutup
Kesimpulan
Selamat, Anda sudah menyelesaikan rangkaian langkah untuk mengerti penggunaan
algoritma k-means di R dengan tujuan segmentasi pelangggan.
Dimulai dari persiapan data, menggunakan algoritma dan menganalisa hasilnya, mencari
jumlah segmentasi paling optimal, memaketkan model yang dihasilkan agar dapat
digunakan dalam operasional untuk membantu tim marketing melakukan otomatisasi dan
menyampaikan pesan ke target yang tepat.
Next >
What Next?
Sejauh ini topik teknis untuk customer segmentation yang kita pelajari adalah mengenai
algoritma K-Means yang diimplementasikan di R.
Perlu diingat bahwa K-Means bukan satu-satunya algoritma clustering, masih banyak
algoritma lain seperti Hierarchical Clustering, Parallelized Hierarchical Clustering, dan lain-
lain.
Dan setiap algoritma juga memiliki kekurangan dan kelebihan masing-masing. Namun
pengetahuan dasar dengan berangkat dari satu algoritma yang populer dan
menuntaskannya pastinya akan menjadi bekal berharga.
Untuk selanjutnya, kita akan memperdalam topik penggunaan algoritma clustering ini dalam
bentuk latihan dengan project online. Dan tentunya pada saat project ini, dataset yang
diberikan juga akan jauh lebih kompleks dan besar.
Untuk saat ini, project terkait masih belum tersedia. Kami akan email Anda setelah project
tersedia untuk dikerjakan.
Stay tuned!
Pendahuluan
Credit Scoring
Pada modul Machine Learning for Finance: Credit Risk Prediction kita mempelajari
penerapan algoritma decision tree C5.0 untuk memprediksi credit scoring/ rating suatu
nasabah berdasarkan variabel-variabel seperti pendapatan, tenor pinjaman dan banyaknya
tanggungan.
Berikut ini adalah contoh variabel-variabel yang umumnya digunakan untuk credit scoring:
Demografi aplikan
jenis kelamin
usia
pendidikan tertinggi
pekerjaan
lama bekerja pada pekerjaan terakhir
Disposable income
pendapatan
besarnya pinjaman
tenor pinjaman
banyaknya tanggungan
Credit history
besarnya pinjaman
usia rata-rata keterlambatan pembayaran (overdue)
nominal pembayaran per periode
Aset
Dataset untuk rating kredit pada umumnya memiliki banyak sekali variabel. Harapan dari
mencatat data dengan banyak variabel ini adalah membuat model yang bisa membuat
klasifikasi credit rating yang akurat. Namun besarnya jumlah variabel ini juga menimbulkan
persoalan tersendiri, yaitu banyaknya redundant variabel, kesulitan melakukan visualisasi,
kesulitan menjelaskan model dan besarnya storage yang diperlukan. Di sinilah teknik
statistika Principal Component Analysis dapat berperan, yaitu sebagai unsupervised
algorithm untuk mengurangi banyaknya variabel (dimension reduction) untuk digunakan
sebagai input untuk algoritma lain tanpa banyak mengurangi kualitas dari prediksi rating.
Sebagian besar algoritma machine learning terbagi menjadi 2 bagian, yaitu supervised
learning dan unsupervised learning. Supervised learning bertujuan untuk mencari fungsi
yang memetakan nilai atribut suatu instance ke nilai atribut targetnya. Beberapa contoh dari
SL adalah algoritma decision tree C5.0 (modul Machine Learning for Finance: Credit Risk
Prediction), analisa regresi linier. Unsupervised learning bertujuan mencari pola dalam data
tanpa bantuan atribut target. Salah satu contoh dari UL adalah algoritma k-means (modul
Machine Learning for Marketing) digunakan untuk segmentasi pelanggan.
Next >
Yang dimaksud linier pada konteks ini adalah linier dalam variabel.
Pada contoh PC1 = 0.674x1 + 0.664x2 + 0.330x3, variabel x1, x2, x3 masing-masing berpangkat 1.
Pada contoh PC3 = 0.5x12 + 0.664√x2 + log20.330x3, variabel x1, x2 dan x3 tidak berpangkat 1.
Principal Component ini dipilih dengan syarat-syarat sebagai berikut:
Pada gambar pertama menunjukkan variabilitas data lebih tinggi pada arah Principal
Component pertama (garis biru) dibandingkan dengan arah Principal Component kedua
(garis merah). Pada gambar kedua data lebih banyak bervariasi searah dengan sumbu X
dibandingkan dengan arah sumbu Y. Variabilitas pada data dapat diaproksimasi hanya
dengan menggunakan Princicipal Component 1 yang terletak sejajar dengan sumbu X.
Analogi principal component mirip dengan tusuk sate. Pada gambar pertama kita akan
meletakkan tusuk sate pertama (warna biru) untuk menusuk sebanyak mungkin potongan
daging yang berserakan. Sebagian daging yang belum tertusuk oleh tusuk sate pertama,
akan ditusuk oleh tusuk sate kedua (warna merah). Pada gambar kedua sebagian besar
potongan daging mengarah sejajar dengan sumbu X, sehingga hanya diperlukan satu tusuk
sate saja (warna biru).
Konsep dasar dari PCA adalah melakukan aproksimasi dengan mencari variabel-variabel
yang memberikan variabilitas terbesar pada data lalu meletakkan “sumbu-sumbu” principal
component agar hubungan antar variabel (korelasi antar variabel) menjadi minimal.
Penghitungan Varians dan Principal Component ini dapat dilakukan dengan menggunakan
konsep nilai eigen (eigenvalue) dan vektor eigen (eigenvector) dari ilmu Aljabar Linier. Nilai-
nilai eigen menunjukkan kontribusi suatu principal component terhadap varians data.
Vektor-vektor eigen memberikan koefisien-koefisien Principal Components. Banyaknya
Principal Components yang akan dipilih disesuaikan dengan batasan yang diinginkan atau
dengan menggunakan Screeplot. Cara menghitung nilai eigen dan cara memperoleh vektor-
vektor eigen dibahas pada bab reviu Aljabar Linier.
Next >
Reduksi Dimensi
Asumsi-asumsi
Asumsi-asumsi yang harus dipenuhi agar teknik Principal Component Analysis dapat berjalan
dengan baik:
Next >
Cara kerja teknik Principal Component Analysis adalah memilih principal component yang
memberikan varians terbesar. Cara kerja metode PCA menyebabkan metode ini sangat
sensitif terhadap nilai variabel yang berbeda-beda atau terhadap skala variabel yang
berbeda. Agar PCA tidak salah “memilih” variabel, maka variabel-variabel input perlu
distandarisasi. Standarisasi variabel dilakukan dengan cara mengurangi setiap observasi
pada variabel tersebut dengan mean variabel dan membagi dengan simpangan baku
variabel.
Koefisien korelasi menunjukkan kuatnya hubungan linier antara 2 buah variabel. Hubungan
antar 2 variabel untuk semua variabel prediktor dalam data dapat dilihat pada matrik
korelasi. Koefisien korelasi yang tinggi (mendekati 1 untuk hubungan linier yang searah atau
mendekati -1 untuk hubungan linier yang berlawanan arah) merupakan indikasi redundancy.
Di sinilah teknik PCA dapat digunakan untuk mengurangi dimensi dengan cara memilih
“variabel-variabel” baru yang tidak saling berkorelasi yang mampu menjelaskan sebagian
besar variabilitas data.
Dari matrik korelasi didapatkan informasi mengenai kekuatan hubungan linier antara
variabel. Tujuan kita melakukan PCA adalah memilih variabel-variabel yang memberikan
varians terbesar dengan cara meminimalkan distorsi antara variabel. Hal ini dilakukan
dengan cara menghitung nilai eigen dan vektor eigen dari matrik korelasi. “Variabel baru”
principal component didapatkan dari vektor eigen dan merupakan kombinasi linier dari
variabel lama. Koefisien-koefisien tersebut menunjukkan besarnya bobot variabel-variabel
lama dalam masing-masing principal component.
Berapa banyaknya principal component yang dipilih? Ada beberapa kriteria yang dapat
digunakan untuk menentukan k:
Dalam modul ini kita akan memilih p Principal Component pertama yang nilai eigennya lebih
dari 1 sampai dengan batasan variabilitas tertentu. Mengapa nilai eigen yang dipilih adalah
nilai eigen yang lebih dari 1? Sebuah PC yang nilai eigennya lebih dari 1 mampu menjelaskan
variabilitas data yang lebih besar daripada variabel-variabel asal.
Besarnya kontribusi sebuah principal component terhadap variabilitas data dapat dihitung
dengan rumus
Deskripsi
Contoh
Berikut ini adalah contoh dataset dengan 3 variabel.
## 'data.frame': 20 obs. of 3 variables:
## $ x1: num 8.1 10.6 7.5 14.8 11 7.5 11.5 12.2 11.7 9.1 ...
## $ x2: num 10.6 13 9.5 15.8 13.3 9.5 13.4 13.5 13.5 11.3 ...
## $ x3: num 217.7 173.3 648.5 578.3 -44.4 ...
## x1 x2 x3
## 1 8.1 10.6 217.7
## 2 10.6 13.0 173.3
## 3 7.5 9.5 648.5
Output statistika deskriptif menunjukkan skala dan variabilitas x1 mirip dengan x3, mean pada
skala puluhan. Variabel x3 memiliki skala yang jauh berbeda dengan 2 variabel lainnya
dengan mean pada skala ratusan.
## x1 x2 x3
## Min. : 3.40 Min. : 5.40 Min. :-264.7
## 1st Qu.: 8.85 1st Qu.:11.12 1st Qu.: 85.8
## Median :11.10 Median :13.20 Median : 357.2
## Mean :10.58 Mean :12.59 Mean : 369.4
## 3rd Qu.:12.28 3rd Qu.:14.32 3rd Qu.: 600.8
## Max. :14.80 Max. :17.20 Max. :1290.2
Demikian pula dengan skala simpangan baku (standard deviation) untuk variabel x1, x2 dan x3.
## x1 x2 x3
## 2.736998 2.676462 404.869508
Next >
head(df, 3)
cormat
eig
round(eig$values/ncol(df),3)
round(cumsum(eig$values/ncol(df)),3)
Dengan menggunakan batasan 80%, maka hanya 2 principal component yang diperlukan
untuk menjelaskan 99% variabilitas data, yaitu PC1 dan PC2.
Screeplot dapat digunakan sebagai alat bantu untuk memilih banyaknya PC. Banyaknya
principal component yang akan dipilih adalah angka pada elbow Screeplot.
Banyaknya PC(p) yang dipilih adalah pada saat terjadi penurunan varians yang tajam
sebelum penurunan varians melandai. Pada contoh ini banyaknya PC yang dipilih adalah 2.
Bila kita menggunakan kriterion Kaiser pada scree plot, maka banyaknya PC yang dipilih
adalah 1.
library(factoextra)
fviz_eig(pr.out, addlabels = TRUE)
screeplot(pr.out, type = "line")
abline(h = 1, lty = 3, col = "red")
round(eig$values/ncol(df),3)
round(cumsum(eig$values/ncol(df)),3)
pr.out
summary(pr.out)
library(factoextra)
Pada biplot di atas variabel x1 dan x2 memiliki kontribusi yang besar terhadap PC1 (arah
mendatar) dan variabel x3 memiliki kontribusi yang besar terhadap PC2 (arah vertikal).
Dalam contoh ini, Anda hanya perlu run dan submit code di bawah ini.
library(openxlsx)
pr.out$rotation
biplot(pr.out, scale = 0)
library(openxlsx)
pr.out$rotation
biplot(pr.out, scale = 0)
Contoh | Langkah 6: Menghitung Skor Baru
Kita telah berhasil mereduksi dimensi variabel-variabel prediktor dari 3 variabel menjadi 2
variabel dengan menggunakan Principal Component Analysis. Skor variabel lama akan
ditransformasi menjadi skor variabel baru dengan menggunakan rumus
head(df)
## x1 x2 x3
## [1,] -0.906102243 -0.7416508 -0.3747010
## [2,] 0.007307276 0.1550555 -0.4843659
## [3,] -1.125320527 -1.1526412 0.6893456
## [4,] 1.541835268 1.2012128 0.5159564
## [5,] 0.153452799 0.2671437 -1.0220701
## [6,] -1.125320527 -1.1526412 -1.0450404
maka nilai observasi ini dalam “sistem koordinat” yang baru dengan 2 PC adalah
## PC1 PC2 PC3
## [1,] -1.22400335 0.02840327 0.11170080
## [2,] -0.05242254 -0.49816513 0.08825722
## [3,] -1.29178635 1.18374272 0.01290291
## [4,] 2.00215943 -0.14744625 -0.23663535
## [5,] -0.05794123 -1.06493057 0.04589582
## [6,] -1.86572942 -0.45199295 -0.04235061
head(df)
df_new[1:6,1:2]
Tugas Praktik
Ketikkan perintah berikut ini pada console untuk mereplikasi contoh pembahasan yang telah
dilakukan.
#Panggil library openxlsx untuk membaca file data Excel
library(openxlsx)
str(df_raw)
names(pr.out)
pr.out
summary(pr.out)
biplot(pr.out, scale = 0)
Deskripsi variabel dalam dataset credit rating ini adalah sebagai berikut:
Variabel respons pada dataset ini adalah risk rating. Variabel-variabel lain adalah variabel
prediktor.
Variabel yang akan digunakan untuk analisa PCA adalah variabel prediktor dengan tipe data
numerik, yaitu
Statistika Deskriptif
Sebelum melakukan reduksi dimensi dengan PCA, terlebih dahulu kita melakukan eksplorasi
data dengan teknik statistika deskriptif.
## income tenor dependents midoverdue
## Min. : 70.0 Min. :12.0 Min. :0.000 Min. :15.00
## 1st Qu.:120.0 1st Qu.:12.0 1st Qu.:1.000 1st Qu.:15.00
## Median :162.0 Median :24.0 Median :3.000 Median :53.00
## Mean :162.4 Mean :29.8 Mean :2.929 Mean :48.08
## 3rd Qu.:197.0 3rd Qu.:48.0 3rd Qu.:5.000 3rd Qu.:53.00
## Max. :299.0 Max. :48.0 Max. :6.000 Max. :91.00
Dari boxplot distribusi income berdasarkan dependents dapat disimpulkan bahwa tidak
terdapat perbedaan besar pada median dan sebaran penghasilan individu-individu tidak
memiliki tanggungan sampai dengan yang memiliki 4 tanggungan. Median dan sebaran
penghasilan kelompok dengan 5 dan 6 dependen lebih besar dibandingkan dengan 5
kelompok sebelumnya.
Matriks korelasi memberikan informasi kekuatan hubungan linier antara variabel. Terlihat
hubungan paling kuat adalah hubungan antara dependents dan midoverdue disusul oleh
hubungan antara income dan dependents.
Next >
Split Dataset
Dataset yang akan digunakan untuk training dan testing perlu dipisahkan agar informasi
yang digunakan untuk testing tidak “bocor” ke dataset yang digunakan untuk training.
Sebanyak 80% data akan digunakan untuk training, sisanya dialokasikan untuk testing.
Teknik sampling yang akan digunakan adalah stratified sampling dengan menggunakan risk
rating sebagai stratum. Alasan menggunakan stratified sampling adalah agar risk rating yang
berbeda-beda bisa terwakili dalam dataset training dan mencegah kemungkinan
memperoleh PCA yang dihasilkan dari training dataset yang hanya mengandung risk rating
tertentu.
Proporsi untuk setiap risk rating pada training set akan diterapkan untuk testing set. PCA
akan diterapkan pada training dataset.
Next >
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.3709 1.0347 0.9177 0.45591
## Proportion of Variance 0.4698 0.2677 0.2105 0.05196
## Cumulative Proportion 0.4698 0.7375 0.9480 1.00000
Nilai-nilai eigen
Penerapan kriterion Kaiser pada Screeplot menghasilkan 2 PC, yaitu PC1 dan PC2 yang
menjelaskan sebanyak 74% variabilitas dalam data. Hal ini juga konsisten dengan inspeksi
rotasi pada bagian sebelumnya, dimana PC3 dan PC4 merupakan pengulangan pola pada
PC1 dan PC2.
Pada tahap ini dataset dengan 4 variabel
numerik income, tenor, dependents dan midoverdue telah berhasil direduksi menjadi 2
“variabel” PC1 dan PC2.
Visualisasi Output
Pada biplot terlihat variabel dependents dan midoverdue memberikan paling banyak
kontribusi pada arah PC1. Variabel income dan tenor berkontribusi pada arah PC1.PC2 dapat
diberi nama “Beban” dan PC2 dapat diberi nama “Kemampuan Membayar”.
Sudut antara 2 vektor variabel menunjukkan kekuatan hubungan 2 variabel. Sudut lancip di
antara midoverdue dan dependents menunjukkan korelasi yang kuat sedangkan sudut
tumpul di antara income dan tenor menunjukkan korelasi yang lemah.
1. Membaca data
2. Menampilkan statistika deskriptif
3. Memisahkan data ke dalam training set dan testing set
4. Memanggil fungsi untuk PCA
5. Visualisasi output.
Input Data
Data akan dibaca dengan menggunakan package openxlsx.
library(openxlsx)
Untuk membaca data dan menyimpannya ke dalam obyek dataframe, gunakan fungsi
R read.xlsx(). Data dari file dqlab_pcadata.xlsx, sheet cs4varb akan disimpan ke dalam data
frame bernama dat_raw.
Untuk melihat struktur data frame dan tipe variabel, gunakan fungsi str(). Untuk
menampilkan beberapa baris pertama dari data frame, gunakan fungsi head().
str(dat_raw)
## 'data.frame': 900 obs. of 6 variables:
## $ contractcode: chr "AGR-000001" "AGR-000011" "AGR-000030" "AGR-000043" ...
## $ income : num 295 271 159 210 165 220 70 88 163 100 ...
## $ dependents : num 5 5 0 3 0 5 3 3 5 6 ...
## $ asset : num 893 906 552 791 593 ...
## $ debt : num 4.6984 4.0639 0.05 0.7214 0.0667 ...
## $ riskrating : num 4 4 1 3 2 1 2 2 2 2 ...
head(dat_raw)
## contractcode income dependents asset debt riskrating
## 1 AGR-000001 295 5 892.9266 4.69837074 4
## 2 AGR-000011 271 5 905.8225 4.06385168 4
## 3 AGR-000030 159 0 551.7261 0.05000000 1
## 4 AGR-000043 210 3 791.1124 0.72138396 3
## 5 AGR-000049 165 0 592.6501 0.06666667 2
## 6 AGR-000063 220 5 778.0493 2.59791099 1
Statistika Deskriptif
Menampilkan statistika deskriptif 5 number summary dapat dilakukan dengan
fungsi summary() dan fungsi apply().
Boxplot debt vs dependents bisa digambarkan dengan geom_boxplot dari package ggplot2.
Grafik ini digunakan untuk membandingkan rata-rata hutang untuk
library(ggplot2)
ggplot(dat_raw, aes(as.factor(dependents), debt)) + geom_boxplot() +
xlab("Dependents") + ggtitle("Boxplot Debt Berdasarkan Dependents")
Split Data: Training Set dan Testing Set
Data akan dipisahkan menjadi 2 bagian: training dan testing set. Agar training dan testing set
mendapatkan data dengan semua risk rating, sampling akan dilakukan dengan
metode stratified sampling. Sebesar 80% data dari tiap-tiap risk rating akan dialokasikan
untuk training set, sisanya dialokasikan untuk testing set.
Untuk mencari index baris yang memiliki risk rating 1, 2 dan seterusnya, gunakan
fungsi which().
Banyaknya data untuk tiap-tiap risk rating yang dialokasikan untuk training set dihitung
dengan perintah berikut ini.
Tentukan seed agar sampling bisa direplikasi dengan set.seed(). Ambillah sampel data tiap-
tiap risk rating untuk dialokasikan ke dalam training set.
set.seed(200)
train1_index <- sample(index1, ntrain1)
train2_index <- sample(index2, ntrain2)
train3_index <- sample(index3, ntrain3)
train4_index <- sample(index4, ntrain4)
train5_index <- sample(index5, ntrain5)
Gunakan fungsi setdiff() untuk mengalokasikan data untuk testing set. Indeks baris yang
dipilih adalah indeks baris yang tidak diambil dalam proses sampling untuk training set.
PCA
Sebelum melakukan PCA, terlebih dahulu kita meneliti korelasi antar variabel dalam data.
cor(cstrain)
## income tenor dependents midoverdue
## income 1.00000000 -0.04649806 0.25180228 0.1599918
## tenor -0.04649806 1.00000000 0.00526126 0.2100942
## dependents 0.25180228 0.00526126 1.00000000 0.7615983
## midoverdue 0.15999175 0.21009415 0.76159830 1.0000000
Visualisasi Ouput
Screeplot digambarkan dengan fungsi screeplot(). Garis horizontal untuk panduan penerapan
kriterion Kaiser digambarkan dengan abline.
biplot(pr.out, scale = 0)
Grafik biplot dari default package stat seringkali sulit dibaca bila data berukuran besar.
Fungsi lain yang dapat digunakan
adalah autoplot dari ggfortify atau fviz_pca_biplot dari factoextra.
library(ggfortify)
autoplot(pr.out, data = csdat_train, loadings = TRUE, loadings.label = TRUE, scale =
0)
library(factoextra)
fviz_pca_biplot(pr.out, label = "var", habillage=csdat_train$riskrating)
Soal
Ikuti 16 langkah di bawah ini untuk melakukan Principal Component Analysis untuk 4
variabel prediktor numerik dalam data credit rating. Gantilah baris yang diawali dengan
tanda #[1] dan seterusnya dengan kode yang diminta.
#Panggil library openxlsx untuk membaca file data Excel
#[1]
library(openxlsx)
#[2]
#[3]
str(csdat_raw)
#[4]
head(csdat_raw)
summary(csdat_raw)
library(ggplot2)
#[6]
#[7]
set.seed(100)
#[8]
#[9]
csdat_raw[train4_index,], csdat_raw[train5_index,]))
-c(contractcode,riskrating))
csdat_raw[test2_index,], csdat_raw[test3_index,],
cor(cstrain)
#[12]
#[13]
pr.out
summary(pr.out)
#[15]
#[16]
Deskripsi variabel dalam dataset credit rating ini adalah sebagai berikut:
Variabel respons pada dataset ini adalah risk rating. Variabel-variabel lain adalah variabel
prediktor.
Variabel yang akan digunakan untuk analisa PCA adalah variabel prediktor dengan tipe data
numerik, yaitu
Statistika Deskriptif
Sebelum melakukan reduksi dimensi dengan PCA, terlebih dahulu kita melakukan eksplorasi
data dengan teknik statistika deskriptif.
## income tenor dependents midoverdue
## Min. : 70.0 Min. :12.0 Min. :0.000 Min. :15.00
## 1st Qu.:120.0 1st Qu.:12.0 1st Qu.:1.000 1st Qu.:15.00
## Median :162.0 Median :24.0 Median :3.000 Median :53.00
## Mean :162.4 Mean :29.8 Mean :2.929 Mean :48.14
## 3rd Qu.:197.0 3rd Qu.:48.0 3rd Qu.:5.000 3rd Qu.:53.00
## Max. :299.0 Max. :48.0 Max. :6.000 Max. :91.00
## age empyear asset debt
## Min. :20.00 Min. : 0.000 Min. : 232.2 Min. : 0.0500
## 1st Qu.:29.00 1st Qu.: 3.000 1st Qu.: 444.3 1st Qu.: 0.6469
## Median :36.00 Median : 5.000 Median : 553.2 Median : 2.0416
## Mean :35.74 Mean : 5.108 Mean : 568.7 Mean : 3.7966
## 3rd Qu.:41.00 3rd Qu.: 7.000 3rd Qu.: 682.7 3rd Qu.: 5.1902
## Max. :59.00 Max. :13.000 Max. :1100.3 Max. :23.5382
Dari boxplot income berdasarkan dependents dapat disimpulkan bahwa tidak terdapat
perbedaan besar pada median dan sebaran penghasilan individu-individu tidak memiliki
tanggungan sampai dengan yang memiliki 4 tanggungan. Median dan sebaran penghasilan
kelompok dengan 5 dan 6 dependen lebih besar dibandingkan dengan 5 kelompok
sebelumnya.
Hal yang sama dapat diamati pada boxplot debt berdasarkan dependents. Median dan
sebaran debt semakin besar dengan semakin banyaknya tanggungan.
Matrik korelasi memberikan informasi kekuatan hubungan linier antar variable. Terlihat
hubungan paling kuat adalah hubungan
antara income versus age, income dan empyear disusul dengan hubungan
antara dependents versus midoverdue dan debt.
Next >
Split Dataset
Dataset yang akan digunakan untuk training dan testing perlu dipisahkan agar informasi
yang digunakan untuk testing tidak “bocor” ke dataset yang digunakan untuk training.
Sebanyak 80% data akan digunakan untuk training, sisanya dialokasikan untuk testing.
Teknik sampling yang akan digunakan adalah stratified sampling dengan menggunakan risk
rating sebagai stratum. Alasan menggunakan stratified sampling adalah agar risk rating yang
berbeda-beda bisa terwakili dalam dataset training dan mencegah kemungkinan
memperoleh PCA yang dihasilkan dari training dataset yang hanya mengandung risk rating
tertentu.
Proporsi untuk setiap risk rating pada training set akan diterapkan untuk testing set. PCA
akan diterapkan pada training dataset.
Next >
Nilai-nilai eigen
Penerapan kriterion Kaiser pada screeplot menghasilkan 2 PC, yaitu PC1 dan PC2 yang
menjelaskan sebanyak 74% variabilitas dalam data. Hal ini juga konsisten dengan inspeksi
rotasi pada bagian sebelumnya, di mana PC3 dan PC4 merupakan pengulangan pola pada
PC1 dan PC2.
Pada tahap ini dataset dengan 8 variabel numerik
Visualisasi Output
Pada biplot terlihat variabel income, age, empyear dan asset memberikan paling banyak
kontribusi pada arah PC1. Variabel dependents, midoverdue, debt paling banyak
berkontribusi pada arah PC2. PC1 dapat diberi nama “Kemampuan Membayar” dan PC2
dapat diberi nama “Beban dan Resiko”.
Sudut antara 2 vektor variabel menunjukkan kekuatan hubungan 2 variabel. Sudut lancip di
antara midoverdue dan dependents menunjukkan korelasi yang kuat sedangkan sudut
tumpul di antara income dan tenor menunjukkan korelasi yang lemah.
library(openxlsx)
str(cslarge_raw)
head(cslarge_raw)
#Tampilkan statistika deskriptif untuk semua variabel dalam data frame.
summary(cslarge_raw)
library(ggplot2)
set.seed(100)
cslarge_raw[train2_index,], cslarge_raw[train3_index,],
cslarge_raw[train4_index,], cslarge_raw[train5_index,]))
cslarge_raw[test2_index,], cslarge_raw[test3_index,],
cslarge_raw[test4_index,], cslarge_raw[test5_index,]))
cor(cstrain)
library(ggcorrplot)
ggcorrplot(cor(cstrain))
pr.out
#Tampilkan summary dari output PCA
summary(pr.out)
library(ggfortify)
library(factoextra)
Dua buah matrik dapat dikalikan bila banyaknya baris pada matrik pertama sama dengan
banyaknya kolom pada matrik kedua.
Am×nBn×p = Cm×p
Next >
Koordinat vektor pada sistem koordinat ini adalah c1 = 1 dan c2 = 2.
Koordinat vektor ini akan berubah bila basisnya berubah.
Koordinat vektor pada sistem koordinat baru adalah c1 = 1 dan c2 = −1.
Next >
Masing-masing nilai eigen yang unik akan menghasilkan sebuah vektor eigen.
Contoh
Hitung nilai eigen dan cari vektor eigen dari matriks
Jawaban
Nilai eigen dari matriks A adalah determinan dari matriks (A − λI).
Untuk nilai eigen λ = 2, vektor eigen diperoleh dari solusi sistem persamaan linier (A − 2I) = .
Untuk nilai eigen λ = 1, vektor eigen diperoleh dari solusi sistem persamaan linier (A−1 · I) = .
Untuk nilai eigen λ = −1, vektor eigen diperoleh dari solusi sistem persamaan linier (A−(−1)·I)
= .
Menghitung nilai eigen dan vektor eigen secara manual tentu akan sulit untuk matriks
berdimensi besar. R memiliki fungsi eigen dari package base untuk menghitung nilai eigen
dan vektor eigen. R akan secara otomatis mengurutkan nilai eigen dari yang berbesar sampai
dengan yang terkecil.
e <- eigen(A)
str(e)
Tugas Praktik
Ikuti langkah-langkah berikut dan diindikasikan dengan comment pada code editor.
# Ketik perintah berikut ini untuk membaca help tentang matriks
?matrix
ev <- eigen(A)
str(ev)
ev
ev$values
ev$vectors
Kesimpulan
Keterbatasan PCA
Dalam praktek Principal Component-Principal Component diberi nama tersendiri
berdasarkan ringkasan variabel-variabel yang dominan. Hal ini memerlukan pengetahuan
domain dan ada kalanya variabel-variabel yang muncul kurang sesuai dengan teori pada
domain.
Cara kerja PCA dalam mereduksi dimensi adalah membentuk Principal Component-Principal
Component yang memberikan variabilitas data terbesar. Keterbatasan PCA adalah proses
pemilihan PC hanya dilakukan dengan variabel-variabel prediktor. Oleh karena itu PCA
sebaiknya bukan digunakan sebagai model namun digunakan sebagai teknik preprocessing
data untuk kemudian menjadi input metode lain. Alternatif lain adalah menggunakan
metode Partial Least Squares yang melibatkan variabel respons dalam reduksi dimensi.
Kesimpulan
Anda telah mempelajari Principal Component Analysis sebagai salah satu teknik reduksi
dimensi. PCA mengurangi dimensi dengan membentuk “variabel-variabel” baru yang
menjelaskan sebagian besar variabilitas data. Dengan demikian visualisasi data maupun
penjelasan model akan lebih mudah dilakukan.
Langkah-langkah reduksi dimensi dengan PCA yang sudah dilakukan adalah
Pengantar
Latar Belakang Project
COVID-19 merupakan penyakit yang saat ini telah menjadi pandemi secara global. Kondisi
menjadi semakin mengkhawatirkan karena hingga detik ini masih belum ditemukan vaksin
yang efektif untuk virus penyebab COVID-19. Pemerintah di berbagai negara umumnya
dengan sigap membentuk gugus tugas (task force unit) untuk menangani penyebaran COVID-
19 di masyarakat, termasuk pemerintah di Indonesia.
Salah satu bentuk aksi yang dilakukan oleh pemerintah adalah dengan mengumpulkan dan
menyediakan data pertumbuhan kasus COVID-19 kepada publik. Data pertumbuhan kasus
tersebut tidak jarang juga dilengkapi dengan dasbor dan grafik visualisasi pendukung dengan
harapan masyarakat dapat memahami informasi dengan lebih mudah. Sebagai contoh
adalah portal covid19.go.id besutan Gugus Tugas Penanganan COVID-19 Nasional dan
portal PIKOBAR milik pemerintah Provinsi Jawa Barat. Serta banyak portal data COVID-19
lainnya yang disediakan oleh masing-masing pemerintah daerah.
Next >
Warming Up!
Sebagai pemanasan sebelum Anda memulai proyek ini, buatlah sebuah vektor karakter
dengan 3 elemen dengan nama bersatulawancovid yang merupakan kunci dasar
menghindari COVID-19!
Jangan lupa untuk mencetak vektor bersatulawancovid tersebut pada layar konsol!
bersatulawancovid
Mengevaluasi Respon
Saat Anda menjalankan fungsi GET(), pada dasarnya hal yang terjadi adalah Anda membuat
sebuah permintaan kepada server penyedia API. Permintaan Anda tersebut selanjutnya
diproses dan dijawab oleh server sebagai sebuah respon. Objek resp yang telah Anda buat
memiliki informasi respon oleh server.
Ada tiga informasi utama dalam sebuah respon API, yaitu status, headers,
dan body. Status memiliki informasi apakah permintaan Anda berhasil atau tidak dan
dinyatakan dalam status code, headers umumnya mengandung informasi metadata,
sedangkan body berisikan konten atas permintaan yang telah dibuat.
Next >
Status Code
Ada beberapa jenis status code yang umumnya dijumpai, antara lain:
200. Artinya permintaan sukses dipenuhi.
status_code(resp)
Status Code - 2
Selain menggunakan fungsi status_code(), Anda juga dapat mengetahui status permintaan
dengan cara mengakses elemen dari resp. Status code tersebut tersedia dengan
nama status_code dan dapat diakses dengan menggunakan operator $ pada obyek resp.
Cobalah kembali akses status code dengan cara tersebut dan bandingkan hasilnya dengan
cara pertama!
library(httr)
resp$status_code
identical(resp$status_code, status_code(resp))
Headers API
Selamat status permintaan Anda melalui API sukses dipenuhi! Sekarang cobalah Anda
jalankan fungsi headers() pada resp untuk mengetahui metadata apa saja yang tersimpan.
Apakah isi dari elemen content-type? Kapan terakhir kali informasi diperbaharui?
library(httr)
headers(resp)
Mengekstrak isi Respon
Respon API dengan status code 200 menyatakan bahwa permintaan Anda berhasil dipenuhi
dan konten yang diminta tersedia untuk diekstrak. Selain itu Anda juga telah mengetahui
lewat fungsi headers() bahwa konten yang diminta tersedia dalam bentuk application/json,
yaitu berkas JSON.
Selanjutnya Anda dapat mengekstrak konten tersebut dengan menggunakan
fungsi content(). Fungsi content() tersebut secara cerdas akan menyesuaikan output
sesuai dengan jenis berkas yang tersedia, dalam hal ini adalah berkas JSON. Jalankan fungsi
tersebut pada obyek resp dan tambahkan argumen as = "parsed" dan simplifyVector =
TRUE. Simpanlah hasilnya sebagai cov_id_raw!
library(httr)
names(cov_id_raw)
Analisa Data
Sekarang Anda diminta untuk fokus pada obyek cov_id_update untuk menjawab
pertanyaan-pertanyaan berikut:
Notes :
Sahabat Data DQLab dapat membagikan jawaban pada bagian ini melalui instagram dan tag
ke akun @dqlab
lapply(cov_id_update,names)
cov_id_update$penambahan$tanggal
cov_id_update$penambahan$jumlah_sembuh
cov_id_update$penambahan$jumlah_meninggal
cov_id_update$total$jumlah_positif
cov_id_update$total$jumlah_meninggal
COVID-19 Di Sekitar
Apa Kabar Jawa Barat?
Anda telah berhasil menjawab pertanyaan mengenai kondisi COVID-19 di Indonesia dengan
menggunakan data yang langsung diambil menggunakan API. Namun bagaimana jika Anda
ingin berfokus dengan data COVID-19 di provinsi tempat menetap saat ini?
covid19.go.id menyediakan data kasus COVID-19 tingkat provinsi di alamat API yang berbeda.
Sebagai contoh data mengenai COVID-19 Jawa Barat, tempat tinggal saya sekarang, tersedia
di https://data.covid19.go.id/public/api/prov_detail_JAWA_BARAT.json dan dapat diakses
menggunakan baris kode berikut:
resp_jabar <-
GET("https://data.covid19.go.id/public/api/prov_detail_JAWA_BARAT.json")
cov_jabar_raw <- content(resp_jabar, as = "parsed", simplifyVector = TRUE)
library(httr)
names(cov_jabar_raw)
cov_jabar_raw$kasus_total
cov_jabar_raw$meninggal_persen
cov_jabar_raw$sembuh_persen
str(cov_jabar)
head(cov_jabar)
Menjinakkan Data
Setelah mengekstrak dan mengamati cov_jabar, Anda menemukan beberapa kejanggalan
pada data tersebut. Diantaranya adalah kejanggalan data pada kolom tanggal dan format
penulisan kolom yang tidak konsisten. Sekarang Anda akan mencoba melakukan beberapa
tahapan untuk menjinakan data tersebut sehingga dapat diolah dan dianalisis dengan lebih
mudah.
Sebelum itu, silakan Anda aktifkan paket dplyr yang akan dipergunakan untuk melakukan
pengolahan data.
Ada beberapa tahapan yang akan Anda lakukan untuk menjinakan data cov_jabar, yaitu:
new_cov_jabar <-
cov_jabar %>%
select(-contains("DIRAWAT_OR_ISOLASI")) %>%
select(-starts_with("AKUMULASI")) %>%
rename(
kasus_baru = KASUS,
meninggal = MENINGGAL,
sembuh = SEMBUH
) %>%
mutate(
tanggal = as.Date(tanggal)
str(new_cov_jabar)
Berdasarkan templat tersebut, komponen utama untuk membuat visualisasi antara lain
adalah tabel data, kolom data, serta bentuk geometri untuk mempresentasikan data.
Sebagai contoh untuk membuat scatter-plot yang diperlukan adalah bentuk geometri titik
(geom_col()), line-chart memerlukan geometri garis (geom_line()), sedangkan bar-
chart memerlukan bentuk geometri batang atau kolom (geom_bar() atau geom_col()).
Lengkapi baris kode berikut untuk membuat bar-chart jumlah kasus baru harian COVID-19 di
Jawa Barat menggunakan data new_cov_jabar! Pergunakan kolom “tanggal” sebagai
sumbu-x.
Karena kita masih terhubung dengan data COVID19
melalui https://data.covid19.go.id/public/api/update.json tentunya absica grafik yang
muncul akan menunjukkan ke waktu di mana kamu menjalankan project ini.
Misalnya, kondisi COVID19 di awal Juli 2021 akan diperlihatkan seperti berikut:
library(hrbrthemes)
geom_col()
Hasil dari potongan coding di atas adalah sebagai berikut (perlu diingat ini adalah kondisi di
bulan Juli 2020)
Untuk bulan Juli 2021 bagaimana ya? Kondisi klaster secapa bandung ditunjukkan oleh
segimpat biru.
library(hrbrthemes)
geom_col(fill="salmon") +
labs(
x= NULL,
y= "Jumlah kasus",
subtitle = "Terjadi pelonjakan kasus di awal bulan juli akibat klaster Secapa AD Bandung",
)+
theme_ipsum(
base_size = 13,
plot_title_size = 21,
grid = "Y",
ticks = TRUE
)+
theme(plot.title.position = "plot")
Setelah lebih dari setahun, yaitu kondisi sembuh di awal Juli 2021 akan diperlihatkan seperti
berikut
library(hrbrthemes)
geom_col(fill="olivedrab2") +
labs(
x = NULL,
y = "Jumlah kasus",
)+
theme_ipsum(
base_size = 13,
plot_title_size = 21,
grid = "Y",
ticks = TRUE
)+
theme(plot.title.position = "plot")
Setelah lebih dari setahun pandemi COVID19 (hingga Juli 2021) terlihat kasus kematian
seperti berikut:
Bagaimana menurut Anda kondisi pandemi COVID ini berdasarkan data berikut dengan
visualisasi yang telah dikerjakan?
library(ggplot2)
library(hrbrthemes)
geom_col(fill = "darkslategray4") +
labs(
x = NULL,
y = "Jumlah kasus",
)+
theme_ipsum(
base_size = 13,
plot_title_size = 21,
grid = "Y",
ticks = TRUE
)+
theme(plot.title.position = "plot")
Menggali Lebih Dalam
Apakah Pekan ini Lebih Baik?
Setelah mengamati grafik perkembangan kasus Anda menyadari bahwa terjadi fluktuasi
pertambahan kasus harian. Dilandasi hal tersebut Anda kemudian ingin mencoba mengamati
bagaimana perkembangan kasus dalam rentang waktu pekanan. Bagaimanakah caranya?
Anda dapat dengan mudah bekerja dengan data tanggal apabila menggunakan
paket lubridate. Adapun yang akan digunakan untuk mengekstrak informasi pekan dalam
satu tahun adalah fungsi week().
Lengkapilah baris kode berikut untuk menghitung pertambahan kasus pekanan dan
simpanlah hasilnya sebagai cov_jabar_pekanan! Anda juga diminta untuk menggunakan
fungsi glimpse() dari dplyr untuk melakukan inspeksi data.
library(dplyr)
library(lubridate)
count(
tahun = year(tanggal),
pekan_ke = week(tanggal),
wt = kasus_baru,
name = "jumlah"
glimpse(cov_jabar_pekanan)
Menjawab Pertanyaan
Pertanyaan baru muncul di benak Anda setelah melakukan inspeksi terhadap
data cov_jabar_pekanan tersebut: “Apakah pekan ini lebih baik dari pekan kemarin?”.
Demi menjawab hal tersebut Anda melakukan kalkulasi sederhana dengan tahapan berikut:
Membuat kolom baru yang berisi jumlah kasus baru dalam satu pekan sebelumnya.
Kolom ini diberi nama “jumlah_pekanlalu”.
Mengganti nilai NA pada kolom “jumlah_pekanlalu” dengan nilai 0
Melakukan komparasi antara kolom “jumlah” dengan kolom “jumlah_pekanlalu”.
Hasil komparasi ini disimpan dalam kolom baru dengan nama “lebih_baik”, isinya
adalah TRUE apabila jumlah kasus baru pekan ini lebih rendah dibandingkan jumlah
kasus pekan lalu
Lengkapilah baris kode berikut untuk mengerjakan tahapan yang telah Anda rencanakan!
Anda akan menggunakan fungsi lag() dari dplyr untuk membuat kolom
“jumlah_pekanlalu”. Perhatikan bahwa disini fungsi tersebut dituliskan
sebagai dplyr::lag() untuk menghindari konflik dengan fungsi lag() dari paket stats.
Inspeksi hasil pekerjaan Anda dengan menggunakan fungsi glimpse()!
library(dplyr)
cov_jabar_pekanan <-
cov_jabar_pekanan %>%
mutate(
glimpse(cov_jabar_pekanan)
Adapun hasil yang diharapkan adalah sebagai berikut (untuk pekan ke-9 s/d 29 tahun
2020).
library(ggplot2)
library(hrbrthemes)
geom_col(show.legend = FALSE) +
labs(
x = NULL,
y = "Jumlah kasus",
subtitle = "Kolom hijau menunjukan penambahan kasus baru lebih sedikit dibandingkan satu pekan
sebelumnya",
)+
theme_ipsum(
base_size = 13,
plot_title_size = 21,
grid = "Y",
ticks = TRUE
)+
theme(plot.title.position = "plot")
cov_jabar_akumulasi <-
new_cov_jabar %>%
transmute(
tanggal,
akumulasi_sembuh = cumsum(sembuh),
akumulasi_meninggal = cumsum(meninggal)
tail(cov_jabar_akumulasi)
Kesimpulan apa yang dapat Anda tarik dari grafik tersebut?
library(ggplot2)
geom_line()
Transformasi Data
Anda akan menggunakan fungsi gather() dari paket tidyr untuk mentransformasi
data cov_jabar_akumulasi. Data tersebut akan dirubah dari yang semula
berformat wide menjadi format long. AKtifkanlah paket tidyr terlebih dahulu dan
lengkapilah baris kode berikut untuk melakukan pivot data. Simpan hasil transformasi data
tersebut sebagai cov_jabar_akumulasi_pivot! Perhatikan hasil dari fungsi dim() sebelum
dan setelah Anda melakukan transformasi data.
library(dplyr)
library(tidyr)
dim(cov_jabar_akumulasi)
cov_jabar_akumulasi_pivot <-
cov_jabar_akumulasi %>%
gather(
key = "kategori",
value = "jumlah",
-tanggal
) %>%
mutate(
dim(cov_jabar_akumulasi_pivot)
glimpse(cov_jabar_akumulasi_pivot)
pivot_longer()
Semenjak tidyr versi 1.0.0, Anda disarankan untuk menggunakan fungsi pivot_longer() sebagai pengganti gather() dan pivot_wider() sebagai pengganti spread() . pivot_longer() dan pivot_wider() memiliki
fitur yang lebih lengkap dibandingkan gather() dan spread() . Proses transformasi cov_jabar_akumulasi menjadi cov_jabar_akumulasi_pivot dapat dikerjakan dengan menggunakan pivot_longer() sebagai
berikut:
Anda dapat mencoba mempraktekkan potongan coding tersebut pada R Studio pada desktop masing-masing dan apakah Anda menemukan perbedaan signifikan antara baris kode di atas dan baris kode sebelumnya
Next >
Tahap Terakhir
Anda hampir selesai! Pada tahap terakhir ini Anda cukup salin dan jalankan baris kode
berikut di konsol untuk membuat grafik komparasi antara akumulasi kasus aktif, kasus
sembuh dan kasus meninggal:
library(ggplot2)
library(hrbrthemes)
geom_line(size = 0.9) +
scale_colour_manual(
values = c(
"aktif" = "salmon",
"meninggal" = "darkslategray4",
"sembuh" = "olivedrab2"
),
)+
labs(
x = NULL,
colour = NULL,
)+
theme_ipsum(
base_size = 13,
plot_title_size = 21,
grid = "Y",
ticks = TRUE
)+
theme(
legend.position = "top"
)
Penutup
Kesimpulan dan Komentar
Selamat Anda telah menyelesaikan proyek analisis COVID-19 ini! Anda telah berhasil
melakukan impor data melalui API, melakukan transformasi data, serta membuat visualisasi
untuk mengkomunikasikan hasil analisis data tentang COVID-19.
Anda dipersilakan untuk selanjutnya mengembangkan analisis dengan cara mengambil studi
kasus provinsi lain atau bahkan melakukan komparasi antar provinsi. Anda dapat
menggunakan skrip dasar yang tersedia pada tautan ini untuk memulai analisis. Dengan
menggunakan studi kasus provinsi pilihan Anda, dapatkah Anda menjawab dua tantangan
ini:
Apakah jumlah kasus di pekan ini lebih rendah dibandingkan pekan kemarin dan dua
pekan kemarin secara berturut-turut? Buatlah visualisasinya!
Salah satu metrik yang dapat dihitung untuk mengamati persebaran COVID-19 di
masyarakat adalah ‘Seventh-Day Amplification Factor’ (silakan baca ini dan ini).
Dapatkah Anda menghitung metrik tersebut?
Silakan bagikan hasil temuan Anda di LinkedIn atau media sosial dengan tag akun DQLab
dan saya ya! Semoga Anda tetap sehat, waspada dan tetap tenang dalam menghadapi
pandemi COVID-19. Selamat dan sukses selalu!
Next >
Oleh karena itu, dalam tahap pengembangan produk pangan dan tahap kontrol kualitas di
industri pangan acapkali diterapkan metodologi ilmu sensoris. Sesederhana saat menyeduh
teh/kopi atau memasakan makanan, tentu Anda harus mencicipinya terlebih dahulu kan?
Menurut Anda, apa yang akan terjadi jika tidak ada riset sensoris dalam pengembangan
produk pangan?
Next >
Bagaimana, sudah mulai mendapatkan gambaran mengenai apa itu ilmu sensoris?
Jika belum, silakan anda simak video pada chapter setelah ini ya! Setelah selesai menonton
videonya, kita akan lanjut ke tahap berikutnya.
Kategori Riset Sensoris
Next >
Cokelat
Mengenal Data - Part 1
Setelah mempelajari sedikit teori mengenai ilmu sensoris, sekarang mari kita belajar sedikit
lebih dalam mengenai analisis data riset sensoris. Anda akan diajak melakukan analisis data
untuk mempelajari karakteristik sensoris produk cokelat komersial.
Riset produk cokelat tersebut dilakukan dengan menggunakan metode Quantitative
Descriptive Analysis (QDA). Masih ingatkah Anda metode QDA termasuk dalam kategori riset
sensoris apa?
Data hasil riset sensoris tersebut tersedia sebagai “https://storage.googleapis.com/dqlab-
dataset/chocolates.csv". Silakan Anda impor berkas tersebut sebagai chocolates dengan
menggunakan fungsi read_csv() dari paket readr. Selain itu, aturlah sehingga kolom
panelist, session, rank, dan product dibaca sebagai factor dengan menggunakan
fungsi col_factor(). Khusus untuk kolom product, juga dilakukan pengaturan urutan level
faktor.
library(readr)
chocolates <-
read_csv(
"https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/chocolates.csv",
col_types = cols(
panelist = col_factor(),
session = col_factor(),
rank = col_factor(),
product = col_factor(levels = paste0("choc", 1:6)),
.default = col_integer()
Chocolates
library(skimr)
skim(chocolates)
chocolates %>%
summarise(
sample = toString(levels(product)),
n_sample = n_distinct(product),
n_panelist = n_distinct(panelist)
)
n_sample <- 6
n_panelist <- 29
atribut_sensoris
library(skimr)
library(dplyr)
chocolates %>%
select(atribut_sensoris) %>%
skim_without_charts()
Dari Satu Sisi - Part 1
Selamat Anda telah berhasil melakukan eksplorasi data! Apakah sekarang Anda menjadi
lebih mengerti mengenai data yang akan dianalisis? Saya harap jawabannya adalah “Ya,
sekarang saya siap untuk menganalisis data tersebut!”.
Dalam analisis sensoris data uji deskriptif, fokus pertama yang dilakukan adalah inspeksi
atribut sensoris satu per satu untuk mengungkapkan karakteristik produk. Analisis statistik
yang akan dilakukan adalah uji univariat. Dalam metode QDA, uji univariat yang umumnya
digunakan andalah analisis ragam atau biasa disebut ANOVA (Analysis of Variance). Hal
tersebut dilakukan salah satunya karena data yang didapatkan dari metode riset sensoris
QDA adalah berjenis rasio.
Sekarang Anda akan melakukan inspeksi atribut sensoris rasa pahit (bitterness) dari produk
cokelat yang telah dievaluasi oleh panelis. Model yang akan digunakan adalah model lengkap
dengan mempertimbangkan efek dari sampel, panelis, sesi pengujian, dan urutan sampel
dalam pengujian. Pergunakanlah fungsi aov() untuk membuat model dan simpanlah
sebagai model_bitterness!
model_bitterness <- aov(bitterness ~ product + panelist + session + panelist:product + panelist:session +
product:session + rank, data = chocolates)
model_bitterness
Keluaran dari baris kode tersebut tidak akan saya bahas lebih jauh. Sebaliknya, saya akan
menawarkan alternatif lain yang lebih mudah dilakukan tanpa harus mengubah konfigurasi
jenis kontras di R terlebih dahulu. Cara yang lebih mudah adalah dengan menggunakan
fungsi AovSum() dari paket FactoMineR. Fungsi tersebut secara otomatis akan mengatur
konfigurasi jenis kontras yang digunakan dalam analisis.
Jalankanlah AovSum() pada model_bitterness dan simpanlah rasilnya
sebagai res_bitterness! Kemudian bandingkanlah
antara anova(model_bitterness) dengan res_bitterness$Ftest.
library(FactoMineR)
anova(model_bitterness)
res_bitterness$Ftest
Dari hasil keluaran tersebut Anda menemukan bahwa angka koefisien dari choc2 adalah 0,34
(dibulatkan). Angka tersebut mengindikasikan bahwa rerata skor rasa pahit choc2 adalah
0,34 poin lebih tinggi dibandingkan dengan rasa pahit ‘rata-rata’ cokelat secara keseluruhan.
Berdasarkan keluaran tersebut, selanjutnya dapatkah Anda mengurutkan sampel produk
cokelat dari yang paling pahit hingga paling tidak pahit?
res_bitterness$Ttest[1:7, 1:2]
library(agricolae)
posthoc_bitterness <- HSD.test(model_bitterness, trt = "product")
posthoc_bitterness$groups
library(agricolae)
posthoc_bitterness$groups
Sekarang dapatkah Anda melakukan hal yang serupa untuk 13 atribut sensoris lainnya?
library(dplyr)
library(corrplot)
select(atribut_sensoris) %>%
cor() %>%
corrplot(
type = "upper",
method = "square",
diag = FALSE,
addgrid.col = FALSE,
order = "FPC",
tl.col = "gray30",
tl.srt = 30
)
chocolates2
Visualisasi dari angka korelasi yang berhasil Anda buat menunjukan bahwa terdapat
hubungan positif atau negatif antar atribut sensoris yang dirasakan oleh panelis. Sebagai
contoh, rasa pahit dirasakan berbanding terbalik dengan rasa manis dan rasa susu, serta
berbading lurus dengan aroma cokelat dan rasa asam. Atau misalnya rasa sepat yang
dirasakan berbanding lurus dengan rasa asam dan juga rasa pahit. Apakah ada korelasi
menarik lain yang Anda temukan?
Selain menggunakan matriks korelasi, interaksi dan asosiasi antar atribut sensoris tersebut
selanjutnya juga dapat direpresentasikan ke dalam sebuah peta persepsi (perceptual map)
atau ruang sensoris (sensory space). Peta persepsi atau ruang persepsi tersebut selanjutnya
dapat digunakan untuk memetakan produk berdasarkan karakter sensoris yang holistik. Hal
tersebut adalah tahap yang akan Anda lak
chocolates_adjmean
dim(chocolates_adjmean)
Tak Cukup Satu Sisi - Part 5
Setelah berhasil mengimpor data chocolates_adjmean, sekarang Anda diminta untuk
menjalankan fungsi PCA() dari pakt FactoMineR. Aturlah argumen graph menggunakan
nilai FALSE dan simpan hasilnya sebagai chocolates_pca. Selain itu ekstraklah
elemen eig dari chocolates_pca. Apakah yang Anda temukan?
library(FactoMineR)
names(chocolates_pca)
chocolates_pca$eig
library(factoextra)
Grafik tersebut menunjukan bahwa dimensi pertama dari peta persepsi melakukan separasi
antara produk yang memiliki rasa asam, rasa sepat, rasa pahit, dan cokelat terhadap produk
yang memiliki rasa susu, rasa vanilla, rasa karamel, dan rasa manis yang tinggi. Selain itu
dimensi pertama dan kedua juga memisahkan antara produk cokelat yang memiliki tekstur
renyah dengan produk cokelat yang memiliki tekstur lengket dan mudah meleleh.
library(factoextra)
"sticky"
"crunchy"
library(factoextra)
fviz_pca_biplot(chocolates_pca, repel = TRUE, title = "Peta Persepsi Produk Cokelat
Komersial")
1. specify()
2. analyse()
3. visualise()
Konsistensi
Di sensehubr, Anda dapat menggunakan fungsi specify() untuk memberitahukan apa
metode riset sensoris digunakan serta informasi-informasi penting terkait riset yang terdapat
pada data. Informasi yang dapat dimasukan adalah mengenai nama metode riset sensoris,
kolom panelis, kolom sampel, kolom sesi pengujian, kolom urutan penyajian sampel, dan
nama-nama kolom atribut sensoris. Perhatikanlah contoh berikut!
library(sensehubr)
chocolates_qda <-
chocolates %>%
specify(
sensory_method = "QDA",
panelist = panelist,
product = product,
session = session,
pres_order = rank,
attribute = cocoa_a:granular
)
chocolates_qda
## # A sensory table: <348 x 18>
## # Sensory method: Quantitative Descriptive Analysis
## # Panelist: panelist <29 subjects>
## # Product: product <6 items>
## # Attribute: cocoa_a, milk_a, cocoa_f, milk_f...<14 lexicons>
## # Hedonic: None
## panelist product session rank cocoa_a milk_a cocoa_f milk_f caramel vanilla
##
## 1 id_001 choc6 sessio… orde… 7 6 6 5 5 3
## 2 id_001 choc3 sessio… orde… 6 7 2 7 8 4
## 3 id_001 choc2 sessio… orde… 8 6 5 4 7 4
## 4 id_001 choc1 sessio… orde… 7 8 8 3 3 2
## 5 id_001 choc4 sessio… orde… 8 5 4 4 4 4
## 6 id_001 choc5 sessio… orde… 7 5 3 5 6 2
## 7 id_002 choc4 sessio… orde… 6 1 8 1 0 0
## 8 id_002 choc3 sessio… orde… 4 2 3 4 0 0
## 9 id_002 choc6 sessio… orde… 5 1 8 1 0 0
## 10 id_002 choc2 sessio… orde… 5 2 8 1 0 0
## # … with 338 more rows, and 8 more variables: sweetness , acidity ,
## # bitterness , astringency , crunchy , melting ,
## # sticky , granular
Tugas
Berdasarkan metadata dari keluaran chocolates_qda yang ditunjukan, informasi mengenai
riset sensoris apa saja yang dapat Anda temukan? Jawablah dengan cara
memberikan TRUE atau FALSE!
metode_riset <- TRUE
chocolates_qda_local <-
chocolates_qda %>%
analyse(choice = "local")
chocolates_qda_local
## # Local analysis:
## # Sensory method: Quantitative Descriptive Analysis
## # Analytical method: Analysis of variance
## # Model: Attribute ~ Product + Panelist + Session +
## # PanelistXProduct + PanelistXSession + ProductXSession + Presentation Order
## attribute statistic p.value choc1 choc2 choc3 choc4 choc5 choc6
##
## 1 milk_f 130. 7.83e-50 1.57 2.38 7.71 2.59 3.12 3.36
## 2 cocoa_f 72.1 1.99e-36 8.07 6.91 3.38 6.69 6.79 6.22
## 3 bitterness 68.0 3.40e-35 7.07 4.95 1.40 5.19 4.88 4.19
## 4 crunchy 63.0 1.24e-33 5.97 7.71 2.98 6.10 6.64 7.33
## 5 caramel 54.1 1.30e-30 1.67 2.78 6.33 2.67 3.41 3.26
## 6 sweetness 52.9 3.66e-30 3.14 4.62 7.60 4.29 5.22 5.62
## 7 melting 29.5 3.79e-20 4.74 4.33 7.31 4.38 4.74 4.21
## 8 astringency 28.6 1.11e-19 4.76 3.16 1.21 3.69 3.10 2.76
## 9 acidity 23.8 4.20e-17 4.66 3.14 1.57 3.93 3.09 2.67
## 10 vanilla 22.1 3.69e-16 1.10 1.81 3.67 2.12 1.79 1.91
## 11 cocoa_a 12.5 5.46e-10 7.09 6.55 4.67 6.26 6.79 6.36
## 12 milk_a 12.2 9.16e-10 3.59 4 6.05 4.10 4.17 4.57
## 13 granular 8.54 4.76e- 7 3.45 3.16 1.60 3.55 3.07 3.17
## 14 sticky 6.08 4.14e- 5 3.76 3.83 5.03 4.10 3.22 3.93
Tugas
Berdasarkan keluaran dari chocolates_qda_local tersebut, uji statistik apakah yang
digunakan dalam analisis lokal chocolates_qda? Dapatkah Anda memberikan komentar
mengenai hasil yang didapatkan?
"Cochran's Q test" <- FALSE
visualise(chocolates_qda_local)
Tugas
Apakah nama grafik yang Anda dapatkan setelah menjalankan kode tersebut?
"Dotplot" <- FALSE
chocolates_qda_global <-
chocolates_qda %>%
analyse(choice = "global")
chocolates_qda_global
## # Description of: Eigenvalue
## # Number of dimension: 5
## dimension eigenvalue pct_variance pct_cum_variance
##
## 1 1 12.4 88.8 88.8
## 2 2 1.06 7.58 96.4
## 3 3 0.373 2.66 99.0
## 4 4 0.0957 0.684 99.7
## 5 5 0.0406 0.290 100.
## #
## # Description of: Product <6 items>
## # Dimension: Dim 1 x 2
## product dim1 dim2 quality contribution
##
## 1 choc3 7.48 0.655 1.00 69.6
## 2 choc1 -3.76 1.62 0.987 20.7
## 3 choc2 -1.37 -0.780 0.882 3.06
## 4 choc4 -1.31 0.627 0.693 2.61
## 5 choc5 -0.958 -0.874 0.577 2.08
## 6 choc6 -0.0829 -1.25 0.831 1.93
## #
## # Description of: Sensory attribute <14 lexicons>
## # Dimension: Dim 1 x 2
## attribute dim1 dim2 quality contribution
##
## 1 astringency -0.942 0.333 0.999 7.40
## 2 bitterness -0.973 0.217 0.994 7.37
## 3 cocoa_f -0.996 0.0427 0.993 7.36
## 4 milk_f 0.996 0.0353 0.992 7.36
## 5 acidity -0.900 0.427 0.992 7.35
## 6 sweetness 0.953 -0.286 0.990 7.34
## 7 milk_a 0.994 -0.0250 0.989 7.33
## 8 caramel 0.990 -0.0768 0.985 7.30
## 9 crunchy -0.790 -0.581 0.962 7.13
## 10 cocoa_a -0.973 -0.110 0.959 7.11
## 11 vanilla 0.978 0.0322 0.957 7.10
## 12 melting 0.893 0.368 0.934 6.92
## 13 granular -0.960 -0.0597 0.925 6.86
## 14 sticky 0.826 0.372 0.820 6.08
Tugas
Ada berapa jumlah principal component/dimension yang didapatkan berdasarkan keluaran
dari chocolates_qda_global tersebut?
Sampai Disini?
Penutupan
Selamat Anda telah berhasil menyelesaikan modul “A walk into sensory science” ini! Saya
sungguh senang dan berbangga karena mendapatkan kesempatan untuk memperkenalkan
tentang ilmu sensoris kepada Anda. Apakah Anda juga merasa senang setelah sedikit
berkenalan dengan bidang keilmuan ini?
Apakah cukup sampai disini mengenai analisis ilmu sensoris? Tentu tidak! Ada banyak
analisis lainnya yang dapat dilakukan pada data hasil riset sensoris. Sebagai contoh, Anda
dapat melakukan analisis klaster pada hasil uji multivariat PCA untuk mengelompokan
produk berdasarkan karaktristik sensoris yang mereka miliki. Selain itu masih banyak
metode riset sensoris yang belum dibahas dalah modul ini, contohnya adalah kelompok
besar uji diskriminatif dan afektif yang memiliki berbagai variasi metodologi di dalamnya.
QDA pun hanya merupakan salah satu dari sekian banyak metode riset sensoris deksriptif
yang tersedia.
Mungkin terbesit di benak Anda apakah ilmu sensoris dapat digunakan untuk mengoptimasi
produk agar dapat lebih disukai oleh konsumen? Bagaimanakan penggunaan riset sensoris
untuk memperbaiki karakteristik produk? Dapatkah memperkirakan produk baru yang Anda
kembangkan akan diterima dengan baik oleh konsumen? Mungkin itu akan kita bahas pada
kesempatan lainnya, ya!
Salam hangat,
Muhammad Aswan Syahputra