Objective

For this task the Weight Lifting Exercises (WLE) dataset is used. The WLE dataset is obtained by monitoring people during exercises using devices such as Jawbone Up, Nike FuelBand, and Fitbit. The dataset is used to investigate “how (well)” an activity was performed by the wearer.

The goal of this project is to predict the manner in which people did the exercises. This is the “classe” variable in the training set. The task is to create a prediction model and report describing how the model was built.

Dataset preprocessing

In order to explore the dataset test and train splits are downloaded from following websites:

The dataset is created by Velloso, E.; Bulling, A.; Gellersen, H.; Ugulino, W.; Fuks, H. Qualitative Activity Recognition of Weight Lifting Exercises. Proceedings of 4th International Conference in Cooperation with SIGCHI (Augmented Human ’13) . Stuttgart, Germany: ACM SIGCHI, 2013.

Downloading train/test datasets

Downloading the dataset and setting the seed for reproducability.

Cleaning dataset

Remove unneccessary variables with near zero variance

data_train <- data_train[-(1:7)]
na_count <-sapply(data_train, function(y) sum(length(which(is.na(y)))))
na_count <- data.frame(na_count)
unique(na_count$na_count)
[1]     0 19216
n <- which(na_count == 19216)
data_train <- data_train[-n]
last<-dim(data_train)[2]
data_train[, -last] <- sapply(data_train[, -last] , function(x) as.numeric(x))
nsv <- nearZeroVar(data_train[,-last],saveMetrics=TRUE)
data_train <- data_train[,!nsv$nzv]

Spliting dataset

The dataset is splited into train/validation and testing. Validation set serves for optimizing the algoritm and related parameters.

train <- createDataPartition(y = data_train$classe, p=.75, list = FALSE)
training <- data_train[train,]
validation <- data_train[-train,]

Model training

Fit random forest model and estimate the error on validation dataset.

fitRF <- randomForest(training$classe ~ ., data=training, ntree=100, na.action = na.roughfix)
predictionRF <- predict(fitRF, validation, type = "class")
confusionMatrix(validation$classe, predictionRF)
Confusion Matrix and Statistics

          Reference
Prediction    A    B    C    D    E
         A 1395    0    0    0    0
         B    4  943    2    0    0
         C    0    8  847    0    0
         D    0    0    4  799    1
         E    0    0    0    1  900

Overall Statistics
                                          
               Accuracy : 0.9959          
                 95% CI : (0.9937, 0.9975)
    No Information Rate : 0.2853          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.9948          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: A Class: B Class: C Class: D Class: E
Sensitivity            0.9971   0.9916   0.9930   0.9988   0.9989
Specificity            1.0000   0.9985   0.9980   0.9988   0.9998
Pos Pred Value         1.0000   0.9937   0.9906   0.9938   0.9989
Neg Pred Value         0.9989   0.9980   0.9985   0.9998   0.9998
Prevalence             0.2853   0.1939   0.1739   0.1631   0.1837
Detection Rate         0.2845   0.1923   0.1727   0.1629   0.1835
Detection Prevalence   0.2845   0.1935   0.1743   0.1639   0.1837
Balanced Accuracy      0.9986   0.9950   0.9955   0.9988   0.9993

Submission predictions

predictSubmission <- predict(fitRF, testing, type="class")
predictSubmission
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
 B  A  B  A  A  E  D  B  A  A  B  C  B  A  E  E  A  B  B  B 
