1 . Pendahuluan

Project ini dilakukan untuk tugas Learning By Building sebagai pendalaman dan pembelajaran mandiri atas materi Model Klasfifikasi. Data set yang digunakan berdasarkan eksperimen pada grup yang terdiri dari 30 volunteer pada usia 19-48 tahun. Setiap orang melakukan 6 aktivitas, yakni: Berjalan Biasa, Berjalan Naik, Berjalan Turun, Duduk, Berdiri, dan Berbaring menggunakan smartphne pada pinggang mereka. Smartphone tersebut juga telah terpasang accelerometer dan gyroscope, yang akan menangkap 3-axial linear acceleration dan 3-axial angular velocity pada constant rate di angka 50Hz. Experimen juga direkam dan diberikan label secara manual. Data yang dikumpulkan kemudian dibagi menjadi 2 set secara acak, dimana 70% akan mewakili data train dan 30% mewakili data set.

Feature yang dipilih pada database ini berasal dari pengolahan data mentah accelerometer dan gyroscope yakni dengan label tAcc-XYZ and tGyro-XYZ. Data mentah kemudian diturunkan pada 561 vector yang nantinya akan menjadi variabel prediktor pada analisis ini. Informasi tentang label masing-masing vektor dapat dilihat pada data sensor feature yang sudah diringkas di bawah ini.

sensor_feature <- read.table(file = "Data/UCI HAR Dataset/features.txt", header = F)
sensor_feature <- sensor_feature %>% select(-V1)

These signals were used to estimate variables of the feature vector for each pattern:
‘-XYZ’ is used to denote 3-axial signals in the X, Y and Z directions.

tBodyAcc-XYZ tGravityAcc-XYZ tBodyAccJerk-XYZ tBodyGyro-XYZ tBodyGyroJerk-XYZ tBodyAccMag tGravityAccMag tBodyAccJerkMag tBodyGyroMag tBodyGyroJerkMag fBodyAcc-XYZ fBodyAccJerk-XYZ fBodyGyro-XYZ fBodyAccMag fBodyAccJerkMag fBodyGyroMag fBodyGyroJerkMag

The set of variables that were estimated from these signals are:

mean(): Mean value std(): Standard deviation mad(): Median absolute deviation max(): Largest value in array min(): Smallest value in array sma(): Signal magnitude area energy(): Energy measure. Sum of the squares divided by the number of values. iqr(): Interquartile range entropy(): Signal entropy arCoeff(): Autorregresion coefficients with Burg order equal to 4 correlation(): correlation coefficient between two signals maxInds(): index of the frequency component with largest magnitude meanFreq(): Weighted average of the frequency components to obtain a mean frequency skewness(): skewness of the frequency domain signal kurtosis(): kurtosis of the frequency domain signal bandsEnergy(): Energy of a frequency interval within the 64 bins of the FFT of each window. angle(): Angle between to vectors.

Additional vectors obtained by averaging the signals in a signal window sample. These are used on the angle() variable:

gravityMean tBodyAccMean tBodyAccJerkMean tBodyGyroMean tBodyGyroJerkMean


2 . Import Data

Dataset sudah dipisahkan secara langsung dari sumber data asal menjadi 2 set data, yakni: Data Train dan Data Test. Namun ada proses lanjutan setelah data di-import, yakni:

  1. Memberikan nama kolom motion yang akan digunkan sebagai variabel target dan mengubah jenis data pada kolom tersebut ke bentuk kategorik.

  2. Menggabungkan dataset predictor dan dataset target menjadi satu set data yang utuh.

sensor_train_x <- read.table(file = "Data/UCI HAR Dataset/train/X_train.txt", header = F)
sensor_train_y <- read.table(file = "Data/UCI HAR Dataset/train/y_train.txt", header = F)
sensor_test_x <- read.table(file = "Data/UCI HAR Dataset/test/X_test.txt", header = F)
sensor_test_y <- read.table(file = "Data/UCI HAR Dataset/test/y_test.txt", header = F)

#names(sensor_train_x) <- sensor_feature$V2
#names(sensor_test_x) <- sensor_feature$V2
names(sensor_train_y) <- "motion"
names(sensor_test_y) <- "motion"

