Skip to learning content

DATA SCIENCE PYTHON PLAYGROUND

Data Foundations

← All challenges
VC05 · Measurements / activity · ~10–20 min

Which group has the higher average?

missingness · comparison · fair scales

Mean comparison

The question

Compare mean activity duration between Morning and Evening groups using known durations only.

df Mean comparison

Your inputs

df

Each row is one Morning or Evening activity session. Duration text may be invalid; all other sessions remain eligible.

Field meanings and units
record_id
Activity-observation identifier.
group
Comparison group.
date
Calendar date supplied as YYYY-MM-DD text unless the task states it is invalid.
steps
Recorded step count, additive across observations.
minutes
Elapsed duration in minutes; unknown is not zero.
week
Current or Previous reporting week.
df · first 5 of 20 rows
record_idgroupdatestepsminutesweek
A001Morning2026-04-01250020Previous
A002Evening2026-04-01307027Previous
A003Morning2026-04-02364034Previous
A004Evening2026-04-02421041Previous
A005Morning2026-04-034780badPrevious
View all 20 rows
df · complete input
record_idgroupdatestepsminutesweek
A001Morning2026-04-01250020Previous
A002Evening2026-04-01307027Previous
A003Morning2026-04-02364034Previous
A004Evening2026-04-02421041Previous
A005Morning2026-04-034780badPrevious
A006Evening2026-04-03535055Previous
A007Morning2026-04-04592021Previous
A008Evening2026-04-04264028Previous
A009Morning2026-04-05321035Previous
A010Evening2026-04-05378042Previous
A011Morning2026-04-06435049Previous
A012Evening2026-04-06492056Previous
A013Morning2026-04-07549022Previous
A014Evening2026-04-07606029Previous
A015Morning2026-04-08278036Current
A016Evening2026-04-08335043Current
A017Morning2026-04-09392050Current
A018Evening2026-04-09449057Current
A019Morning2026-04-10506023Current
A020Evening2026-04-10563030Current

The editable setup in Your Python creates these inputs when you run it.

Your task · Which group has the higher average?

Compare mean activity duration between Morning and Evening groups using known durations only.

meansSeriesfigFigure

Deliverables

Make the outputs listed below. Use each name exactly as shown. Then choose Check answer.

Python name key

Teal outlines name table columns. Violet left rules name Python objects. Dotted rules mark syntax, functions and parameters. Use each name exactly as shown.

  1. Group meansOutputmeansSeries
    1. Store the mean parsed minutes for each group in means.
    2. Omit invalid durations, not entire groups.
  2. FigureOutputfigFigure
    1. Create fig comparing the group means.
    2. Choose labelled bars or individual points; either orientation is valid.
    3. Bars must start at zero.
    4. Add a meaningful title and measure labels
    5. Display the figure.

    Identify Group and Minutes on the appropriate axes; extra wording is welcome.

Data policy Keep all supplied source tables unchanged. Work on separate outputs.

Help Hints & explained solution

Choose the amount of help you need. Opening one hint does not reveal the others.

Hint 1 — Think

Does an unknown duration belong in the denominator of an observed mean?

Hint 2 — Tools

to_numeric(), groupby(), mean(), Axes.bar() or Axes.barh(), or Axes.scatter() for a labelled point comparison

Revisit: Convert numeric text · Summarise groups · Compare averages · Avoid misleading charts · Scatter plot

Hint 3 — Approach

Parse durations, calculate each group’s observed mean and compare the values on a fair zero-based axis.

Explained solution

Add these lines below # Your work in the editor. The supplied input setup is already there.

work = df.copy()
work['minutes'] = pd.to_numeric(work.minutes, errors='coerce')
means = work.groupby('group').minutes.mean()
fig, ax = plt.subplots()
ax.bar(means.index, means.values)
ax.set(title='Mean activity duration', xlabel='Group', ylabel='Minutes')
fig.tight_layout()
plt.show()
View supplied setup

This code is already at the top of the editor.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Supplied input: df (20 rows)
df = pd.DataFrame(
    [
        ('A001', 'Morning', '2026-04-01', 2500, '20', 'Previous'),
        ('A002', 'Evening', '2026-04-01', 3070, '27', 'Previous'),
        ('A003', 'Morning', '2026-04-02', 3640, '34', 'Previous'),
        ('A004', 'Evening', '2026-04-02', 4210, '41', 'Previous'),
        ('A005', 'Morning', '2026-04-03', 4780, 'bad', 'Previous'),
        ('A006', 'Evening', '2026-04-03', 5350, '55', 'Previous'),
        ('A007', 'Morning', '2026-04-04', 5920, '21', 'Previous'),
        ('A008', 'Evening', '2026-04-04', 2640, '28', 'Previous'),
        ('A009', 'Morning', '2026-04-05', 3210, '35', 'Previous'),
        ('A010', 'Evening', '2026-04-05', 3780, '42', 'Previous'),
        ('A011', 'Morning', '2026-04-06', 4350, '49', 'Previous'),
        ('A012', 'Evening', '2026-04-06', 4920, '56', 'Previous'),
        ('A013', 'Morning', '2026-04-07', 5490, '22', 'Previous'),
        ('A014', 'Evening', '2026-04-07', 6060, '29', 'Previous'),
        ('A015', 'Morning', '2026-04-08', 2780, '36', 'Current'),
        ('A016', 'Evening', '2026-04-08', 3350, '43', 'Current'),
        ('A017', 'Morning', '2026-04-09', 3920, '50', 'Current'),
        ('A018', 'Evening', '2026-04-09', 4490, '57', 'Current'),
        ('A019', 'Morning', '2026-04-10', 5060, '23', 'Current'),
        ('A020', 'Evening', '2026-04-10', 5630, '30', 'Current'),
    ],
    columns=['record_id', 'group', 'date', 'steps', 'minutes', 'week'],
)

Why these steps exist

  • Each group mean uses only its known durations; zero-filled unknowns would pull it downward.
  • A shared zero baseline makes the represented group means comparable without exaggerating their difference.

Another valid approach

Labelled individual points are also valid for comparing these summaries. Vertical and horizontal orientations are accepted; bars must use a zero baseline.

Tab: indent · Shift+Tab: outdent · Esc, then Tab: leave editor

Edit Python. Control or Command plus Enter runs it. Tab indents by four spaces. Shift plus Tab outdents. Press Escape, then Tab or Shift plus Tab to leave the editor.

Each run executes all editor code in a fresh Python session. Named outputs appear below when you run. Display charts with plt.show().

Python starts when you open a lesson.

Output

Run your code to see what Python returns.