Under the hood

Methodology

Transparent, reproducible and statistically honest. Here's exactly how the numbers are made.

Statistics

For every country × category we compute the mean, median, 25th/75th percentiles, standard deviation and coefficient of variation.

Minimum is defined as the mean of the cheapest 1st percentile of observations; maximum as the mean of the most expensive 1st percentile — robust to single freak values.

All statistics are stored canonically in USD and converted to your display currency on the fly using daily exchange rates.

Quality control

Any observation more than 5 standard deviations from the local median is flagged as suspicious — never deleted — and held out of public statistics.

An absolute sanity check excludes values that fall outside a band around each category's global base price: below 4% of it, or above 30× it. For a litre of gasoline, whose base price is $1.35, that band runs from $0.05 to $40.50 — wide on purpose. It is a guard against typos, wrong currencies and impossible numbers (a $0.20 haircut, a $1,000,000 hotel night), not a judgement on whether a price is unusually high.

Suspicious and excluded values are preserved internally so moderators can review them, but they don't distort the public numbers.

Reliability score

Every statistic carries a 0–100% reliability score. Three things move it: how many observations are behind the number (40%), how tightly they agree (25%) and how recent the newest one is (20%). The remaining 15% is a contributor-reputation term that is currently fed the same constant for every statistic, so it lifts all scores equally instead of separating them — it is an offset today, not an input.

Reliability is a measure of the evidence, not of the price. Most country × category cells here still rest on a single observation, and one point can be neither dispersed nor corroborated, so most scores here sit in the mid-50s today and rise as more prices come in. A number carrying a low score is not wrong; it is thinly supported, and the badge is there so you can tell the difference.

Indices & the World Cost Index

Each index is a weighted basket of categories. We standardize every category's price across all countries (robust min-max on log prices), take a weighted average, then rescale to 0–100.

100 means the most expensive country in the world for that basket; 0 means the cheapest. The same method powers every map mode and ranking.

Arbitrage & opportunity scores

The Arbitrage Explorer standardizes each country's price for a good or service against every other country's — the same robust min-max on log prices the indices use — and reports the inverse as an opportunity score from 0 to 100, where 100 is the cheapest place with data for that item. It is a rank across countries, not a comparison against a single reference price.

Each row also shows how far that country's median sits from the global median, in percent. That figure is displayed beside the score but does not feed it: one tells you where a country places among the others, the other tells you the size of the gap.

Curated decks combine baskets to surface the best-value destinations. The digital-nomad deck, for example, is built from mid-range restaurant meal, budget restaurant meal, monthly gym membership, metro/transit ticket, coca-cola 330ml, milk 1l. No deck includes accommodation.

Travel score

The Travel page scores every country 0–100 on how good a time it is to visit, right now, from an origin city and month you pick. The score is the unweighted mean of four equally-weighted components — cost of living adjusted for currency strength, real flight fares, season, and attractiveness — using only whichever of the four have data for that country.

Cost reuses the existing Cost of Living index plus a currency-strength bonus: a z-score of the currency's recent change against its own 5-year volatility, from ExchangeRate history (Yahoo Finance, the same source scripts/update-exchange-rates.ts pulls from). Flights use the Travelpayouts Aviasales Data API. Season combines Open-Meteo's 1991–2020 climate normals with curated, individually sourced seasonal events (festivals, monsoons, aurora and ski windows). Attractiveness combines absolute and per-capita international tourist arrivals (World Bank indicators ST.INT.ARVL and SP.POP.TOTL) and UNESCO World Heritage site counts, weighted 35% / 35% / 30%.

Missing data is excluded, never invented or defaulted: a country lacking a component drops it from the average, and its tooltip discloses “Based on N of 4 inputs.” Where no real fare exists for a route, a fare is estimated by fitting price against distance on the real fares from that same origin — never a hand-written constant — requiring at least 8 real routes from that origin, and is badged “estimated” everywhere it appears, in the map tooltip, the ranked destination list, the breakdown panel and the API payload.

Coverage today, honestly: of 89 countries, all 89 have a cost score and all 89 have climate normals. 86 have attractiveness — Hong Kong and Taiwan are absent from the UNESCO source, and Pakistan's most recent usable arrivals figure is from 2012, too old to sit in a percentile beside the others. Flight fares have none at all: that needs a Travelpayouts token, and until it is set no part of the score varies by the departure city you choose. So 86 countries score on 3 of the 4 components and 3 score on 2; that is the missing-data rule working as designed, not a bug.

One caveat worth stating about attractiveness: the World Bank's tourist-arrivals series stops in 2020, and 2020 is the pandemic trough. Countries are therefore read at a common pre-pandemic reference year — each one's most recent within 2015–2019, recorded alongside the figure and shown in the breakdown — because taking each country's latest available value would have compared Japan's 2020 collapse against Thailand's 2019 peak and called it a ranking.