Vicinus.

Methodology

Livability score.

The livability score is a single 0–100 number summarising how well a neighbourhood supports day-to-day life. It is a weighted blend of four sub-indices — walkability, schools, amenities, and transit — each computed from open data by fixed arithmetic.

There is no model and no language model anywhere in the calculation. The same inputs always produce the same score.

Weights version v1

The blend

Livability is the weighted arithmetic mean of four sub-indices, each itself on a 0–100 scale.

Livability = Walkability × 0.30
           + Schools     × 0.25
           + Amenities   × 0.25
           + Transit     × 0.20

The weights are an editorial judgement, not a derived result. They reflect a simple ordering: the ability to reach everyday life on foot matters most, school access and the breadth of nearby amenities matter roughly equally, and transit — valuable but a partial substitute for walkability — carries the smallest share. Because they are a judgement, they are versioned, and the version each score was computed under is stored with it.

When a sub-index is missing

If a sub-index cannot be computed, it is dropped and the remaining weights are renormalized to sum to one. A neighbourhood is never penalised for data we do not have.

In practice this applies to transit, which is only available where an agency GTFS feed covers the area (see Transit). Where transit is unavailable, the effective weights become:

Sub-indexNominal weightEffective weight without transit
Walkability0.300.375
Schools0.250.3125
Amenities0.250.3125
Transit0.20
This is a real limitation, not just a technicality. Two neighbourhoods whose scores were computed over different sets of sub-indices are not strictly comparable, because one of them was measured on three dimensions and the other on four. The stored transit sub-score is the way to tell which is which.

The four sub-indices

Walkability — weight 0.30

Distance-decayed, variety-weighted access to nine categories of everyday destination, computed from OpenStreetMap points of interest within 1.5 km of the neighbourhood centre. It is the largest single input into livability and has its own detailed write-up.

Read the walkability methodology →

Schools — weight 0.25

Locations only. We do not score school quality. Vicinus does not publish, license, or rank school performance data. This sub-index measures access to schools, nothing more.

Schools = 100 × (0.6 × nearestSchoolAccess + 0.4 × levelCoverage)
  • Proximity (60%) — distance decay to the nearest school of any level: full credit at or within 800 m, decaying linearly to zero at 3,000 m.
  • Level coverage (40%) — how many of elementary, middle, and secondary are represented nearby, as a fraction of three.

OpenStreetMap rarely tags a school’s level, so level is inferred from the school’s name — for example “elementary” or “primary”, “middle” or “junior”, “secondary” or “high school”. A school whose name does not identify a level counts toward proximity only.

An earlier version credited unlabelled schools to all three levels. Because most OpenStreetMap schools are unlabelled, that handed a perfect 100 to any area with a single school of unknown type — it was inventing coverage it had no evidence for.

Amenities — weight 0.25

Distance-decayed density of the same nine categories, but with a hard cap of three points of interest per category, so variety beats raw count. Full credit at or within 400 m, decaying linearly to zero at 2,000 m. The result is normalized against every category contributing at full strength — nine categories × three each = 27.

The tighter distance band and the per-category cap deliberately differ from walkability’s formulation, so the two sub-indices are not measuring the same thing twice.

Transit — weight 0.20

Transit is computed from published agency GTFS schedules, not from a commercial score. Each stop contributes its peak-weighted weekday trip count, distance-decayed from the neighbourhood centre.

  • Service level. Every scheduled weekday stop event counts once; events arriving in the morning peak (06:00–08:59) or afternoon peak (15:00–17:59) count double, so a stop with rush-hour frequency is worth more than one with the same daily total spread thin.
  • Distance. Stops within 400 m of the centre count in full, decaying linearly to zero at 1,200 m. Stops beyond 1,200 m are ignored. Unlike the other sub-indices, transit distance is measured straight-line, without a walking detour adjustment.
  • Normalization. The decayed, weighted sum is scaled against a fixed anchor calibrated to the Metro Vancouver distribution and clipped at 100, so frequent-service hubs reach the ceiling and low-service edges land near zero.
  • Weekday baseline. A representative weekday schedule is used. Holiday and seasonal calendar exceptions are not modelled, and weekend and late-night service are not scored separately.

Coverage. A transit sub-score is only produced for neighbourhoods inside the area an available feed actually covers — currently TransLink’s Metro Vancouver service area: Vancouver, Burnaby, Richmond, Surrey, Coquitlam, Port Moody, Port Coquitlam, North Vancouver, West Vancouver, and New Westminster. Outside that set, and for any neighbourhood with no stop within range, the transit sub-score is recorded as unavailable rather than as zero, and its weight is redistributed as described above.

Why healthcare is not its own dimension

Healthcare is not one of the four dimensions blended into the composite. There is no healthcare sub-score sitting alongside walkability, schools, amenities and transit, and no weight assigned to one.

It is not absent from the model, though, and it would be misleading to imply otherwise. Clinics and pharmacies are one of the nine everyday-destination categories counted by the walkability and amenities sub-scores, carrying the same weight there as banks or entertainment. So healthcare presence does reach the composite — just as one ordinary category among nine, rather than as a pillar of its own.

