Pendahuluan

Latar Belakang

Kanker adalah penyakit yang disebabkan oleh pertumbuhan sel yang tidak terkendali dalam tubuh, terbagi menjadi jenis jinak dan ganas. Kanker merupakan penyebab kematian kedua di dunia, dengan tingkat kesembuhan yang menurun jika tidak diatasi cepat. Salah satu jenis kanker yang umum adalah kanker payudara, yang terdeteksi melalui benjolan di payudara. Identifikasi tahap kankernya penting, karena kanker yang ganas dapat menyebar ke organ vital. Penyelidikan struktur sel kanker dengan data penelitian sebelumnya membantu menentukan jenis kankernya, memungkinkan pencegahan dan pengobatan yang tepat.

Pengertian Data

Data yang digunakan merupakan data Winconsin Breast Cancer yang digunakan untuk mengidentifikasi apakah jenis kanker adalah jinak (benign) atau ganas (malignant). Data terdiri dari beberapa parameter yang digunakan untuk dapat melakukan pendeteksian jenis kanker yaitu ketebalan lapisan sel (clump thickness), ukuran sel (uniformity of cell size), bentuk sel (uniformity of cell shape), kecenderungan sel untuk berkumpul (marginal adhesion), ukuran dari sel apital (single epithelial cell size), inti sel yang tidak dikelilingi sitoplasma (bare nuclei), keseragaman tekstur dari inti sel (bland chromatin), struktur inti sel (normal nucleoli), serta pembelahan diri sel atau mitosis sel (mitoses). Sample data ini dilakukan oleh Dr. Wolberg sesuai dengan kasus klinis yang terjadi. Untuk dapat mengunakan data ini untuk melakukan klasifikasi pada jenis selnya , kita dapat menggunakan data pada R, dengan menggunakan data BreastCancer yang terdapat pada library “mlbench”, dimana data berisikan 699 data yang terdiri dari 11 variabel yaitu seperti variabel yang disebutkan diatas ditambah dengan Id serta jenis klasifikasi. Berikut adalah 11 variabel yang terdapat pada data BreastCancer yang digunakan.

  • Id yaitu kode dari sample yang digunakan
  • Cl.thickness yaitu ketebalan lapisan sel
  • Cell.size yaitu ukuran sel
  • Cell.shape yaitu bentuk sel
  • Marg.adhesion yaitu tingkat kecenderungan sel untuk berkumpul
  • Epith.c.size yaitu ukuran dari epital sel
  • Bare.nuclei yaitu inti sel yang tidak dikelilingi oleh sitoplasma
  • Bl.cromatin yaitu tingkat keseragaman tekstur dari inti sel
  • Normal.nucleoli yaitu struktur inti sel
  • Mitoses yaitu pembelahan diri sel
  • Class yaitu diagnosis dari sel kanker

Dari ke 11 variabel, variabel Id tidak akan dapat digunakan karena hanya berupa kode sehingga tidak dapat dipakai untuk melakukan analisis, dan variabel Class sebagai variabel target yang akan kita cari tahu. Untuk melakukan analisis kita akan melakukan preprocessing data dengan melakukan eksplorasi serta visualiasi data, kemudian setelah itu dilakukan pembuatan model dengan menggunakan decsision tree untuk dapat melakukan klasifikasi terhadap sel kanker.

Objektif

Tujuan dari penulisan ini adalah untuk menemukan metode yang dapat melakukan klasifikasi diagnosis terhadap kanker payudara dengan menggunakan informasi yang pada sel kanker yang ada, yaitu apakah kanker bersifat jinak (benign) ataupun bersifat ganas (malignant).

Preprocessing Data

Melakukan pemanggilan library yang akan digunakan

library(tidyverse)
library(ggplot2)
library(GGally)
library(ggcorrplot)
library(rpart)
library(rpart.plot)
library(caret)
library(lattice)

Melakukan pemanggilan data

data(BreastCancer, package="mlbench")
head(BreastCancer)
##        Id Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 1 1000025            5         1          1             1            2
## 2 1002945            5         4          4             5            7
## 3 1015425            3         1          1             1            2
## 4 1016277            6         8          8             1            3
## 5 1017023            4         1          1             3            2
## 6 1017122            8        10         10             8            7
##   Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses     Class
## 1           1           3               1       1    benign
## 2          10           3               2       1    benign
## 3           2           3               1       1    benign
## 4           4           3               7       1    benign
## 5           1           3               1       1    benign
## 6          10           9               7       1 malignant

