Memakai Data Kualitatif Di R


Data kualitatif adalah data yang tidak dalam bentuk angka. Pada R, data kualitatif diwakili oleh tipe data factor. Berbeda dengan tipe data character yang dapat di-isi apa saja, tipe data factor memiliki pilihan atau kategori (misalnya kecil, sedang, dan besar). Programmer akan lebih mengenal factor sebagai enumeration yang identik dengan keyword enum di bahasa pemograman umum. Pada artikel ini, saya akan mencoba melakukan pembelajaran statistik yang melibatkan tipe data kualitatif.

Saya akan mulai dengan membaca data CSV dengan menggunakan perintah berikut ini:

> servis <- read.csv("servis.csv", header=TRUE)
> head(servis)
  nomorKB   tipeMotor jenisPekerjaan
1  XXXXXX Supra X 125            L/R
2  XXXXXX     Supra X             CS
3  XXXXXX       Grand            L/R
4  XXXXXX     Supra X             CS
5  XXXXXX     Megapro            L/R
6  XXXXXX        Beat             CS
> sapply(servis, class)
       nomorKB      tipeMotor jenisPekerjaan 
      "factor"       "factor"       "factor" 

Terlihat bahwa R membaca data yang ada sebagai factor. Untuk melihat kategori apa saja yang diperbolehkan untuk sebuah factor, saya dapat menggunakan perintah levels() seperti pada perintah berikut ini:

> levels(servis$tipeMotor)
 [1] "Absolute Revo 110" "Astrea"            "Beat"              "Blade"             "CS1"              
 [6] "GL Series"         "Grand"             "Karisma"           "Kirana"            "Lain-lain"        
[11] "Legenda"           "Megapro"           "Prima"             "Revo"              "Revo Fit"         
[16] "Scoopy"            "Spacy"             "Supra"             "Supra Fit"         "Supra X"          
[21] "Supra X 125"       "Tiger"             "Vario"             "Win"              
> levels(servis$jenisPekerjaan)
[1] "ASS1" "ASS2" "ASS3" "ASS4" "CS"   "H/R"  "L/R"  "OR+" 

Saya dapat melihat distribusi jumlah data untuk masing-masing factor dengan menggunakan function table() seperti pada perintah berikut ini:

> table(servis$jenisPekerjaan)

ASS1 ASS2 ASS3 ASS4   CS  H/R  L/R  OR+ 
  49   48   46   49 1861   55 1439  968 
> cbind(table(servis$tipeMotor))
                  [,1]
Absolute Revo 110  252
Astrea              20
Beat               378
Blade              121
CS1                 12
GL Series           37
Grand              228
Karisma            185
Kirana               2
Lain-lain          341
Legenda             51
Megapro             50
Prima              120
Revo               175
Revo Fit            52
Scoopy              35
Spacy               53
Supra               57
Supra Fit          325
Supra X            608
Supra X 125       1144
Tiger               55
Vario              192
Win                 22

Agar lebih mudah dipahami, saya juga bisa menggambarkannya dalam bentuk histogram dengan menggunakan gglot() seperti pada perintah berikut ini:

> require(ggplot2)
> ggplot(servis, aes(x=servis$jenisPekerjaan)) + geom_histogram()
Histogram untuk jenis pekerjaan

Histogram untuk jenis pekerjaan

> ggplot(servis, aes(x=servis$tipeMotor)) + geom_histogram()
Histogram untuk tipe motor

Histogram untuk tipe motor

Lalu bagaimana cara menggunakan data kualitatif? Saya tidak bisa dengan mudah memetakannya pada persamaan linear karena mereka bukanlah angka yang dapat dihitung. Salah satu trik untuk memakai data kualitatif di persamaan linear adalah dengan melakukan pengkodean dalam bentuk angka. Misalnya, pada jenisPekerjaan, saya bisa memberi nilai 0 untuk ASS1, 1 untuk ASS2, 2 untuk ASS3, dan seterusnya. Tapi solusi yang lebih baik adalah dengan menggunakan metode logistic regression bila variabel respons terdiri atas 2 kategori dan metode linear discrimant analysis bila variabel respon terdiri atas banyak kategori.

