K.V. Contino

Metro Relocation

A tunable model for screening where to live.

2026-07-15 · Python · GeoPandas · OSMnx · Census / OSM / FBI UCR / BEA / NAIC

Most "best places to live" rankings hand you a single number and hide the data sources and value judgments behind it. This one turns those judgments into controls. Decide how much each one counts, and draw hard lines in real units. The output updates the moment you change the model.

Start here

Two shortlists

The ranking below moves when you move a slider.

Could top the list

There exists a coherent set of priorities — each weight within half to double the chosen value — under which this neighborhood ranks first.

    Clears every core axis

    No core axis below the pooled average, and under the $2,700 ideal-band ceiling.

      Set the model

      Choosing a neighborhood

      Weight sets how much a dimension counts toward the composite,. Each filter is a hard cutoff in the dimension's real units. Three dimensions have no single intuitive unit (the dwelling itself, cost, and public-housing proximity), so they are weight-only. Cost is enforced by the rent ceiling. Governance and professional depth are scored at the metro level. Quiet carries no weight, and is instead enforced as a floor before anything reaches this table.

      423 of 423 neighborhoods pass— across all sixteen metros, under your current filters
      Weight — share of the compositeFilter — hard cutoff in real units
      DimensionWeight →shareFilter →cutoff
      How much the city counts
      25% city · 75% neighborhood

      Each score above combines two comparisons. The neighborhood — how this place compares to others in its own metro. The city — how that metro compares to the other seventeen. At 0 a strong neighborhood in a weak metro wins; at 100 only the metro matters and neighborhoods stop being ranked at all.

      Maximum all-in rent
      no cap
      The metros

      This uses the metro-level weights from the model and does not move with the sliders above.

      Your income & filing
      $100,000

      Sets the state & local income tax that lives inside Under budget — the axis scores your total monthly cost, and tax moves with income. Federal tax is the same everywhere, so it's left out. Default: $100,000, single.

      Neighborhood Value Dot Plot

      Rent against your scores

      Every surviving neighborhood is placed by all-in rent1 against its composite under the model's current neighborhood weights. The dashed crosshair marks the field's medians, splitting it into quadrants. The lower-right is the sweet spot: a strong fit for less money. Each metro has its own color, and each dot is sized by its rental stock, so bigger dots hold more listings to choose from. Highlight a metro to pull it out of the field; hover over any point for its profile.

      1Base rent plus the reserved parking and pet rent that a listing quote leaves out.

      Neighborhood Ranking

      Top of your field

      This ranks the highest-scoring survivors across all sixteen metros using the selected weights (i.e. cores mean the same thing in Durham as in Boston).2

      2Mapping units still differ in size, and a bigger polygon averages away its weak spots, so read this as a shortlist to compare, not a precise ranking.

      The last column is a rank range: re-running the model 20,000 times with every slider nudged a couple of points, that is where the neighborhood usually lands out of all 1,208 survivors. A tight range means the placement owes more to the place while a wider one means it owes more to a particular set of weights. It is measured at the default weights, so it reads n/a once you move a slider — press Reset to defaults to bring it back.

      Geography

      Neighborhood Maps

      Every surviving neighborhood is shaded by its composite under the model's current weights. Darker is weaker, brighter is stronger. Each map showswater, motorways and their exits, rail lines in their official colors with rapid-transit stops, ★ downtown, ▲ airports. Hard-filter cutoffs apply here too, and filtered-out polygons fade to outlines. Hover any polygon for its profile. Pick a metro with the chips or the national map.

      Sixteen metros. Click a dot to switch.

      Neighborhood Profiles

      The fingerprint & the walkshed

      Choose a metro, then a neighborhood, to see the ten scores behind its composite and the streets within a ten-minute walk of its center.

      How the scores are built

      Methods

      The pipeline turns raw geography into eleven comparable 0–100 scores per neighborhood, then blends them on two levels. Everything the sliders do is faithful to the underlying model. Each axis is split into the metro's level (how this city compares to the other seventeen) and the neighborhood's deviation from it (how this place compares to others in its own city), and the two are standardized separately. Each hard filter is applied to the same raw metric the axis was built from. The eleventh, quiet, is still measured and still shown, but it carries no weight by default: it acts as a floor instead. Within a metro, quiet and street life correlate −0.63. Past “not on an arterial,” more quiet is not better. Neighborhoods below the bar are dropped outright; the slider is left live so you can put weight back on it and see what happens.

      Composite

      For a neighborhood with axis scores aᵢ and your weights wᵢ (normalized to sum to 1):

      composite = Σ wᵢ · aᵢ

      A neighborhood is screened out if it fails any hard filter — too few essential services per square mile, too little green space, too high a crime rate, too few bus stops, too far from a highway ramp, or over the rent ceiling.

      Turning geography into 0–100

      Every axis is mapped onto 0–100 by an absolute ruler — a fixed dollar range, a crime rate per thousand, a canopy percentage — so a score means the same thing in every metro. Many are deliberately saturating: a response curve that rises fast, then flattens once "enough" is reached. Everyday walkability hits about 50 at a minimum service density and ~67 at twice that, so past a genuinely walkable threshold the axis stops rewarding ever-denser commercial cores. Rail access behaves the same way. The filters, by contrast, act on the raw metric directly (services per square mile, percent green, crimes per thousand), which is why they read in plain units rather than 0–100.

      Standardized scores, honest sliders

      Every axis is standardized before weighting: z-scored against frozen reference constants (the mean and spread of the full survivor pool at calibration), displayed as 50 + 20 points per standard deviation, clipped to 0–100. So 50 means "average for a surviving neighborhood," everywhere, on every axis.

      Finalists

      Survivors clear the hard filters; finalists additionally clear a stricter satisficing band: no core axis (housing, street life, cost, quiet, safety) below the pooled average at all, and all-in rent at most $2,700.

      What it actually costs

      A rent index is not a bill. Three things sit between the two, and this model now carries all three.

      All-in rent adds what a quote leaves out to a base adjusted for the fact that the unit you want is not the median unit. That adjustment is calibrated against a real listing scan of one corridor, where units meeting a fixed spec (≥850 sq ft, in-unit laundry, reserved parking) ran about 11% above their ZIP's index, most of it fees rather than base rent. Applying that premium to the other fifteen metros is an assumption.

      Total monthly cost adds utilities (the gap between ACS gross and contract rent), state and local income tax, car insurance, and a goods-and-services basket scaled by BEA's regional price parities. Federal tax and FICA are excluded on purpose: for an income that doesn't depend on where you live, they are identical everywhere and can only dilute the comparison.

      The metro cost gap is almost entirely housing and tax — groceries and services differ by only a few percent between the cheapest and priciest metros here, while housing differs by nearly half. And state and local income tax swings roughly $850 a month across these metros at a six-figure salary — larger than most of the rent differences being weighed against each other, and invisible to every price index. Within a single metro it can dominate: the same salary is taxed about $270/month more in the Maryland suburbs than across the river in Virginia.

      Because tax is this large, the Under budget dimension scores your total monthly cost — the whole bill above, income tax included — not rent alone. That makes it income-dependent, so the controls carry an income slider and a single / married-jointly toggle: move them and every neighborhood's tax, total cost, and score recompute in the browser from each state's 2026 brackets (Maryland's county piggyback, Philadelphia's wage tax and New York's high-earner recapture included).

      Governance

      A small (4%) dimension proxies how well a place is run by its general-obligation bond ratings — the state's and the principal city's — blended and put on one absolute scale (Aaa best, Baa weakest). Rating agencies already price structural balance, pension funding and reserves and normalize across jurisdictions. A suburb takes its state's rating rather than its central city's, so an independently governed town isn't tarred with its metro's weakest credit. It is deliberately light: it separates the clear outlier — Illinois paired with Chicago's near-junk city rating — without letting a bond score override the things you actually live with.

      Safety

      Violent-crime rates are put on one absolute ruler, safety = 100 · (1 − rate / 16) where rate is violent incidents per 1,000 residents (16 ≈ the pooled 90th percentile). Each neighborhood's own rate is first blended 60/40 with its neighbors' population-weighted rate — a light spatial pooling so a quiet block inside a rough district isn't scored as an island. Four metros (Albany, Buffalo–area suburbs, Syracuse, Worcester) publish no incident-level crime; there the rate is city- or agency-uniform, and the crime filter simply passes those neighborhoods through rather than guessing.

      Fixing the units problem

      Walkability and greenery are population-weighted across census block groups rather than averaged over raw area, so a large, mostly-empty polygon isn't dragged down by land nobody lives on (a correction for the modifiable areal unit problem). Greenery is measured as tree canopy over where people live (NLCD 30 m, population-weighted) plus a saturating park-access term — leafy streets count, a preserve edge doesn't. Concentrated public housing enters as a proximity disamenity — the "away from public housing" axis — plus a hard gate for tracts that are themselves majority public housing.

      Dot size — rental stock

      On the scatter, each dot is scaled by the neighborhood's renter-occupied housing units — a stand-in for how many rental options exist there — area-weighted from ACS block groups (table B25042). Because the mapping units differ in size (Chicago is drawn as 77 community areas of ~36,000 people; St. Petersburg as association polygons of ~1,900), raw counts span three orders of magnitude, so a true-proportional dot would be absurd. The radius instead follows the square root of the count, clamped to the 5th–95th percentile window, mapped to a 3.5–11 px range — enough to read relative depth of market without letting a few districts dominate.

      Walkshed maps

      Each map is a true network catchment, not a circle. From the neighborhood centroid the pedestrian street network is walked outward along real streets, and every intersection reachable within an 800 m network distance (~10 minutes) is kept — an ego_graph truncated by travel distance. Tiles share a fixed ~1.7 km window, so two walksheds are directly comparable: a dense grid fills the frame, a cul-de-sac suburb doesn't.

      Caveats

      The mapping units are not the same size. This is the model's biggest remaining weakness. Because the composite is a weighted sum, a large polygon that averages a walkable core together with its quiet outskirts posts no weak axis. Across the surviving neighborhoods, the logarithm of a polygon's population correlates about +0.2 with its lowest axis score.

      A median rent prices the typical unit, not yours. Zillow's index blends single-family homes, condos and apartments across a whole ZIP code, so in a market where most rentals are houses it is measuring a different product than the one you'd sign for. All-in rent here corrects for the fees a quote omits, but it is still built from an area index, not a specific listing.

      It screens neighborhoods, not apartments. Square footage, in-unit laundry, guaranteed parking, soundproofing, kitchen — none of it is visible.

      PythonGeoPandasOSMnxNetworkXShapelyCensus ACSOverpass / OSM

      Where the numbers come from

      Data sources

      SourceFeedsNotes
      U.S. Census — ACS 5-yearhousing age, size, structure type & tenure; renter-occupied units; income; population weightsBlock-group level; the backbone of space, cost, population weighting, and the rental-stock dot size (table B25042).
      Zillow ZORImarket rents by ZIPThe base of all-in rent. A blended index — single-family, condo and multifamily together — so it prices the typical rental of an area, which is a different product in different markets. Fees and the target-unit premium are added on top.
      BEA Regional Price Paritiesgoods, utilities & services price levels by metroScales the non-housing basket in total monthly cost. Measures prices only — taxes are not in it, which is why they're modelled separately.
      Tax Foundation; state revenue departmentsstate & local income tax bracketsBracket-level computation, not a headline rate: Maryland's county piggyback, Philadelphia's wage tax, and New York's tax-benefit recapture above $107,650 each move the answer by hundreds of dollars a year.
      NAIC Auto Insurance Databaseaverage auto-insurance expenditure by stateState averages, and every metro here is the urban part of its state — so real gaps are wider than shown. NAIC cautions against direct state-to-state comparison; treat the ordering as solid and the magnitudes as a floor.
      VA locality tax schedulesannual vehicle personal-property tax (Arlington, Alexandria, Fairfax, Richmond)Computed at an $18,000 assessed vehicle from each locality's published 2025/26 rate and PPTRA relief formula. DC, MD and GA levy no recurring equivalent — omitting this had been flattering Virginia by $35–50/mo. Massachusetts' statewide excise ($25/$1,000 depreciated) is modelled the same way.
      BLS OEWS (May 2024)professional-depth axis: metro employment concentrationLocation-quotient blend of Data Scientists + Operations Research Analysts (2/3) and Medical & Health Services Managers (1/3). A stock of jobs, not a flow of postings; constant within each metro.
      OpenStreetMap (via OSMnx / Overpass)pedestrian network, essential-service amenities, usable green space, highway ramps, motorways, rail stationsSource for walkability, greenery, quiet (arterial density), highway, the walkshed maps & the metro maps' road context.
      U.S. Census — TIGER/Linearea-water polygons (bays, rivers, lakes) per metro countyThe water layer on the metro maps.
      FBI UCR + local incident feedsviolent-crime counts & ratesCity open-data portals (Socrata / ArcGIS) where incident-level data exists; FBI agency-level rates for data-thin suburbs.
      HUDpublic & assisted-housing locationsDrives the public-housing proximity disamenity and the majority-public-housing gate.
      Transit agency GTFSrail lines & station locationsPopulation-weighted walk access to rail stations.
      Moody's / S&P general-obligation ratingsgovernance proxyState + principal-city GO bond ratings (2025), blended on the Moody's notch scale. State ratings current; a few smaller-city ratings are best-band estimates.

      Metros covered: Albany–Schenectady–Troy, Atlanta, Baltimore, Boston, Charlotte, Chicago, Durham–Chapel Hill, Miami, Philadelphia, Pittsburgh, Providence, Raleigh–Cary, Richmond, St. Petersburg, Washington DC, and Worcester — sixteen. The 423 neighborhoods shown are each metro’s top dozen, every finalist, every neighborhood that could top the list under some plausible weighting, and every scored-but-over-budget row; 1,083 survive the filters in all. Syracuse, Rochester and Buffalo are configured and deliberately excluded: at 71.4, 69.0 and 64.2 annual snow and ice days they fail the model’s one hard climate constraint, so no neighborhood in them is scored.