Anda di halaman 1dari 432

A.

Introduction to Data Science with R

1. Data Scientist dan R

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.

2. Apa dan kenapa R?


R adalah nama sebuah bahasa pemrograman sekaligus software untuk pengolahan
data dan grafik. R sangat popular saat ini karena tiga hal berikut:
 Banyak pilihan pengolahan data dengan jumlah fitur yang sangat komplit -
dari grafik sampai machine learning.
 Lebih cepat dipelajari dan dijalankan untuk mengolah data dibandingkan
dengan bahasa lain. 
 R bersifat gratis dan open source yang artinya, tidak perlu biaya lisensi yang
biasanya sangat mahal untuk software pengolahan data.

3. Perusahaan mana yang sudah menggunakan R


"Tidak ada asap tanpa api", demikian suatu peribahasa yang menyatakan tidak ada
rumor tanpa ada fakta yang menyertai. R sedemikian populer juga disebabkan
karena digunakan perusahaan-perusahaan besar dunia.
Beberapa diantaranya adalah AirBnB untuk data science, Microsoft untuk
menambahkan fungsionalitas di produk-produknya, Uber untuk analisa statistik,
Facebook untuk behavior analysis, dan lain-lain

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

Comment merupakan teks untuk menambahkan keterangan pada code kita,


sehingga kita akan ingat apa yang dilakukan ketika membuka kembali code
tersebut. Comment tidak dianggap sebagai code yang bisa dieksekusiPada R
penggunaan comment adalah dengan mengawali suatu teks dengan tanda '#'.

Berikut ini contoh penggunaan comment

10 + 7 #Ini adalah baris komentar

atau seperti ini

#Ini adalah baris komentar.


10 + 7

Praktik Penggunaan Comment


Ketikkan suatu komentar setelah perhitungan matematika berikut ini pada Code Editor.

10 + 7 #Ini adalah baris komentar

Cobalah dijalankan dengan Run Code, dan jika lancar, maka Anda akan mendapatkan hasil
berikut.

> 10 + 7 #Ini adalah baris komentar


[1] 17

Dari proses ini kelihatan bahwa comment tidak diproses oleh R, jadi yang ditampilkan hanya
hasil perhitungan matematika. 

10 + 7 #Ini adalah baris komentar

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.

c(5, 10, 20)

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)

Mari kita praktekkan pada bagian berikutnya.


Praktek Penggunaan Vector - Bagian Satu
Ketikkan perintah c(3, 10, 15) pada Code Editor.

c(3, 10, 15)

Klik tombol Run Code dan perhiatikan output yang dihasilkan pada bagian Console sebagai


berikut.

> c(3, 10, 15)


[1] 3 10 15

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 (3, 10, 15)

9. Praktek Penggunaan Vector - Bagian Dua


Selain mengetikkan satu per satu data pada vector, kita juga bisa membuat rangkaian
data dengan operator titik dua. Cobalah ketik perintah berikut pada code editor.

c(1:5)

Klik tombol Run Code dan perhatikan output yang dihasilkan pada bagian Console sebagai


berikut.

> 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.

Min. 1st Qu. Median Mean 3rd Qu. Max.


1 2 3 3 4 5

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))

B. R Fundamental for Data Science

1. Let’s Get Started with R


Pendahuluan

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.

Jadi, apa itu R?

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.

Kenapa Data Scientist menggunakan R?


Apa sebenarnya yang membuat para data scientist tertarik belajar dan menggunakan R?
Ada empat alasan utama, yaitu:

 Lebih Mudah Dipelajari (Easier): R relatif lebih mudah dipelajari dibandingkan


dengan bahasa lain, seperti Java, C#, Javascript, dan lain-lain.

 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!

Code Pertama, Hello World!


Mari kita langsung praktek dengan halaman Live Code Editor ini:

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.

Terlihat perhitungan 1 + 5 menghasilkan angka 6. Nah, begitulah kira-kira R menjalankan


programnya.

"Hello World"
1+5

Teks, Angka dan Rumus Perhitungan


R merupakan bahasa yang berisi berbagai perintah, dari perintah melakukan perhitungan
matematika sederhana sampai menghasilkan grafik.
Perintah ini bisa sangat singkat, hanya berisi angka atau teks saja. Sebagai contoh, cobalah
ketik angka 9 dan teks "Budi" berikut pada Code Editor.

9
"Budi"

Klik tombol       dan pada panel Console akan muncul hasil berikut.

> 9
[1] 9
> "Budi"
[1] "Budi"

Catatan: Tanda > tidak perlu diketik

Elemen ekspresi Keterangan

> Prompt dari R, adalah tanda dari R untuk menerima input


perintah

9 Menampilkan angka 9

[1] Menunjukkan posisi urutan dari hasil output pertama.


Kebetulan disini output hanya ada satu item, yaitu angka 9
– jadi posisinya otomatis adalah 1.

"Budi" Menampikan teks Budi

[1] Menunjukkan posisi urutan dari hasil output kedua.


Kebetulan disini output hanya ada satu item, yaitu teks
"Budi" – jadi posisinya otomatis adalah 1.

Cobalah lanjutkan coding di atas dengan perintah.

9 * 3
Klik tombol       dan pada panel Console akan muncul hasil seperti berikut.

> 9 * 3
[1] 27

Berikut adalah penjelasan elemen dari output tersebut

Elemen ekspresi Keterangan

> Prompt dari R

9*3 Perintah untuk melakukan perkalian angka 9 dan 3

[1] Menunjukkan posisi urutan dari hasil output pertama.


Kebetulan disini output hanya ada satu item, yaitu angka
27 – jadi posisinya otomatis adalah 1.

27 Hasil output.

Tampilan hasil terakhir harusnya terlihat sebagai berikut. Klik tombol Submit Code dan
lanjutkan ke bagian berikutnya.
9

"Budi"

9*3

Menampilkan dengan Fungsi Print


Pada praktek sebelumnya kita bisa menampilkan teks dan angka dengan menuliskannya
secara langsung, tapi akan lebih baik apabila kita menggunakan fungsi bernama print.
Mari kita ketik dua perintah print berikut pada code editor.

print("Hello World")
print(3 + 4)

Jika dijalankan akan muncul hasil berikut.

> print("Hello World")


[1] "Hello World"
> print(3 + 4)
[1] 7

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)

Huruf Besar, Huruf Kecil dan Format Angka


Huruf besar dan huruf kecil sangat perlu diperhatikan pada bahasa pemograman R, atau
dengan kata lain R sangat case sensitive.  Sebagai contoh: "Budi" dan "BUDI" adalah dua teks
yang berbeda.
Selain itu, pada saat mengirimkan jawaban via live code editor di DQLab, kadang format
angka - termasuk di penulisan tanggal - sangat berpengaruh terhadap penilaian apakah
jawaban benar atau tidak. Sebagai contoh:

 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

Catatan: Tanda > tidak perlu diketik

Berikut adalah penjelasan hasil dari contoh di atas.

Elemen ekspresi Keterangan

> Prompt dari R

c(10:40) Ekspresi untuk membuat rangkaian angka 10 sampai


dengan 40

[1] Menunjukkan posisi urutan (indeks) dari angka pertama


dari rangkaian output di baris ke 1. Dalam hal ini angka
pertama, yaitu 10 - menempati posisi urutan ke-1 dari
keseluruhan output.

10 11 12 13 14 15 Hasil output angka yang ditampilkan pada baris pertama.


16 17 18 19 20 21
22 23 24 25 26 27
28 29 30 31 32 33
34
[26] Menunjukkan posisi indeks dari angka pertama dari
rangkaian output di baris ke 2. Dalam hal ini angka
pertama, yaitu 35 – menempati posisi urutan ke-26 dari
keseluruhan output.

35 36 37 38 39 40 Hasil output angka yang ditampilkan pada baris kedua.

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

santi_berat_kg <- 54.5

budi_berat_kg

santi_berat_kg
Jalankan keempat perintah di atas dengan mengklik   dan hasilnya adalah sebagai berikut.

> budi_berat_kg <- 68

> santi_berat_kg <- 54.5

> budi_berat_kg
[1] 68

> santi_berat_kg
[1] 54.5

Penjelasan Hasil

Elemen ekspresi Keterangan

budi_berat_kg <- 68 Memasukkan data berupa angka 68 ke dalam


variable bernama budi_berat_kg. Maksud
variable tersebut dinamakan demikian untuk
menyatakan bahwa angka yang dimasukkan
mewakili berat badan seorang bernama Budi
dalam satuan kilogram – atau singkatnya berat
Budi 68 kg.
Nilai dimasukkan dengan bantuan operator <-.
Operator ini disebut assignment operator.
Perhatikan bahwa perintah ini juga tidak
mengeluarkan output apapun di bawahnya.

santi_berat_kg <- 55 Ini sama tujuannya dengan perintah di atas,


memasukkan data berupa angka 55 ke dalam
variable bernama santi_berat_kg.
Informasi variable tersebut adalah berat Santi 55
kg.

budi_berat_kg Menampilkan isi data dari nama


variable budi_berat_kg.

[1] 68 Menampilkan angka 68 – yang merupakan isi dari


variable budi_berat_kg.

santi_berat_kg Menampilkan isi data dari nama


variable santi_berat_kg.

[1] 55 Menampilkan angka 55 – yang merupakan isi dari


variable santi_berat_kg.

Tugas
Lanjutkan penambahan code pada code editor dengan dua perintah berikut.

 Buat satu variable dengan nama pi dan isilah dengan nilai 3.14


 Tampilkan isi variable pi.

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 <- 68

> santi_berat_kg <- 54.5

> budi_berat_kg
[1] 68

> santi_berat_kg
[1] 54.5

> pi <- 3.14

> pi
[1] 3.14

budi_berat_kg <- 68

santi_berat_kg <- 54.5

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. 

2 + 2 #Ini adalah baris komentar

Ketik contoh tersebut dan jika berjalan dengan lancar maka Anda akan mendapatkan hasil
berikut.

> 2 + 2 #Ini adalah baris komentar


[1] 4

Catatan: Tanda > tidak perlu diketik.


Perhatikan bahwa comment "Ini adalah baris komentar" tidak dimengerti oleh R dan tidak
menghasilkan apapun. Hal yang berbeda dengan perhitungan "2 + 2" yang tetap
menghasilkan output angka 4.
2+2 #ini adalah komentar penutup

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:

 Mengolah dan menampilkan data dengan perintah print ataupun mengetikkan


langsung data tersebut.
 Melakukan perhitungan matematika.
 Memberikan komentar atau comment untuk memberi penjelasan pada code di R.
 Menyimpan angka, teks dan hasil perhitungan ke dalam variable - sehingga dapat
digunakan pada bagian code lain.
 Menjelaskan sifat R yang case sensitive - huruf besar dan huruf kecil adalah berbeda.
2. Vector, List and Data Frame
Pendahuluan
Dengan berbekal teori dan praktek sebelumnya, sekarang kita telah siap untuk
mengenal tipe data dan operasi data yang lebih berguna pada kasus nyata, misalkan untuk
dapat ditampilkan dengan bermacam komposisi grafik yang menarik.
Untuk mencapai hal ini kita perlu mengenal tiga tipe data yang paling sering digunakan di R,
yaitu vector, list dan data frame.
Kita akan belajar konsep dan praktek detil untuk mengenali semuanya dengan lebih baik.
Khusus untuk data frame akan dicontohkan dengan fungsi pembacaan file teks, sehingga
Anda akan mendapatkan pengalaman yang lebih nyata kenapa harus menggunakan tipe
data ini pada praktek sehari-hari.

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)

# Variable bernama angka dengan input berupa vector

angka <- c(4,5,6)

# Tampilkan isi variable angka dengan fungsi print

print (angka)

Deretan Nilai dengan Operator :


Operator : atau titik dua adalah operator yang digunakan untuk mempersingkat penulisan
dari nilai-nilai vector yang berurutan. Sebagai contoh, perintah c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
yang membentuk vector dengan angka 1 sampai dengan 10 dapat dipersingkat dengan
c(1:10).
Ketiklah empat perintah berikut pada code editor, dimana variable angka1 diisi
dengan vector dengan penulisan angka berurutan yang panjang. Dan variable angka2 diisi
dengan menggunakan operator :.

angka1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)


print(angka1)
angka2 <- c(1:10)
print(angka2)

Jalankan perintah tersebut, jika berhasil akan muncul tampilan sebagai berikut.

angka1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

> print(angka1)
[1] 1 2 3 4 5 6 7 8 9 10

> angka2 <- c(1: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)

angka2 <- c(1:10)

print (angka2)

Vector dengan Isi Teks


Selain angka, vector juga bisa diisi dengan teks. Cobalah ketik satu perintah pada code editor
untuk membuat vector yang isinya tiga nama orang dan disimpan
sebagai variable  nama_mahasiswa sebagai berikut. 

nama_mahasiswa <- c("Amira","Budi","Charlie")

Kemudian lanjutkan dengan perintah untuk menampilkan variable tersebut.

print(nama_mahasiswa)

Jika berhasil dijalankan dengan baik, kita akan memperoleh hasil seperti berikut.

> nama_mahasiswa <- c("Amira","Budi","Charlie")

> 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

nama_mahasiswa <- c("Amira","Budi","Charlie")

print(nama_mahasiswa)

Index dan Accessor pada Vector


Pada latihan sebelumnya kita sudah mengerti cara membuat vector untuk angka dan teks,
namun belum ditunjukkan cara untuk mengambil tiap nilai dari vector tersebut. Perhatikan
pada live code editor telah terisi code-code yang dapat Anda praktekkan sambil melihat
penjelasan di bawah ini.

 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.

angka <- c(20: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

Kita juga bisa mengambil urutan indeks dengan menggunakan accessor dengan format


kurung siku ganda sebagai berikut.

print(angka[[5]])

Jika berjalan dengan lancar, maka hasilnya tampak sebagai berikut.

> 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".

kode_prodi <- c("DKV","ILKOM","ICT")

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

angka <- c(20:30)

print(angka)

# Tampilkan isi variable angka pada posisi ke 3

print(angka[3])

# Tampilkan isi variable angka pada posisi ke 5

print(angka[[5]])

# Tampilkan isi variable angka pada posisi ke 4 s/d 6

print(angka[4:6])
# Buat vector teks dengan nama kode_prodi yang diisi sesuai petunjuk soal

kode_prodi <- c("DKV","ILKOM","ICT")

# Tampilkan isi indeks ketiga dari kode_prodi

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. 

nilai <- c(statistik = 89, fisika = 95, ilmukomunikasi = 100)

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

Perhatikan terdapat perbedaan tampilan output named vector ini dengan tampilan output


vector sebelumnya - yaitu sudah tidak ada awalan [1].
Nah, sekarang kita akan mengambil dan menampilkan nilai pada vector untuk nama "fisika". 

print(nilai["fisika"])

Ketikkan perintah tersebut di bawah comment "#Menampilkan isi dengan nama fisika" dan


jalankan. Hasil yang Anda dapatkan harusnya sebagai berikut.

> print(nilai["fisika"])
fisika
95

Bagaimana, cukup jelas?


Sebagai latihan sehingga Anda benar-benar menguasai bahan named vector ini, cobalah buat
variable named vector profil dengan input berikut:

 nama = "Budi"
 tempat_tinggal = "Jakarta"
 tingkat_pendidikan = "S1"

Kemudian tampilkan variable profil ini dengan menggunakan fungsi print.


#Membuat named vector dengan nama nilai

nilai <- c(statistik = 89, fisika = 95, ilmukomunikasi = 100)

#Menampilkan isi variable nilai

print(nilai)

#Menampilkan isi dengan nama fisika

print(nilai["fisika"])

#Buat variable profil sesuai permintaan soal

profil <- c(nama="Budi",tempat_tinggal="Jakarta",tingkat_pendidikan="S1")

#Tampilkan variable profil

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).

> list(2, "Budi", 4)


[[1]]
[1] 2
[[2]]
[1] "Budi"
[[3]]
[1] 4

Tugas

Buatlah variable dengan nama kota dengan isi berikut


nama_kota = "Makassar"
propinsi = "Sulawesi Selatan"
luas_km2 = 199.3
# List disimpan dalam variable dengan nama list_random

list_random <- list(2, "Budi", 4)

# Menampilkan isi list

list_random

# List disimpan dalam variable dengan nama dati2

dati2 <- list(nama = "Denpasar", propinsi = "Bali")

# Menampilkan isi list dati2

dati2
# Buat variable kota sesuai permintaan soal

kota <- list(nama_kota ="Makassar", propinsi ="Sulawesi Selatan", luas_km2 =199.3)

# Tampilkan isi variable list kota

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 <- list(2, "Budi", 4)

# Menampilkan index kedua dengan aksesor kurung siku tunggal

list_saya[2]

# Menampilkan index kedua dengan aksesor kurung siku ganda

list_saya[[2]]
# Menampilkan index kedua s/d ketiga

list_saya[2:3]

list_satu <- list(1, "Online", "TRUE")

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

 Buatlah vector terbaru bernama akreditasi dengan isi ("A","A","B","A","A")


 Buat satu data frame dengan nama info_mahasiswa yang terdiri dari dua vector dari
contoh ditambah dengan vector akreditasi.
 Tampilkan data frame info_mahasiswa.

#Membuat dua variable vector

fakultas <- c("Bisnis", "D3 Perhotelan", "ICT", "Ilmu Komunikasi", "Seni dan Desain")

jumlah_mahasiswa <- c(260, 28, 284, 465, 735)

#Membuat data frame dari kedua vector di atas

info_mahasiswa <- data.frame(fakultas, jumlah_mahasiswa)


#Melihat isi data frame

info_mahasiswa

#Buat vector baru sebagai representasi akreditasi

akreditasi <- c("A","A","B","A","A")

#Buat data frame dari ketiga vector di atas

info_mahasiswa <- data.frame(fakultas,jumlah_mahasiswa,akreditasi)

info_mahasiswa

Cara Akses Data Frame


Data frame memiliki banyak kolom dan bisa diakses dengan nama kolom yang digunakan.
Caranya adalah menggunakan accessor dengan tanda $ yang diikuti dengan nama kolom.
Contoh: info_mahasiswa$fakultas.
Panel code editor telah dilengkapi contoh code untuk membuat data frame untuk data
mahasiswa dan akses kolom jumlah_mahasiswa. Jalankan dengan tombol       untuk
melihat hasilnya.
Tugas
Tambahkan code untuk menampilkan kolom fakultas dari data
frame info_mahasiswa. Code yang sudah terdapat di code editor tidak boleh dihapus

Klik tombol   (submit) untuk mengirimkan code ke sistem DQLab dan melakukan
scoring apakah code Anda sudah benar atau tidak.

#Membuat tiga variable vector

fakultas <- c("Bisnis", "D3 Perhotelan", "ICT", "Ilmu Komunikasi", "Seni dan Desain")

jumlah_mahasiswa <- c(260, 28, 284, 465, 735)

akreditasi <- c("A","A","B","A","A")


#Membuat data frame dari kedua vector di atas

info_mahasiswa <- data.frame(fakultas, jumlah_mahasiswa, akreditasi)

#Menampilkan kolom jumlah_mahasiswa

info_mahasiswa$jumlah_mahasiswa

#Menampilkan kolom fakultas

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.

3. Chart and Graphic


Pendahuluan
Jika kita ingin eksplorasi dan menganalisa data lebih jauh, grafik adalah tipe tampilan yang
tidak bisa ditawar. Dan R memiliki fungsi yang kaya untuk menghasilkan grafik.
Bab ini akan berisi perkenalan singkat dan padat untuk menunjukkan kemampuan ini
dengan menggunakan package ggplot2. Dengan pendekatan yang bersifat demo, Anda
cukup mengikuti petunjuk sehingga bisa membayangan apa saja yang bisa Anda lakukan
dengan ggplot2.

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.

> gambar <- ggplot(info_mahasiswa, aes(x=fakultas, y=jumlah_mahasiswa,


fill=fakultas))
could not find function "ggplot"

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")

jumlah_mahasiswa <- c(260, 28, 284, 465, 735)

akreditasi <- c("A","A","B","A","A")


info_mahasiswa <- data.frame(fakultas, jumlah_mahasiswa, akreditasi)

info_mahasiswa

#Menggunakan package ggplot2

library("ggplot2")

#Membuat kanvas

gambar <- ggplot(info_mahasiswa, aes(x=fakultas, y=jumlah_mahasiswa, fill=fakultas))

gambar <- gambar + geom_bar(width=1, stat="identity")

gambar

Membuat Grafik Sebaran Mahasiswa (1)


Pada praktek kali ini, kita akan menghasilkan bar chart sederhana dengan menggunakan
variable data frame bernama info_mahasiswa yang kita hasilkan pada subbab "Vector, List
dan Data Frame". Variable ini masih bersifat statis atau hard code, artinya data frame ini
bukan berdasarkan pembacaan dari suatu file atau database.
Cara membuat grafik di R bisa menggunakan banyak cara, salah satunya dengan
library ggplot2 - dimana kita menggambar chart secara bertahap, yaitu dengan
konsep layering (lapisan demi lapisan).
Untuk lebih jelasnya, pada code editor telah terdapat code-code untuk menghasilkan
distribusi mahasiswa. Cobalah jalankan, dan jika lancar akan menghasilkan grafik berikut. 
Terlihat kalau mahasiswa di fakultas "Seni dan Desain" merupakan fakultas dengan jumlah
mahasiswa terbanyak, diikuti kemudian oleh fakultas "Ilmu Komunikasi", "ICT", "Bisnis" dan
"D3 Perhotelan". Dengan histogram ini, informasi lebih mudah dilihat dan dicerna
dibandingkan dengan angka bukan?
Bagaimana grafik ini dihasilkan di ggplot?  Seperti informasi sebelumnya, grafik ini digambar
lapis demi lapis. Dan lapisan pertama kita ibaratkan sebagai "kanvas" lukisan, dan untuk
membuat "kanvas" pada contoh di code editor, kita gunakan fungsi yang namanya ggplot. 

gambar <- ggplot(info_mahasiswa, aes(x=fakultas, y=jumlah_mahasiswa, fill=fakultas))

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 

gambar <- gambar + geom_bar(width=1, stat="identity")

Berikut adalah penjelasan lengkap dari code yang terdapat pada code editor.

Code Penjelasan

ggplot(info_mahasiswa, Perintah awal untuk membentuk objek grafik


aes(x=fakultas, ggplot2, terdiri dari:
y=jumlah_mahasiswa,
fill=fakultas))  info_mahasiswa: data frame yang kita
gunakan
 aes:  fungsi untuk mengambil data apa
saja
 x: kolom yang kita gunakan untuk grafik
sumbu x, dalam hal ini fakultas
 y: kolom nilai yang kita gunakan untuk
plot sumbu y, dalam hal ini
jumlah_mahasiswa
 fill: kolom mana yang akan kita gunakan
sebagai pembeda warna. Jika fill
dihilangkan maka grafik akan diisi warna
abu-abu saja.

+ Tanda plus, digunakan untuk menggabungkan


objek-objek ggplot2

geom_bar(width = 1, stat = Perintah untuk menambahkan bentuk geometri


"identity") bar chart, dengan parametre:

 width: ukuran lebar dari tiap bar chart,


disini
 stat: transformasi data yang perlu
dilakukan. Banyak sekali jenisnya, untuk
saat ini karena kita hanya ingin plot apa
adanya, kita gunakan identity. Untuk
lebih lengkapnya mengenai stat ini akan
dibahas di course "Data Visualization with
ggplot2 in R".

gambar Variable untuk menampung objek grafik.

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 

gambar <- gambar + ggtitle("Jumlah Mahasiswa per Fakultas")

Catatan: tambahkan code tersebut di bawah comment #Menambahkan judul grafik.


Jalankan code untuk memastikan terdapat tambahan judul pada chart seperti
potongan gambar berikut.

 Dengan cara yang sama di atas, cobalah tambahkan lagi di atas gambar dengan


perintah xlab("Nama Fakultas"). Ini agar caption pada sumbu X berubah dari
hanya "fakultas" menjadi "Nama Fakultas". 

gambar <- gambar + xlab("Nama Fakultas")

Catatan: tambahkan code tersebut di bawah comment #Menambahkan caption pada


sumbu x. Jalankan code untuk memastikan caption sumbu X sudah berubah seperti
pada potongan gambar 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.

#Membuat dua vector

fakultas <- c("Bisnis", "D3 Perhotelan", "ICT", "Ilmu Komunikasi", "Seni dan Desain")

jumlah_mahasiswa <- c(260, 28, 284, 465, 735)

akreditasi <- c("A","A","B","A","A")

#Buat data frame dari ketiga vector di atas

info_mahasiswa <- data.frame(fakultas, jumlah_mahasiswa, akreditasi)

info_mahasiswa

#Menggunakan package ggplot2

library(ggplot2)

#Membuat kanvas

gambar <- ggplot(info_mahasiswa, aes(x=fakultas, y=jumlah_mahasiswa,


fill=fakultas))

#Menambahkan objek bar chart, simpan kembali sebagai variable gambar

gambar <- gambar + geom_bar(width=1, stat="identity")

#Menambahkan judul grafik

gambar <- gambar + ggtitle("Jumlah Mahasiswa per Fakultas")


#Menambahkan caption pada sumbu x

gambar <- gambar + xlab("Nama Fakultas")

#Menambahkan caption pada sumbu y

gambar <- gambar + ylab ("Jumlah Mahasiswa")

#Menggambar grafik

gambar

Membaca File Excel


 
 
Banyak pengolahan data di R harus membaca dari file Excel. Pada contoh kali ini,  kita akan
menggunakan file yang berisi data jumlah mahasiswa per angkatan per tahun seperti pada
tampilan berikut.
File tersebut bernama mahasiswa.xlsx, dan akan kita baca dengan fungsi read.xlsx dari
package openxlsx dengan cara berikut.

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)

#Menggunakan package openxlsx

library(openxlsx)
#Membaca file mahasiswa.xlsx

mahasiswa <- read.xlsx("https://academy.dqlab.id/dataset/mahasiswa.xlsx",sheet = "Sheet 1")

#Menampilkan data

print(mahasiswa)

#Menampilkan kolom Prodi

print(mahasiswa$Prodi)

Membuat Grafik Sebaran Mahasiswa (2)


Setelah memiliki kemampuan membaca sumber data dari luar yaitu file Excel yang berisi
data jumlah mahasiswa, kita akan kembali menghasilkan grafik sebaran yang sudah kita
lakukan sebelumnya - tapi kali ini dengan hasil pembacaan tersebut.
Pada code editor telah diisi code-code untuk membaca file Excel dan menghasilkan grafik
batang. Cobalah jalankan, dan jika berhasil maka akan mendapatkan grafik batang yang
menunjukkan porsi jumlah mahasiswa per fakultas.
Lalu apa perbedaan praktek kita kali ini dengan subbab "Membuat Grafik Sebaran Mahasiswa
(1)"?
Berikut adalah daftar perbedaannya, dari  potongan code dan hasil.

Item Membuat Grafik Sebaran Membuat Grafik Sebaran Mahasiswa (2) Keterangan
Mahasiswa (1)

Sumber fakultas <- c("Bisnis", "D3 library(openxlsx) Pada subbab


Data Perhotelan", "ICT", "Ilmu "Membuat
Komunikasi", "Seni dan info_mahasiswa <- Grafik Sebaran
Desain") read.xlsx("https://storage.googleapis.com/dqlab- Mahasiswa (1)",
jumlah_mahasiswa <- c(260, dataset/mahasiswa.xlsx",sheet = "Sheet 1") variable data
28, 284, 465, 735) frame
akreditasi <- info_mahasiswa
c("A","A","B","A","A") dibuat secara
Item Membuat Grafik Sebaran Membuat Grafik Sebaran Mahasiswa (2) Keterangan
Mahasiswa (1)

info_mahasiswa <- manual.


data.frame(fakultas,
Sedangkan
jumlah_mahasiswa, akreditasi)
untuk subbab
info_mahasiswa
"Membuat
Grafik Sebaran
Mahasiswa (2)",
variable data
frame
info_mahasiswa
dibaca dari file
Excel.

Parameter gambar <- gambar <- ggplot(info_mahasiswa, Input untuk


pada ggplot(info_mahasiswa, aes(x=Fakultas, y=JUMLAH, fill=Fakultas)) parameter x, y
ggplot aes(x=fakultas, dan fill sedikit
y=jumlah_mahasiswa, berbeda
fill=fakultas)) menyesuaikan
dengan kolom
hasil pembacaan
dari file.

Hasil
Grafik

library(ggplot2)

#Menggunakan package openxlsx

library(openxlsx)

#Membaca file mahasiswa.xlsx

mahasiswa <- read.xlsx("https://academy.dqlab.id/dataset/mahasiswa.xlsx",sheet = "Sheet 1")


#Membuat kanvas

gambar <- ggplot(mahasiswa, aes(x=Fakultas, y=JUMLAH, fill=Fakultas))

#Menambahkan objek bar chart, simpan kembali sebagai variable gambar

gambar <- gambar + geom_bar(width=1, stat="identity")

#Menggambar grafik

Gambar

Trend Jumlah Mahasiswa dari Tahun ke Tahun


Grafik batang sebelumnya cukup baik, tapi informasi yang terkandung masih belum kita
ekplorasi lebih detil. Sebagai contoh, bagaimana melihat trend jumlah mahasiswa per
fakultas dari tahun ke tahun?
Subbab ini akan menunjukkan hal tersebut. Cobalah jalankan semua code yang telah
dilengkapi di code editor, jika berjalan dengan lancar maka akan mendapatkan hasil berikut.
Catatan: Code tidak akan diterangkan pada praktek kali ini, karena melibatkan teknik yang
akan kita bahas di course R lain yaitu "Data Preparation and Wrangling with R" dan "Data
Visualization with ggplot2 in R".

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)

#Membaca file mahasiswa.xlsx


mahasiswa <- read.xlsx("https://storage.googleapis.com/dqlab-dataset/mahasiswa.xlsx",sheet = "Sheet
1")

#Menghitung Jumlah Data by Fakultas


summarybyfakultas <- aggregate(x=mahasiswa$JUMLAH, by=list(Kategori=mahasiswa$Fakultas,
Tahun=mahasiswa$ANGKATAN), FUN=sum)
summarybyfakultas <- setNames(summarybyfakultas, c("fakultas","tahun", "jumlah_mahasiswa"))
summarybyfakultas

summarybyfakultas$tahun = as.factor(summarybyfakultas$tahun)

ggplot(summarybyfakultas, aes(x=fakultas, y=jumlah_mahasiswa)) +


geom_bar(stat = "identity", aes(fill = tahun), width=0.8, position = position_dodge(width=0.8)) +
theme_classic()

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")

#Menghitung Jumlah Data by Fakultas


summarybyfakultas <- aggregate(x=mahasiswa$JUMLAH, by=list(Kategori=mahasiswa$Fakultas),
FUN=sum)
summarybyfakultas <- setNames(summarybyfakultas, c("fakultas","jumlah_mahasiswa"))

piechart<- ggplot(summarybyfakultas, aes(x="", y=jumlah_mahasiswa, fill=fakultas))+ geom_bar(width = 1,


stat = "identity")
piechart <- piechart + coord_polar("y", start=0)
piechart <- piechart + ggtitle("Disribusi Mahasiswa per Fakultas")
piechart <- piechart + scale_fill_brewer(palette="Blues")+ theme_minimal()
piechart <- piechart + guides(fill=guide_legend(title="Fakultas"))
piechart <- piechart + ylab("Jumlah Mahasiswa")
piechart

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[summarybyfakultas$fakultas %in%c("ICT", "Ilmu Komunikasi"),]


Dimana summarybyfakultas$fakultas %in%c("ICT", "Ilmu Komunikasi") artinya
melakukan filter data yang ada di kolom fakultas dari data frame summarybyfakultas.
Sedangkan perintah lengkap summarybyfakultas[summarybyfakultas$fakultas %in
%c("ICT", "Ilmu Komunikasi"),] artinya mengambil data yang sudah terfilter untuk seluruh
kolom.
Dengan demikian, sampai sejauh ini Anda telah diberikan gambaran mengenai kemampuan
R dalam menghasilkan grafik dengan pengolahan data dari Excel. Ini tentunya bisa
berpotensi tinggi untuk membantu Anda sehari-hari.
Namun memang pada bab pengenalan ini kita tidak akan membahas lebih dalam bagaimana
grafik ini dapat dihasilkan dengan variasi yang lebih banyak, begitu juga pengolahan data
seperti filter - tapi di course selanjutnya yaitu "Data Preparation with R" dan "Data
Visualization with R".
library("ggplot2")
library("openxlsx")

#Membaca file mahasiswa.xlsx


mahasiswa <- read.xlsx("https://storage.googleapis.com/dqlab-dataset/mahasiswa.xlsx",sheet = "Sheet
1")

#Menghitung Jumlah Data by Fakultas


summarybyfakultas <- aggregate(x=mahasiswa$JUMLAH, by=list(Kategori=mahasiswa$Fakultas,
Tahun=mahasiswa$ANGKATAN), FUN=sum)
summarybyfakultas <- setNames(summarybyfakultas, c("fakultas","tahun", "jumlah_mahasiswa"))
summarybyfakultas

summarybyfakultas$tahun = as.factor(summarybyfakultas$tahun)
summarybyfakultas[summarybyfakultas$fakultas %in% c("ICT", "Ilmu Komunikasi"),]

ggplot(summarybyfakultas[summarybyfakultas$fakultas %in% c("ICT", "Ilmu Komunikasi"),],


aes(x=fakultas, y=jumlah_mahasiswa)) +
geom_bar(stat = "identity", aes(fill = tahun), width=0.8, position = position_dodge(width=0.8)) +
theme_classic()

Penutup
Dengan berakhirnya demo grafik terakhir, berakhir juga modul R Fundamental for Data
Science". Sepanjang kursus ini Anda sudah mendapatkan keterampilan R sebagai berikut:

 Mengerti apa dan kenapa R digunakan oleh para data scientist.


 Menguasai dasar bahasa R seperti penggunaan teks, angka, rumus, dan bagaimana
melihat error.
 Menguasai penggunaan tipe data fundamental R, yaitu list, vector dan data frame.
 Mengerti penggunaan package tambahan untuk membaca file Excel.
 Mengenali bagaimana grafik dihasilkan di R dengan menggunakan package bernama
ggplot2.

Perjalanan awal ini telah membekali Anda untuk menguasai fitur R lainnya seperti advanced
data visualization (dashboard dan map), machine learning, dan otomatisasi big data.

Data Preparation in Data Science using R

Apa itu Data Preparation atau Data


Wrangling?
Pendahuluan
"Data preparation accounts for about 80% of the work of data scientists"
Kutipan di atas diambil dari salah satu artikel blog online Forbes berdasarkan hasil survey
terhadap 80 orang data scientist yang dilakukan oleh salah satu provider data enrichment.
Selengkapnya dapat Anda lihat pada url berikut:
https://www.forbes.com/sites/gilpress/2016/03/23/data-preparation-most-time-consuming-
least-enjoyable-data-science-task-survey-says
Masih dari link yang sama, berikut adalah pie chart yang merepresentasikan porsi dari
pekerjaan data scientist. Proses data preparation di chart ini adalah Collecting data sets
(19%) dan Cleaning and organizing data (60%).
Dengan demikian, keterampilan untuk melakukan data preparation atau saat ini sering
disebut sebagai data wrangling adalah mutlak untuk seluruh data scientist dan data
engineer.
Lalu apa saja yang dilakukan di proses ini?
Data wrangling adalah proses membaca data dari berbagai sumber dan merubah isi dan
struktur sehingga dapat digunakan untuk analisa.
Data cleansing biasanya melibatkan isi yang perlu diubah karena kadang data dimasukkan
dari sistem yang berbeda.Bertolak belakang dengan anggapan bahwa dengan sistem, data
akan bersih dan standar. Pada kenyataannya, bisnis berkembang lebih cepat dibandingkan
dengan pembuatan sistem sehingga banyak design dirubah di tengah jalan untuk
mengakomodir hal ini, dan isi menjadi "berantakan". Penyebab utama lainnya tentunya
adalah sistem entri data yang manual.
Contoh yang paling sering adalah informasi pelanggan (customer). Di satu sistem namanya
boleh memasukkan gelar, dan di satu sistem tidak boleh… jadinya ada dua nama yang
serupa tapi tak sama sebagai berikut: "Agus Cahyono S.Kom." dan "Cahyono, Agus".
Struktur perlu dirubah karena berbagai alasan, salah satu yang paling penting adalah tiap
algoritma mensyaratkan struktur data yang berbeda dan optimal.
Sebagai contoh: transaksi penjualan untuk satu algoritma bisa menggunakan row-based
transaction. Sedangkan algoritma lain harus menggunakan sparse-matrix.
Dataset-dataset Yang Akan Digunakan
Untuk kepentingan penguasaan melalui praktek, sepanjang course ini kita akan bekerja
dengan beberapa dataset berikut:

 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 dan default type


Untuk menggunakan NA adalah sama dengan nilai konstanta lain, cukup mengetikkan NA.
Sebagai contoh, jika kita ketikkan NA di console maka akan muncul hasil berikut:

> 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

#Tampilkan type dari NA dengan function typeof


typeof(NA)

Menggunakan function is.na


Pada saat kita membandingkan nilai atomik biasanya kita menggunakan operator ==,
misalkan untuk periksa suatu variabel x yang bernilai 3 – yang sebelumnya kita juga telah
memasukkan angka yang sama – kita bisa melakukan hal berikut.

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

Hasil eksekusinya tidak akan menghasilkan TRUE, tapi tetap NA.


 
Pengecekan seperti ini tentunya tidak mungkin dilakukan jika kita menggunakan konstruksi
percabangan keputusan seperti if ataupun konstruksi perulangan seperti while.
Nah, untuk mengatasi hal ini R menggunakan function bernama is.na dengan input berupa
konstanta atau variabel. Mari kita ubah simbol == contoh di atas menggunakan function is.na
seperti berikut.

is.na(NA)

Kali ini hasil eksekusinya akan bernilai TRUE.

Variasi NA dan is.na


Seperti disebutkan sebelumnya, NA adalah merupakan nilai atomik dan konstanta, dan
awalnya merupakan representasi missing value dari logical.
Apa artinya?
Ini jika dihubungkan dengan tipe data lain di R seperti vector – dimana isinya harus seragam
tipe datanya – maka vector tersebut hanya boleh berisi nilai TRUE dan FALSE.
Sebagai perbandingan, mari kita lihat contoh pembuatan satu vector dengan isi campuran
dari integer dan logical berikut.

c(1, 2, FALSE, 3)

Hasil akan ditampilkan sebagai berikut.

[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:

 NA_integer_ untuk representasi tipe data "integer"


 NA_real_ untuk representasi tipe data "double"
 NA_complex_ untuk representasi tipe data "complex"
 NA_character_ untuk representasi tipe data "character"
Dan semuanya memiliki nilai NA. Jika kita cek tipe data dari salah satu variasi missing value
NA sebagai berikut

typeof(NA_real_)

Maka kita akan dapatkan hasil "double" seperti berikut.

> 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_)

Coercion pada Vector yang mengandung NA


Dengan adanya variasi NA yang dijelaskan pada content sebelumnya, R akan secara otomatis
menggantikan NA yang secara default tipe data logical menjadi variasi tersebut.
Jadi jika kita mengetik hasil berikut.

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

isi.vector <- c(1,2,3,NA,3,1)

#Mengecek keseluruhan tipe data dengan perulangan lapply dan typeof


lapply(isi.vector, typeof)

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.

NULL dan Vector


Untuk memahami NULL, dan perbedaan dengan NA kita langsung mempraktekkannya
dengan mengisi suatu vector dengan NULL.
Berikut adalah contoh variabel vector yang mengandung 7 elemen termasuk NA dan NULL.

isi.vector <- c(1, 2, 3, NA, 5, NULL, 7)

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.

#Membuat vector dengan 7 elemen termasuk NA dan NULL

isi.vector <- c(1,2,3,NA,5,NULL,7)

#Menghitung jumlah elemen dari isi.vector


length(isi.vector)

Ringkasan Perbandingan NA dan NULL


Kita telah membahas mengenai NA dan NULL pada teks dan praktek sebelumnya. Untuk
memudahkan pemahaman, berikut adalah rangkuman perbedaan terhadap keduanya.

NA N

Apa itu? Adalah sebuah konstanta (variable yang tidak bisa Sebuah object unt
diubah lagi nilainya) sebagai indikator dari missing merepresentasika
value terdefinisi"

Kata kunci Indikator tidak terdefinisi

Panjang (length) dari object 1 0

Tipe Logical object

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.

NULL dan List


Berbeda dengan vector, list akan menyimpan NULL apa adanya. Sebagai contoh, perintah
berikut membuat list dengan 5 elemen dimana terdapat NULL dan NA di dalam list ini.

isi.list <- list(1, NULL, 3, NA, 5)

Jika kita tampilkan isinya, maka akan terlihat sebagai berikut.

> 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

#Membuat list dengan 3 elemen termasuk NA dan NULL

isi.list <- list(1,NULL,3,NA,5)

#Menghitung jumlah elemen dari isi.list


length(isi.list)

Inf untuk mewakili Infinite Number


Setelah mengenalkan NA dan NULL sebagai represntasi missing value dengan cukup detil
pada bagian sebelumnya, sekarang kita masuk ke dua representasi angka yaitu Inf dan NaN.
Inf adalah singkatan dari infinite number atau representasi angka tidak terhingga. Semua
pembagian angka bukan nol dengan nol adalah angka tidak terbatas, misalkan 1/0 atau -
20/0.
Berikut adalah contoh operasi pembagian dengan 0 dan hasilnya di R.

> 1/0
[1] Inf

> -20/0
[1] -Inf

#Hitung kalkulasi 5 dibagi dengan 0

5/0

#Hitung kalkulasi -120 dibagi dengan 0


-120/0
NaN (Not a Number)
NaN adalah representasi khusus untuk angka. Singkatan dari Not a Number, ini adalah
representasi operasi matematika yang tidak bisa diwakili oleh angka apapun. Sering sekali
bisa dianggap missing value tapi untuk hasil perhitungan.
Contoh perhitungan yang menghasilkan NaN adalah ketika angka 0 dibagi dengan 0. Ini tidak
bisa dirasionalkan, sehingga NaN adalah representasi yang paling tepat.
Berikut adalah contoh perhitungan 0/0 di R dan hasilnya.

> 0/0
[1] NaN

Mari kita praktekkan hal ini agar lebih jelas.

#Hitung kalkulasi 0 dibagi dengan 0


0/0

NaN dari hasil function log()


Perhitungan matematika lain yang juga menghasilkan NaN adalah nilai logaritma (log) dari
bilangan negatif.
Berikut adalah contoh perhitungan logaritma dari dua bilangan, 100 dan -100 di R dan
hasilnya.

> log(100)
[1] 4.60517

> log(-100)
[1] NaN

Terlihat log(-100) menghasilkan nilai NaN

#Hitung logaritma dari angka -1000


log(-1000)

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

#Buat variable contoh.nan

contoh.nan <- 0/0

#Periksa dengan function is.nan


is.nan(contoh.nan)

NaN dan is.na versus NA dan is.nan


Seluruh nilai NaN dapat diperiksa dengan fungsi is.na, sehingga hasilnya mengembalikan
TRUE. Berikut adalah contohnya.

> 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).

#Masukkan code di bawah ini sesuai permintaan soal

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(…)
 

#Masukkan code di bawah ini sesuai permintaan soal

isi.vector <- c(1,2,NA,4,5,NaN,6)


sum(is.na(isi.vector)==TRUE)

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:

 Mengenal representasi missing value di R, yaitu NA (Not Available)


 NA dan variasinya (NA_integer_, NA_real_, NA_complex_, dan NA_character_)
 NULL sebagai representasi missing object
 Perilaku NA dan NULL untuk vector dan list
 NaN sebagai representasi missing value angka (Not a Number)
 Penggunaan function is.na dan is.nan

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:

 Apa itu factor dan kenapa diperlukan?


 Kapan factor digunakan
 Cara membuat factor di R
 Bagaimana sebenarnya nilai disimpan di dalam factor
 Menggunakan function untuk merubah nilai factor
 Merubah pengurutan di factor

Dengan menguasai keterampilan menggunakan factor ini, Anda akan lebih siap untuk
melakukan banyak hal di R.

Apa itu Factor?


Factor adalah suatu variable di R yang menyimpan daftar nilai-nilai kategori atau nominal.
Berikut adalah beberapa contoh daftar nilai kategori yang bisa disimpan dalam factor:

 Nama bulan: Januari, Februari, Maret.


 Jenis pakaian: Atasan, Jeans, Rok, Kaos.
 Satuan berat: kg, mg, ton, kwintal.
 dan lain-lain.

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"))

Perintah di atas akan menampilkan hasil berikut:

[1] Jan Feb Mar


Levels: Feb Jan 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.

Pada levels, terlihat Feb dimulai duluan


dibandingkan Jan karena secara urutan
alfabet pertama pada Feb – yaitu F – lebih
kecil dibandingkan alfabet pertama pada
Jan – yaitu J.

#Buatlah factor dengan isi nilai teks "Jan", "Feb", dan "Mar"

factor(c("Jan", "Feb", "Mar"))

Atribut levels dan class pada Factor


Perbandingan yang kontras antara factor dengan vector atau data.frame adalah pada factor
terdapat atribut tambahan, yaitu levels.
Atribut sendiri adalah variable yang melekat dan menjadi bagian dari objek atau variable lain.
Selain atribut levels, pada factor terdapat juga atribut class.
Untuk melihat seluruh atribut pada kita menggunakan function attributes, berikut adalah
contoh penggunaannya.
attributes(variable)
Dan nilai atribut tergantung penerapannya oleh R. Dan untuk levels, atributnya selalu bertipe
karakter atau teks. Ini merupakan catatan penting yang sangat berguna dalam pemanfaatan
factor lebih jauh.
Mari kita langsung lakukan praktek agar lebih jelas.
Tugas Praktek
Pada code editor, terdapat satu variable bernama faktor.bulan yang telah diisi dengan factor.
Tampilkan atribut dari variable ini memasukkan perintah pada bagian […].
Jika semua berjalan lancar, maka hasilnya akan tampil sebagai berikut.

$levels
[1] "Feb" "Jan" "Mar"
$class
[1] "factor"

Dimana hasilnya terdapat dua atribut, yaitu levels dan class (ditandai dengan tanda $ pada


nama atribut di depannya) dengan nilai-nilai atributnya (perhatikan semua memiliki tanda
kutip pada nilainya – yang menandakan nilainya berupa karakter atau teks).
Dan disini terlihat atribut class berisi "factor" – menandakan objek ini memang adalah
sebuah factor.

#Variable factor bernama faktor.bulan dengan nilai teks "Jan", "Feb", dan "Mar"

faktor.bulan <- factor(c("Jan","Feb","Mar"))

attributes(faktor.bulan)

Function levels dan class pada Factor


Atribut levels dan class dapat juga dilihat dengan function levels dan class dengan input
berupa factor, dengan konstruksi sebagai berikut:

levels(variable)
class(variable)

Mari kita langsung lakukan praktek agar lebih jelas.


#Variable factor bernama faktor.bulan dengan nilai teks "Jan", "Feb", dan "Mar"

faktor.bulan <- factor(c("Jan","Feb","Mar"))

levels(faktor.bulan)

class(faktor.bulan)

Perulangan Nilai pada Factor


Jika pada praktek sebelumnya, factor diisi dengan tiga contoh nilai nama bulan pertama
yang tidak berulang. Pada praktek kali ini kita coba akan memasukkan nilai yang berulang,
dimana "Jan" dan "Mar" akan dimasukkan berulang.
Berikut adalah contohnya:

factor(c("Jan","Feb","Mar","Jan","Mar","Jan"))

Jika dieksekusi maka hasilnya adalah sebagai berikut:


[1] Jan Feb Mar Jan Mar Jan
Levels: Feb Jan Mar

Berikut adalah penjelasan hasilnya.


Hasil Keterangan
[1] adalah tampilan output dengan hasil
[1] Jan Feb Mar Jan Mar Jan tampilan dimulai pada indeks ke 1
Jan Feb Mar Jan Mar Jan adalah tampilan
dari nilai-nilai factor
Levels: adalah atribut yang menempel
pada setiap faktor dan berisi daftar diskrit
dari variasi nilai-nilai yang terdapat pada
Levels: Feb Jan Mar faktor.

Variasi nilainya masih sama, yaitu tiga (Feb


Jan Mar).
 
#Buatlah factor dengan teks "Jan", "Feb", "Mar","Jan","Mar", dan "Jan"

factor(c("Jan", "Feb", "Mar", "Jan", "Mar", "Jan"))

Bagaimana sebenarnya Factor disimpan?


Di "belakang layar", factor sebenarnya memiliki 2 bagian:

 Vector yang berisi nilai angka bulat (integer).


 Vector yang berisi nilai-nilai kategori, ini disimpan dalam atribut levels – isinya selalu
bertipe character / teks.

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:

1. R menerima perintah dengan function factor(c("Jan","Feb","Mar"))


2. R akan mencari variasi nilai (levels) dan diurutkan – dalam hal ini pengurutan alfabet –
dan dipetakan berdasarkan index yang bernilai integer.
Disini nilai index 1 mewakili "Feb", 2 mewakili "Jan", dan 3 mewakili "Mar"
3. Dari levels, nilai-nilai "Jan", "Feb", "Mar" dicari nilai index-nya dan dimasukkan
sebagai nilai-nilai pada factor ( 2, 1, 3 ).

Dan mari kita perhatikan satu lagi contoh ilustrasi dari pengembangan factor di atas:

factor(c("Jan","Feb","Mar","Jan","Mar"))

Penjelasan dari proses di atas:

1. R menerima perintah dengan function factor(c("Jan","Feb","Mar","Jan","Mar"))


2. R akan mencari variasi nilai (levels) dan diurutkan – dalam hal ini pengurutan alfabet –
dan dipetakan berdasarkan index yang bernilai integer.Disini nilai index 1 mewakili
"Feb", 2 mewakili "Jan", dan 3 mewakili "Mar"
3. Dari levels, nilai-nilai "Jan", "Feb", "Mar","Jan","Mar" dicari nilai index-nya dan
dimasukkan sebagai nilai-nilai pada factor ( 2, 1, 3, 2, 3).

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.

Penggunaan as.integer pada Factor


Untuk mengambil nilai-nilai index integer pada factor, kita bisa menggunakan function
as.integer dengan syntax berikut.

as.integer(variable factor)

#Buatlah factor dengan teks "Jan", "Feb", "Mar","Jan","Mar", dan "Jan"

factor.bulan <- factor(c("Jan","Feb","Mar","Jan","Mar","Jan"))

as.integer(factor.bulan)

Mengganti "Jan" menjadi "Januari"


Sering sekali nilai kategori tidak sesuai dengan yang kita inginkan, sebagai contoh kita ingin
nilai "Jan" ditampilkan sebagai "Januari". Di factor, kita lakukan ini dengan mengganti nilai
levels pada index yang kita inginkan.
Mari kita perhatikan contoh faktor berikut. Terdapat satu variabel factor.bulan dengan levels
"Feb", "Jan", dan "Mar".
 

Jika kita ingin ganti "Jan" (posisi ke 2 pada levels) menjadi "Januari", maka perintah yang
kita gunakan adalah:

levels(factor.bulan)
[2] <- "Januari"

Berikut adalah penjelasan konstruksi perintah di atas.


Konstruksi Keterangan
adalah fungsi untuk mengambil levels dari
levels(…) sebuah factor

factor.bulan Variable factor


Posisi kedua – dalam hal ini posisi dari
[2]
levels
Operator assignment atau perintah untuk
<-
memasukkan data
Nilai yang akan dimasukkan ke levels
"Januari"
posisi kedua
#Buatlah factor dengan teks "Jan", "Feb", "Mar","Jan","Mar", dan "Jan"

factor.bulan <- factor(c("Jan","Feb","Mar","Jan","Mar","Jan"))

#Mengganti levels

levels(factor.bulan)[2] <- "Januari"

levels(factor.bulan)[3] <- "Maret"

factor.bulan

Angka sebagai Kategori


Jika sebelumnya kita memasukkan teks sebagai nilai kategori pada saat mendefinisikan
factor. Bagaimana dengan angka?
Jika angka dimasukkan ke dalam vector, tetap akan dikenal sebagai nilai kategoris dan
dimasukkan ke dalam levels. Dan karena itu angka akan dikonversi menjadi teks.
#Buatlah factor bernama factor.umur dengan isi c(12, 35, 24, 12, 35, 37)
factor.umur <- factor(c(12,35,24,12,35,37))

#Tampilkan variable factor.umur

factor.umur

NA, NaN, NULL pada saat pembentukan Factor


NA, NULL dan NaN adalah tiga nilai khusus untuk merepresentasikan missing values atau
nilai yang hilang di R.
Jika ketiganya dimasukkan ke dalam factor melalui deklarasi vector, maka prinsip berikut
tetap berlaku:

 Na dan NaN akan menjadi bagian dari isi factor, NULL akan dihilangkan
 Hanya NaN yang akan dikenali sebagai levels

Sebagai contoh, jika kita membuat factor dengan nilai berikut.

factor(c("Bandung", "Jakarta", NA, "Jakarta", NaN, "Medan", NULL, NULL, "Bandung"))

maka hasil tampilannya adalah sebagai berikut.

[1] Bandung Jakarta     Jakarta NaN     Medan   Bandung


Levels: Bandung Jakarta Medan NaN

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

Menghitung panjang Factor dengan length


Panjang factor dapat dihitung dengan menggunakan function length dengan syntax
sederhana berikut.
length(variable)

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"))

#Tampilkan panjang dari variable factor.lokasi

length(factor.lokasi)

Menyusun levels dari awal


Sejauh ini factor yang kita buat seakan-akan hanya bisa dirubah isinya, namun bukan
urutannya. Ini kita bisa kendalikan juga dengan memberikan nilai-nilai kategori sesuai urutan
yang kita inginkan pada argumen levels di function factors.

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:

factor(…, levels = c("Jan","Feb","Mar")

Cobalah perhatikan contoh ilustrasi dari dua pembuatan factor, dengan dan tanpa argumen
levels.
 
#Variable factor dengan isi vector c("Jan","Feb","Mar","Jan","Mar")

factor(c("Jan","Feb","Mar","Jan","Mar"), levels = c("Jan","Feb","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:

 Apa itu factor dan kenapa diperlukan?


 Kapan factor digunakan
 Cara membuat factor di R
 Bagaimana sebenarnya nilai disimpan di dalam factor
 Menggunakan function untuk merubah nilai factor
 Merubah pengurutan di factor

Dengan menguasai keterampilan menggunakan factor ini, Anda sudah lebih siap untuk
melakukan banyak hal di R.

Reading from Text and Excel File


Pendahuluan
Setelah menguasai penanganan data dengan Factor dan missing values. Saatnya kita
langsung membaca data asli untuk diolah.
Untuk pembacaan data pada course ini, DQLab membagi ke dalam dua bab. Bab ini
dikhususkan untuk membaca data dari file teks dan Excel. Sedangkan di bab lain (pada Part
2) akan difokuskan untuk membaca dari database.
Kita akan gunakan satu dataset yang sama untuk bab ini, yaitu dataset Kependudukan
Jakarta – ini dengan tujuan agar kita tidak bingung dengan banyaknya dataset.
Namun dataset ini akan datang dengan tiga variasi, yaitu:

 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.

Membaca Dataset CSV


Untuk membaca file versi csv dari dataset kependudukan tersebut kita bisa gunakan
function read.csv – function ini akan membaca isi dari file teks tersebut menjadi data.frame
di R.
File csv yang akan kita baca berlokasi di url berikut:
https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.csv
Untuk membaca file tersebut kita gunakan function read.csv dengan perintah lengkap
sebagai berikut.
penduduk.dki <-
read.csv("https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan20
13.csv", sep=",")

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

Parameter pemisah (separator) antar kolom data.


sep="," Kita gunakan tanda koma untuk dataset penduduk
DKI Jakarta.
 

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

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")


penduduk.dki

Profile Dataset dengan Function str


Adalah praktek yang sangat baik untuk mengenal atau melakukan profile tiap dataset yang
sudah dibaca ke dalam R – dan secara sederhana di R dapat kita lakukan dengan perintah str.
Str akan menyajikan informasi tiap kolom dataset dalam format yang compact – satu baris
informasi saja per row. Pendekatan singkat dan jelas ini membuat str menjadi function
favorit dan efektif untuk mengenal data di tahap awal.
Syntaxnya juga cukup sederhana, cukup masukkan dataset ke dalam function ini seperti
pada contoh berikut.

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 ...

Berikut adalah penjelasan dari beberapa hasil tersebut:


 'data.frame': merupakan tipe data dari variable penduduk.dki.
 267 obs: menunjukkan adanya 267 total baris data (row) dari dataset ini.
 37 variables: menunjukkan adanya 37 kolom data pada dataset ini.

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.

#Membaca dataset dengan read.csv dan dimasukkan ke variable penduduk.dki


penduduk.dki <-
read.csv("https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.csv", sep=",")
str(penduduk.dki)

Profile Dataset dengan Function summary


Selain perintah str, kita dapat juga menggunakan function summary untuk melihat kondisi
dataset kita dalam bentuk ringkasan yang lebih detil.
Sebagai contoh, untuk melihat summary dari variable penduduk.dki maka kita gunakan
konstruksi berikut.

summary(penduduk.dki)

#Membaca dataset dengan read.csv dan dimasukkan ke variable penduduk.dki


penduduk.dki <-
read.csv("https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.csv", sep=",")
summary(penduduk.dki)

Menggunakan argumen check.names = FALSE


Jika kita perhatikan pada eksekusi read.csv dan hasilnya, terlihat ada kolom dengan prefix X
– yaitu X, X.1, X.2, dan seterusnya. Ini terjadi karena read.csv mendeteksi ada nama kolom
yang kosong dan lebih dari. Kondisi ini akan secara otomatis "diperbaiki" oleh function
read.csv dengan menambahkan prefix X di depan kolom.
Jika kita tidak menginginkan hal tersebut, kita bisa tambahkan argumen check.names =
FALSE pada statement read.csv sehingga konstruksinya menjadi:

read.csv(…, …, check.names = FALSE)

#Membaca dataset dengan read.csv dan dimasukkan ke variable penduduk.dki


penduduk.dki <-
read.csv("https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.csv", sep=",",
check.names=FALSE)
str(penduduk.dki)

Membaca Tab Separated Value (TSV)


Untuk membaca file versi tsv dimana pemisah antar field adalah karakter tabulasi (tab) dari
dataset kependudukan tersebut kita tetap gunakan function read.csv.
Perbedaannya hanyalah di argumen separator dimana sebelumnya adalah tanda koma (,),
maka untuk tsv perlu diganti menjadi backslash t (\t).
sep="\t"

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

Membaca Dataset File Excel dengan read.xlsx


Jika membaca file teks berformat csv dan tsv hampir sama, maka untuk membaca file versi
Excel dari dataset kependudukan tersebut kita perlu gunakan function read.xlsx dari library
lain yang bernama openxlsx.
Function ini akan membaca isi dari file Excel menjadi data.frame di R.
Untuk praktek kita kali ini, file Excel yang akan kita baca berlokasi di url berikut:
https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.xlsx
Berikut adalah contoh konstruksi function read.xlsx untuk membaca file Excel tersebut.
penduduk.dki.xlsx <- read.xlsx(xlsxFile="https://storage.googleapis.com/dqlab-
dataset/dkikepadatankelurahan2013.xlsx")

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:

 File teks berformat comma separated value (csv)


 File teks berformat tab separated value (tsv)
 File Excel berformat xlsx

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)

Merubah Satu Nama Kolom


Function names ini juga bisa digunakan merubah nama kolom pada data.frame. Untuk
merubahnya kita gunakan konstruksi berikut:

names(variable)[posisi] <- "nama_baru"

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"

#Membaca dataset csv

penduduk.dki.csv <-read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv",
sep=",")

names(penduduk.dki.csv)[1] <- "PERIODE"

names(penduduk.dki.csv)[2] <- "PROPINSI"

names(penduduk.dki.csv)

Merubah Sejumlah Nama Kolom


Perintah untuk merubah dua kolom pada praktek sebelumnya bisa disingkat dengan
konstruksi berikut:

names(variable)[c(rentang_posisi)] <- c("nama_baru_1", "nama_baru_2")

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.

names(penduduk.dki.csv)[c(1:2)] <- c("PERIODE", "PROPINSI")

#Membaca dataset csv

penduduk.dki.csv <-read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv",
sep=",")

names(penduduk.dki.csv)[c(1:2)] <- c("PERIODE", "PROPINSI")

names(penduduk.dki.csv)

Membuang Kolom dengan Bantuan Operator


%in%
Pada bab sebelumnya, data.frame hasil pembacaan read.csv memiliki kolom X, X.1, X.2, X.3
s/d kolom X.11 yang kosong semua dan sebenarnya tidak diperlukan.
Kita dapat menghilangkan kolom-kolom ini dengan contoh berikut:

penduduk.dki.csv <- penduduk.dki.csv[,!names(penduduk.dki.csv) %in% c("X",


"X.1","X.2","X.3","X.4","X.5","X.6","X.7","X.8","X.9","X.10")]
Penjelasan tiap elemen dari perintah tersebut adalah sebagai berikut.

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=",")

#Membuang kolom X, X.1, X.2 s/d X.11

penduduk.dki.csv <- penduduk.dki.csv[,!names(penduduk.dki.csv) %in% c("X",


"X.1","X.2","X.3","X.4","X.5","X.6","X.7","X.8","X.9","X.10","X.11")]

Merubah Tipe Kolom menjadi Factor


Kita akan beralih sekarang ke dataset kependudukan DKI versi Excel, dimana terdapat
perbedaan perilaku antara read.xlsx dan read.csv, yaitu secara default read.xlsx tidak
mengkonversi kolom kategorik sebagai teks (character).
Untuk melakukan konversi sebagai factor, kita gunakan function as.factor. Berikut adalah
konstruksi konversi dari satu kolom data.frame.

as.factor(data.frame$namakolom)

library(openxlsx)

#Membaca dataset dengan read.xlsx dan dimasukkan ke variable penduduk.dki

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)

Mengambil Kolom Laki.Laki / Perempuan


dengan grep
Kalau kita perhatikan pada dataset kependudukan DKI, kolom-kolom untuk jumlah
penduduk berdasarkan umur dan jenis kelamin bentuknya adalah seperti berikut.

Dengan ada pola nama seperti itu, kita bisa mengambil dengan function grep dengan syntax
berikut.

grep(pattern="pola", x = vector, ignore.case=TRUE)

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:

 "laki-laki": untuk mengambil pola kolom yang mengandung teks Laki-Laki.


 "perempuan": untuk mengambil pola kolom yang mengandung teks "Perempuan".
 "(perempuan|laki-laki)": untuk mengambil pola kolom yang mengandung teks
"Perempuan" ataupun "Laki-Laki".
Argumen x dimana kita memasukkan vector. Dan ignore.case = TRUE menyatakan bahwa
pola yang kita tidak bersifat case sensitive – artinya huruf besar tidak dibedakan dari huruf
kecil.
Function grep ini akan mengembalikan posisi-posisi indeks dari vector yang ditemukan
polanya.
Sebagai contoh, untuk mengambil kolom yang mengandung "Perempuan" pada nama-nama
kolom dari dataset kependudukan kita gunakan perintah berikut:
grep(pattern="perempuan", x = names(penduduk.dki.xlsx), ignore.case=TRUE)
Ini akan menghasilkan vector 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")

#Tampilkan nama-nama kolom yang mengandung kata "perempuan".

pola_nama_perempuan <- grep(pattern="perempuan", x=names(penduduk.dki.xlsx), ignore.case=TRUE)

names(penduduk.dki.xlsx[pola_nama_perempuan])

#Tampilkan nama-nama kolom yang mengandung kata "laki-laki"

pola_nama_laki_laki <- grep(pattern="laki-laki", x=names(penduduk.dki.xlsx), ignore.case=TRUE)

names(penduduk.dki.xlsx[pola_nama_laki_laki])

Menambahkan kolom Penjumlahan


Kita dapat menambahkan kolom pada data.frame langsung dengan menggunakan simbol
subscript $ diikuti dengan nama kolom baru yang kita kehendaki. Misalkan untuk membuat
kolom PEREMPUAN35TAHUNKEATAS pada variable penduduk.dki.xlsx, kita bisa menuliskan:

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")

#Tampilkan nama-nama kolom yang mengandung kata "perempuan".

pola_nama_perempuan <- grep(pattern="perempuan", x = names(penduduk.dki.xlsx),


ignore.case=TRUE)

penduduk.dki.xlsx$PEREMPUAN35TAHUNKEATAS <-
rowSums(penduduk.dki.xlsx[pola_nama_perempuan])

Normalisasi Data dari Kolom ke Baris


Kalau kita perhatikan empat kolom data pada table berikut di bawah ini – yang diambil dari
dataset kependudukan DKI – maka dua kolom terakhir (berwarna kuning dan hijau)
sebenarnya mengandung tiga variable, yaitu: rentang umur, jenis kelamin, dan jumlah
penduduk.
NAMA.KECAMATAN NAMA.KELURAHAN 35-39.Laki-Laki 35-39.Perempuan
GAMBIR GAMBIR 166 174
GAMBIR CIDENG 850 748
GAMBIR PETOJO UTARA 954 920
 
Dan dari sisi prinsip kerapian data, satu variable data harusnya masing-masing menempati
satu kolom tersendiri. Dan berdasarkan prinsip tersebut, kolom "NAMA.KECAMATAN" dan
"NAMA.KELURAHAN" yang berwarna biru sudah memenuhi persyaratan. Namun kolom "35-
39.Laki-Laki" dan kolom "35-39.Perempuan"  tidak memenuhi persyaratan.  
Kita akan coba merapikan ini dengan dua tahap:

 Melakukan normalisasi kolom dari baris ke kolom


 Memisahkan kolom

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:

melt(data=penduduk.dki.xlsx, id.vars=c( "NAMA.KECAMATAN", "NAMA.KELURAHAN"),


measure.vars = c("35-39.Laki-Laki", "35-39.Perempuan"), variable.name = "DEMOGRAFIK",
value.name="JUMLAH")

Penjelasan dari perintah tersebut adalah sebagai berikut:


Elemen Deskripsi
melt Function untuk melakukan transformasi dari kolom ke baris
Argumen data yang diisi dengan variable penduduk.dki.xlsx, yaitu dat
data=penduduk.dki.xlsx
frame hasil pembacaan dari file Excel data kependudukan DKI
id.vars= c( "NAMA.KECAMATAN", Vector dari field-field kolom yang akan menjadi identitas – dimana fie
"NAMA.KELURAHAN") tidak akan mengalami transformasi tapi tetap diambil
measure.vars = c("35-39.Laki-Laki",
Nama variable hasil transformasi
"35-39.Perempuan")
variable.name= "DEMOGRAFIK" Nama variable untuk menampung nama kolom transformasi
value.name= "JUMLAH" Nama variable untuk menampung isi data dari kolom transformasi
 
library(openxlsx)

library(reshape2)
penduduk.dki.xlsx <-
read.xlsx(xlsxFile="https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.xlsx")

#Transformasi kolom dataset penduduk.dki.xlsx, disimpan ke variable penduduk.dki.transform

penduduk.dki.transform <- melt(data=penduduk.dki.xlsx, id.vars=c("NAMA.KECAMATAN",


"NAMA.KELURAHAN"), measure.vars = c("35-39.Laki-Laki", "35-39.Perempuan"), variable.name =
"DEMOGRAFIK", value.name="JUMLAH")

#Menampilkan variable penduduk.dki.transform

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"))

Berikut adalah penjelasan dari perintah di atas.

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.

penduduk.dki.transform[c("RENTANG.UMUR", "JENIS.KELAMIN")] <- …

Berikut adalah penjelasan dari perintah di atas.

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.

penduduk.dki.transform$DEMOGRAFIK <- NULL

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")

penduduk.dki.transform <- melt(data=penduduk.dki.xlsx, id.vars=c( "NAMA.KECAMATAN",


"NAMA.KELURAHAN"), measure.vars = c("35-39.Laki-Laki", "35-39.Perempuan"), variable.name =
"DEMOGRAFIK", value.name="JUMLAH")

#Memecah isi kolom DEMOGRAFIK menjadi "RENTANG.UMUR" dan "JENIS.KELAMIN"

penduduk.dki.transform[c("RENTANG.UMUR", "JENIS.KELAMIN")] <-


colsplit(penduduk.dki.transform$DEMOGRAFIK,"\\.",c("RENTANG.UMUR","JENIS.KELAMIN"))

penduduk.dki.transform$DEMOGRAFIK <- NULL


penduduk.dki.transform

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:

 Merubah nama satu dan beberapa kolom


 Membuang kolom
 Merubah tipe kolom
 Mengambil kolom dengan pola tertentu
 Menambah kolom
 Normalisasi atau transpose data
 Memecah data dengan split data

Kami sarankan agar Anda sering melakukan latihan untuk hal ini. Sehingga pada saat masuk
ke materi Part 2 dari data wrangling akan lebih lancar.

Penutup Data Wrangling


Selamat, Anda telah menuntaskan bagian pertama dari course Data Wrangling with R yang
mempelajari dan mempraktekkan materi berikut:

 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

Statistics using R for Data Science

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.

Statistik sebagai Ilmu Peluang


Sebenarnya statistik merupakan ilmu peluang, yaitu untuk mendapatkan generalisasi
populasi dari sampel yang kita miliki. Dalam statistik banyak kaitannya dengan sampel dan
populasi, berikut pengertiannya

1. Sampel adalah representasi dari sebagian elemen dari populasi


2. Populasi adalah total dari semua elemen

 
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 adalah nilai estimasi karateristik populasi.


 Parameter adalah nilai karakteristik populasi atau bisa disebut karakteristik
sebenarnya.

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

1. Kuantitatif adalah data yang dinyatakan dalam bentuk angka


2. Kualitatif adalah data yang dinyatakan dalam bentuk bukan angka

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

Skala Pengukuran Data


Tiap data perlu suatu standar untuk melakukan pengukuran, ini disebut skala.
Dan berikut adalah jenis-jenis skala pengukuran data:

 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.

 Ordinal: adalah skala yang mengandung pengertian tingkatan.


Contoh: Data kepuasan, 1 = tidak puas, 2 = puas, dan 3 = sangat puas, artinya 1<2<3.

 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.

Dataset tersebut terdiri dari sembilan kolom dengan detil berikut:

 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.

Membaca Dataset dengan read.csv


Untuk membaca dataset data_intro.csv tersebut kita akan gunakan function read.csv dengan
konstruksi berikut:
data_intro <- read.csv("https://storage.googleapis.com/dqlab-
dataset/data_intro.csv",sep=";")
Penjelasan terhadap function di atas adalah sebagai berikut:
Komponen Deskripsi

data_intro nama variable yang digunakan untuk


menampung pembacaan file dataset
data_intro.csv

read.csv function yang digunakan untuk


membaca contoh dataset dengan
format file teks (CSV)

https://storage.googleapis.com/dqlab- lokasi dataset yang terdapat di web


dataset/data_intro.csv DQLab. Jika lokasi file dan aplikasi R
terdapat di komputer lokal Anda, maka
gantilah dengan lokasi file di lokal.
Misalkan c:\data\data_intro.csv

sep=";" Parameter pemisah (separator) antar


kolom data. Kita gunakan tanda titik
koma untuk dataset tingkat kepuasan
pelanggan.

#Membaca dataset dengan read.csv dan dimasukkan ke variable data_intro

data_intro <- read.csv ("https://academy.dqlab.id/dataset/data_intro.csv",sep=";")

data_intro

Melihat Tipe Data dengan Str


Adalah praktek yang sangat baik untuk mengenal atau melakukan profile tiap dataset yang
sudah dibaca ke dalam R – dan secara sederhana di R dapat kita lakukan dengan function str.
Function str akan menyajikan informasi tiap kolom dataset dalam format yang compact –
satu baris informasi saja per row. Pendekatan singkat dan jelas ini membuat str menjadi
function favorit dan efektif untuk mengenal data di tahap awal.
Syntaxnya juga cukup sederhana, cukup masukkan dataset ke dalam function ini seperti
pada contoh berikut.
str(data_intro)
#Membaca dataset dengan read.csv dan dimasukkan ke variable data_intro
data_intro <- read.csv("https://academy.dqlab.id/dataset/data_intro.csv",sep=";")

str(data_intro)

Merubah Tipe Data Kolom ID.Pelanggan


menjadi Character
Variabel ID.Pelanggan merupakan kode unik dari setiap variabel dan tidak bisa dicari nilai
statistiknya. Sehingga tipe data ID.Pelanggan perlu diubah menjadi character agar tidak ikut
di analisis.
Untuk mengubah tipe data ID.Pelanggan menjadi character dapat menggunakan syntax
data_intro$ID.Pelanggan <-as.character(data_intro$ID.Pelanggan)
Function as.character mengubah id tiap pelanggan menjadi string/character - ditandai
dengan tanda petik diantara kode unik tersebut.
Tugas Praktek
## mengubah data menjadi karakter karena tidak dilakukan analisis statistik pada variabel ID Pelanggan
dan nama

data_intro$ID.Pelanggan<- as.character(data_intro$ID.Pelanggan)

data_intro$Nama<- as.character(data_intro$Nama)

## melihat apakah sudah berhasil dalam mengubah variabel tersebut

str(data_intro$ID.Pelanggan)

str(data_intro$Nama)

Merubah Sejumlah Kolom menjadi Data


Kategorik (Factor)
Pada data_intro beberapa variabelnya bersifat kualitatif yaitu variabel jenis kelamin, produk,
dan Tingkat_Kepuasan. Variabel tersebut harus di ubah jenis datanya menjadi faktor untuk
mendapatkan karakteristik dari setiap pelanggan (observasi).
Untuk mengubah tipe data menjadi factor dapat menggunakan syntax berikut:
data_intro$Jenis.Kelamin <- as.factor(data_intro$Jenis.Kelamin)
data_intro$Produk <- as.factor(data_intro$Produk)
data_intro$Tingkat.Kepuasan <-
as.factor(data_intro$Tingkat.Kepuasan)
## Mengubah data menjadi factor untuk membedakan data kualitatif dengan menggunakan functon
as.factor

data_intro$Jenis.Kelamin <- as.factor(data_intro$Jenis.Kelamin)

data_intro$Produk <- as.factor (data_intro$Produk)

data_intro$Tingkat.Kepuasan <- as.factor (data_intro$Tingkat.Kepuasan)

## 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)

Skala Pengukuran Data


Setelah data diubah jenis tipe datanya, selanjutnya adalah pemeriksaan untuk memastikan
apakah tipe data setiap variabel sudah sesuai dengan skala pengukuran masing-masing.
Untuk melihat data dan tipe data dapat menggunakan syntax berikut :
data_intro
str(data_intro)
## melihat data/ pemanggilan data

data_intro

## melihat tipe data

str(data_intro)

Estimasi karakteristik
Ukuran pemusatan (mean,modus,median, presentil)

1. Modus adalah nilai yang sering muncul dari suatu distribusi (data


nominal-data rasio).
2. Median adalah nilai tengah dari suatu distribusi (data interval dan
rasio).
3. Mean adalah rata-rata aritmatik dari suatu distribusi (data interval
dan rasio).

 
Contoh
Data : 2, 2, 5, 7, 9, 9, 9, 10, 10, 11, 12
Modus = 9
Median = 9
Mean = 7,81

Estimasi Nilai Statistik Modus


Modus merupakan nilai yang menunjukan nilai yang sering muncul. Modus digunakan untuk
data bertipe nominal dan ordinal.
Untuk menampilkan modus dari data dapat menggunakan syntax
Mode(data_intro$Produk)
Berikut penjelasan function diatas:

 Mode akan menampilkan nilai terbanyak pada variabel yang diamati.


 data_intro$Produk, merupakan kolom Produk dari variable data_intro.

Untuk menggunakan function Mode tersebut, menggunakan library tambahan


bernama "pracma".
library(pracma)

## carilah modus untuk kolom Produk pada variable data_intro

Mode(data_intro$Produk)

## carilah modus untuk kolom Tingkat.Kepuasan pada variable data_intro

Mode(data_intro$Tingkat.Kepuasan)

Estimasi Nilai Statistik Median


Median merupakan nilai tengah dari suatu kumpulan data. median digunakan untuk data
bertipe interval dan rasio.
Untuk menampilkan median dari data dapat menggunakan syntax
median(data_intro$Pendapatan)
Berikut penjelasan function diatas:

 median akan menampilkan nilai tengah pada variabel yang diamati.


 data_intro$Pendapatan, merupakan kolom Pendapatan dari variable data_intro.

Tugas Praktek
## carilah median untuk kolom Pendapatan dari variable data_intro

median(data_intro$Pendapatan)

## carilah median untuk kolom Harga dari variable data_intro

median(data_intro$Harga)

## carilah median untuk kolom Jumlah dari variable data_intro

median(data_intro$Jumlah)

## carilah median untuk kolom Total dari variable data_intro

median(data_intro$Total)

Estimasi Nilai Statistik Rata-Rata


Rata-rata merupakan nilai yang menunjukan nilai rata-rata aritmatik. Rata-rata/mean
digunakan untuk data bertipe interval dan rasio.
Untuk menampilkan mean dari data dapat menggunakan syntax
mean(data_intro$Pendapatan)
Berikut penjelasan function diatas:

 mean akan menampilkan nilai rata-rata pada variabel yang diamati.


 data_intro$Pendapatan, merupakan kolom Pendapatan dari variable data_intro.

## carilah mean untuk kolom Pendapatan pada variable data_intro

mean(data_intro$Pendapatan)
## carilah mean untuk kolom Harga pada variable data_intro

mean(data_intro$Harga)

## carilah mean untuk kolom Jumlah pada variable data_intro

mean(data_intro$Jumlah)

## carilah mean untuk kolom Total pada variable data_intro

mean(data_intro$Total)

Penggunaan Mean dan Median


Dari contoh praktik sebelumnya ada perbedaan hasil Median dan Mean untuk data interval
dan rasio.Maka perlu diperhatikan untuk penggunaanya yaitu: penggunaan mean sebaiknya
digunakan jika tidak ada outlier. Sebaliknya jika ada outlier, maka sebaiknya
menggunakan Median.
Apa itu Outlier ? Outlier adalah data yang jaraknya jauh dari keseluruhan data.

Ukuran Sebaran Data


Ukuran sebaran yang sering digunakan adalah sebagai berikut:

a. Range adalah selisih antara nilai terbesar dan nilai terendah


b. Varians adalah simpangan kuadrat data dari nilai rata-ratanya
c. Simpangan baku adalah simpangan data dari nilai rata-ratanya, simpangan baku
nama lainnya adalah standard deviation. Standard deviation dapat digunakan untuk
melihat keakuratan dari hasil estimasi, semakin kecil standard deviation semakin
akurat hasil estimasi.
 

Estimasi Nilai Sebaran Data Range


Range adalah selisih antara nilai terbesar dan nilai terendah.  Untuk menampilkan range dari
data dapat menggunakan syntax sebagai berikut.
max(data_intro$Jumlah)-min(data_intro$Jumlah)
Berikut penjelasan function diatas:
 max digunakan untuk mendapatkan nilai maksimal dari data.
 min adalah function yang digunakan mendapatkan nilai minimal dari data.

## carilah range untuk kolom Pendapatan pada variable data_intro

max(data_intro$Pendapatan) - min(data_intro$Pendapatan)

Estimasi Nilai Sebaran Data Varians


Varians merupakan simpangan kuadrat data dari nilai rata-ratanya.  Untuk menampilkan
varians dari data dapat menggunakan syntax sebagai berikut
var(data_intro$Pendapatan)
dimana

 var adalah function yang digunakan untuk mendapatkan nilai varians dari data.

## Carilah varians untuk kolom Pendapatan dari variable data_intro

var(data_intro$Pendapatan)

Estimasi Nilai Sebaran Data Simpangan Baku


Simpangan baku adalah simpangan data dari nilai rata-ratanya, simpangan baku nama
lainnya adalah standard deviasi. Standard deviasi dapat digunakan untuk melihat
keakuratan dari hasil estimasi, semakin kecil standard deviasi semakin akurat hasil estimasi.
Untuk menampilkan simpangan baku dari data dapat menggunakan syntax sebagai berikut
sd(data_intro$Jumlah)
dimana

 sd adalah function yang digunakan untuk mendapatkan nilai simpangan baku dari
data.

## Carilah simpangan baku untuk kolom Pendapatan dari variable data_intro

sd(data_intro$Pendapatan)

Kesimpulan
Dari pembahasan materi diatas maka kesimpulannya sebagai berikut:

 Statistik merupakan ilmu pengolahan,penyajian dan analisis data.


 Jenis-jenis data yaitu nominal, ordinal, interval, dan rasion.
 Estimasi karakteristik data yang sering digunakan diantaranya mean, median dan
modus.
 Jenis sebaran data diantaranya range (jarak), standar deviasi, dan varians.

Analisis Data Sederhana


Analisis Deskriptif pada variable data_intro
Analisis Deskriptif adalah proses analisa yang digunakan untuk membangun sebuah
hipotesis.
Pada bab ini, analisis deskriptif akan dilakukan pada data sebelumnya dengan tujuan untuk
mendapatkan informasi berikut:

 Bagaimana profil pelanggan.


 Bagaimana gambaran produk.
 Membangun hipotesis.

Analisis Deskriptif Menggunakan Nilai Statistik


Untuk melakukan analisis deskriptif setiap variabel pada R, kita dapat menggunakan
function berikut.
summary(data_intro)
Function summary akan menampilkan kesimpulan pada variabel masing-masing. Untuk
variabel bertipe character akan menampilkan panjang datanya. Variabel bertipe factor akan
menampilkan jumlah data pada masing-masing kelas. Sedangkan untuk variabel bertipe
numerik akan memunculkan nilai minimum, Q1,Q2 (median), Q3, mean, dan maximum.
Pengertian dari masing-masing istilah itu adalah sebagai berikut :

 Minimum adalah nilai observasi terkecil.


 Kuartil pertama (Q1), yang memotong 25 % dari data terendah.
 Median (Q2) atau nilai pertengahan.
 Kuartil ketiga (Q3), yang memotong 25 % dari data tertinggi.
 Maksimum adalah nilai observasi terbesar.

## carilah summary data dari data_intro

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:

 plot digunakan untuk variabel bertipe Factor - function ini menghasilkan grafik Bar


Plot.
 hist untuk variabel bertipe numerik seperti int - function ini menghasilkan grafik
Histogram.

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)

## Carilah sebaran data dari Pendapatan dari variable data_intro

hist(data_intro$Pendapatan)

## Carilah sebaran data dari Produk dari variable data_intro

plot(data_intro$Produk)

## Carilah sebaran data dari Harga dari variable data_intro

hist(data_intro$Harga)

## Carilah sebaran data dari Jumlah dari variable data_intro


hist(data_intro$Jumlah)

## Carilah sebaran data dari Total dari variable data_intro

hist(data_intro$Total)

## Carilah sebaran data dari Tingkat.Kepuasan dari variable data_intro

plot(data_intro$Tingkat.Kepuasan)

Kesimpulan Analisis Deskriptif Menggunakan


Visualisasi
Dari hasil analisis deskriptif pada praktek sebelumnya kita mendapatkan:

 Profil Pelanggan sebagai berikut:


1. Sebagian besar pelanggan adalah berjenis kelamin perempuan.
2. Rata-rata pendapatan pelanggan dalam sebulan adalah 875000 (tidak
menggunakan ukuran pemusatan mean, karena pada grafik terdapat outlier.
Sehinggan ukuran pemusatan yang dipakai adalah median).
3. Pelanggan sering membeli produk dalam jumlah 3-4 buah.
4. Rata-rata total belanja yang sering dihabiskan adalah 710000.
5. Kebanyakan pelanggan sangat puas kepada produk yang dijual.
 Gambaran produk yang dijual sebagai berikut:

o Produk yang sering dibeli adalah produk D.


o Rata-rata harga produk yang terjual sebesar 197500.

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:

1. Apakah ada hubungan pendapatan dengan total belanja?


2. Apakah ada pengaruh suatu produk dengan kepuasan pelanggan?
3. Apakah ada hubungan jenis kelamain dengan total belanja?

Pengenalan Uji Hipotesis


Uji hipotesis adalah metode pengambilan keputusan yang didasarkan dari analisis data.
Dalam statistik dapat menguji sebuah hipotesis benar atau salah. Ada 2 jenis hipotesis yaitu
hipotesis null (hipotesis nihil) dan hipotesis alternatif. Hipotesis nihil (Ho) yaitu hipotesis
yang berlawanan dengan teori yang akan dibuktikan. Hipotesis alternatif (Ha) adalah
hipotesis yang berhubungan dengan teori yang akan dibuktikan.
Dalam melakukan pengujian statistik kita perlu menggunakan metode statistik uji, yang
sering digunakan yaitu z-test, t-test, chi-square test, dan f-test. Pada bab kali ini kita tidak
akan membahas detail dari setiap statistik uji diatas, tetapi kita akan fokus cara
menggunakannya.
Selanjutnya kita harus paham mengenai p-value dan alpha yang akan digunakan dalam
statistik uji.
P-value adalah peluang terkecil dalam menolak Ho. Sedangkan alpha adalah tingkat
kesalahan. Nilai alpha biasanya adalah 1%, 5%, dan 10%. Dalam prakteknya alpha 5% sering
digunakan, karena lebih moderat.
Hipotesis H0 ditolak jika nilai p-value kurang dari alpha (5%), sedangkan jika p-value lebih
dari nilai alpha maka yang H0 diterima. Untuk lebih jelasnya dapat dilihat gambar dibawah
ini

Sumber gambar: https://www.slideshare.net/rhandyprasetyo/statistikauji-hipotesis

Perbedaan Statistik Deskriptif dan Statistik


Inferensia
Dalam statistik ada 2 jenis analisis data, yaitu statistik deskriptif dan statistik inferensi. Uji
hipotesis, yang dijelaskan pada subbab sebelumnya termasuk kedalam statistik inferensia.
Untuk membedakan antara 2 jenis analisis diatas, maka dapat menyimak penjelasan berikut:

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.

Tujuan Analisis Inferensia


Tujuan Analisis berikutnya dari dataset kita adalah untuk mendapatkan informasi berikut:

 Bagaimana hubungan pendapatan dengan total belanja.


 Bagaimana pengaruh suatu produk dengan kepuasan pelanggan.
 Bagaimana hubungan jenis kelamin dengan total belanja.

Analisis Hubungan antar variable


Pada sub-bab ini kita akan membahas cara pengujian hipotesis yang sudah kita susun diatas.
Pengujian hipotesis diatas dengan menggunakan analisis inferensia. Ketiga hipotesis diatas
dapat digeneralisasi sebagai hipotesis hubungan antar variabel.
Dari penjelasan sebelumnya, kita akan melakukan analisis hubungan antar variable yaitu:

1. Variabel pendapatan dengan total belanja


2. Variabel pengaruh jenis produk dengan kepuasan pelanggan
3. Variabel jenis kelamain dengan total belanja

Hubungan Antara Variabel Numerik


Berdasarkan hasil kasus sebelumnya, kita akan melihat hubungan antara data numerik dan
numerik.
Ada dua cara untuk melihat hubungan antar variabel, yaitu dengan grafik scatter
plot dan analisis korelasi. Grafik scatter plot untuk melihat arah hubungan, poisitif dan
negatif. Sedangkan analisis korelasi adalah untuk menguji/konfirmasi apakah kedua variabel
tersebut memang berhubungan dan sebearapa kuat hubungannya.
Rentang nilai koefisien korelasi antara -1 sampai 1. Korelasi kuat ketika mendakati -1 atau 1,
sedangkan dikatakan lemah jika mendekati 0. Untuk mengetahui ada hubungan atau
tidaknya menggunakan analisis korelasi, dengan hipotesis sebagai berikut

 Hipotesis nihil (null): tidak ada hubungan antara kedua variabel.


 Hipotesis alternatif: ada hubungan antara kedua variabel.

Berikut gambaran yang lebih jelasnya.


Sumber gambar: https://dsmlmdblog.blogspot.com/2016/03/pengertian-dan-perhitungan-
korelasi.html
Next >

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)

Hubungan Pendapatan dengan Total Belanja


dengan cor.test
Setelah melihat hubungan variabel pendapatan dengan total belanja menggunakan scatter
plot diatas maka kita akan mengujinya, apakah benar-benar pendapatan memiliki pengaruh
positif terhadap total belanja
Untuk melakukan uji korelasi pada R menggunakan perintah
cor.test(data_intro$Pendapatan,data_intro$Total)
Berikut penjelasan function diatas:

 Function cor.test digunakan untuk melihat hubungan secara statistik.


 Pada korelasi test untuk mengujinya kita memakai t-test. Dengan hipotesis sebagai
berikut:
o H0 : tidak ada hubungan antara pendapatan dan total belanja.
o Ha : terdapat hubungan antara pendapatan dan total belanja

#Gunakan cor.test untuk mencari hubungan Pendapatan dengan Total Belanja

cor.test(data_intro$Pendapatan, data_intro$Total)

Hubungan Antara Variabel Kategorik


Hubungannya diantara keduanya dapat dilihat dengan menggunakan tabulasi silang dan
dapat juga dilihat kecenderungannya. Pada hubungan antara variabel kategorik dan
kategorik tersebut tidak bisa diketahui seberapa kuat hubungan diantara keduanya dan
bagimana pengaruhnya (positif atau negatif). Untuk mengetahui ada hubungan atau
tidaknya menggunakan uji statistik chi-square test, dengan hipotesis sebagai berikut:

 Null hipotesis: tidak ada hubungan antara kedua variabel


 Hipotesis Alternatif alternatif: ada hubungan antara kedua
variabel

Next >

Hubungan Produk dengan Tingkat Kepuasan


dengan chisq.test
Berdasarkan kasus diatas kita akan melihat hubungan antara data kategorik dan kategorik,
yaitu variabel jenis produk dan tingkat kepuasan. Sebelum menguji hubungannya, sebaiknya
dilakukan tabulasi silang sebagai analisis deskriptif. Selanjutnya analisis inferensia yaitu
menguji apakah ada hubungan maka dapat digunakan chi-square test.
Untuk melakukan tabulasi dan uji statistik chi-square test pada R tahapannya sebagai berikut
table(data_intro$Produk,data_intro$Tingkat.Kepuasan)
chisq.test(table(data_intro$Produk,data_intro$Tingkat.Kepuasan))
Perintah table untuk melihat tabulasi antar variabel kategorik, sedangkan
perintah chisq.test digunakan untuk melihat hubungan secara statistik.
Dengan hipotesis sebagai berikut :

 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))

Hubungan Antara Variabel Kategorik dan Variabel


Numerik
Hubungannya diantara keduanya dapat dilihat dengan membandingkan rata-rata pada
setiap kategori. Jika nilai rata-ratanya berbeda maka kedua variabel memiliki hubungan.
Pada hubungan antara variabel kategorik dan numerik tidak bisa diketahui seberapa kuat
hubungan diantara keduanya dan bagimana pengaruhnya (positif atau negatif).
Untuk mengetahui ada hubungan atau tidaknya menggunakan uji statistik t-test, dengan
hipotesis sebagai berikut

 Null hipotesis: tidak ada hubungan antara kedua variabel


 Hipotesis Alternatif alternatif: ada hubungan antara kedua variabel

Hubungan Jenis Kelamin dengan Total Belanja


dengan t.test
Berdasarkan kasus diatas kita akan melihat hubungan antara data kategorik dan numerik,
yaitu variabel jenis kelamin dan total belanja. Sebelum menguji hubungannya, sebaiknya
dilihat perbedaan rata-rata total belanja untuk laki-laki dan perempuan dengan visualisasi
yaitu menggunakan boxplot. Boxplot grafik statistik dari data dengan komponen lima ukuran
statistik yaitu Min, Q1,Q2, Q3, dan Max. Untuk lebih jelasnya mengenai boxplot dapat dilihat
gambar dibawah ini

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

## carilah boxplot antara variabel jenis kelamin dengan total belanja

boxplot(Total~Jenis.Kelamin, data= data_intro)


## analisis bagaimana hubungan jenis kelamin dengan total belanja mengunakan uji statistik t-
test

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.

Data Visualization in Data Science using R

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

 Apa dan kenapa diperlukan ggplot2


 Plot: Dasar "Kanvas" untuk Grafik
 Melengkapi Plot dengan Data dan Aesthetic Mapping
 Menggambar dengan Layer
 Scatter Plot dan Pengaturan Warna
 Visualisasi Trend dengan Grafik Line Chart
 Membuat Bar Chart
 Melihat Komposisi dengan Pie Chart
 Histogram untuk Menampilkan Distribusi Kepadatan Penduduk Jakarta
 Membagi Grafik dengan Faceting

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.

Konsep Komponen di ggplot2


Kekuatan ggplot adalah memiliki definisi yang jelas untuk komponen-komponen visual
sehingga dapat digunakan untuk membangun visualisasi yang lengkap.
Sebagai contoh, cobalah kita lihat grafik di bawah ini – yang berisi informasi tingkat
kepadatan penduduk dibandingkan dengan luas wilayah di propinsi DKI Jakarta.

Ada empat komponen ggplot2 pada grafik tersebut, yaitu plot, data, aesthetic


mapping dan layer.
Plot
Paling awal adalah adanya plot atau "kanvas" kosong dimana berbagai grafik  dapat
"digambar" di atasnya.
Plot dapat dihasilkan dengan function bernama ggplot.
Catatan Penting: Bedakan antara ggplot2 sebagai package dan ggplot sebagai function disini.
Data dan Aesthetic Mapping
Sebelum digambar, kanvas ini tentunya perlu memiliki data yang akan ditampilkan. Berikut
adalah data yang kita gunakan untuk contoh grafik di atas. Data ini adalah data
kependudukan dari Pemerintah Provinsi DKI Jakarta tahun 2013 yang diambil dari situs
data.go.id.
 

 
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:

 ggplot2 sebagai package untuk visualisasi data di R.


 pendekatan yang digunakan untuk ggplot2 adalah dengan suatu struktur tata bahasa
(grammar) dimana komponen-komponen grafik dinamakan dengan detil dan jelas.
 komponen-komponen penting di ggplot2 adalah plot, data, aesthetic mapping dan
layer – yang merupakan komponen minimal untuk menghasilkan suatu grafik.

Dasar "Kanvas" untuk Grafik


Pendahuluan
Plot adalah komponen paling dasar di ggplot2, tanpa plot seluruh grafik tidak akan bisa
ditampilkan. Dengan demikian, plot dapat dianalogikan sebagai "kanvas" gambar kita. Plot
dibuat dengan function ggplot. Dan jika tidak digabungkan dengan komponen lain, maka
tampilannya akan terlihat sebagai kotak persegi kosong dengan latar belakang abu-abu
seperti gambar 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.

Membuat Kanvas Kosong


Untuk membuat plot, kita akan gunakan function ggplot. Function ini akan menghasilkan
gambar sebagai berikut.

library(ggplot2)

#Ketik function ggplot() di bawah ini


ggplot()
Menambahkan Judul
Setiap orang akan sangat terbantu melihat suatu grafik apabila memiliki judul yang jelas. Ini
dapat ditambahkan di ggplot dengan fungsi labs(title = "....").
Contoh perintah (syntax) dari labs adalah sebagai berikut:

[objek plot] + labs(title="Judul")

Berikut adalah penjelasan lengkap elemen-elemen perintah di atas.


Komponen Deskripsi
Objek plot, untuk saat ini adalah objek yang dihasilkan
[objek plot]
oleh function ggplot()
Tanda plus, operator untuk menambahkan komponen
+
lain ke dalam plot
Function untuk menghasilkan komponen label text
labs
untuk ditambahkan ke dalam plot
title Parameter judul, bagian dari function labs
Nilai teks untuk judul, ini bisa diganti sesuai keinginan
" Judul"
kita

library(ggplot2)

#Penambahan judul dengan menggunakan fungsi labs


ggplot() + labs( title = "Luas Wilayah vs Kepadatan Penduduk DKI Jakarta - Periode 2013")

Plot disimpan sebagai Variable


Komponen plot dan layer bisa disimpan saja dalam satu variable. Berikut adalah contoh
perintah dimana kita memiliki satu variable bernama plot.jakarta yang menyimpan plot dan
judul. Kemudian menampilkan grafik dengna hanya menuliskan nama variable tersebut.

plot.jakarta <- ggplot()


plot.jakarta <- plot.jakarta + labs(title="Luas Wilayah vs Kepadatan Penduduk DKI
Jakarta - Periode 2013")
plot.jakarta
library(ggplot2)

plot.jakarta <- ggplot()

plot.jakarta <- plot.jakarta + labs(title="Luas Wilayah vs Kepadatan Penduduk DKI Jakarta -


Periode 2013")
plot.jakarta

Menambahkan Label pada Sumbu X dan Y


Function labs yang sudah diperkenalkan pada tiga praktek sebelumnya bukan hanya bisa
diisi dengan judul dan subjudul, tapi bisa juga untuk mengisi teks pada sumbu x dan y.
Berikut adalah konstruksi perintahnya:
[objek plot] + labs(x="Label X", y = "Label Y")
Berikut adalah penjelasan lengkap elemen-elemen perintah di atas.
Komponen Deskripsi
Objek plot, untuk saat ini adalah objek yang dihasilkan
[objek plot]
oleh function ggplot()
Tanda plus, operator untuk menambahkan komponen
+
lain ke dalam plot
Function untuk menghasilkan komponen label text
labs
untuk ditambahkan ke dalam plot
x Parameter untuk sumbu x, bagian dari function labs
"Label X" Nilai teks untuk x, ini bisa diganti sesuai keinginan kita
subtitle Parameter untuk sub judul, bagian dari function labs
"Label Y" Nilai teks untuk x, ini bisa diganti sesuai keinginan kita
 
Catatan: Function labs ini bisa digunakan berkali-kali pada plot. Ini artinya kita bisa
menambahkan x dan y pada function labs sebelumnya, atau menambahkan function labs
baru untuk mengisi label x dan y.

library(ggplot2)

plot.jakarta <- ggplot()


plot.jakarta <- plot.jakarta + labs(title="Luas Wilayah vs Kepadatan Penduduk DKI Jakarta -
Periode 2013", subtitle="Tahun 2013")

plot.jakarta <- plot.jakarta + labs ( x="Luas Wilayah(km2)", y="Kepadatan Jiwa per km2")
plot.jakarta

Fungsi summary untuk objek ggplot


Tidak setiap saat kita harus menganalisa plot dan komponennya dengan cara ditampilkan.
Ketika sudah disimpan di variable, kita bisa melihat detilnya dalam bentuk tekstual dengan
menggunakan fungsi summary.
Mari kita langsung praktekkan saja melalui tugas berikut.
Tugas Praktek
Perhatikan seluruh perintah yang ada pada code editor, ini merupakan kumpulan code yang
telah kita pelajari pada bab ini.
Pada baris terakhir terdapat penggunaan fungsi summary dengan input
variable plot.jakarta. Ini untuk menampilkan detil apa saja yang terdapat di dalam sebuah
plot.
Jika berhasil dijalankan, maka hasilnya akan terlihat sebagai berikut. Untuk saat ini, tidak
ada yang perlu dijelaskan kecuali mengenal fungsi ini sebagai alat untuk menganalisa objek-
objek plot kita. Kita akan menggunakan function ini lebih detil di bab berikutnya.

data: [x]
faceting: facet_null()

library(ggplot2)

plot.jakarta <- ggplot()

plot.jakarta <- plot.jakarta + labs(title="Luas Wilayah vs Kepadatan Penduduk DKI Jakarta")

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:

 Teks judul dengan fungsi labs(title="...").


 Teks pada sumbu x dan y dengan fungsi labs(x="...", y="...").

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.

Data dan Aesthetic Mapping


Pendahuluan
Plot bisa menerima input data, dan dari data tersebut bisa dipilih beberapa kolom yang akan
"dipetakan" sebagai input untuk komponen visual.
Untuk jelasnya, mari kita lihat data yang dibuka dengan aplikasi Excel pada gambar berikut.
Data ini adalah data luas wilayah dan kependudukan pemerintah provinsi DKI Jakarta.

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.

Dataset Kepadatan Penduduk Jakarta


Dataset yang akan kita gunakan sepanjang praktek course ini adalah data wilayah dan
kepadatan kependudukan pemerintah provinsi DKI Jakarta tahun 2013. Sumber dataset ini
dapat didownload dari data.go.id, dengan url lengkap berikut:
https://data.go.id/dataset/kepadatandluaswilayahperkelurahandkijakarta
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?
 
Dataset ini telah diunduh dan ditempatkan di https://storage.googleapis.com/dqlab-
dataset/dkikepadatankelurahan2013.csv. Tindakan ini dilakukan karena jika ada
pembaruan akan ada kemungkinan yang menyebakan perubahan kolom-kolom yang ada
di dataset.
 
Nah, atas dasar itulah data kependudukan dipilih untuk course visualisasi data kali ini.
Berikut adalah tampilan data kependudukan DKI Jakarta tersebut jika dibuka di aplikasi
Notepad. Perhatikan tanda pemisah antar kolom menggunakan koma.
Dan ini adalah tampilan jika data tersebut dibuka di aplikasi Excel.

Data tersebut memiliki 25 variable kolom dengan penjelasan sebagai berikut:


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. 35-39 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 35-39 tahun
9. 35-39 Perempuan: Jumlah penduduk perempuan dengan rentang umur 35-39 tahun
10. 40-44 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 40-44 tahun
11. 40-44 Perempuan: Jumlah penduduk perempuan dengan rentang umur 40-44 tahun
12. 45-49 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 45-49 tahun
13. 45-49 Perempuan: Jumlah penduduk perempuan dengan rentang umur 45-49 tahun
14. 50-54 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 50-54 tahun
15. 50-54 Perempuan: Jumlah penduduk perempuan dengan rentang umur 50-54 tahun
16. 55-59 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 55-59 tahun
17. 55-59 Perempuan: Jumlah penduduk perempuan dengan rentang umur 55-59 tahun
18. 60-64 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 60-64 tahun
19. 60-64 Perempuan: Jumlah penduduk perempuan dengan rentang umur 60-64 tahun
20. 65-69 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 65-69 tahun
21. 65-69 Perempuan: Jumlah penduduk perempuan dengan rentang umur 65-69 tahun
22. 70-74 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur 70-74 tahun
23. 70-74 Perempuan: Jumlah penduduk perempuan dengan rentang umur 70-74 tahun
24. >75 Laki-Laki: Jumlah penduduk laki-laki dengan rentang umur di atas 75  tahun
25. >75 Perempuan: Jumlah penduduk perempuan dengan rentang umur di atas 75
tahun  

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.

Membaca Dataset Kependudukan dengan


read.csv
Langkah pertama yang perlu kita lakukan adalah membaca dataset kependudukan tersebut
dari file teks menjadi data.frame di R dengan perintah read.csv.
Mari kita praktekkan penggunaan read.csv ini dengan mengetikkan perintah berikut pada
code editor.

penduduk.dki <-
read.csv("https://storage.googleapis.com/dqlab-dataset/dkikepadatankelurahan2013.csv"
, sep=",")
Berikut adalah penjelasan dari perintah di atas
Komponen
Deskripsi

penduduk.dki nama variable yang digunakan untuk


menampung data dari contoh
dataset

read.csv function yang digunakan untuk


membaca contoh dataset yang
berupa file

https://storage.googleapis.com/dqlab- lokasi dataset yang terdapat di web


dataset/dkikepadatankelurahan2013.csv 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

sep="," Parameter pemisah (separator) antar


kolom data. Kita gunakan tanda
koma untuk dataset penduduk DKI
Jakarta.

 
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

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.
Perhatikan jika nama kolom asal terdapat karakter yang bukan angka atau hurud, akan
diubah menjadi tanda titik setelah dibaca dengan read.csv.
Sebagai contoh, "NAMA PROVINSI" diubah menjadi "NAMA.PROVINSI", "LUAS WILAYAH
(KM2)" diubah menjadi "LUAS.WILAYAH..KM2.".
Catatan: Walaupun nama kolom ini terlihat tidak standar dan tidak menyenangkan, kita akan
biarkan nama kolom tetap seperti ini tanpa melakukan proses cleansing. Tetapi pada saat
plotting, seperti telah ditunjukkan pada bab sebelumnya, kita bisa memberi label text sesuai
keinginan kita. Disitulah kesempatan kita untuk merapikan tampilan teks dari kolom.
Jika kita hanya ingin menampilkan beberapa kolom tertentu, misalkan untuk kolom
"NAMA.KECAMATAN" dan "NAMA.KELURAHAN" maka perintahnya adalah sebagai berikut.

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)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")

# Tampilkan data frame dari kolom " NAMA.KELURAHAN " dan "LUAS.WILAYAH..KM2."

penduduk.dki[c("NAMA.KELURAHAN", "LUAS.WILAYAH..KM2.")]

Memasukkan Data ke Plot


Data dapat dimasukkan ke dalam plot melalui argumen di function ggplot dengan syntax
berikut.
ggplot(data = …)
Untuk contoh data kependudukan kita, maka perintah lengkapnya adalah sebagai berikut.
ggplot(data = penduduk.dki)
library(ggplot2)

#Membaca data csv dan dimasukkan ke variable penduduk.dki


penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")

# Masukkan data ke dalam plot dan simpan sebagai variable plot.dki, dan tampilkan summary dari plot
tersebut

plot.dki <- ggplot(data = penduduk.dki)

summary(plot.dki)

Memetakan x, y dan color dengan function aes


Setelah data dimasukkan pada plot, saatnya kita memetakan kolom yang diperlukan pada
data tersebut ke elemen visual. Pemetaan ini disebut dengan aesthetic mapping.
Untuk melakukan hal ini, kita gunakan function aes yang memiliki syntax berikut.

aes([nama_elemen_1] = [nama_kolom_atau_nilai_ 1], [nama_elemen_2] =


[nama_kolom_atau_nilai_ 1] …)

Berikut adalah penjelasan syntaxnya.

Komponen Deskripsi

Aes Function untuk memetakan elemen-elemen


visual dengan nilai atau variable

[nama_elemen_1] Nama elemen visual sebagai parameter


pertama. Nama elemen ini bisa x, y dan color
yang akan kita gunakan di tugas praktek.

[nama_kolom_atau_nilai_1] Nama kolom yang terdapat pada data atau


nilai konstanta. Sebagai contoh, untuk nama
kolom bisa NAMA.KECAMATAN sedangkan
untuk nilai konstanta bisa dimasukkan nilai
teks maupun angka.

[nama_elemen_2] Nama elemen visual sebagai parameter


kedua. Nama elemen ini bisa x, y dan color
yang akan kita gunakan di tugas praktek.

[nama_kolom_atau_nilai_2] Nama kolom yang terdapat pada data atau


nilai konstanta. Sebagai contoh, untuk nama
kolom bisa NAMA.KELURAHAN sedangkan
untuk nilai konstanta bisa dimasukkan nilai
teks maupun angka.

… Pasangan nama elemen dan variable/nilai


lainnya.

 
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)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")

ggplot <- (data = penduduk.dki)

aes(x = LUAS.WILAYAH..KM2., y =KEPADATAN..JIWA.KM2., color=NAMA.KABUPATEN.KOTA)

summary(plot.dki)

Menampilkan Plot hasil Mapping


Masih terkait dengan praktek sebelumnya, ada pertanyaan yang muncul di benak kita.
Seperti apa tampilan dari plot yang telah dilengkapi dengan data dan aesthetic mapping?
Untuk menjawab hal ini, cobalah jalankan tugas praktek berikut.
library(ggplot2)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")

plot.dki <- ggplot(data=penduduk.dki, aes(x = LUAS.WILAYAH..KM2., y=KEPADATAN..JIWA.KM2.,


color=NAMA.KABUPATEN.KOTA))

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).

Layer untuk Grafik Pertama: Scatter Plot


Pendahuluan
Mengulang kembali sedikit konsep yang telah dipaparkan di bab awal, grafik bisa dihasilkan
dengan menambahkan layer secara berlapis di atas plot.
Setiap layer terdiri dari 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. 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

Scatter Plot Kepadatan Penduduk Jakarta


dengan function layer
Untuk menggambar grafik sebenarnya pada ggplot, kita menambahkan apa yang dinamakan
layer. Layer bisa dihasilkan dengan menggunakan function layer dengan syntax berikut:

layer(geom = "…", stat = "…", position = "…")

Keterangan
Komponen Deskripsi

Layer Function yang digunakan untuk membentuk layer


untuk ditambahkan pada plot

geom Bentuk geometri yang digunakan untuk layer.


Beberapa daftar geometri yang bisa diberikan adalah
sebagai berikut:

 point: untuk menggambar grafik berupa titik


yang menunjukkan hubungan antar variable
atau scatter plot
 line: diagram garis
 hline: diagram garis horizontal
 bar: diagram batang
 histogram: histogram
 dll

stat Jenis transformasi untuk merubah data dari bentuk


asli ke bentuk lain. Beberapa daftar stat yang bisa
digunakan antara lain adalah sebagai berikut:

 identity: tidak melakukan transformasi


 bin: membagi data menjadi interval
 sum: menjumlahkan nilai-nilai yang unik
 summary: melakukan summary dari semua
nilai y untuk setiap titik data x
 dll

position Perubahan posisi terhadap tiap titik yang terdapat


pada layer. Beberapa daftar position yang bisa
digunakan antara lain adalah sebagai berikut:

 identity: tidak ada perubahan posisi


 jitter: merubah posisi dengan jarak acak
tertentu dari posisi awal, ini digunakan untuk
memberi kejelasan jika banyak titik
yang overlapping (saling tindih)
 stack: menyusun posisi dalam bentuk
tumpukan
 dll
Jika kita ingin menggambar scatter plot, maka konstruksi layer yang digunakan akan
berbentuk sebagai berikut:

layer(geom = "point", stat = "identity", position = "identity")

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))

#Menambahkan layer untuk menghasilkan grafik scatter plot


plot.dki + layer(geom = "point", stat="identity", position="identity")

Scatter Plot Kepadatan Penduduk Jakarta


dengan geom_point
Perintah layer untuk menggambar scatter plot pada subbab sebelumnya, memiliki shortcut
function yang lebih pendek. Function tersebut bernama geom_point.
Dengan demikian, fungsi layer yang sebelumnya harus diketik sebagai berikut.

layer(geom = "point", stat = "identity", position = "identity")

dapat dirubah menjadi

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=",")

#Menambahkan data dan aesthetic mapping


plot.dki <- ggplot(data=penduduk.dki, aes(x = LUAS.WILAYAH..KM2.,
y=KEPADATAN..JIWA.KM2., color=NAMA.KABUPATEN.KOTA))

#Menambahkan layer scatter plot dengan geom_point


plot.dki + geom_point()

Menambahkan Judul dan Label


Scatter plot yang dihasilkan sudah menarik untuk kita, namun label teks pada x, y dan color
masih terasa kurang bagus. Bukankah begitu? Mari kita perhatikan.

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.

 title = "Luas Wilayah vs Kepadatan Penduduk DKI Jakarta".


 x = "Luas wilayah (km2)"
 y = "Kepadatan Jiwa per km2"
 color = "Nama Kabupaten/Kota"

Jika berjalan lancar harusnya didapatkan hasil sebagai berikut.


Catatan: Pada code terdapat perintah baru, yaitu theme(plot.title =
element_text(hjust=0.5)). Ini adalah code untuk menempatkan judul di tengah plot.
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))

#Menambahkan Layer dan labels


plot.dki + geom_point() +
theme(plot.title = element_text(hjust=0.5)) +
labs(title="Luas Wilayah vs Kepadatan Penduduk DKI Jakarta", x="Luas Wilayah(km2)",
y="Kepadatan Jiwa per km2", color="Nama Kabupaten/Kota")

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.

Layer geom_histogram dan Lebar Interval


Untuk menghasilkan histogram maka kita gunakan function geom_histogram untuk
ditambahkan ke plot.
Layer histogram ini memerlukan stat bertipe bin, yaitu membagi data menjadi interval.
Namun dengan penggunaan geom_histogram, stat ini sudah menjadi bin secara default jadi
tidak perlu lagi dispesifikasikan.
Secara default geom histogram tidak memerlukan aesthetic mapping untuk sumbu y, cukup
menggunakan sumbu x.
Namun ada parameter yang perlu diinput, yaitu besarnya interval bin. Ini menggunakan
parameter binwidth.
Contoh untuk membuat layer geom_histogram adalah sebagai berikut.
[objek plot] + geom_histogram(binwidth=5000)
Komponen Deskripsi
Objek plot dari hasil function ggplot() ditambah dengan
[objek plot]
komponen visual atau layer
Tanda plus, operator untuk menambahkan komponen
+
lain ke dalam plot
Function untuk menghasilkan layer dengan geom
geom_histogram
histogram
binwidth Lebar interval data, dalam hal ini 5000

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 = KEPADATAN..JIWA.KM2.))


plot.dki + geom_histogram(binwidth=10000)

Penggunaaan aesthetic fill


Kita dapat melakukan banyak penambahan informasi pada histogram sebelumnya. Salah
satunya adalah melihat porsi jumlah kelurahan berdasarkan nama kabupaten / kota pada
tiap rentang histogram sepreti berikut.
 
Untuk ini kita menggunakan aesthetic fill dengan syntax berikut.
 aes(fill = NAMA.KABUPATEN.KOTA)
Catatan: aesthetic color sebenarnya juga bisa digunakan namun hasilnya akan tampak
sebagai berikut.
Tugas Praktek
Lengkapi code editor dimana histogram yang dihasilkan bisa ditambahkan dengan aesthetic
fill – input berupa kolom NAMA.KABUPATEN.KOTA.

library(ggplot2)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <-
read.csv("https://academy.dqlab.id/dataset/dkikepadatankelurahan2013.csv", sep=",")

plot.dki <- ggplot(data=penduduk.dki, aes(x = KEPADATAN..JIWA.KM2., fill =


NAMA.KABUPATEN.KOTA))

plot.dki + geom_histogram(binwidth = 10000)

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:

 Bulan: bulan dan tahun data inflasi.


 Negara: negara yang mengalami inflasi.
 Inflasi: tingkat inflasi dalam persentase.

File ini berbentuk csv dan akan dibaca dengan menggunakan function read.csv.

Membaca data inflasi


Langkah pertama yang perlu kita lakukan adalah membaca dataset inflasi tersebut dari file
teks menjadi data.frame di R dengan perintah read.csv.
Berdasarkan keterangan mengenai dataset ini dan praktek di dua bab sebelumnya, kita
langsung lakukan praktek sebagai berikut.
Tugas Praktek
Ganti bagian […] dengan kedua perintah berikut pada code editor yang berfungsi untuk
membaca dan menampilkan data inflasi .
inflasi.indo.sing <-
read.csv("https://storage.googleapis.com/dqlab-dataset/inflasi.csv", sep=",")
inflasi.indo.sing
Jika berjalan lancar, maka hasil yang didapatkan adalah sebagai berikut.

#Membaca data csv dan dimasukkan ke variable inflasi.indo.sing

inflasi.indo.sing <- read.csv("https://academy.dqlab.id/dataset/inflasi.csv", sep=",")

inflasi.indo.sing

Error pada saat Plotting Line Chart


Untuk membuat line chart dari data inflasi, kita lakukan langkah-langkah dari ggplot2:

 Membuat plot, dengan function ggplot()


 Mengisi data dari pembacaan file dengan function read.csv()
 Membuat aesthetic mapping, dengan function aes
 Menambahkan layer, dengan function geom_line()

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

inflasi.indo.sing <- read.csv("https://academy.dqlab.id/dataset/inflasi.csv", sep=",")

#Menambahkan data dan aesthetic mapping

plot.inflasi <- ggplot(data=inflasi.indo.sing, aes(x = Bulan, y=Inflasi, color=Negara))

#Menambahkan layer

plot.inflasi + geom_line()

Menggunakan Pengelompokan Data (grouping)


Pada praktek sebelumnya, kita tidak mendapatkan grafik trend inflasi dari negara Indonesia
dan Singapura. Hasil akhirnya terlihat sebagai berikut.

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)

#Membaca data csv dan dimasukkan ke variable inflasi.indo.sing

inflasi.indo.sing <- read.csv("https://academy.dqlab.id/dataset/inflasi.csv", sep=",")


#Menambahkan data dan aesthetic mapping

plot.inflasi <- ggplot(data=inflasi.indo.sing, aes(x = Bulan, y=Inflasi, color=Negara, group=Negara))

#Menambahkan Layer

plot.inflasi + geom_line()

Memperbaiki Urutan Bulan dengan Factoring


Urutan bulan yang salah pada praktek sebelumnya karena masalah pengurutan internal di
sistem R, yang mengurutkan berdasarkan alphabet.
Jika kita lihat internal struktur dengan function str, maka untuk kolom bulan terlihat sebagai
berikut.

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.

factor(inflasi.indo.sing$Bulan, levels = c("Jan-2017", "Feb-2017", "Mar-2017", "Apr-


2017", "May-2017", "Jun-2017", "Jul-2017", "Aug-2017", "Sep-2017", "Oct-2017"))

Ini perlu dimasukkan kembali ke kolom bulan untuk merubah urutannya dengan perintah
berikut.

inflasi.indo.sing$Bulan <- factor(inflasi.indo.sing$Bulan, levels = c("Jan-2017",


"Feb-2017", "Mar-2017", "Apr-2017", "May-2017", "Jun-2017", "Jul-2017", "Aug-2017",
"Sep-2017", "Oct-2017"))

Tugas Praktek
Gantilah bagian […] dengan factoring sehingga hasil output terakhir yang tampil adalah
sebagai berikut, sehingga data akan siap untuk ditampilkan.

library(ggplot2)

#Membaca data csv dan dimasukkan ke variable inflasi.indo.sing

inflasi.indo.sing <- read.csv("https://academy.dqlab.id/dataset/inflasi.csv", sep=",")


inflasi.indo.sing$Bulan = factor(inflasi.indo.sing$Bulan, levels = c("Jan-2017", "Feb-2017", "Mar-2017",
"Apr-2017", "May-2017", "Jun-2017", "Jul-2017", "Aug-2017", "Sep-2017", "Oct-2017"))

str(inflasi.indo.sing)

Plotting Ulang dengan hasil Factoring


Dengan proses perbaikan pengurutan yang telah kita lakukan sebelumnya, saatnya kita
plotting ulang data inflasi kita.
Tugas Praktek
 yang ada pada code editor, ini merupakan kumpulan code yang telah kita lakukan dan
perbaiki sepanjang bab ini. Tapi pada code ini juga ditambahkan layer geom text yang
digunakan untuk menandai label-label nilai pada titik di line chart.
Jalankan langsung code tersebut tanpa perubahan atau tambahan apapun. Anda harusnya
mendapatkan grafik sebagai berikut.

library(ggplot2)

#Membaca data csv dan dimasukkan ke variable inflasi.indo.sing

inflasi.indo.sing <- read.csv("https://academy.dqlab.id/dataset/inflasi.csv", sep=",")

inflasi.indo.sing$Bulan = factor(inflasi.indo.sing$Bulan,

levels = c("Jan-2017", "Feb-2017", "Mar-2017", "Apr-2017", "May-2017", "Jun-2017",


"Jul-2017", "Aug-2017", "Sep-2017", "Oct-2017"))

#Menambahkan data dan aesthetic mapping

plot.inflasi <- ggplot(data=inflasi.indo.sing, aes(x = Bulan, y=Inflasi, color=Negara, group=Negara))

#Menambahkan Layer dan labels

plot.inflasi + geom_line() + geom_text(aes(label=Inflasi),hjust=-0.2, vjust=-0.5)


Kesimpulan
Line chart menggunakan geom line telah kita praktekkan pada bab untuk menampilkan tren
inflasi negara Indonesia dan Singapura untuk periode Januari s/d Oktober 2017.
Terlihat juga bahwa dataset yang kita baca dari file teks ini tidak bisa langsung digunakan
begitu saja karena ada urutan data pada kolom Bulan yang perlu diubah.
Dengan treatment data yang baik dan dengan penambahan aesthetic baru – yaitu grouping –
kita telah menyelesaikan pembuatan line chart sederhana dengan ggplot.

Bar Chart dan Pie Chart


Pendahuluan
Dengan praktek yang telah kita lakukan untuk menghasilkan scatter plot dan line chart, kita
melangkah ke praktek untuk membuat bar chart dan pie chart.
Bar chart atau grafik batang adalah salah satu tipe visualisasi yang sudah umum digunakan
yang sangat baik untuk melakukan perbandingan data multi kategori. Sedangkan pie chart
sangat berguna untuk melihat rasio.
Kita kembali akan menggunakan dataset kependudukan Jakarta, namun telah dirubah untuk
kepentingan kedua chart ini.
Klik tombol Next untuk melanjutkan ke materi.

Dataset Kependudukan Jakarta versi DQLab


Pada dataset asli kependudukan Jakarta, terdapat kolom-kolom jumlah penduduk per
kabupaten yang tersebar ke banyak kolom dengan pembagian umur dan jenis kelamin di
nama kolom, seperti terlihat pada gambar berikut.

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.

Menghasilkan Bar Chart Pertama


Untuk menghasilkan bar chart kita bisa gunakan function geom_bar. Function ini akan
menghasilkan sebuah layer untuk kita tambahkan ke plot.
Secara default, stat yang digunakan oleh geom_bar adalah count sehingga bar chart hanya
akan menghitung jumlah baris data point per x, dan tidak membutuhkan aesthetic
mapping y.
Berikut adalah contoh perintah dimana kita menghasilkan bar chart dengan dataset
kependudukan DKI Jakarta.

plot.dki <- ggplot(data=penduduk.dki, aes(x = JENIS.KELAMIN))


plot.dki + geom_bar()

Ini akan menghasilkan gambar chart berikut. 


 
Kelihatan aneh karena jumlah baris data untuk Laki-laki dan Perempuan di dataset kita
seimbang. Dan karena stat untuk geom bar adalah count, maka yang ditampilkan adalah
jumlah baris data. Ini akan kita rubah pada praktek selanjutnya.
 
Tugas Praktek
Di dalam code editor telah tersedia code untuk membaca dataset baru kita. Lengkapi […]
dengan code yang sesuai sehingga dapat menghasilkan bar chart berikut.
library(ggplot2)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/datakependudukandki-dqlab.csv", sep=",")

plot.dki <- ggplot(data=penduduk.dki, aes(x=NAMA.KABUPATEN.KOTA))

plot.dki + geom_bar()

Aesthetic Y dan Stat Identity


Pada praktek sebelumnya, bar chart kita masih mirip dengan histogram. Dan itu bukan yang
kita inginkan.
Kita akan memplot bar chart, dimana aesthetic y menggunakan stat penjumlahan (sum) -
bukan count - dari data kepadatan penduduk.
Ini bisa dilakukan dengan mengisi dua hal berikut:

 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)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/datakependudukandki-dqlab.csv", sep=",")

#Menghasilkan bar chart

#Membuat plot

plot.dki <- ggplot(data=penduduk.dki, aes(x = NAMA.KABUPATEN.KOTA, y=JUMLAH))


#Menambahkan layer pada plot

plot.dki + geom_bar(stat="identity")

Aesthetic Fill dan Position Dodge


Pada subbab sebelumnya, kita melihat efek pergantian nilai stat pada geom_bar dari count
(nilai default) menjadi identity untuk mendapatkan total penjumlahan dari angka jumlah
penduduk. Saatnya kita bisa lebih memperbaiki bar chart kita dengan informasi grouping
seperti berikut.

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:

 Aesthetic fill pada objek plot perlu diberikan input kolom JENIS.KELAMIN.


fill=JENIS.KELAMIN
 Agar data antara Laki-laki dan Perempuan tidak menjadi satu bar, position pada layer
kita isi dengan nilai dodge – dimana objek satu dengan objek yang lain diposisikan
bersisian.
position="dodge"

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)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/datakependudukandki-dqlab.csv", sep=",")

#Bagian plot

plot.dki <- ggplot(data=penduduk.dki, aes(x = NAMA.KABUPATEN.KOTA, y=JUMLAH,fill=JENIS.KELAMIN))


#Bagian penambahan layer

plot.dki + geom_bar(stat="identity", position="dodge")

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

Untuk lebih jelasnya, kita langsung gunakan contoh sebagai berikut:

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

aggregate Fungsi aggregate yang akan


menghasilkan data.frame baru

x=list(RATARATA=penduduk.dki$JUMLAH) Parameter x diisi dengan list.


Kebetulan listnya isinya adalah 1
variable bernama RATARATA yang
diambil dari kolom
penduduk.dki$JUMLAH

FUN=mean Fungsi yang digunakan adalah rata-


rata (mean) untuk summary

by = list( Dua kolom group by digunakan


yaitu NAMA.KABUPATEN.KOTA dan
NAMA…..KELAMIN)
JENIS.KELAMIN

Jika dijalankan perintahnya akan menghasilkan data frame berikut:


 
Tugas Praktek
Di dalam code editor telah tersedia code yang perlu kita lengkapi. Ganti bagian […] dengan
function aggregate dari teks lesson di atas, namun dengan fungsi sum. Kemudian nama
RATARATA diganti dengan JUMLAH.
library(ggplot2)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/datakependudukandki-dqlab.csv", sep=",")

#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))

"Merapikan" Tampilan Bar Chart


Kalau kita perhatikan grafik bar chart yang telah kita hasilkan. Masih ada beberap hal yang
perlu dirapikan. Selain penamaan label, contoh perapian yang perlu kita lakukan adalah
memperbaiki posisi isi data pada sumbu x sehingga tidak  menumpuk, sehingga tampilannya
sebagai berikut.

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

axis.text.x = element_text(angle=45,vjust = Melakukan rotasi text data (axis.text.x)


0.5)) sebesar 45 derajat ke kiri (angle=45), dan
penempatan teks secara vertical di tengah-
tengah (vjust=0.5).
plot.title = element_text(hjust=0.5) Mengatur posisi teks pada title ke tengah
Grafik bar chart dimana posisi data yang
geom_bar(stat="identity", position="dodge") dispesifikasikan di fill, ditempatkan
bersisian (position="dodge")
Penempatan kolom JUMLAH sebagai label
label = JUMLAH untuk marking data pada aestethic
mapping
Mengatur posisi text untuk nilai data saat
geom_text(position = position_dodge(1.2))
ini di atas bar plot
 
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)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/datakependudukandki-dqlab.csv", sep=",")

#Melakukan agregasi

p <- 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))

#Plot grafik

plot.dki <- ggplot(data=p, aes(x = NAMA.KABUPATEN.KOTA, y=JUMLAH, fill=JENIS.KELAMIN, label =


JUMLAH))

plot.dki <- plot.dki + geom_bar(stat="identity", position="dodge")

plot.dki <- plot.dki + labs(title="Jumlah Penduduk DKI Jakarta Umur > 35 - Tahun 2013", x="Kabupaten /
Kota", y="Jumlah Penduduk")

plot.dki <- plot.dki + theme(axis.text.x = element_text(angle=45,vjust = 0.5), plot.title =


element_text(hjust=0.5))

plot.dki <- plot.dki + geom_text(position = position_dodge(1.2))

plot.dki

Pie Chart dengan Koordinat Polar


Pie chart adalah jenis grafik yang banyak digunakan secara umum untuk menampilkan rasio.
Dan uniknya, di ggplot2 tidak ada fungsi khusus yang menghasilkan pie chart ini.
Pie chart dihasilkan dengan proses yang cukup unik, dimana koordinat dari geom bar diubah
ke polar.
Untuk lebih jelasnya, kita gunakan contoh langkah demi langkah.
Jika kita memilik plot data kependudukan di variable p, dan kita ingin membentuk suatu
grafik geom bar yang tidak ada pemetaan x-nya, tapi sumbu y diisi dengan JUMLAH, dan
pengisian warna menggunakan NAMA.KABUPATEN.KOTA maka perintahnya adalah sebagai
berikut.
 

plot.dki <- ggplot(data=p, aes(x="", y=JUMLAH, fill = NAMA.KABUPATEN.KOTA))


plot.dki + geom_bar(width = 1, stat = "identity")

Perintah ini akan menghasilkan grafik berikut.

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)

#Membaca data csv dan dimasukkan ke variable penduduk.dki

penduduk.dki <- read.csv("https://academy.dqlab.id/dataset/datakependudukandki-dqlab.csv", sep=",")

#Melakukan agregasi

p <- aggregate(x=list(JUMLAH=penduduk.dki$JUMLAH), FUN=sum, by =


list(NAMA.KABUPATEN.KOTA=penduduk.dki$NAMA.KABUPATEN.KOTA))
#Plot grafik pie chart

plot.dki <- ggplot(data=p, aes(x="", y=JUMLAH, fill = NAMA.KABUPATEN.KOTA))

plot.dki <- plot.dki + geom_bar(width = 1, stat = "identity")

plot.dki <- plot.dki + coord_polar("y", start=0)

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.

Membagi Grafik dengan Faceting


Pendahuluan: Apa dan kenapa Faceting?
Faceting pada ggplot2 adalah:

 proses pembagian dataset menjadi potongan beberapa subset data


 dan menghasilkan visualisasi dari potongan-potongan tersebut
 dengan tujuan agar data lebih mudah dimengerti

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.

Faceting pada Scatter Plot


Ada dua function untuk facet, yaitu facet_wrap dan facet_grid. Kedua function tersebut
fungsinya sama, yaitu membagi subset menjadi layout kotak matrix seperti pada contoh di
teks pengenalan.
Functiono facet_grid memerlukan dua variable, misalkan provinsi dan kabupaten untuk
membagi dataset. Sedangkan function facet_wrap hanya memerlukan satu variable, dataset
dibagi berdasarkan jumlah kolom yang diinginkan.
Kita akan ambil scatter plot pada bab awal untuk dataset kependudukan dan kita bagi
menjadi berdasarkan variable NAMA.KABUPATEN.KOTA dan 2 kolom dengan facet_wrap.
Konstruksi lengkap untuk contoh tersebut adalah sebagai berikut:
facet_wrap( ~ NAMA.KABUPATEN.KOTA, ncol=2)
Komponen Deskripsi
facet_wrap Fungsi faceting pada ggplot2
Facet wrap hanya menggunakan satu
~ NAMA.KABUPATEN.KOTA variable saja. Dan variable yang digunakan
diletakkan di sebelah kanan tanda ~.
ncol=2 Jumlah kolom pembagian adalah 2
 
Tugas Praktek
Di dalam code editor terdapat code lengkap perlu dilengkapi bagian […] dengan function
facet_wrap seperti pada teks lesson di atas.
Jika berjalan lancar maka grafik yang dihasilkan terlihat sebagai berikut. Terlihat kepadatan
untuk Jakarta Pusat sangat tidak berimbang dibandingkan kabupaten lainnya di DKI Jakarta.

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))

#Menambahkan layer

plot.dki <- plot.dki + layer(geom = "point", stat="identity", position = "identity")

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)

Faceting pada Histogram


Dengan menggunakan function yang sama kita juga bisa memecah histogram menjadi facet
grafik.
Tugas Praktek
Di dalam code editor terdapat code lengkap perlu dilengkapi bagian […] dengan function
facet_wrap seperti contoh pada praktek sebelumnya.
Jika berjalan lancar maka grafik yang dihasilkan adalah histogram yang sudah terpartisi
seperti terlihat berikut.
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=KEPADATAN..JIWA.KM2., fill=NAMA.KABUPATEN.KOTA))

#Menambahkan layer
plot.dki <- plot.dki + geom_histogram(binwidth=10000)

plot.dki <- plot.dki + labs(x="Kepadatan Jiwa (km2)", y="Jumlah Kelurahan", color="Kabupaten/Kota")

plot.dki + facet_wrap(~NAMA.KABUPATEN.KOTA, ncol=2)

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:

 Konsep rancangan ggplot2 sebagai grammar of graphics yang


memecah satu grafik menjadi komponen-komponen visual.
 Komponen plot sebagai kanvas dasar sebelum bisa meghasilkan
berbagai macam grafik.
 Data dan aesthetic mapping sebagai isi untuk plot dan grafik.
 Layer sebagai komponen grafik itu sendiri, yang terdiri dari geom,
stat dan position.
 Pengunaan layer dan transformasi data yang diperlukan untuk
menghasilkan scatter plot, histogram, line chart, bar chart, dan pie
chart.
 Faceting untuk memecah grafik sehingga lebih mudah dianalisa.

Dengan dasar ini kita sudah dapat menghasilkan berbagai grafik yang dapat bercerita
mengenai informasi dari data yang dikandungnya.

Fundamental Data Visualization using R

Kenapa Perlu Visualisasi Data dan


Bagaimana Caranya?
Visualisasi Data, Apa itu?
Seorang analis data seringkali menghabiskan waktunya untuk berkutat dengan data,
menganalisisnya hingga benar-benar menghasilkan kesimpulan yang tepat. Pendek kata,
yang diurusi melulu soal angka.
Namun, ada satu hal yang seringkali dilewatkan, yakni ketika harus menyajikannya kepada
orang lain yang belum tentu paham dengan data tersebut. Hal yang paling umum terjadi
adalah: data disajikan apa adanya. Misalnya, dalam bentuk grafik dengan
desain template dari aplikasi seperti Microsoft Excel. Karena menggunakan template,
tampilan data itu menjadi monoton, bikin bosan, kadang tidak pas dengan kesimpulan dan
pesan yang ingin disampaikan.
 
Permasalahan lain pun muncul, yakni ketika orang yang melihatnya salah mengartikan data.
Ini dapat terjadi karena, misalnya, data dipresentasikan tanpa narasi yang jelas. Atau, bisa
jadi tata letak dan elemen grafisnya tidak tepat sehingga audiens tersesat dari maksud dan
tujuan sang analis.
Maka dari itu, penting bagi seorang analis data untuk memvisualisasikan hasil kerjanya
dengan baik. Analis data perlu mengetahui cara menggambarkan data agar audiens
memahami konteks dari data yang disajikan.

Urgensi visualisasi data


Dari contoh sebelumnya, jelaslah bahwa penyajian data dengan visualisasi yang tepat bisa
dengan cepat mendapat perhatian audiens dan membuatnya paham tentang apa yang
disampaikan.
Itulah tujuan utama visualisasi data. Bukan sekadar membuat tampilan data yang enak
dilihat, tetapi juga harus bisa membuat data lebih mudah dipahami, jelas, dan menarik. Yang
tidak kalah penting, harus dapat meyakinkan audiens sesuai kesimpulan dan narasi yang
dibangun analis.
Pembahasan tentang visualisasi data ini dimaksudkan dengan tujuan sebagai berikut:

1. Memecahkan masalah, bukan sekadar tampil cantik. Ingatlah bahwa informasi


visual lebih bukan mengutamakan hasil akhir berupa infografik atau presentasi serba
indah. Sasarannya adalah memproses dan mengorganisasi fakta dan data,
menemukan pola, hingga menghasilkan solusi. Desain visual membantu
mengomunikasikan penyelesaian masalah itu agar mudah dipahami.
2. Fokus pada target dan audiens, bukan tools ataupun tekniknya. Modul ini tidak
mewajibkan penggunaan aplikasi tertentu ataupun teknik khusus untuk
memvisualkan data. Maka itu diperbolehkan menggunakan cara dan tools apa pun
untuk itu. Yang diutamakan adalah apa tujuan menampilkan data tersebut dan
siapakah audiensnya.
3. Panduan dan alur, bukan asal menata gambar. Urutan dan penempatan elemen
visual harus dapat memandu audiens untuk memahami masalah hingga menuju jalan
keluarnya. Memilih jenis dan ukuran huruf, warna yang tepat, mengatur tata letak
visualnya, serta mengatur pola elemen visual menjadi penting agar audiens
memahami maksud dan pesan yang dimunculkan dari data.
4. Konsep dan kerangka berpikir, bukan cuma kreativitas visual. Visualisasi data
adalah mentransfer konsep dan cara berpikir atas data dan proses analisisnya dengan
cara yang mudah dipahami oleh oleh manusia. Tujuannya adalah meyakinkan
audiens dengan konsep dan kerangka pikir yang dibangun. Data dan analisisnya
menjadi bukti penguat dan tak terbantahkan atas konsep tersebut.
5. Kontekstual. Data yang disajikan harus saling mendukung satu sama lain. Rangkaian
visual yang dibuat harus memiliki konteks yang sama dan terorganisasi dengan baik
sehingga menambah kejelasan makna dari pesan yang ingin disampaikan.

Eksploratif versus naratif


Sebelum menentukan visual yang cocok atas suatu data, seorang analis data harus
memahami siapa atau audiens yang akan membaca data tersebut. Dengan mengetahui
karakter audiens, seorang data analis akan bisa memperkirakan kepadatan data dan
informasi yang akan disajikan.
Hal itu akan memengaruhi pilihan visualisasi data, yakni visual yang mengeksplorasi data
sedetail mungkin atau grafis yang menarasikan informasi dengan ringkas dan jelas. Apa
bedanya?
 
Visual naratif seringkali digunakan untuk presentasi, biasanya statis, dan berisi ringkasan
informasi. Tujuan utamanya adalah menjelaskan hasil akhir atau kesimpulan dari analis.
Hasil tersebut bisa jadi disebarluaskan untuk banyak orang dengan berbagai tingkat
pemahaman terhadap data. Audiens tidak perlu lama-lama membacanya dan semestinya
bisa segera memahaminya. Oleh karena itu, penyajiannya cenderung menonjolkan
keindahan visual. Maka tidak heran bila informasi tidak disampaikan secara detail, misalnya
grafik tanpa legenda, label data, ataupun detail lain.
Contoh visual naratif dapat dilihat pada Gambar 1.

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

Data tidak harus ditampilkan dalam bentuk grafik.


teks dan angka saja, dengan catatan hanya 1-2 dat
Teks dan angka ditampilkan.
Beri penebalan atau warna berbeda pada angka at
ditonjolkan agar perhatian pembaca terarah pada

Line chart paling tepat digunakan untuk menunjuk


waktu. Sumbu X biasanya mewakili periode waktu
menggambarkan nilai/kuantitas. Contohnya jumla
ke pekan selama satu tahun.
Diagram garis
Grafik ini dapat memuat banyak titik data yang dap
berdekatan sesuai kerapatan periode waktu. Karen
simpel, bisa menggunakan banyak garis sekaligus
Ini memudahkan penggambaran data tren dari ber

Diagram ini merupakan pengembangan dari diagra


kerap digunakan untuk menggambarkan nilai tota
persentase dari waktu ke waktu.
Diagram area
Pemilihan warna dan volume area menjadi penting
menitikberatkan bagian mana yang ingin ditonjolk
diperhatikan saat menggunakan diagram ini adala
area yang menutupi area lain.
Disebut juga dengan bar chart, paling cocok untuk
dengan banyak kategori atau rangkaian data (data
panjang pada kategori sangat dimungkinkan dan d
Y.
Lebar batang dalam horizontal bar ditentukan dari
X. Tinggi batang sekitar dua kali celah antarbatang
Untuk jenis data kategori, jarak antarbatang tidak
karena setiap batang merupakan kategori yang be
Diagram batang suatu rangkaian data yang saling terkait. Contohny
berdasarkan produk.
Untuk kemudahan membaca data, dapat menguru
berdasarkan besar nilainya, misal dari nilai terting
Lain halnya dengan data series, di mana data didis
kategori berjenjang, misalnya populasi penduduk
usia atau tingkat pendidikan.
Urutan kategori tidak boleh diubah, harus sesuai d
Celah antarbatang dapat dipersempit hingga hamp
untuk data series seperti ini sering disebut dengan
Grafik kolom Column chart atau vertical chart bisa digunakan un
perbandingan sejumlah kategori dan atau perubah
waktu tertentu (tren).
Saat digunakan untuk menampilkan tren, fungsiny
garis (line chart). Perubahan waktu ini tecermin pa
gunakan sumbu Y untuk keterangan waktu. Cara m
kanan, jadi semakin ke kanan, waktunya semakin b
ujung waktu (urut waktu). Gunakan satu warna un
Saat digunakan untuk menampilkan beberapa kat
berbeda untuk setiap kategori. Alternatif lain, men
sama, tetapi kepekatannya bervariasi tergantung n
kategori, semakin pekat semakin menonjol.
Ingat bahwa grafik batang vertikal punya keterbata
menggambarkan komparasi kategori. Grafik ini aka
memuat terlalu banyak kategori. Susah pula dibac
kategori pada sumbu X terlalu panjang karena teks
vertikal.
Sama seperti bar chart, dapat mengurutkan penem
grafik kolom berdasarkan urutan nilainya, misalny
terendah atau sebaliknya.
Catatan penting, selalu gunakan zero baseline atau
Y.

Sekilas grafik ini mirip dengan bar/column chart. N


perbedaan mendasar antara histogram dan grafik
Pada grafik batang, baik horizontal maupun vertik
agar tidak terlalu besar. Jarak antarbatang juga dib
longgar. Ini dilakukan karena antara satu kolom/ba
menggambarkan kategori yang benar-benar berbe
sama lain, misalnya jenis produk. Urutan kategori b
Histogram berdasarkan urutan besaran nilai masing-masing k
menggunakan lebih dari satu warna untuk membe
Adapun pada histogram, jarak antarkolom/batang
mungkin, bahkan menempel. Dari segi visual, jarak
membawa mata pembaca untuk menghubungkan
data dan mengurutkannya berdasarkan kriteria ter
jenjang pendidikan dan rentang usia. Urutan kelom
boleh diacak, tetapi harus sesuai dengan jenjangny
dibuat seragam.

Nama lainnya adalah pie chart, digunakan untuk m


komposisi antarbagian pada suatu kesatuan utuh.
direpresentasikan dalam satuan persen sehingga j
dijumlahkan, hasilnya sama dengan seratus persen
Grafik lingkaran Jenis grafik ini akan mudah dipahami jika kategori
tidak banyak, misal 5 bagian. Semakin banyak bag
proposinya sangat kecil, akan kian sulit membacan
Tidak ada cara baku dalam membaca datanya, tet
akan membaca bagian paling besar karena paling
Grafik donat Grafik ini merupakan bentuk lain dari pie chart, fun
merepresentasikan proporsi atau komposisi antarb
bagian pun seratus persen.
Karena tampilannya lebih sederhana, grafik ini jug
menjadi setengah lingkaran. Uniknya, meski diben
jumlah seluruh bagiannya tetap seratus persen.
Modifikasi lainnya adalah dengan membentuknya
melingkar dan berlapis-lapis (sunburst) untuk men
data pada satu kategori.
Sama seperti pie chart, batasi banyaknya kategori
selisih nilai kategori terlalu kecil, munculkan label

Grafik ini digunakan untuk menggambarkan hubun


variabel. Masing-masing data diplot menjadi sebua
diposisikan sesuai nilai pada sumbu XY. Sumbu X m
yang tidak tergantung variabel lain, sehingga diseb
independen. Adapun nilai Y merupakan variabel de
ditempatkan pada sumbu vertikal.
Scatter plot
Yang perlu menjadi perhatian adalah, karena wuju
tersebar, bantulah audiens dengan garis rata-rata
yang menjadi standar data, misalnya target penjua
minimal.
Jenis grafik ini dapat dimodifikasi menjadi bubble
yang digunakan dapat dikombinasikan dengan var
nilainya digunakan untuk menentukan besar balon

Data pada peta terdiri dari dua unsur, yakni data sp


spasial tersebut. Data spasial berisi koordinat, min
koordinat dua dimensi (x dan y). Satu koordinat lag
ditambahkan untuk gambar tiga dimensi.
Data spasial dapat terdiri dari satu titik (point) atau
saling terhubung menjadi garis tertutup (poligon/a
Peta (polyline).
Contoh data spasial berbentuk titik adalah lokasi k
pasar. Contoh garis terbuka antara lain batas admi
dan jaringan pipa gas. Adapun contoh poligon anta
provinsi, kota, atau area khusus.
Jarak dan skala pada peta tidak melulu harus men
Dapat menyederhanakannya dalam bentuk lain ag
Grafik radar Grafik ini menampilkan data multivariabel yang dig
koordinat polar pada sumbu berbeda-beda dengan
sama. Panjang jari-jari menggambarkan nilai setia
Jumlah variabel ideal adalah 6-8 variabel. Setiap v
sumbu yang dipisahkan dalam sudut yang sama de
sehingga grafik tampak simetris.
Grafik radar bisa dipakai untuk membandingkan b
Hindari terlalu banyak kategori karena akan memb
grafik bertumpuk berlapis-lapis.

Panduan ringkas memilih grafik


Merangkum jenis-jenis grafik dan penggunaannya, berikut ini panduan singkat penggunaan
jenis grafik berdasarkan kebutuhannya.
 
Tujuan Jenis Grafik yang Cocok

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.

Gambar 1: Grafik perbandingan jumlah karyawan laki-laki dan perempuan berdasarkan


rentang usia.
 
Selain itu, pembaca sulit melihat postur jumlah karyawan berdasarkan jenis kelamin karena
jarak antarkolom jenis kelamin yang sama tampak berjauhan.
 
Bagaimana mengubah grafik ini menjadi lebih ringkas dan mudah 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.

Kelompok Usia Laki-laki Pere

21-25 tahun 45

26-30 tahun 124 1

31-35 tahun 198 2

36-40 tahun 353 3

41-45 tahun 516 4

46-50 tahun 502 3

51-55 tahun 417 1

 
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.

Visualisasi - Part 1: ggplot


Untuk membuat visualisasi dari data yang telah disediakan silakan diketikkan kembali kode
berikut di code editor
library(dplyr)

library(ggplot2)

tabel <- read.csv("https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/lo5_m01_mp01.csv")


%>%

mutate(Laki.laki = -Laki.laki) %>%

arrange(desc(Kelompok.Usia))

plt <- ggplot(data = tabel,

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() +

annotate("text", x=0.5, y=-20, hjust=1,

label="Laki-laki", colour="blue") +

annotate("text", x=0.5, y=20, hjust=0,

label="Perempuan", colour="orange") +

labs(colour = "", x = "", y = "",

title = "Perbandingan Jumlah Karyawan Laki-laki dan Perempuan\nBerdasarkan Kelompok


Usia") +

theme(axis.text = element_text(size = 12, face="bold"),

axis.text.x = element_blank(),

axis.ticks = element_blank(),

plot.title = element_text(hjust = 0, size = 16),

panel.background = element_rect(fill = "white"),

legend.position = "bottom")
options(repr.plt.width = 10, repr.plt.height = 2)

plt

Solusi Visualisasi Data 1


Grafik kolom kurang cocok untuk menampilkan banyak kategori, dalam hal ini adalah
rentang usia karyawan. Ada tujuh kelompok usia dalam tabel data, masing-masing memiliki
keterangan sebanyak 11 karakter (huruf). Jika keterangan ini dijejer pada sumbu X, akan
melebar dan makan tempat, bukan?
Pilihan yang lebih baik adalah menggunakan dua bar chart yang disusun menjadi piramida.
Jenis grafik ini dapat menempatkan batang-batang grafik menjadi lebih berdekatan sehingga
menghemat ruang tampilan. Dengan ukuran gambar yang sama seperti grafik sebelumnya,
dimungkinkan juga untuk memilih ukuran huruf lebih besar dan lebih terbaca.
Sebagai catatan, ada trik khusus untuk membuatnya di Excel. Pada contoh ini, grafik tersebut
sebetulnya terdiri dari dua grafik terpisah, masing-masing untuk laki-laki dan perempuan.
Khusus untuk grafik laki-laki, hanya perlu mengubah nilai pada sumbu X menjadi terbaca dari
kanan ke kiri (reverse order). Selain itu dapat juga mengubahnya pada jendela Format Data
Series dalam Excel.
 

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.

Gambar 1: Grafik Jumlah Produksi Per Karyawan.


 

Tujuan
1. Memilih jenis grafik yang benar
2. Menyederhanakan tampilan grafik
3. Memilah dan menonjolkan informasi yang diperlukan

 
Berikut adalah data karyawan di perusahaan.

Bulan Karyawan A Karyawan B Karyawan C Karyawan D Karyawan E

Januari 24345 30128 21039 26472 27894

Februari 25739 24678 20983 25382 28763

Maret 26489 25402 22321 28757 26748

April 23455 27320 23759 24443 26839

Mei 21093 22390 25873 32901 27110

Juni 25987 29871 21023 30211 26112

Juli 29223 28654 19420 31118 29878

Agustus 25667 27431 28999 28998 29320

September 24091 24536 25831 28752 35733


Oktober 26201 23547 26758 24379 34289

November 25890 25439 25385 24390 33741

Desember 21345 29087 25380 24879 35478

 
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.
 

Visualisasi - Part 2: ggplot


Untuk membuat visualisasi dari data yang telah disediakan silakan kamu ketikkan kembali
kode berikut di code editor:

library(dplyr)

library(ggplot2)

tabel <-
read.csv("https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/lo5_m01_mp02.csv")
%>%

mutate(Bulan = substr(Bulan, 1, 3),

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,

aes(x = factor(tabel$Bulan, levels = tabel$Bulan))) +

geom_line(aes(y = Karyawan.A, group=1,

colour = "Karyawan A"),

colour = "gray",

size = 1) +

geom_line(aes(y = Karyawan.B, group=1),

colour = "gray",

size = 1.25) +

geom_line(aes(y = Karyawan.C, group=1),

colour = "gray",

size = 0.75) +

geom_line(aes(y = Karyawan.D, group=1),

colour = "gray",

size = 1.5) +

geom_line(aes(y = Karyawan.E, group=1),

colour = "darkblue",

size = 2) +

ylim(10, 40) +

# Produktivitas tertinggi

annotate("segment", x=8.5, xend=9, y=38, yend=max(tabel$Karyawan.E),

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

annotate("segment", x=12, xend=12.15, colour="grey", size=0.5,

y=tabel$Karyawan.A[12], yend=tabel$Karyawan.A[12]-1.5) +

annotate("text", x=12.2, y=tabel$Karyawan.A[12]-1,

hjust=0, colour="grey", label="Karyawan A") +

annotate("text", x=12.2, y=tabel$Karyawan.A[12]-2,

hjust=0, colour="grey", size=3,

label=paste("avg:", toString(mean(tabel$Karyawan.A)))) +

# Karyawan B

annotate("segment", x=12, xend=12.15, colour="grey", size=0.5,

y=tabel$Karyawan.B[12], yend=tabel$Karyawan.B[12]+1.5) +

annotate("text", x=12.2, y=tabel$Karyawan.B[12]+2,

hjust=0, colour="grey", label="Karyawan B") +

annotate("text", x=12.2, y=tabel$Karyawan.B[12]+1,

hjust=0, colour="grey", size=3,

label=paste("avg:", toString(mean(tabel$Karyawan.B)))) +

# Karyawan C

annotate("segment", x=12, xend=12.15, colour="grey", size=0.5,

y=tabel$Karyawan.C[12], yend=tabel$Karyawan.C[12]+1.5) +
annotate("text", x=12.2, y=tabel$Karyawan.C[12]+2,

hjust=0, colour="grey", label="Karyawan C") +

annotate("text", x=12.2, y=tabel$Karyawan.C[12]+1,

hjust=0, colour="grey", size=3,

label=paste("avg:", toString(mean(tabel$Karyawan.C)))) +

# Karyawan D

annotate("segment", x=12, xend=12.15, colour="grey", size=0.5,

y=tabel$Karyawan.D[12], yend=tabel$Karyawan.D[12]-1.5) +

annotate("text", x=12.2, y=tabel$Karyawan.D[12]-1,

hjust=0, colour="grey", label="Karyawan D") +

annotate("text", x=12.2, y=tabel$Karyawan.D[12]-2,

hjust=0, colour="grey", size=3,

label=paste("avg:", toString(mean(tabel$Karyawan.D)))) +

# Karyawan E

annotate("segment", x=12, xend=12.15, colour="darkblue", size=0.5,

y=tabel$Karyawan.E[12], yend=tabel$Karyawan.E[12]+0.5) +

annotate("text", x=12.2, y=tabel$Karyawan.E[12]+1,

hjust=0, colour="darkblue", label="Karyawan E") +

annotate("text", x=12.2, y=tabel$Karyawan.E[12],

hjust=0, colour="darkblue", size=3,

label=paste("avg:", toString(mean(tabel$Karyawan.E)))) +

labs(x = "", y = "Jumlah produk (ribuan)\n",


title = "Best Employee 2019",

subtitle = "Lima karyawan dengan produktivitas tertinggi") +

theme(axis.text = element_text(size = 10),

axis.ticks.x = element_blank(),

plot.title = element_text(hjust = 0, size = 18, face="bold"),

panel.background = element_rect(fill = "white"))

options(repr.plt.width = 10, repr.plt.height = 1)


plt 

Solusi Visualisasi Data 2


Senja membantuku dengan memberi hint untuk mengganti jenis grafik batang menjadi grafik
garis. Kenapa? Karena jenis inilah yang paling cocok untuk menggambarkan data
produktivitas dari waktu ke waktu.
Agar desainnya lebih simpel dan mudah dipahami, Senja juga menyarankan agar aku
menyederhanakan tampilan grafik tersebut dengan langkah-langkah berikut ini (atau lihat
Gambar 1 terkait proses perubahannya):
1. Memilih jenis grafik
garis (line chart). Jenis
Gambar 1: Proses perbaikan grafik template yang disediakan d
grafik ini cocok untuk
menampilkan
perubahan nilai variabel
dari waktu ke waktu
dengan elemen yang
lebih sederhana
dibanding grafik batang
horizontal.
2. Menghilangkan garis
tepi
grafik. Menghilangkan
garis tepi akan memberi
kesan ruang grafik yang
luas.
3. Menghilangkan grid
line/area. Jika yang
ditonjolkan adalah pola
garis naik-turun
grafik, grid line dapat
disamarkan atau
dihilangkan sama
sekali. Jika tidak, area
grafik akan penuh oleh
garis saling silang.
4. Menghapus label data
dan marker. Terlalu
banyak label data justru
akan membuat
tampilan grafik menjadi
penuh dan terkesan
berantakan. Tentu saja
boleh menghilangkan
seluruhnya atau
tampilkan label data
pada titik-titik tertentu
saja. Hindari
penggunaan warna
pekat pada label data,
kecuali bila nilai data itu
menjadi sorotan utama.

5. Menyederhanakan keterangan sumbu X dan Y. Jika sumbu XY memuat angka


ribuan atau lebih, ringkaslah angka itu dengan menyederhanakan nilai angka pada
setiap sumbu. Jangan lupa memunculkan satuan angka pada sumbu tersebut.
6. Mengatur legenda, judul, subjudul, keterangan. Diperlukan permainan tipografi
dan penempatan teks yang tepat. Judul haruslah berukuran paling besar dan warna
pekat. Ukuran huruf dan warna untuk elemen lain diatur lebih kecil dan lebih tipis.
Lekatkan legenda dengan elemen grafik (dalam hal ini garis-garis grafik) untuk
memudahkan pembaca mencari keterangan atas grafik tersebut.
7. Mengganti warna, tebal garis. Tidak ada patokan khusus mengenai jumlah warna
dan ukuran garis. Namun, pastikan bahwa elemen yang paling menonjol diberi warna
lebih pekat dari elemen lain.

 
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. 

Gambar 2: Hasil akhir dari perbaikan grafik.


 
 

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:

1. Mengenal visualisasi data


2. Urgensi visualisasi data
3. Visualisasi eksploratif versus naratif
4. Memetakan tujuan visualisasi data
5. Proses visualisasi data
6. Mengenal jenis grafik dan karakternya
7. Panduan singkat memilih grafik
8. Karakter visual suatu grafik
9. Bedah grafik

Advanced Data Visualization with ggplot2 using R

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 >

Konsep Grammar of Graphic


Konsep Grammar of Graphic akan mengasah intuisi Anda untuk membentuk berbagai jenis
grafik dengan lebih mudah, ringkas, dan tertata. Anda dapat membaca artikel mengenai
implementasi konsep Grammar of Graphic di ggplot2 melalui pranala ini. Namun sekarang
silakan aktifkan paket ggplot2 dengan cara mengganti bagian ___ dengan jawaban yang
tepat!
library(ggplot2)

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)

qplot(x = carat, y = price, colour = clarity, data = diamonds)

Pembuatan Grafik dengan ggplot


Mudah sekali bukan untuk membuat grafik menggunakan qplot()? Namun sayangnya hal
tersebut hanya berlaku untuk grafik-grafik sederhana. Jika Anda ingin membuat grafik yang
lebih kompleks dan menawan, maka saatnya Anda beralih menggunakan
fungsi ggplot() untuk membuat grafik tersebut.
Lantas bagaimanakah cara untuk menghasilkan grafik serupa namun dengan menggunakan
fungsi ggplot()? Silakan Anda lengkapi dan jalankan baris kode berikut!
library(ggplot2)

ggplot(data = diamonds,

mapping = aes(x = carat, y = price, colour = clarity)) +

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:

atau sebagai 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,

mapping = aes(x = carat, y = price, colour = clarity)) +


geom_point()

summary(diamonds_c1)

# Cara 2

diamonds_c2 <-

ggplot(data=diamonds) +

geom_point(mapping=aes(x=carat, y=price, colour=clarity))

summary(diamonds_c2)

# Cara 3

diamonds_c3 <-

ggplot() +

geom_point(

data = diamonds,

mapping =aes(x=carat, y=price, colour=clarity))

summary(diamonds_c3)

Komponen Dasar Pembuatan Grafik


Selamat Anda telah berhasil membuat grafik dengan menggunakan
fungsi qplot() dan ggplot()! Setelah menuliskan dan menjalankan beberapa kode pada
sub-bab sebelumnya, Anda mungkin menyadari bahwa setidaknya terdapat tiga komponen
dasar dalam pembuatan grafik yaitu:

1. Data, yaitu data berisi informasi yang akan dibuat grafik


2. Mapping, yaitu penentuan variabel/kolom yang akan ditampilkan dalam grafik
3. Geometries, yaitu representasi visual dari variabel/kolom dalam grafik
Kode pembuatan grafik menggunakan ggplot2() dapat disederhanakan dalam bentuk yang
lebih umum. Misalnya penulisan kode untuk membuat grafik menggunakan
fungsi qplot() dapat digeneralisasi sebagai berikut:

qplot(<MAPPING>, data = <DATA>, geom = <GEOM>)

Sedangkan untuk fungsi ggplot(), penulisan kode dapat digeneralisasi dalam tiga bentuk
sebagai berikut:
Cara 1

ggplot(data = <DATA>, mapping = aes(<MAPPINGS>)) +


<GEOM_FUNCTION>()

Cara 2

ggplot(data = <DATA>) +
<GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))

Cara 3

ggplot() +
<GEOM_FUNCTION>(data = <DATA>, mapping = aes(<MAPPINGS>)

Delapan Komponen Dalam Grafik


Selain tiga komponen dasar yang sebelumnya telah disinggung, dalam konsep Grammar of
Graphic terdapat lima komponen utama lainnya yang berperan penting dalam pembuatan
sebuah grafik. Berikut merupakan delapan komponen dalam grafik:

1. Data
2. Mapping
3. Statistic
4. Scales
5. Geometries
6. Facets
7. Coordinates
8. Theme

Yin dan Yang


Namun tunggu dulu! Sebelum menyelam dalam visualisasi, ada baiknya kita membahas
suatu aktivitas yang sulit dilepaskan dari proses pembuatan grafik. Aktivitas tersebut adalah
transformasi data! Seringkali kita harus menyesuaikan bentuk dari data yang kita miliki agar
dapat lebih mudah mewujudkannya dalam sebuah grafik. Ya, transformasi dan visualisasi
merupakan komplementer satu sama lain. Jika Anda ingin menguasai visualisasi data, maka
alangkah baiknya Anda juga memahami proses transformasi data.
Di R, salah satu kumpulan paket yang populer digunakan untuk melakukan transformasi dan
visualisasi data adalah tidyverse. Jika ggplot2 berperan utama dalam hal visualisasi data,
maka paket yang berperan utama dalam hal transformasi data
adalah dplyr dan tidyr. ggplot2 bersama
dengan dplyr serta tidyr, readr, tibble, stringr, forcats, dan purrr merupakan paket
utama dalam tidyverse.
Sekarang aktifkanlah paket dplyr dengan cara mengganti bagian ___ dengan jawaban yang
tepat!
library(dplyr)

Paket dplyr
Terdapat beberapa fungsi utama dari paket dplyr untuk melakukan transformasi data,
diantaranya:

 select()
 filter()
 arrange()
 mutate()
 summarise()
 group_by()

Bacalah dokumentasi masing-masing fungsi di atas dengan cara


menjalankan help(nama_fungsi) atau ?nama_fungsi pada konsol R. Atau Anda dapat
mengunjungi laman dokumentasi daring dplyr melalui tautan ini.
Benar atau salah jika fungsi select() dan filter() dari paket dplyr ekivalen dengan
fungsi subset() dari paket base? Tulis TRUE jika benar, dan FALSE jika salah.

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)

# Tanpa menggunakan %>%

storms1 <- select(storms, year, month, wind,pressure)

storms2 <- filter(storms1, between(year,2000,2015))

storms3 <- mutate(storms2, month = factor(month.name[storms2$month],levels = month.name))

storms4 <- group_by(storms3, month)

storms_nopipe <- summarise(storms4, avg_wind = mean(wind), avg_pressure = mean(pressure))

glimpse(storms_nopipe)

# Menggunakan %>%

storms_pipe <-

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)

glimpse(storms_pipe)

# Komparasi metode tanpa pipe dan dengan pipe


identical(storms_nopipe, 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)
)

Buatlah rangkuman tahapan-tahapan apa yang dilakukan untuk melakukan transformasi


dataset storms tersebut! Bagikan jawaban Anda di akun media sosial dan jangan lupa tag
akun DQLab ya

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)

indodapoer <- read_tsv("https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/indodapoer.tsv.gz")

nrow(indodapoer)

ncol(indodapoer)

Wild Names and How to Tame Them


Ya! Data indodapoer memiliki 22468 baris dan 222 kolom. Data yang cukup kompleks bukan?
Jika Anda perhatikan nama-nama kolom pada tersebut masih banyak yang tidak memenuhi
kaidah “syntactically valid names” di R (tips: silakan baca dokumentasi
fungsi make.names()). Silakan Anda periksa nama 15 kolom pertama
menggunakan colnames(), kemudian jalankan clean_names() dari paket janitor untuk
menangani permasalahan nama kolom tersebut dan simpan hasilnya sebagai indodapoer,
selanjutnya periksa kembali nama 15 kolom pertama dari data yang telah diproses tersebut!
install.packages("janitor", repos = "http://cran.us.r-project.org")

library (janitor)

head(colnames(indodapoer), 15)

indodapoer <- clean_names(indodapoer)

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.",

"DKI Jakarta, Prop.",

"Jawa Barat, Prop.",

"Jawa Tengah, Prop.",

"DI Yogyakarta, Prop.",

"Jawa Timur, Prop."

) %>%

transmute(

provinsi = str_remove(area_name, ", Prop."),

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(

provinsi = fct_reorder2(provinsi, tahun, pdrb_nonmigas)

) %>%

ggplot(aes(tahun, pdrb_nonmigas, colour = provinsi)) +

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_line(aes(colour = provinsi), show.legend = FALSE) +

geom_dl(

aes(label = provinsi),

method = "last.points",

position = position_nudge(x = 0.3) # agar teks tidak berhimpitan dengan garis

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!

 Bagi pdrb_nonmigas dengan 1e6 (satu juta), sehingga staun pdrb_nonmigas sekarang


adalah dalam triliun
 Tambahkan label pada grafik menggunakan fungsi labs(). Beri label sebagai berikut:
o Judul: “PDRB Non-Migas di Pulau Jawa Hingga Tahun 2011”
o Subjudul: “PDRB atas dasar harga konstan, dalam satuan triliun”
o Sumbu x: (tidak ada label)
o Sumbu y: (tidak ada label)
o Caption: “Data: INDO-DAPOER, The World Bank”
 Non-aktifkan clipping pada kanvas dengan mengatur argumen clip =
"off" pada coord_cartesian() [Catatan: cara ini terkadang perlu dikombinasikan
dengan argumen expand pada scale_x/y_***()]
 Pergunakan theme_ipsum() dari paket hrbrthemes untuk memodifikasi tema

library(ggplot2)

library(dplyr)

library(directlabels)

library(hrbrthemes)

pdrb_pjawa %>%

ggplot(aes(tahun, pdrb_nonmigas / 1e6)) +

geom_line(aes(colour = provinsi), show.legend = FALSE) +

geom_dl(

aes(label = provinsi),

method = "last.points",

position = position_nudge(x = 0.3) # agar teks tidak berhimpitan dengan garis

)+

labs(

x = NULL,

y = NULL,

title = "PDRB Non-Migas di Pulau Jawa Hingga Tahun 2011",

subtitle = "PDRB atas dasar harga konstan, dalam satuan triliun",

caption = "Data: INDO-DAPOER, The World Bank"


)+

coord_cartesian(clip = "off") +

theme_ipsum(grid = "Y", ticks = TRUE)

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(str_detect(area_name, "Prop")) %>%

filter(year==2009) %>%

transmute(

provinsi = str_remove(area_name, ", Prop."),

luas_wilayah = total_area_in_km

glimpse(luas_provinsi)

Komparasi Luas Wilayah


Selanjutnya Anda ditantang untuk membuat komparasi luas wilayah antar provinsi tersebut
dalam sebuah grafik bernama treemap. Apakah sebelumnya Anda pernah membuat grafik
ini?
Anda dapat menggunakan fungsi geom_treemap() dari treemapify untuk membuat grafik
tersebut. Aesthetic mapping wajib dalam geom_treemap() tersebut adalah area. Selain itu,
untuk menambahkan teks label Anda perlu menggunakan geometry object khusus,
yaitu geom_treemap_text(). Apakah Anda ingat apa aesthetic mapping wajib jika ingin
menuliskan teks? Dengan menggunakan data luas_provinsi dapatkah Anda membuat
grafik tersebut?
library(treemapify)

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:

 Menambahkan luas_wilayah sebagai aesthetic mapping warna kotak


 Menggunakan palet warna viridis untuk menyatakan luas_wilayah
 Mengatur posisi, ukuran, dan label pada legenda petunjuk gradasi warna. Anda akan
memerlukan fungsi label_number() dari paket scales
 Mengganti fonta nama provinsi menjadi “Arial Narrow”, warna menjadi putih, dan
konfigurasi ukuran fonta dinamis
 Menambahkan judul, subjudul, dan caption
 Mengganti tema plot meenggunakan theme_ipsum() dari paket hrbrthemes

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),

family = "Arial Narrow",

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 = ",",

suffix = " km2")

)+

labs(

fill = "Luas\nwilayah",

title = "Perbandingan Luas 33 Provinsi di Indonesia",


subtitle = "Berdasarkan data tahun 2009, sehingga Kalimantan Utara tidak tercantum dalam
grafik",

caption = "Data: INDO-DAPOER, The World Bank"

)+

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 %>%

filter(str_detect(area_name, ", Prop.", negate = TRUE)) %>%

filter(year == 2008) %>%

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)

The Next Step


Luar biasa! Namun, masih ada dua tahap yang masih perlu Anda lakukan:

 Menentukan mana wilayah kabupaten dan mana wilayah kota


 Mengatur level dari kolom kondisi berdasarkan tingkat keparahan sekaligus
memperbaiki penulisan teks agar dapat ditampilkan lebih rapi di dalam grafik
Salinlah baris kode berikut di konsol Anda!
library(dplyr)

library(stringr)

jalan_kabkota <-

jalan_kabkota %>%

mutate(

status = case_when(

str_detect(kabkota, ", Kab") ~ "Kabupaten",

str_detect(kabkota, ", Kota") ~ "Kota",

str_detect(kabkota, "City") ~ "Kota",

TRUE ~ NA_character_

),

kondisi = factor(

kondisi,

levels = c("rusak_parah", "rusak_ringan", "cukup_baik", "sangat_baik"),

labels = c("Rusak parah", "Rusak ringan", "Cukup baik", "Sangat baik")

glimpse(jalan_kabkota)

Grafik Kondisi Jalan


Akhirnya Anda berhasil melakukan transformasi data! Proses yang cukup melelahkan bukan?
Sekarang saatnya Anda membuat grafik yang akan menunjukan kondisi jalan raya di
kabupaten & kota berdasarkan kondisinya. Sebelum Anda melanjutkan ke sub-bagian
selanjutnya, apakah Anda sudah memiliki ide tentang grafik apa yang dibuat untuk topik
tersebut?
Bagikan jawaban Anda di sosial media dan tag akun DQLab ya!
Ridgeline plot! Itulah nama grafik yang akan Anda buat dengan menggunakan
data jalan_kabkota tersebut. Apakah Anda pernah membuat grafik jenis ini?
Rideline plot sangat bermanfaat untuk menampilkan perubahan distribusi dari suatu variabel
numerik. Agar lebih mempermudah pemahaman, silakan Anda lengkapi dan jalankan baris
kode berikut ya! Psst, Anda akan memerlukan paket ggridges untuk membuat grafik ini.
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

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 +

geom_vline(xintercept =100 , linetype = "dashed", colour = "darkslategray4") +

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:

 Menambahkan scale_fill_viridis_c(option = "magma")  untuk modifikasi warna


 Menambahkan keterangan judul, subjudul, dan caption
o Judul: “Jalan Kabupaten/Kota Berdasarkan Kondisi”
o Subjudul: “Berdasarkan data tahun 2008, garis vertikal menunjukan panjang
jalan 100 Km”
o Caption: “Data: INDO-DAPOER, The World Bank”
 Mengatur argumen grid = FALSE dan ticks = TRUE pada theme_ipsum()

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 +

geom_vline(xintercept = 100, linetype = "dashed", colour = "darkslategray4") +

scale_x_continuous(trans = "log10") +

scale_fill_viridis_c(option = "magma") +

labs(

x = "Panjang jalan (Km)",

y = NULL,

title = "Jalan Kabupaten/Kota Berdasarkan Kondisi",


subtitle = "Berdasarkan data tahun 2008, garis vertikal menunjukan panjang jalan 100 Km",

caption = "Data: INDO-DAPOER, The World Bank"

)+

theme_ipsum(grid = FALSE, ticks = TRUE)

Fasilitas Kesehatan di Kalimantan


Bagaimanakah komposisi faskes di pulau Kalimantan? Nah, sekarang Anda kembali
ditantang untuk membuat sebuah grafik unik bernama waffle charts untuk menjawab
tersebut. Apakah Anda pernah mengetahui jenis grafik ini?
library(dplyr)

library(ggplot2)

library(tidyr)

library(stringr)

library(forcats)

faskes_kalimantan <-

indodapoer %>%

filter(str_detect(area_name, "Kalimantan")) %>%

filter(year == 2011) %>%

transmute(

provinsi = str_remove(area_name, ", Prop."),

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(

provinsi = fct_reorder(provinsi, jumlah, sum),

jumlah = ceiling(jumlah / 10)

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 %>%

ggplot(aes(fill = faskes, values = jumlah)) +

facet_wrap(~provinsi) +

geom_waffle(colour = "white")
faskes_kalimantan_plot

Mengatur Warna dan Label


Selamat Anda telah berhasil membuat basis grafik yang diminta! Anda dapat melakukan
kostumisasi warna sesuai dengan keinginan Anda dengan menggunakan
fungsi scale_fill_manual() atau scale_colour_manual() jika aesthetic mapping warna
yang digunakan adalah colour. Selain itu, Anda juga dapat melakukan modifikasi teks label
langsung pada fungsi tersebut dengan mengatur argumen labels (apakah Anda masih ingat
pada sub-bab sebelumnya hal tersebut dilakukan pada fungsi factor() dan mutate()?).
Sekarang aturlah warna dan label dengan ketentuan sebagai berikut:

 polindes = “seagreen3”. Ubah label teks menjadi “Poliklinik Desa”


 puskesmas = “steelblue”. Ubah label teks menjadi “Puskesmas”
 rumahsakit = “cyan4”. Ubah label teks menjadi “Rumah Sakit”

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 %>%

ggplot(aes(fill = faskes, values = jumlah)) +

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(

"polindes" = "Poliklinik Desa",

"puskesmas" = "Puskesmas",

"rumahsakit" = "Rumah Sakit"

)+

labs(

fill = NULL,

title = "Fasilitas Kesehatan di Kalimantan",

subtitle = "Berdasarkan data tahun 2011, satu petak menyatakan ±10 faskes",

caption = "Data: INDO-DAPOER, The World Bank"

faskes_kalimantan_plot

Finalisasi Waffle Charts


Luar biasa! Anda telah berhasil melakukan modifikasi warna sesuai dengan keinginan.
Melalui teknik tersebut, Anda dapat menuangkan warna branding pada grafik sehingga
menjadi produk yang memiliki jati diri Anda.
Hampir selesai! Ada dua tahap terakhir yang dapat Anda lakukan untuk menyelesaikan waffle
chart faskes_kalimantan_plot. Pertama, memastikan agar aspect ratio antara sumbu-x dan
sumbu-y adalah 1:1. Kedua, membuat kustomisasi tema grafik. Permasalahan pertama dapat
Anda selesaikan dengan cara menambahkan fungsi coord_equal(). Sedangkan
permasalahan kedua dapat diselesaikan dengan fungsi theme(). Jika pada grafik-grafik
sebelumnya Anda menggunakan theme_ipsum() yang berasal dari hrbrthemes(), maka kali
ini Anda akan membuat sendiri tema sendiri. Keren, kan? Cobalah Anda atur font dengan
menggunakan family = "Arial Narrow"!
install.packages("waffle", repos = "https://cinc.rud.is")

library(waffle)

library(ggplot2)

library(dplyr)

faskes_kalimantan_plot <-

faskes_kalimantan %>%

ggplot(aes(fill = faskes, values = jumlah)) +

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(

"polindes" = "Poliklinik Desa",

"puskesmas" = "Puskesmas",

"rumahsakit" = "Rumah Sakit"

)+
labs(

fill = NULL,

title = "Fasilitas Kesehatan di Kalimantan",

subtitle = "Berdasarkan data tahun 2011, satu petak menyatakan ±10 faskes",

caption = "Data: INDO-DAPOER, The World Bank"

faskes_kalimantan_plot +

coord_equal() +

theme(

text = element_text(family = "Arial Narrow"),

plot.title.position = "plot",

plot.title = element_text(face = "bold", size = 18, hjust = 0.5),

plot.subtitle = element_text(face = "plain", size = 12, hjust = 0.5),

plot.caption = element_text(face = "italic", size = 9),

legend.position = "bottom",

panel.background = element_blank(),

panel.grid = element_blank(),

strip.background = element_blank(),

strip.text = element_text(face = "italic", size = 9, hjust = 0),

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)

hashtags <- read_csv("hashtags.csv")


glimpse(hashtags)
## Rows: 60
## Columns: 3
## $ hashtags <chr> "bigdata", "data", "datascience", "datascientist",…
## $ count <dbl> 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, …
## $ contains_data_word <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, …

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 >

Jumlah Rata-rata Likes per Hari


Mudah sekali bukan? Dengan menggunakan jenis fonta yang berbeda tentunya akan
memberikan kesan unik pada grafik yang Anda buat. Oh iya, berdasarkan awan kata tersebut
apakah Anda dapat menebak data akun Instagram siapa yang digunakan?
Selanjutnya Anda akan diajak untuk membuat sebuah grafik lolipop yang menunjukan
jumlah rerata likes per hari. Data tersebut tersedia dalam berkas igstats.csv. Hal yang perlu
menjadi fokus Anda pada sub-bagian ini adalah bagaimana cara memberikan anotasi teks
dan panah pada grafik.
Menambahkan anotasi pada ggplot2 dapat dibilang cukup kompleks dan memerlukan
ketelitian serta kesabaran tinggi. Seringkali Anda terpaksa melakukan proses trial-and-
error berulang kali hingga akhirnya mendapatkan hasil yang diinginkan. Namun, semakin
sering Anda melakukan proses ini maka semakin terasah pula intuisi Anda nantinya. Adapun
fungsi yang akan banyak Anda pergunakan adalah annotate(). Selain itu, pada contoh
berikut juga ditunjukan penggunaan format HTML (dapat juga format Markdown)
pada ggplot2 menggunakan paket ggtext.
install.packages("ggtext",repos = "http://cran.us.r-project.org")

library(ggtext)

library(forcats)

library(ggplot2)

library(dplyr)

library(readr)

igstats <- read_csv("https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/igstats.csv")

glimpse(igstats)

igstats_plot <-

igstats %>%

mutate(day = fct_reorder(day, avglikes)) %>%

ggplot() +

geom_segment(aes(

x = 0,

xend = avglikes,

y = day,

yend = day

),

colour = "white",

linetype = "longdash"

)+
geom_point(

aes(avglikes, day, fill = is_weekend),

shape = "circle filled",

size = 18,

colour = "white",

show.legend = FALSE

)+

geom_text(

aes(avglikes, day, label = round(avglikes)),

colour = "white",

family = "Lacquer",

size = 7

)+

geom_text(

aes(x = 0, day, label = day),

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,

arrow = arrow(length = unit(0.1, "inches"), type = "closed")

)+

geom_curve(

aes(

x = 185,

xend = 230,

y = 6.8,

yend = 7.2

),

colour = "white",

curvature = -0.25,

arrow = arrow(length = unit(0.1, "inches"), type = "closed")

)+

annotate(

geom = "richtext",

x = 200,

y = 6.5,

label = "<span style='color:Blue'>Blue</span> is weekday,<br><span


style='color:Green'>green</span> is weekend",

fill = NA,

label.colour = NA,
colour = "white",

family = "Lacquer",

size = 4

)+

annotate(

geom = "text",

x = 200,

y = 3,

label = "How many\nlikes did \nI get?",

colour = "white",

hjust = "center",

family = "Lacquer",

size = 15

)+

scale_fill_manual(values = c("Blue", "Green")) +

theme_void() +

theme(plot.background = element_rect(fill = "Black"))

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!

Data Science in Finance: Credit Risk Analysis

Credit Risk dan Model Prediksi


Pendahuluan
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:

 gangguan aliran kas (cash flow) sehingga modal kerja terganggu.


 meningkatkan biaya operasional untuk mengejar pembayaran
tersebut (collection).

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 .

Nilai credit score biasanya bervariasi antar lembaga. Namun banyak yang kemudian


mengadopsi model FICO Score yang memiliki rentang nilai 300 - 850. Semakin tinggi nilai
yang didapatkan, maka semakin baik tingkat kemampuan seseorang atau sebuah lembaga
untuk membayar pinjaman.

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.

Contoh Tabel Risk Rating


Berikut adalah contoh data risk rating yang dihasilkan berdasarkan data historis lamanya
proses pengembalian pinjaman. Perhatikan kolom risk_rating  dimana terdapat angka 1
sampai dengan 5 - yang menunjukkan resiko terendah sampai tertinggi.

Selengkapnya, dataset ini bisa Anda download di https://storage.googleapis.com/dqlab-


dataset/credit_scoring_dqlab.xlsx.
Kolom risk_rating ini berelasi langsung dengan kolom overdue_average, atau kolom
keterlambatan pembayaran.

 Jika keterlambatan sampai dengan 30 hari (0 - 30 days) maka diberikan nilai 1.


 keterlambatan 31 sampai dengan 45 hari (31 - 45 days) maka scoring diberikan nilai 2.
 dan seterusnya

Dari sini juga beberapa kolom juga diambil oleh analis untuk mencari pola keterkaitannya
terhadap rating ini, yaitu:

 pendapatan dalam jutaan per tahun (pendapatan_setahun_juta).


 durasi pinjaman dalam satuan bulan (durasi_pinjaman_bulan).
 jumlah tanggungan (jumlah_tanggungan).
 apakah ada kpr aktif atau tidak (kpr_aktif).

Analisa dan Model Pengambilan Keputusan


Masih terkait dengan contoh data sebelumnya, namun dengan contoh data utuh - DQLab
akan memberikan ilustrasi aktivitas tindak lanjut terhadap data dengan contoh skenario
berikut.
Seorang analis akan melakukan penelusuran terhadap data kita untuk mencari pola. Berikut
adalah temuannya: 

 Jika jumlah tanggungan berjumlah lebih dari 4, kecenderungan resikonya sangat


tinggi (rating 4 dan 5).
 Jika durasi pinjaman semakin lama yaitu lebih dari 24 bulan, maka kecenderungan
resiko juga meningkat (rating 4 dan 5).
Dari kedua temuan ini, analis akan membentuk aturan-aturan untuk menuntun pengambilan
keputusan (decision making model) terhadap pengajuan pinjaman baru untuk sebagai
berikut:

 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:

 gangguan aliran kas (cash flow) sehingga modal kerja terganggu.


 meningkatkan biaya operasional untuk mengejar pembayaran
tersebut (collection).

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.

Komponen Decision Tree

Berikut adalah komponen dari decision tree:

 Node: diwakili oleh 1, 3 dan 4.


 Branch (cabang) atau split (pemisah): diwakili oleh 2.
 Root node: atau node akar, diwakili oleh 3.
 Leaf node: atau node daun, diwakili oleh 4.

Mengerti komponen-komponen ini sangat penting untuk nanti memahami output dari
algoritma machine learning yang digunakan.

Contoh Pemodelan Decision Tree dengan


Machine Learning
Mari sekarang kita lihat contoh otomatisasi model decision tree dengan menggunakan salah
satu algoritma populer di R, yaitu C5.0. Praktek kali ini kita hanya bertujuan untuk melihat
contoh output, detilnya akan dibahas pada bab-bab selanjutnya.
Pada code editor telah diberikan contoh code untuk membaca dan menganalisa data credit
rating dari file Excel, membentuk model decision tree, dan menampilkan hasilnya dalam
bentuk output. Untuk itu kita perlu gunakan package C50 yang akan kita gunakan sepanjang
course ini.
Cobalah jalankan code tersebut dengan tombol Run, dan jika berjalan dengan lancar maka
akan mendapatkan potongan hasil berikut.

Read 900 cases (4 attributes) from undefined.data

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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")


dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

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.

Read 900 cases (4 attributes) from undefined.data

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.

Class and Input Variables


Mari kita kembali melihat contoh data kita dari gambar berikut ini dimana tiap header kolom
diberi bulatan merah dengan penomoran.

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.

Data Preparation untuk Class Variable


Pada code editor, telah diberikan potongan code untuk membaca dataset kita dari file Excel
dan kemudian menganalisa strukturnya. Cobalah jalankan code tersebut, dan perhatikan
hasilnya sebagai berikut.

'data.frame': 900 obs. of 7 variables:


$ kode_kontrak : chr "AGR-000001" "AGR-000011" "AGR-000030" "AGR-
000043" ...
$ pendapatan_setahun_juta: num 295 271 159 210 165 220 70 88 163 100 ...
$ kpr_aktif : chr "YA" "YA" "TIDAK" "YA" ...
$ durasi_pinjaman_bulan : num 48 36 12 12 36 24 36 48 48 36 ...
$ jumlah_tanggungan : num 5 5 0 3 0 5 3 3 5 6 ...
$ rata_rata_overdue : chr "61 - 90 days" "61 - 90 days" "0 - 30 days" "46 - 60
days" ...
$ risk_rating : num 4 4 1 3 2 1 2 2 2 2 ...

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.

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating) 

Cobalah masukkan perintah ini untuk menggantikan bagian #[...] pada code editor dan klik
tombol Run. Jika berjalan dengan lancar, maka outputnya akan terlihat seperti berikut.

'data.frame': 900 obs. of 7 variables:


$ kode_kontrak : chr "AGR-000001" "AGR-000011" "AGR-000030" "AGR-
000043" ...
$ pendapatan_setahun_juta: num 295 271 159 210 165 220 70 88 163 100 ...
$ kpr_aktif : chr "YA" "YA" "TIDAK" "YA" ...
$ durasi_pinjaman_bulan : num 48 36 12 12 36 24 36 48 48 36 ...
$ jumlah_tanggungan : num 5 5 0 3 0 5 3 3 5 6 ...
$ rata_rata_overdue : chr "61 - 90 days" "61 - 90 days" "0 - 30 days" "46 - 60
days" ...
$ risk_rating : Factor w/ 5 levels "1","2","3","4",..: 4 4 1 3 2 1 2 2 2
2 ...

Klik tombol Submit Code untuk mengirimkan hasil dan melanjutkan ke bagian berikutnya.


library("openxlsx")

#Mempersiapkan data

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

str(dataCreditRating)

#Melakukan konversi kolom risk_rating menjadi factor


dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

#Melihat struktur setelah konversi

str(dataCreditRating)

Data Preparation untuk Input Variables


Tidak semua input variable yang perlu kita gunakan, apalagi yang sangat berkaitan sangat
erat dengan risk_rating, yaitu rata_rata_overdue. Input variable ini akan kita buang. Proses
ini disebut sebagai feature selection.
Karena kita gunakan data frame sebagai tipe data input kita untuk C5.0, maka field-field yang
ingin kita gunakan bisa kita kita masukkan sebagai vector sebagai filter.
Berikut adalah perintah untuk membuat vector nama kolom yang kita butuhkan saat ini,
yaitu durasi_pinjaman_bulan dan jumlah_tanggungan. Hasil filtering ini kita simpan ke
variable baru bernama datafeed, dan perintah terakhir kita gunakan melihat struktur
variable ini.

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")


datafeed <- dataCreditRating[ , input_columns ]
str(datafeed)

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.

'data.frame': 900 obs. of 2 variables:


$ durasi_pinjaman_bulan: num 48 36 12 12 36 24 36 48 48 36 ...
$ jumlah_tanggungan : num 5 5 0 3 0 5 3 3 5 6 ...

library("openxlsx")

#Mempersiapkan data

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")


#Merubah tipe data class variable sebagai factor

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

str(dataCreditRating)

#Menghilangkan beberapa variable input dari dataset

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[, input_columns]

str(datafeed)

Training Set dan Testing Set


Untuk proses pembentukan model machine learning dan melihat akurasinya, biasanya
dataset kita perlu dibagi menjadi dua, yaitu:

 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.

Pembentukan ini biasanya menggunakan metode pemilihan acak. Untuk praktek


selanjutnya, kita akan membagi dataset kita menjadi 800 baris data untuk training set dan
100 baris data untuk testing set.

Mempersiapkan Training dan Testing Set


Training dan testing set kita akan mengambil dari variable data frame
bernama datafeed yang telah kita persiapkan pada praktek sebelumnya. Jumlah baris
dataset kita adalah 900, dimana kita akan mengambil 800 baris secara acak sebagai training
set dan sisa 100 sebagai testing set.
Langkah pertama adalah menyusun index untuk training set, caranya adalah menggunakan
kedua perintah berikut.

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.

input_training_set <- datafeed[indeks_training_set,]


class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating
input_testing_set <- datafeed[-indeks_training_set,]

dimana:

 input_training_set akan diisi dari data frame datafeed dengan index yang isinya


terdapat pada variable indeks_training_set.
 class_training_set akan diisi dari data frame dataCreditRating dengan index yang
isinya terdapat pada variable indeks_training_set.
 input_testing_set akan diisi datafeed dengan index yang isinya tidak
ada di indeks_training_set - perhatikan tanda minus yang ada di depan
variable indeks_training_set.

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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan porsi index acak untuk training dan testing set

set.seed(100)

indeks_training_set <- sample(900,800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

str(input_training_set)

str(class_training_set)

str(input_testing_set)

Menghasilkan Model dengan Fungsi C5.0


 
Dengan persiapan sebelumnya, sekarang saatnya kita akan menggunakan algoritma C5.0
untuk menghasilkan model decision tree dengan menggunakan fungsi yang juga bernama
C5.0. Function ini juga memerlukan package R yang bernama "C50".
Syntax penggunaan fungsi C5.0 adalah sebagai berikut:

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:

risk_rating_model <- C5.0(input_training_set, class_training_set)

Sederhana sekali bukan?

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.

Class specified by attribute `outcome'

Read 800 cases (3 attributes) from undefined.data

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)

Evaluation on training data (800 cases):

Decision Tree
----------------
Size Errors

6 180(22.5%) <<

(a) (b) (c) (d) (e) <-classified as


---- ---- ---- ---- ----
179 1 5 5 6 (a): class 1
80 30 14 3 12 (b): class 2
4 258 (c): class 3
2 73 31 (d): class 4
17 80 (e): class 5

Attribute usage:

100.00% jumlah_tanggungan
72.62% durasi_pinjaman_bulan

Time: 0.0 secs

library("openxlsx")
library("C50")

#Mempersiapkan data

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan dan menampilkan summary model

risk_rating_model <- C5.0(input_training_set, class_training_set)

summary(risk_rating_model)

Menghasilkan Plot dari Model C5.0


Selain model teks dari praktek sebelumnya, kita juga bisa menghasilkan decision tree dalam
bentuk grafik. Dan cuma butuh satu perintah untuk melakukan hal ini, yaitu:
plot(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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]


class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan dan menampilkan summary model

risk_rating_model <- C5.0(input_training_set, class_training_set)

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:

 Training set, yang digunakan untuk memberikan input ke algoritma untuk


membentuk model.
 Testing set, yang akan digunakan untuk data pembanding untuk mengukur akurasi
algoritma.

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.

Memahami Output dari Fungsi C5.0


Summary Model C5.0
Berikut adalah tampilan summary dari model decision tree yang dihasilkan dari fungsi C5.0 di
bab sebelumnya. Terlihat cukup banyak informasi disini, akan kita lihat satu per satu pada
bab ini.

Class specified by attribute `outcome'

Read 800 cases (3 attributes) from undefined.data

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)

Evaluation on training data (800 cases):

Decision Tree
----------------
Size Errors

6 180(22.5%) <<

(a) (b) (c) (d) (e) <-classified as


---- ---- ---- ---- ----
179 1 5 5 6 (a): class 1
80 30 14 3 12 (b): class 2
4 258 (c): class 3
2 73 31 (d): class 4
17 80 (e): class 5

Attribute usage:

100.00% jumlah_tanggungan
72.62% durasi_pinjaman_bulan

Label dari Class


Mari kita perhatikan baris pertama potongan output yang kita warnai biru sebagai berikut,
output lainnya kita hilangkan.

Class specified by attribute `outcome'

Read 800 ....

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.

control = C5.0Control(label="Risk Rating")

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.

Class specified by attribute `Risk Rating'

Read 800 ....

Terlihat label class kita sudah berubah menjadi "Risk Rating". Klik tombol Next untuk
melanjutkan ke pembahasan output berikutnya.
library("openxlsx")

library("C50")
#Mempersiapkan data

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan model

risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label ="Risk


Rating"))

summary(risk_rating_model)

Jumlah Data dan Variable yang Digunakan


Kita fokus ke bagian berikutnya dari output - yang diwarnai biru sebagai berikut.

Class specified by attribute `Risk Rating'


Read 800 cases (3 attributes) from undefined.data

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:

 input variables: durasi_pinjaman dan jumlah_tanggungan. Dua variable ini didapatkan dari


hasil perintah berikut.

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")


datafeed <- dataCreditRating[ , input_columns ]

 class variable: risk_rating

Berikut adalah gambar tampilan dari tiga variable tersebut di Excel.

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:

 input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")


menjadi
input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan", "kpr_aktif")
 sample(900, 800) menjadi sample(900, 780)

Cobalah jalankan dan harusnya Anda akan mendapatkan output baru sebagai berikut.
Perhatikan jumlah cases dan attributes sudah berubah.

Class specified by attribute `Risk Rating'

Read 780 cases (4 attributes) from undefined.data


Decision tree:

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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan", "kpr_aktif")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 780)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]


class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan model

risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk


Rating"))

summary(risk_rating_model)

Tampilan Teks dari Model Decision Tree


Saatnya kita ke bagian paling menarik, yaitu tampilan model decision itu sendiri.

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)

Berikut adalah arti pewarnaan tersebut:

 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.

Persentase Kesalahan Model


Fokus kita berikutnya adalah potongan evaluasi model yang terlihat sebagai berikut.

Evaluation on training data (800 cases):

Decision Tree
----------------
Size Errors

6 180(22.5%) <<

Informasi yang terdapat pada output ini adalah:

 800 cases adalah jumlah baris data (case) yang diproses.


 Size = 6 adalah jumlah leaf nodes (node ujung) dari decision tree.
 Errors = 180(22.5%): 180 adalah jumlah record yang salah klasifikasi, dan 22.5%
adalah rasio dari seluruh populasi.

Confusion Matrix
Tampilan output berikutnya adalah semacam tabel yang disebut dengan confusion
matrix dengan ukuran 5 x 5.

(a) (b) (c) (d) (e) <-classified as


---- ---- ---- ---- ----
179 1 5 5 6 (a): class 1
80 30 14 3 12 (b): class 2
4 258 (c): class 3
2 73 31 (d): class 4
17 80 (e): class 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.

 Header pada kolom (column headers) menunjukkan nilai class risk_rating yang


diprediksi atau diklasifikasikan oleh model, dengan menggunakan label (a), (b), (c),
dan seterusnya.
 Header pada baris (row headers)  menunjukkan nilai class risk_rating pada data
sebenarnya. Masih direpresentasikan dengan (a), (b), (c), (d) dan (e). Namun disini
sudah diberikan informasi label tersebut merepresentasikan nilai risk_rating yang
mana. Terlihat kalau (a) merupakan representasi risk_rating dengan nilai 1, (b)
merupakan representasi risk_rating dengan nilai 2, dan seterusnya.
 Tiap perpotongan antara kolom dan baris merupakan informasi hasil prediksi
dari class ada di nilai pada kolom dibandingkan data aktual class-nya berada pada
nilai di baris.

Untuk lebih jelasnya, mari kita diskusikan arti dari nilai-nilai pada baris pertama dari matrix
ini.

(a) (b) (c) (d) (e) <-classified as


---- ---- ---- ---- ----
179 1 5 5 6 (a): class 1
80 30 14 3 12 (b): class 2
4 258 (c): class 3
2 73 31 (d): class 4
17 80 (e): class 5

 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.

(a) (b) (c) (d) (e) <-classified as


---- ---- ---- ---- ----
179 1 5 5 6 (a): class 1
80 30 14 3 12 (b): class 2
4 258 (c): class 3
2 73 31 (d): class 4
17 80 (e): class 5

Terakhir, kita coba jumlahkan seluruh angka ini:

 Angka dengan prediksi benar: 620 (179 + 30 + 258 + 73 + 80)


 Angka dengan prediksi salah: 180 (1 + 5 + 5 + 6 + 80 + 14 + 3 + 12 + 4 + 2 + 31 + 17)

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.

dataCreditRating$risk_rating[dataCreditRating$risk_rating == "1"]  <-  "satu"


dataCreditRating$risk_rating[dataCreditRating$risk_rating == "2"]  <-  "dua"
dataCreditRating$risk_rating[dataCreditRating$risk_rating == "3"]  <-  "tiga"
dataCreditRating$risk_rating[dataCreditRating$risk_rating == "4"]  <-  "empat"
dataCreditRating$risk_rating[dataCreditRating$risk_rating == "5"]  <-  "lima"

Tiap perintah ini memiliki tiga bagian, kita akan ambil contoh untuk perintah pertama:

 dataCreditRating$risk_rating[...], artinya kita mengakses kolom risk_rating  pada


indeks ke ...
 dataCreditRating$risk_rating == "1", artinya kita mengambil indeks dimana nilai
risk_rating bernilai "1"
 <- "satu", teks "satu" dimasukkan ke ...

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).

(a) (b) (c) (d) (e) <-classified as


---- ---- ---- ---- ----
30 3 12 80 14 (a): class dua
2 73 31 (b): class empat
17 80 (c): class lima
1 5 6 179 5 (d): class satu
4 258 (e): class tiga
Bandingkan dengan confusion matrix sebelumnya, dimana semua hasilnya tetap konsisten.
Hanya saja urutannya berubah.
 

(a) (b) (c) (d) (e) <-classified as


---- ---- ---- ---- ----
179 1 5 5 6 (a): class 1
80 30 14 3 12 (b): class 2
4 258 (c): class 3
2 73 31 (d): class 4
17 80 (e): class 5

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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating[dataCreditRating$risk_rating == "1"] <- "satu"

dataCreditRating$risk_rating[dataCreditRating$risk_rating == "2"] <- "dua"

dataCreditRating$risk_rating[dataCreditRating$risk_rating == "3"] <- "tiga"

dataCreditRating$risk_rating[dataCreditRating$risk_rating == "4"] <- "empat"

dataCreditRating$risk_rating[dataCreditRating$risk_rating == "5"] <- "lima"

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")


datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan model

risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk


Rating"))

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

Output tersebut menceritakan tingkat pentingnya penggunaan tiap variable. Disini


jumlah_tanggungan menempati urutan pertama dengan nilai 100% dan durasi_pinjaman
dengan 72.62%.
Ini juga yang menjelaskan kenapa jumlah_tanggungan menempati root node di model kita.

Diagram Decision Tree C5.0


Selain summary teks, kita memiliki output dari hasil plot C5.0 model yang terlihat sebagai
berikut.

Pada subbab berikutnya, kita akan bahas mengenai potongan dari diagram ini. Klik tombol
Next untuk melanjutkan.

Elemen dari Plot Decision Tree C5.0


Berikut adalah gambar dari plot Decision Tree C5.0 yang telah diberi warna dengan
penjelasan berikut (setelah gambar).

 Warna merah menunjukkan node dan penomoran nodenya


o bulatan merah nomor 1 adalah node nomor 1 adalah root node dengan
variable penentu jumlah_tanggungan.
o bulatan merah nomor 2 adalah node nomor 2 dengan variable penentu
jumlah_tanggungan.
o bulatan merah nomor 3 adalah node nomor 7 adalah leaf node untuk
klasifikasi risk_rating.
 Warna biru menunjukkan kondisi split ke node-node berikutnya
o bulatan biru nomor 4 menunjukkan kondisi split dimana durasi pinjaman
kurang atau sama dengan 24 bulan.
o bulatan biru nomor 5 menunjukkan kondisi split dimana durasi pinjaman lebih
dari 24 bulan.
 Warna hijau menunjukkan jumlah data yang telah diklasifikasi.
o bulatan hijau nomor 6 menunjukkan hasil klasifikasi sebanyak 98 data.
o bulatan hijau nomor 7 menunjukkan hasil klasifikasi sebanyak 129 data.
 Warna ungu menunjukkan hasil klasifikasi dan distribusinya (dalam rentang rasio
antara angka 0 dan  1).
o bulatan ungu nomor 8 menunjukkan risk_rating pada node tersebut mayoritas
adalah 4, dan dengan demikian model mengambil itu sebagai klasifikasinya.
Selain itu risk_rating 5, 1, dan 2 adalah data yang juga sebenarnya jatuh ke
dalam kondisi yang berakhir di node nomor 10 ini.
o bulatan ungu nomor 9 menunjukkan risk_rating pada node tersebut mayoritas
adalah 5, dan dengan demikian model mengambil itu sebagai klasifikasinya.
Selain itu risk_rating 4, 2, dan 1 adalah data yang juga sebenarnya jatuh ke
dalam kondisi yang berakhir di node nomor 11 ini.

Kesimpulan
Bab ini memfokuskan diri untuk memberi penjelasan output dari model yang meliputi aspek
berikut:

 Jumlah baris data yang diproses untuk menghasilkan model.


 Jumlah variable yang digunakan untuk menghasilkan model.
 Tampilan decision tree.
 Statistik error dari model ini.
 Confusion matrix yang menampilkan detil dari hasil klasifikasi dan aktual.
 Variable-variable yang digunakan dan tingkat pentingnya variable tersebut.

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 >

Menggunakan Fungsi Predict


 
Package C50 memiliki fungsi bernama predict, yang bisa digunakan untuk melakukan
prediksi berdasarkan input model dan data test. Fungsi lengkapnya terlihat sebagai berikut.

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.

> predict(risk_rating_model, input_testing_set)


[1] 1 3 4 1 5 4 4 2 1 3 3 1 3 3 3 4 3 1 1 3 5 3 5 1 4 4 1 3 3 1 2 3 3 1 3 5 3
[38] 3 3 1 3 3 5 1 5 1 5 1 3 3 4 1 3 1 1 3 1 1 1 5 1 1 3 3 3 1 3 4 1 3 3 3 1 3
[75] 4 3 2 1 3 1 5 5 1 1 4 4 3 2 4 1 1 4 1 3 1 1 1 5 4 3
Levels: 1 2 3 4 5

 
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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)


#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan model

risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk


Rating"))

predict(risk_rating_model, input_testing_set)

#menggunakan model untuk prediksi testing set

Menggabungkan Hasil Prediksi


Seperti diinformasikan pada subbab sebelumnya, kita akan menyimpan risk_rating dari
dataset awal dan hasil prediksi ini ke dalam dua kolom nama yang lain di data
frame input_testing_set. Mari kita namakan kolom tersebut
dengan risk_rating dan  hasil_prediksi.
Kita gunakan perintah pertama untuk menyimpan nilai asli risk_rating ke dalam kolom
risk_rating.

input_testing_set$risk_rating <- dataCreditRating[-indeks_training_set,]$risk_rating

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.

input_testing_set$hasil_prediksi <- predict(risk_rating_model, input_testing_set)

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.

durasi_pinjaman_bulan jumlah_tanggungan risk_rating hasil_prediksi


3 12 0 1 1
8 48 3 2 3
21 24 5 2 4
26 12 0 1 1
28 36 5 2 5
37 24 5 2 4
39 24 5 1 4
45 48 0 1 2
49 36 2 1 1
53 12 4 2 3
54 48 1 2 3
58 12 0 1 1
60 48 3 2 3
61 48 2 2 3
62 24 4 2 3
65 24 5 2 4
75 24 3 2 3
97 12 0 1 1
112 12 0 1 1
117 24 3 3 3
123 36 6 4 5
125 36 4 3 3
128 36 6 4 5
162 12 0 1 1
166 24 6 4 4
187 12 6 5 4
192 36 1 1 1
198 12 3 3 3
219 48 2 3 3
221 36 1 1 1
239 48 0 2 2
250 24 4 3 3
255 48 1 3 3
276 36 1 1 1
284 24 4 3 3
287 36 6 5 5
291 24 4 3 3
323 48 4 3 3
329 48 1 3 3
335 24 0 1 1
336 48 2 3 3
338 36 3 3 3
345 36 5 4 5
348 24 0 1 1
350 48 6 5 5
356 36 2 2 1
386 48 5 4 5
398 12 1 1 1
406 36 4 3 3
416 24 3 3 3
434 12 6 4 4
460 12 1 1 1
466 48 1 3 3
514 36 2 1 1
520 24 1 2 1
526 24 3 3 3
532 36 1 1 1
539 36 2 2 1
541 24 1 1 1
548 48 6 5 5
560 24 1 1 1
564 24 1 1 1
568 48 3 3 3
570 48 4 3 3
572 24 4 3 3
584 36 2 1 1
585 36 4 3 3
587 12 6 4 4
588 12 2 1 1
646 48 1 3 3
660 36 4 3 3
665 12 4 3 3
666 36 0 2 1
673 48 3 3 3
677 24 5 4 4
678 48 4 3 3
679 48 0 2 2
681 36 1 1 1
684 48 2 3 3
687 12 2 1 1
701 48 5 4 5
704 48 6 5 5
707 12 2 1 1
708 12 2 1 1
716 12 5 4 4
732 24 6 4 4
734 24 3 3 3
767 48 0 2 2
776 12 6 4 4
781 24 2 1 1
782 24 2 1 1
790 12 6 4 4
813 24 2 1 1
839 24 4 3 3
842 36 0 2 1
845 24 2 2 1
853 24 2 1 1
861 48 5 5 5
862 12 6 4 4
870 48 3 3 3

 
library("openxlsx")

library("C50")

#Mempersiapkan data

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]


#menghasilkan model

risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk


Rating"))

#menyimpan hasil prediksi testing set ke dalam kolom hasil_prediksi

input_testing_set$risk_rating <- dataCreditRating[-indeks_training_set,]$risk_rating

input_testing_set$hasil_prediksi <- predict(risk_rating_model, input_testing_set)

print(input_testing_set)

Membuat Table Confusion Matrix


Setelah hasil prediksi terhadap testing set selesai, langkah berikutnya kita coba lihat
distribusi mana yang terprediksi dengan benar dan salah. Ini kita lakukan dengan confusion
matrix.
Untuk menghasilkan ini kita bisa gunakan fungsi dcast dari package reshape2, caranya
adalah sebagai berikut.

dcast(kolom ~ baris, dataframe)

Dan untuk kasus kita, maka modifikasi perintahnya adalah sebagai berikut.

dcast(hasil_prediksi ~ risk_rating, data=input_testing_set)

Gunakan perintah tersebut untuk menggantikan bagian #[...1...] - setelah perintah


penggabungan input variables dan hasil prediksi.

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

Yang kita perhatikan adalah bagian berwarna 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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer


indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan model

risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk


Rating"))

#menyimpan risk_rating dari data awal dan hasil prediksi testing set ke dalam kolom hasil_prediksi

input_testing_set$risk_rating <- dataCreditRating[-indeks_training_set,]$risk_rating

input_testing_set$hasil_prediksi <- predict(risk_rating_model, input_testing_set)

#membuat confusion matrix

dcast(hasil_prediksi ~ risk_rating, data=input_testing_set)

Jumlah Data dengan Prediksi Benar


 
Untuk menghitung persentase error, kita bisa menghitung terlebih dahulu jumlah data
dengan prediksi yang benar. Hasil dikatakan benar jika data risk_rating sama dengan
hasil_prediksi. Ini kalau kita tuliskan dengan code adalah sebagai berikut.

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.

durasi_pinjaman_bulan jumlah_tanggungan risk_rating hasil_prediksi


3 12 0 1 1
26 12 0 1 1
49 36 2 1 1
58 12 0 1 1
97 12 0 1 1
112 12 0 1 1
117 24 3 3 3
125 36 4 3 3
162 12 0 1 1
...
Terlihat semua hasil filtering memiliki nilai yang sama untuk
kolom risk_rating dan hasil_prediksi. Kita kemudian akan menghitung jumlah baris filtering
ini dengan menambahkan fungsi nrow terhadap perintah di atas, sebagai 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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan model

risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk


Rating"))

#menyimpan risk_rating dari data awal dan hasil prediksi testing set ke dalam kolom hasil_prediksi

input_testing_set$risk_rating <- dataCreditRating[-indeks_training_set,]$risk_rating

input_testing_set$hasil_prediksi <- predict(risk_rating_model, input_testing_set)

#Menghitung jumlah prediksi yang benar


nrow(input_testing_set[input_testing_set$risk_rating==input_testing_set$hasil_prediksi,])

Jumlah Data dengan Prediksi Salah


Pada praktek sebelumnya, kita menggunakan operator == untuk membandingkan kesamaan
antara kolom risk_rating dengan hasil_prediksi. Bagaimana kalau kita hanya ingin mencari
yang tidak sama, dengan kata lain mencari yang salah prediksinya?
Untuk ini cukup simpel, kita bisa menggunakan operator != sehingga kondisi pengecekan
sebelumnya menjadi seperti berikut.
nrow(input_testing_set[input_testing_set$risk_rating!=input_testing_set$hasil_prediksi,])
Cari dan gantilah operator == pada perbandingan hasil ini dengan !=. Jika berjalan dengan
lancar maka akan mengeluarkan hasil berikut.

> 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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]


#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan model

risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk


Rating"))

#menyimpan risk_rating dari data awal dan hasil prediksi testing set ke dalam kolom hasil_prediksi

input_testing_set$risk_rating <- dataCreditRating[-indeks_training_set,]$risk_rating

input_testing_set$hasil_prediksi <- predict(risk_rating_model, input_testing_set)

#Menghitung jumlah prediksi yang salah

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.

Menggunakan Model untuk Prediksi


Pendahuluan
Tahap terakhir setelah kita melakukan evaluasi dan yakin akan akurasinya, model akan kita
gunakan dalam keseharian untuk melakukan prediksi risk rating dari data baru.

Mempersiapkan Data Pengajuan Baru


Data pengajuan baru perlu dibentuk sebagai satu data frame dengan input dimana nama-
nama variable yang digunakan harus sama persis. Dari awal pemodelan, kita menggunakan
dua variable yakni:

 jumlah_tanggungan
 durasi_pinjaman_bulan

Keduanya dalam bentuk numerik (angka). Dan berikut adalah contoh membentuk data frame
dengan dua variable tersebut.

aplikasi_baru <- data.frame(jumlah_tanggungan = 6, durasi_pinjaman_bulan = 12)

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

aplikasi_baru <- data.frame(jumlah_tanggungan = 6, durasi_pinjaman_bulan = 12)

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

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)


input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan dan menampilkan summary model

risk_rating_model <- C5.0(input_training_set, class_training_set)

#Membuat data frame aplikasi baru

aplikasi_baru <- data.frame(jumlah_tanggungan = 6, durasi_pinjaman_bulan = 12)

#melakukan prediksi

predict(risk_rating_model, aplikasi_baru)

library("openxlsx")

library("C50")

#Mempersiapkan data

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")


#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan dan menampilkan summary model

risk_rating_model <- C5.0(input_training_set, class_training_set)

#Membuat data frame aplikasi baru

aplikasi_baru <- data.frame(jumlah_tanggungan = 6, durasi_pinjaman_bulan = 12)

#melakukan prediksi

predict(risk_rating_model, aplikasi_baru)

library("openxlsx")

library("C50")
#Mempersiapkan data

dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")

#Mempersiapkan class dan input variables

dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)

input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")

datafeed <- dataCreditRating[ , input_columns ]

#Mempersiapkan training dan testing set

set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer

indeks_training_set <- sample(900, 800)

#Membuat dan menampilkan training set dan testing set

input_training_set <- datafeed[indeks_training_set,]

class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating

input_testing_set <- datafeed[-indeks_training_set,]

#menghasilkan dan menampilkan summary model

risk_rating_model <- C5.0(input_training_set, class_training_set)

#Membuat data frame aplikasi baru

aplikasi_baru <- data.frame(jumlah_tanggungan = 6, durasi_pinjaman_bulan = 64)

#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:

 Input berupa data frame.


 Kolom-kolom di dalam data frame harus sama dengan input yang
digunakan untuk menghasilkan model.

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:

 Mengerti apa itu decision tree dan algoritma C5.0.


 Melakukan data preparation untuk class variable dan input variable.
 Melakukan data preparation untuk training dan testing set.
 Menggunakan training set untuk menghasilkan model credit risk menggunakan
algoritma C5.0.
 Mengevaluasi akurasi decision credit risk.
 Menggunakan model tersebut untuk memprediksi risk rating data pengajuan baru.

Data Science in Retail: Market Basket Analysis

Market Basket Analysis


Pengantar
Anda mungkin sering mendengar mengenai bagaimana banyak bisnis berkembang dan maju
dengan cepat karena inovasi, baik itu inovasi di sisi produk ataupun bisnis.
Salah satu inovasi bisnis di bidang ritel adalah mencari asosiasi atau hubungan antar produk
dari data transaksi penjualan yang bertujuan untuk:

 dipaketkan dan dijual bersamaan.


 memberikan rekomendasi produk kepada seseorang.
 menyusun rak display.
 menyusun halaman produk e-commerce.

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). 

Tujuan dari Market Basket Analysis


Dari video pengantar sebelumnya, kita dapat ambil kesimpulan bahwa Market Basket
Analysis bertujuan untuk mencari rekomendasi paket produk - berdasarkan pola unik dari
data transaksi pelanggan - yang dapat meningkatkan penjualan.
Lalu apa yang bisa kita lakukan dengan rekomendasi paket ini? Dari video tersebut kita bisa
melakukan hal seperti menyusun tampilan produk pada website e-commerce atau susunan
produk pada rak toko. 
Contoh Code Market Basket Analysis di R
Penerapan Market Basket Analysis (MBA) di R dapat menggunakan algoritma apriori – yang
merupakan salah satu algoritma terpopuler di area machine learning - pada
package arules. Arules sendiri adalah singkatan dari association rules - kategori machine
learning. Untuk menjalankan algoritma ini diperlukan dibutukan dua data, yaitu data produk
dan data transaksi.
Berikut adalah contoh code di R yang jika dijalankan akan memunculkan contoh data
transaksinya seperti 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
Dan hasil pemaketan produk yang disarankan terlihat seperti berikut .

lhs rhs support confidence lift


[1] {Pet Food} => {Sirup} 0.4 0.8000000 1.333333
[2] {Sirup} => {Pet Food} 0.4 0.6666667 1.333333
[3] {Gula,Pet Food} => {Sirup} 0.1 1.0000000 1.666667
[4] {Pet Food,Teh Celup} => {Sirup} 0.2 0.6666667 1.111111

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.

#Menggunakan library arules

library(arules)

#Membaca transaksi dari file data_transaksi.txt

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

#Menampilkan data transaksi dengan print dan inspect

inspect(transaksi)

#Menghasilkan model Market Basket Analysis

mba <- apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))

#Menampilkan paket produk

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:

 Membuat paket produk dengan penawaran menarik.


 Menyusun produk dengan asosiasi kuat secara berdampingan pada rak toko.
 Menyusun tampilan katalog website e-commerce.
 Memberikan rekomendasi produk.

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.

Menampilkan Kombinasi dari Contoh


Transaksi "Kecil"
Dari subbab "Contoh Code Market Basket Analysis di R" pada bab satu kita telah melihat isi
file dengan 10 transaksi yang terdapat pada file kita. Disini, DQLab akan mencantumkan
hasilnya seperti terlihat di bawah ini.

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)

#Membaca transaksi dari file data_transaksi.txt

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

#Menampilkan jumlah kombinasi dari produk yang terdapat pada daftar transaksi yang ada

inspect(apriori(transaksi, parameter = list(support=.1, minlen=2, target='frequent itemsets')))

Menampilkan Kombinasi dari Transaksi


"Besar"
Setelah pada subbab sebelumnya kita melihat kombinasi dari transaksi yang hanya
berjumlah 10. Pada praktek kali ini, kita akan membaca file dimana di dalamnya terdapat 100
transaksi - yang jika ditampilkan sebagian hasilnya akan terlihat sebagai berikut. Ini lebih
mencerminkan transaksi pada dunia nyata - yang jumlah transaksinya bahkan bisa sampai
jutaan - dibandingkan dengan contoh sebelumnya.

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)

#Membaca transaksi dari file data_transaksi2.txt

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi2.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

#Menampilkan jumlah kombinasi dari produk yang terdapat pada daftar transaksi yang ada

inspect(apriori(transaksi, parameter = list(support=.03, minlen=2, target='frequent itemsets')))

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.

Item, Itemset and Rules


Pengantar
Pada bagian praktek di bab pertama, kita sekilas telah melihat output pengolahan algoritma
apriori dalam bentuk kombinasi seperti berikut.

lhs rhs support confidence lift


[1] {Pet Food} => {Sirup} 0.4 0.8000000 1.333333
[2] {Sirup} => {Pet Food} 0.4 0.6666667 1.333333
[3] {Gula,Pet Food} => {Sirup} 0.1 1.0000000 1.666667
[4] {Pet Food,Teh Celup} => {Sirup} 0.2 0.6666667 1.111111

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.

lhs rhs support confidence lift


[1] {Pet Food} => {Sirup} 0.4 0.8000000 1.333333
[2] {Sirup} => {Pet Food} 0.4 0.6666667 1.333333
[3] {Gula,Pet Food} => {Sirup} 0.1 1.0000000 1.666667
[4] {Pet Food,Teh Celup} => {Sirup} 0.2 0.6666667 1.111111

 Item adalah produk tunggal yang terdapat dalam suatu transaksi.


Contoh: Pet Food, Sirup, Gula, dan Teh Celup.
 Itemset adalah kombinasi satu atau lebih item yang terdapat dalam satu transaksi.
Contoh: {Pet Food}, {Gula, Pet Food}, {Sirup}, dan lain-lain. 
 Rule adalah pernyataan hubungan antar Itemset. Biasanya dapat diformulasikan
menjadi "Jika membeli itemset A, maka akan membeli itemset B".
Contoh: {Pet Food} => {Sirup}, {Pet Food, Teh Celup} => {Sirup}, dan lain-lain. 
Dengan memahami ini, kita telah siap untuk melanjutkan ke bagian bab berikutnya
mengenai transaksi. 

Item and Transaction


Pengantar
Pada bab sebelumnya, telah disebutkan bahwa item, itemset dan rules dihasilkan dari
transaksi atau transaction tapi belum diceritakan sendiri apa itu sebenarnya yang dimaksud
dengan transaksi.
Mari kita mulai dari contoh dari output praktek pada bab pertama.

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.

File contoh ini dapat di-download


di https://storage.googleapis.com/dqlab-dataset/data_transaksi.txt
Data yang ada pada file ini memiliki dua kolom sebagai berikut:

 Kode Transaksi: Kode transaksi, ini bisa dianggap nomor struk.


 Item: Nama item yang dibeli.

Jika divisualisasikan dari data transaksi, akan terlihat sebagai berikut.


Dataset ini akan dipakai sepanjang course ini dan telah dibuat sesederhana mungkin agar
kita dapat mudah memahami datanya tanpa mengurangi esensi course.
Next >

Membaca File sebagai Data Frame


 
Data frame adalah tipe data yang banyak digunakan oleh berbagai algoritma di R. Walaupun
nanti akan kita olah dengan tipe data lain yang bernama transaction.
Nah, sebelum kesana ada baiknya kita coba membaca dataset kita apa adanya dengan tipe
data frame. Ini bisa kita lakukan di R dengan menggunakan perintah read.csv. 
Mari kita praktekkan penggunaan read.csv ini dengan mengetikkan perintah berikut pada
code editor untuk menggantikan bagian #[...1...].

transaksi_tabular <-
read.csv("https://storage.googleapis.com/dqlab-dataset/data_transaksi.txt", sep="\t")

Berikut adalah keterangan per bagian dari perintah tersebut:

 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

transaksi_tabular <- read.csv("https://academy.dqlab.id/dataset/data_transaksi.txt", sep="\t")

#Menampilkan variable transaksi_tabular dengan fungsi print

print(transaksi_tabular)

Membaca File sebagai Transaction


Dari latihan sebelumnya, membaca file transaksi ini dengan data.frame cukup menyulitkan
karena kita perlu menghitung manual atau menggunakan fungsi-fungsi lain untuk data
frame.
Untuk ini, ada tipe data lain yang lebih tepat untuk itu bernama transactions dan berasal dari
package R bernama arules. Function yang digunakan untuk menghasilkan tipe data ini
adalah read.transactions.
Berikut adalah contoh penggunaan untuk membaca dataset kita.

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.

Gantilah potongan […] pada code editor dengan detil perintah read.transactions persis


seperti contoh di atas. Jika semuanya berjalan lancar, Anda akan mendapatkan hasil berikut.

transactions in sparse format with


10 transactions (rows) and
4 items (columns)

Keterangan hasil:

 transactions in sparse format: Ini artinya transaksi dalam bentuk sparse (tersebar). Ini


mungkin akan lebih jelas ketika divisualiasikan dalam bentuk matrix, ini akan kita praktekkan
pada beberapa subbab di depan.
 10 transactions (rows): dataset kita secara total memiliki 10 transaksi. Ada
informasi rows atau baris disini, ini bukan berarti data kita ada 10 baris di file kita. Karena
pada kenyataannya, file memiliki 23 baris data. 
 4 items (kolom): dataset kita secara total memiliki 4 item unik.

library(arules)

read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt", format="single", sep="\t",


cols=c(1,2), skip=1)

Menampilkan Daftar Item Transaksi


Item-item yang terdapat pada objek transactions dapat dilihat pada
komponen itemInfo dengan didahului aksesor @, jadi ditulis @iteminfo. Ini bermanfaat
untuk melihat daftar unik item yang terdapat pada data transaksi yang sedang kita analisa. 
Mari kita praktekkan untuk lebih jelasnya, pada code editor kita terlihat potongan code
dimana hasil read.transactions disimpan dalam sebuah variable bernama transaksi. 

transaksi <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/


data_transaksi.txt", format="single", sep="\t", cols=c(1,2), skip=1)
Dengan disimpannya objek transaction ke dalam variable transaksi, maka bisa kita analisa
lebih lanjut. Nah daftar item dari objek transaksi ini bisa kita lihat dengan penulisan berikut.

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 <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

transaksi@itemInfo

Menampilkan Daftar Kode Transaksi


Sepuluh transaksi yang telah dibaca oleh read.transactions dapat dilihat detil kode-kodenya
dengan menggunakan komponen itemsetInfo dengan aksesor @, atau lengkapnya ditulis
dengan @itemsetInfo. Daftar ini bisa bermanfaat sebagai basis untuk menganalisa atau
melakukan validasi dengan data yang ada pada sistem ritel.
Menyambung praktek sebelumnya, berikut adalah contoh penulisan untuk mengakses daftar
kode transaksi dari variable transaksi.

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 <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

transaksi@itemsetInfo

Tampilan Transaksi dalam bentuk Matrix


 
Ada kalanya kita ingin melihat sebaran item pada keseluruhan transaksi kita. Dengan
menggunakan daftar output berupa teks akan terasa sangat panjang. Sebagai salah satu
solusinya, kita bisa menampilkan sebaran ini dalam bentuk matrix dua dimensi, dimana baris
matrix urutan item dan pada kolom adalah item transaksi. Untuk lebih jelasnya, mari kita
langsung praktekkan saja.
Matrix dari objek transaction dapat dilihat dari komponen data menggunakan aksesor @,
ditulis lengkap sebagai @data. Menyambung praktek sebelumnya, maka objek matrix pada
variable transaksi kita ditulis sebagai berikut.

transaksi@data

Tambahkan perintah di atas pada code editor dan jalankan. Jika berhasil dijalankan,
harusnya muncul tampilan matrix sebagai berikut.

4 x 10 sparse Matrix of class "ngCMatrix"


[1,] . | . . | . . . | |
[2,] | . | . . | | . . |
[3,] | . | | | . | . . |
[4,] | | . | | | | | | . 
Berikut adalah penjelasan hasilnya:

 4 x 10 :  artinya terdapat 4 item dan 10 transaksi.


 [1,] s/d [4,] : artinya index yang mewakili tiap item dalam transaksi. Index ini
sebenarnya mencerminkan urutan dari hasil dari subbab "Menampilkan Daftar Item
Transaksi" 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.

 Simbol tanda titik .  menunjukkan item tidak ada di transaksi.


 Simbol garis lurus |  menunjukkan bahwa item ada di transaksi.

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.

4 x 10 sparse Matrix of class "ngCMatrix"


[1,] . | . . | . . . | |
[2,] | . | . . | | . . |
[3,] | . | | | . | . . |
[4,] | | . | | | | | | .

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 <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

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.

> itemFrequency(transaksi, type="absolute")


Gula Pet Food Sirup Teh Celup
4 5 6 8

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)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

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.

data_item <- sort(data_item, decreasing = TRUE)

Fungsi sort di atas menerima input variable data_item, dan karena permintaan untuk


mengurutkan dari jumlah terbesar ke terkecil maka kita perlu menambahkan
parameter decreasing = TRUE. 
Catatan: jika kita ingin tetap mengurutkan item dari jumlah terkecil ke terbesar maka
parameter ini tidak perlu kita gunakan, atau kalau tetap mau digunakan maka diisi dengan
nilai FALSE.
Jalankan code Anda, dan jika berhasil maka muncul tampilan berikut.

> 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.

data_item <- data_item[1:3]

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.

data_item <- data.frame("Nama Produk"=names(data_item), "Jumlah"=data_item,


row.names=NULL)

Berikut adalah penjelasan detil dari perintah tersebut:

 data.frame: fungsi untuk membuat suatu data frame.


 "Nama Produk" <- names(data_item): adalah nama kolom pertama ("Nama
Produk") yang diisi dengan nama atau label dari vector data_item (Teh Celup, Sirup,
Pet Food)
 "Jumlah" <- data_item: adalah nama kolom kedua ("Jumlah") yang diisi dengan
nilai-nilai vector data_item (8, 6, 5)
 row.names = NULL: artinya tidak memerlukan label pada tiap baris data frame, kalau
parameter ini tidak ada maka output yang akan kita dapatkan jadi seperti berikut.

 Nama.Produk Jumlah

 Teh Celup Teh Celup 8

 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)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

data_item <- itemFrequency(transaksi, type="absolute")

#Melakukan sorting pada data_item

data_item <- sort(data_item, decreasing = TRUE)

#Mengambil 3 item pertama

data_item <- data_item[1:3]

#Konversi data_item menjadi data frame dengan kolom Nama_Produk dan Jumlah

data_item <- data.frame("Nama Produk"=names(data_item), "Jumlah"=data_item, row.names=NULL)

print(data_item)

Output Statistik Top 3 Sebagai File


 
Selain sebagai tampilan pada console, output dari sistem DQLab dapat berupa file. Dalam
kesempatan kali ini, kita akan praktekkan bagaimana membuat file output untuk statistik top
3.
Dari hasil sebelumnya, kita sudah mendapatkan statistik top 3 dari jumlah item terbanyak
dalam bentuk data frame. Ini bisa kita tuliskan langsung menggunakan fungsi write.csv,
selengkapnya adalah sebagai berikut.

write.csv(data_item, file="top3_item_retail.txt", eol = "\r\n")

Disini kita menulis variable data_item ke dalam file bernama "top_3_item.retail.txt" yang


diisikan ke dalam parameter file. Terdapat tambahan parameter eol = "\r\n", yang berguna
untuk menghasilkan file yang bisa ditampilkan di Windows dengan baik.
Catatan: parameter terakhir ini bisa Anda abaikan pada saat mengerjakan proyek yang ada di
DQLab.
Masukkan perintah tersebut ke dalam code editor untuk menggantikan bagian #[...1...]
kemudian jalankan. Jika berhasil maka output console akan kosong, hanya menampilkan
eksekusi perintah tersebut.

> write.csv(data_item, file="top3_item_retail.txt", eol = "\r\n")

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.

Makin asyik bukan belajar pengolahan data dengan sistem DQLab? :)


Mari klik tombol "Submit Code" untuk mengirimkan hasil dan melanjutkan ke bagian
berikutnya.
library(arules)
transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",
format="single", sep="\t", cols=c(1,2), skip=1)

data_item <- itemFrequency(transaksi, type="absolute")

#Melakukan sorting pada data_item

data_item <- sort(data_item, decreasing = TRUE)

#Mengambil 3 item pertama

data_item <- data_item[1:3]

#Konversi data_item menjadi data frame dengan kolom Nama_Produk dan Jumlah

data_item <- data.frame("Nama Produk"=names(data_item), "Jumlah"=data_item, row.names=NULL)

#Menulis File Statistik Top 3

write.csv(data_item, file="top3_item_retail.txt", eol = "\r\n")

Grafik Item Frequency


Selain tampilan transaksi dalam bentuk matrix, kita bisa juga melihat distribusi transaksi dari
tiap item dalam bentuk grafik dengan menggunakan fungsi itemFrequencyPlot.
Perintahnya sederhana, seperti terlihat pada contoh berikut dimana kita plot distribusi dari
dataset kita.

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)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

#Tampilan item frequency plot

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 >

Itemset and Rules


Pengantar
Pada bab ketiga, "Item, Itemset and Rules" telah dijelaskan dengan gamblang mengenai apa
yang dimaksud dengan item, itemset yang terdiri dari beberapa item, dan rules yang
menjelaskan hubungan antar itemset yang terdiri dari lhs (left hand side) dan rhs (right hand
side).
Kita akan masuk ke inti dari algoritma apriori, yaitu bagaimana menghasilkan dan mengelola
kombinasi itemset dan rules yang besar dengan R. Tentunya masih menggunakan dataset
sederhana yang sudah kita perkenalkan dari awal.

Melihat Itemset per Transaksi dengan Inspect


Tiap transaksi terdiri atas beberapa item atau itemset. Pada praktek sebelumnya, kita baru
melihat visualisasi dan sebaran matrix dari tiap transaksi namun masih sulit dicerna.
Untuk melihat notasi itemset yang lebih baik dan mudah dimengerti kita bisa menggunakan
function inspect.
Penggunaan function ini juga sederhana. Seperti terlihat pada contoh berikut dimana kita
inspect variable transaksi kita.

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)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

#Menggunakan inspect terhadap transaksi

inspect(transaksi)

Menghasilkan Rules dengan Apriori


Saatnya kita menghasilkan rule dari transaksi kita. Seperti dijelaskan pada bab tiga, rule
adalah formula yang menyatakan kombinasi dari dua itemset. Satu itemset ada di bagian kiri
rule (left hand side) dan satunya di bagian kanan (right hand side) dalam format berikut.

{itemset lhs} => {itemset rhs}

Untuk menghasilkan rule ini, kita gunakan fungsi apriori dengan syntax berikut.

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

Absolute minimum support count: 1

set item appearances ...[0 item(s)] done [0.00s].


set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
sorting and recoding items ... [4 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 done [0.00s].
writing ... [3 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
set of 3 rules

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)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)
#Menghasilkan associaton rules

apriori(transaksi)

Melihat Rules dengan fungsi inspect


Di awal bab, kita bisa melihat daftar transaksi dengan menggunakan fungsi inspect. Selain
transaksi, fungsi ini bisa digunakan juga untuk melihat isi dari association rules yang
dihasilkan oleh fungsi apriori.
Perhatikan pada code editor, hasil eksekusi apriori berupa rules sudah disimpan dalam
variable bernama mba. Jadi untuk menampilkan isi rules pada variable ini kita gunakan
perintah berikut.

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.

lhs rhs support confidence lift


[1] {} => {Teh Celup} 0.8 0.8 1.000000
[2] {Pet Food} => {Sirup} 0.4 0.8 1.333333
[3] {Gula,Pet Food} => {Sirup} 0.1 1.0 1.666667

Terlihat kalau variable mba menyimpan tiga rules dengan kolom-kolom berikut:

 lhs: itemset di bagian kiri (left hand side)


 rhs: itemset di bagian kanan (right hand side)
 support, confidence dan lift: metrik-metrik yang digunakan untuk menilai kualitas
dari rule. Umumnya semakin besar semakin baik. Detil dari metrik-metrik ini akan
dibahas pada bab berikutnya.

Kalau fokus kita kembali ke itemset lhs dan rhs untuk product packaging, terlihat rule kedua


yaitu {Pet Food} => {Sirup} cukup menarik.
Kenapa bisa dikatakan menarik?
Karena support 0.4 menunjukkan bahwa kombinasi ini terdapat di 40 persen poulasi - berarti
4 dari 10 transaksi untuk dataset kita. Nilai lift juga di atas 1, yang artinya rule ini memiliki
asosiasi tinggi antar itemset yang terdapat di rule ini.
Sedangkan {} => {Teh Celup} tidak menarik karena hanya berisi satu item. Rule sisanya, {Gula,
Peta Food} = > {Sirup} terlalu unik - ini ditunjukkan dengan support 0.1 (10%) yang artinya
hanya terdapat di 1 dari 10 transaksi.
Apa makna dari rule jika ingin kita aplikasikan?
Artinya ada beberapa opsi action item yang bisa kita lakukan:

 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)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

#Menghasilkan association rules dan disimpan sebagai variable mba

mba <- apriori(transaksi)

#Melihat isi dari rules dengan menggunakan fungsi inspect

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.

inspect(subset(rules, rhs %in% teks_atau_vector_teks_yang_mewakili_item))

Kita langsung contohkan saja dengan kasus kita. Misalkan kita ingin mengambil rules yang
kolom rhs-nya mengandung Sirup, maka perintahnya adalah sebagai berikut.

inspect(subset(mba, rhs %in% "Sirup"))


Ini artinya kita akan filter rules dimana pada rhs memiliki item "Sirup".
Tambahkan code ini pada code editor perintah dan jalankan. Jika berhasil maka rule yang
muncul adalah sebagai berikut.

lhs rhs support confidence lift


[1] {Pet Food} => {Sirup} 0.4 0.8 1.333333
[2] {Gula,Pet Food} => {Sirup} 0.1 1.0 1.666667

library(arules)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

#Menghasilkan association rules dan disimpan sebagai variable mba

mba <- apriori(transaksi)

#Filter rhs dengan item "Sirup" dan tampilkan

inspect(subset(mba, rhs %in% "Sirup"))

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.

lhs rhs support confidence lift


[1] {Gula,Pet Food} => {Sirup} 0.1 1 1.666667
 
library(arules)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

mba <- apriori(transaksi)

inspect(subset(mba, lhs %in% "Gula"))

Filter LHS dan RHS


Kedua praktek sebelumnya menerapkan filter pada lhs atau rhs pada suatu waktu. Kita
sebenarnya bisa melakukan filter untuk kedua sisi dengan menggunakan operator & untuk
AND dan operator | untuk OR.
Berikut adalah contoh perintah inspect untuk filter lhs dengan item Pet Food dan rhs dengan
item Sirup.
inspect(subset(mba, lhs %in% "Pet Food" & rhs %in% "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.
 

lhs rhs support confidence lift


[1] {Pet Food} => {Sirup} 0.4 0.8 1.333333
[2] {Gula,Pet Food} => {Sirup} 0.1 1.0 1.666667

 
library(arules)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

mba <- apriori(transaksi)

inspect(subset(mba, lhs %in% "Pet Food" & rhs %in% "Sirup"))


Kesimpulan
Pada bab ini kita telah mempelajari apa yang dinamakan itemset dan bagaimana membuat
association rules dari itemset menggunakan function apriori.
Selain itu kita juga telah mengetahui bagaimana menganalisa itemset dan rules yang
dihasilkan dengan inspect. Serta akhirnya bisa melakukan filter terhadap itemset di lhs
maupun rhs dari rules yang dihasilkan.
Walaupun masih banyak hal bisa kita gunakan untuk menghasilkan rules dan juga
analisanya. Untuk awal, ini akan menjadi dasar yang sangat baik sebelum kita melangkah ke
hal yang lebih kompleks.

Scoring and Evaluation: Support,


Confidence and Lift
Pengantar
Ketika menggunakan inspect pada bab sebelumnya, kita melihat adanya beberapa informasi
metrik yang dapat menentukan seberapa berkualitasnya sebuah rule.

lhs rhs support confidence lift


[1] {} => {Teh Celup} 0.8 0.8 1.000000
[2] {Pet Food} => {Sirup} 0.4 0.8 1.333333
[3] {Gula,Pet Food} => {Sirup} 0.1 1.0 1.666667

Metrik-metrik ini adalah support, confidence dan lift. Apa sebenarnya itu? Kenapa kita harus
mengerti dan menggunakannya lebih lanjut?

Menghasilkan Rules dengan Parameter Support


dan Confidence
Pada bab sebelumnya, kita menghasilkan tiga rules dengan function apriori secara default
tanpa parameter apapun. Padahal sebenarnya kita bisa memasukkan parameter tambahan
berupa support dan confidence.
Tanpa parameter tambahan tersebut, maka nilai minimum support adalah 0.1 dan minimum
confidence adalah 0.8 sebagai filter dari function apriori.
Berikut adalah perintah untuk menghasilkan kembali association rules dengan function
apriori, tapi kali ini dengan tambahan parameter minimum support dan confidence masing-
masing bernilai 0.1 dan 0.5.
apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))
Tugas Praktek
Tambahkan perintah pada code editor untuk menghasilkan rule dengan tingkat support
minimum 0.1 dan minimum confidence 0.5.
Hasilnya akan terlihat sebagai berikut.

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

Absolute minimum support count: 1

set item appearances ...[0 item(s)] done [0.00s].


set transactions ...[4 item(s), 10 transaction(s)] done [0.01s].
sorting and recoding items ... [4 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 done [0.00s].
writing ... [16 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
set of 16 rules

Perhatikan pada akhir baris output, terdapat 16 rule. Lebih banyak dibandingkan eksekusi
perintah apriori sebelumnya yang hanya menghasilkan 3 rule.
library(arules)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))

Inspeksi Rules Yang Dihasilkan


Dengan pengetahuan kita dari bab sebelumnya, menggunakan function kita bisa menggali
informasi detil dari rules dengan inspect.
Tugas Praktek
Tambahkan perintah pada code editor untuk menyimpan association rules ke dalam
variable mba dan tampilkan isinya dengan function inspect.
Jika semua berjalan lancar, hasilnya akan terlihat sebagai berikut. 

lhs rhs support confidence lift


[1] {} => {Pet Food} 0.5 0.5000000 1.0000000
[2] {} => {Sirup} 0.6 0.6000000 1.0000000
[3] {} => {Teh Celup} 0.8 0.8000000 1.0000000
[4] {Gula} => {Sirup} 0.2 0.5000000 0.8333333
[5] {Gula} => {Teh Celup} 0.3 0.7500000 0.9375000
[6] {Pet Food} => {Sirup} 0.4 0.8000000 1.3333333
[7] {Sirup} => {Pet Food} 0.4 0.6666667 1.3333333
[8] {Pet Food} => {Teh Celup} 0.3 0.6000000 0.7500000
[9] {Sirup} => {Teh Celup} 0.4 0.6666667 0.8333333
[10] {Teh Celup} => {Sirup} 0.4 0.5000000 0.8333333
[11] {Gula,Pet Food} => {Sirup} 0.1 1.0000000 1.6666667
[12] {Gula,Sirup} => {Pet Food} 0.1 0.5000000 1.0000000
[13] {Gula,Sirup} => {Teh Celup} 0.1 0.5000000 0.6250000
[14] {Pet Food,Sirup} => {Teh Celup} 0.2 0.5000000 0.6250000
[15] {Pet Food,Teh Celup} => {Sirup} 0.2 0.6666667 1.1111111
[16] {Sirup,Teh Celup} => {Pet Food} 0.2 0.5000000 1.0000000

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)

apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))

mba <- apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))

inspect(mba)

Filter LHS dan RHS (2)


Dengan 16 rules yang dihasilkan, kita bisa memiliki lebih banyak pilihan untuk melakukan
filter lhs dan rhs seperti yang telah ditunjukkan pada bab Itemset and Rules.
Berikut adalah contoh untuk filter dimana lhs atau rhs keduanya memiliki item Teh Celup.
subset(mba, lhs %in% "Teh Celup" | rhs %in% "Teh Celup")
 
Tugas Praktek
Tambahkan perintah pada code editor menampilkan rules yang telah difilter berdasarkan lhs
atau rhs yang memiliki item Teh Celup.
Hasilnya akan terlihat sebagai berikut.
  

lhs rhs support confidence lift


[1] {} => {Teh Celup} 0.8 0.8000000 1.0000000
[2] {Gula} => {Teh Celup} 0.3 0.7500000 0.9375000
[3] {Pet Food} => {Teh Celup} 0.3 0.6000000 0.7500000
[4] {Sirup} => {Teh Celup} 0.4 0.6666667 0.8333333
[5] {Teh Celup} => {Sirup} 0.4 0.5000000 0.8333333
[6] {Gula,Sirup} => {Teh Celup} 0.1 0.5000000 0.6250000
[7] {Pet Food,Sirup} => {Teh Celup} 0.2 0.5000000 0.6250000
[8] {Pet Food,Teh Celup} => {Sirup} 0.2 0.6666667 1.1111111
[9] {Sirup,Teh Celup} => {Pet Food} 0.2 0.5000000 1.0000000

 
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)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

mba <- apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))

inspect(subset(mba, lhs %in% "Teh Celup" | rhs %in% "Teh Celup"))

Filter berdasarkan Lift


Kita bisa melakukan filter terhadap metrik kualitas dari association rules: support,
confidence dan lift dengan function subset. Function yang sama untuk melakukan filter
terhadap lhs dan rhs.
Bedanya adalah karena angka, maka untuk ketiga metrik tersebut kita gunakan operator
perbandingan angka.
Sebagai contoh, untuk melakukan filter terhadap objek mba dengan kondisi berikut:

 lhs atau rhs memiliki Teh Celup


 lift di atas 1

maka perintahnya adalah sebagai berikut


subset(mba, (lhs %in% "Teh Celup" | rhs %in% "Teh Celup") & lift>1)
Perhatikan untuk ekspresi lhs dan rhs ditutup dengan kurung sebelum digabungkan dengan
kondisi lift.
Tugas Praktek
Tambahkan perintah pada code editor untuk melakukan filter dimana lhs atau rhs memiliki
item Teh Celup.
Hasilnya akan terlihat sebagai berikut.  

lhs rhs support confidence lift


[1] {Pet Food,Teh Celup} => {Sirup} 0.2 0.6666667 1.111111

Hanya terdapat 1 rule sebagai hasil filter dan paket produk ini cukup menjanjikan, dimana
Teh Celup menjadi komponen dari itemset di lhs.
library(arules)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)
mba <- apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))

inspect(subset(mba, (lhs %in% "Teh Celup" | rhs %in% "Teh Celup") & lift>1))

Rekomendasi - Filter dengan %ain%


Operator %in% yang sebelumnya kita gunakan sudah efektif. Namun operator ini tidak cocok
jika kita ingin melakukan filter itemset dengan logika AND. Artinya seluruh item harus muncul
dalam itemset yang terpilih. Untuk keperluan tersebut, gunakan operator %ain%.
Contoh subset yang menggunakan %ain% adalah sebagai berikut.
subset(mba, (lhs %ain% c("Pet Food", "Gula" )))
Dan ekspresi inilah menjadi kunci untuk membuat rekomendasi.
Tugas Praktek
Tambahkan perintah pada code editor untuk melakukan filter dimana lhs memiliki item Gula
dan Pet Food.
Hasilnya akan terlihat sebagai berikut.   

lhs rhs support confidence lift


[1] {Gula,Pet Food} => {Sirup} 0.1 1 1.666667

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)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

mba <- apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))

inspect(subset(mba, (lhs %ain% c("Pet Food", "Gula" ))))

Visualisasi Rules dengan Graph


Sejauh ini Anda telah menghasilkan rules dan mengerti bagaimana metrik kualitas dapat
digunakan sebagai basis pemilihan rule.
Namun ketika item semakin banyak, maka proses memilih berdasarkan angka-angka saja
cukup merepotkan. Kadangkala visualisasi bisa sangat membantu analisa di proses ini.
Jenis visualisasi cukup banyak, namun kita akan gunakan visualisasi bertipe graph yang
terdapat pada package arulesViz – suatu package dengan visualisasi khusus untuk
association rules.
Berikut adalah contoh visualisasi yang kita hasilkan dari rules yang telah kita filter dengan lift
di atas nilai 1.1.

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)

transaksi <- read.transactions(file="https://academy.dqlab.id/dataset/data_transaksi.txt",


format="single", sep="\t", cols=c(1,2), skip=1)

mba <- apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))

plot(subset(mba, lift>1.1), method="graph")

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:

 persiapan data transaksi, dengan membaca file dalam bentuk csv


dalam format data.frame dan transaction.
 menganalisa statistik yang terkait dengan item dan itemset.
 menghasilkan rule dan mencari itemset terbaik di rule - ini menjadi
model untuk paket produk yang baik.

Tiga keterampilan penting ini siap menjadi modal Anda sebagai data scientist untuk
berkontribusi meningkatkan omset penjualan di perusahaan ritel.

Data Science in Marketing: Customer Segmentation

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?

 Apa dan kenapa Customer Segmentation dalam penggunaan di bisnis?


 Aplikasi Customer Segmentation secara teknis dengan Algoritma K-Means di R
 Bagaimana mempersiapkan data profil pelanggan di R agar dapat digunakan oleh
algoritma K-Means
 Mempaketkan algoritma sebagai model dan mengoperasionalkannya sehingga dapat
digunakan sehari-hari oleh bisnis

Bagaimana Anda menarik manfaat dari DQLab 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:

1. Mengenal Contoh File Dataset Pelanggan


2. Membaca File dengan read.csv
3. Vector untuk Menyimpan Nama Field
4. Konversi Data dengan data.matrix
5. Menggabungkan Hasil Konversi
6. Menormalisasikan Nilai Belanja
7. Membuat Data Master

Dataset Customer Segments


Dataset yang kita gunakan adalah data customer dengan field “Customer ID”, “Nama
Pelanggan”,”Jenis Kelamin”,”Umur”, “Profesi”, “Tipe Residen” dan “Nilai Belanja Setahun”
dengan tampilan sebagai berikut.
Dataset ini bisa dilihat
di https://storage.googleapis.com/dqlab-dataset/customer_segments.txt

Data tersebut memiliki tujuh kolom dengan penjelasan sebagai berikut:

 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 >

Membaca data dengan fungsi read.csv


Langkah pertama yang perlu kita lakukan adalah membaca dataset tersebut dari file teks
menjadi data.frame di R dengan perintah read.csv.
Mari kita praktekkan penggunaan read.csv ini dengan mengetikkan perintah berikut pada
code editor.
pelanggan <-
read.csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt",
sep="\t")
Keterangan code:

 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")]

Vector untuk Menyimpan Nama Field


Perhatikan jika nama-nama field yang telah kita gunakan pada praktek sebelumnya,
sebenarnya adalah sebuah vector

c("Jenis.Kelamin", "Umur", "Profesi", "Tipe.Residen")


Dan ini bisa dimasukkan ke dalam variable, dengan tujuan dapat digunakan berulang kali
dalam script R.
Tugas Praktek
Gantilah tulisan [jawaban1] pada code editor dengan variable vector
bernama field_yang_digunakan dan diisi dengan 3 teks: "Jenis.Kelamin", "Umur" dan
"Profesi" .
Kemudian tampilkan isi variable pelanggan dengan field_yang_digunakan dengan code yang
akan menggantikan [jawaban2] pada code editor.
#Membaca data csv dan dimasukkan ke variable pelanggan

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt",sep="\t")

#Buat variable field_yang_digunakan dengan isi berupa vector "Jenis.Kelamin", "Umur" dan "Profesi"

field_yang_digunakan <- c("Jenis.Kelamin", "Umur", "Profesi")

#Tampilan data pelanggan dengan nama kolom sesuai isi vector field_yang_digunakan

pelanggan[field_yang_digunakan]

Konversi Data dengan data.matrix


Seperti telah dijelaskan sebelumnya, isi data dari tiga kolom pelanggan yaitu
"Jenis.Kelamin", "Profesi" dan "Tipe.Residen" merupakan data kategori yang berupa teks.
Untuk fungsi k-means, ketiga kolom ini tidak bisa digunakan kecuali isi dikonversi menjadi
numerik. Salah satu caranya adalah dengan menggunakan fungsi data.matrix.
Perintahnya cukup sederhana, seperti terlihat pada contoh berikut.

data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi")])

Perintah ini akan mengkonversi data pelanggan pada kolom "Jenis.Kelamin" dan "Profesi"


yang diwakili oleh pelanggan[c("Jenis.Kelamin", "Profesi")] menjadi numerik.

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")

#Konversi data menjadi numerik

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi","Tipe.Residen")])

Menggabungkan Hasil Konversi


Setelah Anda bisa melakukan konversi ke angka, kita perlu mengetahui bagaimana
menggabungkan kembali data tersebut ke variable asal kita.
Ini berguna terutam apada praktek lanjutan di akhir course, yaitu ketika kita akan mengenali
data pelanggan baru masuk ke segment mana.
Untuk menggabungkan data hasil konversi data.matrix ke pelanggan, kita gunakan
funtion data.frame.
Sebagai contoh, untuk menggabungkan variable pelanggan dan pelanggan_matrix maka
perintahnya adalah sebagai berikut.
data.frame(pelanggan, pelanggan_matrix)
Tugas Praktek
Gantilah tulisan […]pada editor dengan code yang sesuai.
Gabungkan variable pelanggan dan pelanggan_matrix dengan function data.frame dan
masukkan kembali ke variable pelanggan.
Catatan: Jika berhasil, maka isi penggabungan ini akan menambahkan kolom bernama
"Jenis.Kelamin.1", "Profesi.1", dan "Tipe.Residen.1" yang sebelumnya tidak ada pada kedua
variable seperti berikut.
   Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1
1                      1         5              2
2                      2         3              1
3                      1         4              1
4                      1         4              1
5                      2         5              1
6                      2         4              1
7                      1         5              2
8                      1         4              1
9                      2         4              2


Akhiran .1 ini ditambahkan karena di variable pelanggan sudah ada nama kolom yang sama.
Sebagai contoh kolom "Jenis.Kelamin" yang terdapat pada pelanggan_matrix sudah ada
juga di variable pelanggan. Jadi ketika digabungkan, R akan menambahkan akhiran .1 untuk
kolom "Jenis.Kelamin" yang terdapat di pelanggan_matrix.
pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt",sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

#Penggabungan data

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

#Tampilkan kembali data hasil penggabungan

Pelanggan

Menormalisasikan Nilai Belanja


Kali ini kita perhatikan kolom "NilaiBelanjaSetahun" isi datanya bernilai jutaan. Ketika kolom
ini digunakan untuk clustering, perhitungan sum of squared errors (pada bab kmeans) akan
menjadi sangat besar.
Kita akan menormalisasikan nilainya agar perhitungan lebih sederhana dan mudah dicerna,
namun tidak mengurangi akurasi. Ini terutama akan sangat bermanfaat jika jumlah data
sangat banyak, misalkan memiliki 200 ribu data.
Normalisasi bisa dilakukan dengan banyak cara. Untuk kasus kita, cukup dengan pembagian
sehingga nilai jutaan menjadi puluhan.
Mari kita langsung lakukan dengan mengerjakan praktek berikut.
Tugas Praktek
Gantilah tulisan […]pada editor dengan code yang sesuai.
Isilah kolom NilaiBelanjaSetahun dengan nilai dari kolom itu sendiri dibagi dengan 1000000.
pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

#Normalisasi Nilai

pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000

Membuat Data Master


Setelah penggabungan data, kita jadi mengetahui sebenarnya teks kategori dikonversi
menjadi angka numerik berapa.
Sebagai contoh, jika kita menampilkan data kolom "Profesi" dan "Profesi.1" dengan perintah
berikut.
pelanggan[c("Profesi","Profesi.1")] 
maka sebagian hasilnya akan tampil sebagai berikut.
                      Profesi Profesi.1
1              Wiraswasta           5
2                    Pelajar            3
3             Professional           4
4             Professional           4
5              Wiraswasta           5
6             Professional           4
7              Wiraswasta           5
8             Professional           4
9             Professional           4
10           Professional           4
11           Professional           4
12           Professional           4
13            Wiraswasta           5
14            Wiraswasta           5
15            Wiraswasta           5
16           Professional           4
17 Ibu Rumah Tangga           1
18 Ibu Rumah Tangga           1


Kelihatan kalau Wiraswasta dikonversi menjadi angka 5, Pelajar menjadi angka 3,
Professional menjadi angka 4, Ibu Rumah Tangga menjadi angka 1, dan satu lagi  adalah
Mahasiswa yang dikonversi menjadi angka 2 (tidak terlihat disini).
Daftar data kategori dan hasil konversinya sangat penting untuk dijadikan referensi sehingga
nanti ketika ada data baru, kita bisa "petakan" menjadi data numerik yang siap digunakan
untuk algoritma clustering.
Nah, masalahnya data di atas terlalu panjang, padahal sebenarnya kita cuma perlu 5 baris
data bukan? Di R, kita bisa meringkasnya dengan function unique.
Contoh perintahnya adalah sebagai berikut:
unique(pelanggan[c("Profesi","Profesi.1")])
Hasilnya akan tampak sebagai berikut.
                Profesi        Profesi.1
1              Wiraswasta            5
2                     Pelajar           3
3             Professional            4
17 Ibu Rumah Tangga            1
31             Mahasiswa            2
 
Terlihat ya datanya sudah diringkas dengan teks kategori beserta pasangan numeriknya.
Kemudian perhatikan juga angka-angka 1,2,3,17 dan 31 yang terdapat di bagian paling kiri.
Ini menunjukkan posisi baris ditemukannya teks tersebut.
Data ringkas dan unik ini untuk selanjutnya kita sebut sebagai data referensi atau data
master.
Tugas Praktek
Gantilah tulisan […]pada editor dengan code yang sesuai.
Buatlah tiga variable dengan nama Profesi, Jenis.Kelamin dan Tipe.Residen yang isinya berisi
daftar unik dari pasangan kolom "Profesi" dan "Profesi.1", "Jenis.Kelamin" dan
"Jenis.Kelamin.1", "Tipe.Residen" dan "Tipe.Residen.1".
pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt",sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

pelanggan$NilaiBelanjaSetahun = pelanggan$NilaiBelanjaSetahun/1000000

#Mengisi data master

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Residen <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

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.

Clustering dan Algoritma K-Means


Apa itu Clustering dan algoritma K-Means?
Clustering adalah proses pembagian objek-objek ke dalam beberapa kelompok (cluster)
berdasarkan tingkat kemiripan antara satu objek dengan yang lain.
Beberapa contoh clustering:

 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.

kmeans(x=pelanggan[c("Umur","Profesi.1")], centers=3, nstart=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:

 x: berisi data pelanggan dengan field-field yang diambil dari


vector field_yang_digunakan (sudah didefinisikan di potongan code)
 centers: jumlah segmen / cluster yang kita inginkan. Isi dengan 5.
 nstart: isi dengan angka 25

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:

1. Ukuran / jumlah titik data pada tiap cluster


2. Nilai rata-rata (centroid) dari tiap cluster
3. Pembagian cluster dari tiap elemen data berdasarkan posisinya
4. Jumlah jarak kuadrat dari tiap titik ke centroidnya
5. Komponen informasi lain yang terkandung di dalam objek kmeans ini

#Bagian Data Preparation

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

#Bagian K-Means

set.seed(100)

#fungsi kmeans untuk membentuk 5 cluster dengan 25 skenario random dan simpan ke dalam variable
segmentasi

segmentasi <- kmeans(x=field_yang_digunakan,centers=5, nstart=25)

#tampilkan hasil k-means

Segmentasi

Analisa Hasil Clustering Vector


Untuk menganalisa hasil, DQLab akan mengawali dari hasil bagian ketiga, yaitu clustering
vector.

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

Ini akan mendapatkan hasil yang sama dengan gambar di atas.


Tugas Praktek
Nah, sekarang tugas kita adalah menambahkan hasil segmentasi ini ke data asal. Caranya
cukup gampang, yaitu dengan cara membuat kolom baru (kita namakan cluster) di variable
pelanggan yang isinya dari segmentasi$cluster.
Ketik perintah berikut pada bagian code editor setelah bagian komentar #Penggabungan
hasil cluster

pelanggan$cluster <- segmentasi$cluster

Kemudian tampilkan struktur dari data pelanggan dengan perintah str.


#Bagian Data Preparation

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])


pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

#Bagian K-Means

set.seed(100)

segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)

#Penggabungan hasil cluster

segmentasi$cluster

pelanggan$cluster <- segmentasi$cluster

str(pelanggan)

Analisa Hasil Cluster Size


Tahap berikutnya, Kita akan analisa hasil pada bagian pertama

K-means clustering with 5 clusters of sizes 14, 5, 9, 12, 10

Ini artinya dengan k-means kita telah membagi dataset pelanggan dengan 5 cluster, dimana:

 Cluster ke-1 memiliki 14 data


 Cluster ke-2 memiliki 5 data
 Cluster ke-3 memiliki 9 data
 Cluster ke-4 memiliki 12 data
 Cluster ke-5 memiliki 10 data
Dengan jumlah total 50 data, yang juga merupakan jumlah data total pelanggan.
Mari kita verifikasi hal tersebut dengan memulai dari cluster 1. Ambil data pelanggan yang isi
dari kolom clusternya adalah 1 dengan menggunakan fungsi which, seperti perintah berikut
pada live code editor di bawah komentar #Filter cluster ke-1.

which(pelanggan$cluster == 1)

Anda seharusnya dapatkan hasil sebagai berikut:

[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))

Jika dijalankan maka akan didapatkan angka 14.


Tugas
Tampilkan ukuran cluster ke-2 dari pelanggan
#Bagian Data Preparation

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

#Bagian K-Means

set.seed(100)
segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)

pelanggan$cluster <- segmentasi$cluster

#Analisa hasil

#Filter cluster ke-1

which(pelanggan$cluster == 1)

length(which(pelanggan$cluster == 2))

Melihat Data pada Cluster ke-N


Sejauh ini, kita belum melihat data hasil cluster. Pastinya, penasaran untuk melihat hasil
tersebut, bukan?
Ini dapat dihasilkan dengan cukup mudah setelah kita ikuti praktek sebelumnya, dimana
hasil cluster telah diintegrasikan dan juga mengerti cara filter baris-baris data (data rows)
dengan which.
Berikut adalah perintah yang dapat diketikkan pada code editor (di bawah comment
#Melihat data cluster ke-1) untuk melihat seluruh data pada cluster ke-1
pelanggan[which(pelanggan$cluster == 1),] Jika berhasil dieksekusinya, hasilnya akan
terlihat sebagai berikut. 

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.

Menarik bukan pembagian dari algoritmanya?


Tugas Praktek
Gantilah bagian […] dengan tiga perintah untuk melihat cluster nomor 3 sampai dengan 5.
#Bagian Data Preparation

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

#Bagian K-Means

set.seed(100)

segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)

pelanggan$cluster <- segmentasi$cluster

#Analisa hasil

#Melihat data cluster ke-1

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),]

Analisa Hasil Cluster Means


Cluster means adalah hasil nilai rata-rata atau titik sentral (centroid) dari seluruh titik tiap
cluster.

Apa artinya hasil tersebut?

 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 Umur adalah representasi dari dataset awal tanpa mengalami konversi.


Terlihat untuk cluster ke-1 umur rata-rata adalah 20 tahun, umur 61 tahun untuk
cluster ke-2, dan seterusnya.

 Kolom Profesi.1 menunjukkan nilai rata-rata data Profesi untuk tiap cluster yang


telah dikonversi menjadi numerik, yaitu angka 1 s/d 5.

Angka 1, 2, 3, 4, dan 5 di kolom ini masing-masingnya mewakili Wiraswasta, Pelajar,


Professional, Ibu Rumah Tangga, dan Mahasiswa.
Terlihat untuk seluruh cluster bahwa nilai profesi berada dalam rentang 3.5 s/d 4.2
(3.5< profesi <= 4.2). Hal ini menunjukkan bahwa profesi cenderung ke ke Ibu Rumah
Tangga, dan secara tegas cluster keempat memiliki profesi berupa Ibu Rumah Tangga.

 
 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.

 Terakhir, kolom NilaiBelanjaSetahun cukup signifikan pembagiannya untuk tiap


cluster. Dimana cluster ke-2 dan ke-4 memiliki nilai belanja lebih tinggi dibandingkan
ketiga cluster lainnya.

 
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:

K-means clustering with 5 clusters of sizes 14, 5, 9, 12, 10

Tugas Praktek
Cobalah melihat hasil dari cluster means ini dengan langsung mengakses
variable segmentasi pada komponen centers.
#Bagian Data Preparation

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000


field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",
"Tipe.Residen.1","NilaiBelanjaSetahun")

#Bagian K-Means

set.seed(100)

segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)

pelanggan$cluster <- segmentasi$cluster

#Analisa hasil

#Melihat cluster means dari objek

segmentasi$centers

Analisa Hasil Sum of Squares


Yang akan kita analisa berikutnya adalah bagian keempat, yaitu nilai metrik sum of squares
seperti terlihat berikut ini.

Within cluster sum of squares by cluster:

[1] 316.73367  58.21123 174.85164 171.67372 108.49735


(between_SS / total_SS =  92.4 %) 

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

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])


pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

#Membandingkan dengan 2 cluster kmeans, masing-masing 2 dan 5

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)

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

Jika dieksekusi maka Anda akan mendapatkan hasil berikut.


[1] 316.73367  58.21123 174.85164 171.67372 108.49735
Tugas Praktek
Ganti […] dengan 2 perintah untuk mengambil komponen cluster dan tot.withinss dari
variable segmentasi.
#Bagian Data Preparation

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

#Bagian K-Means

set.seed(100)

segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)

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:

1. Ukuran / jumlah titik data pada tiap cluster


2. Nilai rata-rata (centroid) dari tiap cluster
3. Vector item dari cluster
4. Jumlah jarak kuadrat dari tiap titik ke centroidnya (Sum of Squares atau SS)
5. Komponen-komponen informasi lain

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

Menentukan Jumlah Cluster Terbaik


Pengantar
Dari informasi yang dihasilkan oleh function kmeans, metrick Sum of Squares (SS) atau sering
disebut Sum of Squared Errors (SSE) sangat penting untuk dijadikan dasar kita menentukan
jumlah cluster yang paling optimal.
Secara teoritis, berikut adalah beberapa hal yang bisa kita amati dengan SS:

 Semakin sedikit jumlah cluster yang dihasilkan maka semakin besar


nilai SS.
 Begitu juga sebaliknya, semakin banyak jumlah cluster yang
dihasilkan maka semakin kecil nilai SS nya.
 Karena sifatnya kuadratik, jika terdapat perbedaan yang cukup
signifikan antara tiap kombinasi cluster maka perbedaan nilai SS
akan semakin besar.
 Dan seiring bertambahnya jumlah cluster, perbedaan tiap SS ini
akan semakin kecil.

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 >

Simulasi Jumlah Cluster dan SS


Metrik elbow method yang digunakan sebagai basis justifikasi adalah Sum of Squares (SS),
atau lebih tepatnya komponen tot.withinss dari objek kmeans.
Metrik ini akan dicari progressive nilai tot.withinss untuk tiap kombinasi jumlah cluster, dan
disimpan dalam bentuk vector di R.
Untuk keperluan ini, kita akan gunakan sapply. Function sapply akan digunakan untuk
memanggil function kmeans untuk suatu range jumlah cluster. Range ini akan kita gunakan 1
sampai dengan 10.
Code lengkapnya sebagai berikut:

sse <- sapply(1:10,


function(param_k)
{
kmeans(pelanggan[field_yang_digunakan], param_k, nstart=25)$tot.withinss
}
)

Berikut adalah penjelasan lengkap elemen-elemen perintah di atas

Komponen Deskripsi

sse Nama variable yang akan


digunakan untuk menyimpan
nilai tot.withinss dari tiap
objek kmeans

sapply Merupakan function yang


digunakan untuk
menghasilkan vector dari
iterasi (looping) dari eksekusi
fungsi tertentu (pada kasus ini:
kmeans) dengan nilai range
yang diberikan

1:10 Range jumlah cluster dari 1


sampai dengan 10

param_k Parameter yang akan berisi


nilai 1 sampai dengan 10,
sesuai range di atas

kmeans(pelanggan[field_yang_digunakan], Fungsi kmeans yang dipanggil


param_k, nstart=25) sebanyak nilai range 1 sampai
dengan 10 (param_k) dari
dataset pelanggan

$tot.withinss Total penjumlahan dari tiap SS


dari withinss

Mari kita coba perintah di atas dengan tugas praktek berikut.

 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.

[1] 10990.9740 3016.5612 1550.8725 1064.4187 829.9676 625.1462


[7] 508.1568 431.6977 374.1095 317.9424

#Bagian Data Preparation

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

pelanggan$NilaiBelanjaSetahun <-pelanggan$NilaiBelanjaSetahun/1000000

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

#Bagian K-Means

set.seed(100)

sse <- sapply(1:10,function(param_k)

kmeans(pelanggan[field_yang_digunakan], param_k, nstart=25)$tot.withins


}

Sse

Grafik Elbow Effect


Kali ini kita akan visualisasikan vector Sum of Squares (SS) atau Sum of Squared Errors (SSE)
yang telah kita hasilkan pada praktek sebelumnya.
Kita akan gunakan ggplot untuk visualisasi, datasetnya berupa penggabungan data frame
dari sse dan range nilai 1:10, dengan perintah berikut.

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 Data Preparation

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])


Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

#Bagian K-Means

set.seed(100)

sse <- sapply(1:10, function(param_k){kmeans(pelanggan[field_yang_digunakan], param_k,


nstart=25)$tot.withinss})

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))

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:

 Menamakan cluster dengan karakteristik yang lebih mudah


dimengerti. Penamaan ini kita simpan dalam variable
Segmen.Pelanggan.
 Menggabungkan variable Segmen. Pelanggan, Profesi,
Jenis.Kelamin, Tipe.Residen, dan Segmentasi ke dalam satu objek
bertipe list ke dalam variable Identitas.Cluster.
 Menyimpan objek Identitas.Cluster dalam bentuk file sehingga
dapat digunakan kemudian, ini bisa disebut model bagi kita

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:

 cluster: vector dengan isi 1,2,3,4 dan 5.


 Nama.Segmen: vector dengan isi "Silver Youth Gals", "Diamond Senior Member",
"Gold Young Professional", "Diamond Professional", dan "Silver Mid Professional".

Lengkapi […] pada code editor dengan isi yang benar.


#Lengkapi dengan dua vector bernama cluster dan Nama.Segmen

Segmen.Pelanggan <- data.frame(cluster = c(1,2,3,4,5), Nama.Segmen = c("Silver Youth Gals", "Diamond


Senior Member", "Gold Young Professional", "Diamond Professional", "Silver Mid Professional"))

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:

Identitas.Cluster <- list(Profesi=Profesi, Jenis.Kelamin=Jenis.Kelamin,


Tipe.Residen=Tipe.Residen, Segmentasi=segmentasi, Segmen.Pelanggan=Segmen.Pelanggan,
field_yang_digunakan=field_yang_digunakan)

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 <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")


pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

pelanggan$NilaiBelanjaSetahun = pelanggan$NilaiBelanjaSetahun/1000000

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Residen <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

#Bagian K-Means

set.seed(100)

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)

Segmen.Pelanggan <- data.frame(cluster=c(1,2,3,4,5), Nama.Segmen=c("Silver Youth Gals", "Diamond


Senior Member", "Gold Young Professional", "Diamond Professional", "Silver Mid Professional"))

#Menggabungkan seluruh aset ke dalam variable Identitas.Cluster

Identitas.Cluster <- list(Profesi=Profesi, Jenis.Kelamin=Jenis.Kelamin, Tipe.Residen=Tipe.Residen,


Segmentasi=segmentasi, Segmen.Pelanggan=Segmen.Pelanggan,
field_yang_digunakan=field_yang_digunakan)

Menyimpan Objek dalam Bentuk File


Objek yang sudah digabungkan pada praktek sebelumnya sudah memiliki semua aset yang
diperlukan untuk mengalokasikan data baru ke segmen yang sesuai.
Untuk menyimpan objek ini ke dalam file kita gunakan function saveRDS. File ini kemudian
dapat dibuka kembali sebagai objek ke depannya.
Sebagai contoh, perintah untuk menyimpan objek Identitas.Cluster ke file cluster.rds adalah
sebagai berikut.

saveRDS(Identitas.Cluster,"cluster.rds")

Kita akan menjalankan perintah ini pada tugas berikut.


#Membaca data csv dan dimasukkan ke variable pelanggan

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

pelanggan <- data.frame(pelanggan, pelanggan_matrix)

pelanggan$NilaiBelanjaSetahun = pelanggan$NilaiBelanjaSetahun/1000000

Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])

Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])

Tipe.Residen <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

#Bagian K-Means

set.seed(100)

field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1",


"Tipe.Residen.1","NilaiBelanjaSetahun")

segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)

Segmen.Pelanggan <- data.frame(cluster=c(1,2,3,4,5), Nama.Segmen=c("Silver Youth Gals", "Diamond


Senior Member", "Gold Young Professional", "Diamond Professional", "Silver Mid Professional"))

Identitas.Cluster <- list(Profesi=Profesi, Jenis.Kelamin=Jenis.Kelamin, Tipe.Residen=Tipe.Residen,


Segmentasi=segmentasi, Segmen.Pelanggan=Segmen.Pelanggan,
field_yang_digunakan=field_yang_digunakan)

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 <- data.frame(Customer_ID="CUST-100", Nama.Pelanggan="Rudi


Wilamar",Umur=20,Jenis.Kelamin="Wanita",Profesi="Pelajar",Tipe.Residen="Cluster",Nila
iBelanjaSetahun=3.5)
databaru

databaru <- data.frame(Customer_ID="CUST-100", Nama.Pelanggan="Rudi Wilamar", Umur=20,


Jenis.Kelamin="Wanita", Profesi="Pelajar", Tipe.Residen="Cluster", NilaiBelanjaSetahun=3.5)

databaru

Memuat Objek Clustering dari File


Praktek kali ini adalah membuka file yang telah kita simpan sebelumnya dengan perintah
dan dikenali di R sebagai objek yang akan kita gunakan untuk mengolah data baru.
Untuk membuka file tersebut, kita gunakan function readRDS.
Perintahnya sangat sederhana, berikut adalah contoh untuk membuka file cluster.rds yang
telah kita simpan sebelumnya.

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

Within cluster sum of squares by cluster:


[1] 316.73367 58.21123 174.85164 171.67372 108.49735
(between_SS / total_SS = 92.4 %)

Available components:

[1] "cluster" "centers" "totss" "withinss" "tot.withinss"


"betweenss"
[7] "size" "iter" "ifault"

$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 dengan Data Referensi


Dengan adanya data baru dan objek yang berisi data referensi telah dibaca kembali, kita bisa
menggabungkan data baru ini untuk mendapatkan konversi numerik dari field
Jenis.Kelamin, Profesi dan Tipe.Residen.
Tujuannya adalah kita akan bisa mencari segmen pelanggannya dengan data numerik hasil
penggabungan.
Cara menggabungkannya adalah dengan menggunakan function merge, dimana kedua data
akan digabungkan dengan mencari persamaan nama kolom dan isinya.
Sebagai contoh, perintah berikut akan menggabungkan variable databaru dengan
variable Identitas.Cluster$Profesi.

merge(databaru, Identitas.Cluster$Profesi)

Maka prosesnya akan terlihat sebagai berikut.

 Variable databaru dengan Identitas.Cluster$Profesi memiliki nama kolom yang sama,


yaitu Profesi.
 Kolom Profesi kemudian akan dijadikan "kunci" untuk menggabungkan kedua
variable ini.
 Ternyata isi Profesi dari databaru, yaitu "Pelajar" juga terdapat di Identitas.Cluster. Ini
akan membuat penggabungan menjadi berhasil.
 Penggabungan ini juga akan mengambil kolom Profesi.1 dan isi data yang terkait
dengan Pelajar, yaitu nilai 3.

Berikut adalah hasil akhirnya.


Perhatikan kalau kolom kunci, yaitu Profesi digeser ke depan. Dan sisanya adalah kolom-
kolom dari kedua variable.
Tugas Praktek
Berikut adalah perintah dari pengembangan contoh di atas. Setelah terjadi penggabungan
data, hasilnya disimpan kembali ke variable databaru.

databaru <- 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)

Identitas.Cluster <- readRDS(file="cluster.rds")

#Masukkan perintah untuk penggabungan data

databaru <- merge(databaru, Identitas.Cluster$Profesi)

databaru <- merge(databaru, Identitas.Cluster$Jenis.Kelamin)

databaru <- merge(databaru, Identitas.Cluster$Tipe.Residen)

databaru

Menentukan Cluster
Kini saatnya penentuan untuk melakukan praktek terpenting bagi bisnis: data baru ini masuk
ke segmen mana?
Gampang!
Yaitu dengan tahapan berikut:

 mencari jarak kuadrat minimum atau terdekat


 dari kolom numerik data baru tersebut
 ke centroid kolom terkait
 dari seluruh cluster yang ada

Kalau kita terjemahkan jadi rumus sebagai berikut:

which.min(sapply( 1:5, function( x ) sum( ( data[kolom] -


objekkmeans$centers[x,])^2 ) ))

dimana:

 min: merupakan function untuk mencari nilai minimum


 1:5 : adalah range nomor cluster dari 1 sampai dengan 5 (atau lebih sesuai dengan
ukuran cluster)
 sapply: digunakan untuk melakukan iterasi berdasarkan range (dalam kasus ini 1 s/d
5)
 function(x): digunakan untuk proses dengan x diisi 1 s/d 5 per proses
 (data[kolom] – objekkmeans$centers[x,]) ^2: adalah jarak kuadrat data. Ingat centers
adalah komponen dari objek kmeans.
 sum: digunakan untuk menjumlahkan jarak kuadrat

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(…),]

#membuat data baru


databaru <- data.frame(Customer_ID="CUST-100", Nama.Pelanggan="Rudi
Wilamar",Umur=32,Jenis.Kelamin="Wanita",Profesi="Pelajar",Tipe.Residen="Cluster",NilaiBelanjaSetah
un=3.5)

Identitas.Cluster <- readRDS(file="cluster.rds")

databaru <- merge(databaru, Identitas.Cluster$Profesi)

databaru <- merge(databaru, Identitas.Cluster$Jenis.Kelamin)

databaru <- merge(databaru, Identitas.Cluster$Tipe.Residen)

#menentukan data baru di cluster mana

which.min(sapply( 1:5, function( x ) sum( ( databaru[Identitas.Cluster$field_yang_digunakan] -


Identitas.Cluster$Segmentasi$centers[x,])^2 ) ))

Identitas.Cluster$Segmen.Pelanggan[which.min(sapply( 1:5, function( x )


sum( ( databaru[Identitas.Cluster$field_yang_digunakan] - Identitas.Cluster$Segmentasi$centers[x,])^2 )
)),]

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!

Data Science in Finance: Dimension Reduction

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

 status kepemilikan tempat tinggal


 aset lain yang dimiliki

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 >

Overview Principal Component Analysis


Principal Component Analysis (PCA) adalah salah satu metode reduksi dimensi pada
machine learning. PCA akan memilih “variabel-variabel” yang mampu menjelaskan sebagian
besar variabilitas data. Bila anda familiar dengan analisis statistika Regresi, konsep
variabilitas ini mirip dengan koefisien determinasi R2.
PCA mengurangi dimensi dengan membentuk variabel-variabel baru yang disebut Principal
Components yang merupakan kombinasi linier dari variabel-variabel lama. Misalnya sebuah
data set memiliki 3 variabel, x1, x2 dan x3. Sebuah principal component merupakan rata-rata
tertimbang seperti berikut ini:

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:

 setiap Principal Component memberikan varians terbesar,


 setiap Principal Component tidak memiliki korelasi dengan PC lain
dan
 panjang vektor yang memuat koefisien-koefisien PC ini adalah 1.

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:

 Tipe variabel adalah numerik.


 Variabel-variabel yang menjadi input PCA adalah variabel prediktor.
 Variabel-variabel prediktor memiliki hubungan linier.
 Semua variabel harus distandarisasi (centered dan scaled).

Next >

Langkah-Langkah Principal Component Analysis


Berikut ini adalah langkah-langkah yang diperlukan untuk melakukan Principal Component
Analysis:

1. Menyiapkan data (standardisasi data),


2. Menghitung matrik kovarians atau matrik korelasi,
3. Menghitung nilai eigen dan vektor eigen dari matrik korelasi,
4. Memilih principal component,
5. Visualisasi output,
6. Menghitung skor baru.

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:

 Batasan variabilitas, misalnya 80%.


 Kriterion Kaiser: memilih semua PC yang nilai eigennya yang lebih besar dari 1.
 Memilih k Principal Component.

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

di mana λj adalah nilai eigen ke j dan p adalah total banyaknya variabel.


Visualisasi output PCA dapat dilakukan dengan menggunakan biplot. Plot ini menampilkan
skor dan loading dalam grafik yang sama dengan menggunakan 2 Principal Component yang
paling penting. Sumbu horizontal menampilkan PC pertama, sumbu vertikal menampilkan
PC kedua. Variabel-variabel yang memiliki kontribusi besar terhadap PC1 akan digambarkan
mendatar dan variabel-variable yang memiliki kontribusi tinggi terhadap PC2 akan
digambarkan pada arah vertikal.
Skor variabel lama akan ditransformasi menjadi skor variabel baru dengan menggunakan
rumus

Package dan Fungsi R


Berikut ini adalah package dan fungsi R yang akan digunakan dalam modul PCA.

 cor() dari library stats untuk menghitung korelasi matrik.


 eigen() dari library base untuk menghitung nilai eigen dan vektor eigen
 prcomp() dari library stats untuk analisa Principal Component
 princomp() dari library stats untuk analisa Principal Component
 screeplot() dari library stats untuk membuat screeplot
 biplot() dari library stats untuk membuat biplot.
 autoplot() dari package ggfortify untuk membuat biplot.
 fviz_pca_ind() dari package factoextra untuk membuat biplot.

Package dan Fungsi R | Fungsi prcomp() dan


princomp()
R menyediakan fungsi prcomp() dan princomp() untuk melakukan Principal Component
Analysis.

prcomp(x, center = TRUE, scale. = FALSE)

Deskripsi

 Argumen x adalah dataframe berisi variabel numerik atau matrik.


 R secara otomatis akan melakukan standarisasi data bila argumen center =
TRUE dan scale = TRUE diaktifkan.
 Output stdev adalah akar dari nilai eigen.
 Output center menghasilkan mean dari nilai-nilai suatu variabel (mean kolom dalam
struktur data yang digunakan pada contoh).
 Output scale menghasilkan standard deviation untuk nilai-nilai suatu variabel
(column mean dalam struktur data) yang digunakan pada contoh).
 Output principal component sdev menghasilkan nilai standard deviation yang
digunakan untuk menghitung kontribusi suatu principal component terhadap
variabilitas data.
 Output rotation menampilkan loading Principal Component yang akan digunakan
untuk menghitung skor data pada sistem koordinat baru. Koefisien-koefisien pada
vektor-vektor Principal Component menunjukkan besarnya korelasi antara variabel
dengan Principal Component.
 Output x menampilkan skor data pada “sistem koordinat baru”.

Daftar parameter lengkap dapat dilihat

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 >

Contoh | Langkah 1: Standarisasi Data


Output statistika deskriptif menunjukkan skala variabel x3 yang berbeda dari kedua variabel
lainnya. Agar PCA dapat bekerja optimal, data ini akan distandarisasi dengan menggunakan
fungsi scale() pada R.
Dalam contoh ini, Anda hanya perlu run dan submit code di bawah ini.
library(openxlsx)

df <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet="3varb")


#standarisasi variabel (centering dan scaling)

df <- scale(df, center = TRUE, scale = TRUE)

head(df, 3)

Contoh | Langkah 2: Menghitung Matrik


Korelasi Data
Pada dataset ini variabel x1 dan x2 memiliki korelasi linier yang erat (r12 = 0.987) sedangkan
pasangan variabel x2 dan x3 dan pasangan x1 dan x3 tidak memiliki korelasi yang sekuat
pasangan x1 dan x2 (r13 = 0.299, r23 = 0.258). Scatter plot juga memberikan kesimpulan serupa.

Dalam contoh ini, Anda hanya perlu run dan submit code di bawah ini.


library(openxlsx)

df <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet="3varb")

df <- scale(df, center = TRUE, scale = TRUE)

cormat <- cor(df)

cormat

Contoh | Langkah 3: Menghitung Nilai Eigen


dan Vektor Eigen
Setiap nilai eigen memiliki pasangan vektor eigen. Pada output di atas vektor eigen untuk
nilai eigen pertama adalah kolom pertama pada vektor eigen dan seterusnya. Pada contoh
dataset dengan 3 variabel ini terdapat 3 nilai eigen dan 3 vektor eigen.
“Variabel baru” principal component PC1, PC2, dan PC3 didapatkan dari vektor eigen dan
merupakan kombinasi linier dari variabel lama x1, x2 dan x3. Koefisien-koefisien tersebut
menunjukkan kontribusi variabel-variabel lama dalam masing-masing principal komponen.

Dalam contoh ini, Anda hanya perlu run dan submit code di bawah ini.


library(openxlsx)
df <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet="3varb")

df <- scale(df, center = TRUE, scale = TRUE)

cormat <- cor(df)

eig <- eigen(cormat)

eig

Contoh | Langkah 4: Memilih Banyaknya


Principal Component
Untuk contoh soal ini, kontribusi PC1, PC2 dan PC3 terhadap variabilitas data adalah

round(eig$values/ncol(df),3)

Kontribusi kumulatif PC1, PC2 dan PC3 adalah

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.

pr.out <- prcomp(df, scale. = TRUE, center = TRUE)


summary(pr.out)

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")

Dalam contoh ini, Anda hanya perlu run dan submit code di bawah ini.


library(openxlsx)

df <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet="3varb")

df <- scale(df, center = TRUE, scale = TRUE)

cormat <- cor(df)

eig <- eigen(cormat)

round(eig$values/ncol(df),3)

round(cumsum(eig$values/ncol(df)),3)

pr.out <- prcomp(df, scale. = TRUE, center = TRUE)

pr.out

summary(pr.out)

library(factoextra)

fviz_eig(pr.out, addlabels = TRUE)

screeplot(pr.out, type = "line")

abline(h = 1, lty = 3, col = "red")

Contoh | Langkah 5: Visualisasi dengan Biplot


Hasil output rotation menunjukkan bobot kontribusi masing-masing variabel terhadap
masing-masing Principal Component.
pr.out$rotation

##          PC1        PC2         PC3


## x1 0.6704698 -0.2112281 -0.71123334
## x2 0.6640498 -0.2567210  0.70223374
## x3 0.3309200  0.9431209  0.03185768
biplot(pr.out, scale = 0)

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)

df <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet="3varb")

df <- scale(df, center = TRUE, scale = TRUE)

pr.out <- prcomp(df, scale. = TRUE, center = TRUE)

pr.out$rotation

biplot(pr.out, scale = 0)

library(openxlsx)

df <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet="3varb")

df <- scale(df, center = TRUE, scale = TRUE)

pr.out <- prcomp(df, scale. = TRUE, center = TRUE)

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

Bila observasi dengan 3 variabel memiliki nilai

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

df_new <- df %*% pr.out$rotation


df_new[1:6,1:2]
##             PC1        PC2
## [1,] -1.22400335 0.02840327
## [2,] -0.05242254 -0.49816513
## [3,] -1.29178635 1.18374272
## [4,] 2.00215943 -0.14744625
## [5,] -0.05794123 -1.06493057
## [6,] -1.86572942 -0.45199295

Fungsi prcomp() secara otomatis menghitung skor  .

##             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

Dalam contoh ini, Anda hanya perlu run dan submit code di bawah ini.


library(openxlsx)

df <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet="3varb")

df <- scale(df, center = TRUE, scale = TRUE)

pr.out <- prcomp(df, scale. = TRUE, center = TRUE)

head(df)

df_new <- df %*% pr.out$rotation

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)

#Baca data pada sheet "3varb" dalam file https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx

#dan simpan data dengan nama df_raw

df_raw <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet = "3varb")

#Tampilkan struktur data

str(df_raw)

#Tampilkan beberapa baris observasi dengan fungsi head()


head(df_raw)

#Lakukan analisa PCA dengan fungsi prcomp()

#simpan output dengan nama pr.out

pr.out <- prcomp(df_raw, center = TRUE, scale = TRUE, retx = TRUE)

#Tampilkan komponen output fungsi prcomp()

names(pr.out)

#Tampilkan output PCA

pr.out

#Tampilkan summary dari output PCA

summary(pr.out)

#Gambarkan scree plot

#Tambahkan garis horizontal sebagai panduan untuk menggunakan kriteria Kaiser

screeplot(pr.out, type = "line")

abline(h = 1, col = "red", lty = 3)

#Gambarkan biplot dengan menggunakan fungsi biplot()

biplot(pr.out, scale = 0)

Studi Kasus: 4 Variabel


Studi Kasus: 4 Variabel
Pada bagian ini kita akan menggunakan data credit rating untuk berlatih menggunakan
metode PCA. Kita akan mereduksi data set dengan 4 variabel numerik prediktor menjadi 2
Principal Component.

## '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 ...
## $ tenor      : num 48 36 12 12 36 24 36 48 48 36 ...
## $ dependents : num 5 5 0 3 0 5 3 3 5 6 ...
## $ midoverdue : num 75.5 75.5 0 53 38 15 38 38 38 38 ...
## $ riskrating : num 4 4 1 3 2 1 2 2 2 2 ...

Deskripsi variabel dalam dataset credit rating ini adalah sebagai berikut:

 contractcode: nomor kontrak


 income: penghasilan per tahun dalam jutaan rupiah.
 tenor : durasi pinjaman
 dependents: banyaknya tanggungan. * midoverdue: rata-rata keterlambatan
pembayaran pinjaman dalam hari.
 risk rating: rating resiko

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

## [1] "income"    "tenor"     "dependents" "midoverdue"

Langkah-langkah yang akan dilakukan adalah:

1. Melakukan eksplorasi data dengan teknik statistika deskriptif.


2. Membagi dataset menjadi training set dan testing set.
3. Menerapkan Principal Component Analysis.
4. Memilih banyaknya principal component.
5. Visualisasi output.

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.

##                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

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 >

PCA dengan prcomp()


## Standard deviations (1, .., p=4):
## [1] 1.3709060 1.0347230 0.9176641 0.4559141
##
## Rotation (n x k) = (4 x 4):
##                  PC1       PC2       PC3        PC4
## income    -0.3038356 -0.5337512 -0.7861956 0.06848411
## tenor     -0.1470943 0.8240099 -0.5179407 -0.17637573
## dependents -0.6649190 -0.1002035 0.2647878 -0.69117970
## midoverdue -0.6662807 0.1614826 0.2086176 0.69747555

Dari output rotation didapatkan loading Principal Component


PC1 = (-0.304)income + (-0.147)tenor + (-0.665)dependents + (-0.666)midoverdue
PC2 = (-0.534)income + (0.824)tenor + (-0.1)dependents + (0.161)midoverdue
PC3 = (-0.786)income + (-0.518)tenor + (0.265)dependents + (0.209)midoverdue
PC4 = (0.068)income + (-0.176)tenor + (-0.691)dependents + (0.697)midoverdue
di mana sebuah PC merupakan rata-rata tertimbang dari variabel income sampai dengan
midoverdue. Pada PC1 terlihat variabel dependents dan midoverdue dominan sedangkan
pada PC2 variabel dominan adalah income dan tenor. PC3 dan PC4 memiliki pola yang sama
dengan PC1 dan PC2.

Banyaknya Principal Component

## 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

## [1] 1.8793832 1.0706518 0.8421074 0.2078577

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.

##                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

Tugas Praktik: 4 Variabel


Contoh
Pada bagian ini kita akan melakukan Principal Component Analysis untuk 4 variabel
prediktor numerik dalam data credit rating. Tahap-tahap yang akan dilakukan adalah:

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.

#nama_dataframe <- read.xlsx("nama_Excelfile.xlsx", sheet = "nama_sheet")


dat_raw <- read.xlsx(xlsxFile = "dqlab_pcadata.xlsx", sheet = "cs4varb")

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().

dat_raw <- subset(dat_raw, select = -contractcode)


summary(dat_raw)
##     income       dependents       asset            debt       
## Min.  : 70.0  Min.  :0.000  Min.  : 232.2  Min.  : 0.0500 
## 1st Qu.:121.0  1st Qu.:1.000  1st Qu.: 440.0  1st Qu.: 0.6469 
## Median :162.0  Median :3.000  Median : 555.0  Median : 2.0253 
## Mean  :163.3  Mean  :2.932  Mean  : 571.0  Mean  : 3.8091 
## 3rd Qu.:199.0  3rd Qu.:5.000  3rd Qu.: 687.8  3rd Qu.: 5.1902 
## Max.  :300.0  Max.  :6.000  Max.  :1192.3  Max.  :23.5382 
##   riskrating  
## Min.  :1.000 
## 1st Qu.:1.000 
## Median :3.000 
## Mean  :2.681 
## 3rd Qu.:3.000 
## Max.  :5.000
apply(dat_raw,2,FUN=sd)
##    income dependents     asset      debt riskrating
## 51.863210  2.007457 174.247686  4.565370  1.294928

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().

index1 <- which(dat_raw$riskrating == 1)


index2 <- which(dat_raw$riskrating == 2)
index3 <- which(dat_raw$riskrating == 3)
index4 <- which(dat_raw$riskrating == 4)
index5 <- which(dat_raw$riskrating == 5)

Banyaknya data untuk tiap-tiap risk rating yang dialokasikan untuk training set dihitung
dengan perintah berikut ini.

train_pct <- 0.8


ntrain1 <- round(train_pct * length(index1))
ntrain2 <- round(train_pct * length(index2))
ntrain3 <- round(train_pct * length(index3))
ntrain4 <- round(train_pct * length(index4))
ntrain5 <- round(train_pct * length(index5))

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.

test1_index <- setdiff(index1, train1_index)


test2_index <- setdiff(index2, train2_index)
test3_index <- setdiff(index1, train3_index)
test4_index <- setdiff(index1, train4_index)
test5_index <- setdiff(index1, train5_index)

Menggabungkan hasil sampling masing-masing rating ke dalam training set.

csdat_train <- do.call("rbind", list(dat_raw[train1_index,],


dat_raw[train2_index,], dat_raw[train3_index,],
dat_raw[train4_index,], dat_raw[train5_index,]))
cs_train <- subset(csdat_train, select = -riskrating)

Hal yang sama perlu dilakukan untuk testing set.

csdat_test <- do.call("rbind", list(dat_raw[test1_index,],


dat_raw[test2_index,], dat_raw[test3_index,],
dat_raw[test4_index,], dat_raw[test5_index,]))
cs_test <- subset(csdat_test, select = -riskrating)

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

Melakukan analisa PCA dengan fungsi prcomp() dan menampilkan output PCA dengan


memanggil obyek pr.out.

pr.out <- prcomp(cs_train, scale = TRUE, center = TRUE)


pr.out
## Standard deviations (1, .., p=4):
## [1] 1.4793018 1.1807344 0.5432055 0.3499434
##
## Rotation (n x k) = (4 x 4):
##                  PC1       PC2        PC3        PC4
## income    -0.5629416 0.4185777 -0.01723657 -0.71245519
## dependents -0.4691085 -0.5133011 -0.71344421 0.08635160
## asset     -0.5430234 0.4575271 0.11201423 0.69515997
## debt      -0.4100727 -0.5932822 0.69148613 -0.04127494
summary(pr.out)
## Importance of components:
##                          PC1   PC2    PC3    PC4
## Standard deviation    1.4793 1.1807 0.54321 0.34994
## Proportion of Variance 0.5471 0.3485 0.07377 0.03062
## Cumulative Proportion 0.5471 0.8956 0.96938 1.00000

Visualisasi Ouput
Screeplot digambarkan dengan fungsi screeplot(). Garis horizontal untuk panduan penerapan
kriterion Kaiser digambarkan dengan abline.

screeplot(pr.out, type = "line", ylim = c(0,2))


abline(h = 1, lty = 3, col = "red")

Fungsi biplot() digunakan untuk membuat biplot. Biplot menggambarkan variabel, data


dalam sistem koordinat dengan sumbu yang dibentuk oleh 2 Principal Component yang
pertama. Opsi scale = 0 membuat panjang vektor menunjukkan besarnya kontribusi variabel
dalam Principal Component.

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)

#Baca data pada sheet "csdata" dalam file "https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx"

#dan simpan data dengan nama "csdat_raw"

#[2]

csdat_raw <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet = "csdata")

#Tampilkan struktur data

#[3]

str(csdat_raw)

#Tampilkan beberapa baris observasi dengan fungsi head()

#[4]

head(csdat_raw)

#Tampilkan statistika deskriptif untuk semua variabel dalam data.


#[5]

summary(csdat_raw)

#Gambarkan distribusi Income berdasarkan Dependents

library(ggplot2)

ggplot(csdat_raw, aes(as.factor(dependents), income)) +

geom_boxplot() + xlab("Dependents") + ggtitle("Boxplot Income Berdasarkan Dependents")

#Pisahkan data untuk traning set dan testing set

#untuk tiap-tiap risk rating

#Catat indeks/ nomor baris untuk tiap-tiap risk rating

index1 <- which(csdat_raw$riskrating == 1)

index2 <- which(csdat_raw$riskrating == 2)

#Lakukan pencatatan indeks untuk risk rating berikutnya

#[6]

index3 <- which(csdat_raw$riskrating == 3)

index4 <- which(csdat_raw$riskrating == 4)

index5 <- which(csdat_raw$riskrating == 5)

#80% data akan digunakan sebagai traning set.

#[7]

ntrain1 <- round(0.8 * length(index1))

ntrain2 <- round(0.8 * length(index2))


ntrain3 <- round(0.8 * length(index3))

ntrain4 <- round(0.8 * length(index4))

ntrain5 <- round(0.8 * length(index5))

#set seed agar sampling ini bisa direproduksi

set.seed(100)

#sampling data masing-masing rating untuk training set

#[8]

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)

#menyimpan data ke dalam testing set

#[9]

test1_index <- setdiff(index1, train1_index)

test2_index <- setdiff(index2, train2_index)

test3_index <- setdiff(index3, train3_index)

test4_index <- setdiff(index4, train4_index)

test5_index <- setdiff(index5, train5_index)

#Menggabungkan hasil sampling masing-masing risk rating ke dalam training set

csdattrain <- do.call("rbind", list(csdat_raw[train1_index,],


csdat_raw[train2_index,], csdat_raw[train3_index,],

csdat_raw[train4_index,], csdat_raw[train5_index,]))

cstrain <- subset(csdattrain, select =

-c(contractcode,riskrating))

#Menggabungkan hasil sampling masing-masing risk rating ke dalam testing set

csdattest <- do.call("rbind", list(csdat_raw[test1_index,],

csdat_raw[test2_index,], csdat_raw[test3_index,],

csdat_raw[test4_index,], csdat_raw[test5_index,])) #[10]

cstest <- subset(csdattest,

select = -c(contractcode,riskrating)) #[11]

#Menghitung korelasi antar variabel

cor(cstrain)

#Lakukan analisa PCA dengan fungsi prcomp() dan

#simpan output ke dalam obyek dengan nama pr.out

#[12]

pr.out <- prcomp(cstrain, scale = TRUE, center = TRUE)

#Tampilkan output PCA dengan memanggil obyek pr.out

#[13]

pr.out

#Tampilkan summary dari output PCA


#[14]

summary(pr.out)

#Gambarkan scree plot dengan menggunakan fungsi screeplot()

#[15]

screeplot(pr.out, type = "line", ylim = c(0,2))

#Tambahkan garis horizontal sebagai panduan untuk menggunakan kriteria Kaiser

abline(h = 1, lty = 3, col = "red")

#Gambarkan biplot dengan menggunakan fungsi biplot()

#[16]

biplot(pr.out, scale = 0) #draw first 2 principal components

Studi Kasus: 8 Variabel


Studi Kasus: 8 Variabel
Pada bagian ini kita akan menggunakan data credit rating untuk berlatih menggunakan
metode PCA. Kita akan mereduksi data set dengan 8 variabel numerik prediktor menjadi 2
Principal Component.

## 'data.frame':   900 obs. of 10 variables:


## $ contractcode: chr "AGR-000001" "AGR-000011" "AGR-000030" "AGR-000043" ...
## $ income     : num 295 271 159 210 165 220 70 88 163 100 ...
## $ tenor      : num 48 36 12 12 36 24 36 48 48 36 ...
## $ dependents : num 5 5 0 3 0 5 3 3 5 6 ...
## $ midoverdue : num 76 76 0 53 38 15 38 38 38 38 ...
## $ riskrating : num 4 4 1 3 2 1 2 2 2 2 ...
## $ age        : num 55 53 35 45 36 45 21 24 35 26 ...
## $ empyear    : num 12 10 5 7 5 8 1 1 6 2 ...
## $ asset      : num 893 906 552 791 593 ...
## $ debt       : num 4.6984 4.0639 0.05 0.7214 0.0667 ...

Deskripsi variabel dalam dataset credit rating ini adalah sebagai berikut:

 contractcode: nomor kontrak


 income: penghasilan per tahun dalam jutaan rupiah.
 tenor : durasi pinjaman.
 dependents: banyaknya tanggungan. * midoverdue: rata-rata keterlambatan
pembayaran pinjaman dalam hari.
 age: usia pemohon dalam tahun.
 empyear: lama bekerja pada pekerjaan terakhir.
 debt: besarnya pinjaman yang sudah ada dalam jutaan rupiah.
 risk rating: rating resiko

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

## [1] "income"    "tenor"     "dependents" "midoverdue" "age"      


## [6] "empyear"   "asset"     "debt"

Langkah-langkah yang akan dilakukan adalah:

1. Eksplorasi data dengan teknik statistika deskriptif.


2. Membagi dataset menjadi training set dan testing set.
3. Menerapkan Principal Component Analysis.
4. Memilih banyaknya principal component.
5. Visualisasi output.

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.

##                income      tenor dependents midoverdue       age


## income     1.00000000 -0.04649806 0.25180228 0.1624426 0.9834652
## tenor     -0.04649806 1.00000000 0.00526126 0.2083705 -0.0466877
## dependents 0.25180228 0.00526126 1.00000000 0.7625827 0.2430167
## midoverdue 0.16244264 0.20837054 0.76258273 1.0000000 0.1551441
## age        0.98346517 -0.04668770 0.24301671 0.1551441 1.0000000
## empyear    0.97444733 -0.04796359 0.25394067 0.1645664 0.9251052
## asset      0.86337873 -0.04804028 0.20436953 0.1224551 0.9382740
## debt       0.15557952 0.05837108 0.69737720 0.7000607 0.1556199
##               empyear      asset      debt
## income     0.97444733 0.86337873 0.15557952
## tenor     -0.04796359 -0.04804028 0.05837108
## dependents 0.25394067 0.20436953 0.69737720
## midoverdue 0.16456638 0.12245511 0.70006065
## age        0.92510523 0.93827403 0.15561994
## empyear    1.00000000 0.74756395 0.15089249
## asset      0.74756395 1.00000000 0.13877713
## debt       0.15089249 0.13877713 1.00000000

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 >

PCA dengan prcomp()


## Standard deviations (1, .., p=8):
## [1] 1.99490861 1.48867836 0.99921838 0.57081733 0.51435251 0.45579721
## [7] 0.08168404 0.03040859
##
## Rotation (n x k) = (8 x 8):
##                   PC1       PC2        PC3        PC4        PC5
## income    -0.47706407 -0.1852419 -0.03775491 0.06523892 -0.22008106
## tenor      0.01081998 0.1511663 -0.97111786 -0.04289554 -0.02097040
## dependents -0.24696246 0.5063808 0.17722837 0.42331675 0.14590700
## midoverdue -0.20336992 0.5550113 -0.06515053 0.33185665 0.14679694
## age       -0.47873792 -0.1917264 -0.03983856 -0.04920586 0.09776723
## empyear   -0.45716825 -0.1703323 -0.03007422 0.19373502 -0.57710422
## asset     -0.43841511 -0.1890776 -0.03521731 -0.26268660 0.70389438
## debt      -0.19885270 0.5261678 0.12695805 -0.77176371 -0.26497429
##                    PC6          PC7          PC8
## income     0.021707104 -0.5700871556 -0.5987549883
## tenor     -0.177964730 0.0031881769 -0.0006072532
## dependents -0.671312799 -0.0052066743 0.0020444245
## midoverdue 0.717392848 0.0048806574 -0.0020012051
## age        0.016433973 -0.3761733102 0.7607284732
## empyear    0.023860374 0.6214289709 0.0612683219
## asset     -0.007010088 0.3837436091 -0.2429438834
## debt      -0.040687232 0.0002399125 -0.0007503969

Dari output rotation didapatkan loading Principal Component


PC1 = (-0.477)income + (0.011)tenor + (-0.247)dependents + (-0.203)midoverdue
PC2 = (-0.185)income + (0.151)tenor + (0.506)dependents + (0.555)midoverdue
PC3 = (-0.038)income + (-0.971)tenor + (0.177)dependents + (-0.065)midoverdue
PC4 = (0.065)income + (-0.043)tenor + (0.423)dependents + (0.332)midoverdue
dan seterusnya sampai dengan PC8. Pada PC1 terlihat variabel income, age, empyear dan
asset memberikan kontribusi yang besar. Pada PC2 terlihat variabel midoverdue, dependents
dan debt dominan. Pada PC3 variabel yang paling dominan adalah tenor.
Next >

Banyaknya Principal Component


## Importance of components:
##                          PC1   PC2   PC3    PC4    PC5    PC6
## Standard deviation    1.9949 1.4887 0.9992 0.57082 0.51435 0.45580
## Proportion of Variance 0.4975 0.2770 0.1248 0.04073 0.03307 0.02597
## Cumulative Proportion 0.4975 0.7745 0.8993 0.94001 0.97308 0.99905
##                           PC7    PC8
## Standard deviation    0.08168 0.03041
## Proportion of Variance 0.00083 0.00012
## Cumulative Proportion 0.99988 1.00000

Nilai-nilai eigen

## [1] 3.9796603540 2.2161632727 0.9984373775 0.3258324245 0.2645585093


## [6] 0.2077510974 0.0066722822 0.0009246825

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

## 'data.frame':   720 obs. of 8 variables:


## $ income   : num 225 157 118 104 198 189 133 149 175 230 ...
## $ tenor    : num 24 24 12 24 12 36 12 24 12 12 ...
## $ dependents: num 0 0 1 6 1 2 2 0 1 0 ...
## $ midoverdue: num 15 15 15 15 15 15 15 15 15 15 ...
## $ age      : num 47 34 29 28 41 38 32 36 37 45 ...
## $ empyear  : num 8 5 3 2 7 7 3 4 6 9 ...
## $ asset    : num 841 510 433 455 693 ...
## $ debt     : num 0.05 0.05 0.974 3.15 0.352 ...

telah berhasil direduksi menjadi 2 “variabel” PC1 dan PC2.


Next >

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.

##                income      tenor dependents midoverdue       age


## income     1.00000000 -0.04649806 0.25180228 0.1624426 0.9834652
## tenor     -0.04649806 1.00000000 0.00526126 0.2083705 -0.0466877
## dependents 0.25180228 0.00526126 1.00000000 0.7625827 0.2430167
## midoverdue 0.16244264 0.20837054 0.76258273 1.0000000 0.1551441
## age        0.98346517 -0.04668770 0.24301671 0.1551441 1.0000000
## empyear    0.97444733 -0.04796359 0.25394067 0.1645664 0.9251052
## asset      0.86337873 -0.04804028 0.20436953 0.1224551 0.9382740
## debt       0.15557952 0.05837108 0.69737720 0.7000607 0.1556199
##               empyear      asset      debt
## income     0.97444733 0.86337873 0.15557952
## tenor     -0.04796359 -0.04804028 0.05837108
## dependents 0.25394067 0.20436953 0.69737720
## midoverdue 0.16456638 0.12245511 0.70006065
## age        0.92510523 0.93827403 0.15561994
## empyear    1.00000000 0.74756395 0.15089249
## asset      0.74756395 1.00000000 0.13877713
## debt       0.15089249 0.13877713 1.00000000

"Predict" dengan Test Set


Tujuan melakukan PCA untuk data set ini adalah untuk mereduksi dimensi agar data ini
dapat digunakan sebagai input untuk algoritma lain. R menyediakan fungsi predict() untuk
melakukan hal ini.
predboject <- predict(pcaobject, newdata = newdataset)

Yang perlu diperhatikan adalah obyek pr.out pada fungsi predict tersebut dihasilkan oleh PCA


dengan menggunakan data training set sebagai input dan data set yang digunakan pada
fungsi tersebut merupakan data testing set. Data pada predobject$x dapat disimpan untuk
digunakan sebagai input algoritma lain.
Next >

Tugas Praktik: 8 Variabel


Pada bagian ini kita akan melakukan Principal Component Analysis untuk 8 variabel
prediktor numerik dalam data credit rating. Tahap-tahap yang akan dilakukan adalah:
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.
Contoh perintah R yang digunakan dapat dilihat pada contoh pada tugas praktek 4 variabel.
Ikuti 16 langkah di bawah ini untuk melakukan Principal Component Analysis untuk 8
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

library(openxlsx)

#Baca data pada sheet "cslarge" dalam file "https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx"

#dan simpan data dengan nama "cslarge_raw"

cslarge_raw <- read.xlsx("https://academy.dqlab.id/dataset/dqlab_pcadata.xlsx", sheet = "cslarge")

#Tampilkan struktur data

str(cslarge_raw)

#Tampilkan beberapa baris observasi dengan fungsi head()

head(cslarge_raw)
#Tampilkan statistika deskriptif untuk semua variabel dalam data frame.

summary(cslarge_raw)

#Gambarkan distribusi income berdasarkan dependents.

library(ggplot2)

ggplot(cslarge_raw, aes(as.factor(dependents), income)) +

geom_boxplot() + xlab("Dependents") + ggtitle("Boxplot Income Berdasarkan Dependents")

#Gambarkan distribusi debt berdasarkan dependents.

ggplot(cslarge_raw, aes(as.factor(dependents), debt)) +

geom_boxplot() + xlab("Dependents") + ggtitle("Boxplot Debt Berdasarkan Dependents")

#Pisahkan data untuk traning set dan testing set

#untuk tiap-tiap risk rating

#Catat indeks/ nomor baris untuk tiap-tiap risk rating

index1 <- which(cslarge_raw$riskrating == 1)

index2 <- which(cslarge_raw$riskrating == 2)

#Lakukan pencatatan indeks untuk risk rating berikutnya

index3 <- which(cslarge_raw$riskrating == 3)

index4 <- which(cslarge_raw$riskrating == 4)

index5 <- which(cslarge_raw$riskrating == 5)


#80% data akan digunakan sebagai traning set.

ntrain1 <- round(0.8 * length(index1))

ntrain2 <- round(0.8 * length(index2))

ntrain3 <- round(0.8 * length(index3))

ntrain4 <- round(0.8 * length(index4))

ntrain5 <- round(0.8 * length(index5))

#set seed agar sampling ini bisa direproduksi

set.seed(100)

#sampling data masing-masing rating untuk training set

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)

#menyimpan data ke dalam testing set

test1_index <- setdiff(index1, train1_index)

test2_index <- setdiff(index2, train2_index)

test3_index <- setdiff(index3, train3_index)

test4_index <- setdiff(index4, train4_index)

test5_index <- setdiff(index5, train5_index)

#Menggabungkan hasil sampling masing-masing risk rating ke dalam training set


cslarge_train <- do.call("rbind", list(cslarge_raw[train1_index,],

cslarge_raw[train2_index,], cslarge_raw[train3_index,],

cslarge_raw[train4_index,], cslarge_raw[train5_index,]))

cstrain <- subset(cslarge_train, select = -c(contractcode,riskrating))

#Menggabungkan hasil sampling masing-masing risk rating ke dalam testing set

cslarge_test <- do.call("rbind", list(cslarge_raw[test1_index,],

cslarge_raw[test2_index,], cslarge_raw[test3_index,],

cslarge_raw[test4_index,], cslarge_raw[test5_index,]))

cstest <- subset(cslarge_test, select = -c(contractcode,riskrating))

#Menghitung korelasi antar variabel

cor(cstrain)

#Menggambarkan matrik korelasi dengan ggcorrplot

library(ggcorrplot)

ggcorrplot(cor(cstrain))

#Lakukan analisa PCA dengan fungsi prcomp() dan

#simpan output ke dalam obyek dengan nama pr.out

pr.out <- prcomp(cstrain, scale = TRUE, center = TRUE)

#Tampilkan output PCA dengan memanggil obyek pr.out

pr.out
#Tampilkan summary dari output PCA

summary(pr.out)

#Gambarkan scree plot dengan menggunakan fungsi screeplot()

screeplot(pr.out, type = "line", ylim = c(0,2))

#Tambahkan garis horizontal sebagai panduan untuk menggunakan kriteria Kaiser

abline(h = 1, lty = 3, col = "red")

#Gambarkan biplot dengan menggunakan fungsi biplot()

biplot(pr.out, scale = 0) #draw first 2 principal components

#Gambarkan Principal Component dan risk rating dengan menggunakan

#fungsi autoplot() dari package ggfortify.

library(ggfortify)

autoplot(pr.out, data = cslarge_train, colour = 'riskrating',

loadings = TRUE, loadings.label = TRUE, loadings.label.size = 3, scale = 0)

#Gambarkan Principal Component dan risk rating dengan menggunakan

#fungsi fviz_pca_ind() package factoextra.

library(factoextra)

fviz_pca_ind(pr.out, label="none", habillage=cslarge_train$riskrating)

Teori Penunjang (Aljabar Linier)


Penjumlahan dan Perkalian Matriks
Dua buah matrik dapat dijumlahkan bila kedua matrik tersebut memiliki dimensi yang sama,
yaitu m × n.
Am×n + Bm×n = Cm×n

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 dan Kombinasi Linier


Motivasi untuk membahas konsep kombinasi linier ini datang dari kebutuhan untuk
menyatakan data sebagai kombinasi linier dari principal component-principal component
yang mana masing-masing principal component merupakan kombinasi linier variabel-
variabel prediktor. Koordinat suatu vektordapat dituliskan sebagai kombinasi linier dari
vektor-vektor yang menjadi basisnya.

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 >

Nilai Eigen dan Vektor Eigen


Nilai eigen dan vektor eigen adalah pasangan λ danyang memenuhi persamaan

Nilai eigen dihitung dengan mencari akar polinomial karakteristik det(A − λI) = 0.


Determinan suatu matriks (A−λI) untuk matriks bujur sangkar A3×3 dapat dihitung dengan
ekspansi kofaktor Laplace.

Vektor Eigen dihitung dengan mensubstitusikan nilai eigen ke dalam persamaan A = λ dan


mencari solusi sistem persamaan linier.

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. 

Anda hanya perlu run dan submit kode di bawah ini.


(A <- as.matrix(data.frame(c(1,0,1),c(0,1,1),c(1,1,0))))

e <- eigen(A)

str(e)

Tugas Praktik
Ikuti langkah-langkah berikut dan diindikasikan dengan comment pada code editor.

1. Ketik perintah ?matrix ini untuk membaca help tentang matriks 


2. Buatlah matriks 3 x 3 dan simpan dengan nama matriks A.
3. Tuliskan perintah untuk menampilkan matriks A
4. Tuliskan perintah untuk menghitung nilai eigen dan vektor eigen dan simpanlah
hasilnya dalam variable ev
5. Tuliskan perintah untuk melihat struktur obyek eigen
6. Tuliskan perintah untuk melihat hasil output
7. Tuliskan perintah untuk mengakses nilai eigen
8. Tuliskan perintah untuk mengakses vektor eigen

 
# Ketik perintah berikut ini untuk membaca help tentang matriks
?matrix

# Buatlah matriks 3 x 3 dan simpan dengan nama matriks A.

A <- matrix(c(1, 1, 0, 0, -2, 1, 0, 0, 3), nrow = 3, ncol = 3, byrow = TRUE)

# Tuliskan perintah untuk menampilkan matriks A

# Tuliskan perintah R untuk menghitung nilai eigen dan vektor eigen

# dan simpanlah hasilnya dalam variable ev

ev <- eigen(A)

# Tuliskan perintah untuk melihat struktur obyek eigen

str(ev)

# Tuliskan perintah untuk melihat hasil output

ev

# Tuliskan perintah untuk mengakses nilai eigen

ev$values

# Tuliskan perintah untuk mengakses vektor eigen

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

1. Melakukan standarisasi data


2. Menghitung matrik korelasi
3. Menghitung nilai eigen dan vektor eigen
4. Memilih banyaknya principal component dengan Screeplot dan
kriterion Kaiser
5. Visualisasi output

Langkah 1 sampai dengan 3 dapat secara otomatis dilakukan oleh R.


Next >

Analisis Data COVID19 di Indonesia

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 <- c ("cuci tangan", "pakai masker", "jaga jarak")

bersatulawancovid

Are You Ready?


Dalam proyek ini, Anda akan diminta untuk melakukan eksplorasi dan analisis mengenai
COVID-19 di Indonesia. Data yang Anda pergunakan diambil langsung dari API (Application
Programming Interface) yang tersedia di covid19.go.id. Sehingga dalam proyek ini Anda akan
mempelajari teknik mengambil data dari API, teknik mempersiapkan data, serta analisis dan
visualisasi data.
Apakah Anda siap untuk mengerjakan proyek analisis data ini? Jawablah
dengan TRUE apabila Anda siap atau FALSE jika Anda belum siap karena belum mencuci
tangan.
Bermain API
Mengakses API covid.go.id
Rekapitulasi data COVID-19 Indonesia tersedia dalam API publik yang beralamat
di https://data.covid19.go.id/public/api/update.json.
Salah satu cara untuk mengakses API adalah dengan menggunakan fungsi GET() dari
paket httr.
Sekarang aktifkanlah paket httr dan jalankan fungsi GET() pada alamat API yang telah
disebutkan! Simpan hasil fungsi tersebut dalam obyek bernama resp.
library(httr)

resp <- GET ("https://data.covid19.go.id/public/api/update.json")

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.

404. Artinya berkas yang diminta tidak dapat ditemukan.


403. Artinya akses permintaan ditolak.


500. Artinya terjadi kesalahan pada server.


Informasi lengkap mengenai jenis-jenis status code dapat diakses melalui :
https://restfulapi.net/http-status-codes/
Anda dapat menggunakan fungsi status_code() untuk mengetahui status atas permintaan
Anda melalui API. Sekarang coba lihatlah status atas permintaan yang telah Anda buat!
Apakah permintaan Anda berhasil?
 
library(httr)

resp <- GET("https://data.covid19.go.id/public/api/update.json")

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 <- GET("https://data.covid19.go.id/public/api/update.json")

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)

resp <- GET("https://data.covid19.go.id/public/api/update.json")

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)

resp <- GET("https://data.covid19.go.id/public/api/update.json")

cov_id_raw <- content(resp, as = "parsed", simplifyVector = TRUE)

Mengekstrak isi Respon - Pt 2


Dengan menggunakan fungsi length() dan names() cobalah amati ada berapa komponen
serta apa saja nama komponen dalam obyek cov_id_raw tersebut! Kemudian ekstraklah
komponen ke-2 dan simpan dengan nama cov_id_update.
length(cov_id_raw)

names(cov_id_raw)

cov_id_update <- cov_id_raw$update

Analisa Data
Sekarang Anda diminta untuk fokus pada obyek cov_id_update untuk menjawab
pertanyaan-pertanyaan berikut:

 Kapan tanggal pembaharuan data penambahan kasus?


 Berapa jumlah penambahan kasus sembuh?
 Berapa jumlah penambahan kasus meninggal?
 Berapa jumlah total kasus positif hingga saat ini?
 Berapa jumlah total kasus meninggal hingga saat ini?

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)

Sekarang jalankanlah fungsi names() pada cov_jabar_raw tersebut untuk mengetahui


nama-nama elemen utama yang tersedia dan jawablah pertanyaan berikut:

 Berapa jumlah total kasus COVID-19 di Jawa Barat?


 Berapa persentase kematian akibat COVID-19 di Jawa Barat?
 Berapa persentase tingkat kesembuhan dari COVID-19 di Jawa Barat?

library(httr)

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)

names(cov_jabar_raw)
cov_jabar_raw$kasus_total

cov_jabar_raw$meninggal_persen

cov_jabar_raw$sembuh_persen

Memperoleh Informasi yang Lebih Lengkap


Informasi umum mengenai COVID-19 di Jawa Barat telah Anda dapatkan. Namun informasi
akan lebih lengkap jika Anda memiliki data perkembangan COVID-19 dari waktu ke waktu,
apakah Anda setuju?
Kabar baiknya adalah informasi tersebut juga disediakan oleh covid19.go.id melalui
permintaan API yang telah Anda buat sebelumnya. Data historis perkembangan COVID-19
tersebut tersimpan dengan nama list_perkembangan. Silakan Anda ekstrak data tersebut
dari cov_jabar_raw dan simpanlah hasilnya sebagai obyek bernama cov_jabar! Amati
struktur cov_jabar menggunakan fungsi str() dan head().
cov_jabar <- cov_jabar_raw$list_perkembangan

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:

1. Menghapus kolom “DIRAWAT_OR_ISOLASI” dan “AKUMULASI_DIRAWAT_OR_ISOLASI”


2. Menghapus semua kolom yang berisi nilai kumulatif
3. Mengganti nama kolom “KASUS” menjadi “kasus_baru”
4. Merubah format penulisan kolom berikut menjadi huruf kecil
o kolom MENINGGAL
o kolom SEMBUH
5. Memperbaiki data pada kolom tanggal
Lengkapilah baris kode berikut untuk melakukan menjinakan data sesuai dengan tahapan
yang telah Anda rencanakan! Anda akan menggunakan operator pipe (%>%) untuk merangkai
fungsi menjadi sebuah pipeline. Simpan hasil pengolahan Anda dengan
nama new_cov_jabar.
library(dplyr)

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.POSIXct(tanggal / 1000, origin = "1970-01-01"),

tanggal = as.Date(tanggal)

str(new_cov_jabar)

Menunjukkan Melalui Gambar


Akhirnya Anda berhasil menjinakan data cov_jabar sehingga lebih mudah untuk diolah,
selamat! Memiliki data yang rapi memang menyenangkan, apakah Anda setuju dengan hal
tersebut?
Setelah memiliki data yang jinak, sekarang saatnya Anda mengekspresikan data tersebut
dalam bentuk lain yang harapannya lebih mudah dicerna: grafik. Anda akan memulai
merancang visualisasi yang memiliki estetika dengan
menggunakan paket ggplot2 dan paket hrbrthemes. Aktifkanlah kedua paket tersebut!
Berikut merupakan templat kode untuk membuat visualisasi menggunakan ggplot2:
ggplot(data = ..., aes(x = ..., y = ...)) +
geom_xxx()

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.

Output yang dihasilkan hingga menjelang akhir Juli 2020:

 
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:

Bagaimana kondisi COVID19?


library(ggplot2)

library(hrbrthemes)

ggplot(new_cov_jabar, aes(x = tanggal, y = kasus_baru)) +

geom_col()

Menunjukkan Melalui Gambar - Pt 2


Anda telah berhasil membuat bar-chart yang diminta. Namun grafik tersebut belum memiliki
informasi yang jelas serta cenderung membosankan untuk dilihat. Sekarang silakan buat
kembali grafik tersebut dengan menggunakan baris kode yang telah dimodifikasi berikut:

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.

Bagaimana lonjakan COVID19 menurut Anda?


library(ggplot2)

library(hrbrthemes)

ggplot(new_cov_jabar, aes(tanggal, kasus_baru)) +

geom_col(fill="salmon") +

labs(

x= NULL,

y= "Jumlah kasus",

title = "Kasus Harian Positif COVID-19 di Jawa Barat",

subtitle = "Terjadi pelonjakan kasus di awal bulan juli akibat klaster Secapa AD Bandung",

caption = "Sumber data : covid.19.go.id"

)+

theme_ipsum(

base_size = 13,

plot_title_size = 21,

grid = "Y",

ticks = TRUE

)+

theme(plot.title.position = "plot")

Grafik untuk Kasus Sembuh


Sekarang buatlah grafik serupa dengan menggunakan data kasus sembuh  Pergunakan
warna “olivedrab2” untuk grafik kasus sembuh!
Hasil yang diharapkan adalah sebagai berikut untuk data hingga Juli 2020:

Setelah lebih dari setahun, yaitu kondisi sembuh di awal Juli 2021 akan diperlihatkan seperti
berikut

Bagaimana menurut Anda?


library(ggplot2)

library(hrbrthemes)

ggplot(new_cov_jabar, aes(tanggal, sembuh)) +

geom_col(fill="olivedrab2") +

labs(

x = NULL,

y = "Jumlah kasus",

title = "Kasus Harian Sembuh Dari COVID-19 di Jawa Barat",

caption = "Sumber data: covid.19.go.id"

)+

theme_ipsum(

base_size = 13,

plot_title_size = 21,

grid = "Y",

ticks = TRUE

)+

theme(plot.title.position = "plot")

Grafik untuk Kasus Meninggal


Sekarang buatlah grafik serupa dengan menggunakan data kasus meninggal. Pergunakan
warna “darkslategray4” untuk kasus meninggal!
Output yang seharusnya dihasilkan adalah sebagai berikut (hingga Juli 2020).

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)

ggplot(new_cov_jabar, aes(tanggal, meninggal)) +

geom_col(fill = "darkslategray4") +

labs(

x = NULL,

y = "Jumlah kasus",

title = "Kasus Harian Meninggal Akibat COVID-19 di Jawa Barat",

caption = "Sumber data: covid.19.go.id"

)+

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)

cov_jabar_pekanan <- new_cov_jabar %>%

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(

jumlah_pekanlalu = dplyr::lag(jumlah, 1),

jumlah_pekanlalu = ifelse(is.na(jumlah_pekanlalu), 0, jumlah_pekanlalu),

lebih_baik = jumlah < jumlah_pekanlalu

glimpse(cov_jabar_pekanan)

Membuat Bar Chart


Anda sungguh luar biasa! Dengan menggunakan data hasil perhitungan tersebut maka
sekarang Anda dapat membuat bar-chat penambahan kasus pekanan yang ditambahkan
informasi baru untuk menjawab pertanyaan: “Apakah pekan ini lebih baik?”
Salin dan jalankan kode berikut di konsol Anda!

 
Adapun hasil yang diharapkan adalah sebagai berikut (untuk pekan ke-9 s/d 29 tahun
2020).
library(ggplot2)
library(hrbrthemes)

ggplot(cov_jabar_pekanan, aes(pekan_ke, jumlah, fill = lebih_baik)) +

geom_col(show.legend = FALSE) +

scale_x_continuous(breaks = 9:29, expand = c(0, 0)) +

scale_fill_manual(values = c("TRUE" = "seagreen3", "FALSE" = "salmon")) +

labs(

x = NULL,

y = "Jumlah kasus",

title = "Kasus Pekanan Positif COVID-19 di Jawa Barat",

subtitle = "Kolom hijau menunjukan penambahan kasus baru lebih sedikit dibandingkan satu pekan
sebelumnya",

caption = "Sumber data: covid.19.go.id"

)+

theme_ipsum(

base_size = 13,

plot_title_size = 21,

grid = "Y",

ticks = TRUE

)+

theme(plot.title.position = "plot")

Pola dan Dinamika


Ada yang akhirnya sembuh, namun tak sedikit pula yang meninggal akibat COVID-19.
Sementara itu penambahan kasus baru terus terjadi di masyarakat. Hal ini mungkin memicu
pertanyaan lain di diri Anda: “Hingga saat ini ada berapa kasus yang masih aktif?”. Aktif
dalam artian sedang dalam perawatan atau isolasi.
Informasi ini sebenarnya telah disediakan di dalam respon API covid19.go.id yang Anda
minta. Namun tidak ada salahnya jika Anda mencoba menghitungnya sendiri, apakah Anda
setuju?
Jumlah kasus aktif dapat dihitung dengan cara mengurangi jumlah akumulasi positif dengan
jumlah akumulasi sembuh dan jumlah akumulasi meninggal. Anda dapat menggunakan
fungsi cumsum() untuk menghitung nilai akumulasi dari suatu vektor numerik. Lengkapilah
baris kode berikut untuk menghitung jumlah akumulasi kasus aktif, kasus sembuh, dan kasus
meninggal!
library(dplyr)

cov_jabar_akumulasi <-

new_cov_jabar %>%

transmute(

tanggal,

akumulasi_aktif = cumsum(kasus_baru) - cumsum(sembuh) - cumsum(meninggal),

akumulasi_sembuh = cumsum(sembuh),

akumulasi_meninggal = cumsum(meninggal)

tail(cov_jabar_akumulasi)

Membuat Line Chart


Sekarang cobalah Anda buat line-chart pola kasus aktif dengan menggunakan
fungsi geom_line(). Sebagai pengingat, Anda dapat menggunakan templat kode berikut
untuk membuat grafik menggunakan ggplot2():

ggplot(data = ..., aes(x = ..., y = ...)) +


geom_xxx()

Adapun hasil hingga Juli 2020.

Sementara untuk kondisi hingga awal Juli 2021

 
Kesimpulan apa yang dapat Anda tarik dari grafik tersebut?
library(ggplot2)

ggplot(data =cov_jabar_akumulasi, aes(x = tanggal, y = akumulasi_aktif)) +

geom_line()

Kabar Buruk dan Kabar Baik


Sebagai penutup analisis dalam proyek ini Anda diminta untuk membuat grafik komparasi
antara akumulasi kasus aktif, kasus sembuh, dan kasus meninggal.
Ada dua pilihan cara yang dapat Anda tempuh untuk membuat grafik tersebut:
1. Menggunakan data cov_jabar_akumulasi, kemudian buat tiga layer geom_line() untuk
setiap kolom satu per satu dengan warna garis yang berbeda; atau
2. Melakukan pivot pada data cov_jabar_akumulasi, kemudian buat
satu layer geom_line() dengan menggunakan colour aesthetic
Anda akan diminta untuk menempuh cara nomor 2, yaitu dengan cara melakukan pivot pada
data terlebih dahulu. Ketik TRUE pada Code Editor jika Anda setuju!

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(

kategori = sub(pattern = "akumulasi_", replacement = "", kategori)

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

yang Anda gunakan?

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)

ggplot(cov_jabar_akumulasi_pivot, aes(tanggal, jumlah, colour = (kategori))) +

geom_line(size = 0.9) +

scale_y_continuous(sec.axis = dup_axis(name = NULL)) +

scale_colour_manual(

values = c(
"aktif" = "salmon",

"meninggal" = "darkslategray4",

"sembuh" = "olivedrab2"

),

labels = c("Aktif", "Meninggal", "Sembuh")

)+

labs(

x = NULL,

y = "Jumlah kasus akumulasi",

colour = NULL,

title = "Dinamika Kasus COVID-19 di Jawa Barat",

caption = "Sumber data: covid.19.go.id"

)+

theme_ipsum(

base_size = 13,

plot_title_size = 21,

grid = "Y",

ticks = TRUE

)+

theme(

plot.title = element_text(hjust = 0.5),

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 >

A Walk Into Sensory Science

Ilmu Sensoris 101


Mari Berkenalan
Sebelumnya perkenalkan nama saya Muhammad Aswan Syahputra, data mentor
DQLab, Sensometrics Specialist di Sensolution.ID dan saat ini juga berprofesi sebagai Data
Analyst di Jabar Digital Service. 
Selamat datang di modul “A walk into sensory science”! Di dalam modul ini, saya akan
mengajak Anda untuk berkenalan dengan suatu bidang spesifik yang banyak menggunakan
metode analisis data yaitu Sensory Science.
Di dalam Bahasa Indonesia sensory science dan riset mengenainya secara umum disebut
dengan Ilmu Sensoris, Evaluasi Sensoris, atau Uji Organoleptik.
 
 

Domain Ilmu Sensoris

 
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?
 

Contoh Eksplorasi Produk (1)

Contoh Eksplorasi Produk (2)

 
Menurut Anda, apa yang akan terjadi jika tidak ada riset sensoris dalam pengembangan
produk pangan?
 

Penerapan Ilmu Sensoris di Berbagai Bidang

Next >

Istilah Penting Dalam Ilmu Sensoris

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

Mengenal Data - Part 2: Eksplorasi Struktur


Data
Setelah berhasil mengimpor data chocolates, selanjutnya silakan Anda lakukan eksplorasi
mengenai struktur data pada chapter sebelumnya. 
Ada berapa banyak observasi (baris) dan variabel (kolom) pada data tersebut? Terdapat pada
kolom apakah informasi panelis dan sampel? Apakah seluruh jenis data pada setiap kolom
sudah sesuai? Anda dapat memanfaatkan fungsi skim() dari paket skimr.
install.packages("skimr",repos = "http://cran.us.r-project.org")

library(skimr)

skim(chocolates)

Mengenal Data - Part 3


Setelah mengetahui nama kolom yang memiliki informasi panelis dan sampel, selanjutnya
dapatkah Anda menemukan nama-nama sampel dan menghitung jumlah sampel yang
disajikan pada penelitian tersebut? Serta ada berapakah jumlah panelis yang terlibat? Anda
akan memerlukan fungsi summarise() dan n_distinct() dari paket dplyr. Isilah jawaban
Anda ke dalam n_sample dan n_panelist!.
library(dplyr)

chocolates %>%

summarise(

sample = toString(levels(product)),

n_sample = n_distinct(product),

n_panelist = n_distinct(panelist)
)

n_sample <- 6

n_panelist <- 29

Mengenal Data - Part 4


Luar biasa! Anda menemukan bahwa dalam riset tersebut melibatkan enam produk cokelat
dan 29 orang panelis. Selain informasi sampel dan panelis, dalam data chocolates tersebut
juga informasi mengenai sesi pengujian, urutan penyajian sampel. Sehingga total ada empat
kolom yang berisi informasi mengenai penelitian dan seluruhnya disimpan dalam empat
kolom pertama di data chocolates. Berdasarkan informasi tersebut, dapatkah Anda
menghitung jumlah atribut sensoris yang dievaluasi dalam riset tersebut? Serta dapatkah
Anda membuat kode untuk menemukan nama-nama atribut sensoris tersebut? Simpanlah
hasilnya sebagai atribut_sensoris!
ncol(chocolates) - 4

atribut_sensoris <- colnames(chocolates[-c(1, 2, 3, 4)])

atribut_sensoris

Mengenal Data - Part 5


Selanjutnya silakan Anda seleksi kolom atribut sensoris dari data chocolates dengan
memanfaatkan obyek atribut_sensoris yang telah dibuat. Fungsi dari dplyr apakah yang
digunakan untuk melakukan seleksi kolom? Setelah melakukan seleksi kolom, jalankanlah
fungsi skim_without_charts() untuk mengamati rentang nilai yang diberikan oleh panelis
terhadap atribut-atribut sensoris tersebut! Dapatkah Anda mengestimasi batas bawah batas
atas dari skala penilaian yang digunakan oleh panelis?
install.packages("skimr",repos = "http://cran.us.r-project.org")

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

Dari Satu Sisi - Part 2


Kemudian jalankanlah anova() pada model_bitterness tersebut! Amati angka p-value dari
faktor ‘product’ yang tersimpan dalam kolom Pr(>F), apakah hasilnya menunjukan pengaruh
signifikan pada tingkat kepercayaan 95%? Catatan: pengaruh siginifikan terdeteksi dari suatu
faktor apabila nilai p-value < 0,05 (jika menggunakan tingkat kepercayaan 95%).
anova(model_bitterness)

Dari Satu Sisi - Part 3


Ya! Keluaran dari kode tersebut menunjukan bahwa faktor ‘product’ memiliki angka p-value
< 0,05. Artinya secara statistik terdapat perbedaan signifikan pada atribut rasa pahit yang
disebabkan oleh keragaman sampel produk cokelat. Setelah menemukan hasil tersebut,
maka tahap natural selanjutnya adalah penelusuran lebih mendalam pada level faktor
produk. Bagaimanakah komparasi rasa pahit antar produk?
Anda dapat menjawab pertanyaan tersebut dengan cara melakukan analisis koefisien dari
level pada faktor ‘product’. Adapun uji statistik yang digunakan adalah Student’s t-test untuk
membandingkan angka koefisien antar level. Kabar baiknya, Anda cukup menjalankan
fungsi summary.lm() pada model_bitterness yang telah dibuat sebelumnya. Berapakah
angka koefisien dari choc2 (perhatikan nilai pada kolom Estimate)?
summary.lm(model_bitterness)

-1.74 # dua digit di belakang koma/titik

Dari Satu Sisi - Part 4


Anda menemukan bahwa angka koefisien dari choco2 adalah -1,74. Apakah artinya? Angka
tersebut menunjukan bahwa selisih nilai antara rerata choc2 terhadap rerata choc1. Dengan
kata lain, skor rasa pahit dari choc2 adalah 1,74 poin lebih rendah dibandingkan dengan
choc1. Bagaimana dengan choc3? Apakah lebih pahit atau lebih tidak pahit dibandingkan
dengan choc1?
Next >

Dari Satu Sisi - Part 5 : Quiz


Mengapa produk acuan dalam analisis koefisien tersebut adalah choc1? Mengapa bukan
choc2, choc3, choc4, choc5, atau choc6? Bagikan pendapat Anda melalui LinkedIn tag DQLab
(@dqlab) dan Muhammad Aswan (@aswansyahputra) dan di Instagram dengan tag akun
@DQLab dan @aswansyahputra_ ya! (Sedikit kata kunci sebagai petunjuk dari data mentor :
“kontras”)
Next >

Dari Satu Sisi - Part 6


Angka koefisien yang Anda dapatkan pada bagian sebelumnya merupakan perbandingan
antar sampel terhadap produk choc1 sebagai acuan. Namun bagaimana jika sebenarnya
Anda tidak memiliki produk tertentu sebagai acuan? Dengan kata lain, Anda hanya ingin
mengetahui bagaimana karakteristik rasa pahit suatu sampel produk jika dibandingkan
dengan rasa pahit produk cokelat ‘rata-rata’. Hal tersebut dapat dilakukan di R dengan cara
mengatur jenis kontras yang digunakan terlebih dahulu lalu kemudian menjalankan
ulang aov dan summary.lm() sebagaimana contoh berikut :

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)

res_bitterness <- AovSum(model_bitterness)

anova(model_bitterness)

res_bitterness$Ftest

Dari Satu sisi - Part 7


Perhatikan keluaran berikut saat Anda mengekstrak isi dari res_bitterness$Ttest :

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]

c("choc1", "choc4", "choc2", "choc5", "choc6", "choc3")

Dari Satu Sisi - Part 8


Lantas, bagaimanakah cara kita membandingkan rasa pahit antar sampel produk? Salah satu
cara untuk mengetahui hal tersebut adalah dengan melakukan uji lanjut (post-hoc test)
setelah melakukan ANOVA. Dalam contoh ini Anda diminta untuk melakukan uji lanjut
menggunakan metode Tukey HSD yang tersedia di dalam paket agricolae sebagai
fungsi HSD.test(). Simpanlah hasilnya sebagai posthoc_bitterness dan ektraklah
elemen groups dari obyek tersebut!
install.packages('agricolae', repos="http://cran.rstudio.com/")

library(agricolae)
posthoc_bitterness <- HSD.test(model_bitterness, trt = "product")

posthoc_bitterness$groups

Dari Satu Sisi - Part 9


Sekarang cetaklah kembali posthoc_bitterness$groups pada konsol Anda dan
perhatikanlah huruf-huruf yang terdapat pada kolom groups. Huruf-huruf tersebut
menunjukan apakah terdapat perbedaan yang bermakna antar produk cokelat berdasarkan
atribut rasa pahit. Apabila suatu produk mengandung huruf yang sama dengan produk
lainnya, maka tidak terdapat perbedaan yang signifikan diantara mereka. Konfirmasilah hal
tersebut dengan membuat grafik komparasi antar produk menjalankan
fungsi plot.group() pada posthoc_bitterness! Tariklah kesimpulan dan bagikan hasilnya
di akun LinkedIn dan sosial media Anda ya! Tentunya jangan lupa untuk tag akun DQLab dan
data mentor (Muhammad Aswan) ya.
install.packages('agricolae', repos="http://cran.rstudio.com/")

library(agricolae)

posthoc_bitterness$groups

plot.group(posthoc_bitterness, variation = "SE")

Dari Satu Sisi - Part 10


Selamat Anda telah berhasil melakukan analisis terhadap aribut sensoris rasa pahit
(bitterness)! Berikut merupakan ringkasan kode yang telah Anda jalankan untuk atribut
sensoris rasa pahit :

Sekarang dapatkah Anda melakukan hal yang serupa untuk 13 atribut sensoris lainnya?

Tak Cukup Satu Sisi - Part 1


Di dalam ilmu sensoris ada suatu istilah yang disebut dengan persepsi multisensoris
(multisensory perception). Apakah persepsi multisensoris itu? Secara sederhana, persepsi
multisensoris merupakan konsep yang menyatakan bahwa suatu produk tidak hanya dinilai
berdasarkan satu aspek inderawi saja. Manusia cenderung menilai suatu produk secara
holistik dengan mengintegrasikan persepsi dari berbagai aspek inderawi, contohnya
penglihatan, pendengaran, pengecap, penciuman, dan peraba. Persepsi inderawi manusia
saling berhubungan dan berintegrasi sehingga akhirnya menghasilkan persepsi utama untuk
menilai suatu produk.
Sebagai konsekuensi dari hal tersebut, maka sulit untuk menilai sutu produk jika hanya
berdasarkan satu atau sedikit atribut sensoris saja. Atribut sensoris akhirnya teragregasi
menjadi suatu karakteristik sensoris produk. Perlu dilakukan analisis yang
mempertimbangkan banyak atribut sensoris sekaligus sehingga kita dapat mendapatkan
karakteristik sensoris produk secara holistik.
Next >

Tak Cukup Satu Sisi - Part 2


Dalam contoh berikut, Anda diminta untuk menghitung dan membuat visualisasi angka
korelasi antar atribut sensoris dari produk cokelat. Anda akan menggunakan fungsi cor serta
fungsi corrplot() dari paket corrplot. Manfaatkanlah obyek atribut_sensoris yang
sebelumnya telah Anda buat! Buatlah kesimpulan terhadap grafik yang Anda dapatkan.
 

library(dplyr)

library(corrplot)

chocolates2 <- chocolates %>%

select(atribut_sensoris) %>%

cor() %>%

corrplot(

type = "upper",

method = "square",

diag = FALSE,

addgrid.col = FALSE,

order = "FPC",

tl.col = "gray30",

tl.srt = 30
)

chocolates2

Tak Cukup Satu Sisi - Part 3

 
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

Tak Cukup Satu Sisi - Part 4


 
Analisis multivariat diperlukan untuk membuat peta persepsi atau ruang sensoris yang
sebelumnya telah disinggung. Dikarenakan pada data QDA semua atribut dinilai
menggunakan skala numerik, maka uji statistik yang dapat Anda gunakan adalah Principal
Component Analysis (PCA). Apakah Anda sudah familiar dengan nama tersebut?
Data yang akan digunakan dalam analisis ini merupakan nilai agregasi atribut sensoris per
sampel produk. Nilai ini didapatkan berdasarkan nilai rerata yang telah disesuaikan dengan
model ANOVA yang sebelumnya telah Anda buat. Data adjusted
mean dari chocolates tersedia sebagai berkas “chocolates_adjmean.rds” pada direktori
kerja Anda. Imporlah data tersebut dengan menggunakan fungsi readRDS() dan simpanlah
hasilnya sebagai chocolates_adjmean! Ada berapa baris dan kolom pada data tersebut?
 
chocolates_adjmean<- readRDS("chocolates_adjmean.rds")

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)

chocolates_pca <- PCA(chocolates_adjmean, graph = FALSE)

names(chocolates_pca)

chocolates_pca$eig

Tak Cukup Satu Sisi - Part 6


Keluaran dari chocolates_pca$eig menujukan bahwa angka eigenvalue > 1 ditemukan pada
dua principal component atau dimensi pertama. Selain itu, persentase varian kumulatif juga
menunjukan nilai yang sangat besar (>75%). Oleh karena itu, dalam studi kasus ini peta
persepsi atau ruang dimensi dapat diinterpretasi dengan menggunakan dua dimensi
pertama saja. Sebelum lanjut ke tahap selanjutnya, buatlah grafik yang menunjukan angka
eigenvalue dan persentase varian dengan menggunakan fungsi fviz_eig() dari
paket factoextra! Aturlah argumen addLabels menggunakan nilai TRUE.
library(factoextra)

fviz_eig(chocolates_pca, choice = "eigenvalue", addlabels = TRUE)

fviz_eig(chocolates_pca, choice = "variance", addlabels = TRUE)

Tak Cukup Satu Sisi - Part 7


Sekarang saatnya Anda melakukan inspeksi terhadap peta persepsi atau ruang sensoris.
Bagaimana peta sebaran produk cokelat dalam peta persepsi tersebut? Hal tersebut dapat
Anda jawab dengan mudah menggunakan representasi grafik. Perhatikanlah grafik
representasi produk cokelat dengan menjalankan baris kode berikut :

library(factoextra)

fviz_pca_ind(chocolates_pca, repel = TRUE)


Tak Cukup Satu Sisi - Part 8
Grafik tersebut menunjukan posisi dari setiap produk cokelat pada peta persepsi atau ruang
sensoris. Prinsipnya produk yang letaknya berdekatan adalah produk yang memiliki
karakteristik sensoris serupa. Sedangkan produk yang terletak berjauhan artinya memiliki
karakteristik sensoris yang berbeda. Selain itu, produk yang terletak mendekati titik 0 atau
pusat grafik artinya memiliki karakteristik ‘rata-rata’. Produk manakah yang memiliki
karakteristik sensoris paling berlawanan dengan choc1? Jawablah dengan memberikan
nilai TRUE atau FALSE pada dua nama produk yang paling berlawanan dengan choc1!
library(factoextra)

fviz_pca_ind(chocolates_pca, repel = TRUE)

choc2 <- FALSE

choc3 <- TRUE

choc4 <- FALSE

choc5 <- FALSE

choc6 <- TRUE

Tak Cukup Satu Sisi - Part 9


Luar biasa! Dengan menggunakan peta persepsi maka kategorisasi produk cokelat dapat
dilihat dengan lebih mudah secara holistik mempertimbangkan seluruh atribut sensoris yang
digunakan dalam riset. Sekarang saatnya Anda melakukan pengamatan pada atribut sensoris
dengan menggunakan baris kode sebagai berikut :

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)

fviz_pca_var(chocolates_pca, repel = TRUE)

Tak Cukup Satu Sisi - Part 10


Selain itu, dari grafik tersebut Anda juga dapat mengetahui korelasi antar atribut dengan
mudah. Prinsipnya adalah apabila panah atribut sensoris menuju arah yang sama dan
berhimpitan, maka terdapat hubungan berbanding lurus yang kuat diantara atribut sensoris
tersebut. Apabila panah antar dua atribut sensoris membentuk sudut hampir siku, maka
korelasi antar atribut sensoris tersebut relatif lemah lemah. Dengan atribut sensoris apakah
daya leleh (melting) produk cokelat berkorelasi paling besar? Serta dengan atribut sensoris
manakah rasa manis (sweetness) berkorelasi paling lemah? Tuliskan jawaban Anda sebagai
vektor karakter untuk masing-masing pertanyaan!
library(factoextra)

fviz_pca_var(chocolates_pca, repel = TRUE)

"sticky"

"crunchy"

Tak Cukup Satu Sisi - Part 11


Akhirnya Anda ingin membuat relasi antara representasi sampel pada sensory space dengan
atribut sensoris yang membentuk sensory space tersebut. Hal tersebut dapat mudah
dilakukan dengan cara membuat grafik dalam satu bidang sejajar (dua plot dalam satu
grafik). Di bawah telah diberikan kode untuk membuat grafik tersebut. Berikanlah komentar
Anda terhadap grafik yang dihasilkan!

library(factoextra)
fviz_pca_biplot(chocolates_pca, repel = TRUE, title = "Peta Persepsi Produk Cokelat
Komersial")
 

Lebih Sederhana, Lebih Cepat!


Pembukaan - Part 1
Anda telah berhasil melakukan analisis data per atribut sensoris dan juga analisis data untuk
seluruh atribut sensoris secara simultan. Dalam proses analisis data tersebut Anda juga telah
menggunakan kombinasi berbagai paket R hingga akhirnya mendapatkan hasil analisis
untuk diinterpretasi lebih lanjut. Namun, masih ingatkah Anda seluruh nama-nama dari
paket dan fungsi apa saja yang telah digunakan? Jawablah dengan
menjalankan TRUE atau FALSE pada konsol R Anda!
 
Pembukaan - Part 2
Ya! Hal tersebut sangatlah wajar dan itu pula yang juga saya alami saat melakukan analisis
data sensoris. Ada banyak sekali paket dan fungsi yang dijalankan hingga akhirnya dapat
dilakukan interpretasi untuk menghasilkan suatu kesimpulan. Berlatarbelakang hal tersebut,
akhirnya saya mengembangkan paket R untuk analisis data sensoris sehingga dapat
dilakukan dengan lebih mudah dan cepat. Paket tersebut bernama sensehubr dan tersedia
di aswansyahputra/github.io/sensehubr.
Paket sensehubr dibangun dengan menggunakan tidyverse philosophy sehingga memiliki
fungsi dan kinerja yang konsisten. Ada tiga fungsi utama di sensehubr untuk melakukan
analisis data:

1. specify()
2. analyse()
3. visualise()

Pada bagian selajutnya saya akan ditunjukan prosedur analisis data chocolates dengan


menggunakan paket sensehubr. Apakah Anda tertarik?

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

kolom_panelis <- TRUE

jumlah_panelis <- TRUE

kolom_sampel <- TRUE

nama_sampel <- FALSE


jumlah_sampel <- TRUE

kolom_atribut_sensoris <- TRUE

jumlah_atribut_sensoris <- TRUE

informasi_hedonik <- TRUE

model_statistik <- FALSE

Dari Satu Sisi: ala SenseHub - Part 1


chocolates_qda merupakan obyek R berjenis sensory table yang memiliki dua komponen
utama, yaitu data dan metadata riset sensoris yang dilakukan. Dikarenakan informasi
penting telah tersimpan di dalam metadata, maka selanjutnya Anda dapat melakukan
analisis data dengan lebih mudah menggunakan fungsi analyse() dari sensehubr. Ada dua
jenis analisis yang dapat Anda lakukan terhadap sensory table, yaitu analisis lokal dan
analisis global. Adapun uji statistik yang digunakan akan dipilih secara cerdas
oleh sensehubr, memudahkan sekali kan?
Dalam contoh berikut, Anda ditunjukan bagaimana cara melakukan analisis lokal dengan
menggunakan fungsi analyse dengan argumen choice = “local”.

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

"Analysis of variance" <- TRUE

"Chi-square test" <- FALSE

Dari Satu Sisi: ala SenseHub - Part 2


Selamat Anda telah berhasil melakukan uji ANOVA untuk seluruh atribut sensoris dengan
menggunakan satu fungsi analyse()! Fungsi analyse() dirancang sehingga dapat
mendeteksi dan menentukan model yang digunakan dalam ANOVA secara otomatis. Namun,
saat ini fitur uji lanjut masih belum tersedia di sensehubr. Selanjutnya bagaimanakah jika
Anda ingin membuat visualisasi dari data chocolates_qda? Anda cukup menjalankan
fungsi visualise() pada obyek chocolates_qda_local.

visualise(chocolates_qda_local)

Tugas
Apakah nama grafik yang Anda dapatkan setelah menjalankan kode tersebut?
"Dotplot" <- FALSE

"Radar Plot" <- TRUE

"Dumbell Plot" <- FALSE


"Spider Plot" <- TRUE

Tak Cukup Satu Sisi: ala SenseHub - Part 1


Setelah mempelajari karakteristik produk cokelat melalui analisis lokal, selanjutnya Anda
ingin mempelajari lebih lanjut dengan cara melakukan analisis global. Hal tersebut dapat
dilakukan dengan mudah dan konsisten menggunakan fungsi analyse() seperti yang telah
Anda lakukan pada analisis lokal. Perbedaannya adalah kali ini isi dari argumen choice
adalah “global”. Perhatikan contoh berikut :

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?

Tak Cukup Satu Sisi: ala SenseHub - Part 2


Anda pun dapat kembali menjalankan fungsi visualise() pada obyek hasil analisis global,
yaitu qda_chocolates_global. Ada tiga opsi untuk argumen choice yang dapat
dipergunakan, yaitu “eigenvalue”, “product”, dan “attribute”.

visualise(chocolates_qda_global, choice = "eigenvalue")

visualise(chocolates_qda_global, choice = "product", repel = TRUE)


visualise(chocolates_qda_global, choice = "attribute", repel = TRUE)

Mudah sekali bukan?


Tugas
Berdasarkan grafik yang Anda dapatkan, berapakah jumlah persentase kumulatif varians
dari principal component/dimension 1 dan 2?

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

Anda mungkin juga menyukai