Ireland's Dashboard

Trust

Methodology

Ireland's Dashboard brings official statistics into a common place × measure × period model. Maps, charts and exports all read the same first-party store — not live upstream agency APIs at request time. This page explains what is official, what we calculate, and how we correct mistakes.

Value status

Every number carries a status. Explore shows Official for observed source values; Calculated, Estimated and Projected are never presented as if they were published that way by the agency.

Official (observed)
Directly sourced from an agency table (or a documented official revision). This is the preserved official truth in our store.
Calculated
Deterministic transform from official rows (percentage change, county sum of local-authority parts, per-100,000 overlay). Method id is shown where used. Official inputs remain stored separately.
Estimated / Projected
Modelled or forward-looking values. Not used in the current 12-indicator vertical slice. When they appear, they will be labelled and methodology disclosed — never as a silent replacement for an official observation.

Standardisation

  • Source tables are ingested via Python ETL into one analytical cube: indicator × geography × time → value + status + provenance.
  • Labels are mapped through a controlled taxonomy (“the Bible”). Unmapped labels are quarantined — we do not invent mappings at request time.
  • Index series may apply an always-on rebase to a canonical base period; raw published values can be retained for audit where recorded.
  • LLMs are not used row-by-row on data payloads at runtime. Offline batch metadata help only.

Geography

Geography is a platform capability: each indicator declares which levels it supports and a finest defensible ceiling. Explore offers only declared ∩ ingested places. Map zoom is not the same as statistical depth — grey counties mean not available, not missing colour.

County outlines on the map are first-party Tailte Éireann geometry (CC BY 4.0). Statistics always come from Ireland's Dashboard API, never Tailte or CSO at request time. Garda divisions and stations are overlapping operational areas: they appear in the Explore place list when an indicator publishes them, and are not painted onto the county map.

Methods registry

Versioned method ids used in the current product. Later estimation will attach to the same registry pattern.

geo.county_from_parts.v1

County from local-authority parts

When a CSO table publishes several official local-authority (or city/county) figures that were historically mapped onto one county code, Explore sums those official parts for the county map unit.

How:
At one period and one attr cut (for example Both sexes), collect every distinct official observation on that county code, add the headcounts, and label the result Calculated with this method id. A single part stays Official.
Not official:
The summed county total is not a figure the CSO published for that historic county polygon. Cite the official local-authority rows, or cite Ireland's Dashboard as the source of the sum.
Persistence:
Computed for display from observed rows; not a separate stored series

rate.per_100k.v1

Rate per 100,000 population

Client-only overlay: (count ÷ observed population) × 100,000 at the same place and overlapping period.

How:
Uses the selected count series and pop.total observed population after place and dimension filters. Never writes to the fact store. Official counts and population rows are unchanged.
Not official:
Not a CSO-published rate. Do not cite it as an official crime rate, birth rate, or similar unless the CSO publishes that exact series.
Persistence:
Display-only overlay — not stored in the fact table

pop.pct_change.v1

Population percentage change

Inter-period percentage change derived from FY003B population rows and stored as calculated facts.

How:
For each place and period, compute percentage change from the previous comparable observation. Rows are written with value_status=calculated and this method id. Observed population rows are never overwritten.
Not official:
The percentage-change series is Ireland's Dashboard calculation, not a CSO observation, even when the inputs are official.
Persistence:
Stored as calculated rows alongside observed facts

rsa.provisional_review.v1

RSA provisional fatality extract

Human-checked extract from a named RSA Provisional Review of Fatalities publication, stored as an estimated series that is not spliced onto CSO ROA12.

How:
A reviewed JSON fixture lists the RSA public-road death total, road-user splits and published speed-limit band aggregates for one calendar year. Rows are appended with value_status=estimated and this method id. Official ROA12 observations are never overwritten or extended by this extract.
Not official:
Not a CSO observation. Do not cite it as the next year of persons killed on roads (ROA12). RSA figures are provisional and subject to change. Garda totals that include non-public-road places are a different count.
Persistence:
Stored as calculated rows alongside observed facts

garda.ytd_fatalities.v1

Garda year-to-date fatality extract

