BotoSenado

Philippine Senate Election Results (2007 - 2025)

Back to explorer

Data Processing Methodology

Philippine Senate election results, 2007–2025

Part 1

How the data was built

0. Overview

This dataset combines Senate election results from seven election years (2007, 2010, 2013, 2016, 2019, 2022, 2025) into a single, consistent dataset showing vote counts per candidate per city or municipality. Each year's source file was released in a different format. The steps below describe how these were standardized, corrected, verified, and combined.

1. Source data

Seven files, one per election year, obtained as Excel or CSV spreadsheets. Each file lists municipalities in rows and candidates in columns, with vote counts in the cells. Formats differed by year: column names, file type, number of extra columns, and how missing or special entries were recorded were not consistent across files.

Provenance also differed by year:

  • 2025 — Publicly available official results. Source: 2025electionresults.comelec.gov.ph.
  • 2022 — Publicly available official results. Source: comelec.gov.ph.
  • 2019 — Manually scraped from source. comelec.gov.ph.
  • 2016 — Manually scraped from source, a dedicated COMELEC results microsite for that election that is likely no longer live. Linked to the COMELEC homepage as a fallback: comelec.gov.ph.
  • 2013 and 2007 — Sourced from NAMFREL archives. These were already tabulated but required manual cleaning before use. namfrel.org.ph.
  • 2010 — Sourced from COMELEC archives. Source: comelec.gov.ph.

Candidate profile photos shown elsewhere on the site are a separate, auxiliary asset set, not part of the vote-count spreadsheets above.

  • Photo files used by the app are downloaded from Wikimedia Commons (commons.wikimedia.org) and its standard thumbnail CDN at upload.wikimedia.org.
  • The app only uses Commons files whose file pages indicate a reusable license, most commonly public domain Philippine government works, public domain / CC0 / PD-self uploads, or Creative Commons licenses such as CC BY or CC BY-SA.
  • A smaller number of legacy Commons files may also carry other reusable licenses such as the GNU Free Documentation License.
  • Some Commons files were originally uploaded there from official government office pages, agency archives, Flickr, or uploader-owned photographs, but this project relies on the reusable license disclosed on the Commons file page rather than treating the upstream website itself as automatically reusable.
  • If no clearly reusable single-person photo can be verified, the site falls back to initials instead of displaying an unverified image.

2. Standardizing the format

Every file was converted from its original "wide" layout (one column per candidate) into a single, uniform structure: one row per candidate, per municipality, per year, with the vote count. This produces one consistent format across all seven years regardless of how many candidates ran in a given year, and allows the years to be combined directly.

3. Removing non-vote data

Each file was checked for columns or rows that were not vote counts before combining, since including them would have inflated totals. The following were identified and removed:

  • 2007 — A block of columns summarizing the top winners was present alongside the actual per-candidate columns. Removed to prevent double-counting.
  • 2013— Alongside each candidate's vote count was a second column showing that candidate's rank in the municipality (a small ranking number, not a vote total). Rank columns were removed; only vote columns were retained.
  • 2016— A row labeled "TOTAL," summarizing the entire country's results in a single line, was present in the file. This row was excluded, as including it would have duplicated the national vote count.
  • 2022 and 2025 — Redundant text columns repeating municipality names, and percentage columns, were identified and removed.

Row and column counts were checked against expected totals after each removal to confirm no vote data was lost or duplicated in the process.

4. Correcting a missing location code

One municipality, in Lanao del Sur, was missing its official location code in the 2007 and 2016 files, which would have excluded it from geographic analysis. Investigation identified that this municipality had been officially renamed (from "Bumbaran" to "Amai Manabilang"); the earlier files used the former name, which no longer matched the current official location registry. The correct location code was applied manually to this municipality's records in both years, based on the current official registry (PSGC).

Genuine overseas absentee voting (OAV) records within the 2016 file were identified separately (17 entries, one per country/post) and kept in a separate dataset, since they do not correspond to a Philippine municipality.

5. Resolving candidate name inconsistencies

