# Victorian election polls 2026 — data dictionary

This file defines every column of `victoria-polls-2026.csv` and every field of `victoria-polls-2026.json`, both of which are generated from the register that the data story at <https://acestrategies.au/victoria-election-polls-2026/> reads. There is no JSON Schema for the register, so this dictionary is written from the files themselves and generated with them, so it cannot describe a column the files no longer carry.

**Register version:** 2026-09-19 (the register's `meta.updated`, which is also the page's last-updated date and the version the Dataset structured data states).

**Generated:** 2026-09-19, from `src/assets/dataviz-v6/assets/data-v6.js`.


**Coverage:** 31 waves from 7 houses, fielded 2025-06-19 to 2026-09-14, plus the 2022-11-26 state election as a baseline row.

**Licence:** the figures are each house's own and are cited row by row; the compilation is published under the terms at <https://acestrategies.au/legal/terms/>.

## How an absent figure is written

A figure a house did not publish is never written as zero, because zero is a reading and an absence is not. The three files write the same absence three ways.

| Where | An absent figure is | Meaning |
| --- | --- | --- |
| The CSV | an empty cell | The house did not publish the figure, did not offer the option, or the figure is not applicable to the row. |
| The JSON | `null`, or the key is absent | The same. A key present with `null` is an absence the register records deliberately; an absent key is one that never applied to the wave. |
| The story page | an em dash, `—` | The same, rendered for reading. |

## The CSV: one row per wave

The first row after the header is the 2022-11-26 state election, carried as the baseline the story measures against; every row after it is a published wave, in the register's own order. The columns are:

### `id`

- **Type:** string
- **Unit:** —
- **Values:** A slug unique in the file, formed as the house's initials, a hyphen, and the fieldwork's year and month in two digits each (for example `rb-2609` is RedBridge / Accent, September 2026). The single row for the baseline election is `election-2022`.
- **Empty:** Never empty.

### `house`

- **Type:** string
- **Unit:** —
- **Values:** The house's display label, one of the seven in the register, or "2022 election" for the baseline row. The register's own keys, which the JSON carries in `polls[].house`, are: newspoll, resolve, redbridge, freshwater, morgan, demosau, yougov.
- **Empty:** Never empty.

### `outlet`

- **Type:** string
- **Unit:** —
- **Values:** The client the wave was published for. A wave that names its own client in the register carries that; otherwise it carries the house's usual client from the house registry. Where a house has polled for more than one client the wave's own always wins.
- **Empty:** Empty where neither the wave nor its house names a client.

### `fieldwork_start`

- **Type:** date
- **Unit:** ISO 8601, YYYY-MM-DD
- **Values:** The first day of fieldwork, as the house published it. On the baseline row it is polling day, 2022-11-26.
- **Empty:** Never empty.

### `fieldwork_end`

- **Type:** date
- **Unit:** ISO 8601, YYYY-MM-DD
- **Values:** The last day of fieldwork, as the house published it, never earlier than `fieldwork_start`. On the baseline row it is polling day.
- **Empty:** Never empty.

### `sample`

- **Type:** integer
- **Unit:** respondents
- **Values:** The sample the house published. A model estimate carries the respondents the model was fitted on, which is not a sample in the same sense; the `is_model` column says which rows those are.
- **Empty:** Empty where the house published no sample, and on the baseline row, which is a count rather than a survey. An empty cell never means zero.

### `coalition`

- **Type:** number
- **Unit:** per cent of the primary vote
- **Values:** 0 to 60, to one decimal place where the house published a decimal. The Liberal and National parties together.
- **Empty:** Empty where the house did not publish the figure.

### `labor`

- **Type:** number
- **Unit:** per cent of the primary vote
- **Values:** 0 to 60, to one decimal place where the house published a decimal.
- **Empty:** Empty where the house did not publish the figure.

### `one_nation`

- **Type:** number
- **Unit:** per cent of the primary vote
- **Values:** 0 to 60, to one decimal place where the house published a decimal. Empty for every wave fielded before the houses began offering One Nation in the Assembly question, and on the baseline row, because One Nation did not contest the 2022 Assembly ballot statewide.
- **Empty:** Empty where the party was not offered or the figure was not published. An empty cell never means zero.

### `greens`

- **Type:** number
- **Unit:** per cent of the primary vote
- **Values:** 0 to 60, to one decimal place where the house published a decimal.
- **Empty:** Empty where the house did not publish the figure.

### `independents`

- **Type:** number
- **Unit:** per cent of the primary vote
- **Values:** 0 to 60. Present only where the house reported independents apart from other candidates; where it is present, `others` excludes it.
- **Empty:** Empty where the house folded independents into `others`, which is the usual case.

### `others`

- **Type:** number
- **Unit:** per cent of the primary vote
- **Values:** 0 to 60. Every other candidate, and independents too wherever `independents` is empty.
- **Empty:** Empty where the house did not publish the figure.

### `tpp_coalition`

