← Back to recipes

Detect absence patterns for wellbeing support

service-deliveryintermediateproven

The problem

Staff absence can signal wellbeing issues, workplace problems, or burnout, but you only notice when it's already serious. You want to offer support proactively - spot patterns that suggest someone might be struggling and have a conversation early - rather than waiting until they're off sick for weeks.

The solution

Analyse absence patterns to identify individuals or teams who might benefit from wellbeing check-ins. Look for increasing frequency, Monday/Friday clustering, post-deadline spikes, or sudden changes from normal patterns. Critically: this must be transparent with staff, framed as wellbeing support not surveillance, and trigger supportive conversations not disciplinary action.

What you get

Monthly wellbeing flags identifying staff or teams showing concerning absence patterns (with specific pattern described: e.g., 'increasing frequency over 6 months', 'Monday clustering'). Each flag triggers a wellbeing conversation with trained manager. Track whether the approach helps (absence patterns improve, staff report feeling supported).

Before you start

  • At least 12 months of absence data (to establish normal patterns)
  • Staff/union or staff representative consultation completed - transparency is non-negotiable
  • Managers trained in supportive wellbeing conversations (not disciplinary)
  • Clear commitment this is for wellbeing support, not cost reduction
  • HR system that records absence dates and reasons (can be basic spreadsheet)

When to use this

  • Organisation genuinely committed to staff wellbeing (not using this to pressure people back)
  • Transparent culture where staff trust management intentions
  • Managers trained and capable of having supportive wellbeing conversations
  • Staff consulted and understand the approach (ideally co-designed it)
  • You have meaningful wellbeing support to offer (not just monitoring with no help)

When not to use this

  • Intention is to reduce absence through pressure or surveillance
  • Low-trust environment where this would damage morale further
  • No actual wellbeing support available (occupational health, counselling, flexibility)
  • Managers aren't trained - they'll handle conversations badly and make things worse
  • You can't be transparent with staff about what you're doing
  • Organisation culture is punitive around absence

Steps

  1. 1

    Consult with staff and representatives

    Before you do anything: talk to staff and unions (or staff representatives if you're a smaller organisation without unions). Explain: you want to spot patterns that might indicate someone's struggling, so you can offer support early. Be explicit: this won't be used for disciplinary action. Get feedback on how it should work. If staff don't trust the intention, don't proceed - it'll backfire badly.

  2. 2

    Define concerning patterns to look for

    Decide what patterns might indicate wellbeing issues: (1) Increasing frequency over time (3 days in Q1, 5 in Q2, 8 in Q3), (2) Monday/Friday clustering (suggests weekend recovery needed), (3) Post-deadline or post-busy-period spikes, (4) Sudden change from normal pattern for that person. Avoid: absolute thresholds (e.g., '>5 days = flag') because people have different baselines.

  3. 3

    Extract and anonymise absence data

    Pull absence data from HR system: staff ID (anonymised for initial analysis), dates of absence, reason codes if you have them. You need 12+ months to establish normal patterns. For initial analysis, use anonymised IDs to spot patterns without bias. Only reveal identity when triggering wellbeing conversation.

  4. 4

    Calculate baseline patterns for each person

    For each staff member, establish their normal pattern: average days absent per quarter, typical day-of-week distribution, seasonal effects (some people always get winter colds). This baseline lets you spot changes that are unusual for that individual, not just high absolute numbers.

  5. 5

    Identify concerning patterns

    Run your analysis monthly. Compare recent patterns to baseline for each person. Flag: increasing trends, clustering, sudden changes. For teams: look for shared patterns (suggests team-level issues like workload or manager problems). Generate a list of flags with clear pattern description for each.

  6. 6

    Review flags with senior HR/management

    Before contacting anyone: review flags with HR. Check for: (1) Context you're missing (known health condition, caring responsibilities), (2) Protected characteristics (don't want to inadvertently discriminate), (3) Whether manager relationship is good enough for this conversation. Some flags shouldn't be acted on.

  7. 7

    Trigger wellbeing conversations

    For approved flags: manager has informal wellbeing conversation. Frame: 'I noticed you've had a few absences recently, just wanted to check you're OK and if there's anything we can do to support you.' Listen more than talk. Offer: flexible working, workload adjustment, occupational health referral, time off if needed. Never: disciplinary tone, pressure to reduce absence.

  8. 8

    Track impact and adjust(optional)

    After 6 months: review whether this is helping. Check: (1) Do absence patterns improve after wellbeing conversations? (2) Do staff report feeling supported? (3) Has this damaged trust or improved it? If it's not working or causing harm, stop. This is only worth doing if it genuinely helps staff.

Example code

Detect concerning absence patterns

Identify staff showing concerning absence patterns compared to their baseline. Requires human review before any action. Note: code uses datetime.now() for recency - if your data is historical, modify to calculate from max date in dataset instead.

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# Load absence data
df = pd.read_csv('absence_data.csv', parse_dates=['absence_date'])
df['year_quarter'] = df['absence_date'].dt.to_period('Q')
df['day_of_week'] = df['absence_date'].dt.day_name()

# Calculate baseline patterns (last 12 months)
baseline_start = datetime.now() - timedelta(days=365)
baseline = df[df['absence_date'] >= baseline_start]

def calculate_baseline(person_df):
    """Calculate normal pattern for a person"""
    quarterly_avg = person_df.groupby('year_quarter').size().mean()
    day_distribution = person_df['day_of_week'].value_counts(normalize=True)
    return {
        'avg_days_per_quarter': quarterly_avg,
        'monday_pct': day_distribution.get('Monday', 0),
        'friday_pct': day_distribution.get('Friday', 0)
    }

# Calculate baseline for each person
baselines = {}
for person_id in df['person_id'].unique():
    person_data = baseline[baseline['person_id'] == person_id]
    if len(person_data) >= 3:  # Need minimum data
        baselines[person_id] = calculate_baseline(person_data)

# Analyse recent patterns (last 3 months)
recent_start = datetime.now() - timedelta(days=90)
recent = df[df['absence_date'] >= recent_start]

flags = []

for person_id, base in baselines.items():
    person_recent = recent[recent['person_id'] == person_id]

    if len(person_recent) == 0:
        continue

    # Check for increasing trend
    recent_quarters = person_recent.groupby('year_quarter').size()
    if len(recent_quarters) >= 2:
        trend = recent_quarters.iloc[-1] / base['avg_days_per_quarter']
        if trend > 1.5:  # 50% increase
            flags.append({
                'person_id': person_id,
                'pattern': 'increasing_frequency',
                'detail': f'Recent quarter: {recent_quarters.iloc[-1]:.0f} days vs baseline {base["avg_days_per_quarter"]:.1f} days',
                'severity': 'medium' if trend < 2.0 else 'high'
            })

    # Check for Monday/Friday clustering
    day_dist = person_recent['day_of_week'].value_counts(normalize=True)
    monday_recent = day_dist.get('Monday', 0)
    friday_recent = day_dist.get('Friday', 0)

    if monday_recent > 0.4 or friday_recent > 0.4:  # >40% on one day
        flags.append({
            'person_id': person_id,
            'pattern': 'day_clustering',
            'detail': f'Mon: {monday_recent:.0%}, Fri: {friday_recent:.0%} (suggests need for weekend recovery)',
            'severity': 'medium'
        })

# Output flags for HR review
flags_df = pd.DataFrame(flags)
print(f"\nFound {len(flags)} concerning patterns for wellbeing follow-up:\n")
print(flags_df.to_string(index=False))

# Save for HR review
flags_df.to_csv('wellbeing_flags_for_review.csv', index=False)

Tools

Google Sheetsservice · free
Visit →
Pythonplatform · free · open source
Visit →
pandaslibrary · free · open source
Visit →

Resources

At a glance

Time to implement
days
Setup cost
free
Ongoing cost
free
Cost trend
stable
Organisation size
medium, large
Target audience
operations-manager, ceo-trustees

Free tools are sufficient. Real cost is manager time for wellbeing conversations (which you should be having anyway). Time: 1 week setup, 2 hours monthly analysis.