Counts, Rates and Densities: What a Demographic Map Should Show

Problem statement

A census table gives you counts: people, households, people below the poverty line. Put a count on a choropleth and the map answers a question nobody asked โ€” mostly, "where do many people live?"

Measured across the 3,144 counties of the 50 states and the District of Columbia, using the 2023 ACS 5-year poverty table:

  • The number of people below the poverty line had a rank correlation of 0.957 with total population. Sixteen of the 20 counties with the most people in poverty are also among the 20 most populous.
  • The poverty rate had a rank correlation of โˆ’0.113 with population, and not one of the top 20 counties by count is in the top 20 by rate.

Counts, rates and densities are three different measurements that answer three different questions. Densities add a trap of their own, because a choropleth colours land, and in the US the least dense 10% of tracts hold 7.3% of the population on 84.4% of the land.

Quick answer

Pick the measure from the question, then the denominator from the measure:

question                                  measure    divide by
where is the most of it?                  count      nothing โ€” but do not use a choropleth
where is it most common among people?     rate       the population it could apply to
where is it most concentrated on land?    density    land area, not polygon area

A count belongs on a proportional-symbol map, where the size of a circle carries the number and the area of the polygon carries nothing. A rate or a density belongs on a choropleth.

county["rate"] = county["below_poverty"] / county["poverty_universe"]
county["density"] = county["population"] / (county["ALAND"] / 1e6)   # people per kmยฒ
Table of three demographic measures โ€” count, rate and density โ€” with the question each answers, its denominator and the top US county by each.
The same poverty table ranks Los Angeles County first by count and Oglala Lakota County first by rate.

Step-by-step solution

1. Name the question before choosing the column

"Where is poverty?" is three questions. Where are the most people in poverty โ€” for siting a food bank's warehouse? Where is a resident most likely to be in poverty โ€” for targeting a programme? Where are people in poverty most concentrated on the ground โ€” for walking distance to a service? Each has a different answer.

2. See how much a count simply repeats population

top 5 counties by number below poverty        top 5 by poverty rate
Los Angeles County, CA   1,322,476  13.6%     Oglala Lakota County, SD   52.8%
Harris County, TX          749,481  15.9%     Todd County, SD            49.0%
Cook County, IL            680,528  13.3%     Mellette County, SD        46.2%
Maricopa County, AZ        497,877  11.3%     Corson County, SD          45.2%
Kings County, NY           494,754  18.9%     Dimmit County, TX          44.8%

The left column is a list of large counties. Kings County's 18.9% is the highest rate among them, and Maricopa's 11.3% is below the national rate of 12.4%. The right column is a list of small counties: Oglala Lakota has 13,587 residents.

3. Use a rate when the question is about people

A rate divides a count by the population at risk of being counted. For poverty, that denominator is not total population. The ACS determines poverty status only for part of the population โ€” it excludes people in institutions such as prisons, college dormitories and military barracks โ€” and the table carries that universe as its own total, B17001_E001.

Across tracts the universe is usually close to everyone, with a median of 99.7% of total population. In 623 tracts it is less than half. Section 3 of the explanation shows what the wrong denominator does there.

4. Use a density when the question is about ground

Density divides by area. It is the right measure for anything experienced spatially โ€” crowding, walking distance, how many people a new clinic's catchment would hold.

The spread is enormous. Tract population density ran from 1.4 people per kmยฒ at the 1st percentile to 23,887 at the 99th โ€” a ratio of 17,254 โ€” while tract populations themselves vary with a coefficient of variation of only 0.44. Tracts are drawn to hold similar numbers of people, so almost all of the variation in density comes from area, and tract population and land area had a rank correlation of just 0.11.

5. Divide by land, not by the polygon

Use the land-area attribute (ALAND) rather than the polygon's area. Coastal and lakeside polygons include water: in the 2023 cartographic tract file, 2,899 tracts have a polygon at least 25% larger than their land area, and 486 are more than twice as large. Never divide by geometry.area in a longitudeโ€“latitude CRS, which gives square degrees.

6. Check what the colours spend their ink on

A choropleth's visual weight is land area, whatever it encodes. Classifying counties into quintiles and measuring the land each class covers:

measure            top quintile's land   bottom quintile's land
poverty count             19.7%                 30.2%
poverty rate              22.4%                 19.8%
total population          19.2%                 28.6%
population density        10.6%                 48.6%

A density map paints almost half of the country in its lowest class. The largest 10% of counties by area cover 48.4% of the land and hold 15.8% of the people, so whatever those counties show dominates the picture. That is not a reason to avoid density maps; it is a reason to expect a sea of pale colour and to say so in the caption.

7. Map counts with symbols

If the count is the point โ€” how many households lack a vehicle, where the most children live โ€” draw a circle at each area's centre, sized by the count. The polygon's size then plays no part, and a small, crowded tract gets a large symbol.

Bar chart showing that 16 of the top 20 counties by poverty count are also top 20 by population, and none are top 20 by poverty rate.
A count map of poverty is, to a first approximation, a population map.

Code examples

Example 1 โ€” how much a count is just population

import pandas as pd
from scipy.stats import spearmanr


def count_or_rate(frame, count, denominator, population, n=20):
    """How far a count follows population, and how far the rate departs from it."""
    rate = frame[count] / frame[denominator]
    top_count = set(frame.nlargest(n, count).index)
    top_pop = set(frame.nlargest(n, population).index)
    top_rate = set(rate.nlargest(n).index)
    print(f"rank correlation with {population}: count {spearmanr(frame[count], frame[population])[0]:.3f}, "
          f"rate {spearmanr(rate, frame[population])[0]:.3f}")
    print(f"top {n} by count: {len(top_count & top_pop)} also top by {population}, "
          f"{len(top_count & top_rate)} also top by rate")
    return rate
