17  Planning

Every data project is a planning document in disguise. It proposes that some slice of the world is worth measuring, some category system worth applying, some decision worth making differently once the analysis is done. Every decision to stop measuring is a planning document too, usually one nobody was invited to read. Planning has spent the last century learning the consequences of both kinds of proposal. Data scientists have not. This chapter borrows from the planners.

You have already borrowed from three professions: the journalist’s verification habits (Chapter 5), the lawyer’s habits of record access and remedy (Chapter 9), and the auditor’s and engineer’s habits of independent verification and incident review (Chapter 12, Chapter 13). Planning is the fourth lineage and the one this module needs. Chapter 16 left you with an audit of what a federal dataset has lost. Planning asks the questions that come next: who decided, who was affected, who was in the room, who was not, and whose knowledge of the terrain counts as evidence. Keegan (2026) puts it in infrastructural terms: planning foregrounds how infrastructures allocate benefits and burdens across space and time, and it supplies the participatory repertoires for negotiating who owns, maintains, and can contest durable systems.

17.1 A profession that learned from its mistakes

Planning as you encounter it today is the downstream result of a public fight it mostly lost and then, slowly, learned from. Robert Moses, as Chapter 1 noted, ran New York’s public works for four decades on a specific theory: the public interest could be computed by a qualified expert, expressed as a highway alignment, and imposed on neighborhoods whose residents could not contest it. Jane Jacobs (1961) took the other side, insisting that people who lived on a block knew things no master plan could capture.

The work of codifying what Jacobs had demonstrated fell to planners who took the problem seriously for planning, not merely against it. Paul Davidoff’s “Advocacy and Pluralism in Planning” (1965) is the founding document. Davidoff argued that there is no single neutral public interest a competent planner discovers through analysis. There are many publics with conflicting interests, and the planner’s job is to make those conflicts legible rather than paper over them with a unitary plan. The profession should supply advocate planners to underserved communities the way the legal profession supplies public defenders.

Advocacy planning did not become the default, but it changed what the default had to argue against. Sherry Arnstein’s “ladder of citizen participation” (1969) gave planners a vocabulary for distinguishing real participation from its counterfeits, from manipulation and therapy at the bottom, through information, consultation, and placation, to partnership, delegated power, and citizen control at the top. Marcus Lane’s intellectual history (2005) traces how participation became a procedural requirement in most Western planning regimes, even when its substance was thin. Hashem Dadashpoor and Somayeh Ahani (2021) extend the inheritance, insisting that the forces reshaping a region are multiple and not reducible to what the master plan says.

You inherit this tradition whenever you work with geographic or administrative data. The choropleth expresses a theory about which boundaries matter; the demographic overlay, a theory about which categories count; the stakeholder list, a theory about whose voice will be sought. Planning’s contribution is to name these theories as theories and insist they be defended.

17.2 The Allegheny Family Screening Tool, through a planner’s eyes

Chapter 8 took up the Allegheny Family Screening Tool as a case of exemption: a county risk-scoring system for child-welfare referrals that could not easily be audited from outside. Read the same case through a planning lens and a different failure surfaces. The tool was designed by social scientists, procured by a county, and deployed on families. The families were not in the room. Neither were the front-line caseworkers whose judgment the tool was meant to augment, nor the neighborhoods whose referral rates it would amplify.

A planner recognizes the lower rungs of Arnstein’s ladder: information transmitted, consultation held, the decision made by the same people who would have made it without consultation. A participation process that does not feed back into who holds authority (Chapter 10) to change the decision, and that produces no path to remedy (Chapter 2) when it goes wrong, is participation in name only.

17.3 A running example: the Central 70 project

You will practice this chapter’s tools on a decision with a local footprint and a federal spine: the Central 70 project, the reconstruction and widening of Interstate 70 through the Elyria-Swansea and Globeville neighborhoods of Denver. The Colorado Department of Transportation and the Federal Highway Administration published a final environmental impact statement and a record of decision in 2017 (Colorado Department of Transportation 2017). The project lowered the highway below grade, capped a section with a park, and widened the roadway. It also displaced residents, prompted litigation over its environmental review, and intensified concerns about diesel exposure in neighborhoods already cut in half by the 1960s viaduct (Swansea 2019).