Memasukkan data ke dalam bentuk tidyverse tibble agar data menjadi lebih rapi dan mempermudah pembacaan data.

BreastCancer <- as_tibble(BreastCancer)
BreastCancer
## # A tibble: 699 × 11
##    Id      Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
##    <chr>   <ord>        <ord>     <ord>      <ord>         <ord>       
##  1 1000025 5            1         1          1             2           
##  2 1002945 5            4         4          5             7           
##  3 1015425 3            1         1          1             2           
##  4 1016277 6            8         8          1             3           
##  5 1017023 4            1         1          3             2           
##  6 1017122 8            10        10         8             7           
##  7 1018099 1            1         1          1             2           
##  8 1018561 2            1         2          1             2           
##  9 1033078 2            1         1          1             2           
## 10 1033078 4            2         1          1             2           
## # ℹ 689 more rows
## # ℹ 5 more variables: Bare.nuclei <fct>, Bl.cromatin <fct>,
## #   Normal.nucleoli <fct>, Mitoses <fct>, Class <fct>

Dapat dilihat untuk data BreastCancer ini terdapat 699 data yang terdiri dari 11 kolom, yaitu Id, Cl.thickness, Cell.size, Cell.shape, Marg.adhesion, Epith.c.size, Bare.nuclei, Bl.cromatin, Normal.nucleoli, Mitoses, dan Class

Disini karena kolom Id tidak akan digunakan untuk pengolahan data, maka variabel “Id” ini dapat dihapus

BreastCancer <- BreastCancer[,-1]
BreastCancer
## # A tibble: 699 × 10
##    Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bare.nuclei
##    <ord>        <ord>     <ord>      <ord>         <ord>        <fct>      
##  1 5            1         1          1             2            1          
##  2 5            4         4          5             7            10         
##  3 3            1         1          1             2            2          
##  4 6            8         8          1             3            4          
##  5 4            1         1          3             2            1          
##  6 8            10        10         8             7            10         
##  7 1            1         1          1             2            10         
##  8 2            1         2          1             2            1          
##  9 2            1         1          1             2            1          
## 10 4            2         1          1             2            1          
## # ℹ 689 more rows
## # ℹ 4 more variables: Bl.cromatin <fct>, Normal.nucleoli <fct>, Mitoses <fct>,
## #   Class <fct>

Disini kita dapat melihat data menjadi 10 kolom, dimana 9 kolom variabel independent dan 1 variabel target yaitu “Class”

Kemudian kita akan melihat struktur data yang digunakan

str(BreastCancer)
## tibble [699 × 10] (S3: tbl_df/tbl/data.frame)
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...

Didapatkan bahwa semua variabel dalam bentuk factor, walaupun ada yang dalam bentuk ordered factor tetapi tetap dapat disebut sebagai factor, yang membedakanya adalah datanya memiliki suatu urutan. Oleh karena itu harus dilakukan penyesuaian terhadap variabel independent untuk dijadikan dalam bentuk integer atau numeric terlebih dahulu. Tetapi karena kita tidak dapat memastikan bahwa tidak ada data berupa double atau float, maka kita memutuskan untuk mengubah data menjadi bentuk numeric yang dapat menampung semua jenis kelas untuk angka. Karena jika tidak diubah ke dalam bentuk numeric maka kita tidak dapat melakukan eksplorasi data lebih lanjut karena data dalam bentuk factor, seperti yang akan ditunjukan di bawah ini dengan melihat summary dari data

summary(BreastCancer)
##   Cl.thickness   Cell.size     Cell.shape  Marg.adhesion  Epith.c.size
##  1      :145   1      :384   1      :353   1      :407   2      :386  
##  5      :130   10     : 67   2      : 59   2      : 58   3      : 72  
##  3      :108   3      : 52   10     : 58   3      : 58   4      : 48  
##  4      : 80   2      : 45   3      : 56   10     : 55   1      : 47  
##  10     : 69   4      : 40   4      : 44   4      : 33   6      : 41  
##  2      : 50   5      : 30   5      : 34   8      : 25   5      : 39  
##  (Other):117   (Other): 81   (Other): 95   (Other): 63   (Other): 66  
##   Bare.nuclei   Bl.cromatin  Normal.nucleoli    Mitoses          Class    
##  1      :402   2      :166   1      :443     1      :579   benign   :458  
##  10     :132   3      :165   10     : 61     2      : 35   malignant:241  
##  2      : 30   1      :152   3      : 44     3      : 33                  
##  5      : 30   7      : 73   2      : 36     10     : 14                  
##  3      : 28   4      : 40   8      : 24     4      : 12                  
##  (Other): 61   5      : 34   6      : 22     7      :  9                  
##  NA's   : 16   (Other): 69   (Other): 69     (Other): 17

