Tutorial R
Tutorial R
Budi Santosa
2
[1] 42
> A
[1] 84
Operasi dalam R
# Contoh membuat vektor beranggotakan 1 sampai 10
> x =c(1:10)
> x
[1] 1 2 3 4 5 6 7 8 9 10
> x[(x>9) | (x<4)] #menampilkan x diatas 9 dan dibawah 4
[1] 1 2 3 10
Mengurutkan bilangan
> x=c(1,3,7,25,5,9,12)
> x
[1] 1 3 7 25 5 9 12
> sort(x)
[1] 1 3 5 7 9 12 25
Membaca data dari file di lokasi tertentu
Misal dari (D:/Data Mining/FuelEfficiency.csv). Tentu saja diasumsikan Anda
sudah punya file bernama FuelEfficiency.csv di hardisk laptop Anda. Commented [PIBSM(1]:
> FE=read.csv(“D:/Data Mining/FuelEfficiency.csv”)
> dim(FE) #menampilkan ukuran matriks/data FE
[1] 38 8
Jadi data ini mempunya 38 baris dan 8 kolom.
Kita bisa menampilakn sebgaian data dengan perintah berikut
> head(FE)
MPG GPM WT DIS NC HP ACC ET
1 16.9 5.917 4.360 350 8 155 14.9 1
2 15.5 6.452 4.054 351 8 142 14.3 1
3 19.2 5.208 3.605 267 8 125 15.0 1
3
4 18.5 5.405 3.940 360 8 150 13.0 1
5 30.0 3.333 2.155 98 4 68 16.5 0
6 27.5 3.636 2.560 134 4 95 14.2 0
Kita bisa memplot gambar grafik hubungan variabel GPM (sumbu Y) dan MPG
(sumbu x).
> plot(GPM~MPG,data=FE) #memplot hubungan GPM dengan MPG
6
5
GPM
4
3
15 20 25 30 35
MPG
4
Bagaimana melakukan loop dalam R?
Loop dalam R bisa dilakukan dengan menggunakan fungsi for
Misalkan kita ingin memeriksa bilangan genap yang ada pada suatu vektor,
berikut ini salah satu caranya.
>x =c(2,5,3,9,8,11,6)
>count = 0
>for (val in x) {
if(val %% 2 == 0)
count = count+1
}
>count
[1] 3
5
> x=cbind(c(1,3,5,2),c(3,2,4,2))
> x
[,1] [,2]
[1,] 1 3
[2,] 3 2
[3,] 5 4
[4,] 2 2
Misalkan kita ingin menghitung jarak dari obyek 1 ke obyek 2 dengan rumus
Euclidean, maka bisa kita kurangi lalu dikuadratkan.
> (x[1,]-x[2,])^2
[1] 4 1
> sum(x[1,]-x[2,])^2)
> sum((x[1,]-x[2,])^2)
[1] 5
> sqrt(sum((x[1,]-x[2,])^2))
[1] 2.236068
Menghitung semua jarak antar obyek dalam bentuk matriks dengan for loop.
Perhatikan kembali ke matriks x di atas.
> r=dim(x)[1] #mengetahui jumlah baris dari x
>d=matrix(0,r,r) #membuat matriks berukuran r x r dengan nilai tiap sel= 0.
>d
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 0 0 0
[3,] 0 0 0 0
[4,] 0 0 0 0
>for (i in 1:4){
+ for (j in 1:4){
+ d[i,j]=sqrt(sum((x[i,]-x[j,])^2))
+ }
+ }
> d
[,1] [,2] [,3] [,4]
[1,] 0.000000 2.236068 4.123106 1.414214
[2,] 2.236068 0.000000 2.828427 1.000000
[3,] 4.123106 2.828427 0.000000 3.605551
[4,] 1.414214 1.000000 3.605551 0.000000
Atau bisa dengan perintah berikut
> dist(x,'euclidean')
1 2 3
6
2 2.236068
3 4.123106 2.828427
4 1.414214 1.000000 3.605551
Fungsi dalam R
Berikut contoh sederhana membuat fungsi dalam R. Fungsi ini akan disimpan
dalam bentuk file dan bisa dipanggil.
> kuadrat = function(x) {
+ return(x^2)
+ }
> kuadrat(4)
[1] 16
> x=3
> kuadrat(x)
[1] 9
> pow = function(x, y) {
+ # function to print x raised to the power y
+ result = x^y
+ print(paste(x,"raised to the power", y, "is", result))
+ }
> pow(2,5)
[1] "2 raised to the power 5 is 32"
Contoh fungsi yang lain
> cek = function(x) {
+ if (x > 0) {
+ hasil = "Positif"
+ }
+ else if (x < 0) {
+ hasil = "Negatif"
+ }
+ else {
+ hasil = "nol"
7
+ }
+ return(hasil)
+ }
> cek(5)
[1] "Positif"
> cek(-2)
[1] "Negatif"
Misalkan di editor R kita tulis script berikut dengan nama coba.R
# komen: ini contoh sebuah script.
y=c(12,15,28,17,18)
x=c(22,39,50,25,18)
yb=mean(y)
xb=mean(x)
plot(x,y)
Lalu kita lakukan di console, perintah berikut
> source("coba.R")
> xb
[1] 30.8
> yb
[1] 18
Contoh lain
8
Kita bisa juga menulis script dalam bentuk function. Misalkan kita kasih nama
roll
roll = function() {
die = 1:6
dice = sample(die, size = 2, replace = TRUE)
sum(dice)
}
Koding ini mengambil sampel berukuran 2 lalu dijumlahkan nilainya.
Simpan dengan nama roll.R
> source("roll.R")
> roll()
[1] 4
> roll()
[1] 6
> roll()
[1] 8
> roll()
[1] 8
> roll()
[1] 6
> roll()
[1] 10
> roll()
[1] 4
> roll()
[1] 10
9
[1,] 1 2 3
[2,] 4 5 6
> c=(1:5)
> c
[1] 1 2 3 4 5
> sum(c)
[1] 15
> x=c(1,2,3,4,5,6)
> x
[1] 1 2 3 4 5 6
> class(x)
[1] "numeric"
> dim(x)=c(2,3)
> x
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
Mengakses elemen matriks
> x=cbind(c(1,2,3),c(4,5,6),c(7,8,9))
> x
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> x[c(1,2),c(2,3)] #baris 1 dan 2 kolom 2 dan 3
[,1] [,2]
[1,] 4 7
[2,] 5 8
> x[c(3,2),]
[,1] [,2] [,3]
[1,] 3 6 9
10
[2,] 2 5 8
> x[c(1:3),c(2:3)]
[,1] [,2]
[1,] 4 7
[2,] 5 8
[3,] 6 9
> 2*x
[,1] [,2] [,3]
[1,] 2 8 14
[2,] 4 10 16
[3,] 6 12 18
Transpose matriks
> t(x) #transpose matriks x
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
11
> apply(x,2,sum) #jumlah kolom
[1] 4 20
> apply(x,2,mean) # mencari rata-rata kolom
[1] 1.333333 6.666667
> apply(x,2,sd) #standar deviasi
[1] 1.527525 3.055050
Menghitung rata-rata kolom dan baris bisa juga dilakukan
dengan fungsi colMeans dan rowMeans.
> x = matrix(c(1, 3, 0, 4,6,10), nrow = 3, ncol = 2)
> x
[,1] [,2]
[1,] 1 4
[2,] 3 6
[3,] 0 10
> rowMeans(x) #menghitung rata-rata baris
[1] 2.5 4.5 5.0
> colMeans(x) #menghitung rata-rata kolom
[1] 1.333333 6.666667
Menghitung jarak antar obyek
x=cbind(c(1,3,2,4),c(2,5,0,5))
> x
[,1] [,2]
[1,] 1 2
[2,] 3 5
[3,] 2 0
[4,] 4 5
> d1=matrix(0,4,4)
> for (i in 1:4){
+ for (j in 1:4){
+ d1[i,j]=sum(abs(x[i,]-x[j,]))
+ } for (i
+ }
> d1
[,1] [,2] [,3] [,4]
[1,] 0 5 3 6
[2,] 5 0 6 1
[3,] 3 6 0 7
[4,] 6 1 7 0
> d2=matrix(0,4,4)
> for (i in 1:4){
+ for (j in 1:4){
+ d2[i,j]=sqrt(sum((x[i,]-x[j,])^2))
+ }
+ }
> d2
[,1] [,2] [,3] [,4]
12
[1,] 0.000000 3.605551 2.236068 4.242641
[2,] 3.605551 0.000000 5.099020 1.000000
[3,] 2.236068 5.099020 0.000000 5.385165
[4,] 4.242641 1.000000 5.385165 0.000000
Quadratic programming
$value
[1] -2.380952
$unconstrained.solution
[1] 0 5 0
$iterations
[1] 3 0
$Lagrangian
[1] 0.0000000 0.2380952 2.0952381
$iact
[1] 3 2
Perkalian matrix
> dx=-matrix(c(1,1,-1,1,1,-1,-1,-1),nrow=4)
> dx
[,1] [,2]
[1,] 1 1
[2,] 1 -1
[3,] -1 -1
[4,] 1 -1
> dx%*%t(dx) #perkalian matrix dx dengan dx’ (transpose dx)
[,1] [,2] [,3] [,4]
[1,] 2 0 -2 0
[2,] 0 2 0 2
[3,] -2 0 2 0
[4,] 0 2 0 2
> k=(dx%*%t(dx)+1)^2
> k
[,1] [,2] [,3] [,4]
[1,] 9 1 1 1
[2,] 1 9 1 9
[3,] 1 1 9 1
[4,] 1 9 1 9
> y=matrix(c(1,-1,-1,1),nrow=4)
> y
13
[,1]
[1,] 1
[2,] -1
[3,] -1
[4,] 1
14
plot(v,type,col,xlab,ylab)
• v vektor yang berisi nilai yang akan diplot.
• type bisa diisi "p" untuk titik, atau, "l" untuk menggambar garis atau "o"
untuk menggambar garis dan ttik.
• xlab is label untuk sumbu x.
• ylab is label untuk sumbu y.
• main untuk memberi nama grafik.
• col is used to give colors to both the points and lines
>x =c(1,4,3,6,7,5)
> x
[1] 1 4 3 6 7 5
> plot(x,type="o",col="blue",xlab="sumbu x",ylab="sumbu
y",main="coba")
15
Untuk menghentikan eksekusi program bisa menggunakan Ctrl+z
Membersihkan layar console tekan Ctrl+L
> BH = read.csv("D:/data mining/Boston_Housing.csv")
#membaca file bernama Boston_Housing di direktori D subdirecto
ry data mining dan disimpan sebagai BH
> head(BH)
> View(BH)
> BH[1:10,]
#menampilkan baris 1 sampai 10 semua kolom
> BH[1:3,c(1,3,5)]
# menampilkan baris 1 sampai 3 kolom 1,3 dan 5.
BH$CRIM[1:10]
#Menampilkan 10 baris pertama kolom 1 dari BH yang berlabel CRIM
[1] 0.00632 0.02731 0.02729 0.03237 0.06905 0.02985 0.08829 0.14455 0.21124
0.17004
> xx=BH$CRIM[1:10]
16
> mean(xx) # Menghitung rata-rata
[1] 0.080631
> BH$AGE[1:15] # menampilkan kolom berlabel AGE untuk 15 baris pertama
[1] 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100.0 85.9 94.3 82.9
39.0 61.8
[15] 84.5
Melakukan sampling
> x=1:12
> sample(x,5)
[1] 4 12 9 1 7
Melakukan sampling dari data BH. Kita ingin mengambil 5 sampel dari data BH.
> s=sample(row.names(BH),5)
> s
[1] "368" "277" "477" "307" "110"
Angka-angka ini menunjukkan baris yang terpilih dari data BH.
> BH[s,]
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
MEDV
368 13.52220 0 18.10 0 0.631 3.863 100.0 1.5106 24 666 20.2 131.42 13
.33 23.1
277 0.10469 40 6.41 1 0.447 7.267 49.0 4.7872 4 254 17.6 389.25 6
.05 33.2
477 4.87141 0 18.10 0 0.614 6.484 93.6 2.3053 24 666 20.2 396.21 18
.68 16.7
307 0.07503 33 2.18 0 0.472 7.420 71.9 3.0992 7 222 18.4 396.90 6
.47 33.4
110 0.26363 0 8.56 0 0.520 6.229 91.2 2.5451 5 384 20.9 391.23 15
.55 19.4
> s=sample(row.names(BH),5, prob=ifelse(BH$AGE>55,0.9,0.01))
> BH[s,]
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT MEDV
63 0.11027 25 5.13 0 0.453 6.456 67.8 7.2255 8 284 19.7 396.90 6.73 22.2
493 0.11132 0 27.74 0 0.609 5.983 83.5 2.1099 4 711 20.1 396.90 13.35 20.1
415 45.74610 0 18.10 0 0.693 4.519 100.0 1.6582 24 666 20.2 88.27 36.98 7.0
445 12.80230 0 18.10 0 0.740 5.854 96.6 1.8956 24 666 20.2 240.52 23.79 10.8
429 7.36711 0 18.10 0 0.679 6.193 78.1 1.9356 24 666 20.2 96.73 21.52 11.0
> x= c(6:-4)
> sqrt(ifelse(x>=0,x,NA))
[1] 2.449490 2.236068 2.000000 1.732051 1.414214 1.000000 0.000000 NA NA
17
[10] NA NA
> summary(BH)
18
BoxPlot – mengecek outliers
Umumnya sembarang titik yang terletak di luar 1.5 * interquartile-range (1.5 * IQR)
dianggap sebagai outlier, dimana, IQR dihitung sebagai jarak antara nilai 25th
percentile dan 75th percentile untuk variabel tersebut.
19
Menghitung korelasi
> cor(cars$speed, cars$dist)
[1] 0.8068949
Regresi linier
> modelreg = lm(dist ~ speed, data=cars)
> modelreg
Call:
lm(formula = dist ~ speed, data = cars)
Coefficients:
(Intercept) speed
-17.579 3.932
Dist=-17.579+3.932 speed
Call:
lm(formula = dist ~ speed, data = cars)
Residuals:
Min 1Q Median 3Q Max
-29.069 -9.525 -2.272 9.215 43.201
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -17.5791 6.7584 -2.601 0.0123 *
speed 3.9324 0.4155 9.464 1.49e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
20
Memilih sampel untuk tes selain training set
> tsx=-cars[ts,]
> modelreg =lm(dist ~ speed, data=trx)
Membuat model regersi dari training data
> modelreg
Call:
lm(formula = dist ~ speed, data = trx)
Coefficients:
(Intercept) speed
-22.586 4.252
Melakukan prediksi dengan set data testing
> pred=predict(modelreg,tsx)
> dim(tsx)
[1] 20 2
Bisa juga kita sajikan dengan perintah berikut
> hasil = data.frame(aktual=tsx$dist, prediksi=pred, resid ual=tsx$d
ist-pred)
> plot(tsx$dist, type="o", col="blue", pch="o" )
>
> points(pred, col="red", pch="*")
> lines(pred, col="red",lty=2)
21
> hasil
aktual prediksi residual
1 2 -5.578397 7.5783967
6 10 15.680695 -5.6806955
9 34 19.932514 14.0674861
10 17 24.184332 -7.1843323
14 24 28.436151 -4.4361508
19 46 32.687969 13.3120308
20 26 36.939788 -10.9397876
23 80 36.939788 43.0602124
25 26 41.191606 -15.1916061
28 40 45.443424 -5.4434245
31 50 49.695243 0.3047571
33 56 53.947061 2.0529387
34 76 53.947061 22.0529387
38 68 58.198880 9.8011202
40 48 62.450698 -14.4506982
41 52 62.450698 -10.4506982
43 64 62.450698 1.5493018
44 66 70.954335 -4.9543351
45 54 75.206153 -21.2061535
46 70 79.457972 -9.4579719
22
Bisa juga dilakukan dengan perintah
> hasil = cbind(aktual=tsx$dist, prediksi=pred, residual=tsx$dist-pred)
> korelasi =- cor(hasil)
> korelasi
aktual prediksi
aktual 1.0000000 0.7733205
prediksi 0.7733205 1.0000000
korelasi antara hasil prediksi dan aktualnya 0.77
Regresi Logistik
Download data Universal bank dari web
https://www.biz.uiowa.edu/faculty/jledolter/DataMining/dataexercises.htm
l
> bank=read.csv("D:/data mining/UniversalBank.csv")
> bank=bank[,-c(1,5)]
> bank$Education=factor(bank$Education,levels=c(1,2,3),labels
=c("s1","s2","profesional"))
> tr=sample(5000,5000*0.6)
> trx=bank[tr,]
> tsx=bank[-tr,]
> logreg=glm(PersonalLoan ~.,data=trx, family="binomial")
> options(scipen=999)
> summary(logreg)
Call:
glm(formula = PersonalLoan ~ ., family = "binomial", data = trx)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.2465 -0.1766 -0.0603 -0.0186 3.9663
Coefficients:
Estimate Std. Error z value Pr(>|z|)
23
(Intercept) -13.8224976 2.4595636 -5.620 0.0000000191 ***
Age 0.0065770 0.0904191 0.073 0.942014
Experience -0.0008514 0.0899943 -0.009 0.992452
Income 0.0642534 0.0042196 15.227 < 0.0000000000000002 ***
Family 0.5665415 0.1040319 5.446 0.0000000516 ***
CCAvg 0.1423635 0.0590221 2.412 0.015864 *
Educations2 4.2938475 0.3705575 11.588 < 0.0000000000000002 ***
Educationprofesional 4.2709906 0.3734640 11.436 < 0.0000000000000002 ***
Mortgage 0.0007331 0.0008139 0.901 0.367774
SecuritiesAccount -0.8494808 0.3861650 -2.200 0.027822 *
CDAccount 3.9358902 0.4468827 8.807 < 0.0000000000000002 ***
Online -0.7674581 0.2239380 -3.427 0.000610 ***
CreditCard -1.0843350 0.2810094 -3.859 0.000114 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> lgpred=predict(logreg,trs[,-8],type="response")
Kita lihat tampilan 5 baris pertama hasil prediksi dan data aktual.
>data.frame(aktual=trs$PersonalLoan[1:5],prediksi=lgpred[1:5]
)
aktual prediksi
1 0 0.0001410804
11 0 0.5491508903
13 0 0.2486321925
14 0 0.0086363773
17 1 0.8882458130
24
Transformasi Data
1. Centering
Dengan centering, kita mengurangi setiap data dengan rata-rata dari setiap
atribute yang ada. Misalkan, kita ingin memtransformasikan data dalam
suatu kolom dengan cara centering, maka bisa kita gunakan rumus berikut.
𝑋̂ = 𝑋 − 𝑋̅ (3.1)
𝑋 − 𝑋̅
𝑋̂ = (3.2)
𝜎𝑥
3. Scaling
Scaling adalah prosedur merubah data sehingga berada dalam skala
tertentu. Skala ini bisa antara [0, 1], [-1, 1], atau skala lain yang
dikehendaki. Scaling data ke range [0,1] biasanya disebut dengan
normalisasi min-max. Misalkan, kita punya data dengan skala tertentu,
maka kita bisa mengkonversi data tersebut ke dalam skala [0, 1]. Dalam
hal ini, batas bawah (BB) adalah 0, dan batas atas (BA) adalah 1. Jika nilai
maksimum tiap kolom adalah 𝑋𝑚𝑎𝑥 dan nilai minimumnya adalah 𝑋𝑚𝑖𝑛 ,
untuk mengubah data ke skala baru, maka untuk utuk setiap datanya
bisa dilakukan operasi sebagai berikut:
𝑋 − 𝑋𝑚𝑖𝑛
𝑋̂ = ∗ (𝐵𝐴 − 𝐵𝐵) + 𝐵𝐵 (3.3)
𝑋𝑚𝑎𝑥 − 𝑋𝑚𝑖𝑛
25
Sebagai contoh, jika kita ingin data kita berada dalam skala [-1, 1], maka
bisa kita memakai rumus berikut:
𝑋 − 𝑋𝑚𝑖𝑛
𝑋̂ = ∗ (1 − (−1)) + (−1) (3.4)
𝑋𝑚𝑎𝑥 − 𝑋𝑚𝑖𝑛
Melakukan centering
> x=cbind(c(1,3,5,4),c(3,2,4,6))
> x
[,1] [,2]
[1,] 1 3
[2,] 3 2
[3,] 5 4
[4,] 4 6
> m=colMeans(x)
> m
[1] 3.25 3.75
>x-t(replicate(4,m)) # kita ulang rata-rata sebanyak 4 kali
lalu ditranspose
[,1] [,2]
[1,] -2.25 -0.75
[2,] -0.25 -1.75
[3,] 1.75 0.25
[4,] 0.75 2.25
Mengurangi dengan minimumnya
>xmin=apply(x,2,min)
> xc=x-t(replicate(4,xmin))
> xc
[,1] [,2]
[1,] 0 1
[2,] 2 0
[3,] 4 2
[4,] 3 4
Berikut bagaimana melakukan preprocess dilakukan dalam R.
>mower=read.csv(“D:/data mining/RidingMowers.csv”)
>> head(mower)
Income Lot_Size Ownership
1 60.0 18.4 Owner
2 85.5 16.8 Owner
3 64.8 21.6 Owner
4 61.5 20.8 Owner
5 87.0 23.6 Owner
6 110.1 19.2 Owner
26
68.4375 18.9500
>xc=x-t(replicate(24,xb) #mengurangi setiap titik data dengan rata-rata ko
lomnya. Atau sering disebut centering data, data dikurangi dengan rata-rata kolom
nya
> head(xc)
Income Lot_Size
1 -8.4375 -0.55
2 17.0625 -2.15
3 -3.6375 2.65
4 -6.9375 1.85
5 18.5625 4.65
6 41.6625 0.25
Melakukan normalisasi/standarisasi
>Install.packages(matrixStats) #perlu paket lain untuk diinstal
>library(matrixStats)
>xs=-matrix(x)
Income Lot_Size
[1,] -0.42628398 -2.52802188
[2,] 27.40628110 -0.88540202
[3,] -0.18377576 -2.36634973
[4,] 17.52272368 0.76185755
[5,] 0.93782475 -2.26530464
[6,] 37.53692745 0.10295372
27
Klastering
> data(iris)
> ir=iris[,1:4}
> hasil=kmeans(ir,centers=3)
> hasil
K-means clustering with 3 clusters of sizes 50, 62, 38
Cluster means:
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.006000 3.428000 1.462000 0.246000
2 5.901613 2.748387 4.393548 1.433871
3 6.850000 3.073684 5.742105 2.071053
Clustering vector:
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2
[56] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3 3 3
[111] 3 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3 3 3
2 3 3 2
Within cluster sum of squares by cluster:
[1] 15.15100 39.82097 23.87947
(between_SS / total_SS = 88.4 %)
Available components:
[1] "cluster" "centers" "totss" "withinss" "tot.withinss
" "betweenss" "size"
[8] "iter" "ifault"
> hasil$centers
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.901613 2.748387 4.393548 1.433871
2 6.850000 3.073684 5.742105 2.071053
3 5.006000 3.428000 1.462000 0.246000
> hasil$withinss
[1] 39.82097 23.87947 15.15100
> hasil$tot.withinss
[1] 78.85144
hasil$betweenss
[1] 602.5192
> hasil$totss
[1] 681.3706
Pertama tentukan nilai sum square within (SSW) yang cukup besar, lalu kita coba 2
sampai 15 jumlah klaster.
Kita plot dimana SSW mulai turun dan stabil. Tentu saja semakin banyak klaster se
makin kecil SSW, tapi jika penurunan sudah tidak signifikan bisa kita stop.
> wss
[1] 596
> for (i in 2:15) wss[i] = sum(kmeans(iris,centers=i)$withins
s)
> plot(1:15, wss, type="b", xlab="Number of Clusters",ylab="W
ithin groups sum of squares")
28
Menampilkan hasil klaster
>iriss = data.frame(ir, fit$cluster)
>head(iriss)
Sepal.Length Sepal.Width Petal.Length Petal.Width fit.cluster
1 5.1 3.5 1.4 0.2 1
2 4.9 3.0 1.4 0.2 1
3 4.7 3.2 1.3 0.2 1
4 4.6 3.1 1.5 0.2 1
5 5.0 3.6 1.4 0.2 1
6 5.4 3.9 1.7 0.4 1
>fit = kmeans(ir, 3)
>library(cluster)
> clusplot(ir, fit$cluster, color=TRUE, shade=TRUE,
+ labels=2, lines=0)
29
Berikut ini adalah implementasi klastering dengan metode hirarkis dalam
bahasa R. Data yang akan kita klaster adalah matriks x sebagai berikut:
> x=cbind(c(10,20,30,30,5),c(5,20,10,15,10))
>d = dist(x, method = "euclidean") # distance matrix
d
1 2 3 4
2 18.027756
3 20.615528 14.142136
4 22.360680 11.180340 5.000000
5 7.071068 18.027756 25.000000 25.495098
30
1 2
2,5 4,5
𝑋= 2 2
4 1,5
[ 4 2,5]
> x
[,1] [,2]
[1,] 1.0 2.0
[2,] 2.5 4.5
[3,] 2.0 2.0
[4,] 4.0 1.5
[5,] 4.0 2.5
> d = dist(x, method = "euclidean") # distance matrix
1 2 3 4
2 2.915476
3 1.000000 2.549510
4 3.041381 3.354102 2.061553
5 3.041381 2.500000 2.061553 1.000000
31
> d = dist(iris, method = "euclidean") # distance matrix
> hasil= hclust(d, method="ward.D")
> plot(hasil) # display dendogram
> groups = cutree(hasil, k=3) # cut tree into 3 clusters
> # gambarkan dendogram dengan batas warna merah antara 3 kla
ster
> rect.hclust(hasil, k=3, border="red")
> hasil= hclust(d, method="complete") #linkage kita ganti den
gan complete linkage
> plot(hasil) # display dendogram
> groups = cutree(hasil, k=3) # cut tree into 3 clusters
> # draw dendogram with red borders around the 3 clusters
> rect.hclust(hasil, k=3, border="red")
32
Dengan menjalankan kode di atas, kita akan mendapatkan output sebagai
berikut.
x=cbind(c(1,2.5,2,4,4),c(2,4.5,2,1.5,2.5))
Adapun hasil klastering data X di pyton dan di Matlab mendapatkan hasil yang
sama, hanya berbeda indeks mulainya saja. Python indeksnya dimulai dari 0,
sedangkan Matlab dimulai dari 1.
Implementasi dengan R
Discriminat analysis bisa kita terapkan pada data Iris.
>data("iris")
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
33
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> tr=sample(150,150*0.8) #ambil sampel secara acak
> trx=iris[tr,] #training sample
> tsx=iris[-tr,] #testing sample
> library(MASS)
> model = lda(Species~., data = trx) # membangun model LDA
Call:
lda(Species ~ ., data = trx)
Group means:
Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa 5.000000 3.365517 1.486207 0.2551724
versicolor 5.978378 2.756757 4.286486 1.3351351
virginica 6.632353 3.005882 5.614706 2.0500000
Proportion of trace:
LD1 LD2
0.9884 0.0116
> beda
iris..tr..5. tsy.class
1 setosa setosa
2 setosa setosa
3 setosa setosa
4 setosa setosa
5 setosa setosa
6 setosa setosa
7 setosa setosa
8 setosa setosa
9 setosa setosa
10 setosa setosa
11 setosa setosa
12 setosa setosa
13 setosa setosa
34
14 setosa setosa
15 setosa setosa
16 setosa setosa
17 setosa setosa
18 setosa setosa
19 setosa setosa
20 setosa setosa
21 setosa setosa
22 versicolor versicolor
23 versicolor versicolor
24 versicolor versicolor
25 versicolor versicolor
26 versicolor versicolor
27 versicolor versicolor
28 versicolor versicolor
29 versicolor versicolor
30 versicolor virginica
31 versicolor versicolor
32 versicolor versicolor
33 versicolor versicolor
34 versicolor versicolor
35 virginica virginica
36 virginica virginica
37 virginica virginica
38 virginica virginica
39 virginica virginica
40 virginica virginica
41 virginica virginica
42 virginica virginica
43 virginica virginica
44 virginica virginica
45 virginica virginica
46 virginica virginica
47 virginica virginica
48 virginica virginica
49 virginica virginica
50 virginica virginica
35
36
Implementasi R untuk KNN (K Nearest Neighbor)
> data(iris)
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
#Bangkitkan bilangan random
> bilran = sample(1:nrow(iris), 0.9 * nrow(iris))
#Buat fungsi untuk normalisasi data
> nor =function(x) { (x -min(x))/(max(x)-min(x)) }
Terapkan pada 4 kolom pertama data iris
> irisn = as.data.frame(lapply(iris[,c(1,2,3,4)], nor))
> summary(irisn)
Sepal.Length Sepal.Width Petal.Length
Min. :0.0000 Min. :0.0000 Min. :0.0000
1st Qu.:0.2222 1st Qu.:0.3333 1st Qu.:0.1017
Median :0.4167 Median :0.4167 Median :0.5678
Mean :0.4287 Mean :0.4406 Mean :0.4675
3rd Qu.:0.5833 3rd Qu.:0.5417 3rd Qu.:0.6949
Max. :1.0000 Max. :1.0000 Max. :1.0000
Petal.Width
Min. :0.00000
1st Qu.:0.08333
Median :0.50000
Mean :0.45806
3rd Qu.:0.70833
Max. :1.00000
##ekstrak data training
> iris_train = irisn[bilran,]
> iris_test=irisn[-bilran,]
#Ekstrak label untuk data training
> target=iris[bilran,5]
#Ekstrak label untuk data tes
> tes_label=iris[-bilran,5]
#Panggil library class
> library(class)
#Input untuk knn adalah data training, data testing, label da
ta training, jumlah tetangga terdekat
> pr = knn(iris_train,iris_test,cl=target,k=4)
> pr
[1] setosa setosa setosa setosa setosa
[6] versicolor versicolor versicolor versicolor versicolor
[11] versicolor versicolor virginica virginica virginica
Levels: setosa versicolor virginica
37
#Buat fungsi akurasi
> accuracy = function(x){sum(diag(x)/(sum(rowSums(x)))) * 100
}
> accuracy(tab)
[1] 100
> trx=iris[bilran,]
> trs=iris[-bilran,]
> trx=iris[bilran,1:4]
> trs=iris[-bilran,1:4]
> pr = knn(trx,trs,cl=target,k=4)
> tab = table(pr,tes_label)
> accuracy(tab)
[1] 100
Atau kita bisa melakukan sampling lagi dengan kemungkinan bilangan random
yang berbeda.
> bilran = sample(1:nrow(iris), 0.9 * nrow(iris))
> trx=iris[bilran,1:4]
> trs=iris[-bilran,1:4]
> trlab=iris[bilran,5]
> tslab=iris[-bilran,5]
> pr = knn(trx,trs,cl=trlab,k=4)
> tab = table(pr,tslab)
> accuracy(tab)
[1] 100
> tab
tslab
pr setosa versicolor virginica
setosa 5 0 0
versicolor 0 7 0
virginica 0 0 3
Kita coba untuk data yang lain dengan menggunakan library ggplot2.
> library(ggplot2)
> ##panggil data
> data(diamonds)
>
> ##simpan sebagai data frame
> dia = data.frame(diamonds)
#Bangkitkan bilangan random berukuran 90% dari keseluruhan ju
mlah data
> ran = sample(1:nrow(dia),0.9 * nrow(dia))
38
#Tulis fungsi normalisasi diberi nama nor
> nor =function(x) { (x -min(x))/(max(x)-min(x)) }
#Lakukan normalisasi terhadap data
> dian = as.data.frame(lapply(dia[,c(1,5,6,7,8,9,10)], nor))
#Ekstrak data training
> diatr = dian[ran,]
#Ekstrak data tes
> diats = dian[-ran,]
#Gunakan kolom 2 training sebagai labeldan diurutkan
> dialab = as.factor(dia[ran,2])
#Begitu juga untuk data testing
> test_target = as.factor(dia[-ran,2])
> library(class)
> pr = knn(diatr,diats,cl=dialab,k=20)
> tb = table(pr,test_target)
#Hitung akurasi
> accuracy = function(x){sum(diag(x)/(sum(rowSums(x)))) * 100
}
> accuracy(tb)
[1] 70.05933
39
12 virginica virginica
13 virginica virginica
14 virginica virginica
15 virginica virginica
> tab = table(pr,labs)
> tab
labs
pr setosa versicolor virginica
setosa 4 0 0
versicolor 0 7 0
virginica 0 0 4
> accuracy(tab)
[1] 100
Decision Tree
> mower=read.csv("d:/data mining/RidingMowers.csv")
> head(mower)
Income Lot_Size Ownership
1 60.0 18.4 Owner
2 85.5 16.8 Owner
3 64.8 21.6 Owner
4 61.5 20.8 Owner
5 87.0 23.6 Owner
6 110.1 19.2 Owner
> dim(mower)
[1] 24 3
40
> ct=rpart(Ownership ~.,data=mower,control=rpart.control(maxd
epth=2),method="class")
> data(iris)
> ct=rpart(Species ~.,data=iris,control=rpart.control(maxdept
h=5),method="class")
>library(rpart.plot)
> prp(ct,type=2,extra=1,split.font=1,varlen=10)
> data(iris)
> tr=sample(150,130)
> trx=iris[tr,1:4]
> tsx=iris[-tr,1:4]
> try=iris[tr,5]
41
> ct=rpart(try ~.,data=trx,method="class")
> library(rpart)
> ct=rpart(try ~.,data=trx,method="class")
>
> library(rpart.plot)
> tm
yt
setosa versicolor virginica
setosa 7 0 0
versicolor 0 6 1
virginica 0 1 5
ada 7 setosa diramal secara tepat.
42
Naïve Bayes
Contoh implementasi Naive Bayes di R.
> data(iris)
> iris$Species=factor(iris$Species)
> trindek=sample(150, 100)
> trx=iris[trindek,1:4]
>try=iris[trindek,5]
> tsx=iris[-trindek,1:4]
>install.packages("e1071")
>install.packages("caTools")
>install.packages("caret")
# Loading package
>library(e1071)
>library(caTools)
>library(caret) #untuk membuat confusion matrix
> library("e1071")
> hasil=naiveBayes(try ~.,data=trx)
> hasil
>y_pred = predict(hasil, newdata = tsx)
# Confusion Matrix
cm = table(iris[-trindek,5], y_pred)
cm
# Model Evauation
confusionMatrix(cm)
yt
setosa versicolor virginica
setosa 18 0 0
versicolor 0 13 1
virginica 0 2 16
43
Overall Statistics
Accuracy : 0.94
95% CI : (0.8345, 0.9875)
No Information Rate : 0.36
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.9096
Statistics by Class:
ys
yt delayed ontime
delayed 7 19
44
ontime 174 681
Accuracy : 0.7809
95% CI : (0.7521, 0.8078)
No Information Rate : 0.7946
P-Value [Acc > NIR] : 0.8512
Kappa : 0.0169
Sensitivity : 0.038674
Specificity : 0.972857
Pos Pred Value : 0.269231
Neg Pred Value : 0.796491
Prevalence : 0.205448
Detection Rate : 0.007946
Detection Prevalence : 0.029512
Balanced Accuracy : 0.505766
45
# Implementasi R untuk SVM
Call:
svm(formula = y ~ ., data = dat, kernel = "polynomial", degre
e = 2, cost = 1)
Parameters:
SVM-Type: C-classification
SVM-Kernel: polynomial
cost: 1
degree: 2
coef.0: 0
46
2 -1 -1
3 -1 -1
4 1 1
47