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.
<- read.table(file = "Data/UCI HAR Dataset/features.txt", header = F)
sensor_feature <- sensor_feature %>% select(-V1) sensor_feature
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
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:
Memberikan nama kolom motion yang akan digunkan sebagai variabel target dan mengubah jenis data pada kolom tersebut ke bentuk kategorik.
Menggabungkan dataset predictor dan dataset target menjadi satu set data yang utuh.
<- read.table(file = "Data/UCI HAR Dataset/train/X_train.txt", header = F)
sensor_train_x <- read.table(file = "Data/UCI HAR Dataset/train/y_train.txt", header = F)
sensor_train_y <- read.table(file = "Data/UCI HAR Dataset/test/X_test.txt", header = F)
sensor_test_x <- read.table(file = "Data/UCI HAR Dataset/test/y_test.txt", header = F)
sensor_test_y
#names(sensor_train_x) <- sensor_feature$V2
#names(sensor_test_x) <- sensor_feature$V2
names(sensor_train_y) <- "motion"
names(sensor_test_y) <- "motion"
<- cbind(sensor_train_x,sensor_train_y)
sensor_train_full <- cbind(sensor_test_x,sensor_test_y)
sensor_test_full
$motion <- as.factor(sensor_train_full$motion)
sensor_train_full$motion <- as.factor(sensor_test_full$motion)
sensor_test_full
#glimpse(sensor_train_full)
#colSums(is.na(sensor_train_full))
#colSums(is.na(sensor_test_full))
Semua variabel memiliki data yang lengkap
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.
<- naiveBayes(formula = motion ~ ., data = sensor_train_full, laplace = 1) model_sensor_NB
<- predict(object = model_sensor_NB, newdata = sensor_test_full, type = "class") sensor_pred_class_NB
Evaluasi model dengan confusion matrix:
<-
CM_NB_test confusionMatrix(data = sensor_pred_class_NB, reference = sensor_test_full$motion, positive = "1")
<- ctree(formula = motion ~ ., data = sensor_train_full) model_sensor_DT
<- predict(object = model_sensor_DT, newdata = sensor_test_full, type = "response") sensor_pred_class_DT
Evaluasi model dengan confusion matrix:
<-
CM_DT_test confusionMatrix(data = sensor_pred_class_DT, reference = sensor_test_full$motion, positive = "1")
set.seed(100)
<- randomForest(motion ~ ., data=sensor_train_full, ntree = 500)
model_sensor_RF
saveRDS(model_sensor_RF, "model_sensor_RF.RDS")
<- readRDS("model_sensor_RF.RDS")
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
<- predict(model_sensor_RF, newdata = sensor_test_full)
sensor_pred_class_RF
<-
CM_RF_test confusionMatrix(data = as.factor(sensor_pred_class_RF), reference = sensor_test_full$motion, positive = "1")
Dibuat dataset train baru dengan metode PCA
<- PCA(sensor_train_x, graph = F, ncp = 561, scale.unit = T)
sensor_pca_train <- PCA(sensor_test_x, graph = F, ncp = 561, scale.unit = T)
sensor_pca_test
#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
<- as.data.frame(sensor_pca_train$ind$coord[,c(1:179)])
sensor_pca_train_reduction <- as.data.frame(sensor_pca_test$ind$coord[,c(1:179)]) sensor_pca_test_reduction
Menggabungkan data prediktor dengan data target pada data set train pca
<- cbind(sensor_pca_train_reduction, sensor_train_y)
sensor_pca_train_reduction_full $motion <- as.factor(sensor_pca_train_reduction_full$motion)
sensor_pca_train_reduction_full
<- cbind(sensor_pca_test_reduction, sensor_test_y)
sensor_pca_test_reduction_full $motion <- as.factor(sensor_pca_test_reduction_full$motion) sensor_pca_test_reduction_full
set.seed(100)
<- randomForest(motion ~ ., data=sensor_pca_train_reduction_full, ntree = 500)
model_sensor_RF_pca
saveRDS(model_sensor_RF_pca, "model_sensor_RF_pca.RDS")
<- readRDS("model_sensor_RF_pca.RDS")
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
<- predict(model_sensor_RF_pca, newdata = sensor_pca_test_reduction_full)
sensor_pred_class_RF_pca
<-
CM_RF_PCA_test confusionMatrix(data = as.factor(sensor_pred_class_RF_pca), reference = sensor_pca_test_reduction_full$motion, positive = "1")
$overall CM_NB_test
## Accuracy Kappa AccuracyLower AccuracyUpper AccuracyNull
## 0.7699355 0.7236668 0.7543067 0.7850266 0.1822192
## AccuracyPValue McnemarPValue
## 0.0000000 NaN
$overall CM_DT_test
## Accuracy Kappa AccuracyLower AccuracyUpper AccuracyNull
## 0.8486597 0.8180112 0.8352056 0.8614174 0.1822192
## AccuracyPValue McnemarPValue
## 0.0000000 NaN
$overall CM_RF_test
## Accuracy Kappa AccuracyLower AccuracyUpper AccuracyNull
## 0.9280624 0.9135157 0.9181321 0.9371323 0.1822192
## AccuracyPValue McnemarPValue
## 0.0000000 NaN
$overal CM_RF_PCA_test
## 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.