Skip to content
Home Projects Blog COVID-19 Analysis
🦠 Pandemic Analysis Python Data Visualization 2020-2023

Philippine COVID-19, 2020–2026

The confirmed toll is 66,864 deaths. The excess-mortality estimate for the same period is 290,774. This page is mostly about that gap, and about which of the two numbers a country actually gets quoted.

4,173,631
Confirmed cases
66,864
Confirmed deaths
290,774
Excess deaths, same period
78.4M
Fully vaccinated
Time Period
January 2020 - December 2023
Tech Stack
Python Pandas Chart.js HTML/CSS
Key Takeaways

Every figure on this page is read at one date, 19 July 2026. That sounds like housekeeping. The page it replaces took its case count from May 2023, its death count from January 2024 and its vaccination count from December 2022 — each close to real, the set impossible.

  • Confirmed deaths: 66,864. Excess deaths over the same period: 290,7744.3× higher, leaving 223,910 deaths above the historical baseline that were never attributed to COVID.
  • The case fatality rate of 1.6% is therefore a rate among tested people, not among infected ones. It is the most-quoted number here and the least informative.
  • 5 waves, by a stated rule rather than by eye. The largest peaked at 38,867 cases in a single day.
  • Against the five largest other ASEAN economies the Philippines ranks 2 for deaths per million — while ranking near the bottom for cases per million, which is a testing story rather than an infection one.
01

The Gap That Runs The Page

Confirmed COVID deaths are deaths in people who were tested, found positive, and recorded as such. Excess mortality is the count of deaths above what the years before the pandemic would predict, from any cause. Where the two diverge, the smaller one is a measure of testing.

Confirmed COVID deaths against excess deaths over the same period

Confirmed deaths

66,864

The number in every headline, and the one the case fatality rate is built from.

Excess deaths

290,774

Deaths above the pre-pandemic baseline over the same window.

Never attributed

223,910

The difference. Some are undiagnosed COVID; some are people who died of other things because hospitals were full. The data cannot separate them, and no split is asserted here.

02

The Epidemic Curve

Daily confirmed cases with the 7-day mean. Reporting moved from daily to weekly during 2023 and then stopped, so the flat tail is the end of counting, not the end of transmission.

Daily confirmed cases, 7-day mean

Highest single day

38,867

On 2022-01-15.

Highest 7-day mean

34,897

The smoothed peak, which is the figure worth comparing between countries because it is not distorted by weekend reporting.

Cases in 2021

2,371,346

The worst year by cases and by deaths — 42,274 of the latter.

03

Counting The Waves

"Four waves" is the kind of claim that gets repeated because it sounds settled. Here a wave is a peak in the 7-day mean above 1,000 cases/day, separated from any larger peak by a trough falling below 40% of the smaller of the two. That rule gives 5. A different threshold gives a different answer, which is the honest position.

Cases per wave, by the stated rule

Waves identified

5

Boundaries sit at the lowest point between consecutive peaks, so every day belongs to exactly one wave and the wave totals sum to the daily series.

Largest peak (wave 3)

34,897

Omicron, peaking 2022-01-18. 849,228 cases in the wave.

Deadliest (wave 2)

41,694

Delta. Fewer recorded cases than wave 3 at its peak, and 4.4× the deaths — the clearest thing in this dataset about what vaccination changed.

04

Testing, And What It Hides

Positivity is the share of tests that come back positive. When it is high, the case count is a floor rather than a measurement, because testing is only reaching the sickest. The series stops in 2022-06-07 — the page stops with it.

Test positivity rate, %

Positivity peak

45.6%

The WHO suggested 5% as the level below which an epidemic is being adequately tracked. This is many times that.

Days with testing data

789

Out of 2,392 days in the series. Testing data covers less than a third of the pandemic.

Last reported

2022-06-07

Nothing after this date. Any positivity figure quoted for 2023 onward is not coming from this source.

05

Lockdown Stringency

The Oxford stringency index scores containment policy from 0 to 100. The Philippines reached 100 — the maximum the index defines. The correlation with cases is positive, and that needs explaining rather than presenting.

Stringency index against 7-day mean cases

Peak stringency

100.0

The index maximum. Few countries reached it and none held it long.

Mean over the period

58.9

Averaged across 1,088 days with both series present, ending 2022-12-31.

Correlation with cases

r=0.259

Positive. Read naively that says restrictions caused cases. It says the opposite: governments tightened because cases were rising. Same-day correlation cannot separate cause from response, and this page does not claim it can.

