← Portfolio Home
Start Here The Decline Violations by Area Property Types Look Up a Property Equity Methods Limitations

How the analysis was built

Methods

Every figure on this site comes from two County files and one Census source. This page shows how. It covers the data, the analysis window, how the files are joined, the fields I built, and the math behind each number. The sixteen limitations are on the Limitations page.

Data & Scope
1
Data sources
Two files from the LA County Open Data Portal, downloaded February 2026: housing inspections and violations, both from the Department of Public Health, Environmental Health Division. Demographics come from the American Community Survey 5-year estimates (2020–2024), pulled from Census Reporter in March 2026 as three ZIP-level tables: median household income (B19013), race and ethnicity (B03002), and renters stretched by housing costs (B25070), which I merge to the inspection ZIPs for the demographic analysis. Census Reporter is an independent, non-profit project; it does not collect its own data, it provides a more usable interface to the Census Bureau's published ACS tables, identified above by their official table IDs.
A later pull of the inspections file, running through March 2026, is used only to cross-check counts (step 8).
The County has since replaced both files, so the originals can no longer be downloaded. My copies are in the repository.
2
Scope and window
The raw inspections file holds 48,458 records, January 2023 through December 2025. I analyze January 1, 2023 through September 30, 2025: 48,085 records. The other 373 are October–December 2025, excluded to keep a clean nine-month comparison across years.
Routine only. Every record is a routine inspection. The file has no complaint records.
One program. All records are District Inspection Branch (DIB) inspections. SCEP (City of LA) and RHHP (unincorporated areas) are separate programs and not in this data: the RHHP INSPECTION field reads NO for all 48,458 records. Properties are multi-family buildings of five or more units, hotels, and a few SRO and general-housing records.
Fields used, from the County files
ACTIVITY DATE: dates and every period comparison  ·  SERIAL NUMBER: links violations to inspections  ·  SERVICE DESCRIPTION: confirms every record is routine  ·  FACILITY ID: distinct facilities  ·  FACILITY ADDRESS: the Look Up tool  ·  PE DESCRIPTION: property type and unit bands  ·  FACILITY CITY: grouped city  ·  ZIP: demographic data join  ·  PROGRAM STATUS: active or inactive  ·  VIOLATION STATUS: severity  ·  VIOLATION CODE and VIOLATION DESCRIPTION: top violations  ·  RHHP INSPECTION: confirms no RHHP records
These are raw columns, used as downloaded. The helper columns I build from them, grouped city, city type, and property type, are in step 4. ACS fields are separate and listed in step 7.
Linkage & Derivation
3
Joining inspections to violations
The violations file has no dates. Each violation links to an inspection by SERIAL NUMBER. From 62,631 raw violations, I reach 37,026:
62,631 raw violations
− 24,877 with no matching SERIAL NUMBER in the inspections file (so no date or property to attach them to)
− 728 tied to the 373 inspections after September 30, 2025 (dropped with them)
= 37,026 violations analyzed
One record, one inspection. Each record is one inspection, not one building. The 48,085 inspections happened at 37,009 distinct facilities, so many properties were inspected more than once.
4
Derived fields
Three fields, built in the working file.
Grouped city. The County uses neighborhood names for many City of LA properties. I group 36 LA neighborhood labels under “Los Angeles”: 27,686 inspections (57.6%). Northridge (495) was originally kept separate; that choice was reversed in July 2026 and Northridge is now part of the grouping.
The 36 labels grouped into “Los Angeles”: Arleta, Bel Air, Canoga Park, Chatsworth, Encino, Granada Hills, Harbor City, Hollywood, Mission Hills, North Hills, North Hollywood, Northridge, Pacific Palisades, Pacoima, Panorama City, Playa del Rey, Playa Vista, Porter Ranch, Reseda, San Pedro, Sherman Oaks, Studio City, Sun Valley, Sunland, Sylmar, Tarzana, Tujunga, Universal City, Valley Glen, Valley Village, Van Nuys, Venice, West Hills, Wilmington, Winnetka, Woodland Hills.
Why city-keyed and ZIP-keyed counts differ. A ZIP code can cross city lines, so a count keyed by the city name field and a count keyed by ZIP code will not always match. Northridge is the live example in this data: 495 inspections carry the city name Northridge, while ZIP codes 91324 and 91325 hold 500. The five extra records fall after the September 30, 2025 cutoff in the ZIP-keyed pull. This analysis keys jurisdiction questions by city name. Sources on ZIP-to-place boundaries: the U.S. Census Bureau ZCTA page (primary) and the HUD USPS ZIP crosswalk (secondary).
City type. Each record is tagged LA City Neighborhood, Incorporated City, Santa Clarita Neighborhood, or Unincorporated Area. Unincorporated areas are 237 inspections (0.49%), which is why the unincorporated-only RHHP program does not explain the decline.
Property type. From PE DESCRIPTION. I sort records into three buckets: 44,310 multi-family (five or more units), 3,764 hotels, and 11 SRO and general housing. The unit and room bands come from the PE DESCRIPTION sub-ranges.
Calculations
5
The inspection decline
I compare the same nine months each year: January–September 2023 (26,919) against January–September 2025 (4,725).
decline = (26,919 − 4,725) / 26,919 = 82.45% → reported as 82%
The equal-window rule Before comparing two periods, write down the start and end date of each side. If the spans differ, trim the longer side, scale up the shorter, or use a rate. Always name the window. An earlier draft compared full-year 2023 to partial 2025 and got 86%, an unequal comparison that overstated the drop. The matched nine-month figure is 82%. This rule applies to every comparison on the site.
6
Violation rate, intensity, and severity
Violation rate is the share of inspections with at least one violation. Over the matched nine months it rises from 31.6% (2023) to 41.7% (2025), reported as 32% to 42%. Across the full window, 16,279 of 48,085 inspections found a violation (34%).
Intensity is the average number of violations per inspection that found one: 2.23 → 2.28 → 2.60, up 17%.
Severity uses the two classifications in the County’s inspection guide: Non-Critical and Critical. Of 36,062 classified violations, 94% are non-critical and 6% critical.
7
The demographic regression
This tests whether the drop hit some neighborhoods harder. The unit is the ZIP code. For each ZIP, I measure inspection change over the same nine-month windows:
change% = (Jan–Sep 2025 − Jan–Sep 2023) / Jan–Sep 2023 × 100
Negative means fewer inspections than 2023. A few ZIPs pass +100% because their 2023 base was tiny. I regress this change, one variable at a time (bivariate OLS), on six ACS variables and report R² for each:
median household income  ·  renters stretched by housing costs (households paying 30%+ of income on rent, ÷ total renters)
% Hispanic  ·  % White  ·  % Black  ·  % Asian  (each ÷ total population)
Sample: 254 ZIP codes, 289 inspection ZIPs minus 35 (24 with no ACS data, 6 with the Census placeholder for unreliable income, 5 with no 2023 base).
Result: I treat R² ≥ 0.10 as the bar for a real relationship, at least 10% of the variation explained. All six land between 0.004 and 0.020 (income 0.016, housing cost stretch 0.004, Hispanic 0.015, White 0.020, Black 0.020, Asian 0.005). None clears the bar. I tested four race and ethnicity groups; the rest are too small at the ZIP level to estimate well.
ZIP vs. ZCTA. The ACS reports by ZIP Code Tabulation Area (ZCTA), which is close to but not the same as a USPS ZIP. I joined inspection ZIPs to ZCTA values as the nearest match. Standard at this level, but an approximation.
Validation & Reproducibility
8
Cross-check against a later extract
To confirm the drop was real and not a half-loaded download, I compared my extract against a later one running through March 2026. Over the period they share, April 2023 to September 2025, they match: the same 36,835 records, agreeing in all 30 months.
The later extract was pulled about six months after the window closed, so any late-entered inspections had time to show up. None did. On the shared window the drop is 81.6%, the same as the headline.
One limit: the later extract starts in April 2023, so the first quarter of 2023, about 11,250 inspections, 42% of the base, comes only from the first download. The drop itself reproduced in full.
9
Sensitivity check: Glendale and Torrance
The County says it has no enforcement authority in Glendale or Torrance, yet the data holds 2,856 Glendale and 545 Torrance inspections. I kept them but tested the headline without them.
Dropping all 3,401 records changes the nine-month drop from 82.45% to 81.02%. The finding holds.
10
Tools and repository
Prep. I joined the two files and built the derived fields in a spreadsheet. Every figure reproduces from the raw CSVs and the ACS tables above; the demographic analysis R² values reproduce to three decimals.
Front end. The case study was first prototyped in Tableau Public, but the free tier’s limited control over design and color made it hard to present the findings clearly, so I moved to a custom HTML, CSS, and JavaScript build. The front-end code was written by Claude (Anthropic) to my direction; the dataset construction, analysis, findings, and visualization design decisions are mine.
Repository. Raw downloads sit unchanged in data/county/ (the inspection and violation CSVs, downloaded as titled by the County, "Routine and Complaint," though a field-level audit confirms every record is routine) and data/acs/ (the three Census Reporter tables). The Excel/ folder holds the working analysis, MERGED_3-8-2026.xlsx and Census_Merge.xlsx, plus PROJECT_SUMMARY.xlsx, a values summary with a Source column citing exactly where each figure comes from rather than a live formula. The joins and derived fields described above were built in a working spreadsheet during analysis; the published figures all reproduce from the raw files using the steps on this page, and the equity R² values additionally reproduce via a base-R script in analysis/replicate_r2.R. The README records pull dates: County files February 2026, ACS tables March 2026, and notes the County has since replaced its source. [Repository link added at publish.]
Source documents. The HOIR appendix is a scanned image, so the advisory quoted on Property Types was checked against the image, not pulled as text.
Reproducibility at a glance
Each headline figure, its value, and how it is computed.
FigureValueHow it is computed
Inspection decline82%(26,919 − 4,725) / 26,919, Jan–Sep 2023 vs. Jan–Sep 2025
Inspections analyzed48,085Routine records dated Jan 1 2023 – Sep 30 2025 (of 48,458)
Violations analyzed37,02662,631 raw − 24,877 unmatched − 728 after the window
Distinct facilities37,009Unique FACILITY ID in the window
Violation rate32% → 42%Share with ≥1 violation, Jan–Sep 2023 vs. 2025
Violations per inspection+17%Mean among inspections with violations: 2.23 → 2.60
City of LA share57.6%27,686 grouped inspections / 48,085, Northridge included
Demographic Analysis R² (all six)≤ 0.020Bivariate OLS of per-ZIP change on each ACS variable, n = 254
Cross-check overlap81.6%Drop on Apr–Sep, later extract, 36,835 matched records

The sixteen limitations are on the Limitations page. For the agencies, programs, and legal terms, see Start Here.

Methodology note — AI assistance: The data work and analysis are the author’s own: building the merged datasets, creating the fields the analysis needed, running the analysis in Excel, and deciding which visualization fits each finding. Claude (Anthropic) was used to build the front-end — the page layouts, charts, and interactive features that turn the completed analysis into a publicly viewable case study. Analytical and design decisions were directed by the author.

Cindy Cruz · 2026

LinkedIn·GitHub