Skip to content
Back to skills

Health Data Analysis

ASecurity

Biotrackr health data schema, metric extraction patterns, and analysis techniques for Fitbit activity data

  • 6 stars
  • 0 votes
  • 1 copy
  • 3 views
  • Added May 27, 2026
data-aipythongo

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add willvelida/biotrackr --skill health-data-analysis --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Health Data Analysis?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Health Data Analysis
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/willvelida-health-data-analysis/badge)](https://www.skillsdirectory.com/skills/willvelida-health-data-analysis)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: health-data-analysis
description: Biotrackr health data schema, metric extraction patterns, and analysis techniques for Fitbit activity data
---

# Health Data Analysis

## Data Schema

Biotrackr health data arrives as a JSON object with an `items` array. Each item represents one day:

```json
{
  "items": [
    {
      "date": "2026-04-05",
      "activity": {
        "activities": [
          {
            "name": "Strength training",
            "calories": 665,
            "duration": 5271000,
            "steps": 4972,
            "startTime": "06:57",
            "distance": 2.52
          }
        ],
        "summary": {
          "steps": 15732,
          "caloriesOut": 4049,
          "activityCalories": 2341,
          "fairlyActiveMinutes": 47,
          "veryActiveMinutes": 78,
          "lightlyActiveMinutes": 234,
          "sedentaryMinutes": 567,
          "distances": [{"activity": "total", "distance": 12.02}],
          "floors": 238,
          "restingHeartRate": 51
        }
      }
    }
  ],
  "totalCount": 7,
  "note": "Optional note about missing data"
}
```

## Metric Extraction

* **Steps**: `item["activity"]["summary"]["steps"]`
* **Calories (total)**: `item["activity"]["summary"]["caloriesOut"]`
* **Activity calories**: `item["activity"]["summary"]["activityCalories"]`
* **Active minutes**: `fairlyActiveMinutes + veryActiveMinutes` (combine both fields)
* **Distance**: Extract from `distances` array where `activity == "total"`: `next(d["distance"] for d in distances if d["activity"] == "total")`
* **Floors**: `item["activity"]["summary"]["floors"]`
* **Resting heart rate**: `item["activity"]["summary"]["restingHeartRate"]`

## Duration Conversion

Activity durations in the data are in **milliseconds**. Convert to minutes by dividing by 60000:

```python
duration_minutes = round(activity["duration"] / 60000)
```

## Goal Definitions

Standard daily goals for achievement tracking:

| Goal | Target | Field |
|------|--------|-------|
| Steps | ≥ 10,000 | `steps` |
| Distance | ≥ 8.0 km | total distance |
| Active Minutes | ≥ 30 min | `fairlyActiveMinutes + veryActiveMinutes` |
| Calories | ≥ 2,500 kcal | `caloriesOut` |

Goal achievement per day = count of how many of the 4 goals were met.

## Standout Day Identification

Identify these standout categories across the reporting period:

* **Highest steps day**: `max(days, key=lambda d: d["steps"])`
* **Highest calories day**: `max(days, key=lambda d: d["caloriesOut"])`
* **Most active minutes day**: `max(days, key=lambda d: d["activeMinutes"])`
* **Best goal achievement day**: `max(days, key=lambda d: d["goals_met"])`
* **Longest single session**: Find the activity with the maximum `duration` across all days

## Weekly Aggregates

Calculate these summary statistics:

* **Averages**: steps, calories, active minutes, distance, floors, resting heart rate (divide totals by number of days with data)
* **Totals**: steps, distance, floors, calories, active minutes
* **Heart rate range**: min and max resting heart rate with corresponding days
* **Trend**: Compare first day to last day for resting heart rate direction

## Handling Missing Days

* Not all 7 days in a week may have data (the `note` field indicates gaps).
* Calculate averages using actual day count (`len(items)`), not 7.
* Clearly label missing days in output tables and narratives.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.