3 minute read

Activity monitoring (part of Reproducible Research module by Johns Hopkins University)

This assignment was part of the Johns Hopkins Coursera module on Reproducible Research as part of the Data Sciene Specialization.

Full code can be found on GitHub.

Loading and preprocessing the data

The variables included in this dataset are:

  • steps: Number of steps taking in a 5-minute interval (missing values are coded as NA)

  • date: The date on which the measurement was taken in YYYY-MM-DD format

  • interval: Identifier for the 5-minute interval in which measurement was taken

The dataset is stored in a comma-separated-value (CSV) file and there are a total of 17,568 observations in this dataset.

Loading the data:

if (!file.exists("activity.csv")){
  unzip("activity.zip")
}
data <- read.csv("activity.csv", na.strings = "NA", colClasses = c("integer", "character", "integer"))
data$date <- as.Date(data$date, format="%Y-%m-%d")

Checking the data:

str(data)
## 'data.frame':	17568 obs. of  3 variables:
##  $ steps   : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ date    : Date, format: "2012-10-01" "2012-10-01" ...
##  $ interval: int  0 5 10 15 20 25 30 35 40 45 ...
summary(data)
##      steps             date               interval     
##  Min.   :  0.00   Min.   :2012-10-01   Min.   :   0.0  
##  1st Qu.:  0.00   1st Qu.:2012-10-16   1st Qu.: 588.8  
##  Median :  0.00   Median :2012-10-31   Median :1177.5  
##  Mean   : 37.38   Mean   :2012-10-31   Mean   :1177.5  
##  3rd Qu.: 12.00   3rd Qu.:2012-11-15   3rd Qu.:1766.2  
##  Max.   :806.00   Max.   :2012-11-30   Max.   :2355.0  
##  NA's   :2304
head(data)
##   steps       date interval
## 1    NA 2012-10-01        0
## 2    NA 2012-10-01        5
## 3    NA 2012-10-01       10
## 4    NA 2012-10-01       15
## 5    NA 2012-10-01       20
## 6    NA 2012-10-01       25

What is mean total number of steps taken per day?

For this part of the assignment, you can ignore the missing values in the dataset.

Summarizing the data:

total_steps <- data %>% group_by(date) %>%
  summarise(total = sum(steps, na.rm = TRUE))
g <- ggplot(total_steps, aes(total))
g <- g + geom_histogram()
g <- g + labs(title="Number of steps per day", y="", x="")
g
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mean <- mean(total_steps$total, na.rm = TRUE)
mean
## [1] 9354.23

The mean total number of steps per day is: 9354.23

median <- median(total_steps$total, na.rm = TRUE)
median
## [1] 10395

The median total number of steps per day is: 10395

What is the average daily activity pattern?

Summarizing the data:

steps_interval <- data %>% group_by(interval) %>%
  summarise(mean = mean(steps, na.rm = TRUE))
g <- ggplot(steps_interval, aes(interval, mean))
g <- g + geom_line()
g <- g + labs(title="Average steps per interval", y="Average steps", x="Interval")
g

ix <- which.max(steps_interval$mean)
interval <- steps_interval[[ix, "interval"]]
val <- steps_interval[[ix, "mean"]]

The interval with max mean number of steps is 835 with a mean number of steps of 206.17.

h <- floor(interval/60)
m <- interval%%60

Supposing the interval starts at 00:00 of each day, this interval corresponds to 13:55.

Imputing missing values

Total number of missing values:

apply(is.na(data), 2, sum)
##    steps     date interval 
##     2304        0        0

We will fill in the missing steps values with the mean for the specific day and interval.

First we compute the mean for each interval and day of the week.

data <- data %>% mutate(weekday = as.factor(as.POSIXlt(date)$wday))
fill_val <- data %>% group_by(weekday, interval) %>%
  summarise(mean = mean(steps, na.rm = TRUE))

Imputing missing data.

data_nna <- data

for (row in 1:nrow(data_nna)) {
  if(is.na(data_nna[row, "steps"])) {
    wd <- data_nna[row, "weekday"]
    interval <- data[row, "interval"]
    data_nna[row, "steps"] <- fill_val[fill_val$weekday==wd & fill_val$interval==interval, "mean"]
  }
}

apply(is.na(data_nna), 2, sum)
##    steps     date interval  weekday 
##        0        0        0        0

Repeating first steps of the assignement now with the imputed data. Summarizing the data:

total_steps_nna <- data_nna %>% group_by(date) %>%
  summarise(total = sum(steps))
g <- ggplot(total_steps_nna, aes(total))
g <- g + geom_histogram()
g <- g + labs(title="Number of steps per day", y="", x="")
g
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mean_nna <- mean(total_steps_nna$total)
mean_nna
## [1] 10821.21

The mean total number of steps per day is: 10821.21 (was 9354.23 before imputation).

median_nna <- median(total_steps_nna$total)
median_nna
## [1] 11015

The median total number of steps per day is: 11015.00 (was 10395 before imputation).

Are there differences in activity patterns between weekdays and weekends?

Summarizing the data:

steps_interval_nna <- data_nna %>% mutate(week.part = if_else(weekday %in% c(1,6), "weekend", "weekdays")) %>%
  group_by(week.part,interval) %>%
  summarise(mean = mean(steps, na.rm = TRUE))
g <- ggplot(steps_interval_nna, aes(interval, mean, col=week.part))
g <- g + geom_line()
g <- g + facet_grid(rows = vars(week.part))
g <- g + labs(title="Average steps per interval between weekdays and week", y="Average steps", x="Interval")
g