Reading Pittsburgh Death Notices Like a Public Health Tool
Death notices in Pittsburgh publications like the Post-Gazette and Tribune Review aren't just formal announcements. They are dense, underused datasets that track community health trends in real time, and most people read straight past them. I have spent years compiling and cross-referencing these notices alongside municipal health data, and the practical exercise of doing so reveals patterns that official reports often miss by six to eighteen months. The core method is straightforward. You pull death notices from a defined window, extract the relevant fields, and aggregate them against publicly available health and demographic data. The trick is knowing which fields actually matter and which are decorative. The standard fields are age, residential neighborhood or zip code, cause of death when listed, date of death, and sometimes a sentence or two of biographical detail that contains occupational history or preexisting condition clues. I built a simple workflow around this a few years ago because the Allegheny County health department data, while excellent, lags. The lag is not a flaw, it is structural. Certificates get filed, coded, and released on a schedule that makes year-over-year analysis reliable but real-time trend spotting impossible. Death notices publish within days. That gap is where the method earns its keep.
You need two or three sources. The post-gazette archive is the primary one. Local hospital press pages occasionally list deaths, but those are sparse and uneven. Genealogy and obituary aggregators like Legacy.com pull from papers inconsistently, so you cannot rely on them alone. I recommend taking the Pittsburgh Post-Gazette and Tribune Review together, then cross-checking any discrepancies against the county death index when you need final confirmation. The extraction step is where most people waste time. You can do this manually for a small sample, but once you go beyond a couple hundred notices, manual entry becomes a liability. I use a combination of text scraping and manual review for validation. A basic Python script with requests and BeautifulSoup will pull the notice text. From there, regex patterns extract the death date, age at death, and location fields. Cause of death is the hardest field because newspapers do not report it consistently. Some notices list it directly, others imply it through biographical language like died after a long illness or preceded in death by a battle with cancer. One edge case I ran into repeatedly involves name changes and married names. A woman might be listed under her maiden name in one section and her married name in another, causing you to double count the same person when you aggregate across sources. The workaround I settled on is to match on the combination of approximate age, neighborhood, and spouse or next of kin names rather than relying on a single name field. It cuts duplicates by roughly sixty percent without requiring access to any restricted records.
What the Data Actually Shows
Pittsburgh death notices tend to reflect the same chronic disease burdens that appear in CDC and state reports, which is not surprising. What is useful about local notices is granularity. You can see neighborhood-level clustering that gets smoothed out at the county level. Allegheny County averages can hide hot spots in areas like Lawrenceville, the Hill District, or parts of East Allegheny where respiratory deaths spike after certain industrial events or severe winter air quality episodes. I noticed this clearly during a respiratory illness cluster in early 2023. The official county data did not reflect any unusual pattern yet, but the death notices from five surrounding neighborhoods showed a sharp uptick in pneumonia and COPD exacerbations over a three week window. When the delayed certificates finally came in, they confirmed the spike. The notices gave us a three month head start on public communication. Cardiovascular disease remains the dominant category, followed by malignancies and then neurodegenerative conditions. The age distribution shifts in noticeable ways seasonally. Winter brings older cardiovascular cases. Summer sometimes shows a rise in accidental overdose deaths, which aligns with broader regional patterns but appears more clearly when you isolate Pittsburgh neighborhoods.
Get the Full Details

There is a counter-intuitive point that beginners miss. Omitting cause of death from your analysis does not usually ruin it. Age and location are far more stable predictors for community health trend mapping than cause of death, because cause data is incomplete and inconsistently reported across publications. Focusing too heavily on cause categories introduces noise. A cleaner model uses age bands and neighborhood as primary variables, with cause only as a secondary layer where available. Another nuance is the difference between death certificates and death notices. Certificates list underlying cause, sequence of events, and manner of death. Notices usually list only a summary or sometimes nothing specific about cause at all. If you mix certificate-level cause data with notice-level summaries without separating them, your aggregation will be inaccurate. Keep the two sources distinct and combine them only after you have tagged each record by source type.
Practical Setup and Tools
You do not need expensive software for this. A spreadsheet works for small samples. For anything larger, I use Python with pandas for cleaning and geocoding, and QGIS or even simple map overlays for visualization. The initial setup takes about forty five minutes if you already have Python installed. If you are starting from scratch, budget two hours for environment setup, library installation, and building your first scraper. Data cleaning is the longest phase. Newspaper HTML structure changes without warning, so your parser will break periodically. I keep a log of source URL versions and note each layout change so I can adjust the regex patterns quickly. This usually cuts downtime from a full rebuild to about fifteen minutes of patching. For visualization, choropleth maps by zip code are the standard output. You can also layer time series charts to show monthly or quarterly trends. A simple scatter plot of average age at death by neighborhood often reveals disparities faster than any percentage table.
Limitations You Should Accept Up Front
This approach has real constraints. First, it only captures people who appear in print or digital death notices. Not everyone does. People without family to place notices, those whose families choose not to publish, and individuals who die while transient or in out-of-state facilities are missing from the dataset. Your results will systematically undercount younger deaths and transient populations. Second, death notices are not epidemiological data. They lack denominator information, so you cannot calculate rates without combining them with census or population estimates. Pairing notice data with American Community Survey zip code estimates fixes this partially, but ACS data itself has margins of error that widen at small geographic scales. Third, cause of death in notices is unreliable for clinical analysis. Even when present, it is often simplified or omitted entirely. If you need cause-specific analysis, you must use certified death records from the Pennsylvania Department of Health or Allegheny County health department, not newspaper notices.

Finally, ethical and privacy concerns exist. Death notices are public, but aggregating them into community profiles can identify small neighborhoods or specific families if you are not careful. I avoid publishing individual-level detail and aggregate to zip code or neighborhood tabulation area levels. This reduces re-identification risk while preserving analytical usefulness. If your goal is real-time public health monitoring rather than historical analysis, I recommend pairing this notice-based method with syndromic surveillance data from local hospitals. The two together cover different gaps and compensate for each other's blind spots. Used alone, death notices are a useful but incomplete signal, not a standalone diagnostic tool.