- **Type:** number
- **Unit:** per cent, two-party preferred
- **Values:** 30 to 70. The Coalition's share against Labor, by the house's own preference method, which the houses table on the story page states house by house. Labor's share is 100 minus this.
- **Empty:** Empty where the house published no two-party figure. A figure carried forward from an earlier wave would be an assumption rather than a reading, so none is recorded.

### `tpp_labor_v_one_nation`

- **Type:** number
- **Unit:** per cent, two-candidate preferred
- **Values:** 30 to 70. Labor's share of a Labor against One Nation pairing, where the house published one. The Coalition is not in this pairing.
- **Empty:** Empty where the house did not publish the pairing, which is most waves.

### `source`

- **Type:** string
- **Unit:** —
- **Values:** Where the figures in the row were read from: the house's own release or report, or the poll write-ups at The Conversation and The Poll Bludger, with the date of the account. Where two accounts were cross-checked, both are named.
- **Empty:** Never empty.

### `flags`

- **Type:** string
- **Unit:** —
- **Values:** Everything the register records as approximate, inferred, back-calculated or otherwise worth knowing before the row is quoted, as one field with the entries separated by a semicolon and a space. The JSON holds the same entries as an array of strings in `polls[].flags`.
- **Empty:** Empty where nothing about the row is approximate. An empty flags field is a claim that the row is as published.

### `is_model`

- **Type:** boolean
- **Unit:** —
- **Values:** `true` where the row is a model estimate — a multilevel regression and post-stratification model, an MRP — rather than a reading from a poll. The JSON marks the same rows with `model: true` and omits the key elsewhere, the story's register table marks them "MRP model", and the house-effect layer leaves them out on both sides, because a modelled statewide figure is not a house's poll reading. Every other derived layer keeps them.
- **Empty:** Empty where the row is a poll reading, which is every row but the model estimates.

The CSV also carries a blank line and a credit line at its foot, which is not data. A parser should stop at the first empty row.

## How a model estimate is marked

A wave that is a multilevel regression and post-stratification model — an MRP — is not a poll reading, and the files say so three ways: `is_model` is `true` in the CSV, `model` is `true` in the JSON and absent on every other wave, and the story's register table prints "MRP model" beside the house. The register holds 2 of them: `yg-2606` (YouGov MRP) and `rb-2606` (RedBridge / Accent). The house-effect layer leaves them out on both sides — a model is neither given a deviation nor counted in the mean the houses are measured against — and every other derived layer keeps them.

## The JSON: the register whole

`victoria-polls-2026.json` is the register as the page loads it, so it carries everything the CSV does and everything the CSV has no column for. Its top-level keys are:

| Key | Type | What it holds |
| --- | --- | --- |
| `meta` | object | The story's title and subtitle, its published and updated dates, the local Melbourne time of the last change, the election date and the Victorian Electoral Commission's timetable, the 2022 baseline it measures against, and `houses`, the number of houses with a wave in the register. |
| `updates` | array | The update log, newest first. Each entry has a `date`, a one-sentence `note`, and, where the entry added a wave, that wave's `id` in `wave`. |
| `results` | object or null | The count on election night, entered by hand from the tally room. `null` until the count begins. |
| `parties` | array | The five parties the story charts, each with an `id` used as a key throughout, a `label` for prose and a `short` label for table headers. |
| `houses` | array | The house registry: `id`, `label`, the client in `outlet`, how it fields in `mode`, its own leader measure, the chart marker drawn for it, its two-party method, and `cadenceDays`, how often it usually publishes. |
| `leaderRegistry` | object | Every leader the story rates, keyed by the same key the waves use in `leaders` and `premier`, with a label, a role and a party. |
| `election2022` | object | The 26 November 2022 state election: primary votes, the two-party result, the seats each party won, and a note on the rounding. |
| `polls` | array | The register itself, one object per wave. The fields are below. |
| `accent` | object | Accent Research's attitudes study for the University of Melbourne, which published no voting-intention wave and so sits outside the register and outside every average. |
| `issues` | array | DemosAU's open-ended biggest-issue question of June 2026, one entry per category with its share. |
| `cohorts` | object | DemosAU's published crosstabs of June 2026: the primary vote within each cohort. |
| `events` | array | The dated events the time-series charts annotate, each with a date, a label and a short label. |
| `nepean` | object | The Nepean by-election of 2 May 2026: primary votes, the two-candidate count, the margin and its swing. |
| `pendulum` | object | Antony Green's July 2026 pendulum figures: the size of the Assembly, the seats a majority needs, the uniform swing the Coalition needs, the chamber as it stands, and the marginal seats his commentary names with their margins. |
| `flows` | object | The preference scenario's default flows, as whole percentages: `grnAlp` is the Greens' flow to Labor, `onLib` One Nation's to the Coalition, `othLib` others' to the Coalition. They are the flows recorded at the 2025 federal election in Victoria, which DemosAU adopts as its own two-party method. |
| `scenarioSliders` | object | The range each flow can be moved through in the scenario, as a minimum and a maximum. |
| `methodology` | array | The method-notes block on the story page, as pairs of a label and a sentence. |