Central 70 belongs in a federal module because federal money made it a “major federal action” under the National Environmental Policy Act (NEPA), which required the environmental impact statement, the published drafts, the public comment periods, and the agency’s written responses to comments. NEPA review is the federal government’s most routine planning procedure, and it is notice-and-comment participation of exactly the kind you will practice in Chapter 20. It is also eroding. In 2025 the Council on Environmental Quality withdrew its government-wide NEPA regulations, and the Supreme Court’s decision in Seven County Infrastructure Coalition v. Eagle County, a case that began with a Colorado county’s challenge to a Utah rail line, told courts to defer to agencies on how far an environmental review must reach. The record that let Elyria-Swansea residents contest Central 70 is a record future residents may not get.

Central 70 is heavy material. Students who find it draining may substitute the Alpine-Balsam redevelopment in Boulder (City of Boulder 2019) or another case; the techniques transfer.

17.4 Stakeholders as a structured document

A stakeholder map lists the parties to a decision and records what each wants, can do, and can see. It reflects the mapper’s theory of whose interests count; writing the theory down makes it contestable. For a data science workflow, a version-controlled YAML document beats a slide: it reads like prose, diffs in git, and loads into Python.

# stakeholders_i70.yaml
decision:
  name: Central 70 reconstruction and widening
  lead_agencies: [Colorado Department of Transportation, Federal Highway Administration]
  record_of_decision: 2017-01
  federal_hook: NEPA environmental impact statement
  geography:
    primary_neighborhoods: [Elyria-Swansea, Globeville]
    county: Denver
    state: CO

stakeholders:
  - id: cdot
    name: Colorado Department of Transportation
    role: lead_agency
    interests:
      - completing federally funded reconstruction on schedule
      - maintaining I-70 freight and commuter capacity
    power: {formal: high, informal: high}   # owns the right of way
    access:
      in_the_room: yes
      documents_produced: [DEIS, FEIS, ROD, mitigation plan]

  - id: elyria_swansea_residents
    name: Elyria-Swansea residents
    role: affected_community
    interests:
      - reducing diesel particulate exposure
      - avoiding displacement
      - retaining neighborhood connectivity
    power: {formal: low, informal: medium}  # organized through associations
    access:
      in_the_room: partially
      documents_produced: [public comments, litigation filings]
    notes: |
      Split by the 1964 viaduct. Limited Spanish-language
      outreach in early EIS phases.

A complete map would list twenty to thirty entries: FHWA, the City and County of Denver, Denver Public Schools (whose Swansea Elementary sits beside the widened roadway), EPA, neighborhood associations on both sides of the highway, freight and commuter interests, public health researchers, legal aid organizations, and contractors.

Notice what the schema forces. You cannot fill in power.formal without deciding what “formal” means here, or in_the_room without deciding what “the room” is. For Central 70 there were at least five rooms: NEPA scoping meetings, technical advisory committees, city council chambers, federal court, and the offices where alignment decisions were actually made.

17.5 Who was missing from the room

Once the map exists, write a companion document listing whose perspectives are absent or under-represented, and why. For Central 70, a partial list includes renters whose landlords were compensated but who received nothing; undocumented residents who stayed away from public meetings for reasons unrelated to interest; children whose cumulative diesel exposure was the actual health outcome at stake but who had no standing in NEPA; descendants of households displaced by the 1964 viaduct; and residents of neighborhoods outside the corridor whose air quality nonetheless changed.

A “who was missing” analysis is a design input, not a ritual apology. If you can name whose perspective is missing, you can design the analysis to compensate: pulling in data the formal process did not surface, or publishing intermediate findings in formats a missing stakeholder could answer.

The same method applies to the federal dataset you audited in Chapter 16. A dataset has producers (a program office and its contractors), funders (an appropriations line), mandates (a statute or none), downstream users (state health departments, county emergency managers, insurers, journalists, researchers), people described by it, and, after a removal, volunteer mirrors. When a series is retired, ask the planner’s question: which of those parties were in the room? Usually the answer is the program office and the budget office. The people described by the data, and the local governments that depended on it, learn about the decision from a notice.

17.6 The geographic imagination

Planning’s other contribution is the habit of putting decisions on a map. A map is an argument about what counts as “the area,” and every map excludes something its maker thought irrelevant. geopandas extends pandas with a geometry column, so a GeoDataFrame behaves like a DataFrame that knows where each row is. Underneath it is a mixing bowl of shapely (geometry), pyogrio or fiona (file I/O), and pyproj (coordinate reference systems). You will spend more time with the third than you expect.