Jika dilakukan pengecekan summary dari data, didapatkan banyaknya jenis data dari tiap variabel, oleh karena itu perlu dilakukan pengubahan bentuk menjadi numeric. Tetapi didapatkan disini bahwa ada 16 data yang missing yaitu pada variabel Bare.nuclei, maka kita akan melakukan pembersihan untuk data dengan missing value tersebut. Dan juga tidak menutup kemungkinan jika data yang kita gunakan memiliki duplikat data sehingga akan dilakukan pengambilan data yang unik saja.

Melakukan pengubahan kelas dari factor menjadi numeric untuk ke 9 variabel independent.

Class <- BreastCancer$Class
BreastCancer <- BreastCancer[,-10]

BreastCancer <- BreastCancer %>%
  modify_if(is.factor, as.numeric)

BreastCancer <- cbind(BreastCancer, Class)
str(BreastCancer)
## 'data.frame':    699 obs. of  10 variables:
##  $ Cl.thickness   : num  5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : num  1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : num  1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : num  1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : num  2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : num  1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : num  3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: num  1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : num  1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
BreastCancer <- as_tibble(BreastCancer)

Disini kita melakukan penyimpanan untuk “Class” dari data ke dalam variabel Class, karena kita akan menghapus “Class” dari BreastCancer terlebih dahulu. Karena jika tidak dihapus terlebih dahulu, maka waktu kita mengubah dari factor ke numeric maka “Class” ini akan ikut terubah ke dalam numeric oleh sebab itu kita menghapusnya/ kemudian dengan modify_if() kita melihat jika variabel dengan kelas nya factor, maka akan diubah menjadi bentuk numeric. Selanjutnya setelah diubah ke dalam bentuk numeric langkah selanjutnya adalah menggabungkan kembali Class dengan BreastCancer data dengan menggunakan function cbind(). Dapat dilihat kembali menggunakan Str() untuk melihat struktur datanya yaitu semua variabel kecuali “Class” sudah menjadi bentuk numeric. Tidak lupa untuk dimasukkan ke dalam tibble kembali, karena dengan menggunakan cbind kita mengubah data menjadi data.frame biasa.

Selanjutnya melakukan pembersihan data untuk missing value dan duplikat data, dimana data akan ditampung ke dalam BreastCancer_Bersih

BreastCancer_Bersih <- BreastCancer %>% drop_na() %>% unique()
BreastCancer_Bersih
## # A tibble: 449 × 10
##    Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bare.nuclei
##           <dbl>     <dbl>      <dbl>         <dbl>        <dbl>       <dbl>
##  1            5         1          1             1            2           1
##  2            5         4          4             5            7          10
##  3            3         1          1             1            2           2
##  4            6         8          8             1            3           4
##  5            4         1          1             3            2           1
##  6            8        10         10             8            7          10
##  7            1         1          1             1            2          10
##  8            2         1          2             1            2           1
##  9            2         1          1             1            2           1
## 10            4         2          1             1            2           1
## # ℹ 439 more rows
## # ℹ 4 more variables: Bl.cromatin <dbl>, Normal.nucleoli <dbl>, Mitoses <dbl>,
## #   Class <fct>

Setelah melakukan penghapusan terhadap missing value dan duplikat data, maka data yang akan digunakan menjadi 449 data.

Data Exploration and Visualization

Selanjutnya kita akan melihat summary data