rank correlation with pop: count 0.957, rate -0.113
top 20 by count: 16 also top by pop, 0 also top by rate

Run it on any count before mapping it. A rank correlation with population above about 0.9 means the count map will mostly show where people live.

Example 2 โ€” where the population actually is

import numpy as np


def population_on_land(frame, population="pop", land="ALAND", decile=0.1):
    """Share of people and land in the densest and least dense areas."""
    d = frame[(frame[population] > 0) & (frame[land] > 0)].copy()
    d["density"] = d[population] / (d[land] / 1e6)
    d = d.sort_values("density", ascending=False)
    n = int(len(d) * decile)
    P, L = d[population].sum(), d[land].sum()
    for label, part in (("densest", d.head(n)), ("least dense", d.tail(n))):
        print(f"{label} {decile:.0%}: {part[population].sum() / P:.1%} of people "
              f"on {part[land].sum() / L:.2%} of land")
    half = np.searchsorted((d[population].cumsum() / P).values, 0.5)
    print(f"half the population lives on {(d[land].cumsum() / L).iloc[half]:.2%} of the land")
    return d
densest 10%: 9.9% of people on 0.05% of land
least dense 10%: 7.3% of people on 84.40% of land
half the population lives on 0.92% of the land

The last line depends on the size of the areas: measured with tracts, half of the US population lives on 0.92% of the land. Smaller areas would lower it further, because each tract mixes denser and emptier ground.

Example 3 โ€” the land each map class covers

def land_by_class(frame, column, land="ALAND", k=5):
    """Share of land area in each quantile class of a column."""
    classes = pd.qcut(frame[column], k, labels=False)
    share = frame.groupby(classes)[land].sum() / frame[land].sum()
    print(f"{column}: top class {share.iloc[-1]:.1%} of land, bottom class {share.iloc[0]:.1%}")
    return share
below: top class 19.7% of land, bottom class 30.2%
rate: top class 22.4% of land, bottom class 19.8%
pop: top class 19.2% of land, bottom class 28.6%
density: top class 10.6% of land, bottom class 48.6%

Every class holds 20% of the counties; the land they cover is what the reader sees. When one class covers half the map, a caption or an inset for dense areas helps the reader find the rest.

Explanation

Why counts follow population

Almost any characteristic of people is more common where there are more people. A county with ten times the residents has, roughly, ten times the people in poverty, the children, the commuters. The count mixes two things โ€” how many people there are and how common the characteristic is โ€” and county populations run from 43 residents to 9,848,406, so population dominates. Dividing by population removes it and leaves the part that describes the place.

Why rates need the right denominator

A rate is only as meaningful as the population it is a share of. Poverty status is not determined for people in institutions, so their tracts can have a large population and a tiny poverty universe. In one Miami-Dade tract of 3,737 residents, the poverty universe was 3 people: the rate against the universe is 100.0%, and against total population it is 0.1%. Neither describes the tract well, and the right response is to flag it.

Changing the denominator from the universe to total population moved 1,378 tract rates by more than five percentage points, and the two versions agreed on only 52 of the top 100 tracts.

Why densities are dominated by area

Census tracts are designed to hold roughly 4,000 people each, so their populations are similar and their areas are not. A density is then mostly the inverse of a tract's area: a rank correlation of 0.11 between tract population and land area means almost none of the density ranking comes from the number of people. Density is still the right measure for questions about ground โ€” but it describes how the areas were drawn as much as how people live.

Why the map shows land, not people

A choropleth fills polygons, and the eye weighs colour by area. Large, empty areas dominate the image whatever they encode, while the areas where most people live are too small to see. This is a property of the map form, not of the measure; rates and densities are the right values to fill polygons with, and a companion symbol map or an inset carries what the fill cannot.

Table of the densest and least dense tenth of US census tracts with their shares of population and of land.
On a tract choropleth, the least dense tenth fills 84% of the map with 7% of the people.

Edge cases or notes

  • A rate with a denominator of zero is undefined, not zero. 1,040 tracts have a poverty universe of 0; leave them as missing and show them as "no data".
  • Small denominators make extreme rates. A tract with 3 people in the universe can only have rates in steps of 33%; see the guide to small numbers.
  • Survey rates have margins of error. The median margin of error of a tract poverty rate is 5.6 percentage points.
  • "Per capita" uses total population and is right for money totals such as aggregate income, not for characteristics with their own universe.
  • Density needs land area. 486 tract polygons are more than twice their land area because they include water.
  • Proportional symbols overlap in dense areas. Scale by area rather than radius, and draw large symbols first.
  • Normalising by area and by population answers different questions โ€” people per kmยฒ against poverty per person. Do not combine them into one index without saying so.

FAQ

Should a choropleth show counts or rates?

Rates or densities. A count choropleth mostly shows population: across US counties, the number of people in poverty had a rank correlation of 0.957 with total population. Map counts with proportional symbols instead.

What is the difference between a rate and a density?

A rate divides by people, for example the share of residents below the poverty line. A density divides by land area, for example people per square kilometre. They answer different questions and rank places very differently.

Which denominator should a poverty rate use?

The poverty universe published with the table, not total population. It excludes people in institutions; using total population instead moved 1,378 tract rates by more than five percentage points.

Why is most of my density map the lowest colour?

Because low-density areas are large. The least dense 10% of US tracts cover 84.4% of the land and hold 7.3% of the people, so they dominate any area-filled map.

Can I divide by the polygon's area?

Only in an equal-area projection, and even then land area is better. Coastal polygons include water, and 2,899 tract polygons are at least a quarter larger than their land area.

When is a count map the right choice?

When the total is the point, such as siting a facility for the most people. Use sized symbols rather than filled polygons, so that area on the map does not stand in for the number.