Explore how national swing, tactical voting and regional shifts could reshape the Commons from the 2024 baseline.
| Party | Seats | Β±2024 | With tactical | Tact. Ξ | Vote % | 2024 % |
|---|
| Constituency | Region | Winner | 2nd | Majority % | Swing needed |
|---|
| Constituency | Region | 2024 winner | Projected | MP (2024) | Majority % |
|---|
| Constituency | Region | Without tactical | With tactical | Effect |
|---|
| Region | Seats | Lab | Con | LD | RUK | Green | SNP | PC | Other |
|---|
| Constituency | Region | 2024 | Projected | Majority % | MP |
|---|
The tool takes the actual 2024 constituency-level vote shares as a baseline and applies a national swing β derived from polling data β to project what would happen if an election were held today. Users control the assumed national vote share for each party via sliders, pre-loaded from the selected polling smoother. The swing is applied independently to each of the 650 constituencies, and a winner is determined seat by seat.
Three swing models are available. Uniform National Swing (UNS) adds the same percentage-point change to every constituency: new_share = old_share + (new_national β 2024_national). Proportional swing scales each constituency in proportion to its existing share: new_share = old_share Γ (new_national / 2024_national). After either method, constituency vote shares are renormalised to sum to 100%. Proportional swing tends to produce smaller changes in safe seats and larger changes in marginals, which can be more realistic for large swings.
Bayesian hierarchical extends proportional swing by allowing each region to swing differently, calibrated from empirical 2019β2024 constituency-level data. The model works in additive log-ratio (ALR) space with Labour as the reference party, where proportional swing is a natural linear operation. For each party p and constituency c in region r, the projected log-ratio swing is:
Ξ΄c,p = Ξnational,p + (Ξ³r,p β ΞΌp) + Ξ²p Β· ΞFc
where Ξnational is the poll-implied national swing, (Ξ³r β ΞΌ) is the region-specific deviation learned from the 2019β2024 data, and ΞF is a constituency-level covariate measuring the change in foreign-born population share (2011β2021 Census). The hierarchical structure is: Ξ³r,p ~ N(ΞΌp, ΟΒ²p) and Ξ΄c,p ~ N(Ξ³r[c],p, ΟΒ²p), with half-Cauchy(1.5) priors on the scale parameters. The model was fit via NUTS (No-U-Turn Sampler) in PyMC with 2 chains Γ 2,000 draws on 643 GB constituencies across 11 regions.
Key posterior findings: Reform UK swing varied most across regions (Ο = 0.80) compared to Conservative (0.33), Lib Dem (0.40), or Green (0.39). The immigration-change covariate was most informative for Reform (Ξ² = β0.15, indicating areas with high 2011β2021 immigration change already swung to Reform by 2024 and are less likely to swing further) and Green (Ξ² = +0.15). The foreign-born data covers 316 of 650 constituencies; constituencies without coverage are pooled toward their regional mean. SNP and Plaid Cymru use proportional swing within Scotland and Wales respectively, as for the other models.
SNP and Plaid Cymru are handled regionally. The slider values represent their share within Scotland or Wales respectively, and are converted to GB-equivalent figures using 2024 electorate ratios (Scotland β 8.7% of GB electorate, Wales β 5.0%) before the swing is applied.
Three smoothing methods are available on the Polling tab, each offering a different trade-off between responsiveness and stability. All three can be toggled between quality-weighted and unweighted variants using the buttons below the chart.
LOWESS (Locally Weighted Scatterplot Smoothing) β fits a weighted linear regression at each point using a tricube kernel with bandwidth = 25% of the data span. In the weighted variant, each poll's kernel weight is multiplied by its pollster's quality rating (from a curated ratings table), so higher-rated firms like Savanta, Opinium, and YouGov exert more pull on the trend line.
Rolling 21-day β a simple quality-weighted mean of all polls falling within a Β±10.5-day window centred on each date. Highly responsive to short-term shifts but noisier than the other methods. Useful for spotting sudden movements.
Kalman smoother β a local-level state-space model estimated via statsmodels.UnobservedComponents. The signal-to-noise ratio is determined by maximum likelihood estimation (MLE), allowing the model to learn the appropriate degree of smoothing from the data itself. This is the primary source for the slider defaults and generally offers the best balance of stability and responsiveness.
Note: the Green party estimate may be understated in periods where the Wikipedia source has sparse Green polling entries. The "Others" category (β 7%) is held constant and not projected.
Three tactical voting scenarios can be layered on top of the swing projection. Each operates at the constituency level, redistributing votes between specific groups of parties. The slider controls the proportion of eligible voters assumed to vote tactically (0β50%).
Progressive consolidation β in each constituency, a proportion t of non-leading Labour, Lib Dem, and Green voters (plus SNP in Scotland, Plaid Cymru in Wales) switch to whichever progressive candidate is locally strongest. This simulates coordinated anti-Conservative/anti-Reform tactical voting on the centre-left.
Right consolidation β the mirror image: a proportion t of the trailing party's voters among Conservative and Reform switch to whichever of those two is locally ahead. This models right-wing tactical voting to prevent vote-splitting.
Anti-Reform squeeze β a proportion t of Reform UK's local vote share shifts to whoever is best-placed to beat them, regardless of that candidate's party. This models a scenario where opposition to Reform specifically drives voter behaviour.
Tactical effects are applied after the swing model, so the "Tactical impact" tab shows seats that flip solely due to tactical behaviour, holding swing constant.
Three pre-built scenarios are available as quick-set buttons, each applying offsets from the current polling baseline:
πΏ Green surge β Green +8pp, offset by Lab β3, LD β2, RUK β2. Models a scenario where environmental issues drive a significant Green breakthrough at the expense of other progressive and protest-vote parties.
π Reform decline β RUK β8pp, with Con +5, Lab +2, LD +1. Models Reform UK losing support back to the Conservatives and, to a lesser extent, Labour β a return toward a two-party pattern.
π Lab/Con recovery β Lab +5, Con +5, with RUK β6, LD β2, Green β2, SNP β2, PC β1. Models a reversion where the two main parties regain ground from smaller parties as election day approaches.
The Map tab displays all 650 constituencies using simplified boundary polygons from the ONS Open Geography Portal (December 2024 boundaries). Geometries were simplified from 314 MB to 3.6 MB using a 500-metre tolerance in EPSG:3857, preserving constituency shapes while enabling fast browser rendering. The map supports three views: Projected (coloured by projected winner), 2024 actual (coloured by 2024 result), and Changes only (highlighting only seats projected to change hands). Hover over any constituency for a tooltip showing projected winner, majority, and the sitting MP.
Baseline correction: Islington North is corrected to reflect Jeremy Corbyn's win as an Independent (49.3% vote share), not as Labour.
Northern Ireland: the 18 NI constituencies (DUP, SF, SDLP, UUP, APNI) are held at their 2024 results throughout. National swing models do not apply meaningfully to NI's distinct party system.
Boundary mapping: 2019 results are projected onto 2024 boundaries using a closest-successor mapping derived from boundary overlap data. Of 650 constituencies, 649 have a clean 2019 predecessor.
Self-contained deployment: all constituency data (650 seats), boundary geometries (simplified GeoJSON), and polling data (406 polls) are embedded directly in this HTML file. The only external dependencies are CDN-hosted Leaflet.js (map rendering) and Plotly.js (charts). No server, no uploads, no API calls required.