Provisional An Garda Síochána year-to-date traffic fatality count, stored separately from CSO ROA12 and the RSA public-road extract.

How:
A daily check reads the Garda fatalities page, keeps the total only when the reporting date and the page's own totals agree, and appends value_status=estimated with this method id. An unchanged page does not rewrite the reporting date. Official ROA12 observations are never overwritten.
Not official:
Not a CSO observation and not RSA public-road-only figures. Garda totals include some non-public-road public places. The published count is provisional. It is not a Dashboard estimate.
Persistence:
Stored as calculated rows alongside observed facts

ytd_linear_annualize.v1

Linear year-to-date annualisation

Display-only full-year projection: accepted year-to-date count × days in that year ÷ elapsed days from 1 January through the Garda reporting date, rounded to a whole person for display.

How:
Uses the same accepted Garda snapshot as the headline. Does not use today's date as the denominator. Does not write to the fact store. Hidden before 90 elapsed days, after 60 days without a newer reporting date, and once the reporting date is the last day of the year.
Not official:
A Dashboard projection, not an official forecast. Do not cite it as a Garda, RSA or CSO year-end figure.
Persistence:
Display-only overlay — not stored in the fact table

edu.budget_share_gni_star.v1

Education Votes as % of modified GNI*

Combined DoE + DFHERIS Vote divided by same-year Budget/REV modified GNI* forecast.

How:
Reads the estimated HITL Vote total and the HITL Budget context GNI* denominator for the same year. Stores (Vote ÷ GNI*) × 100 with value_status=calculated. Observed and estimated Vote rows are never overwritten.
Not official:
Not a CSO or Department-published share. Denominators are Budget/REV forecasts, not national-accounts outturn. Do not cite as OECD education expenditure as % of GNI*.
Persistence:
Stored as calculated rows alongside observed facts

edu.budget_share_gdp.v1

Education Votes as % of GDP

Combined DoE + DFHERIS Vote divided by same-year Budget/REV GDP forecast.

How:
Reads the estimated HITL Vote total and the HITL Budget context GDP denominator for the same year. Stores (Vote ÷ GDP) × 100 with value_status=calculated. Vote totals are never overwritten.
Not official:
Not a CSO observation. Irish GDP is distorted by multinational activity — prefer the GNI* share for domestic fiscal context. Not OECD outturn education expenditure.
Persistence:
Stored as calculated rows alongside observed facts

edu.budget_share_voted_expenditure.v1

Education Votes as % of gross voted expenditure

Combined DoE + DFHERIS Vote divided by same-year gross voted government expenditure.

How:
Reads the estimated HITL Vote total and the HITL REV/Budget gross voted expenditure denominator. Stores (Vote ÷ GVE) × 100 with value_status=calculated. Prefer this wording over “total government budget”.
Not official:
Not general-government expenditure (ESA). Gross voted expenditure is an REV allocation concept. Do not equate with Eurostat COFOG education shares.
Persistence:
Stored as calculated rows alongside observed facts

edu.budget_real_change.v1

Real annual change in Education Votes

Inflation-adjusted year-on-year % change in the combined DoE + DFHERIS Vote.

How:
For consecutive Vote years, compute nominal YoY then deflate by the HITL CPI/HICP YoY from Budget context: real = (current/prior) ÷ (1 + cpi/100) − 1, stored as a percentage. Vote totals are never overwritten.
Not official:
Not a Department-published real-terms series. Uses civic HITL inflation assumption and estimated Vote extracts.
Persistence:
Stored as calculated rows alongside observed facts

edu.teachers_per_1000_pupils.v1

Teachers per 1,000 pupils

Department-aided All Full-time Equivalent teachers (Primary + Post-primary) per 1,000 First and Second level full-time enrolments. Retained in the registry for Explore; not shown on the Education category page (primary average class size is the classroom-pressure measure).

How:
For each year from 2015, sum EDA100 and EDA82 Dept-aided All FTE teacher metrics, divide by EDA57 All first-level national-school pupils + EDA69 Dept-aided second-level pupils, multiply by 1,000. Stores value_status=calculated. Observed teacher and enrolment rows are never overwritten.
Not official:
Not a CSO-published ratio and not the official pupil–teacher ratio (EDA44) or average class size (EDA21). Do not cite it as PTR.
Persistence:
Stored as calculated rows alongside observed facts