summary(BreastCancer_Bersih)
##   Cl.thickness      Cell.size        Cell.shape     Marg.adhesion   
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.000  
##  1st Qu.: 3.000   1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.: 1.000  
##  Median : 5.000   Median : 3.000   Median : 3.000   Median : 3.000  
##  Mean   : 5.379   Mean   : 4.223   Mean   : 4.274   Mean   : 3.746  
##  3rd Qu.: 8.000   3rd Qu.: 7.000   3rd Qu.: 7.000   3rd Qu.: 6.000  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.000  
##   Epith.c.size    Bare.nuclei      Bl.cromatin   Normal.nucleoli 
##  Min.   : 1.00   Min.   : 1.000   Min.   : 1.0   Min.   : 1.000  
##  1st Qu.: 2.00   1st Qu.: 1.000   1st Qu.: 2.0   1st Qu.: 1.000  
##  Median : 3.00   Median : 3.000   Median : 3.0   Median : 2.000  
##  Mean   : 3.88   Mean   : 4.806   Mean   : 4.2   Mean   : 3.829  
##  3rd Qu.: 5.00   3rd Qu.:10.000   3rd Qu.: 7.0   3rd Qu.: 7.000  
##  Max.   :10.00   Max.   :10.000   Max.   :10.0   Max.   :10.000  
##     Mitoses            Class    
##  Min.   :1.000   benign   :213  
##  1st Qu.:1.000   malignant:236  
##  Median :1.000                  
##  Mean   :1.882                  
##  3rd Qu.:2.000                  
##  Max.   :9.000

Dilihat untuk masing-masing variabel didapatkan nilai min, max, q1, median, q1 dan median. Kemudian kita dapat melihat bahwa data pada label yang kita gunakan yaitu untuk benign terdapat 213 data, sedangkan untk malignant 236 data.

Untuk mendapatkan analisis data deskriptif lainnya seperti standard deviation, IQR, dan Range dapat menggunakan kode-kode seperti dibawah ini:

BreastCancer_Bersih %>% pull(Cl.thickness) %>% sd()
## [1] 2.869029
BreastCancer_Bersih %>% pull(Cl.thickness) %>% IQR()
## [1] 5
BreastCancer_Bersih %>% pull(Cl.thickness) %>% range() %>% diff()
## [1] 9

Ini merupakan data standard deviasi, IQR serta range untuk variabel Cl. Thickness yaitu 2.869, 5, dan 9. Karena jika hanya mendapatkan nilainya saja tidak terlalu berguna dalam pengolahan data, maka kita akan merangkum data menjadi lebih dapat dilihat.

BreastCancer_Bersih_by_mean <- BreastCancer_Bersih %>% 
  group_by(Class) %>%
  summarise_all(mean)
BreastCancer_Bersih_by_mean
## # A tibble: 2 × 10
##   Class Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bare.nuclei
##   <fct>        <dbl>     <dbl>      <dbl>         <dbl>        <dbl>       <dbl>
## 1 beni…         3.36      1.63       1.77          1.65         2.30        1.70
## 2 mali…         7.20      6.56       6.54          5.64         5.31        7.61
## # ℹ 3 more variables: Bl.cromatin <dbl>, Normal.nucleoli <dbl>, Mitoses <dbl>

Disini kita menggunakan groupby untuk data dikumpulkan ke dalam Class nya. Kemudian melakukan summarise_all untuk menarik nilai mean dari tiap variabel, sehingga nilai yang didapatkan adalah nilai mean dari setiap variabel sesuai dengan classnya.

Berdasarkan hasil diatas dapat diketahui bahwa:

  • Breastcancer akan termasuk menjadi jinak atau benign jika :
    1. Rata-rata ketebalan sel adalah 3.36
    2. Rata-rata ukuran sel adalah 1.63
    3. Rata-rata bentuk sel adalah 1.77
    4. Rata-rata nilai kecenderungan sel untuk berkumpul adalah 1.65
    5. Rata-rata ukuran dari epital sel adalah 2.30
    6. Rata-rata inti sel yang yang tidak dikelilingi oleh sitoplasma adalah 1.70
    7. Rata-rata keseragaman tekstur dari inti sel adalah 2.23
    8. Rata-rata nilai struktur inti sel adalah 1.53
    9. Rata-rata pembelahan sel adalah 1.14
  • Breastcancer akan termasuk menjadi ganas atau malignant jika :
    1. Rata-rata ketebalan sel adalah 7.20
    2. Rata-rata ukuran sel adalah 6.56
    3. Rata-rata bentuk sel adalah 6.54
    4. Rata-rata nilai kecenderungan sel untuk berkumpul adalah 5.64
    5. Rata-rata ukuran dari epital sel adalah 5.31
    6. Rata-rata inti sel yang yang tidak dikelilingi oleh sitoplasma adalah 7.61
    7. Rata-rata keseragaman tekstur dari inti sel adalah 5.98
    8. Rata-rata nilai struktur inti sel adalah 5.90
    9. Rata-rata pembelahan sel adalah 2.56
      Selanjutnya jika melihat pengelompokan dengan menggunakan nilai median.
BreastCancer_Bersih_by_median <- BreastCancer_Bersih %>% 
  group_by(Class) %>%
  summarise_all(median)
BreastCancer_Bersih_by_median
## # A tibble: 2 × 10
##   Class Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bare.nuclei
##   <fct>        <dbl>     <dbl>      <dbl>         <dbl>        <dbl>       <dbl>
## 1 beni…            3         1          1             1            2           1
## 2 mali…            8         6          6             5            5          10
## # ℹ 3 more variables: Bl.cromatin <dbl>, Normal.nucleoli <dbl>, Mitoses <dbl>

Dengan melakukan pengelompokan seperti ini kita bisa mendapatkan beberapa sepsifikasi yang dapat digunakan untuk pengelompokan dalam jenis Class nya.

Berdasarkan hasil diatas dapat diketahui bahwa:
  • Breastcancer akan termasuk menjadi jinak atau benign jika
    1. Median ketebalan sel adalah 3
    2. Median ukuran sel adalah 1
    3. Median bentuk sel adalah 1
    4. Median nilai kecenderungan sel untuk berkumpul adalah 1
    5. Median ukuran dari epital sel adalah 2
    6. Median inti sel yang yang tidak dikelilingi oleh sitoplasma adalah 1
    7. Median keseragaman tekstur dari inti sel adalah 2
    8. Median nilai struktur inti sel adalah 1
    9. Median pembelahan sel adalah 1
  • Breastcancer akan termasuk menjadi ganas atau malignant jika :
    1. Median ketebalan sel adalah 8
    2. Median ukuran sel adalah 6
    3. Median bentuk sel adalah 6
    4. Median nilai kecenderungan sel untuk berkumpul adalah 5
    5. Median ukuran dari epital sel adalah 5
    6. Median inti sel yang yang tidak dikelilingi oleh sitoplasma adalah 10
    7. Median keseragaman tekstur dari inti sel adalah 7
    8. Median nilai struktur inti sel adalah 6
    9. Median pembelahan sel adalah 1

Selanjutnya dilakukan beberapa visualisasi

Pertama akan ditampilkan visualiasi dari ggpairs

ggpairs(BreastCancer_Bersih, aes(color=Class))

Pada plot ggpairs ini terdapat beberapa informasi yang dapat kita ketahui. Dianataranya adalah nilai corelasi untuk setiap variabel, kemudian dapat dilihat nilai boxplot untuk setiap variabel, dan arah dari plot untuk tiap-tiap variabel, serta jumlah untuk tiap informasi sesuai dengan class nya. Didapatkan nilai korelasi tertinggi yaitu 0.877, yaitu antara variabel cell shape dengan variabel cell size. Kemudian diketahui ada variabel yang dapat dikatakan tidak memiliki korelasi dengan variabel lainnya karena memiliki nilai korelasi yang sangat kecil dan mendekati 0, yaitu mitoses dengan clump thickness dengan nilai korelasi sebesar 0.296, kemudian mitoses dengan bare nuclei yaitu sebesar 0.267, dan mitoses dengan bl cromatin yaitu 0.285. kemudian dengan adanya plot maka kita dapat melihat persebaran dari tiap-tiap variabel. Tidak lupa dengan adanya bar plot dibagian bawah dari ggpairs, kita dapat melihat perbadingan jumlah dan nilai dari variabel masing-masing terhadap dengan Class.

Karena sedikit sulit jika melihat hanya menggunakan ggpairs, maka kita akan membedahnya menjadi beberapa bagian.

ggplot(BreastCancer_Bersih, aes(x = Mitoses, fill = Class)) + geom_bar()

Dimana kita membuat diagram bar dari variabel Class untuk membandingkan data apakah yang lebih banyak, sehingga didapatkan informasi bahwa data dengan Class nya adalah malignant lebih banyak daripada classnya benign

Selanjutnya membandingkan boxplot antar variabel

BreastCancer_Bersih_long <- BreastCancer_Bersih %>% mutate(id = row_number()) %>% pivot_longer(1:9)
ggplot(BreastCancer_Bersih_long, aes(name, value)) + geom_boxplot(fill="lightblue", col="blue")

Didapatkan informasi yaitu untuk variabel epith c.size terdapat 1 data outlier, sedangkan mitoses terdapat cukup banyak data outlier. Dan data lainnya tidak terdapat outlier.

Selanjutnya melakukan pengecekan corelasi terhadap setiap variabel.

cm <- BreastCancer_Bersih %>% select(-Class) %>% as.matrix %>% cor()
ggcorrplot(cm)

Dilihat terdapat beberapa variabel yang memiliki korelasi cukup rendah. Dimana jika warna yang muncul memiliki warna yang lebih gelap menandakan korelasi yang cukup kuat, sehingga semakin gelap warnanya menandakan korelasi yang dimiliki semakin kuat. Dilihat dari plot korelasi, kita dapat menyimpulkan bahwa mitoses memiliki nilai korelasi yang cukup kecil terhadap variabel lainnya. Hal ini dilihat dari warna yang dihasilkan untuk variabel mitoses cukup terang yang berarti nilai korelasi mendekati 0, atau menandakan tidak ada korelasi. Selanjutnya akan dibuat model yang dapat digunakan untuk melakukan klasifikasi diagnosis pada kanker payudara.

Modeling

Untuk memodelkan data BreastCancer yang sudah kita bersihkan, kita akan menggunakan metode Decision Tree.

Pertama-tama sebelum membuat model kita harus membagi data menjadi data training dan data testing. Pembagian untuk training dan testing yaitu 70% dari data menjadi data training dan sisanya yaitu 30% menjadi data testing. Data training ini akan digunakan sebagai acuan dalam membuat model kita. Berikut ini adalah tahapan yang dilakukan.

set.seed(500)
train = createDataPartition(BreastCancer_Bersih$Class, p=0.7, list = FALSE)
data_training = BreastCancer_Bersih %>% slice(train)
data_testing = BreastCancer_Bersih %>% slice(-train)

Set.seed(500) ini digunakan agar setiap kali kita melakukan pembagian data maka data yang didapatkan akan tetap sama, dan tidak berubah-ubah. Teknik pembagian data dilakukan dengan menggunakan dari library caret yaitu createDataPartition. Selanjutnya kita akan melihat data training yang kita dapatkan

data_training
## # A tibble: 316 × 10
##    Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bare.nuclei
##           <dbl>     <dbl>      <dbl>         <dbl>        <dbl>       <dbl>
##  1            5         4          4             5            7          10
##  2            6         8          8             1            3           4
##  3            4         1          1             3            2           1
##  4            8        10         10             8            7          10
##  5            1         1          1             1            2          10
##  6            2         1          2             1            2           1
##  7            2         1          1             1            2           1
##  8            4         2          1             1            2           1
##  9            1         1          1             1            1           1
## 10            2         1          1             1            2           1
## # ℹ 306 more rows
## # ℹ 4 more variables: Bl.cromatin <dbl>, Normal.nucleoli <dbl>, Mitoses <dbl>,
## #   Class <fct>

Didapatkan untuk data training kita adalah 316 data.

Berikutnya kita akan melihat data testing.

data_testing
## # A tibble: 133 × 10
##    Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bare.nuclei
##           <dbl>     <dbl>      <dbl>         <dbl>        <dbl>       <dbl>
##  1            5         1          1             1            2           1
##  2            3         1          1             1            2           2
##  3            1         1          1             1            2           3
##  4            4         1          1             1            2           1
##  5           10         7          7             6            4          10
##  6            7         3          2            10            5          10
##  7           10         5          5             3            6           7
##  8            3         1          1             1            2           1
##  9           10        10         10             8            6           1
## 10            5         4          4             9            2          10
## # ℹ 123 more rows
## # ℹ 4 more variables: Bl.cromatin <dbl>, Normal.nucleoli <dbl>, Mitoses <dbl>,
## #   Class <fct>

Untuk data testing didapatkan 133 data.

Langkah selanjutnya membuat model dengan menggunakan default tree

tree_default <- data_training %>% rpart(Class ~ ., data = .)
tree_default
## n= 316 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
## 1) root 316 150 malignant (0.47468354 0.52531646)  
##   2) Cell.size< 3.5 164  24 benign (0.85365854 0.14634146)  
##     4) Bare.nuclei< 5.5 145   7 benign (0.95172414 0.04827586)  
##       8) Cl.thickness< 6.5 137   2 benign (0.98540146 0.01459854) *
##       9) Cl.thickness>=6.5 8   3 malignant (0.37500000 0.62500000) *
##     5) Bare.nuclei>=5.5 19   2 malignant (0.10526316 0.89473684) *
##   3) Cell.size>=3.5 152  10 malignant (0.06578947 0.93421053) *
rpart.plot(tree_default, extra = 2, roundint=FALSE)