### `polls[]`: the fields of a wave

Every field is `null` or absent where it does not apply. A wave carries the fields its house published and no others.

| Field | Type | Unit | What it holds |
| --- | --- | --- | --- |
| `id` | string | — | The wave's unique slug, the same value the CSV's `id` column carries. |
| `house` | string | — | The key of the house in `houses`. |
| `outlet` | string | — | The client this wave was fielded for, where it is not the house's usual one. Absent otherwise, and readers should fall back to the house's `outlet`. |
| `start` | date | YYYY-MM-DD | The first day of fieldwork. |
| `end` | date | YYYY-MM-DD | The last day of fieldwork, never before `start`. |
| `n` | integer | respondents | The published sample. `null` where the house published none, which is the case for 5 waves. |
| `effN` | integer | respondents | The effective sample after weighting, where the house published one. |
| `moe` | number | percentage points | The margin of error the house published for the headline figure. |
| `lib / alp / on / grn / oth` | number | per cent | Primary votes. `lib` is the Liberal and National Coalition together; `oth` is every other candidate. |
| `ind` | number | per cent | Independents, where the house reported them apart. Where `ind` is present, `oth` excludes independents. |
| `tpp` | number | per cent | The Coalition's two-party share against Labor, by the house's own method. |
| `tppAlpOn` | number | per cent | Labor's share of a Labor against One Nation pairing, where the house published one. |
| `upper` | object | per cent | The Legislative Council voting intention, where the house asked it separately, keyed by party. |
| `leaders` | object | per cent and points | The house's own leader measure, keyed by the leader's key in `leaderRegistry`. `sat`/`dis` is Newspoll satisfaction, `pos`/`neg` favourability, `app`/`dis` Roy Morgan approval, and `net` the favourable share less the unfavourable one. Resolve publishes a net only. |
| `premier` | object | per cent | The preferred or better premier question as that house asked it, keyed by leader, with `dk` for the undecided share where the house published it. |
| `govern` | object | per cent | The party respondents would prefer to see govern, where the house asked it. |
| `trust` | object | per cent | Which side respondents trusted more, where the house asked it. |
| `seats` | object | seats | A published Legislative Assembly seat model, by party, with an optional `note` that is the caption the story shows for it. |
| `council` | object | seats | A published Legislative Council projection, by party, with `undecided` and an optional `note`. |
| `model` | boolean | — | `true` where the wave is a model estimate rather than a poll reading. Absent otherwise. |
| `src` | string | — | Where the wave's figures were read from. |
| `flags` | array | — | Strings, one per thing the register records as approximate, inferred or back-calculated. An empty array is a claim that the wave is as published. |
| `post` | string | — | The site-relative path of the wave's companion post under `/news/`, where one has been published. Absent until then. |

## Derived fields, and where they come from

Nothing in the CSV or the JSON is derived: every figure in both is transcribed from a published release or report, and the register holds no modelled or interpolated value. Every derived figure on the story page is computed from these files at build and in the browser by `derive-v6.js`, and each is labelled where it appears. The main ones are:

| Derived figure | How it is built |
| --- | --- |
| The cross-house trend | A Gaussian-kernel local average over fieldwork midpoints, σ = 35 days, every poll weighted equally. It is a smoother: it never runs past the last poll and it forecasts nothing. |
| The post-change averages | The unweighted mean of the waves whose fieldwork opened on or after the change of Premier on 2026-07-28. The two-party mean is taken over the waves that published a two-party figure, which is fewer than the whole. |
| The sampling band | 1.96 standard errors of the weighted mean, from each wave's published sample, assuming 1,000 respondents where none was published. It carries sampling error only. |
| The between-house band | 1.96 standard errors of the mean, with the standard error taken from the spread of the published readings themselves rather than from their samples, so it carries the houses' disagreement where the sampling band does not. |
| The house effect | Each house's reading less the mean of every wave in the field within 21 days of it, averaged over that house's 2026 waves. Model estimates are left out on both sides. |
| The within-house shift | Each house's first wave fielded on or after 2026-07-28 set against its last wave fielded before it. |
| The uniform swing | A wave's Coalition two-party share less the Coalition's 2022 share of 45. |
| The preference scenario | The Coalition primary vote plus One Nation's times its flow to the Coalition, plus the Greens' times the share that does not flow to Labor, plus others' times their flow to the Coalition, normalised to the five-party total. The defaults are the 2025 federal election flows in Victoria, Greens 90–10 to Labor, One Nation 75–25 to the Coalition and others 55–45 to the Coalition. Every output of it is a projection and is labelled as one. |

## Citing a figure

A figure in these files belongs to the house that published it, and the row's `source` names where it was read from. Cite the house for the figure and this compilation for the compilation: *Victorian election polls 2026, compiled by the Ace Strategies Intelligence Unit, analysis and visualisation by Komms-Haus, register version 2026-09-19.*