Sebagai contoh, berdasarkan riwayat yang ada, saya ingin memprediksi jenis pekerjaan yang akan dilakukan pada sebuah motor yang hendak di-servis berdasarkan jenis motor tersebut. Karena jenis pekerjaan terdiri atas banyak kategori, maka saya akan memakai metode linear discriminant analysis. Untuk itu, saya dapat memanggil function lda() milik package MASS seperti berikut ini:

> require(MASS)
Loading required package: MASS
> f <- lda(jenisPekerjaan ~ tipeMotor, data=servis)
> summary(f)

Sekarang, saya dapat mencoba melakukan prediksi, misalnya saya ingin mencari tahu jenis pekerjaan apa yang mungkin akan dilakukan bila tipe motor adalah Supra X. Untuk itu, saya memberikan perintah berikut ini:

> predict(f, data.frame(tipeMotor=c('Supra X')))
$class
[1] L/R
Levels: ASS1 ASS2 ASS3 ASS4 CS H/R L/R OR+

$posterior
         ASS1        ASS2        ASS3        ASS4        CS        H/R       L/R       OR+
1 0.001097874 0.001214338 0.001023112 0.001036094 0.3659366 0.01078961 0.3676512 0.2512511

$x
        LD1        LD2        LD3        LD4        LD5      LD6        LD7
1 0.7108102 -0.1152886 -0.7093833 -0.7134284 -0.2333662 -0.20007 0.09106148

Linear discriminant analysis bekerja berdasarkan teori Bayess dan menghasilkan posterior probability. Nilai prior probability diperoleh berdasarkan data training. Pada hasil di atas, terlihat bahwa sepeda motor Supra X yang selanjutnya datang mungkin akan membutuhkan perawatan L/R (penggantian suku cadang) karena nilai posterior probability L/R adalah yang paling besar (0.3659366).

Bagaimana dengan sepeda motor jenis lain? Saya kembali memberikan sebuah perintah seperti berikut ini:

> predict(f, data.frame(tipeMotor=c('Win')))
$class
[1] H/R
Levels: ASS1 ASS2 ASS3 ASS4 CS H/R L/R OR+

$posterior
          ASS1         ASS2         ASS3         ASS4        CS       H/R        L/R        OR+
1 0.0001578041 0.0001753791 0.0001470381 0.0001497294 0.0539218 0.8652549 0.04636545 0.03382785

$x
        LD1       LD2       LD3      LD4       LD5       LD6      LD7
1 0.8467111 0.3420979 -3.655081 6.950073 -1.659424 0.3081269 1.477134

Pada hasil di atas, terlihat bahwa sepeda motor Win yang selanjutnya datang mungkin akan membutuhkan perawatan H/R (bongkar berat) mengingat nilai posterior probability H/R adalah yang paling besar (0.8652549). Ini cukup masuk akal karena sepeda motor Win adalah jenis sepeda motor lama yang tidak diproduksi lagi.

Tentu saja hasil di atas tidak begitu saja bisa saya percaya. Keakuratannya tergantung pada data training yang dipakai karena linear discriminant analysis bekerja dengan baik pada data yang memiliki distribusi normal (Gaussian). Untuk menguji keakuratannya, saya perlu melakukan cross validation (misalnya dengan menambahkan CV=TRUE pada lda() untuk melakukan Leave-one-out Cross Validation/LOOCV). Selain itu, tentu saja prediksi jenis pekerjaan tidak hanya dipengaruhi oleh variabel tipe motor saja melainkan bisa saja ada variabel lain yang belum saya sertakan seperti kondisi motor, tahun beli, dan sebagainya.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: