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.