sensor_train_full <- cbind(sensor_train_x,sensor_train_y)
sensor_test_full <- cbind(sensor_test_x,sensor_test_y)

sensor_train_full$motion <- as.factor(sensor_train_full$motion)
sensor_test_full$motion <- as.factor(sensor_test_full$motion)

#glimpse(sensor_train_full)


3 . Pengecekan Kelengkapan Data

#colSums(is.na(sensor_train_full))
#colSums(is.na(sensor_test_full))

Semua variabel memiliki data yang lengkap


4 . Cek proporsi kelas target:

prop.table(table(sensor_train_full$motion))
## 
##         1         2         3         4         5         6 
## 0.1667573 0.1459467 0.1341132 0.1749184 0.1868879 0.1913765

Semua kelas pda variabel target memiliki proporsi yang seimbang


Pembuatan model klasfikasi pada analisis ini menggunakan 3 metode, yakni Naive Bayes, Decision Tree, dan Random Forest. Ketiga metode tersebut kemudian akan dibandingkan untuk mendapatkan metode dengan performa terbaik.


5 . Naive Bayes

5.1 Build Model

model_sensor_NB <- naiveBayes(formula = motion ~ ., data = sensor_train_full, laplace = 1)


5.2 Model Prediction

sensor_pred_class_NB <- predict(object = model_sensor_NB, newdata = sensor_test_full, type = "class")


5.3 Model Evaluation

Evaluasi model dengan confusion matrix:

CM_NB_test <- 
confusionMatrix(data = sensor_pred_class_NB, reference = sensor_test_full$motion, positive = "1")


6 . Decision Trees

6.1 Build Model

model_sensor_DT <- ctree(formula = motion ~ ., data = sensor_train_full)


6.2 Model Prediction

sensor_pred_class_DT <- predict(object = model_sensor_DT, newdata = sensor_test_full, type = "response")


6.3 Model Evaluation

Evaluasi model dengan confusion matrix:

CM_DT_test <- 
confusionMatrix(data = sensor_pred_class_DT, reference = sensor_test_full$motion, positive = "1")

7 . Random Forest

7.1 Build Model

set.seed(100)
model_sensor_RF <- randomForest(motion ~ ., data=sensor_train_full, ntree = 500)

saveRDS(model_sensor_RF, "model_sensor_RF.RDS")

model_sensor_RF_RDS <- readRDS("model_sensor_RF.RDS")

model_sensor_RF_RDS
## 
## Call:
##  randomForest(formula = motion ~ ., data = sensor_train_full,      ntree = 500) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 23
## 
##         OOB estimate of  error rate: 1.66%
## Confusion matrix:
##      1    2   3    4    5    6 class.error
## 1 1210    6  10    0    0    0 0.013050571
## 2    1 1068   4    0    0    0 0.004659832
## 3    6    7 973    0    0    0 0.013184584
## 4    0    1   0 1238   47    0 0.037325039
## 5    0    0   0   40 1334    0 0.029112082
## 6    0    0   0    0    0 1407 0.000000000


7.2 Model Prediction dan Evaluation

sensor_pred_class_RF <- predict(model_sensor_RF, newdata = sensor_test_full)

CM_RF_test <- 
confusionMatrix(data = as.factor(sensor_pred_class_RF), reference = sensor_test_full$motion, positive = "1")


8 . Random Forest dengan PCA

8.1 Dataset train PCA

Dibuat dataset train baru dengan metode PCA

sensor_pca_train <- PCA(sensor_train_x, graph = F, ncp = 561, scale.unit = T)
sensor_pca_test <- PCA(sensor_test_x, graph = F, ncp = 561, scale.unit = T)

#sensor_pca_train$eig
#sensor_pca_test$eig

Kesimpulan Pada data train, PC1-PC179 memberikan 99.01927% informasi Pada data train, PC1-PC179 memberikan 99.06870% informasi


Mengambil data hasil PCA sebanyak PC yang dibutuhkan

sensor_pca_train_reduction <- as.data.frame(sensor_pca_train$ind$coord[,c(1:179)])
sensor_pca_test_reduction <- as.data.frame(sensor_pca_test$ind$coord[,c(1:179)])