Candidate names were not recorded consistently across years. The same individual could appear under different formats, for example:

  • "Drilon, Franklin M." in one year, "Drilon, Frank" in another
  • "Osmeña, Sergio III D." in one year, "Osmena, Sergio III" in another
  • "Pacquiao, Manny" in one year, "Pacquiao, Manny Pacman" in another

Without correction, each name variation would be treated as a separate individual, fragmenting one candidate's record across years. A reference table was built mapping each name variation found in the source files to one standardized identity per candidate. Each mapping was verified against public sources before being applied.

Cases involving genuinely different people with similar names were also identified and kept separate, for example: "Enrile, Juan Ponce Jr." and "Enrile, Juan Ponce Sr." (father and son, both candidates in different years). A dedicated check was run across the full dataset to identify any remaining cases where the same person may have been split into more than one record, since this type of error is not otherwise visible without directly checking for it.

6. Verification

  • No negative vote counts were present.
  • Total votes, number of candidates, and number of municipalities were reviewed for each year to identify any unexpected increase or decrease.
  • The highest vote totals were checked against known candidates and major cities, to confirm results were consistent with expectations.
  • The final combined row count was confirmed to match the expected count after removing non-vote rows, with no unexplained gain or loss of records.

7. Final data structure

The verified dataset was reorganized into three linked tables to reduce file size and repetition:

  • A table of municipalities (location codes and names).
  • A table of candidates (standardized identity per candidate).
  • A table of vote records (year, municipality, candidate, and vote count), referencing the two tables above rather than repeating names on every row.

This reduced the dataset's file size substantially while preserving all original information. A single, non-restructured version of the full dataset is also retained for reference and audit purposes.

8. Status

All seven years are integrated using this process. A small number of candidate name mappings remain under final review. Future election years will be incorporated following the same procedure to maintain consistency.

Part 2

Reference

What the numbers on this site mean

The sections above explain how the underlying vote counts were collected and cleaned. This part explains what happens after that — how a raw vote count turns into the percentages, rankings, and "swing" figures shown on candidate pages, charts, and the map.

Vote share

Vote share is the percentage of votes a candidate received out of all votes cast for senatorial candidates in a given place, for a single election year — a municipality, a province, or the whole country.

It is not a share of registered voters or of total ballots cast. Concretely: if a municipality cast 100,000 votes across all senatorial candidates combined, and one candidate received 15,000 of those, that candidate's vote share there is 15%. A candidate's national vote share works the same way, just adding up votes across the whole country instead of one municipality.

This is also why vote shares for all candidates in one place roughly add up to 100% — everyone is being measured against the same pool of votes.

Rank

Rank is a candidate's position among all candidates in a given place and year, based on raw vote counts — whoever got the most votes is rank 1, and so on. This is true at every level the site shows a rank: within a municipality, within a province, and nationally.

Rank is based on vote count, not vote share. This matters because rank and vote share can move in different directions: if a strong new candidate enters a race and takes votes from other candidates, someone's rank can drop even though their own vote share barely changed, since it depends on everyone else in the race too. Vote share only reflects a candidate's own support, not how it compares to others.

If two candidates receive the exact same number of votes in a place, they share the same rank, and the next candidate down is ranked as if no one had tied — for example, two candidates tied for 3rd are both shown as rank 3, and the next candidate is rank 5, not 4.

Compare: “Gap from Avg”

In the Compare tab's ranking table, Gap from Avg shows how far a candidate's vote share is above or below the average candidate in that same field.

The calculation is simple: because all candidate vote shares in one place add up to about 100%, the average candidate share is roughly 100% divided by the number of candidates. If 40 candidates are in the field, the average share is about 2.5%. A candidate at 4.0% would therefore be shown as about +1.5 points; a candidate at 1.0% would be about −1.5 points.

This number is useful because it gives a quick sense of whether a candidate was performing above or below the pack, even when the size of the field changes.

Vote-share swing

Swing is how much a candidate's own vote share changed between two of their election runs — for example, from 20% in one election to 21.3% in a later one is a swing of +1.3 points.

Swing is shown in percentage points, not percent — the difference matters. Going from 20% to 21.3% is a change of 1.3 percentage points, even though it is a 6.5% relative increase in support. This site always uses the percentage-point version (written as "pt", e.g. "+1.3pt"), since it directly reflects how much of the electorate a candidate gained or lost, rather than how big that change was relative to their starting point.

"Previous election" does not mean a single fixed year for every candidate — it means that specific candidate's own most recent prior run. A candidate who ran in 2016 and again in 2025, skipping 2019 and 2022 in between, is compared 2016-to-2025 by default. A year picker lets you compare any two of a candidate's runs, not just their two most recent ones. Candidates who have only run once have no swing to show, since there is nothing earlier to compare against.

A swing that rounds to 0.0pt is treated as essentially unchanged ("flat"), not as a small gain or loss, and is colored gray rather than green or red — this avoids implying a meaningful shift happened when the numbers barely moved at all.

How swing colors and summaries are decided

On the map and in bar charts, green means a candidate's vote share went up in that place between the two selected elections, red means it went down, and gray means it stayed effectively flat. Darker shades mean a bigger swing; lighter shades mean a smaller one. The darkest shade always represents the single largest swing found anywhere in the current view, so color intensity is relative to that election and that candidate, not a fixed scale.

Summary lines like "gained support in 111 out of 113 provinces" are counted across every province or municipality where that candidate has data in both years being compared — not just the handful of bars a chart displays at once. Charts that can't fit every place on screen show a representative sample instead (the biggest drop, the biggest gain, and a few points in between), but the counts and percentages in the summary text always reflect the full dataset.

Compare: support-pattern score

The Compare tab's Similar Support Pattern section asks a different question from rank or vote share: not "Who got more votes?" but "Who was strong and weak in the same places?"

To do this, the site builds one province/city vote-share profile per candidate for the selected year. It then compares those profiles using a standard correlation score that runs from -1 to +1.

  • Closer to +1 — the two candidates tended to be strong and weak in the same places.
  • Around 0 — their support patterns were not closely related.
  • Closer to -1 — one tended to be strong where the other was weak.

This is a pattern score, not a popularity score. Two candidates can have very different national ranks but still score as similar if their support rises and falls in many of the same places. Likewise, a high score can suggest similar regional appeal, but it does not by itself prove any political alliance.

Compare: shared strongholds

In the Compare tab, a stronghold means a place where a candidate performed especially well in the selected year, measured by vote share.

The site ranks every province/city unit for each candidate by vote share, then keeps only that candidate's top 30 places. This keeps the comparison size consistent across years, instead of changing between 29 and 30 as province/city coverage changes.

The comparison then splits those places into three groups:

  • Candidate A only— places in the first candidate's top-30 list but not the second candidate's.
  • Shared— places appearing in both candidates' top-30 lists.
  • Candidate B only— places in the second candidate's top-30 list but not the first candidate's.

The horizontal bar summarizes how many places fall into each group and what share of the combined stronghold lists each group represents.

In the province lists below that bar, "only" columns show each candidate's own vote share in that place. The Shared column shows one percentage because it uses the average of the two candidates' vote shares there, giving a single number for sorting and display. A place counts as shared because both candidates made their own top-quarter lists there, not because of this average.

Province strength ("1.4x national average")

Some province charts show a candidate's performance as a multiple of their own national average that year, instead of a raw percentage — for example, "1.4x" means the candidate did 40% better in that province than they did nationally that same year; "0.7x" means 30% worse. A value of exactly 1.0x means the province matched their national performance exactly.

This is a different figure from vote-share swing above — it compares a candidate against themselves, in one place versus the whole country, within a single election, rather than comparing the same place across two different elections.

"Did not run"

A candidate is shown as "did not run" in a given year simply when there is no record of them appearing on the ballot that year in the source data — it is not a computed statistic, just a direct reflection of whether that election's file contains an entry for them at all.

Frequently asked questions

Is this official COMELEC data?

No. This is an independent, unofficial project, not affiliated with or verified by COMELEC. The dataset was compiled municipality by municipality from individually sourced files, and results from some municipalities are missing, so rankings, tallies, and vote counts shown can diverge from official COMELEC results.