edu.sna_posts.v1

SNA posts (WTE)

National Special Needs Assistant whole-time-equivalent posts allocated in the education sector.

How:
HITL fixture HITL-EDU-SNA: NCSE Open Data calendar-year totals for 2015–2023; Oireachtas PQ allocation snapshots for 2024 and 2025. Appended as estimated State rows. Never overwrites observed CSO facts.
Not official:
Not a CSO PxStat series. 2024–2025 are allocation / availability figures from Parliamentary Questions, not NCSE calendar-year outturns. Unit is WTE posts — not teacher FTE.
Persistence:
Stored as calculated rows alongside observed facts

edu.third_level_academic_staff.v1

Third-level academic staff (core WTE)

HEA Staff Profiles Academic core-funded whole-time-equivalent staff across publicly funded HEIs at 31 December.

How:
HITL fixture HITL-EDU-HEA-STAFF sums Academic + Core-funded WTE from HEA Institutional Staff Profiles (PDF sector overviews 2016–2020; Excel Total HEI Staff 2021–2024). observation_date is the December year. Charted separately from school teacher FTE.
Not official:
HEA describes Staff Profiles as an EDI monitoring return, not the main SRS statistical collection. Not CSO/DoE school FTE and not DFHERIS approved post ceilings. No 2025 census until Year End 2025 publishes.
Persistence:
Stored as calculated rows alongside observed facts

edu.enrolments_by_level.provisional.v1

Provisional enrolment extension (post-primary / third level)

Department of Education and HEA published totals used to extend the enrolment chart after CSO EDA69 / HEA01 end.

How:
HITL fixture HITL-EDU-ENROL stores estimated State headcounts by level (attrs.level). Appended only for years without an observed EDA69 / HEA01 row. Chart shows them as dotted segments. Observed CSO rows are never overwritten.
Not official:
Not CSO PxStat observations. Post-primary figures are DoE bulletin / Insights totals; third-level figures are HEA Key Facts (all modes). May be revised when CSO publishes matching years.
Persistence:
Stored as calculated rows alongside observed facts

mdd.yoy.v1

Real modified domestic demand, year-on-year

Percentage change on the same quarter a year earlier in Modified Final Domestic Demand at constant market prices, seasonally adjusted (CSO NAQ05).

How:
For each quarter with an observed level a year earlier, compute (level ÷ level a year ago − 1) × 100. Stored with value_status=calculated. Observed NAQ05 levels are never overwritten.
Not official:
CSO NAQ05 publishes levels, not this growth rate. CSO's own published growth figures may differ slightly through rounding or revisions.
Persistence:
Stored as calculated rows alongside observed facts

mdd.annual_cp.v1

Annual modified domestic demand at current prices

Calendar-year sum of the four unadjusted current-price quarters of Modified Final Domestic Demand (CSO NAQ05), for comparison with annual GDP and GNI*.

How:
Only years with all four quarters published are written, so the annual output chart never shows a part-year. Stored with value_status=calculated.
Not official:
Not a CSO annual national-accounts figure. The annual outturn in CSO's National Income and Expenditure release may differ after revisions.
Persistence:
Stored as calculated rows alongside observed facts

wage.ehecs_yoy.v1

Quarterly nominal earnings growth (EHECS)

Percentage change on the same quarter a year earlier in EHQ03 average weekly earnings, all NACE sectors, all employees.

How:
Year-on-year on unadjusted quarters, so seasonal patterns cancel. Stored with value_status=calculated. Observed EHQ03 levels are never overwritten.
Not official:
Not a CSO-published growth series. The newest EHQ03 quarter is preliminary, so its growth rate can change.
Persistence:
Stored as calculated rows alongside observed facts

cpi.yoy_quarterly.v1

Quarterly average of headline CPI inflation

Arithmetic mean of the three monthly headline CPI 12-month percentage changes (CSO CPM20, All Items) in each calendar quarter.

How:
Q1 = mean of January, February and March. A quarter is written only when all three months are published. Stored with value_status=calculated.
Not official:
Not a CSO quarterly CPI index. It averages published monthly rates rather than re-deriving a rate from quarterly index levels.
Persistence:
Stored as calculated rows alongside observed facts