Dari tree ini kita dapat mengambil kesimpulan yaitu jika ukuran cell lebih besar dari 3.5 maka termasuk ke dalam kanker ganas, sedangkan jika lebih kecil dari 3.5, akan dilakukan seleksi kembali. Jika ukuran lebih kecil daripada 3.5 tetapi bare nuclei > 5.5 maka juga termasuk ke dalam kanker ganas. Selanjutnya jika ukuran lebih kecil daripada 3.5 dan bare nuclei lebih kecil dari 5.5 tetapi ketebalannya lebih besar dari 6.5 maka juga termasuk sebagai kanker ganas. Sehingga jika cell tersebut memiliki ukuran kurang dari 3.5, kemudian bare nuclei lebih kecil dari 5.5 dan ketebalan lebih kecil dari 6.5 baru termasuk sebagai kanker jinak.

Selanjutnya setelah membuat model decision tree, dilakukan pengukuran akurasi untuk data training serta data testing. Dengan pertama-tama melakukan prediksi dengan menggunakan model untuk data, kemudian baru dibandingkan nilai akurasinya.

pred <- predict(tree_default, data_training, type="class")
confusionMatrix(data = pred, reference = data_training %>% pull(Class))
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       135         2
##   malignant     15       164
##                                           
##                Accuracy : 0.9462          
##                  95% CI : (0.9153, 0.9684)
##     No Information Rate : 0.5253          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8917          
##                                           
##  Mcnemar's Test P-Value : 0.003609        
##                                           
##             Sensitivity : 0.9000          
##             Specificity : 0.9880          
##          Pos Pred Value : 0.9854          
##          Neg Pred Value : 0.9162          
##              Prevalence : 0.4747          
##          Detection Rate : 0.4272          
##    Detection Prevalence : 0.4335          
##       Balanced Accuracy : 0.9440          
##                                           
##        'Positive' Class : benign          
## 

Didapatkan untuk prediksi dengan menggunakan data training didapatkan akurasi tepat adalah 94.62% dimana untuk benign terprediksi dengan tepat sebanyak 135, dan malignant 15 data, sedangkan sisanya terjadi error atau kesalahan.

Kemudian kita akan melihat akurasi dengan menggunakan data testing sesuai dengan model yang dibuat.

pred <- predict(tree_default, data_testing, type="class")
confusionMatrix(data = pred, reference = data_testing %>% pull(Class))
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign        62         7
##   malignant      1        63
##                                           
##                Accuracy : 0.9398          
##                  95% CI : (0.8849, 0.9737)
##     No Information Rate : 0.5263          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.8799          
##                                           
##  Mcnemar's Test P-Value : 0.0771          
##                                           
##             Sensitivity : 0.9841          
##             Specificity : 0.9000          
##          Pos Pred Value : 0.8986          
##          Neg Pred Value : 0.9844          
##              Prevalence : 0.4737          
##          Detection Rate : 0.4662          
##    Detection Prevalence : 0.5188          
##       Balanced Accuracy : 0.9421          
##                                           
##        'Positive' Class : benign          
## 

Akurasi yang didapatkan untuk data testing yaitu 93.98% atau berarti hasil prediki yang tepat sebanyak 125 data yang terdiri dari 62 data terprediksi dengan benar unutk benign, dan 63 data untuk malignant.

Karena nilai akurasi untuk data training dan data testing sudah berada pada kisaran yang cukup tinggi yaitu 94,62% dan 93,98% yang berarti model yang dibuat bersifat just fit atau akurasi untuk training dan testing berada di jangkauan yang sama dan tidak terlalu jauh perbedaannya, maka model ini sudah bagus.

Selanjutnya kita akan membuat model dengan menggunakan full tree untuk melihat perbandingan antara model dengan default tree serta dengan full tree.