import geopandas as gpd
import contextily as ctx
import matplotlib.pyplot as plt

# Colorado county subdivisions from Census TIGER/Line
cousub = gpd.read_file("tl_2023_08_cousub/tl_2023_08_cousub.shp")
# => GeoDataFrame with NAME, GEOID, geometry; CRS is EPSG:4269 (NAD83)

# Block-group demographic overlay (ACS 5-year, 2018-2022)
acs = gpd.read_file("acs_blockgroups_denver.geojson")

# Project boundary, traced from the FEIS project description
i70 = gpd.read_file("central70_project_area.geojson")

Three layers, three potential failure modes. The most common is a coordinate reference system (CRS) mismatch. Layers in NAD83 (EPSG:4269) and Web Mercator (EPSG:3857) will plot together without an exception, because matplotlib does not know what a CRS is. They will not line up. Project everything to a common CRS first:

target_crs = "EPSG:3857"   # Web Mercator, for contextily basemaps
cousub, acs, i70 = (g.to_crs(target_crs) for g in (cousub, acs, i70))
# For distances or areas on the Front Range use EPSG:26913 (UTM 13N);
# Web Mercator distances are wrong at Denver's latitude.

fig, ax = plt.subplots(figsize=(10, 10))
acs.plot(column="pct_poverty", cmap="YlOrRd", linewidth=0.1,
         edgecolor="gray", legend=True, ax=ax)
i70.boundary.plot(ax=ax, color="black", linewidth=2)
ctx.add_basemap(ax, source=ctx.providers.OpenStreetMap.Mapnik)
ax.set_axis_off()
ax.set_title("Central 70 project area and block-group poverty rate\n"
             "ACS 5-year 2018-2022; boundary from 2017 FEIS")
fig.savefig("ch17_i70_choropleth.png", dpi=150)

Warmer colors clustering along the corridor are not a causal claim. They are a descriptive statement about which communities surround the decision. Whether the project caused the pattern, or was caused by the same history that produced it, is a separate question. The map’s job is to make the spatial question visible, not to close it.

TipThe Missing Manual

When geopandas breaks, the traceback can come from any of four libraries you did not import. The most common failure is a CRS mismatch, because matplotlib will plot incompatible layers without complaint. Always call .to_crs() before you join, buffer, measure, or plot. The second most common failure is a shapefile that arrives without its .prj sidecar, leaving geopandas with no way to know what the coordinates mean. Check for the .prj before you open the .shp. The third, specific to federal planning records: maps inside an EIS are usually PDFs, not data. Tracing a project boundary from a PDF figure is an act of interpretation, and your caption should say you did it.

17.7 Community-informed categorization

The demographic columns you drop into the map are themselves planning artifacts. “Percent below poverty line” is a federal category with a specific history. “Two or more races” did not exist as a Census response option before 2000. Every category is a fossil of an earlier argument about who counted, and as what. Bowker and Star (2000), whose work returns in Chapter 19, show that category systems that once fit the world come to shape what the world is allowed to look like.

Community-informed categorization treats category choice as participatory. If the community you are mapping has its own neighborhood boundaries that do not match Census tracts, include both, labeled. If a dimension the community cares about (length of residence, primary language at home) is not in the standard tables, say so in the caption rather than pretending it does not exist. Treating the power to categorize as something held in trust, rather than exercised unilaterally, is the bridge from planning to ownership.

NoteIn the Public Interest

Keegan (2026) defines ownership as collective, accountable governance over how public-relevant data is preserved, accessed, and used, and Chapter 18 builds it out. Planning is where that value gets procedural teeth. The specific claim: a community that cannot contest the map on which its displacement was planned, or the retirement of the dataset that documented its exposure, has no ownership of its own record in any meaningful sense, whatever the license says. Audit-washing (Chapter 12) has a planning cousin, participation-washing: the map is drawn, the meeting is held, comments are noted, and the decision proceeds as if none of it occurred. You can tell the difference by asking whether any document you produce could change the decision, or whether it was always going to be filed.

17.8 Exercises

Exercise 17.1 (Guided). Build a stakeholder map in YAML for a decision with a federal hook: Central 70, another project that went through NEPA review, or a local decision of your choice if you note which federal funds or rules touch it. Include at least ten entries. Commit it as exercises/ch17_stakeholders_<slug>.yaml with a two-paragraph README.md stating the decision, the records you used, and what you could not find.