06

Against The Region

The five largest other ASEAN economies, per million people. Brunei, Laos, Cambodia and Timor-Leste are left out because their populations are small enough to make per-million rates jump around.

Deaths and cases per million, ASEAN-6

Rank by deaths per million

2

Of six. 586 deaths per million.

Cases per million

36,622

Against 532,073 for Singapore. Singapore did not have fourteen times the infection; it had the testing to find it.

Fully vaccinated

68.8%

The lowest of the six. Vietnam and Singapore both cleared 86%.

07

What This Page Does Not Cover

The version this replaces charted cases by region, vaccination by region, vaccine brand shares, ICU occupancy, age and sex breakdowns, top provinces, economic impact and healthcare-worker infections. None of those are in this dataset for the Philippines, and the numbers that were on the page did not come from anywhere else either. They are removed rather than approximated.

Regional, provincial, age and sex

DOH published these in its COVID Data Drop. That drop is no longer served, and OWID never carried sub-national Philippine detail. Anything at this granularity would have to be rebuilt from archived copies first.

ICU and hospital occupancy

OWID carries ICU and hospital columns, but they are empty for the Philippines for the whole period. An empty column and a low number are not the same thing.

Vaccine brands and economic impact

Brand-level rollout came from NTF briefings; the economic figures would need PSA national accounts. Neither is in this repository, so neither is on this page.

08

Method

Two scripts and eight CSVs, reproducible from this repository.

Source

Our World in Data's compact.csv — about 180 MB of every country on one date index. The fetcher streams it, filters to the Philippines plus five ASEAN comparators, and writes only those rows.

One date, carried everywhere

Every figure is read at 2026-07-19, and that date sits on every row of every CSV. checks.sql asserts a single as_of across all seven tables, because the specific failure being designed against is a page whose numbers were individually right and collectively impossible.

Wave rule

A peak in the 7-day mean above 1,000 cases/day, separated from any larger peak by a trough below 40% of the smaller. Boundaries are the minimum between consecutive peaks, half-open on the left so no day is counted twice — an earlier version double-counted four boundary days, which is small enough to pass for rounding.

A revision worth knowing

On 14 August 2023 the cumulative case count fell by 65,079 as DOH revised downward. OWID rebased the cumulative series without restating the dailies, so summing daily cases gives about 32,000 more than the cumulative total. Both are right on their own terms; checks.sql keeps the discrepancy visible so nobody scales one to the other.

Series that stop

Stringency ends 2022-12-31, positivity 2022-06-07, vaccination 2023-03-19. Charts stop where their data stops instead of running flat to the present, which would read as policy relaxing to zero rather than reporting ending.

Verification

Twelve assertions in checks.sql cover date gaps, negative counts, deaths exceeding cases, wave partitioning and the country-name match that would otherwise return an empty comparison. Every figure above is bound to a query in facts.sql and re-checked on each build.

09

Key Findings & Summary

  • Excess deaths reached 290,774 against 66,864 confirmed — 4.3×. The confirmed toll is the one that gets quoted and it is the smaller of two defensible numbers.
  • The 1.6% case fatality rate divides deaths by confirmed cases. With positivity peaking far above the 5% that indicates adequate tracking, the denominator is a fraction of real infections and the rate is not a probability of dying from COVID.
  • Wave 2 (Delta) killed 41,694 against wave 3's (Omicron) deaths, on 2,354,103 recorded cases versus 849,228. Wave 3 was bigger and far less lethal.
  • Stringency and cases correlate positively at r=0.259 over 1,088 paired days. That is governments responding to outbreaks, not causing them, and it is a good example of a correlation that is real and means the reverse of how it reads.
  • The Philippines is 2 of six ASEAN economies for deaths per million at 587, while recording 36,622 cases per million against Singapore's 532,073. Low case counts next to high death counts is what undertesting looks like.

Sources & Citations

Every figure on this page traces to one of these, through a CSV in data/ph-covid/. Each is checked against its source query on every build.

Our World in Data COVID-19 datasetSecondary

Cases, deaths, testing, stringency, vaccination and excess mortality — OWID compiles WHO, JHU and national sources onto one date index

Let's Discuss This Analysis

Interested in public health data analytics or pandemic research collaboration?

Have a dataset you'd like analyzed or need a mini AI project as a starter guide? Send me your suggestions!

Prefer the plain-English version?

I wrote a companion post — “Two Ways to Count the Dead” — in simple, everyday words.

Read the blog post →