wage.real.v1

Real weekly earnings growth

Nominal EHQ03 earnings growth deflated by the quarterly average of headline CPI inflation.

How:
real = (1 + nominal ÷ 100) ÷ (1 + CPI ÷ 100) − 1, as a percentage — deflation, not subtraction. Written only for quarters where the earnings growth and all three CPI months exist, so the series ends at the last common quarter.
Not official:
Not a CSO real-earnings publication. Average earnings growth can rise through changes in the mix of jobs, not only pay rises.
Persistence:
Stored as calculated rows alongside observed facts

pop.estimate_growth.v1

Annual population growth from CSO estimates

Display-only percentage: published April-to-April population change divided by the previous April population estimate.

How:
Uses the PEA15 population-change component and the previous PEA01 all-ages estimate. Does not write to the fact store and does not replace the census percentage-change series.
Not official:
The percentage is calculated by Ireland's Dashboard. The person counts it uses are official CSO estimates.
Persistence:
Computed for display from observed rows; not a separate stored series

pop.age_share.v1

Age-group share from published counts

A published age band, or a sum of mutually exclusive published bands, divided by the matching All ages count.

How:
County parts are summed before the share is calculated. For the census county cards, 0–14, 15–64 and 65+ are sums of the five-year bands from pop.five_year_age.v1, divided by the sum of every single year of age. For the national April estimate, 15–64 adds PEA01's published 15–24, 25–44 and 45–64 bands. All ages and Both sexes are not added into a numerator. A band stays missing if any required count is missing.
Not official:
A summed band such as ages 65 and over, or 15–64, is not itself a single CSO cell unless CSO published that exact group.
Persistence:
Computed for display from observed rows; not a separate stored series

pop.five_year_age.v1

Five-year age bands from single years

Display-only sums of official Census 2022 single years of age into 0–4 through 80–84, then 85 and over.

How:
Adds mutually exclusive FY006B single-year counts for Male and Female separately. Ages 85 through 100 years and over form the open band. A band is missing if any required single year is missing. The sums are not written over the official single-year rows.
Not official:
CSO did not publish these five-year county bands as a group in this table. The single-year counts are official; the band totals are calculated.
Persistence:
Computed for display from observed rows; not a separate stored series

pop.registered_balance.v1

Births registered minus deaths registered

Display-only difference between complete VSQ12 and VSD49 registration totals for the same place and period.

How:
Subtracts deaths registered from births registered after county parts are summed and after a calendar year has all four quarters. Does not write to the fact store.
Not official:
Not the natural-increase component in the CSO April population accounts (PEA15). Registration timing can differ from when the birth or death happened.
Persistence:
Computed for display from observed rows; not a separate stored series

pop.category_share.v1

Category share from published counts

Display-only percentage: a published category count, or a sum of mutually exclusive published categories, divided by the published total of the same table, period, place and slice.

How:
The denominator is named on every chart. Not stated stays a visible category and is never redistributed. For counties built from local-authority parts, the category counts and the totals are each summed over the same complete set of parts before dividing; county percentages are never averaged. A share is missing if the count or the total is missing. Eurostat foreign-born shares divide c_birth FOR by c_birth TOTAL from migr_pop3ctb for the same country and year.
Not official:
The percentage is Ireland's Dashboard's calculation. The counts are official. Where the source publishes its own percentage, rounding may differ.
Persistence:
Computed for display from observed rows; not a separate stored series

pop.pp_difference.v1

Difference in percentage points

Display-only difference between two percentages that share a definition, period and unit, in percentage points (pp).

How:
County comparison: county share minus the Ireland share from the same table and census. Eurostat gaps: the foreign-born rate minus the native-born rate for the same country, year, age band, sex and unit. A gap carries every quality flag from both inputs and is missing if either input is missing.
Not official:
A percentage-point gap is not a percentage change and is not published by the source as a series. Small gaps can sit inside sampling error for survey data.
Persistence:
Computed for display from observed rows; not a separate stored series

pop.matched_age_band.v1

Matched age-band profile

Display-only age profile: each five-year band divided by the sum of the same group's bands, from one table on one base.