Menggabungkan data prediktor dengan data target pada data set train pca

sensor_pca_train_reduction_full <- cbind(sensor_pca_train_reduction, sensor_train_y)
sensor_pca_train_reduction_full$motion <- as.factor(sensor_pca_train_reduction_full$motion)

sensor_pca_test_reduction_full <- cbind(sensor_pca_test_reduction, sensor_test_y)
sensor_pca_test_reduction_full$motion <- as.factor(sensor_pca_test_reduction_full$motion)


8.2 Build Model (PCA)

set.seed(100)

model_sensor_RF_pca <- randomForest(motion ~ ., data=sensor_pca_train_reduction_full, ntree = 500)

saveRDS(model_sensor_RF_pca, "model_sensor_RF_pca.RDS")

model_sensor_RF_pca_RDS <- readRDS("model_sensor_RF_pca.RDS")

model_sensor_RF_pca_RDS
## 
## Call:
##  randomForest(formula = motion ~ ., data = sensor_pca_train_reduction_full,      ntree = 500) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 13
## 
##         OOB estimate of  error rate: 6.05%
## Confusion matrix:
##      1    2   3    4    5    6 class.error
## 1 1196    8  22    0    0    0 0.024469821
## 2   32 1006  35    0    0    0 0.062441752
## 3   18   25 943    0    0    0 0.043610548
## 4    0    1   0 1069  190   26 0.168740280
## 5    0    0   0   85 1289    0 0.061863173
## 6    0    0   0    3    0 1404 0.002132196


8.3 Model Prediction dan Evaluation (PCA)

sensor_pred_class_RF_pca <- predict(model_sensor_RF_pca, newdata = sensor_pca_test_reduction_full)

CM_RF_PCA_test <- 
confusionMatrix(data = as.factor(sensor_pred_class_RF_pca), reference = sensor_pca_test_reduction_full$motion, positive = "1")


9 . Kesimpulan

CM_NB_test$overall
##       Accuracy          Kappa  AccuracyLower  AccuracyUpper   AccuracyNull 
##      0.7699355      0.7236668      0.7543067      0.7850266      0.1822192 
## AccuracyPValue  McnemarPValue 
##      0.0000000            NaN
CM_DT_test$overall
##       Accuracy          Kappa  AccuracyLower  AccuracyUpper   AccuracyNull 
##      0.8486597      0.8180112      0.8352056      0.8614174      0.1822192 
## AccuracyPValue  McnemarPValue 
##      0.0000000            NaN
CM_RF_test$overall
##       Accuracy          Kappa  AccuracyLower  AccuracyUpper   AccuracyNull 
##      0.9280624      0.9135157      0.9181321      0.9371323      0.1822192 
## AccuracyPValue  McnemarPValue 
##      0.0000000            NaN
CM_RF_PCA_test$overal
##       Accuracy          Kappa  AccuracyLower  AccuracyUpper   AccuracyNull 
##      0.6684764      0.6014505      0.6511494      0.6854683      0.1822192 
## AccuracyPValue  McnemarPValue 
##      0.0000000            NaN

Pada kasus kali ini kita coba membandingkan kemampuan 3 buah model dalam mengklasifikasikan hasil keluaran sensor menjadi 6 jenis gerakan. Mengingat perlunya model untuk melakukan prediksi setiap jenis gerakand dengan benar, maka untuk membandingka performa model akan menggunakan nilai accuracy yang berasal dari confussion matriks.

Dari 4 metode yang digunakan, yakni Naive Bayes, Decision Tree, dan Random Forest terlihat bahwa nilai accuracy terbaik dihasilkan oleh metode Random Forest, dengan nilai accuracy sebesar 92.8% diikuti oleh Decision Trees dengan accuracy sebesar 84.87%, dan Naive Bayes yakni sebesar 76.99%.

Adapun metode Random Forest dengan PCA menjadi model dengan nilai accuracy paling rendah yakni hanya sebesar 66.8%. Hal ini mungkin disebabkan karena adanya kehilangan informasi pada data karena dilakukannya dimensi reduction sehingga model tidak bisa melakukan prediksi dengan sempurna.