Exercise 17.2 (Analytic; Piece 4 component). Build a stakeholder map for the federal dataset you documented in Exercise 16.3, using the same schema with roles for producer, funder, mandate, downstream user, described population, and mirror. Then write a 400-word “who was missing from the room” analysis of the most recent decision that changed the dataset’s collection or access. Name at least four groups and, for each, the document or outreach method that would have surfaced them. This map feeds the stewardship plan or refusal specification and the public comment in Piece 4. Save as exercises/ch17_dataset_stakeholders.yaml and exercises/ch17_missing.md.

Exercise 17.3 (Technical). Produce a geopandas choropleth for the decision in 17.1, using TIGER/Line geometry (U.S. Census Bureau 2024) and an ACS 5-year table, with at least three layers: the administrative base, the demographic variable, and the decision’s boundary. Project to a common CRS and document the choice in the caption. Save the figure and notebook to exercises/ch17_map_<slug>/.

Exercise 17.4 (Reflective). Reread Eubanks’s (2018) Allegheny chapter, which you met in Chapter 8, or read her Indiana eligibility chapter. Apply her framework to your 17.1 case. Where does the decision’s theory of the problem locate the cause of harm? Where would Eubanks locate it? What would change in your stakeholder map if you adopted her framing? 500 words.

Exercise 17.5 (Open-ended). Design a participatory process that would have produced a materially different outcome for your 17.1 decision: a different alignment, boundary, set of mitigations, timeline, or a decision not to proceed. Name the rung of Arnstein’s ladder your process would occupy, who would hold what authority, and the minimum infrastructure (time, money, translation, childcare, data access, legal support) it would require. Then answer the harder question: what would have had to be true about the lead agency, the funding source, or the political moment for this process to happen? 750 words. Save as exercises/ch17_counterfactual_<slug>.md.

17.9 Looking ahead

Planning gave you the habit of asking who was in the room and whose knowledge of the terrain counts. Chapter 18 turns that habit into an obligation. If the people who use and are described by a federal dataset were not in the room when it was retired, who should hold it now, under what rules, and for how long? You will answer with tiered access, a threat model, and a stewardship plan, and you will meet the Indigenous data sovereignty movements that challenge whether “stewardship” is the right word at all.

17.10 Further Reading and Resources

Arnstein, Sherry R. 1969. “A Ladder of Citizen Participation.” Journal of the American Institute of Planners 35 (4): 216–24. https://doi.org/10.1080/01944366908977225.
Bowker, Geoffrey C., and Susan Leigh Star. 2000. Sorting Things Out: Classification and Its Consequences. MIT Press. https://mitpress.mit.edu/9780262522953/sorting-things-out/.
City of Boulder. 2019. Alpine-Balsam Area Plan. City of Boulder Planning Department. https://bouldercolorado.gov/projects/alpine-balsam.
Colorado Department of Transportation. 2017. Central 70 Project: Final Environmental Impact Statement and Record of Decision. Colorado Department of Transportation and Federal Highway Administration. https://www.codot.gov/projects/i70east.
Dadashpoor, Hashem, and Somayeh Ahani. 2021. “Explaining Objective Forces, Driving Forces, and Causal Mechanisms Affecting the Formation and Expansion of the Peri-Urban Areas: A Critical Realism Approach.” Land Use Policy 102: 105232.
Davidoff, Paul. 1965. “Advocacy and Pluralism in Planning.” Journal of the American Institute of Planners 31 (4): 331–38. https://doi.org/10.1080/01944366508978187.
Eubanks, Virginia. 2018. Automating Inequality: How High-Tech Tools Profile, Police, and Punish the Poor. St. Martin’s Press. https://us.macmillan.com/books/9781250215789/automatinginequality.
Jacobs, Jane. 1961. The Death and Life of Great American Cities. Random House.
Keegan, Brian C. 2026. “Public Interest Data Infrastructuring.” Under Review.
Lane, Marcus B. 2005. “Public Participation in Planning: An Intellectual History.” Australian Geographer 36 (3): 283–99. https://doi.org/10.1080/00049180500325694.
Swansea, Ben. 2019. The Highway That Split Denver: Race, Displacement, and the I-70 Rebuild. Denverite / Colorado Public Radio.
U.S. Census Bureau. 2024. TIGER/Line Shapefiles. U.S. Census Bureau. https://www.census.gov/geographies/mapping-files/time-series/geo/tiger-line-file.html.