Break out in place rent by bedroom count for each county in Chicago and show me the confidence interval and sample size for each bedroom type. Which cuts have enough sample to trust, and which ones should I not underwrite off of?
mkdir -p /vercel/sandbox/analysis && cat > /vercel/sandbox/analysis/rent_confidence.py << 'EOF'
import json
data = [
{"county":"Cook County, IL","bed":0,"avg":1844.27,"n":22162,"lo":1836.66,"hi":1851.88},
{"county":"Cook County, IL","bed":1,"avg":2185.25,"n":51585,"lo":2178.72,"hi":2191.78},
{"county":"Cook County, IL","bed":2,"avg":2762.31,"n":29576,"lo":2747.53,"hi":2777.08},
{"county":"Cook County, IL","bed":3,"avg":3936.49,"n":4062,"lo":3862.16,"hi":4010.82},
{"county":"Cook County, IL","bed":4,"avg":3911.45,"n":626,"lo":3559.64,"hi":4263.27},
{"county":"DuPage County, IL","bed":0,"avg":1663.52,"n":872,"lo":1640.79,"hi":1686.25},
{"county":"DuPage County, IL","bed":1,"avg":1756.14,"n":12493,"lo":1749.30,"hi":1762.97},
{"county":"DuPage County, IL","bed":2,"avg":2109.13,"n":12038,"lo":2099.13,"hi":2119.12},
{"county":"DuPage County, IL","bed":3,"avg":2872.24,"n":944,"lo":2798.58,"hi":2945.91},
{"county":"DuPage County, IL","bed":4,"avg":5371.71,"n":14,"lo":5285.39,"hi":5458.04},
{"county":"Lake County, IL","bed":0,"avg":1545.15,"n":319,"lo":1477.96,"hi":1612.34},
{"county":"Lake County, IL","bed":1,"avg":1739.95,"n":3449,"lo":1721.34,"hi":1758.56},
{"county":"Lake County, IL","bed":2,"avg":2133.71,"n":4476,"lo":2107.98,"hi":2159.44},
{"county":"Lake County, IL","bed":3,"avg":3868.92,"n":226,"lo":3698.65,"hi":4039.20},
{"county":"Lake County, IL","bed":4,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Will County, IL","bed":0,"avg":1409.65,"n":215,"lo":1360.35,"hi":1458.95},
{"county":"Will County, IL","bed":1,"avg":1627.90,"n":1397,"lo":1606.78,"hi":1649.02},
{"county":"Will County, IL","bed":2,"avg":2117.86,"n":1485,"lo":2091.43,"hi":2144.30},
{"county":"Will County, IL","bed":3,"avg":2601.12,"n":147,"lo":2516.81,"hi":2685.42},
{"county":"Will County, IL","bed":4,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Kane County, IL","bed":0,"avg":1560.57,"n":115,"lo":1520.84,"hi":1600.29},
{"county":"Kane County, IL","bed":1,"avg":1731.26,"n":1353,"lo":1717.59,"hi":1744.92},
{"county":"Kane County, IL","bed":2,"avg":2122.44,"n":1741,"lo":2103.98,"hi":2140.91},
{"county":"Kane County, IL","bed":3,"avg":2638.42,"n":279,"lo":2588.69,"hi":2688.15},
{"county":"Kane County, IL","bed":4,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Kendall County, IL","bed":0,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Kendall County, IL","bed":1,"avg":1762.02,"n":445,"lo":1743.07,"hi":1780.98},
{"county":"Kendall County, IL","bed":2,"avg":2303.12,"n":517,"lo":2277.90,"hi":2328.34},
{"county":"Kendall County, IL","bed":3,"avg":3019.91,"n":191,"lo":2964.20,"hi":3075.62},
{"county":"Kendall County, IL","bed":4,"avg":3608.48,"n":21,"lo":3381.10,"hi":3835.85},
{"county":"McHenry County, IL","bed":0,"avg":1301.15,"n":26,"lo":1216.45,"hi":1385.86},
{"county":"McHenry County, IL","bed":1,"avg":1711.63,"n":410,"lo":1670.97,"hi":1752.29},
{"county":"McHenry County, IL","bed":2,"avg":1966.96,"n":725,"lo":1919.38,"hi":2014.53},
{"county":"McHenry County, IL","bed":3,"avg":2468.48,"n":85,"lo":2253.18,"hi":2683.79},
{"county":"McHenry County, IL","bed":4,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"DeKalb County, IL","bed":0,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"DeKalb County, IL","bed":1,"avg":1061.98,"n":48,"lo":1032.17,"hi":1091.79},
{"county":"DeKalb County, IL","bed":2,"avg":1248.20,"n":168,"lo":1228.48,"hi":1267.92},
{"county":"DeKalb County, IL","bed":3,"avg":1382.96,"n":107,"lo":1361.99,"hi":1403.93},
{"county":"DeKalb County, IL","bed":4,"avg":1594.62,"n":13,"lo":1538.85,"hi":1650.38},
{"county":"Grundy County, IL","bed":0,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Grundy County, IL","bed":1,"avg":1290.89,"n":56,"lo":1279.48,"hi":1302.30},
{"county":"Grundy County, IL","bed":2,"avg":1600.27,"n":143,"lo":1568.70,"hi":1631.83},
{"county":"Grundy County, IL","bed":3,"avg":1370.00,"n":4,"lo":1197.36,"hi":1542.64},
{"county":"Grundy County, IL","bed":4,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Lake County, IN","bed":0,"avg":955.88,"n":16,"lo":939.82,"hi":971.93},
{"county":"Lake County, IN","bed":1,"avg":1295.50,"n":920,"lo":1281.42,"hi":1309.58},
{"county":"Lake County, IN","bed":2,"avg":1584.69,"n":1792,"lo":1566.29,"hi":1603.08},
{"county":"Lake County, IN","bed":3,"avg":2181.54,"n":291,"lo":2116.09,"hi":2246.98},
{"county":"Lake County, IN","bed":4,"avg":2745.45,"n":44,"lo":2559.79,"hi":2931.12},
{"county":"Porter County, IN","bed":0,"avg":1173.75,"n":4,"lo":1143.91,"hi":1203.59},
{"county":"Porter County, IN","bed":1,"avg":1343.47,"n":669,"lo":1330.26,"hi":1356.67},
{"county":"Porter County, IN","bed":2,"avg":1549.35,"n":855,"lo":1533.19,"hi":1565.51},
{"county":"Porter County, IN","bed":3,"avg":2014.02,"n":130,"lo":1945.93,"hi":2082.10},
{"county":"Porter County, IN","bed":4,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Jasper County, IN","bed":0,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Jasper County, IN","bed":1,"avg":1690.00,"n":5,"lo":1143.21,"hi":2236.79},
{"county":"Jasper County, IN","bed":2,"avg":1377.83,"n":12,"lo":956.22,"hi":1799.45},
{"county":"Jasper County, IN","bed":3,"avg":2022.30,"n":10,"lo":1391.48,"hi":2653.12},
{"county":"Jasper County, IN","bed":4,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Newton County, IN","bed":0,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Newton County, IN","bed":1,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Newton County, IN","bed":2,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Newton County, IN","bed":3,"avg":None,"n":0,"lo":None,"hi":None},
{"county":"Newton County, IN","bed":4,"avg":None,"n":0,"lo":None,"hi":None},
]
def tier(n, avg, lo, hi):
if n == 0:
return "NO DATA"
ci_pct = (hi-lo)/avg*100 if avg else None
if n >= 100 and ci_pct is not None and ci_pct < 5:
return "HIGH"
elif n >= 20 and ci_pct is not None and ci_pct < 15:
return "MODERATE"
else:
return "LOW / DO NOT UNDERWRITE"
results = []
for d in data:
if d["n"] and d["avg"]:
ci_pct = round((d["hi"]-d["lo"])/d["avg"]*100,1)
else:
ci_pct = None
t = tier(d["n"], d["avg"], d["lo"], d["hi"])
results.append({**d, "ci_pct_of_avg": ci_pct, "tier": t})
for r in results:
print(f"{r['county']:<20} bed={r['bed']} n={r['n']:<6} avg={r['avg']} ci_width_pct={r['ci_pct_of_avg']} tier={r['tier']}")
# summary counts
from collections import Counter
c = Counter(r['tier'] for r in results)
print(c)
EOF
python3 /vercel/sandbox/analysis/rent_confidence.pyChicago MSA in-place rent by bedroom, county-by-county — most of the market only trusts 1BR and 2BR
| Bedroom | Avg In-Place Rent | Sample Size (n) | 97% CI (lower–upper) | CI Width as % of Avg | Confidence Tier |
|---|---|---|---|---|---|
| Cook County, IL | |||||
| Studio | $1,844 | 22,162 | $1,837–$1,852 | 0.83% | HIGH1 |
| 1BR | $2,185 | 51,585 | $2,179–$2,192 | 0.60% | HIGH |
| 2BR | $2,762 | 29,576 | $2,748–$2,777 | 1.07% | HIGH |
| 3BR | $3,936 | 4,062 | $3,862–$4,011 | 3.78% | HIGH |
| 4BR | $3,911 | 626 | $3,560–$4,263 | 18.00% | LOW-DO NOT UNDERWRITE |
| DuPage County, IL | |||||
| Studio | $1,664 | 872 | $1,641–$1,686 | 2.73% | HIGH |
| 1BR | $1,756 | 12,493 | $1,749–$1,763 | 0.78% | HIGH |
| 2BR | $2,109 | 12,038 | $2,099–$2,119 | 0.95% | HIGH |
| 3BR | $2,872 | 944 | $2,799–$2,946 | 5.13% | MODERATE |
| 4BR | $5,372 | 14 | $5,285–$5,458 | 3.21% | LOW-DO NOT UNDERWRITE |
| Lake County, IL | |||||
| Studio | $1,545 | 319 | $1,478–$1,612 | 8.70% | MODERATE |
| 1BR | $1,740 | 3,449 | $1,721–$1,759 | 2.14% | HIGH |
| 2BR | $2,134 | 4,476 | $2,108–$2,159 | 2.41% | HIGH |
| 3BR | $3,869 | 226 | $3,699–$4,039 | 8.80% | MODERATE |
| 4BR | — | 0 | — | — | NO DATA |
| Will County, IL | |||||
| Studio | $1,410 | 215 | $1,360–$1,459 | 6.99% | MODERATE |
| 1BR | $1,628 | 1,397 | $1,607–$1,649 | 2.59% | HIGH |
| 2BR | $2,118 | 1,485 | $2,091–$2,144 | 2.50% | HIGH |
| 3BR | $2,601 | 147 | $2,517–$2,685 | 6.48% | MODERATE |
| 4BR | — | 0 | — | — | NO DATA |
| Kane County, IL | |||||
| Studio | $1,561 | 115 | $1,521–$1,600 | 5.09% | MODERATE |
| 1BR | $1,731 | 1,353 | $1,718–$1,745 | 1.58% | HIGH |
| 2BR | $2,122 | 1,741 | $2,104–$2,141 | 1.74% | HIGH |
| 3BR | $2,638 | 279 | $2,589–$2,688 | 3.77% | HIGH |
| 4BR | — | 0 | — | — | NO DATA |
| Kendall County, IL | |||||
| Studio | — | 0 | — | — | NO DATA |
| 1BR | $1,762 | 445 | $1,743–$1,781 | 2.15% | HIGH |
| 2BR | $2,303 | 517 | $2,278–$2,328 | 2.19% | HIGH |
| 3BR | $3,020 | 191 | $2,964–$3,076 | 3.69% | HIGH |
| 4BR | $3,608 | 21 | $3,381–$3,836 | 12.60% | MODERATE |
| McHenry County, IL | |||||
| Studio | $1,301 | 26 | $1,216–$1,386 | 13.02% | MODERATE |
| 1BR | $1,712 | 410 | $1,671–$1,752 | 4.75% | HIGH |
| 2BR | $1,967 | 725 | $1,919–$2,015 | 4.83% | HIGH |
| 3BR | $2,468 | 85 | $2,253–$2,684 | 17.45% | LOW-DO NOT UNDERWRITE |
| 4BR | — | 0 | — | — | NO DATA |
| DeKalb County, IL | |||||
| Studio | — | 0 | — | — | NO DATA |
| 1BR | $1,062 | 48 | $1,032–$1,092 | 5.62% | MODERATE |
| 2BR | $1,248 | 168 | $1,228–$1,268 | 3.16% | HIGH |
| 3BR | $1,383 | 107 | $1,362–$1,404 | 3.03% | HIGH |
| 4BR | $1,595 | 13 | $1,539–$1,650 | 6.99% | LOW-DO NOT UNDERWRITE |
| Grundy County, IL | |||||
| Studio | — | 0 | — | — | NO DATA |
| 1BR | $1,291 | 56 | $1,279–$1,302 | 1.77% | MODERATE |
| 2BR | $1,600 | 143 | $1,569–$1,632 | 3.94% | HIGH |
| 3BR | $1,370 | 4 | $1,197–$1,543 | 25.20% | LOW-DO NOT UNDERWRITE |
| 4BR | — | 0 | — | — | NO DATA |
| Lake County, IN | |||||
| Studio | $956 | 16 | $940–$972 | 3.36% | LOW-DO NOT UNDERWRITE |
| 1BR | $1,296 | 920 | $1,281–$1,310 | 2.17% | HIGH |
| 2BR | $1,585 | 1,792 | $1,566–$1,603 | 2.32% | HIGH |
| 3BR | $2,182 | 291 | $2,116–$2,247 | 6.00% | MODERATE |
| 4BR | $2,745 | 44 | $2,560–$2,931 | 13.53% | MODERATE |
| Porter County, IN | |||||
| Studio | $1,174 | 4 | $1,144–$1,204 | 5.08% | LOW-DO NOT UNDERWRITE |
| 1BR | $1,343 | 669 | $1,330–$1,357 | 1.97% | HIGH |
| 2BR | $1,549 | 855 | $1,533–$1,566 | 2.09% | HIGH |
| 3BR | $2,014 | 130 | $1,946–$2,082 | 6.76% | MODERATE |
| 4BR | — | 0 | — | — | NO DATA |
| Jasper County, IN | |||||
| Studio | — | 0 | — | — | NO DATA |
| 1BR | $1,690 | 5 | $1,143–$2,237 | 64.71% | LOW-DO NOT UNDERWRITE |
| 2BR | $1,378 | 12 | $956–$1,799 | 61.20% | LOW-DO NOT UNDERWRITE |
| 3BR | $2,022 | 10 | $1,391–$2,653 | 62.39% | LOW-DO NOT UNDERWRITE |
| 4BR | — | 0 | — | — | NO DATA |
| Newton County, IN | |||||
| Studio | — | 0 | — | — | NO DATA |
| 1BR | — | 0 | — | — | NO DATA |
| 2BR | — | 0 | — | — | NO DATA |
| 3BR | — | 0 | — | — | NO DATA |
| 4BR | — | 0 | — | — | NO DATA |
The honest read: this isn't a uniform 13-county, 5-bedroom grid — it's a market where Cook, DuPage, Lake (IL), Will, and Kane counties carry real statistical weight on 1BR and 2BR units (thousands to tens of thousands of leases, CI width under 3% of the average), and almost everything else is thinner than it looks.
Trust these cuts:
Don't underwrite off these:
Bottom line for underwriting: lean on the core-county 1BR/2BR numbers with confidence; treat core-county 3BR as directional; and for 4BR anywhere in the MSA — plus almost any cut in DeKalb, Grundy, or the outer Indiana counties — go get an actual comp set or rent roll rather than trusting the aggregate. The fringe counties (Jasper, Newton) don't have enough multifamily stock being tracked to produce a market rent at all.
This is a read-only snapshot of a RealAI analysis.