Designing a workflow for levels, trends, episodes, country grouping, and policy association on European COVID-19 time series, under four scaffold conditions.
Every variant for this task received the identical brief below; only the ATWL scaffold material in the context differed.
A task on visual analytics workflow design. I want to analyse Google COVID-19 data for countries of Europe. These are daily time series of the counts of reported new cases and deaths. I want to extract episodes of different disease levels (e.g., from very low to very high; the intervals to be defined from data) and trends (rising, stable, decreasing). I want to disregard reporting-related fluctuations such as drops on weekends and peaks on following Mondays. Then I want to analyse the spatio-temporal distribution of the different pandemic behaviour patterns and relate it to the countries' anti-pandemic policies. The COVID data are in file eu.csv looking like below: id,Name,X,Y,CountryName,CapitalName,population, date=15-02-2020: New cases per 100 000 population,date=16-02-2020: New cases per 100 000 population,date=17-02-2020: New cases per 100 000 population,...,date=30-06-2021: New cases per 100 000 population, date=15-02-2020: Deaths per 100 000 population,date=16-02-2020: Deaths per 100 000 population,date=17-02-2020: Deaths per 100 000 population,...,date=30-06-2021: Deaths per 100 000 population AT,Austria,16.366667,48.2,Austria,Vienna,8858775,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.01,0.02,0.05,0.01,0.05,0.06,0.07,0.16,0.10,0.33,0.26,0.32,0.25,0.62,1.23,1.09,2.05,2.37,2.24,2.55,3.91,4.20,5.14,5.75,6.19,6.98,7.76,8.16,8.51,11.92,9.11,6.96,6.17,7.60,6.21,6.19,4.94,4.64,2.86,2.07,3.45,3.26,3.27,3.12,4.03,2.29,1.25,0.98,1.69,1.46,1.26,1.12,0.68,0.53,0.77,0.79,0.82,0.68,0.89,0.70,0.40,0.79,0.55,0.69,0.61,0.42,0.32,0.14,0.34,0.61,0.52,0.45,0.55,0.34,0.17,0.73,0.43,0.59,0.61,0.91,0.17,0.29,0.65,0.69,0.34,0.35,0.32,0.27,0.35,0.28,0.25,0.56,0.21,0.47,0.36,0.06,0.21,0.18,0.60,0.19,0.76,0.35,0.28,0.27,0.17,0.38,0.25,0.42,0.25,0.20,0.60,0.21,0.35,0.36,0.59,0.36,0.33,0.35,0.49,0.40,0.50,0.84,0.51,0.70,0.55,1.14,1.07,0.90,1.51,1.20,0.86,0.77,1.03,1.33,0.81,1.19,1.02,0.59,1.12,1.39,1.46,1.59,1.40,0.91,0.98,1.02,1.55,1.83,1.32,1.73,1.26,1.14,1.08,1.73,1.15,2.14,1.39,0.70,0.79,1.05,0.94,1.79,1.34,1.02,1.17,0.81,1.78,2.11,2.14,2.83,3.94,1.76,1.91,2.92,2.84,3.92,3.74,3.41,2.59,2.18,2.74,3.40,3.61,2.54,4.46,2.68,2.53,2.48,3.23,4.84,4.13,4.29,2.45,4.14,4.47,6.23,7.81,6.75,10.50,4.67,4.67,9.26,8.16,9.64,9.10,9.87,7.53,5.32,6.57,8.12,9.08,7.43,8.60,6.67,6.16,8.33,8.57,9.64,8.92,11.45,8.12,8.33,10.46,12.15,14.38,12.52,14.22,11.45,9.39,12.88,14.91,16.21,17.17,20.26,16.76,13.52,18.59,22.33,29.96,36.48,37.74,33.54,27.93,31.39,49.36,50.44,56.97,64.52,54.07,50.53,58.59,71.84,80.27,78.49,91.32,60.10,64.84,70.51,83.95,103.54,93.22,79.20,57.51,52.07,68.56,84.91,72.63,74.56,72.99,58.15,27.51,52.03,64.79,60.83,56.64,47.82,42.18,26.98,38.08,44.44,40.28,41.26,40.54,32.34,23.33,28.36,29.70,27.99,34.88,32.00,29.77,28.29,30.94,31.13,26.97,22.00,24.28,16.98,15.27,23.66,28.68,32.09,20.34,14.48,13.06,19.14,23.78,33.46,30.50,22.59,17.89,18.42,21.28,25.80,33.30,23.50,22.41,25.80,17.38,15.65,19.04,24.13,18.58,17.28,17.42,14.87,11.38,18.22,18.59,19.56,20.06,16.18,14.18,10.59,15.93,17.69,16.47,15.89,16.66,12.29,12.76,13.67,18.37,17.01,14.23,15.32,12.93,11.21,13.78,16.40,18.64,17.52,14.20,13.12,13.16,16.74,18.52,21.24,19.05,23.51,18.55,13.74,21.19,22.02,27.51,21.17,28.04,24.96,15.77,24.48,27.53,26.90,26.44,30.97,25.26,21.94,28.27,27.04,32.24,34.33,33.94,28.50,21.49,31.00,32.23,39.62,36.22,41.08,30.33,27.44,33.98,39.79,38.70,36.11,37.07,29.82,36.47,31.40,35.19,38.13,34.72,37.18,31.75,26.27,22.64,31.99,32.17,28.03,38.87,22.14,23.17,25.09,35.68,30.66,26.34,26.53,22.92,22.68,23.42,28.39,29.44,27.90,22.09,21.31,17.78,21.46,25.49,24.18,23.80,18.58,17.29,12.41,16.06,19.22,15.57,15.56,12.88,11.89,8.33,10.33,13.02,11.07,9.60,7.13,7.71,5.86,7.15,9.49,6.83,7.42,6.37,5.72,3.92,4.58,5.35,6.84,6.06,4.79,4.35,3.69,4.06,5.52,3.44,3.96,3.21,3.68,3.51,3.47,4.02,3.24,2.56,2.24,2.34,1.16,1.66,2.03,1.93,1.48,1.68,1.22,1.30,1.15,1.31,1.12,1.22,1.32,0.75,0.82,1.05,1.20,0.90,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.01,0.01,0.02,0.02,0.06,0.03,0.06,0.07,0.09,0.14,0.11,0.10,0.18,0.23,0.21,0.16,0.24,0.21,0.12,0.23,0.20,0.23,0.25,0.35,0.33,0.19,0.25,0.26,0.19,0.14,0.24,0.15,0.18,0.26,0.15,0.20,0.19,0.10,0.20,0.14,0.09,0.09,0.16,0.10,0.07,0.16,0.08,0.08,0.05,0.05,0.10,0.05,0.03,0.08,0.03,0.06,0.08,0.03,0.03,0.01,0.03,0.05,0.00,0.01,0.02,0.05,0.01,0.05,0.03,0.05,0.01,0.01,0.02,0.05,0.01,0.02,0.02,0.00,0.05,0.01,0.03,0.03,0.05,0.02,0.01,0.01,0.03,0.02,0.02,0.01,0.02,0.01,0.06,0.07,0.03,0.01,0.00,0.02,0.03,0.02,0.03,0.02,0.05,0.02,0.01,0.03,0.02,0.01,0.00,0.01,0.03,0.01,0.03,0.00,0.01,0.00,0.00,0.01,0.00,0.03,0.02,0.02,0.01,0.01,0.01,0.00,0.00,0.06,0.03,0.00,0.01,0.02,0.00,0.02,0.00,0.03,0.00,0.01,0.05,0.05,0.03,0.02,0.02,0.00,0.01,0.02,0.05,0.02,0.01,0.00,0.02,0.02,0.03,0.01,0.01,0.01,0.01,0.02,0.02,0.01,0.03,0.02,0.02,0.06,0.00,0.00,0.00,0.01,0.00,0.00,0.03,0.02,0.02,0.01,0.06,0.01,0.02,0.00,0.01,0.01,0.05,0.05,0.05,0.01,0.01,0.01,0.06,0.06,0.05,0.03,0.06,0.05,0.03,0.06,0.07,0.06,0.06,0.07,0.02,0.07,0.03,0.09,0.07,0.06,0.11,0.11,0.12,0.09,0.12,0.10,0.09,0.16,0.11,0.08,0.09,0.07,0.11,0.18,0.10,0.17,0.15,0.23,0.21,0.23,0.18,0.26,0.29,0.35,0.40,0.49,0.46,0.59,0.37,0.46,0.63,0.73,0.69,0.52,0.85,0.62,0.90,0.81,1.03,1.12,1.12,1.08,0.96,1.17,1.19,1.06,1.32,1.43,1.33,1.19,1.38,1.19,1.39,1.35,1.47,1.54,1.37,1.52,1.63,1.55,1.64,1.57,1.39,1.20,1.49,1.32,1.50,1.38,1.56,1.19,1.17,1.33,1.09,1.19,1.22,1.07,1.07,1.03,1.00,1.29,1.12,0.97,0.79,1.06,0.72,1.00,0.94,0.88,0.82,0.78,0.78,0.64,0.85,0.69,0.78,0.80,0.59,0.55,0.68,0.78,0.81,0.72,0.69,0.71,0.79,0.58,0.73,0.64,0.50,0.72,0.56,0.79,0.56,0.59,0.65,0.58,0.56,0.63,0.51,0.64,0.58,0.65,0.41,0.43,0.41,0.44,0.45,0.42,0.45,0.46,0.42,0.38,0.40,0.34,0.38,0.32,0.43,0.34,0.26,0.38,0.36,0.41,0.41,0.40,0.32,0.28,0.36,0.36,0.25,0.34,0.30,0.27,0.34,0.38,0.26,0.27,0.36,0.34,0.38,0.36,0.37,0.34,0.40,0.37,0.44,0.34,0.49,0.34,0.41,0.43,0.25,0.32,0.42,0.32,0.33,0.38,0.42,0.37,0.43,0.41,0.47,0.43,0.53,0.36,0.28,0.56,0.41,0.41,0.38,0.44,0.40,0.37,0.45,0.37,0.38,0.44,0.33,0.34,0.52,0.28,0.38,0.20,0.32,0.21,0.34,0.27,0.35,0.30,0.20,0.35,0.35,0.27,0.30,0.23,0.26,0.26,0.17,0.28,0.17,0.15,0.29,0.12,0.14,0.17,0.14,0.14,0.17,0.03,0.09,0.16,0.10,0.14,0.08,0.11,0.15,0.12,0.15,0.10,0.10,0.08,0.10,0.11,0.05,0.07,0.06,0.07,0.06,0.05,0.07,0.05,0.09,0.06,0.05,0.05,0.05,0.03,0.03,0.08,0.07,0.06,0.06,0.01,0.07,0.03,0.00,0.03,0.01,0.02,0.06,0.03 ...
The policy data are in file responses.csv looking like follows: "Austria","AdaptationOfWorkplace",2020-03-16,2020-04-13 "Austria","AdaptationOfWorkplace",2021-04-01,2022-03-05 "Austria","BanOnAllEvents",2020-11-03,2021-05-18 ...
Please design a workflow.
After the four single-pass runs, the model was asked to compare them. Its full assessment, including the summary tables, is reproduced verbatim.
Critically assess and compare 4 variants that differ in starting conditions (no ATWL, ATWL lang description, ATWL library, both). I need a summary table contrasting obtained results
The user wants me to critically assess and compare 4 variants of a visual analytics workflow design for COVID-19 pandemic behaviour analysis. The variants differ in their starting conditions: 1. **No ATWL** (fhgeniechat_1782297816938.json) - No ATWL language definition or library provided 2. **ATWL lang description** (fhgeniechat_1782297988891.json) - ATWL language definition attached as scaffold 3. **ATWL library** (fhgeniechat_1782298006850.json) - Library of ATWL workflow descriptors attached as scaffold 4. **Both** (fhgeniechat_1782298018992.json) - Both ATWL language definition and library attached Now I'm examining the first variant without ATWL support, which produces a free-form markdown workflow with six analytical stages (Data Loading through Policy Correlation), complete with ASCII diagrams, data tables, mathematical formulas for smoothing and thresholds, and specific visualization recommendations like horizon charts. Variant 2 takes a more formal approach by generating a complete ATWL specification with ten stages, proper artifact and transform notation, explicit iterative refinement loops, and clear distinctions between human, machine, and hybrid actors—though this comes at the cost of being more structured and less immediately practical. Variant 3 condenses the workflow into seven phases with two iterative loops (one for level definition, another for country clustering), includes a workflow diagram and library references in the design rationale, and handles spatio-temporal clustering and policy analysis comprehensively, but risks over-engineering the country clustering loop and becomes quite lengthy in the process. Variant 4 streamlines to six phases with a single iterative loop, introduces a well-defined behavior pattern catalogue and explicit policy integration phase, supports multiple coordinated visualizations, and presents clearer design decisions, though it sacrifices the country clustering phase and may sacrifice reproducibility in the pattern definition step. Now I'm comparing these systematically across different dimensions, starting with formality and language compliance.
| Variant | File | Starting Conditions |
|---|---|---|
| V1 | fhgeniechat_1782297816938.json |
No ATWL — no language definition, no library |
| V2 | fhgeniechat_1782297988891.json |
ATWL language definition only |
| V3 | fhgeniechat_1782298006850.json |
ATWL library only |
| V4 | fhgeniechat_1782298018992.json |
Both — language definition + library |
Strengths: - Highly practical and actionable: includes concrete mathematical formulas (moving average, relative rate of change), explicit threshold tables, and specific visualization types (horizon charts, DTW). - Clear "design principles" section demonstrating visual analytics literacy. - The most accessible to a non-specialist audience; no notation barrier.
Weaknesses: - No formal artifact/transform ontology—steps conflate data, operations, and outputs. - No explicit iterative refinement loops; "interactive" is mentioned but not structurally encoded. - Actor roles (human vs. machine) are implicit, not specified per step. - Lacks explicit typing of intermediary products (specification, pattern, knowledge).
Strengths: - Faithful use of ATWL vocabulary: artifact types (entities, features, specifications, patterns, knowledge, visualisations), transform intents, manner, actor, embedment. - Explicit iterative loop (L1) with formal condition/exit structure for episode quality refinement. - Clear separation of human/machine/hybrid roles. - Comprehensive design rationale with 5 explicit design decisions.
Weaknesses: - Only one loop (episode assessment); level threshold definition is iterative in concept but not structurally looped (Stages 2–3 are sequential; adjustments happen inside L1 which is positioned after episode extraction). - No explicit country clustering/grouping step—spatio-temporal pattern identification is deferred entirely to human perception (T14). - Library references are absent (expected, given no library was provided).
Strengths: - Two well-structured iterative loops: L_level_definition (threshold refinement) and L_country_clustering (trajectory grouping). - Explicit library references in the Design Rationale table (e.g., "1.10 Episodes & Topics", "1.12 ST modelling", "1.3 MobilityGraphs"). - Most comprehensive spatio-temporal analysis: includes feature-based sequence encoding, edit-distance clustering, and coordinated views (choropleth + grouped timelines + cluster summaries). - Statistical policy association analysis (transition frequencies, average lags, effect sizes).
Weaknesses: - Verbose—longest output (~7 phases, 2 loops, many intermediate artifacts). - The country clustering loop could be over-engineered for an exploratory workflow. - ATWL notation is slightly less precise without the language definition (e.g., occasional departures in syntax formatting). - Policy analysis is rigorous but may introduce a false sense of statistical power from observational data.
Strengths: - Cleanest structural organisation (6 well-delineated phases); easiest to follow. - Introduces an explicit behaviour pattern catalogue (Phase 3: abstraction → naming of level×trend archetypes), which no other variant does as a standalone phase. - Richest visualization specification: animated choropleth, stacked timelines with policy overlay, and policy-aligned comparative display (centred at policy introduction dates). - Comprehensive "Key design decisions" section with clear justifications.
Weaknesses: - Only one iterative loop (episode refinement); no clustering/grouping loop. - No explicit country clustering—spatial patterns are identified solely through human interpretation of visualisations. - The pattern naming step (human actor) introduces subjectivity without reproducibility safeguards. - Does not include the mathematical/algorithmic detail found in V1 (no formulas for smoothing or trend computation).
| Criterion | V1 (No ATWL) | V2 (Lang def.) | V3 (Library) | V4 (Both) |
|---|---|---|---|---|
| ATWL compliance | ✗ None | ✓✓ High | ✓ Moderate | ✓✓ High |
| Formal artifact typing | ✗ | ✓✓ Full ontology | ✓✓ Full ontology | ✓✓ Full ontology |
| Transform intents explicit | ✗ | ✓✓ | ✓✓ | ✓✓ |
| Actor roles (H/M/Hybrid) | Implicit | ✓✓ Explicit | ✓✓ Explicit | ✓✓ Explicit |
| Iterative loops formalized | ✗ Mentioned only | ✓ 1 loop | ✓✓ 2 loops | ✓ 1 loop |
| Smoothing specification | ✓✓ Formula given | ✓ Described | ✓ Described | ✓ Described |
| Level threshold method | ✓✓ Quantile + Jenks | ✓✓ Hybrid, interactive | ✓✓ Loop-refined | ✓ Described |
| Trend extraction detail | ✓✓ Formula + δ threshold | ✓✓ Window + slope | ✓ Described | ✓ Described |
| Episode segmentation | ✓✓ RLE + merge rules | ✓ Time-partitioning | ✓ With merge rules | ✓ Time-partitioning |
| Behaviour pattern typology | ✗ Implicit | ✓ Abstraction step | ✓ Implicit via labels | ✓✓ Dedicated phase + catalogue |
| Country clustering/grouping | ✓ Described (DTW, MDS) | ✗ None | ✓✓ Full loop + features | ✗ None |
| Spatio-temporal visualization | ✓✓ Multiple types named | ✓ Map + timeline | ✓✓ Coordinated views | ✓✓ Animated map + timelines + comparison |
| Policy integration depth | ✓✓ Lag analysis, aligned agg. | ✓ Overlay + association | ✓✓ Statistical associations | ✓✓ Temporal alignment + policy-centred view |
| Library references | N/A | N/A | ✓✓ Explicit (1.10, 1.12, 1.3) | ✗ Implicit only |
| Practical actionability | ✓✓ Highest | ✓ Moderate | ✓ Moderate | ✓ Moderate |
| Conciseness | ✓✓ Most concise | ✓ Long | ✗ Very long | ✓ Well-balanced |
| Readability for non-specialists | ✓✓ | ✗ Requires ATWL knowledge | ✗ Requires ATWL knowledge | ✗ Requires ATWL knowledge |
| Structural rigour | ✗ Ad-hoc | ✓✓ | ✓✓ | ✓✓ |
| Design rationale articulated | ✓ 4 principles | ✓✓ 5 decisions | ✓✓ Table with library links | ✓✓ Key decisions list |
Effect of language definition (V2, V4): Produces more precise and consistent ATWL notation — artifact embedment, value structures, and transform intents are properly used throughout.
Effect of library (V3, V4): Introduces richer analytical patterns (clustering loops, sequence encoding, statistical associations) drawn from existing workflow templates. V3 leverages the library most explicitly; V4 absorbs library patterns more subtly.
Trade-off between formality and practicality: V1 is the most directly implementable (a developer could code it immediately); V2–V4 are more suitable for workflow documentation, reproducibility, and formal reasoning about the analysis process.
Coverage gap — country grouping: Only V1 (informally) and V3 (formally) include explicit computational clustering of countries by trajectory similarity. V2 and V4 rely on human perception alone for spatial pattern detection — a significant analytical gap for 30+ countries.
Most balanced variant: V4 achieves the best balance between structural rigour, readability, and analytical completeness — though it would benefit from incorporating V3's explicit clustering loop and V1's mathematical specificity.
The complete single-pass output under each condition. Expand a panel to read it; the model’s internal reasoning is nested inside.
The user wants me to design a visual analytics workflow for analyzing COVID-19 data in European countries. Let me break down what they want: 1. **Data**: Daily time series of new cases and deaths per 100,000 population for European countries 2. **Goals**: - Extract episodes of different disease levels (very low to very high, intervals defined from data) - Extract trends (rising, stable, decreasing) - Disregard reporting-related fluctuations (weekend drops, Monday peaks) - Analyse spatio-temporal distribution of pandemic behaviour patterns - Relate patterns to anti-pandemic policies Let me design a comprehensive workflow covering data preprocessing, analysis, and visualization steps. Now I'm mapping out the core pipeline: loading the EU and policy datasets, applying smoothing to eliminate day-of-week reporting noise, classifying disease intensity levels, detecting trend directions, extracting continuous episodes, analyzing how patterns vary across space and time, and finally connecting those patterns to policy interventions.
┌─────────────────────────────────────────────────────────────────────────────┐
│ VISUAL ANALYTICS WORKFLOW │
└─────────────────────────────────────────────────────────────────────────────┘
┌──────────┐ ┌──────────┐ ┌───────────┐ ┌───────────┐ ┌─────────┐
│ 1. DATA │───▶│2. SMOOTH │───▶│ 3. CLASSI-│───▶│4. EPISODE │───▶│5. SPATIO│
│ LOADING │ │ ING │ │ FICATION │ │EXTRACTION │ │-TEMPORAL│
│ & PARSING│ │ │ │ │ │ │ │ ANALYSIS│
└──────────┘ └──────────┘ └───────────┘ └───────────┘ └────┬────┘
│
▼
┌──────────────────────────────────────────────────────────────────────────────┐
│ 6. POLICY CORRELATION ANALYSIS │
└──────────────────────────────────────────────────────────────────────────────┘
Input: eu.csv, responses.csv
Tasks:
- Parse the multi-row header of eu.csv to separate new cases and deaths time series (each country has two sequential blocks of daily values).
- Extract date range (15-02-2020 to 30-06-2021 = 502 days).
- Parse responses.csv into structured policy intervals per country.
Output: Two matrices (countries × days) for cases and deaths; a policy table (country, policy type, start, end).
Goal: Eliminate weekday-related fluctuations (weekend under-reporting, Monday catch-up peaks) while preserving genuine trends and level changes.
Method: 7-day centred moving average (symmetric window):
$$\tilde{v}(t) = \frac{1}{7}\sum_{i=-3}^{3} v(t+i)$$
Rationale: A 7-day window exactly covers one reporting cycle, cancelling day-of-week effects without over-smoothing genuine epidemiological dynamics.
Interactive check (visual): - Line chart overlaying raw vs. smoothed series for a selected country. - The analyst verifies that weekend dips disappear while wave shapes are preserved.
Goal: Assign each day of each country's smoothed series to a level category.
Method: Data-driven thresholds using the pooled distribution of all smoothed daily values across all countries and all days:
| Level | Label | Threshold definition |
|---|---|---|
| 1 | Very Low | [0, Q₂₀) |
| 2 | Low | [Q₂₀, Q₄₀) |
| 3 | Moderate | [Q₄₀, Q₆₀) |
| 4 | High | [Q₆₀, Q₈₀) |
| 5 | Very High | [Q₈₀, max] |
Alternative: Use Jenks Natural Breaks on the pooled distribution to find class boundaries that maximise between-class variance — often more meaningful than fixed quantiles.
Interactive refinement: - Histogram of pooled values with draggable threshold lines. - Analyst can switch between quantile-based, Jenks, or domain-informed thresholds (e.g., WHO incidence levels).
Goal: Assign each day a trend label: Rising, Stable, or Decreasing.
Method: Compute the slope of a linear regression fitted over a sliding window (e.g., 14 days) on the smoothed series. Normalise slope relative to the current level to get a relative rate of change:
$$r(t) = \frac{\text{slope}(t)}{\tilde{v}(t) + \epsilon}$$
| Trend | Condition |
|---|---|
| Rising | r(t) > +δ |
| Stable | −δ ≤ r(t) ≤ +δ |
| Decreasing | r(t) < −δ |
where δ is a sensitivity threshold (e.g., 0.03 per day ≈ doubling/halving in ~3 weeks). This can also be set interactively.
Goal: Segment each country's time series into contiguous episodes of homogeneous behaviour (same level + same trend).
Algorithm:
1. Assign each day the composite label (Level, Trend) — e.g., (High, Rising).
2. Run-length encode the label sequence to get raw episodes.
3. Merge short episodes (< minimum duration, e.g., 7 days) into their neighbours (adopt the label of the longer adjacent episode) to avoid fragmentation.
4. Optionally re-check: if a merged episode spans a genuine level change, split it.
Output per country: An ordered sequence of episodes, each described by:
| Field | Description |
|---|---|
| Country | Country ID |
| Start date | Episode start |
| End date | Episode end |
| Duration | Number of days |
| Level | Very Low … Very High |
| Trend | Rising / Stable / Decreasing |
| Mean value | Average smoothed incidence |
Interactive visual: - Colour-coded timeline strip per country (colour = level, hatching/icon = trend). - Analyst adjusts minimum episode duration and verifies plausibility.
Visualisations:
Goal: Relate extracted episodes and trend changes to the introduction/lifting of anti-pandemic policies.
responses.csv).| Country | Policy introduced | Level at introduction | Days to peak | Days to trend reversal | Subsequent level drop |
|---|---|---|---|---|---|
| Austria | BanOnAllEvents 2020-11-03 | Very High | 12 | 18 | 2 levels |
| … | … | … | … | … | … |
| Stage | Method | Key Parameters (interactive) | Output |
|---|---|---|---|
| 1. Parse | CSV parsing | — | Matrices + policy table |
| 2. Smooth | 7-day moving average | Window width | Smoothed series |
| 3a. Levels | Quantile / Jenks breaks | Number of classes, thresholds | Daily level labels |
| 3b. Trends | Sliding-window regression | Window width, δ threshold | Daily trend labels |
| 4. Episodes | Run-length encoding + merge | Min. episode duration | Episode table |
| 5. Patterns | Clustering, maps, timelines | Distance metric, #clusters | Country groups, visualisations |
| 6. Policies | Overlay, alignment, lag analysis | Policy types of interest | Correlation findings |
The user wants me to design a visual analytics workflow using the ATWL (Artifact–Transform Workflow Language) for analyzing Google COVID-19 data for European countries. The workflow should:
1. Start with daily time series of new cases and deaths per 100,000 population for European countries
2. Smooth out reporting-related fluctuations (weekend drops, Monday peaks)
3. Extract episodes of different disease levels (very low to very high, defined from data)
4. Extract trends (rising, stable, decreasing)
5. Analyze spatio-temporal distribution of pandemic behavior patterns
6. Relate patterns to countries' anti-pandemic policies
Let me also consider the data structure:
I'm working with two main datasets: eu.csv containing country metadata and daily time series for cases and deaths per capita, and responses.csv with policy information including type, duration, and affected countries. The workflow will start by smoothing the raw daily measurements to eliminate reporting artifacts, then extract disease episodes characterized by their severity level and trend direction, before finally mapping these patterns against policy timelines to understand their relationship. Very high) and trend (rising, stable, decreasing) to characterize each episode, then abstract these into behavior patterns by combining level and trend categories. From there, I can do spatial-temporal analysis to see how these patterns play out across different countries and time periods, and finally bring in policy data to understand what relationships exist. Let me structure this as a full ATWL workflow, thinking through how to organize the data—whether countries are entities with time series as features, or if I should think of daily observations as the base units. I'm settling on Option A where countries are entities with time series as their internal structure, embedded in geographic space. Then I'll design the workflow starting with characterizing the raw time series, defining disease episodes as units, characterizing those episodes by level and trend, abstracting patterns, contextualizing them spatially and temporally, visualizing the results, and finally relating everything to policy data. I'm drafting the workflow template and identifying the input artifacts needed—countries with daily COVID metrics and policy information. uations from the data. Then I need to classify each time point by its level category, compute local trends using a sliding window on the smoothed series, and segment into episodes where both level and trend remain stable. Alternatively, I could smooth first, then segment based on significant changes in either level or trend, and characterize each resulting episode. I'm leaning toward the second approach: smooth the signal, define level thresholds from the overall data distribution, compute local trends at each time point, then identify episode boundaries where meaningful changes occur.
Now I'm mapping out the full workflow: smooth the data, define level categories and trends, segment into episodes with consistent properties, characterize each episode, extract behavioral patterns, contextualize findings, visualize results, and finally relate observations back to policy changes. I'm structuring this as a formal workflow specification that chains these operations together, starting with the raw country time series and flowing through each analytical step.
Writing workflow specification... Actually, I think the cleaner approach is to treat level classification as a characterization step that groups each day by its value and trend, then segment consecutive days with matching levels into episodes using time-partitioning. From there I can characterize the episodes themselves, abstract patterns across them, and finally relate those patterns back to the policy data to generate insights.
Now I'm working through how to formally define the entities—countries as the primary entities with time series as their internal structure, then episodes as derived entities that inherit both temporal and spatial embedment from their parent country. structure: elementary, and embedment: {set, time} where the set dimension groups by country and time captures the validity period of each policy.
Now I'm laying out the complete workflow. The core question driving this is understanding how pandemic behavior patterns—combinations of activity levels and trends—are distributed across European countries over time, and what relationship they have with the policy interventions in place.
The analytical pipeline starts with smoothing the raw time series, then segments them into episodes where behavior remains consistent, assigns each episode a level and trend category, identifies the distinct behavior patterns that emerge, and finally maps how these patterns distribute spatially and temporally across the countries.
For the level thresholds, I need a data-driven approach rather than arbitrary cutoffs—either quantiles across all observations or natural breaks detection. The trend can be captured through local regression slopes or by comparing consecutive smoothed values. Now I'm drafting the full ATWL workflow, organizing it into stages: exogenous artifacts, smoothing, level and trend classification, episode segmentation, pattern abstraction, spatio-temporal analysis, and finally relating everything back to the policy data.
Writing the workflow specification... Defining the data schema... So the question is whether treating the country as a sequence of daily observations makes more sense than treating it as an elementary entity with time series features. Since we're planning to decompose the time series into episodes anyway, modeling the country's internal structure as a sequence of ordered components seems more appropriate—that way we can actually work with and partition those internals rather than keeping them locked away as atomic features.
Now I'm defining the artifact with the country entities as sequences, where each entity has vector-valued features for the daily cases and deaths across the time period.
Defining the artifact structure... Defining the policy dataset schema with temporal fields for when measures start and end, then moving into the transforms section where I'm setting up a smoothing operation that applies a 7-day moving average to the time series data to filter out weekly reporting noise.
Specifying the smoothing parameters and the resulting smoothed feature artifact that represents the cleaned daily time series per country, then beginning to work through how to determine appropriate threshold levels by analyzing the distribution of these smoothed values to establish meaningful categories. Defining the threshold categories...
I'm realizing the combined vector structure with two categorical types feels clunky, so I should split this into separate features instead for clarity. Defining the feature artifacts for disease levels and trends, then moving into segmentation logic that partitions each country's time series into episodes where the level and trend categories remain constant. The basic episode characterization from the previous step already covers the essentials, but I want to add deeper statistical summaries like mean incidence, peak values, and cumulative measures. I'm defining a transform that computes these aggregate statistics for each episode, producing a feature set with numeric summary values across the dataset.
Now I'm identifying distinct pandemic behavior patterns by grouping episodes based on their disease level and trend direction combinations—things like "high and rising" or "low and stable"—to create a typology that captures up to 15 different pattern types across the spatial and temporal dimensions. Defining temporal arrangement transforms...
I'm also considering whether time needs its own context entity, since episodes already have temporal embedment built in. The contextualisation is really about creating specific visual arrangements rather than adding new information. Let me step back and think about how to structure the spatial and temporal views more cleanly as visualization transforms rather than separate artifacts.
The key visualizations I need are a map showing the current pattern state, a timeline displaying the sequence of episodes for each country, and a combined space-time view that brings both dimensions together.
I'm creating a timeline visualization with each country as a row, color-coded by behavior pattern type, so you can see how patterns evolve over time for each nation. Then I'm building an animated map or small-multiples view showing the geographic distribution of these patterns across Europe at different time points. Next I need to overlay policy information to contextualize these behavioral patterns.
I'm reconsidering how to model the policy relationship—whether it's better as a characterization that identifies which policies are active during each episode, or as a visualization showing both episodes and policies together temporally. Continuing with the combined visualization that overlays behaviour patterns and active policies across countries in aligned timelines, where each country gets its own row with time flowing horizontally, behaviour episodes shown as coloured segments on top and policy measures as annotated bars below. Then I'm moving into the analysis phase where I'll examine these visualizations alongside the extracted patterns and policy features to formulate key findings about the relationship between pandemic policies and behaviour changes.
The findings should capture three main things: how behaviour patterns distributed across space and time, which policies seemed to precede shifts in behaviour, and where countries diverged in their pandemic trajectories. I'm also considering whether the threshold definition step should be iterative—defining thresholds, examining the resulting episodes, checking if they're sensible, then refining as needed.
I should also clarify whether the smoothed time series should be its own artifact or just a feature of the existing country entities. Since it's a transformed version of the same data, treating it as a characterization makes sense. And I need to be explicit about trend parameters—window size, stability thresholds, what counts as rising versus decreasing. Let me build out the complete workflow with these pieces.
Defining trend specification parameters... I should keep the perception step as a separate transform to capture how analysts identify spatio-temporal patterns like waves or clusters from the visualizations. Now I'm working through the complete workflow template, organizing all the transforms from characterization through generation into a coherent sequence.Below is the complete ATWL workflow specification.
workflow covid_europe_behaviour_analysis
template: characterise (smooth) → generate-knowledge (define level/trend thresholds) →
characterise (classify) → define-unit (segment into episodes) →
abstract (behaviour patterns) → contextualise (space & time) →
visualise → abstract (spatio-temporal patterns) →
visualise (combined with policies) → generate-knowledge (relate to policies)
description: "Analyse COVID-19 daily time series for European countries: smooth out
reporting artifacts, extract episodes of consistent disease levels and trends,
identify pandemic behaviour patterns, analyse their spatio-temporal distribution,
and relate observed patterns to countries' anti-pandemic policies."
# ============================================================
# EXOGENOUS ARTIFACTS
# ============================================================
artifact D_countries : entities
origin: given
internal structure: sequence
embedment: space
features:
- id: daily_cases
value structure: vector
value type: numeric
description: "Daily new cases per 100,000 population (one value per day)"
- id: daily_deaths
value structure: vector
value type: numeric
description: "Daily deaths per 100,000 population (one value per day)"
- id: country_name
value structure: atomic
value type: categorical
description: "Country name"
- id: capital_name
value structure: atomic
value type: categorical
description: "Capital city name"
- id: population
value structure: atomic
value type: numeric
description: "Country population"
- id: coordinates
value structure: atomic
value type: spatial
description: "Capital coordinates (X, Y)"
description: "European countries with daily COVID-19 time series
(15 Feb 2020 – 30 Jun 2021); each entity is one country represented
as a sequence of ~502 daily observations."
artifact D_policies : entities
origin: given
internal structure: elementary
embedment: {set, time}
features:
- id: country
value structure: atomic
value type: categorical
description: "Country to which the policy applies"
- id: policy_type
value structure: atomic
value type: categorical
description: "Type of anti-pandemic measure (e.g., BanOnAllEvents,
AdaptationOfWorkplace, SchoolClosure, etc.)"
- id: start_date
value structure: atomic
value type: temporal
description: "Date the policy measure came into effect"
- id: end_date
value structure: atomic
value type: temporal
description: "Date the policy measure was lifted"
description: "Anti-pandemic policy measures applied in European countries,
each defined by country, policy type, and validity period."
artifact D_map : entities
origin: given
internal structure: elementary
embedment: space
features:
- id: geometry
value structure: atomic
value type: spatial
description: "Country boundary polygon"
description: "Geographic boundaries of European countries for map display."
artifact S_smoothing : specification
origin: given
representation form: "parameter settings"
description: "7-day centred moving average to remove weekly reporting
cycle artifacts (weekend drops, Monday peaks)."
artifact S_trend : specification
origin: given
representation form: "parameter settings"
description: "Parameters for local trend computation: window size for
slope estimation (e.g., 7–14 days) and slope threshold for classifying
trend as rising (positive above threshold), stable (within threshold),
or decreasing (negative below threshold)."
# ============================================================
# STAGE 1: SMOOTH TIME SERIES
# ============================================================
transform T1_smooth :
intent: characterise
manner: "smooth (moving average)"
input: D_countries, S_smoothing
output: F_smoothed
actor: machine
description: "Apply 7-day centred moving average to daily cases and
deaths time series to eliminate reporting-related weekly fluctuations."
artifact F_smoothed : feature(D_countries)
value structure: vector
value type: numeric
representation form: "smoothed daily time series per country (cases and deaths)"
description: "Smoothed daily incidence and mortality rates per 100,000
population for each country, free of weekly reporting artifacts."
# ============================================================
# STAGE 2: DEFINE DISEASE LEVEL THRESHOLDS FROM DATA
# ============================================================
transform T2_distribution :
intent: characterise
manner: "compute-statistics"
input: F_smoothed
output: F_distribution
actor: machine
description: "Compute the overall distribution of smoothed daily
incidence values across all countries and dates (quantiles,
histogram, density) to support data-driven threshold definition."
artifact F_distribution : feature(D_countries)
value structure: vector
value type: numeric
representation form: "distribution statistics and quantiles"
description: "Summary statistics and quantiles of the pooled distribution
of smoothed incidence values across all countries and time points."
transform T3_vis_distribution :
intent: visualise
input: F_distribution, F_smoothed
output: V_distribution
actor: machine
description: "Visualise the distribution of smoothed incidence values
(e.g., histogram, ECDF) to support interactive threshold selection."
artifact V_distribution : visualisation(F_distribution)
layout: "single panel"
form: "histogram and/or ECDF"
encoding: "x-axis: incidence value; y-axis: frequency or cumulative
probability; candidate thresholds shown as vertical lines"
description: "Distribution of all smoothed incidence values with
candidate level boundaries."
transform T4_define_thresholds :
intent: generate-knowledge
manner: "formulate-specification"
input: F_distribution, V_distribution
output: S_levels
actor: hybrid
description: "Define disease level categories by setting threshold values
derived from data (e.g., quantile-based breaks or natural breaks /
Jenks classification), producing five ordinal levels: very low, low,
medium, high, very high."
artifact S_levels : specification
representation form: "parameter settings"
description: "Threshold values defining five disease level categories:
boundaries between very low, low, medium, high, and very high
incidence, derived from the pooled data distribution."
# ============================================================
# STAGE 3: CLASSIFY DAILY VALUES BY LEVEL AND TREND
# ============================================================
transform T5_classify :
intent: characterise
manner: "classify"
input: F_smoothed, S_levels, S_trend
output: F_levels, F_trends
actor: machine
description: "For each country and day: (1) classify the smoothed
incidence into one of five disease level categories using defined
thresholds; (2) compute local trend from slope of smoothed values
and classify as rising, stable, or decreasing."
artifact F_levels : feature(D_countries)
value structure: vector
value type: ordinal
representation form: "daily time series of level categories per country"
description: "Disease level category for each country and day:
very low, low, medium, high, or very high."
artifact F_trends : feature(D_countries)
value structure: vector
value type: ordinal
representation form: "daily time series of trend categories per country"
description: "Trend direction for each country and day:
rising, stable, or decreasing."
# ============================================================
# STAGE 4: SEGMENT INTO EPISODES
# ============================================================
transform T6_segment :
intent: define-unit
manner: "time-partitioning"
input: D_countries, F_levels, F_trends, F_smoothed
output: D_episodes
actor: machine
description: "Segment each country's time series into maximal contiguous
episodes where the disease level category and trend direction remain
constant. Each episode inherits the level, trend, and summary
statistics from its constituent days."
artifact D_episodes : entities
internal structure: episode
embedment: {space, time}
features:
- id: country_ref
value structure: atomic
value type: reference
description: "Reference to the country this episode belongs to"
- id: level
value structure: atomic
value type: ordinal
description: "Disease level category (very low / low / medium / high / very high)"
- id: trend
value structure: atomic
value type: ordinal
description: "Trend direction (rising / stable / decreasing)"
- id: duration_days
value structure: atomic
value type: numeric
description: "Episode duration in days"
- id: start_date
value structure: atomic
value type: temporal
description: "Episode start date"
- id: end_date
value structure: atomic
value type: temporal
description: "Episode end date"
- id: mean_incidence
value structure: atomic
value type: numeric
description: "Mean smoothed incidence during the episode"
- id: peak_incidence
value structure: atomic
value type: numeric
description: "Maximum smoothed incidence during the episode"
description: "Episodes of consistent pandemic behaviour: maximal contiguous
time intervals within each country where both disease level category
and trend direction are constant."
# ============================================================
# STAGE 5: ABSTRACT BEHAVIOUR PATTERNS
# ============================================================
transform T7_abstract_patterns :
intent: abstract
manner: "find-salient-groups"
input: D_episodes
output: P_behaviour_patterns, F_pattern_labels
actor: hybrid
description: "Identify the repertoire of pandemic behaviour patterns as
the set of actually occurring level×trend combinations; assign
meaningful labels (e.g., 'high-rising', 'low-stable',
'very high-decreasing'); note frequency and typical duration of each."
artifact P_behaviour_patterns : pattern(D_episodes)
representation form: "typology with labelled categories"
description: "Catalogue of pandemic behaviour pattern types defined by
combinations of disease level and trend direction (up to 15 possible;
subset that actually occurs), with descriptive labels and frequency
information."
artifact F_pattern_labels : feature(D_episodes)
value structure: atomic
value type: categorical
description: "Behaviour pattern type label assigned to each episode
(e.g., 'high-rising', 'medium-stable')."
# ============================================================
# STAGE 6: ASSESS EPISODE QUALITY (ITERATIVE REFINEMENT)
# ============================================================
loop L1:
purpose: "Iteratively refine level thresholds and trend parameters until
episodes are meaningful and interpretable (not too short, not too
fragmented, adequately capturing distinct pandemic phases)"
until: "Episodes are interpretable: typical duration is at least several
days; pattern distribution is informative; analyst is satisfied with
the segmentation."
body:
transform T8_vis_episodes_check :
intent: visualise
input: D_episodes, F_pattern_labels
output: V_episodes_check
actor: machine
description: "Visualise episode sequences for selected countries
as colour-coded timelines to assess segmentation quality."
artifact V_episodes_check : visualisation(D_episodes, F_pattern_labels)
layout: "aligned timelines (one row per country)"
form: "coloured segments"
encoding: "horizontal: time; vertical: countries; colour: pattern type;
segment width: episode duration"
description: "Timeline view for checking episode segmentation quality."
transform T9_assess :
intent: assess
input: V_episodes_check, D_episodes, F_pattern_labels
output: K_assessment
actor: human
description: "Judge whether episodes are meaningful: not overly
fragmented, capture visually distinct phases, and the level/trend
classification is plausible."
artifact K_assessment : knowledge(D_episodes)
representation form: "quality judgment"
description: "Assessment of episode segmentation quality: fragmentation
level, interpretability of patterns, need for threshold adjustment."
if K_assessment indicates refinement needed:
then:
transform T10_refine :
intent: generate-knowledge
manner: "formulate-specification"
input: K_assessment, S_levels, S_trend
output: S_levels_new, S_trend_new
actor: human
description: "Adjust level thresholds and/or trend parameters
(e.g., widen stable-trend band, merge adjacent levels) to
produce better episodes."
artifact S_levels_new : specification
representation form: "parameter settings"
description: "Revised level thresholds."
artifact S_trend_new : specification
representation form: "parameter settings"
description: "Revised trend parameters."
assign:
S_levels := S_levels_new
S_trend := S_trend_new
# Re-execute T5 (classify) and T6 (segment) with new specs
# (implicit re-computation of F_levels, F_trends, D_episodes,
# F_pattern_labels)
else:
exit loop L1
end loop L1
# ============================================================
# STAGE 7: SPATIO-TEMPORAL CONTEXTUALISATION AND VISUALISATION
# ============================================================
transform T11_contextualise_space :
intent: contextualise
manner: "map-based"
input: D_episodes, D_map
output: A_spatial
actor: machine
description: "Arrange episodes geographically using their country's
position on the map of Europe."
artifact A_spatial : arrangement(D_episodes)
context: D_map
principle: "geographic position (country boundary / centroid)"
description: "Episodes positioned on the European map through their
country's geographic location."
transform T12_vis_timeline :
intent: visualise
input: D_episodes, F_pattern_labels, P_behaviour_patterns
output: V_timeline
actor: machine
description: "Create a comprehensive timeline visualisation showing
episode sequences for all countries, sorted by geographic proximity,
with colour encoding behaviour pattern type."
artifact V_timeline : visualisation(D_episodes, F_pattern_labels)
layout: "aligned timelines (one row per country, countries sorted
by latitude or geographic cluster)"
form: "coloured horizontal segments"
encoding: "horizontal position: time (start_date to end_date);
vertical position: country; segment colour: behaviour pattern type
(hue = level, saturation/brightness = trend)"
description: "Temporal overview of pandemic behaviour across all
European countries, enabling detection of synchronous waves and
cross-country propagation."
transform T13_vis_map :
intent: visualise
input: D_episodes, A_spatial, F_pattern_labels, P_behaviour_patterns
output: V_map
actor: machine
description: "Create an animated choropleth or small-multiples map
showing the spatial distribution of behaviour patterns over time."
artifact V_map : visualisation(A_spatial, F_pattern_labels)
layout: "geographic map of Europe"
form: "animated choropleth (or small-multiples snapshots)"
encoding: "country fill colour: behaviour pattern type at current time;
animation slider or facets: time progression"
description: "Map view revealing spatial clustering and propagation of
pandemic behaviour patterns across Europe over time."
# ============================================================
# STAGE 8: PERCEIVE SPATIO-TEMPORAL PATTERNS
# ============================================================
transform T14_perceive_st_patterns :
intent: abstract
manner: "perception-and-interpretation"
input: V_timeline, V_map
output: P_spatiotemporal
actor: human
description: "Identify spatio-temporal regularities: synchronous waves
across countries, geographic clusters of similar behaviour, temporal
propagation patterns (e.g., west-to-east spread), and outlier
countries with distinct trajectories."
artifact P_spatiotemporal : pattern(V_timeline, V_map)
representation form: "textual descriptions of spatio-temporal regularities"
description: "Spatio-temporal patterns such as: pandemic waves
(synchronous level escalations), geographic clustering of behaviour
types, propagation directions, and countries with atypical
trajectories."
# ============================================================
# STAGE 9: RELATE TO ANTI-PANDEMIC POLICIES
# ============================================================
transform T15_characterise_policy_context :
intent: characterise
manner: "temporal-overlay"
input: D_episodes, D_policies
output: F_active_policies
actor: machine
description: "For each episode, determine which anti-pandemic policies
were active (temporally overlapping) in the same country during
that episode."
artifact F_active_policies : feature(D_episodes)
value structure: list
value type: categorical
representation form: "list of active policy types per episode"
description: "Set of anti-pandemic measures active during each episode,
enabling analysis of policy–behaviour associations."
transform T16_vis_combined :
intent: visualise
input: D_episodes, D_policies, F_pattern_labels, F_active_policies
output: V_combined
actor: machine
description: "Create a combined visualisation juxtaposing behaviour
pattern timelines with policy measure timelines for each country."
artifact V_combined : visualisation(D_episodes, D_policies, F_pattern_labels)
layout: "aligned dual-track timelines (one pair of tracks per country)"
form: "coloured segments with policy annotation bars"
encoding: "upper track: behaviour pattern episodes (colour = pattern type);
lower track: policy measures (distinct marks/colours per policy type);
horizontal axis: time; vertical grouping: countries"
description: "Combined view enabling visual comparison of pandemic
behaviour episodes and policy measures for each country over time."
transform T17_vis_policy_effect :
intent: visualise
input: D_episodes, D_policies, F_pattern_labels, F_active_policies
output: V_policy_analysis
actor: machine
description: "Create visualisations supporting policy–effect analysis:
e.g., distributions of behaviour patterns under different policy
combinations, transition analysis showing which pattern follows which
after policy introduction/removal."
artifact V_policy_analysis : visualisation(D_episodes, F_active_policies,
F_pattern_labels)
layout: "small multiples or matrix layout"
form: "bar charts, transition diagrams, or heatmaps"
encoding: "policy combination × behaviour pattern frequency; or
before/after policy change → pattern transition probabilities"
description: "Analytical views supporting inference about relationships
between policy measures and pandemic behaviour patterns."
# ============================================================
# STAGE 10: GENERATE KNOWLEDGE
# ============================================================
transform T18_analyse_policy_relations :
intent: abstract
manner: "perception-and-interpretation"
input: V_combined, V_policy_analysis, P_spatiotemporal
output: P_policy_behaviour
actor: human
description: "Identify regularities in the relationship between policy
measures and behaviour pattern transitions: which policies precede
shifts toward lower levels or decreasing trends; which policy
combinations co-occur with which patterns; differences across
countries."
artifact P_policy_behaviour : pattern(V_combined, V_policy_analysis,
D_policies, D_episodes)
representation form: "association rules and observed regularities"
description: "Patterns linking anti-pandemic policies to pandemic
behaviour: e.g., 'introduction of BanOnAllEvents is typically
followed within 2–3 weeks by a transition to decreasing trend';
'countries with early school closure experienced lower peak levels'."
transform T19_generate_knowledge :
intent: generate-knowledge
manner: "formulate-statements"
input: P_spatiotemporal, P_policy_behaviour, V_combined,
V_policy_analysis, V_timeline, V_map
output: K_findings
actor: human
description: "Synthesise findings about (1) the spatio-temporal dynamics
of COVID-19 in Europe, (2) the effectiveness and timing of different
policy measures, and (3) cross-country similarities and differences."
artifact K_findings : knowledge(P_spatiotemporal, P_policy_behaviour,
D_episodes, D_policies)
representation form: "statements, hypotheses, and summary"
description: "Consolidated findings: (1) characterisation of pandemic
waves across Europe (timing, severity, geographic spread);
(2) observed associations between policy measures and subsequent
behaviour pattern transitions; (3) country clusters with similar
pandemic trajectories and policy strategies; (4) hypotheses about
policy effectiveness requiring further validation."
| Stage | Intent | Key Input | Key Output | Actor |
|---|---|---|---|---|
| 1 | characterise (smooth) | D_countries, S_smoothing | F_smoothed | machine |
| 2 | characterise + generate-knowledge | F_smoothed | S_levels (thresholds) | hybrid |
| 3 | characterise (classify) | F_smoothed, S_levels, S_trend | F_levels, F_trends | machine |
| 4 | define-unit (segment) | D_countries, F_levels, F_trends | D_episodes | machine |
| 5 | abstract | D_episodes | P_behaviour_patterns | hybrid |
| 6 | loop: assess + refine | V_episodes_check, S_levels | refined S_levels, S_trend | human |
| 7 | contextualise + visualise | D_episodes, D_map | V_timeline, V_map | machine |
| 8 | abstract (perceive) | V_timeline, V_map | P_spatiotemporal | human |
| 9 | characterise + visualise | D_episodes, D_policies | V_combined, V_policy_analysis | machine |
| 10 | abstract + generate-knowledge | all visualisations, patterns | K_findings | human |
Smoothing before segmentation ensures that reporting artifacts (weekend drops, Monday peaks) do not create spurious short episodes at level/trend boundaries.
Data-driven thresholds (Stage 2) use the pooled distribution of smoothed values across all countries to define level boundaries, ensuring comparability across the continent.
The iterative loop (Stage 6) allows the analyst to refine parameters until the segmentation produces meaningful, interpretable episodes — not too short (over-fragmented) nor too long (missing transitions).
Dual abstraction steps: first extracting behaviour pattern types from episodes (computational), then perceiving higher-order spatio-temporal regularities from visualisations (human) — captures both levels of pattern recognition.
Policy overlay is handled by temporal alignment (characterise) followed by combined visualisation, rather than by statistical modelling, reflecting the exploratory visual analytics approach and the difficulty of establishing causal claims from observational data.
The user wants me to design a visual analytics workflow for analyzing COVID-19 pandemic data for European countries. Let me break down the task: 1. **Input data**: - `eu.csv`: Daily time series of new cases and deaths per 100,000 population for European countries (from 15-02-2020 to 30-06-2021) - `responses.csv`: Anti-pandemic policy data with country, policy type, start date, and end date 2. **Goals**: - Smooth out reporting-related fluctuations (weekend drops, Monday peaks) - Extract episodes of different disease levels (very low to very high, intervals defined from data) - Identify trends like rising, stable, or decreasing patterns - Understand how pandemic behaviors vary across space and time - Connect these patterns back to the specific policies each country implemented I'm looking at relevant workflow patterns from the library—particularly the progressive abstraction approach for temporal data with symbolic encoding and topic modeling, plus the spatio-temporal analysis methods for clustering and modeling spatial time series. My workflow starts with data preparation by loading COVID and policy datasets, then smoothing the time series with a moving average to eliminate reporting noise. Next I'll classify each period into disease severity levels based on data distribution quantiles, then extract trend directions over rolling windows to capture whether cases are rising, holding steady, or declining. I'll combine these level and trend classifications into distinct episodes where conditions remain relatively stable, with each episode tagged by country, timespan, severity level, and direction. Then I can visualize these episodes spatially and temporally to spot which countries followed similar pandemic trajectories and when waves synchronized across regions. Finally, I'll layer the policy data on top to see how interventions correlate with shifts in disease levels and trends, revealing which policies appear most effective. Now I'm formatting this as an ATWL document.
This workflow analyses COVID-19 daily time series (cases and deaths per 100,000) across European countries to extract meaningful pandemic behaviour episodes and relate them to anti-pandemic policies. The workflow proceeds through six main phases:
Data preparation and smoothing: Raw daily time series are smoothed (7-day moving average) to eliminate reporting-related fluctuations (weekend drops, Monday peaks). The analyst visually assesses smoothing adequacy.
Level classification: Data-driven value breaks (e.g., via quantile or natural breaks methods) partition the continuous incidence values into discrete disease levels (very low, low, moderate, high, very high). The analyst iteratively refines break definitions until they produce interpretable, domain-meaningful level categories.
Trend extraction: Local trends (rising, stable, decreasing) are computed over sliding windows on the smoothed series. Combined with levels, each time point receives a composite state label (level × trend).
Episode segmentation: Consecutive time points sharing the same composite state are merged into episodes. Short transitional episodes may be merged with neighbours. The result is a compact sequence of typed episodes per country.
Spatio-temporal pattern analysis: Episodes are visualised in temporal (timeline) and spatial (map) contexts. Countries are clustered by similarity of their episode sequences, revealing synchronous waves, regional groupings, and outlier trajectories.
Policy relation analysis: Policy interventions are overlaid on episode timelines. Temporal associations between policy onsets/offsets and level/trend transitions are explored, leading to insights about policy effectiveness patterns.
workflow covid-pandemic-behaviour-policy-analysis
template: define-unit (prepare) → characterise (smooth) → visualise → assess →
loop(characterise (classify levels) → visualise → assess) →
characterise (trends) → define-unit (segment episodes) →
visualise → assess →
loop(define-unit (cluster countries) → contextualise → visualise → assess) →
contextualise (policy overlay) → visualise → abstract →
generate-knowledge
description: "Analyse COVID-19 daily time series for European countries:
smooth reporting artifacts, extract disease level episodes and trends,
analyse spatio-temporal distribution of pandemic behaviour patterns,
and relate them to anti-pandemic policies"
# ============================================================================
# INPUT ARTIFACTS
# ============================================================================
artifact D_covid_raw : entities
origin: given
internal structure: elementary
embedment: {set, time, space}
features:
- id: f_country_id
value structure: atomic
value type: categorical
description: "Country identifier (ISO code)"
- id: f_coordinates
value structure: vector
value type: spatial
description: "Capital coordinates (X, Y)"
- id: f_population
value structure: atomic
value type: numeric
description: "Country population"
- id: f_new_cases
value structure: vector
value type: numeric
description: "Daily new cases per 100,000 population"
- id: f_deaths
value structure: vector
value type: numeric
description: "Daily deaths per 100,000 population"
description: "COVID-19 daily time series for European countries from
eu.csv, covering 15-02-2020 to 30-06-2021, with geographic
coordinates and population"
artifact D_policies : entities
origin: given
internal structure: elementary
embedment: {set, time}
features:
- id: f_country
value structure: atomic
value type: categorical
description: "Country name"
- id: f_policy_type
value structure: atomic
value type: categorical
description: "Type of anti-pandemic policy"
- id: f_start_date
value structure: atomic
value type: temporal
description: "Policy start date"
- id: f_end_date
value structure: atomic
value type: temporal
description: "Policy end date"
description: "Anti-pandemic policy interventions from responses.csv:
country, policy type, and active period"
# ============================================================================
# PHASE 1: DATA PREPARATION AND SMOOTHING
# ============================================================================
transform T_parse_timeseries :
intent: define-unit
manner: "parse CSV columns into structured time series per country"
input: D_covid_raw
output: D_countries
actor: machine
description: "Parse raw data into country-level entities each
containing two time series (cases and deaths) with proper
temporal indexing"
artifact D_countries : entities
internal structure: elementary
embedment: {set, time, space}
features:
- id: f_cases_ts
value structure: vector
value type: numeric
description: "Daily new cases per 100,000 time series"
- id: f_deaths_ts
value structure: vector
value type: numeric
description: "Daily deaths per 100,000 time series"
- id: f_geo
value structure: vector
value type: spatial
description: "Country geographic coordinates"
description: "European countries with parsed daily COVID-19 time
series and geographic positions"
artifact S_smoothing : specification
origin: given
representation form: "parameter settings"
description: "Smoothing parameters: window size (default 7 days for
weekly cycle removal), method (moving average or LOESS)"
transform T_smooth :
intent: characterise
manner: "apply moving average or local regression to remove
reporting-cycle fluctuations"
input: D_countries, S_smoothing
output: F_smoothed_cases, F_smoothed_deaths
actor: machine
description: "Smooth daily time series to eliminate weekend drops
and Monday peaks while preserving genuine epidemic dynamics"
artifact F_smoothed_cases : feature(D_countries)
value structure: vector
value type: numeric
description: "Smoothed daily new cases per 100,000, free of
reporting-cycle artifacts"
artifact F_smoothed_deaths : feature(D_countries)
value structure: vector
value type: numeric
description: "Smoothed daily deaths per 100,000, free of
reporting-cycle artifacts"
transform T_vis_smoothing :
intent: visualise
manner: "overlay raw and smoothed time series"
input: D_countries, F_smoothed_cases, F_smoothed_deaths
output: V_smoothing
actor: machine
description: "Display raw and smoothed time series side by side for
selected countries to assess smoothing adequacy"
artifact V_smoothing : visualisation(D_countries, F_smoothed_cases)
layout: "time graph panels per selected country"
form: "overlaid line graphs"
encoding: "x-axis: time; y-axis: incidence value; grey: raw series;
coloured: smoothed series"
description: "Comparison of raw and smoothed time series showing
artifact removal while preserving epidemic dynamics"
transform T_assess_smoothing :
intent: assess
manner: "evaluate whether reporting artifacts are removed without
over-smoothing genuine dynamics"
input: V_smoothing, S_smoothing
output: K_smoothing_quality
actor: human
description: "Assess smoothing quality: reporting fluctuations
eliminated, epidemic peaks and troughs preserved, no excessive lag"
artifact K_smoothing_quality : knowledge(F_smoothed_cases)
representation form: "quality judgment"
description: "Assessment of smoothing adequacy; if unsatisfactory,
adjust S_smoothing parameters and repeat"
# ============================================================================
# PHASE 2: DISEASE LEVEL CLASSIFICATION
# ============================================================================
artifact S_level_params : specification
origin: given
representation form: "parameter settings"
description: "Parameters for level classification: number of levels
(default 5: very low, low, moderate, high, very high), method for
determining breaks (quantile, natural breaks/Jenks, domain-defined),
whether to use pooled or per-country distributions"
loop L_level_definition:
purpose: "Iteratively define disease level breaks from data until
level categories are interpretable and domain-meaningful"
until: "Level breaks produce interpretable categories that align with
epidemiological understanding of pandemic severity"
body:
transform T_compute_breaks :
intent: characterise
manner: "compute value distribution and determine break points
using specified method"
input: F_smoothed_cases, F_smoothed_deaths, S_level_params
output: F_level_breaks, F_level_labels
actor: machine
description: "Analyse pooled value distribution across all
countries; compute break points separating disease levels;
assign level labels to each day of each country's time series"
artifact F_level_breaks : feature(D_countries)
value structure: vector
value type: numeric
description: "Threshold values separating disease levels, derived
from data distribution (e.g., quantiles of non-zero values
across all countries)"
artifact F_level_labels : feature(D_countries)
value structure: vector
value type: categorical
description: "Daily disease level classification for each country:
very low, low, moderate, high, very high"
transform T_vis_levels :
intent: visualise
manner: "colour-coded time series with level bands and histogram
of values with break lines"
input: D_countries, F_smoothed_cases, F_level_breaks, F_level_labels
output: V_levels
actor: machine
description: "Display time series with background colours
indicating levels, and value distribution histogram with break
lines, for assessment of level definitions"
artifact V_levels : visualisation(D_countries, F_level_labels,
F_level_breaks)
layout: "time series panel with distribution histogram"
form: "line graphs with coloured background bands; histogram
with vertical break lines"
encoding: "x-axis: time; y-axis: incidence; background colour:
disease level; histogram: value distribution with marked breaks"
description: "Time series with level colouring and value
distribution showing how breaks partition the data"
transform T_assess_levels :
intent: assess
manner: "evaluate whether level categories are meaningful and
well-separated"
input: V_levels, F_level_breaks, F_level_labels
output: K_level_quality
actor: human
description: "Assess level definitions: do categories correspond
to epidemiologically meaningful severity stages? Are breaks
well-placed relative to the distribution? Are there too
many/few level transitions?"
artifact K_level_quality : knowledge(F_level_breaks)
representation form: "quality judgment"
description: "Assessment of level break quality: meaningfulness,
separation, stability, and whether adjustment is needed"
if K_level_quality indicates refinement needed:
then:
transform T_adjust_levels :
intent: generate-knowledge
manner: "adjust break method, number of levels, or manual
thresholds"
input: K_level_quality, V_levels, S_level_params
output: S_level_params'
actor: human
description: "Modify level classification parameters based on
assessment"
artifact S_level_params' : specification
representation form: "parameter settings"
description: "Updated level classification parameters"
assign:
S_level_params := S_level_params'
else:
exit loop L_level_definition
end loop L_level_definition
# ============================================================================
# PHASE 3: TREND EXTRACTION
# ============================================================================
artifact S_trend_params : specification
origin: given
representation form: "parameter settings"
description: "Trend computation parameters: window size for slope
estimation, thresholds for classifying slope as rising/stable/
decreasing (e.g., relative change thresholds)"
transform T_compute_trends :
intent: characterise
manner: "compute local slope over sliding window; classify as
rising, stable, or decreasing based on thresholds"
input: F_smoothed_cases, F_smoothed_deaths, S_trend_params
output: F_trend_labels
actor: machine
description: "For each day and country, estimate local trend
direction from the smoothed series slope over a window and
classify into rising/stable/decreasing"
artifact F_trend_labels : feature(D_countries)
value structure: vector
value type: categorical
description: "Daily trend classification for each country:
rising, stable, or decreasing"
transform T_compose_states :
intent: characterise
manner: "combine level and trend into composite state label"
input: F_level_labels, F_trend_labels
output: F_composite_states
actor: machine
description: "Create composite daily state by combining disease
level and trend direction (e.g., 'high-rising', 'moderate-stable')"
artifact F_composite_states : feature(D_countries)
value structure: vector
value type: categorical
description: "Daily composite state labels combining disease level
and trend direction for each country"
# ============================================================================
# PHASE 4: EPISODE SEGMENTATION
# ============================================================================
transform T_segment_episodes :
intent: define-unit
manner: "merge consecutive days with identical composite state into
episodes; optionally merge short transitional episodes with
neighbours"
input: D_countries, F_composite_states, F_smoothed_cases
output: D_episodes
actor: machine
description: "Segment each country's time series into contiguous
episodes of uniform pandemic behaviour (same level + trend);
filter out very short transitional episodes by merging with
adjacent dominant state"
artifact D_episodes : entities
internal structure: episode
embedment: {set, time, space}
features:
- id: f_country
value structure: atomic
value type: categorical
description: "Country identifier"
- id: f_time_span
value structure: vector
value type: temporal
description: "Episode start and end dates"
- id: f_level
value structure: atomic
value type: categorical
description: "Disease level during episode"
- id: f_trend
value structure: atomic
value type: categorical
description: "Trend direction during episode"
- id: f_composite_state
value structure: atomic
value type: categorical
description: "Combined level-trend state"
- id: f_duration
value structure: atomic
value type: numeric
description: "Episode duration in days"
- id: f_mean_value
value structure: atomic
value type: numeric
description: "Mean incidence during episode"
description: "Pandemic behaviour episodes: contiguous time periods
with uniform disease level and trend for each country"
transform T_vis_episodes :
intent: visualise
manner: "timeline display with episodes as coloured segments;
small multiples per country ordered geographically"
input: D_episodes, D_countries
output: V_episodes
actor: machine
description: "Display episode sequences as colour-coded timeline
strips for all countries, enabling visual comparison of pandemic
trajectories"
artifact V_episodes : visualisation(D_episodes, D_countries)
layout: "small-multiple timelines, one row per country, ordered
by geography (north-south or clustered)"
form: "horizontal coloured bars"
encoding: "x-axis: time; bar colour: disease level (sequential
colour scale); bar pattern/saturation: trend direction;
bar length: episode duration"
description: "Comparative timeline view of pandemic behaviour
episodes across all European countries"
transform T_assess_episodes :
intent: assess
manner: "evaluate episode quality and interpretability"
input: V_episodes, D_episodes
output: K_episode_quality
actor: human
description: "Assess whether episodes are meaningful: not too
fragmented, not over-merged; transitions correspond to
observable pandemic waves"
artifact K_episode_quality : knowledge(D_episodes)
representation form: "quality judgment"
description: "Assessment of episode segmentation quality; may
trigger adjustment of smoothing, level breaks, or trend
parameters if episodes appear fragmented or over-aggregated"
# ============================================================================
# PHASE 5: SPATIO-TEMPORAL PATTERN ANALYSIS
# ============================================================================
artifact S_clustering_params : specification
origin: given
representation form: "parameter settings"
description: "Parameters for clustering countries by episode
sequence similarity: distance measure (edit distance on episode
sequences, or feature-based), number of clusters"
loop L_country_clustering:
purpose: "Iteratively cluster countries by pandemic behaviour
similarity until groups are spatially coherent and
interpretable"
until: "Country groups reveal meaningful spatio-temporal pandemic
behaviour patterns"
body:
transform T_characterise_sequences :
intent: characterise
manner: "encode each country's episode sequence as feature
vector or symbolic string for similarity computation"
input: D_episodes, D_countries
output: F_sequence_features
actor: machine
description: "Derive features characterising each country's
pandemic trajectory: episode sequence encoding, timing of
waves, duration profiles, level distributions"
artifact F_sequence_features : feature(D_countries)
value structure: vector
value type: numeric
description: "Feature vectors encoding pandemic trajectory
characteristics for inter-country comparison"
transform T_cluster_countries :
intent: define-unit
manner: "cluster countries by trajectory similarity"
input: D_countries, F_sequence_features, S_clustering_params
output: D_country_groups, F_country_group_labels
actor: machine
description: "Group countries with similar pandemic behaviour
trajectories using specified clustering approach"
artifact D_country_groups : entities
internal structure: group/cluster
embedment: set
features:
- id: f_group_size
value structure: atomic
value type: numeric
description: "Number of countries in group"
description: "Groups of countries with similar pandemic
behaviour trajectories"
artifact F_country_group_labels : feature(D_countries)
value structure: atomic
value type: categorical
description: "Country cluster membership identifier"
transform T_arrange_spatial :
intent: contextualise
manner: "geographic positioning of countries with cluster
colouring"
input: D_countries, F_country_group_labels
output: A_geographic
actor: machine
description: "Arrange countries in geographic context with
cluster membership for spatial pattern revelation"
artifact A_geographic : arrangement(D_countries)
context: D_countries
principle: "geographic positioning"
description: "Countries positioned by their geographic
coordinates"
transform T_vis_spatiotemporal :
intent: visualise
manner: "coordinated map and timeline views with cluster
colouring"
input: D_countries, D_episodes, F_country_group_labels,
A_geographic, D_country_groups
output: V_spatiotemporal
actor: machine
description: "Display country clusters on geographic map and
episode timelines grouped by cluster; show cluster-level
representative episode patterns"
artifact V_spatiotemporal : visualisation(D_countries,
D_episodes, F_country_group_labels, A_geographic)
layout: "coordinated views: geographic map, grouped timelines,
cluster summaries"
form: "choropleth map, coloured timeline strips, summary
diagrams"
encoding: "map colour: cluster membership; timeline colour:
disease level; timeline grouping: by cluster; summary:
modal episode sequences per cluster"
description: "Coordinated spatio-temporal views showing
geographic distribution of pandemic behaviour groups and
their characteristic episode sequences"
transform T_assess_clustering :
intent: assess
manner: "evaluate spatial coherence and interpretability of
country groups"
input: V_spatiotemporal, D_country_groups
output: K_clustering_quality
actor: human
description: "Assess whether country groups form spatially
coherent regions with interpretable pandemic behaviour
differences; evaluate number of clusters"
artifact K_clustering_quality : knowledge(D_country_groups)
representation form: "quality judgment"
description: "Assessment of country clustering quality:
spatial coherence, trajectory similarity within groups,
distinctiveness between groups"
if K_clustering_quality indicates refinement needed:
then:
transform T_adjust_clustering :
intent: generate-knowledge
manner: "adjust clustering parameters"
input: K_clustering_quality, V_spatiotemporal,
S_clustering_params
output: S_clustering_params'
actor: human
description: "Modify number of clusters, distance
measure, or feature selection"
artifact S_clustering_params' : specification
representation form: "parameter settings"
description: "Updated clustering parameters"
assign:
S_clustering_params := S_clustering_params'
else:
exit loop L_country_clustering
end loop L_country_clustering
# ============================================================================
# PHASE 6: POLICY RELATION ANALYSIS
# ============================================================================
transform T_prepare_policies :
intent: characterise
manner: "parse policy data and align with episode timeline"
input: D_policies, D_episodes, D_countries
output: F_policy_context
actor: machine
description: "For each country and time period, determine which
policies were active; compute policy change events (onsets and
offsets); align policy timeline with episode boundaries"
artifact F_policy_context : feature(D_episodes)
value structure: vector
value type: {categorical, temporal}
description: "Active policies during each episode and policy
change events (onsets/offsets) near episode boundaries"
transform T_vis_policy_overlay :
intent: visualise
manner: "overlay policy intervals on episode timelines with
aligned event markers"
input: D_episodes, F_policy_context, D_countries,
F_country_group_labels
output: V_policy_episodes
actor: machine
description: "Display episode timelines with policy intervention
periods overlaid; highlight temporal relationships between
policy changes and episode transitions"
artifact V_policy_episodes : visualisation(D_episodes,
F_policy_context)
layout: "timeline per country with policy overlay bands;
countries grouped by behaviour cluster"
form: "coloured episode bars with semi-transparent policy
interval overlays and onset/offset markers"
encoding: "episode colour: disease level; overlay colour: policy
type; markers: policy start/end; grouping: by country cluster"
description: "Integrated visualisation of pandemic behaviour
episodes with anti-pandemic policy interventions showing
temporal co-occurrence and potential causal relationships"
transform T_analyse_associations :
intent: characterise
manner: "compute temporal associations between policy events and
episode transitions"
input: D_episodes, F_policy_context, D_country_groups
output: F_policy_associations
actor: machine
description: "For each policy type, compute statistics on episode
transitions following policy onset: frequency of level
decreases, trend reversals, time lags; compare across country
groups"
artifact F_policy_associations : feature(D_policies)
value structure: vector
value type: numeric
description: "Statistical associations between policy types and
subsequent pandemic behaviour changes: transition frequencies,
average lags, effect sizes by country group"
transform T_vis_associations :
intent: visualise
manner: "display policy-effect association summaries"
input: F_policy_associations, D_country_groups
output: V_associations
actor: machine
description: "Visualise statistical associations between policies
and pandemic behaviour changes across country groups"
artifact V_associations : visualisation(F_policy_associations,
D_country_groups)
layout: "matrix or parallel display: policy types vs. country
groups"
form: "heatmap cells or bar charts"
encoding: "rows: policy types; columns: country groups or time
periods; colour/size: strength of association with level
reduction or trend reversal"
description: "Summary of policy-effect associations showing which
policies correlate with pandemic behaviour improvements and
how effects vary across country groups"
# ============================================================================
# PHASE 7: PATTERN IDENTIFICATION AND KNOWLEDGE SYNTHESIS
# ============================================================================
transform T_identify_patterns :
intent: abstract
manner: "interpret spatio-temporal pandemic behaviour patterns and
policy relationships"
input: V_spatiotemporal, V_policy_episodes, V_associations,
F_policy_associations
output: P_pandemic_patterns
actor: human
description: "Identify key patterns: pandemic wave synchronisation
across regions, characteristic trajectories of country groups,
temporal relationships between policy implementations and
pandemic behaviour changes, differential policy effectiveness"
artifact P_pandemic_patterns : pattern(D_episodes, D_country_groups,
F_policy_context)
representation form: "described patterns with evidence"
description: "Identified patterns: wave timing and synchronisation,
regional groupings of pandemic behaviour, policy-response
relationships, differential effectiveness across contexts"
transform T_synthesise_knowledge :
intent: generate-knowledge
manner: "formulate statements about pandemic dynamics and policy
effects"
input: P_pandemic_patterns, V_spatiotemporal, V_policy_episodes,
V_associations
output: K_findings
actor: human
description: "Synthesise findings about European COVID-19 pandemic
dynamics, spatio-temporal behaviour patterns, and relationships
between anti-pandemic policies and observed pandemic trajectories"
artifact K_findings : knowledge(P_pandemic_patterns)
representation form: "statements, explanations, and
illustrative visualisations"
description: "Understanding of European COVID-19 dynamics:
identified pandemic waves and their spatio-temporal propagation,
country groupings by behaviour similarity, relationships between
policy interventions and subsequent pandemic behaviour changes,
contextual factors influencing policy effectiveness"
┌─────────────────────────────────────────────────────────────────────────────┐
│ │
│ D_covid_raw ──► T_parse ──► D_countries │
│ (eu.csv) │
│ │
│ D_policies │
│ (responses.csv) │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 1: SMOOTHING │
│ │
│ D_countries + S_smoothing ──► T_smooth ──► F_smoothed_cases/deaths │
│ │ │
│ T_vis_smoothing ──► V_smoothing │
│ │ │
│ T_assess_smoothing ──► K_smoothing_quality │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 2: LEVEL CLASSIFICATION (Loop) │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ F_smoothed + S_level_params ──► T_compute_breaks ──► F_levels │ │
│ │ │ │ │
│ │ T_vis_levels ──► T_assess_levels ──► Refine? ──yes──► adjust │ │
│ │ │ │ │ │
│ │ no ◄─────────────────────────┘ │ │
│ └──────────────────────────────┼───────────────────────────────────┘ │
└─────────────────────────────────┼───────────────────────────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 3: TREND EXTRACTION │
│ │
│ F_smoothed ──► T_compute_trends ──► F_trend_labels │
│ │ │
│ F_level_labels + F_trend_labels ──► T_compose_states ──► F_composite │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 4: EPISODE SEGMENTATION │
│ │
│ F_composite_states ──► T_segment ──► D_episodes │
│ │ │
│ T_vis_episodes ──► T_assess_episodes │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 5: SPATIO-TEMPORAL CLUSTERING (Loop) │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ D_episodes ──► T_characterise ──► T_cluster_countries │ │
│ │ │ │ │
│ │ T_vis_spatiotemporal ──► T_assess ──► Refine? ──yes──► adjust │ │
│ │ │ │ │
│ │ no │ │
│ └──────────────────────────────┼───────────────────────────────────┘ │
└─────────────────────────────────┼───────────────────────────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 6: POLICY RELATION │
│ │
│ D_policies + D_episodes ──► T_prepare_policies ──► F_policy_context │
│ │ │
│ T_vis_policy_overlay ──► V_policy_episodes │
│ T_analyse_associations ──► F_policy_associations │
│ T_vis_associations ──► V_associations │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 7: KNOWLEDGE SYNTHESIS │
│ │
│ All views ──► T_identify_patterns ──► P_pandemic_patterns │
│ │ │
│ T_synthesise_knowledge ──► K_findings │
└─────────────────────────────────────────────────────────────────────────────┘
| Phase | Closest Library Reference | Key Adaptation |
|---|---|---|
| Smoothing | 1.12 (ST modelling: data preparation) | 7-day window targets known reporting cycle |
| Level classification | 1.10 (Episodes & Topics: symbolic encoding loop) | Data-driven breaks instead of predefined SAX alphabet |
| Trend extraction | 1.10 (Phase 1: characterise temporal variation) | Slope-based categorisation into 3 trend types |
| Episode segmentation | 1.10 (define-unit: temporal segmentation) | Composite state merging replaces fixed-window episodes |
| Country clustering | 1.12 (grouping loop) + 1.3 (MobilityGraphs temporal clustering) | Edit-distance on episode sequences for trajectory similarity |
| Policy overlay | 1.10 (Phase 3: distribution in context) | Policy intervals as external context for episode distributions |
| Knowledge synthesis | Common across all library workflows | Integrates spatio-temporal patterns with policy associations |
The user wants me to design a visual analytics workflow using ATWL (Artifact–Transform Workflow Language) for analyzing Google COVID-19 data for European countries. The workflow should: 1. Analyze daily time series of new cases and deaths per 100,000 population 2. Extract episodes of different disease levels (very low to very high, intervals defined from data) 3. Extract trends (rising, stable, decreasing) 4. Disregard reporting-related fluctuations (weekend drops, Monday peaks) 5. Analyze spatio-temporal distribution of pandemic behavior patterns 6. Relate patterns to countries' anti-pandemic policies Let me design a comprehensive ATWL workflow for this task. I'm working with two datasets: the EU COVID time series spanning from February 2020 through June 2021 with daily case and death rates per 100K, and a separate policy dataset tracking intervention types and their date ranges by country. My approach will involve loading both datasets, applying a 7-day moving average to smooth out reporting artifacts like weekend dips and Monday spikes, then establishing disease level thresholds derived from the data itself to classify each day into categories ranging from very low to very high. From there, I'll compute trend directions (rising, stable, or decreasing) from the smoothed values and segment the time series into distinct episodes where the level and trend combination remains consistent. Once I've characterized these episodes by their properties—duration, intensity, trajectory—I can place them in their geographic and temporal context, visualize the spatio-temporal patterns across maps and timelines, and finally overlay the policy data to see how interventions correlate with the observed disease dynamics and identify broader patterns. Continuing with the spatial-temporal analysis to map episodes across countries and time, then integrating policy data to understand how interventions correlate with pattern shifts. I'm recognizing this will be iterative—the smoothing parameters, level thresholds, and trend detection settings will likely need refinement as I work through the data. Now I'll structure this as a proper workflow specification. Defining the workflow template...
workflow covid-pandemic-behaviour-analysis
template: characterise (smooth) →
loop(generate-knowledge (define thresholds) →
characterise (classify levels and trends) →
define-unit (extract episodes) →
characterise (episodes) →
contextualise →visualise →assess) →
characterise (policy alignment) →
contextualise (spatio-temporal) →visualise →
abstract →generate-knowledge
description: "Analyse spatio-temporal distribution of COVID-19 pandemic
behaviour patterns across European countries by extracting episodes of
different disease levels and trends from smoothed time series, and
relating identified patterns to anti-pandemic policy measures"
# ============================================================================
# INPUT ARTIFACTS
# ============================================================================
artifact D_country_series : entities
origin: given
internal structure: elementary
embedment: {set, time, space}
features:
- id: f_new_cases
value structure: vector
value type: numeric
description: "Daily new cases per 100,000 population"
- id: f_deaths
value structure: vector
value type: numeric
description: "Daily deaths per 100,000 population"
- id: f_population
value structure: atomic
value type: numeric
description: "Country population"
- id: f_coordinates
value structure: vector
value type: spatial
description: "Capital coordinates (X, Y)"
description: "Daily COVID-19 time series for European countries from
2020-02-15 to 2021-06-30, with new cases and deaths per 100,000
population; each entity is one country with its full temporal record"
artifact D_policies : entities
origin: given
internal structure: elementary
embedment: {set, time}
features:
- id: f_country
value structure: atomic
value type: categorical
description: "Country name"
- id: f_policy_type
value structure: atomic
value type: categorical
description: "Type of anti-pandemic policy measure"
- id: f_start_date
value structure: atomic
value type: temporal
description: "Policy start date"
- id: f_end_date
value structure: atomic
value type: temporal
description: "Policy end date"
description: "Anti-pandemic policy measures with country, type, and
active time interval from responses.csv"
artifact D_map : entities
origin: given
internal structure: elementary
embedment: space
features:
- id: f_geometry
value structure: atomic
value type: spatial
description: "Country boundary geometry"
description: "Geographic map of European countries providing spatial
context for visualisation"
# ============================================================================
# PHASE 1: SMOOTHING TO REMOVE REPORTING ARTIFACTS
# ============================================================================
transform T_smooth :
intent: characterise
manner: "temporal smoothing with 7-day rolling average"
input: D_country_series
output: F_smoothed
actor: machine
description: "Apply 7-day centred moving average to new cases and deaths
time series for each country to eliminate reporting-related fluctuations
such as weekend drops and Monday peaks"
artifact F_smoothed : feature(D_country_series)
value structure: vector
value type: numeric
representation form: "smoothed daily time series per country"
description: "Smoothed time series of new cases and deaths per 100,000
with weekly reporting cycle artifacts removed"
# ============================================================================
# PHASE 2: LEVEL AND TREND DEFINITION, EPISODE EXTRACTION (iterative)
# ============================================================================
artifact S_classification : specification
origin: given
representation form: "parameter settings"
description: "Initial parameters for level and trend classification:
number of disease levels (e.g., 5: very low, low, moderate, high,
very high), method for determining level boundaries (e.g., quantiles
or natural breaks on pooled distribution), trend detection window
length, and slope thresholds for rising/stable/decreasing"
loop L_episode_refinement:
purpose: "Iteratively refine level thresholds, trend parameters, and
episode extraction until episodes are interpretable, temporally
coherent, and suitable for spatio-temporal pattern analysis"
until: "Disease levels correspond to meaningful pandemic severity
distinctions; trends are robust; episodes are neither too short
nor too fragmented for meaningful analysis"
body:
# ========================================================================
# Step 2a: Define level thresholds from data distribution
# ========================================================================
transform T_define_thresholds :
intent: generate-knowledge
manner: "determine classification boundaries from data distribution"
input: F_smoothed, S_classification
output: S_thresholds
actor: hybrid
description: "Analyse the distribution of smoothed case and death
values pooled across all countries and time points; determine
breakpoints for disease levels (e.g., using quantiles, natural
breaks, or domain-informed thresholds); specify slope thresholds
for trend categories"
artifact S_thresholds : specification
representation form: "threshold values and rules"
description: "Defined breakpoints separating disease levels (e.g.,
boundaries between very low/low/moderate/high/very high for cases
and deaths) and slope thresholds separating rising/stable/decreasing
trends"
# ========================================================================
# Step 2b: Classify daily values into levels and trends
# ========================================================================
transform T_classify_levels :
intent: characterise
manner: "assign ordinal disease level based on smoothed value and
thresholds"
input: D_country_series, F_smoothed, S_thresholds
output: F_level_labels
actor: machine
description: "Classify each day for each country into a disease level
category based on the smoothed value relative to defined thresholds"
artifact F_level_labels : feature(D_country_series)
value structure: vector
value type: ordinal
representation form: "daily level time series per country"
description: "Ordinal disease level for each country-day (e.g., very
low, low, moderate, high, very high) based on smoothed new cases"
transform T_compute_trends :
intent: characterise
manner: "compute local slope over sliding window and classify trend
direction"
input: D_country_series, F_smoothed, S_thresholds
output: F_trend_labels
actor: machine
description: "Compute local trend from smoothed time series using a
sliding window; classify each day as rising, stable, or decreasing
based on slope relative to defined thresholds"
artifact F_trend_labels : feature(D_country_series)
value structure: vector
value type: categorical
representation form: "daily trend time series per country"
description: "Trend direction (rising, stable, decreasing) for each
country-day based on local slope of smoothed values"
# ========================================================================
# Step 2c: Extract episodes of consistent level and trend
# ========================================================================
transform T_extract_episodes :
intent: define-unit
manner: "time-partitioning by constancy of level and trend"
input: D_country_series, F_level_labels, F_trend_labels
output: D_episodes, F_episode_membership
actor: machine
description: "Segment each country's time series into maximal
consecutive intervals where both disease level and trend direction
remain constant; each resulting interval is an episode"
artifact D_episodes : entities
internal structure: episode
embedment: {set, time, space}
features:
- id: f_country
value structure: atomic
value type: categorical
description: "Country identifier"
- id: f_level
value structure: atomic
value type: ordinal
description: "Disease level during episode"
- id: f_trend
value structure: atomic
value type: categorical
description: "Trend direction during episode"
- id: f_start
value structure: atomic
value type: temporal
description: "Episode start date"
- id: f_end
value structure: atomic
value type: temporal
description: "Episode end date"
description: "Temporal episodes of consistent pandemic behaviour
(level + trend) for each country"
artifact F_episode_membership : feature(D_country_series)
value structure: vector
value type: reference
description: "Mapping from each country-day to its containing episode"
# ========================================================================
# Step 2d: Characterise episodes
# ========================================================================
transform T_characterise_episodes :
intent: characterise
manner: "compute summary statistics per episode"
input: D_episodes, F_smoothed
output: F_episode_stats
actor: machine
description: "Compute episode duration, mean and peak case rate,
cumulative cases, mean death rate, and rate of change"
artifact F_episode_stats : feature(D_episodes)
value structure: vector
value type: numeric
description: "Episode summary statistics: duration in days, mean
smoothed case rate, peak case rate, cumulative cases, mean death
rate, and average slope"
# ========================================================================
# Step 2e: Contextualise and visualise episodes
# ========================================================================
transform T_arrange_episodes :
intent: contextualise
manner: "space-time arrangement on map and timeline"
input: D_episodes, D_map
output: A_episodes_spacetime
actor: machine
description: "Arrange episodes in a spatio-temporal context with
countries positioned geographically and episodes placed along
time axis"
artifact A_episodes_spacetime : arrangement(D_episodes)
context: D_map
principle: "geographic position by country; temporal position by
episode time interval"
description: "Spatio-temporal arrangement of episodes for
coordinated map and timeline display"
transform T_visualise_episodes :
intent: visualise
manner: "space-time display with level and trend encoding"
input: A_episodes_spacetime, D_episodes, F_episode_stats
output: V_episodes
actor: machine
description: "Display episodes as coloured segments on country
timelines arranged geographically; colour encodes disease level,
pattern/hatching encodes trend direction"
artifact V_episodes : visualisation(A_episodes_spacetime, D_episodes)
layout: "geographic map with aligned timeline strips per country"
form: "coloured temporal segments with trend indicators"
encoding: "position: country on map, time on horizontal axis;
colour: disease level (gradient from green=very low to red=very
high); pattern or arrow overlay: trend direction (rising/stable/
decreasing); segment width: episode duration"
description: "Spatio-temporal overview of pandemic behaviour episodes
across European countries showing level and trend patterns"
# ========================================================================
# Step 2f: Assess episode quality
# ========================================================================
transform T_assess_episodes :
intent: assess
manner: "evaluate interpretability and coherence of episodes"
input: V_episodes, D_episodes, F_episode_stats, S_thresholds
output: K_episode_quality
actor: human
description: "Assess whether level boundaries produce meaningful
severity distinctions; whether episodes are temporally coherent
(not too fragmented); whether trend detection captures genuine
changes without noise-induced oscillations"
artifact K_episode_quality : knowledge(D_episodes)
representation form: "quality judgment"
description: "Assessment of episode extraction quality: whether
level thresholds are meaningful, trends are robust, and episodes
are sufficiently coherent and interpretable for pattern analysis"
if K_episode_quality indicates refinement needed:
then:
transform T_adjust_classification :
intent: generate-knowledge
manner: "adjust level boundaries and trend parameters"
input: K_episode_quality, V_episodes, S_classification
output: S_classification'
actor: human
description: "Adjust number of levels, threshold method, trend
window length, slope thresholds, or minimum episode duration
based on assessment"
artifact S_classification' : specification
representation form: "parameter settings"
description: "Updated classification parameters after refinement"
assign:
S_classification := S_classification'
else:
exit loop L_episode_refinement
end loop L_episode_refinement
# ============================================================================
# PHASE 3: DEFINE BEHAVIOUR PATTERNS
# ============================================================================
transform T_define_patterns :
intent: abstract
manner: "enumerate and name level-trend combinations as behaviour types"
input: D_episodes, V_episodes, F_episode_stats
output: P_behaviour_types
actor: human
description: "Identify the set of distinct pandemic behaviour patterns
from observed level-trend combinations; assign descriptive names
(e.g., 'rapid escalation' for high+rising, 'plateau' for high+stable,
'recovery' for moderate+decreasing)"
artifact P_behaviour_types : pattern(D_episodes)
representation form: "named behaviour type catalogue"
description: "Catalogue of pandemic behaviour types defined by
level-trend combinations with descriptive labels characterising
their epidemiological meaning"
transform T_label_episodes :
intent: characterise
manner: "assign behaviour type labels to episodes"
input: D_episodes, P_behaviour_types
output: F_behaviour_label
actor: machine
description: "Label each episode with its corresponding behaviour type
from the pattern catalogue"
artifact F_behaviour_label : feature(D_episodes)
value structure: atomic
value type: categorical
description: "Behaviour type label for each episode from the defined
pattern catalogue"
# ============================================================================
# PHASE 4: POLICY INTEGRATION
# ============================================================================
transform T_align_policies :
intent: characterise
manner: "compute active policy context for each episode"
input: D_episodes, D_policies
output: F_policy_context
actor: machine
description: "For each episode, determine which policy measures were
active during its time interval in the corresponding country;
compute policy intensity (number and types of active measures)"
artifact F_policy_context : feature(D_episodes)
value structure: vector
value type: {categorical, numeric}
description: "Active policy measures during each episode: list of
active policy types, count of active measures, and policy change
indicators (newly introduced or lifted measures)"
transform T_characterise_policy_changes :
intent: characterise
manner: "identify policy transitions at episode boundaries"
input: D_episodes, D_policies, F_policy_context
output: F_policy_transitions
actor: machine
description: "Identify policy changes occurring shortly before or
during each episode; compute lag between policy introduction and
episode onset for temporal relationship analysis"
artifact F_policy_transitions : feature(D_episodes)
value structure: vector
value type: {categorical, temporal, numeric}
description: "Policy transitions associated with each episode:
newly introduced policies, lifted policies, temporal lag between
policy change and behaviour change"
# ============================================================================
# PHASE 5: SPATIO-TEMPORAL PATTERN ANALYSIS
# ============================================================================
transform T_visualise_patterns_map :
intent: visualise
manner: "animated choropleth map with temporal control"
input: D_episodes, F_behaviour_label, D_map, A_episodes_spacetime
output: V_map_animated
actor: machine
description: "Display behaviour types on geographic map with temporal
animation showing how patterns spread across Europe over time"
artifact V_map_animated : visualisation(D_episodes, F_behaviour_label, D_map)
layout: "geographic map of Europe with time slider"
form: "choropleth with animated temporal progression"
encoding: "country fill colour: behaviour type; temporal position:
controlled by time slider or animation; saturation: episode
intensity (mean case rate)"
description: "Animated map showing spatial distribution and temporal
progression of pandemic behaviour patterns across Europe"
transform T_visualise_patterns_timeline :
intent: visualise
manner: "stacked timeline display with policy overlay"
input: D_episodes, F_behaviour_label, F_policy_context,
A_episodes_spacetime
output: V_timeline_policies
actor: machine
description: "Display all countries as parallel timeline strips showing
behaviour type sequences, with policy measures overlaid as markers
or bands"
artifact V_timeline_policies : visualisation(D_episodes, F_behaviour_label,
F_policy_context)
layout: "parallel horizontal timelines, one per country, vertically
ordered by geography or similarity"
form: "coloured segments with policy markers"
encoding: "horizontal position: time; segment colour: behaviour type;
vertical bands or icons: policy introductions and lifts; country
ordering: geographic latitude or behaviour similarity"
description: "Coordinated timeline view showing behaviour episodes
and policy measures for all countries enabling comparison of
policy-behaviour relationships"
transform T_visualise_policy_effect :
intent: visualise
manner: "policy-aligned comparative display"
input: D_episodes, F_behaviour_label, F_policy_transitions,
F_episode_stats
output: V_policy_comparison
actor: machine
description: "Display behaviour patterns before, during, and after
specific policy types across countries to reveal potential policy
effects"
artifact V_policy_comparison : visualisation(D_episodes,
F_policy_transitions)
layout: "matrix with policy types as columns, countries as rows, or
aligned timelines centred at policy introduction dates"
form: "small multiples of behaviour sequences or transition diagrams"
encoding: "colour: behaviour type; temporal alignment: centred at
policy start; rows: countries implementing similar policies"
description: "Comparative view of pandemic behaviour before and after
policy introductions, enabling assessment of policy effectiveness
across countries"
# ============================================================================
# PHASE 6: PATTERN IDENTIFICATION AND KNOWLEDGE GENERATION
# ============================================================================
transform T_identify_spatiotemporal_patterns :
intent: abstract
manner: "perception-and-interpretation of synchronous and sequential
patterns"
input: V_map_animated, V_timeline_policies, V_policy_comparison
output: P_spatiotemporal
actor: human
description: "Identify spatio-temporal regularities: waves propagating
across countries, synchronous transitions, country clusters with
similar behaviour sequences, temporal lags between regions"
artifact P_spatiotemporal : pattern(D_episodes)
representation form: "described spatio-temporal regularities"
description: "Identified spatio-temporal patterns: pandemic waves and
their geographic propagation, country groups with similar epidemic
trajectories, seasonal patterns, and synchronisation phenomena"
transform T_identify_policy_patterns :
intent: abstract
manner: "perception-and-interpretation of policy-behaviour associations"
input: V_timeline_policies, V_policy_comparison, F_policy_transitions
output: P_policy_effects
actor: human
description: "Identify associations between policy measures and
subsequent behaviour changes: which policies precede transitions
to lower levels, typical response delays, differences across
countries"
artifact P_policy_effects : pattern(D_episodes, D_policies)
representation form: "identified policy-behaviour associations"
description: "Observed associations between anti-pandemic policies and
subsequent changes in pandemic behaviour: effective policy
combinations, typical response lags, country-specific differences
in policy effectiveness"
transform T_generate_knowledge :
intent: generate-knowledge
manner: "formulate-statements"
input: P_spatiotemporal, P_policy_effects, P_behaviour_types,
V_map_animated, V_timeline_policies, V_policy_comparison
output: K_findings
actor: human
description: "Synthesise findings about pandemic dynamics in Europe:
how disease levels and trends distributed across space and time,
which policy measures appeared associated with behaviour transitions,
and what spatio-temporal factors (geography, timing, policy
combinations) influenced pandemic trajectories"
artifact K_findings : knowledge(P_spatiotemporal, P_policy_effects)
representation form: "statements, explanations, and recommendations"
description: "Comprehensive understanding of COVID-19 pandemic
behaviour patterns across Europe: identified waves and their
geographic propagation, country typologies based on epidemic
trajectories, observed relationships between policy interventions
and subsequent behaviour changes, and hypotheses about factors
influencing policy effectiveness"
The workflow proceeds through six main phases:
| Phase | Purpose | Key Transforms |
|---|---|---|
| 1. Smoothing | Remove reporting artifacts (weekend/Monday effects) | 7-day moving average |
| 2. Episode extraction (iterative) | Define levels from data, detect trends, segment into episodes | Threshold definition, classification, temporal segmentation |
| 3. Behaviour patterns | Name and catalogue level×trend combinations | Abstraction and labelling |
| 4. Policy integration | Align policy data with episodes | Temporal matching, transition detection |
| 5. Spatio-temporal visualisation | Explore geographic and temporal distribution | Animated maps, timelines with policy overlay |
| 6. Knowledge generation | Identify patterns and policy associations | Interpretation and synthesis |
Key design decisions: