Skip to content

Class heatmap

22 students × 8 skills. Press “Run lesson” — each learner tackles two tasks per skill while BKT updates live. Hover cells for P(L)P(L) and P(solve)P(\text{solve}).

lowhigh
T1
+/−
T1
×/÷
T1
±·
T2
+/−
T2
×/÷
T2
±·
T3
+/−
T3
×/÷
T3
±·
mean
Ivan.95.92.62.69.60.58.52.47.220.62
Maria.74.70.51.46.41.32.29.19.060.41
Jüri.98.98.95.98.88.81.75.73.430.83
Anna.97.90.67.78.62.44.48.42.300.62
Mikk.84.87.65.62.62.44.37.36.170.55
Liisa.86.78.53.58.55.45.29.26.080.48
Karl.98.91.77.85.63.55.56.56.360.69
Eva.89.81.71.72.47.44.33.32.150.54
Mart.88.84.67.70.67.51.40.36.340.60
Linda.76.77.47.52.39.40.37.33.070.45
Janek.91.80.73.63.52.48.38.33.200.55
Helen.87.77.58.53.55.34.27.37.160.49
Toomas.98.92.82.77.69.53.45.41.340.66
Kadi.90.88.64.68.62.45.42.34.180.57
Rauno.87.92.61.69.55.51.43.36.260.58
Triin.78.58.41.50.32.28.21.25.050.38
Henri.98.86.82.78.73.60.48.44.320.67
Kristiina.86.81.72.75.57.43.46.44.200.58
Oskar.89.85.61.58.52.50.35.40.230.55
Pille.86.75.59.54.43.48.32.35.190.50
Indrek.67.63.62.49.53.40.23.25.090.43
Heli.81.82.56.53.45.31.26.23.210.47
↓ weak0/220/222/222/226/2214/2219/2220/2222/22
Hover over a cell — details by student and skill.

Heatmap matrix 22×822 \times 8:

  • rows — students (Ivan, Maria, Jüri, …);
  • columns — topic micro-skills (parentheses, signs, rearranging, …);
  • cell (i,j)(i,j) — student ii’s P(L)P(L) on skill jj;
  • color — red (0) through yellow (0.5) to green (1).

Teachers within seconds spot:

  • Class-wide gaps (vertical red stripe);
  • Lagging individuals (horizontal red band);
  • Unique strengths (lonely bright cell).

This is the strongest demo visual — teams usually zoom here first to show class-wide gaps and outliers in seconds.

[parens][signs][move ][frac ][dist ][like ][check][divide]
Ivan 0.42 0.83 0.66 0.30 0.55 0.71 0.40 0.78
Maria 0.31 0.40 0.55 0.20 0.45 0.60 0.30 0.62
Jüri 0.78 0.85 0.81 0.70 0.80 0.85 0.75 0.88
Anna 0.55 0.62 0.71 0.40 0.60 0.68 0.50 0.74
...

Teacher reads:

  • “fractions” column red everywhere — shared weakness;
  • Maria’s row weak overall — needs remediation packet;
  • Jüri’s row strong — assign stretch items.

Teacher acts: “Tomorrow — worksheet on fractions. Maria — review basics. Jüri — harder problems.”

const heatmap = students.map(student => ({
name: student.name,
cells: microskills.map(skill => ({
skill: skill.id,
pL: student.mastery[skill.id] ?? params.pInit,
}))
}));

Pure projection of each learner’s state — no extra model. Heatmap rides directly on BKT.

Plan: classic red–yellow–green (RdYlGn) like matplotlib:

function color(pL: number): string {
if (pL < 0.3) return '#dc2626'; // red
if (pL < 0.5) return '#f59e0b'; // amber
if (pL < 0.7) return '#eab308'; // yellow
if (pL < 0.85) return '#84cc16'; // lime
return '#16a34a'; // green
}

Alternative — continuous gradient via CSS hsl(120 * pL, 70%, 50%) — but discrete steps read faster.

Once interactive (see widgets overview — phase 3 plan):

  1. Hover cell → tooltip with exact P(L)P(L), skill, student.
  2. Click cell → drill into student timeline.
  3. Click column → tasks targeting that skill sorted for chosen student.
  4. Click row → suggested plan for tomorrow.
  5. “Run lesson” → simulate next batch of tasks updating heatmap via BKT.

Above the grid show summary tiles:

18 / 22 students have P(fractions) < 0.5
14 / 22 have P(parens) < 0.5
Class average strong on “verify solution” (mean P = 0.78)
→ Button: “Draft tomorrow’s worksheet focusing on class weak spots”

Covers the headline workflow: open MATx, five seconds, action plan. Planning time → zero.

“Class map is a direct visualization of BKT state. Teachers finally see the whole classroom picture — previously only possible by hand-grading 22 tests and tallying mistake types. Hours → seconds.”