Does Harbor Freight Target Tradespeople? A Spatial Data Deep Dive
This is a modified version of my Geography 409 Quantitative methods in GIS final project I did at least a year ago. The purpose of this project was to do a statistical analysis of something geographical. Most people in the class used census data to determine locations of things like airports, train stations, water treatment facilities, schools, amazon warehouses, hiking areas, fire stations so on and so forth. I was determining how statistically significant Harbor Freight location decisions are in the USA. Those of you who have ever stepped foot inside a harbor freight know the vibe: cheap tools, strange employees, and that weird burning rubber smell every store seems to have. Naturally, you’d assume corporate location planners sit down with a giant map and ask: "Where are all the plumbers, mechanics, construction workers, and machinists living? Let's put a store right next to them!"
I decided to test this exact hypothesis using U.S. Census data, spatial mapping tools, and logistic regression. Here is how I set up the project, what data went into it, and what the stats actually said.
The Setup:
To test if store locations target blue-collar/trades populations, I had to assemble a huge dataset covering every neighborhood in the entire country.
The Harbor Freight Locations (Points)
Instead of manually copying addresses off their website, I extracted all verified store locations using OpenStreetMap (OSM) via Overpass Turbo. This gave me precise latitude and longitude points for stores across the continental U.S.
The Census Data (Polygons & Demographics)
I pulled raw demographic numbers for all ~83,400 U.S. Census Tracts (local neighborhoods averaging ~4,000 residents) from the American Community Survey (ACS) 5-Year Estimates (Table C24010 - Sex by Occupation) via the U.S. Census Bureau API.
To measure the local "trades" workforce, I aggregated workers across major Standard Occupational Classification (SOC) categories:
- Construction & Extraction (electricians, plumbers, framers, etc.)
- Installation, Maintenance, & Repair (HVAC techs, mechanics, etc.)
- Production & Transportation (welders, machinists, warehouse operators, truckers, etc.)
Then, I calculated the Trades Ratio for every single neighborhood:
Trades Ratio = Total Blue-Collar & Trades Workers / Total Employed Civilian Population
Spatial Modeling Pipeline:
With the data pulled, I built a Python spatial analysis script using geopandas, shapely, and statsmodels:
- Spatial Join: I mapped every Census Tract boundary and ran an intersection join against the Harbor Freight point coordinates.
- Flagging Stores: Each neighborhood got flagged with has_store = 1 if a store was present inside that tract, or has_store = 0 if not.
- Log-Transforming Population: Because raw neighborhood population skews heavily, I calculated log_pop = log(Total Population) to control for overall population density.
The Statistical Models & Results:
Running a basic linear regression yields false positives because stores will naturally cluster near overall population density. I ran a regression model to see if a neighborhood's Trades Ratio predicts store placement after controlling for total population size.
Model 1 results: Population density + Trades ratio:
==============================================================================
Dep. Variable: has_store No. Observations: 83466
Method: MLE Pseudo R-squ.: 0.007490
LLR p-value: 5.555e-20 Log-Likelihood: -5875.1
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept -8.6320 0.492 -17.537 0.000 -9.597 -7.667
trades_ratio 0.4762 0.403 1.182 0.237 -0.313 1.266
log_pop 0.5692 0.063 8.970 0.000 0.445 0.694
==============================================================================
Odds Ratios: trades_ratio = 1.61 | log_pop = 1.77
Model 2 results: Population only:
==============================================================================
Dep. Variable: has_store No. Observations: 83466
Method: MLE Pseudo R-squ.: 0.007373
LLR p-value: 9.374e-21 Log-Likelihood: -5875.8
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept -8.4822 0.474 -17.894 0.000 -9.411 -7.553
log_pop 0.5575 0.063 8.918 0.000 0.435 0.680
==============================================================================
Odds Ratio: log_pop = 1.75
What Does This Actually Mean?
- The Core Hypothesis Failed (p=0.237): In statistics, a p-value must be below 0.05 to show a meaningful effect. The p-value for trades_ratio was 0.237. This means there is no statistically significant proof that Harbor Freight intentionally picks neighborhoods with higher percentages of tradespeople.
- Dropping trades_ratio changed almost nothing: Removing the trades percentage from the model caused the Pseudo R2 to drop by a tiny 0.000117 (from 0.007490 to 0.007373). Knowing a neighborhood's blue-collar ratio gives you virtually zero extra prediction power.
- Population Density is the real driver (p<0.001): Population size (log_pop) was 100% statistically significant (p=0.000) in both runs. An odds ratio of ~1.75 means that as total population density goes up, the likelihood of a store being built increases by about 75%.
Conclusion:
Harbor Freight isn't using specialized demographic maps to hunt down blue collar-heavy neighborhoods. Instead, they operate like most mainstream retail chains: they drop stores where there are enough overall people to drive retail foot traffic.