Levels: A B C D E
LS0tDQp0aXRsZTogJ1ByZWRpY3Rpb24gQXNzaWdubWVudDogUHJhY3RpY2FsIE1hY2hpbmUgTGVhcm5pbmcnDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KIyMgT2JqZWN0aXZlDQoNCkZvciB0aGlzIHRhc2sgdGhlIFdlaWdodCBMaWZ0aW5nIEV4ZXJjaXNlcyAoV0xFKSBkYXRhc2V0IGlzIHVzZWQuIFRoZSBXTEUgZGF0YXNldCBpcyBvYnRhaW5lZCBieSBtb25pdG9yaW5nIHBlb3BsZSBkdXJpbmcgZXhlcmNpc2VzIHVzaW5nIGRldmljZXMgc3VjaCBhcyBKYXdib25lIFVwLCBOaWtlIEZ1ZWxCYW5kLCBhbmQgRml0Yml0LiBUaGUgZGF0YXNldCBpcyB1c2VkIHRvIGludmVzdGlnYXRlICJob3cgKHdlbGwpIiBhbiBhY3Rpdml0eSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSB3ZWFyZXIuDQoNClRoZSBnb2FsIG9mIHRoaXMgcHJvamVjdCBpcyB0byBwcmVkaWN0IHRoZSBtYW5uZXIgaW4gd2hpY2ggcGVvcGxlIGRpZCB0aGUgZXhlcmNpc2VzLiBUaGlzIGlzIHRoZSAiY2xhc3NlIiB2YXJpYWJsZSBpbiB0aGUgdHJhaW5pbmcgc2V0LiBUaGUgdGFzayBpcyB0byBjcmVhdGUgYSBwcmVkaWN0aW9uIG1vZGVsIGFuZCByZXBvcnQgZGVzY3JpYmluZyBob3cgdGhlIG1vZGVsIHdhcyBidWlsdC4NCg0KIyMgRGF0YXNldCBwcmVwcm9jZXNzaW5nDQoNCkluIG9yZGVyIHRvIGV4cGxvcmUgdGhlIGRhdGFzZXQgdGVzdCBhbmQgdHJhaW4gc3BsaXRzIGFyZSBkb3dubG9hZGVkIGZyb20gZm9sbG93aW5nIHdlYnNpdGVzOg0KDQogLSBUcmFpbiBkYXRhc2V0OiBodHRwczovL2QzOTZxdXN6YTQwb3JjLmNsb3VkZnJvbnQubmV0L3ByZWRtYWNobGVhcm4vcG1sLXRyYWluaW5nLmNzdg0KDQogLSBUZXN0IGRhdGFzZXQ6IGh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcHJlZG1hY2hsZWFybi9wbWwtdGVzdGluZy5jc3YNCg0KVGhlIGRhdGFzZXQgaXMgY3JlYXRlZCBieSBWZWxsb3NvLCBFLjsgQnVsbGluZywgQS47IEdlbGxlcnNlbiwgSC47IFVndWxpbm8sIFcuOyBGdWtzLCBILiBRdWFsaXRhdGl2ZSBBY3Rpdml0eSBSZWNvZ25pdGlvbiBvZiBXZWlnaHQgTGlmdGluZyBFeGVyY2lzZXMuIFByb2NlZWRpbmdzIG9mIDR0aCBJbnRlcm5hdGlvbmFsIENvbmZlcmVuY2UgaW4gQ29vcGVyYXRpb24gd2l0aCBTSUdDSEkgKEF1Z21lbnRlZCBIdW1hbiAnMTMpIC4gU3R1dHRnYXJ0LCBHZXJtYW55OiBBQ00gU0lHQ0hJLCAyMDEzLg0KDQoNCiMjIyBEb3dubG9hZGluZyB0cmFpbi90ZXN0IGRhdGFzZXRzDQoNCkRvd25sb2FkaW5nIHRoZSBkYXRhc2V0IGFuZCBzZXR0aW5nIHRoZSBzZWVkIGZvciByZXByb2R1Y2FiaWxpdHkuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkocnBhcnQpDQpsaWJyYXJ5KHJwYXJ0LnBsb3QpDQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkNCg0Kc2V0LnNlZWQoMjAwMDApDQoNCmRhdGFfdHJhaW4gPC0gcmVhZC5jc3YodXJsKCJodHRwOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcHJlZG1hY2hsZWFybi9wbWwtdHJhaW5pbmcuY3N2IikpDQoNCnRlc3QgPC0gcmVhZC5jc3YodXJsKCJodHRwOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcHJlZG1hY2hsZWFybi9wbWwtdGVzdGluZy5jc3YiKSkNCg0KYGBgDQoNCiMjIyBDbGVhbmluZyBkYXRhc2V0DQoNClJlbW92ZSB1bm5lY2Nlc3NhcnkgdmFyaWFibGVzIHdpdGggbmVhciB6ZXJvIHZhcmlhbmNlDQoNCmBgYHtyfQ0KDQpkYXRhX3RyYWluIDwtIGRhdGFfdHJhaW5bLSgxOjcpXQ0KbmFfY291bnQgPC1zYXBwbHkoZGF0YV90cmFpbiwgZnVuY3Rpb24oeSkgc3VtKGxlbmd0aCh3aGljaChpcy5uYSh5KSkpKSkNCm5hX2NvdW50IDwtIGRhdGEuZnJhbWUobmFfY291bnQpDQp1bmlxdWUobmFfY291bnQkbmFfY291bnQpDQpuIDwtIHdoaWNoKG5hX2NvdW50ID09IDE5MjE2KQ0KZGF0YV90cmFpbiA8LSBkYXRhX3RyYWluWy1uXQ0KbGFzdDwtZGltKGRhdGFfdHJhaW4pWzJdDQpkYXRhX3RyYWluWywgLWxhc3RdIDwtIHNhcHBseShkYXRhX3RyYWluWywgLWxhc3RdICwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4KSkNCm5zdiA8LSBuZWFyWmVyb1ZhcihkYXRhX3RyYWluWywtbGFzdF0sc2F2ZU1ldHJpY3M9VFJVRSkNCmRhdGFfdHJhaW4gPC0gZGF0YV90cmFpblssIW5zdiRuenZdDQoNCmBgYA0KDQojIyMgU3BsaXRpbmcgZGF0YXNldA0KDQpUaGUgZGF0YXNldCBpcyBzcGxpdGVkIGludG8gdHJhaW4vdmFsaWRhdGlvbiBhbmQgdGVzdGluZy4gVmFsaWRhdGlvbiBzZXQgc2VydmVzIGZvciBvcHRpbWl6aW5nIHRoZSBhbGdvcml0bSBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzLg0KDQpgYGB7cn0NCnRyYWluIDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oeSA9IGRhdGFfdHJhaW4kY2xhc3NlLCBwPS43NSwgbGlzdCA9IEZBTFNFKQ0KDQp0cmFpbmluZyA8LSBkYXRhX3RyYWluW3RyYWluLF0NCg0KdmFsaWRhdGlvbiA8LSBkYXRhX3RyYWluWy10cmFpbixdDQoNCmBgYA0KDQoNCiMjIyBNb2RlbCB0cmFpbmluZw0KDQpGaXQgcmFuZG9tIGZvcmVzdCBtb2RlbCBhbmQgZXN0aW1hdGUgdGhlIGVycm9yIG9uIHZhbGlkYXRpb24gZGF0YXNldC4NCg0KYGBge3J9DQoNCmZpdFJGIDwtIHJhbmRvbUZvcmVzdCh0cmFpbmluZyRjbGFzc2UgfiAuLCBkYXRhPXRyYWluaW5nLCBudHJlZT0xMDAsIG5hLmFjdGlvbiA9IG5hLnJvdWdoZml4KQ0KDQpwcmVkaWN0aW9uUkYgPC0gcHJlZGljdChmaXRSRiwgdmFsaWRhdGlvbiwgdHlwZSA9ICJjbGFzcyIpDQoNCmNvbmZ1c2lvbk1hdHJpeCh2YWxpZGF0aW9uJGNsYXNzZSwgcHJlZGljdGlvblJGKQ0KDQpgYGANCg0KIyMjIFN1Ym1pc3Npb24gcHJlZGljdGlvbnMNCg0KYGBge3J9DQoNCnByZWRpY3RTdWJtaXNzaW9uIDwtIHByZWRpY3QoZml0UkYsIHRlc3RpbmcsIHR5cGU9ImNsYXNzIikNCnByZWRpY3RTdWJtaXNzaW9uDQoNCmBgYA0K