stiehler.dev Marian Stiehler

Herzfrequenzanalyse mit Mathematica

Mit der Software Mathematica von Wolfram Research lassen sich große Datenmengen sehr schnell und einfach analysieren. Ziel dieses – simplen – Beispiels soll sein, meine Durchschnitts-Herzfrequenz der letzten zwei Jahre zu bestimmen.

Ich trage eine Apple Watch mit einem Sensor, der in regelmäßigen Abständen die Herzfrequenz bestimmt. Dieser Sensor ist, so die Stanford University in einer Studie, im Vergleich zum EKG relativ genau. Außerdem messe ich ab und an meinen Blutdruck und trage dabei die Herzfrequenz in mein iPhone ein. Insgesamt ergibt sich so ein Datenschatz mit 155.916 Einträgen.


Daten beziehen

Export vom iPhone

Zunächst müssen die Daten, die die Apple Watch auf dem iPhone speichert, exportiert und in Mathematica importiert werden. Leider bietet Apple keine einfache Export-Funktion der in der Health App gespeicherten Daten an, sodass ich auf eine Drittanbieter-App zurückgegriffen habe: QS Access von Quantified Self Labs. (iTunes-Link). Diese App exportiert die gewünschten Daten als .csv-Datei (comma separated values). Diese Datei habe ich per Cloud auf meinen Mac transferiert (Mathematica steht allerdings auch unter Windows und Linux zur Verfügung).

Öffnet man diese Datei, sieht der Inhalt ungefähr so aus:

Start,Finish,Heart Rate (count/min)
06-Jun-2016 18:03,06-Jun-2016 18:03,64.0
07-Jun-2016 11:34,07-Jun-2016 11:34,62.0
08-Jun-2016 12:40,08-Jun-2016 12:40,65.0
08-Jun-2016 12:42,08-Jun-2016 12:42,60.0
…

Vor dem ersten Komma steht der Beginn der Messung, vor dem zweiten Komma steht das Ende der Messung und als letztes ist die Herzfrequenz vermerkt. Meine Datei hat ~160.000 Zeilen.

Import in Mathematica

Nun müssen diese Daten in Mathematica importiert werden. Mathematica kann von Haus aus mit csv-Dateien umgehen, sodass der Import mit nur einem Befehl gelingt. Ich weise den Inhalt der Datei hier der Variablen data zu:

data = Import["Heart Rate.csv", "CSV"]

Mathematica legt nun automatisch die folgende Listenstruktur an:

Die ersten drei Einträge (»{Start, Finish, Heart Rate (count/min)}«) sind dabei störend. Außerdem brauchen wir nur die dritte Spalte der Daten, die Herzfrequenz (»64.,62. … 63.,53.,52.«). Mathematica kann diese Daten leicht manipulieren. Der folgende Befehl verwirft die ersten drei Einträge und wählt dann aus den übrig gebliebenen Einträgen die dritte Spalte, die Herzfrequenzen, aus. Das Ergebnis wird data2 zugewiesen.

data2 = Partition[Drop[Flatten[data], 3], 3][[All, 3]]

Das Ergebnis ist wie erwartet:

Der Punkt am Ende jeder Zahl stört uns nicht.


Verarbeiten der Daten

Mathematica verwendet die Wolfram Language, die auf einer sehr hohen Abstraktionsebene agiert. Sie macht die Verarbeitung der Daten denkbar einfach. Um die Zielstellung dieses Blog-Eintrags – die Durchschnittsherzfrequenz der letzten Jahre – zu erreichen, genügt ein kurzer Befehl:

Median[data2]

Das Ergebnis ist in meinem Fall 70.

Das arithmetische Mittel bestimmt sich ebenso leicht:

Mean[data2]

Hier lautet das Ergebnis in meinem Fall (gerundet) 76.6425.

Das Ziel dieses Blogeintrags ist jetzt erreicht. Ich möchte jedoch noch ein paar weitere Funktionen von Mathematica aufzeigen.

Die Anzahl der Daten bestimmt man mit:

Length[data2]
155 916

Und das Minimum und das Maximum mit:

MinMax[data2]
{30., 210.}

Die 210 halte ich übrigens für einen seltenen Messfehler der Apple Watch.

Grafische Darstellung

Natürlich kann Mathematica die Daten auch grafisch darstellen:

ListPlot[data2]

Da man auf dieser Darstellung nicht viel sieht, beschränken wir die Ansicht auf die letzten 10.000 Daten:

ListPlot[Take[data2, -10000]]

Hier kann man schon sehr schön den Tag-Nacht-Rhythmus erkennen (nachts sinkt die Herzfrequenz ab).

Zum Schluss: Wenn man erfahren möchte, wie häufig ein Wert im Datensatz vorkommt, so kann man sich ein Histogramm anzeigen lassen:

SmoothHistogram[data2]