A step-by-step case study of one analysis session in TracePrism, kept as a supplementary reference alongside the TVCG submission and as teaching material for students learning the tool and the underlying method.
K, and one UMAP + k-means clustering round on the final residue — the session accumulated 22 committed groups (plus one reopened/superseded group) covering
146,264 of 150,370 traces (97.3%). The remaining 4,106 traces (2.7%) resisted separation and were left unexplained, disproportionately drawn from the dismissed and unresolved outcomes (see Table 2).
STEP 0Every TracePrism session starts on Stage 1 (Overview), which summarizes whatever is currently in the "remaining" working set — at the very start of a session, that is the whole log. For Road Traffic Fines this is 150,370 traces, 2–20 events long, with four possible outcomes (paid_full 40.1%, credit_collection 39.2%, unresolved 19.3%, dismissed 1.4%). The analyst's first observation, noted directly in the session log, was a striking artifact in the date-distribution heatmap: end dates cluster into a handful of sharp monthly spikes rather than a smooth spread — consistent with periodic mass case-closure or amnesty-style batch processing rather than case-by-case resolution.
Stage 1 also renders a plain, counts-based directly-follows graph (DFG) of the whole remaining population, letting the analyst sanity-check the vocabulary and control-flow shape before doing any modeling.
1-1 / 1-2 / 1-3 / 1-4Stage 2 (Outliers & Obvious Groups) offers two complementary shortcuts before any modeling: length/attribute-based outlier flagging (for traces that are structurally strange rather than behaviorally similar to anything else), and a ranked list of the most common short trace variants — the "obvious groups" whose control flow is so short and so outcome-pure that no topic model is needed to justify grouping them.
Three obvious groups were committed directly to the knowledge base at this step: Create Fine → Payment (46,371 traces, 100% paid_full), Create Fine → Send Fine (20,385 traces, 100% unresolved), and Create Fine → Payment → Send Fine (362 traces, 95% unresolved). A fourth candidate — Create Fine → Send Fine → Payment, 3,131 traces, 92% paid_full — was judged not pure enough to commit as-is and was instead selected for further analysis in Stage 2's "step 2" hand-off, becoming the subject of the first topic round below.
2-1 / 2-2 / 2-3 / 2-4Returning to Stage 2 and selecting the 3,131-trace Create Fine → Send Fine → Payment subset for analysis routes the session into Stage 3 (Encoding). Because every trace in this subset already shares the same three-activity DFG, the encoding-recommendation panel correctly downgrades bare activities/bigrams (which carry no discriminating signal here) and instead surfaces the gap-timing features — max-gap tier and gap-augmented 2-grams — as the highest-scoring encoding.
With that encoding, a K-sweep from 3 to 12 topics was run on Stage 4. The Sankey view tracks how traces redistribute across topic membership as K increases, letting the analyst watch a candidate cluster's stability before committing to a specific K; the paired elbow curves (reconstruction error / silhouette / query-filter coverage) give a second, numeric view of the same trade-off.
K=6 was selected and inspected topic-by-topic: the small-multiples view lays out every topic's process graph side by side for a quick shape scan, and the term×topic heatmap shows which n-gram/gap features actually drive each topic's assignment. Both views use a small set of recurring visual badges, worth reading once before the figures below:
Three of the six topics — T1 (635 traces, 97% paid_full, S 2.9×), T3 (589 traces, 95% paid_full), and T4 (594 traces, 94% paid_full) — were added to the knowledge base as committed groups.
3-1 / 3-2 / 3-3From Stage 2, "use whole remaining dataset" routes the entire unexplained residue — at this point 81,434 traces, 54.2% of the full log — into Stage 3 for a fresh encoding recommendation. With a much larger and more heterogeneous population, the recommender now favors activities + 2-grams outright (sharp 0.937, NMI 0.701) — the control-flow vocabulary itself is discriminating again, unlike the single-DFG subset in Step 2.
A wider K-sweep (5–21) was run and filtered to dominant-outcome share ≥ 90%. K=15 was chosen — at that point, topics satisfying the filter covered 62,110 of the 81,434 traces (76%) at silhouette 0.98.
The two small-multiples snapshots below are placed side by side deliberately, out of chronological order, so the "before" and "after" of committing four topics from this fit can be compared directly: watch how much T0's card shrinks once size is driven by NMF weight instead of raw count (Figure 14) — a first, visual hint that its dominant chain, however large, is common rather than distinctive.
Four topics were committed from this round: T0 (56,482 traces, 100% credit_collection), T4 (3,848, 93% paid_full), T6 (1,523, 100% credit_collection), and T14 (257, 100% credit_collection). The process-graph detail view — which pairs a raw-count layout against an NMF-weight layout of the same topic, so a node or edge that is frequent but not distinctive can be told apart from one that is both frequent and distinctive — was used to confirm each candidate's shape before committing it (the color coding is explained fully at Figures 22–24, once T0 is revisited in Step 4).
4-1Returning to Stage 2 again and taking the new remainder (19,324 traces) into a fresh K-sweep (5–21, same ≥90% filter), K=9 was the next pick — at that K, three of nine topics qualified, covering 9,090 of 19,324 traces (47%).
From this fit, T0 (4,779 traces, 98% paid_full) was committed; the process-graph detail view was used to hover individual edges and compare a frequent, near-universal pattern against a rare one — the count-vs-weight color coding introduced above, seen here in full effect.
Three further topics from this K=9 fit were also committed (T1, 3,318 traces, 98% unresolved; T3, 1,471 traces, 86% paid_full; T6, 993 traces, 93% credit_collection), while T8 (860 traces) was added and later reopened/superseded as the analysis continued — visible in the knowledge-groups export as the one reopened/superseded row. A second sweep on the next remainder (K=5–21, same filter) settled on K=20 and contributed five more small, high-purity groups (sizes 1,547 / 1,018 / 549 / 399 / 229, all ≥69% dominant outcome); this round was not separately screen-captured but is fully recorded in the session's exported knowledge base.
5-1 / 5-2Topic modeling was pushed as far as it usefully could go; the final residue (5,021 traces) was instead routed to Stage 6 for a complementary approach — a 2D UMAP embedding of the trace encodings, used purely as a visual estimate of how many distinct groups might still exist, before committing to any specific cluster count.
A k-means N-sweep (N=3–20) on the topic-weight encoding was run next, mirroring the Stage 4 K-sweep's Sankey/elbow-curve treatment but for cluster count rather than topic count.
Three homogeneous clusters from the N=12 fit were added to the knowledge base: a 328-trace cluster (72% dismissed), a 292-trace cluster (84% unresolved), and a 295-trace cluster (75% unresolved) — the first and, as it turned out, only groups in the entire session with dismissed as their dominant outcome.
Table 1 lists every group committed during the session, in commit order, with its size, share of the full dataset, dominant outcome, and provenance (which step produced it).
| # | Description | n | % of dataset | Dominant outcome | Source / step | Status |
|---|---|---|---|---|---|---|
| 0 | Obvious group: Create Fine → Payment (S – · O 0.99) | 46,371 | 30.8% | paid full (99.9%) | obvious-group (step 1) | active |
| 1 | Obvious group: Create Fine → Send Fine (S – · O 1.00) | 20,385 | 13.6% | unresolved (100.0%) | obvious-group (step 1) | active |
| 2 | Obvious group: Create Fine → Payment → Send Fine (S – · O 0.81) | 362 | 0.2% | unresolved (94.8%) | obvious-group (step 1) | active |
| 3 | Topic T1-dominant (K=6, step 4) (S 2.9× · O 0.54) | 635 | 0.4% | paid full (97.3%) | topic (step 4) | active |
| 4 | Topic T3-dominant (K=6, step 4) (S 2.9× · O 0.23) | 589 | 0.4% | paid full (94.7%) | topic (step 4) | active |
| 5 | Topic T4-dominant (K=6, step 4) (S 2.8× · O 0.16) | 594 | 0.4% | paid full (94.1%) | topic (step 4) | active |
| 6 | Topic T0-dominant (K=15, step 4) (S 1.9× · O 1.00) | 56,482 | 37.6% | credit collection (100.0%) | topic (step 4) | active |
| 7 | Topic T4-dominant (K=15, step 4) (S 1.9× · O 0.70) | 3,848 | 2.6% | paid full (93.2%) | topic (step 4) | active |
| 8 | Topic T6-dominant (K=15, step 4) (S 1.9× · O 1.00) | 1,523 | 1.0% | credit collection (100.0%) | topic (step 4) | active |
| 9 | Topic T14-dominant (K=15, step 4) (S 1.6× · O 1.00) | 257 | 0.2% | credit collection (100.0%) | topic (step 4) | active |
| 10 | Topic T0-dominant (K=9, step 4) (S 3.2× · O 0.92) | 4,779 | 3.2% | paid full (98.3%) | topic (step 4) | active |
| 11 | Topic T1-dominant (K=9, step 4) (S 3.3× · O 0.91) | 3,318 | 2.2% | unresolved (98.0%) | topic (step 4) | active |
| 12 | Topic T3-dominant (K=9, step 4) (S 3.6× · O 0.62) | 1,471 | 1.0% | paid full (85.7%) | topic (step 4) | active |
| 13 | Topic T6-dominant (K=9, step 4) (S 3.4× · O 0.74) | 993 | 0.7% | paid full (93.0%) | topic (step 4) | active |
| 14 | Topic T8-dominant (K=9, step 4) (S 3.5× · O 0.48) | 860 | 0.6% | credit collection (83.5%) | topic (step 4) | reopened/superseded |
| 15 | Topic T0-dominant (K=20, step 4) (S – · O 0.78) | 1,547 | 1.0% | unresolved (92.3%) | topic (step 4) | active |
| 16 | Topic T2-dominant (K=20, step 4) (S – · O 0.84) | 1,018 | 0.7% | paid full (95.2%) | topic (step 4) | active |
| 17 | Topic T3-dominant (K=20, step 4) (S – · O 0.87) | 549 | 0.4% | credit collection (96.2%) | topic (step 4) | active |
| 18 | Topic T5-dominant (K=20, step 4) (S – · O 0.69) | 399 | 0.3% | unresolved (90.5%) | topic (step 4) | active |
| 19 | Topic T18-dominant (K=20, step 4) (S – · O 0.69) | 229 | 0.2% | unresolved (90.0%) | topic (step 4) | active |
| 20 | Homogeneous cluster: T15-dominant, 72% dismissed (S 3.9× · O 0.45) | 328 | 0.2% | dismissed (72.0%) | homogeneous cluster (step 5) | active |
| 21 | Homogeneous cluster: T17-dominant, 84% unresolved (S 4.2× · O 0.61) | 292 | 0.2% | unresolved (84.2%) | homogeneous cluster (step 5) | active |
| 22 | Homogeneous cluster: T4-dominant, 75% unresolved (S 3.9× · O 0.38) | 295 | 0.2% | unresolved (74.9%) | homogeneous cluster (step 5) | active |
Table 1. All 23 rows exported from the session's knowledge base (22 active, 1 reopened/superseded). "S/O coherence" scores are not reproduced here — see the exported knowledge_report.html for the full per-group fingerprint panels.
Table 2 breaks the final 4,106 unexplained traces down by outcome. The pattern is stark: the session captured the overwhelming majority of paid_full, credit_collection, and unresolved traces (99.2%, 99.6%, and 94.3% respectively), but only recovered 323 of the dataset's 2,060 dismissed-outcome traces (15.7%) — leaving dismissed traces the single hardest outcome to structurally separate in this log, echoing the same finding surfaced independently in an earlier verification session against a prior knowledge-base export from this dataset.
| Outcome | Total in dataset | Captured by knowledge base | Still remaining | % of that outcome remaining |
|---|---|---|---|---|
| credit collection | 59,010 | 58,797 | 213 | 0.4% |
| dismissed | 2,060 | 323 | 1,737 | 84.3% |
| paid full | 60,290 | 59,797 | 493 | 0.8% |
| unresolved | 29,010 | 27,347 | 1,663 | 5.7% |
| Total | 150,370 | 146,264 | 4,106 | 2.7% |
Table 2. Outcome breakdown of the 4,106 traces that remained in the working set at the end of the session.