EksploRacja danych z krokomierza


Dobrze mieć szwagra. Ostatnio dowiedziałem się od niego, że telefony appla wersji 5s i wyżej, mają koprocesor ruchu. Nic nie trzeba włączać, a on (telefon, nie szwagier) non stop liczy kroki, dystans itp. (o ile oczywiście ma się telefon przy sobie).

To czy i od kiedy liczy, można sprawdzić w aplikacji Health. Poniżej zobaczymy jak te dane wczytać do R i zrobić prostą eksplorację. Poniższy kod jest przetestowany dla iphona, ale pewnie z niewielkimi zmianami będzie działał dla danych z telefonów od innych producentów.

Tutaj są instrukcje jak wysłać sobie dane mailem. Otrzymamy je jako plik xml, zacznijmy od ich wczytania.

require(XML)
rdata <- xmlParse("eksport.xml")
ldata <- xmlToList(rdata)

Po wczytaniu dane są listą wektorów. Małe filtrowanie (pozostawmy tylko pomiary liczby kroków) i zmiana struktury na data.frame.

xml_dataSel <- xml_data[sapply(ldata, function(x) (!is.null(x["type"])) & x["type"]== "HKQuantityTypeIdentifierStepCount")]

xml_dataSelDF <- data.frame(
  unit=unlist(sapply(xml_dataSel, function(x) x["unit"])),
  day=substr(unlist(sapply(xml_dataSel, function(x) x["startDate"])),1,10),
  hour=substr(unlist(sapply(xml_dataSel, function(x) x["startDate"])),12,13),
  start=unlist(sapply(xml_dataSel, function(x) x["startDate"])),
  value=unlist(sapply(xml_dataSel, function(x) x["value"]))
)

head(xml_dataSelDF)
#    unit        day hour                     start value
# 1 count 2015-02-18   18 2015-02-18 18:50:32 +0100     7
# 2 count 2015-02-18   18 2015-02-18 18:50:35 +0100     4
# 3 count 2015-02-18   18 2015-02-18 18:50:37 +0100     3
# 4 count 2015-02-18   18 2015-02-18 18:50:40 +0100     4
# 5 count 2015-02-18   19 2015-02-18 19:33:46 +0100     6
# 6 count 2015-02-18   19 2015-02-18 19:33:53 +0100     6

Dane są zbierane w przedziałach czasowych o różnej długości. Na początek zrobimy małą agregację zliczając liczbę kroków na dzień. Trochę dplyr’a i ggplot2.

library(dplyr)
library(ggplot2)

dataDF <- xml_dataSelDF %>%
  group_by(day) %>%
  summarise(sum = sum(as.numeric(as.character(value))))

ggplot(dataDF, aes(x=as.Date(day), y=sum)) + 
  geom_line()

Ładny szereg czasowy, ale nie wiele widać. Zróbmy małą dekompozycję.
W przypadku aktywności spodziewam się tygodniowej sezonowości.
Użyjemy funkcji decompose by wyodrębnić składową okresową, trend i reszty.

Na osi OY będziemy oglądać liczbę kroków na dzień.

library(ggfortify)
tsDF <- ts(dataDF$sum, frequency=7)
ds <- decompose(tsDF)
ds$time <- as.Date(as.character(dataDF$day))
autoplot(ds, ts.colour = 'blue')

Składowa sezonowa jest silna (mam różną liczbę zajęć w różnych dniach tygodnia, to pewnie ma jakiś wpływ na ruch) ale najciekawszy jest trend.
Okres pomiędzy 20 a 30 tygodniem to wakacje i kilka wyjazdów połączonych z większą aktywnością.
A później zaczyna się semestr zimowy, aktywność niebezpiecznie spada.

Jak myślicie czy w takich danych jest autokorelacja lub częściowa autokorelacja? Można sprawdzić funkcjami acf i pacf (jest autokorelacja ale niezbyt wielka).

Z takimi danymi można bawić się dalej, np. zobaczyć jak wygląda średnia aktywność wewnątrz dnia. Czy profil aktywności w różnych dniach wygląda inaczej? Sprawdzimy następnym razem.

Wpisy z kategorii Duże i złożone są przygotowane we współpracy z firmą Codilime.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *