Two datasets that do not describe the same country. A portal scrape of 1,500 property listings, median ask ₱9.2M — and national figures showing 48.48% of households with drinking water that is safely managed and 59.5% cooking on clean fuel.
The old version of this page led with an average asking price of ₱32.8M. That figure is arithmetically correct and descriptively useless: the mean is 3.57 times the median because 103 of the 1,451 priced listings ask ₱100M or more, one of them ₱2.50B.
The 1,451 priced listings distributed across price bands. The mean sits in the fifth band; three-quarters of the listings sit below it.
Half the listings ask less than this.
3.57 times the median. The single highest listing asks ₱2.50B, and 103 ask ₱100M or more.
A check rejects anything below ₱100,000 as a parse failure rather than a house; this one is real.
Median asking price and median price per square metre of floor area, for the 22 city tokens with at least 20 listings that state a floor area. The two rankings are barely related.
Dearest of those 22 cities over cheapest, on median asking price.
The same cities, the same listings, divided by floor area. Muntinlupa at ₱130,683 down to Mabalacat at ₱44,490.
Across every listing that states one. Most of the price gap between an expensive city and a cheap one is this number changing, not the rate.
One comparison from that chart, on its own, because it is the clearest thing in the scrape. Cabanatuan is in Nueva Ecija, about a hundred kilometres north of Metro Manila.
Median asking price, from 119 listings. Per square metre: ₱85,058.
Median asking price, from 82 listings. Per square metre: ₱92,587.
Cabanatuan over Quezon City. On whole-house price the ratio runs the other way, 4.15 to one. The Quezon City listings are not priced at a higher rate; they are bigger.
Median asking price by bedroom count, with the listing count beside it. The medians rise cleanly to six bedrooms; past that the counts fall below 20 and the line starts jumping around on two or three listings.
The most common size in the file, 469 listings.
Across the 1,416 listings that state both a price and a floor area.
Excluded from every price figure rather than imputed. 90 further listings repeat an earlier row exactly.
This is where the page leaves the portal. The WHO/UNICEF Joint Monitoring Programme grades household water and sanitation in tiers, and the distance between two of them is the finding. “Basic” means an improved source within a 30-minute round trip. “Safely managed” means on the premises, available when needed, and free of contamination.
Of households, 2024.
The same year. A 47.38-point gap, and a check asserts that the safely-managed figure never exceeds the basic one, because if it did the two indicator codes have been swapped.
The same two tiers for toilets: 62.17% safely managed, a 24.98-point gap.
The same four services, split. Three of the four favour towns by the margin you would expect. The fourth does not, and cooking fuel is off the scale of the other three.
79.8% urban against 39.9% rural — the widest split of any service here, by a factor of three.
Rural access is 88.5%, so roughly one rural household in nine still has no connection.
Negative: 87.47% rural against 86.81% urban. The only service on this page where the countryside is ahead, and small enough that the honest reading is that the two are level.
What has actually moved. Electricity and clean cooking both climbed steadily from 2000; the water and sanitation tiers moved much less, because the easy part was already done by then.
Of households in 2024, up from 74.7% in 2000.
In 2023, up from 37.4% in 2000 — a gain of 22.1 points, and still the lowest in ASEAN.
Of the urban population, 2022. Published irregularly, so the year is stated rather than implied; 55.77% of Filipinos lived in urban areas in 2025.
Clean cooking fuel and basic sanitation across ASEAN-5 and Singapore, 2023. Both are the basic tiers: safely managed drinking water is unpublished for Thailand and safely managed sanitation for Indonesia, and a six-country chart that quietly becomes a five-country chart reads as one that never had the sixth.
59.5% in the Philippines. Last of the six.
Malaysia is next up at 83.8%. The gap to fifth place is wider than the gap between second and sixth.
Also last, at 85.99% — though the six are within thirteen points of each other on this measure, which is not true of cooking fuel.
The first half of this page rests on a scrape, and a scrape has limits that no amount of analysis removes. They are listed here rather than left to be discovered.
Not one of the 1,500 listings carries a date. The previous version of this page had charts named for growth areas and price-volume trends; there is nothing in the file those could have been computed from. A check asserts the count of dated listings is zero, so a future column cannot quietly turn this into a time series.
Every price is what a seller advertised, not what a buyer paid. Asking prices in a thin market run above transaction prices by an amount this data cannot measure, and the direction of that bias is known while its size is not.
138 listings sit in Muntinlupa and 22.6% of the file sits in three city tokens, while most of the Visayas has none. There are no survey weights, because a portal's inventory is not a survey. Nothing in the first half of this page scales to the Philippines.
The listings describe houses advertised for sale at a median of ₱9.2M. The national figures describe every household, including the 35.87% of the urban population in informal settlements. Nothing here connects an asking price to a service level, and the page does not try.
Dated transactions, a consistent basket, and geographic weights. BSP publishes a residential real estate price index built on bank loan data; it is not in this analysis because bsp.gov.ph is not reachable from a script here. That is a gap, and naming it is better than filling it with a scrape.
One fetcher, eight CSVs, two sources that are kept visibly apart.
The Kaggle mirror serves the archive without authentication. The fetcher unzips it in memory and writes the cleaned listings plus the derived tables. Two CSVs ship inside that archive and they are the same rows twice; merging them would double every listing, so only one is read.
Median price per square metre of floor area, computed per listing and then medianed, on the 1,416 listings that state both. City medians are shown only above 20 such listings, because below that the median moves on one house.
A check bounding price per square metre first failed on a ₱250M beachfront villa on Siargao at ₱1.25M per square metre and a ₱300,000 installment house in Pagadian at ₱3,750. Both are genuine listings; the bounds were wrong and were widened to catch only a unit error. The 333× spread between them is now recorded as a warning rather than hidden.
ph_housing_coverage.csv records what the scrape reaches and what it does not, one row per property, including the three zeroes that matter: no dated listings, no transaction prices, no survey weights. Coverage that lives only in a log is coverage nobody can audit.
WHO/UNICEF JMP service levels and IEA/WHO clean cooking access, fetched from the World Bank WDI API rather than from the originating agencies, because that API is reachable and returns a clean error on a wrong indicator code instead of an empty success.
A check fails if safely-managed access ever exceeds basic access for water or sanitation. Safely managed is a strict subset of basic, so a crossing would mean two indicator codes had been swapped — which is not the kind of mistake that looks wrong on a chart.
Every figure on this page traces to one of these, through a CSV in
data/ph-housing/. Each is checked against its source query on every
build.
1,500 property listings scraped from a Philippine property portal: asking price, location, bedrooms, bathrooms, floor and land area, coordinates — Asking prices, not transactions. No listing carries a date and none carries a survey weight, so nothing here scales to the country and no trend can be computed.
Household drinking water and sanitation service levels for the Philippines, 2000-2024, at both the basic and safely-managed tiers, split urban and rural — The national counterweight to the listings. JMP distinguishes 'basic' access from 'safely managed'; the gap between the two is most of this page.
Share of population with primary reliance on clean cooking fuels and technologies, Philippines and ASEAN-5 plus Singapore, 2000-2023
Urban population share 1960-2025 and the share of that urban population living in informal settlements, 2000-2022 — The informal-settlement series is published irregularly; the page states its year rather than treating the last value as current.
If you have raw data and want to transform it into meaningful insights like this analysis, I'd love to help! Whether it's business data, research datasets, or any information you want to visualize and understand better.
Have a dataset you'd like analyzed or need a mini AI project as a starter guide? Send me your suggestions!
I wrote a companion post — “The Cheap City Is Not Cheap. It Is Just Smaller.” — in simple, everyday words.