How:
Both groups come from CSO F5064, Census 2022, usually resident and present, Both sexes, with the same 18 five-year bands. Each band is divided by the sum of that group's bands, so the two profiles use identical age definitions. The table has no unknown-age category.
Not official:
These are percentages calculated by Ireland's Dashboard. They describe the age structure of each group, not rates within an age band.
Persistence:
Computed for display from observed rows; not a separate stored series

fisc.ratio_gni_star.v1

Balance and gross debt as % of modified GNI*

Calculated percentage of modified GNI* for a year that has no official published ratio.

How:
Divide the latest general government balance, or the latest gross debt, by NA001 item 10 for the same calendar year and multiply by 100. Store both input values, dataset ids and publication dates. Skip a year once an official ratio exists. Observed rows are never deleted.
Not official:
A calculated GNI* ratio is not a CSO-published percentage. Do not present it as the official debt-to-GDP ratio, and do not replace it with a figure from another release.
Persistence:
Stored as calculated rows alongside observed facts

crime.annual_sum.v1

Annual sum of recorded quarters

Adds the four quarters of one offence code into a calendar year.

How:
A year is included only when January, April, July and October are all present. A missing quarter leaves the year out. The latest incomplete year, such as 2026 while the cube ends in Q2, is not an annual point.
Not official:
The annual total is a display sum of official quarterly counts. It does not replace those quarters.
Persistence:
Computed for display from observed rows; not a separate stored series

crime.rate_per_100k.v1

Recorded incidents per 100,000 residents

Divides an annual recorded-crime count by the April population estimate for the same calendar year.

How:
Uses pop.estimate, both sexes, all ages, state only. The census method rate.per_100k.v1 is not used. A year with no April estimate has no rate.
Not official:
This is not a CSO-published crime rate. The official figures are the recorded counts and the population estimate.
Persistence:
Computed for display from observed rows; not a separate stored series

crime.index.v1

Index from a common start year

Sets the first shared year to 100 and expresses later years as a percentage of that baseline.

How:
The baseline count must be at least 100. The chart states whether the index is built on rates or counts. A series that cannot meet the floor is omitted.
Not official:
An index point is not a count of incidents.
Persistence:
Computed for display from observed rows; not a separate stored series

crime.basket_share.v1

Share of a fixed offence basket

Each category’s share of the same list of major groups in two years.

How:
The denominator is the sum of the basket in that year. A category missing in either year removes the comparison. Excluded groups stay out of both denominators.
Not official:
The basket is not all recorded crime.
Persistence:
Computed for display from observed rows; not a separate stored series

crime.five_year_average.v1

Five-year average

The mean of five consecutive complete annual values, labelled beside the annual series.

How:
A year is averaged only when it and the previous four years all exist. The average does not replace the annual point and is not drawn across a break.
Not official:
The average is a display summary, not a CSO published smoothing.
Persistence:
Computed for display from observed rows; not a separate stored series

Definitions and caveats

Each published chart and homepage card carries its definition, source table, licence and material caveats in Sources & definition or the chart details. Calculated, estimated and projected values stay labelled there. This page keeps the shared rules for value status, geography, methods and revisions.

Revisions and corrections

Official statistics change when agencies revise tables. Ireland's Dashboard may also fix mapping or calculation errors. We keep official observations distinct from our own calculations.

Official source revisions

When CSO (or another agency) revises a published table, we re-ingest. ETL appends by default: new observed rows are added; we do not silently overwrite an official observation with a calculated or estimated value.

Dashboard methodology fixes

If we discover a wrong geography mapping, attr filter, or calculation (for example an incomplete local-authority sum), we fix the method or mapping, document the method id/version where relevant, and correct the public Explore view. Calculated series may be recomputed; observed rows stay as official facts.

What we will not do

We will not invent missing geography detail to make a map look complete, hide value status to look cleaner, or present Ireland's Dashboard calculations as if the CSO published them.

How to report an error

If a figure looks wrong, note the indicator, place, period, and Sex/other dimensions shown in Explore, and send it through the feedback form on the About page (/about#feedback). There is no public comment board — this is a push-only civic resource.

Subjects · Explore all measures