The reason it is not a pillar: proximity to a hospital is not the same as access to healthcare. That depends on catchment, referral pathways, specialty and wait times, none of which exist in the underlying map data. Living next to a hospital is also frequently a negative for noise and traffic. Elevating it to a top-level dimension would assert a precision we do not have, so hospitals appear on the neighbourhood page as local information rather than as a score.

The “Top X%” percentile

A score of 78 means nothing without a reference point, so each neighbourhood is also ranked against a pool of peers.

percentile = 100 × (scored neighbourhoods in the pool at or below this one)
                        ÷ (scored neighbourhoods in the pool)

Top X%     = 100 − percentile

The reference pool is the province

By default the pool is the neighbourhood’s province — so a Metro Vancouver neighbourhood is ranked against scored neighbourhoods across British Columbia, not against the rest of its city or its metro area.

City was tried first and is unusable: most cities in the dataset contain a single neighbourhood, so every neighbourhood ranked in the 100th percentile against itself. Metro area would be the better grain — “top 10% in Metro Vancouver” is more useful to a buyer than “top 10% in BC” — but the underlying data has no metro grouping, so province is the coarsest-but-meaningful pool available. A neighbourhood can be assigned an explicit reference region, which always overrides the province default.

Two consequences worth being explicit about. A province-wide pool includes rural and remote neighbourhoods, which flatters urban neighbourhoods relative to a metro-only comparison. And the pool contains every scored neighbourhood in the province, including many that are not currently browsable on Vicinus.

Reproducibility and versioning

Scoring is an offline batch job. Nothing is scored while you load a page — the neighbourhood page reads precomputed values. Each run persists its result together with the provenance needed to recompute it.

Stored valueMeaning
Livability scoreThe 0–100 composite
Walkability, schools, amenities, transit sub-scoresThe four inputs, stored individually so the blend can be audited
Livability percentileRank within the reference region
Weights versionThe weight set used (currently v1)
Computed atWhen the score was produced
Reference regionThe pool the percentile was taken against
Snapshot versionThe dated points-of-interest snapshot the score was built from

Changing the weights means bumping the weights version. Scores computed under different versions are not comparable, and we treat them as different measurements rather than silently restating history.

Null, never zero

A neighbourhood with no points-of-interest snapshot is left unscored, not scored zero. A failed data fetch is indistinguishable from a genuinely amenity-free area once you write a zero, and a single bogus zero drags down the percentile of every other neighbourhood in the pool. Unscored neighbourhoods are excluded from the ranking pool entirely.

One honest exception: this rule operates at the neighbourhood level. Within a neighbourhood that does have a snapshot, a sub-index with no qualifying points of interest — for example a snapshot containing no schools — scores zero rather than being treated as missing.

Personalized match

Signed-in users who have stated lifestyle priorities also see a match percentage alongside the neutral livability score. This is the same four sub-indices re-blended with weights derived from those priorities: each stated priority maps to a dimension, earlier priorities carry more weight than later ones, and every dimension keeps a small baseline weight so nothing drops out entirely.

The reason and caution labels shown next to it are templated directly from the sub-scores against fixed thresholds — a strong dimension produces a positive label, a weak one produces at most a single caution, preferring a dimension the user actually said they cared about. Nothing here is generated text.

Users with no stated priorities see the default weights and are not shown a personalized match. Personalization changes only how the sub-indices are weighted for one reader — it never changes the underlying sub-scores or the public livability score.

Known limitations

These are accepted trade-offs in the current version, stated so you can weigh the score accordingly.

  • Transit coverage is partial. Outside the area covered by an available agency feed, transit is not scored at all and its weight is redistributed across the other three sub-indices.
  • The percentile pool is the province. Not the city, not the metro area, and it includes neighbourhoods that are not browsable on the site.
  • One point per neighbourhood. Scores are computed from a single centroid rather than a grid of sample points, so large or irregularly shaped neighbourhoods are represented by their centre only. A score never describes a specific address.
  • Distances are approximated, not routed. The walkability, schools, and amenities sub-indices use straight-line distance with a fixed detour factor, which ignores rivers, highways, rail lines, and dead ends.
  • Map data completeness varies. OpenStreetMap coverage is excellent in dense urban areas and thinner elsewhere, which can understate smaller communities.
  • Schools measure access, not quality, and level coverage depends on how schools happen to be named in the map data.
  • The weights are a judgement. A different defensible weighting would produce different rankings. That is why the sub-scores are published individually alongside the composite.
  • Not measured at all: safety, affordability, noise, air quality, commute time to a specific workplace, and everything about a place that is not a mappable destination or a scheduled transit trip.

Data attribution

Points of interest are derived from OpenStreetMap. Map data © OpenStreetMap contributors, available under the Open Database License (ODbL). Data is queried through the Overpass API.

Transit service levels are derived from published GTFS feeds. Metro Vancouver service data is © South Coast British Columbia Transportation Authority (TransLink), used under the terms of its open data licence. Where other agency feeds are used, the same attribution applies to the publishing agency. Vicinus is not affiliated with, endorsed by, or sponsored by any transit agency, and neither agency is responsible for the scores derived from its data.

School locations come from OpenStreetMap and reflect where schools are, not how they perform. Vicinus does not publish, license, or rank school quality data.

We use cookies to understand how you use Vicinus and improve your experience. Read our Privacy Policy.