One row for ten million people
Korea’s national public toilet catalogue holds 51,228 records. Group them by province and Gyeonggi returns 12,245, Gyeongnam 5,732, Jeju 1,099. Seoul returns 1.
Seoul is Korea’s capital, home to roughly nine and a half million people, and unquestionably has more than one public toilet. The single row is not a data-loss incident. It is what happens when a national dataset is assembled from whatever each local government chooses to publish, and one of them publishes somewhere else.
Seoul’s public toilets are published through the Seoul Open Data Plaza, the city’s own open-data service, which predates and operates independently of the national standard. We read that feed separately: 4,655 records. Add them and the real total is 55,883.
The national dataset is 20 feeds wearing one name
The deeper point is that “the national toilet dataset” is not one pipe. It is a schema that many organisations publish into, plus an aggregation. When we trace every record in our catalogue back to the feed it arrived on, we get twenty distinct sources.
| Feed | Records | Share |
|---|---|---|
| National standard dataset | 31,529 | 61.5% |
| Gyeonggi provincial feed | 10,829 | 21.1% |
| Jeonbuk provincial feed | 3,209 | 6.3% |
| Gyeongnam provincial feed | 1,856 | 3.6% |
| Jeju provincial feed | 717 | 1.4% |
| Gyeongbuk provincial feed | 702 | 1.4% |
| Incheon municipal feed | 691 | 1.3% |
| Daejeon municipal feed | 437 | 0.9% |
| Korea Rail Network Authority (stations) | 318 | 0.6% |
| Jeonnam provincial feed | 277 | 0.5% |
| Korea Expressway Corp. (rest areas) | 198 | 0.4% |
| Ten smaller municipal feeds | 465 | 0.9% |
| Total | 51,228 | 100% |
Daegu is the clearest illustration. Its own feed contributes exactly one record — yet Daegu has 1,812 toilets in our catalogue, because the other 1,811 arrive through the national standard dataset. Read the feed column as a routing table, not a scoreboard.
Why Seoul’s numbers should not be merged into the table
It is tempting to bolt Seoul’s 4,655 records onto the national table as a sixteenth row and publish a tidy nationwide ranking. We deliberately do not, and the reason is visible in the numbers.
| National catalogue | Seoul dataset | |
|---|---|---|
| Records | 51,228 | 4,655 |
| Accessible facilities recorded | 21,179 (41.3%) | 2,534 (54.4%) |
| Changing tables recorded | 5,746 (11.2%) | 1,481 (31.8%) |
| Emergency bells recorded | 17,131 (33.4%) | 2,392 (51.4%) |
Seoul’s records are curated location by location and maintained by a single city government. The national catalogue is bulk-submitted by hundreds of local authorities with varying capacity. Putting 54.4% next to 41.3% in one ranked column invites the reader to conclude that Seoul’s toilets are better equipped, when what the data supports is that Seoul’s paperwork is more complete.
This is the most common way open-data comparisons go wrong: two numbers that are each correct, placed in a column that implies they were measured the same way. They were not.
What the Seoul dataset itself contains
Of the 4,655 Seoul records, 4,372 come from the Seoul Open Data Plaza and 283 are subway-station toilets from the metro operator. By access type, 3,308 are designated public toilets and 1,347 are privately owned facilities opened to the public under the city’s open-toilet scheme — restaurants, cafes and shops that let non-customers use their facilities, usually marked with a sticker on the door.
That second category is worth knowing about as a visitor. Roughly 29% of Seoul’s mapped toilets are in private premises, which is why a map pin sometimes leads you to what looks like an ordinary cafe. It is not a mistake; you can walk in and use the toilet.
One defect this article shipped with, now fixed: the Seoul dataset had inherited 7 subway-station toilets that are physically in Seongnam, Gyeonggi — not Seoul. The builder’s only Seoul filter was a regular expression looking for a “-gu” (district) in the address, and it worked by accident. The same line runs on to Hanam and Uijeongbu, but those are cities without a “-gu”, so they were dropped; Seongnam, a metropolitan city that does have districts, slipped through. Fixing the filter surfaced a larger bug beside it: the parser split the source file on every comma, so a quoted field such as “exit 1,2” shifted every later column by one — putting phone numbers where opening hours belong in 72 of the 284 subway rows the file then held — and dropping six station toilets entirely. Both are fixed. The seven Seongnam toilets now sit in the national catalogue where they belong, the six lost ones are back, and Seoul reads 4,655 records. We keep this note because an article about data quality that hid its own would be a poor article.
Need this near you right now? Open the app.
Open Bballi BballiHow to spot this in any dataset
We only noticed Seoul’s single row because we grouped by province before building anything. Had we skipped that step, the app would have shipped with one toilet in the capital and nobody would have seen it until a user in Seoul opened the map. Four checks catch almost every version of this problem.
- Group by every categorical column and read the extremes. Not the top ten — the bottom. A national dataset where some region returns 1, or 0, is telling you about its plumbing, not about that region.
- Compare the total against an independent figure. Our catalogue says 51,228; the app displays roughly 55,883. That 4,655 discrepancy was the thread that led to Seoul’s separate feed. Reconciling two totals is the cheapest bug-finder there is.
- Check whether a “no” can be distinguished from a blank. If the schema stores both as false, every percentage you compute is a registration rate whether you call it one or not.
- Trace records back to the feed they arrived on. A field called “source” is usually the fastest route to understanding why a dataset has the shape it has.
The general lesson is that the most dangerous data problems are the ones that produce plausible output. A crash gets fixed on the day. A province quietly reporting one toilet renders perfectly, sorts correctly, and charts beautifully — and is wrong by four orders of magnitude.
What this means if you use Korean open data
- A national standard dataset is not a census. It is the subset that publishing bodies routed through the standard. Check for the big absences before drawing conclusions.
- Seoul and Gyeonggi frequently publish separately from national aggregations, because both run mature open-data programmes of their own that predate many national standards.
- Zero and one are suspicious values. In a dataset of tens of thousands of rows, a province returning a single-digit count is far more likely to be a routing artefact than a real-world fact.
- Completeness rates are not comparable across differently collected datasets — even when the schema is identical.
None of this is a criticism of Korea’s open-data programme, which is unusually good: the data is free, well documented, and licensed for commercial use. It is simply federated, and federated data has seams. Knowing where the seams are is most of the work.
Sources and method
- 전국공중화장실표준데이터 — Nationwide Public Toilet Standard Data, Ministry of the Interior and Safety, the national aggregation described above.
- Seoul Open Data Plaza, source of the 4,655 Seoul records, released under the Korea Open Government License.
- Feed attribution was taken from the source reference stored on every record in our catalogue, counted on 6 August 2026. Full source and licence details are on our /data-sources page.