Which election years are covered?

Seven Philippine senatorial election years: 2007, 2010, 2013, 2016, 2019, 2022, and 2025, each broken down to the municipality level.

Why might a candidate’s numbers here differ from other sources?

Some municipalities are missing from the underlying source files. Where a municipality is missing, its votes are absent from every total, rank, and vote share computed from this dataset, including national and provincial figures, so outcomes shown can diverge from the official count.

Why do some "provinces" show up as cities, like Davao City or Cebu City?

Highly Urbanized Cities (HUCs) — Davao City, Cebu City, Iloilo City, and others, plus every city in Metro Manila — are administratively independent of the province they sit in, so their voters do not take part in provincial elections. Philippine geographic data reports each HUC as its own unit rather than folding it into the province around it, so both may appear side by side here, for example "Cebu" and "Cebu City" as separate entries. On the map, Metro Manila’s cities are merged into one "Metro Manila" area; other HUCs are still shown as their own standalone shape.

"Swing vs. previous election" — previous relative to what, exactly?

It means that candidate’s own last time on the ballot, not a fixed year like 2022 for everyone. A candidate who ran in 2016 and 2025 but skipped 2019 and 2022 is compared 2016-to-2025, since those are their two most recent runs. You can change which pair of years is compared using the year picker above a swing chart, as long as the candidate ran in both.

Why can a candidate’s rank move without their vote share moving much, or vice versa?

Rank and vote share are answering two different questions. Rank compares raw vote totals against every other candidate that year and place, so it shifts whenever the field around a candidate changes, even if their own vote share barely does — for example, a strong new candidate entering a race can push someone from rank 3 to rank 5 without that person losing a single voter. Vote share, by contrast, only looks at one candidate’s own slice of the vote, so it moves only when their own support actually changes.

What does “Gap from Avg” mean in the Compare tab?

It shows how far a candidate’s vote share is above or below the average candidate in that same national, provincial, or municipal field. The average is simply 100% divided by the number of candidates being compared there. A positive value means the candidate did better than the field average; a negative value means worse.

What does a similarity score like 0.84 or -0.55 mean?

It is a pattern score, not a vote-share percentage. Scores closer to 1 mean two candidates tended to be strong and weak in the same provinces/cities. Scores near 0 mean their support patterns were not closely related. Scores closer to -1 mean one candidate tended to be strong where the other was weak.

What counts as a “shared stronghold”?

For each candidate, the site ranks all province/city units by vote share in the selected year and keeps only that candidate’s top quarter of places. Any place that appears in both candidates’ top-quarter lists is counted as a shared stronghold. Places that appear in only one list are shown on that candidate’s side only.

Why does the shared-strongholds list show one percentage for a place if two candidates are being compared?

For shared places, the list shows the average of the two candidates’ vote shares there. This gives one compact number for sorting and display. The overlap itself is based on whether both candidates made their own top-quarter lists, not on this average.

Does the site show voter turnout or margin of victory?

No. The source files’ registered-voter and ballot-count columns were removed early in cleaning (see "Removing non-vote data" above) because they were inconsistent and not needed for vote-share or rank calculations, so no turnout percentage or victory-margin figure is computed anywhere on the site.

Rankings and totals will not match official results

The rankings, tallies, and vote counts shown here do not correspond exactly to official COMELEC results. This dataset was painstakingly compiled municipality by municipality from individually sourced files rather than a single authoritative feed, and results from some municipalities are missing. Where a municipality is missing, its votes are absent from every total, rank, and vote share computed from this dataset — national and provincial figures included — so outcomes shown here can diverge from the official count. This is an independent, unofficial project, not affiliated with or verified by COMELEC. If a number looks wrong, treat it as a reason to verify against COMELEC's official results, not as certain.

Province-level charts, tables, and the map also list Highly Urbanized Cities (Davao City, Cebu City, Iloilo City, and others) as their own entries alongside their geographic province, since these cities are administratively independent and are reported separately in the underlying data. See the FAQ above for details.