tree_full <- data_training %>% rpart(Class ~., data = ., control = rpart.control(minsplit = 5, cp = 0))
tree_full
## n= 316 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 316 150 malignant (0.474683544 0.525316456)  
##    2) Cell.size< 3.5 164  24 benign (0.853658537 0.146341463)  
##      4) Bare.nuclei< 5.5 145   7 benign (0.951724138 0.048275862)  
##        8) Cl.thickness< 6.5 137   2 benign (0.985401460 0.014598540)  
##         16) Normal.nucleoli< 3.5 131   0 benign (1.000000000 0.000000000) *
##         17) Normal.nucleoli>=3.5 6   2 benign (0.666666667 0.333333333)  
##           34) Cl.thickness< 4.5 3   0 benign (1.000000000 0.000000000) *
##           35) Cl.thickness>=4.5 3   1 malignant (0.333333333 0.666666667) *
##        9) Cl.thickness>=6.5 8   3 malignant (0.375000000 0.625000000)  
##         18) Cell.shape< 3.5 4   1 benign (0.750000000 0.250000000) *
##         19) Cell.shape>=3.5 4   0 malignant (0.000000000 1.000000000) *
##      5) Bare.nuclei>=5.5 19   2 malignant (0.105263158 0.894736842) *
##    3) Cell.size>=3.5 152  10 malignant (0.065789474 0.934210526)  
##      6) Bl.cromatin< 4.5 49   9 malignant (0.183673469 0.816326531)  
##       12) Cl.thickness< 6.5 22   8 malignant (0.363636364 0.636363636)  
##         24) Marg.adhesion< 5.5 13   5 benign (0.615384615 0.384615385)  
##           48) Bl.cromatin< 3.5 6   0 benign (1.000000000 0.000000000) *
##           49) Bl.cromatin>=3.5 7   2 malignant (0.285714286 0.714285714) *
##         25) Marg.adhesion>=5.5 9   0 malignant (0.000000000 1.000000000) *
##       13) Cl.thickness>=6.5 27   1 malignant (0.037037037 0.962962963) *
##      7) Bl.cromatin>=4.5 103   1 malignant (0.009708738 0.990291262) *

Disini diputuskan untuk menggunakan minsplit 5 yang berarti jika ada node yang berukuran kurang dari 5 maka proses pembuatan tree akan dihentikan. Hal ini bertujuan agar model yang dibuat tidak menjadi overfit.

Dimana modelnya adalah

rpart.plot(tree_full, extra = 2, roundint=FALSE, box.palette = list("Gn", "Bu"), cex=0.5)

Dari model full ini kita akan membandingkan nilai akurasi untuk kedua data, training dan testing.

pred <- predict(tree_full, data_training, type="class")
confusionMatrix(data = pred, reference = data_training %>% pull(Class))
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       143         1
##   malignant      7       165
##                                          
##                Accuracy : 0.9747         
##                  95% CI : (0.9507, 0.989)
##     No Information Rate : 0.5253         
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.9491         
##                                          
##  Mcnemar's Test P-Value : 0.0771         
##                                          
##             Sensitivity : 0.9533         
##             Specificity : 0.9940         
##          Pos Pred Value : 0.9931         
##          Neg Pred Value : 0.9593         
##              Prevalence : 0.4747         
##          Detection Rate : 0.4525         
##    Detection Prevalence : 0.4557         
##       Balanced Accuracy : 0.9737         
##                                          
##        'Positive' Class : benign         
## 
pred <- predict(tree_full, data_testing, type="class")
confusionMatrix(data = pred, reference = data_testing %>% pull(Class))
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign        62         5
##   malignant      1        65
##                                           
##                Accuracy : 0.9549          
##                  95% CI : (0.9044, 0.9833)
##     No Information Rate : 0.5263          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9098          
##                                           
##  Mcnemar's Test P-Value : 0.2207          
##                                           
##             Sensitivity : 0.9841          
##             Specificity : 0.9286          
##          Pos Pred Value : 0.9254          
##          Neg Pred Value : 0.9848          
##              Prevalence : 0.4737          
##          Detection Rate : 0.4662          
##    Detection Prevalence : 0.5038          
##       Balanced Accuracy : 0.9563          
##                                           
##        'Positive' Class : benign          
## 

Untuk data training memiliki akurasi sebesar 97.47% dan data testing memiliki akurasi sebesar 95,49%, yang berarti model ini juga termasuk under fit yang tidak memiliki ketimpangan akurasi antara training dengan testing.

Kesimpulan

Didapatkan bahwa dengan menggunakan full tree hasil akurasi yang didapatkan dalam mendiagnosis pada kanker payudara lebih baik dibandingkan dengan default tree. Hal ini karena jika menggunakan full tree maka kita akan menggunakan semua variabel parameter yang dapat menunjukan hasil prediksi sehingga model yang dibuat menjadi lebih kompleks dan tepat dibandingkan dengan menggunakan tree default. Sehingga dengan menggunakan full tree model ini kita akan dapat melakukan klasifikasi untuk diagnosis pada kanker payudara dengan lebih tepat karena parameter yang digunakan memiliki struktur yang lengkap dan tingkat akurasi pada model sangat tinggi yaitu sebesar 95,49%.