Property transactions in Charlottesville: Hot market for parcels designated as "Middle Intensity" in Future Land Use Plan

A response to March 2022 property transactions in Charlottesville: Hot market for parcels designated as "Middle Intensity" in Future Land Use Plan

I always make time to read Sean Tubbs's newsletter, and I was interested to see what he has to say about the new "Medium-Intensity Residential" land use designation adopted in last year's Comprehensive Plan. Sean noticed a number of properties with this designation, or located close to properties with this designation, that sold for high prices, some far above their most recent assessments. He wrote that

This month's key phrase is "Medium Intensity Residential".

and noted that

...properties with the Medium Intensity Residential designation are selling well over the 2022 assessment.

Sean writes that "I intend no analysis". Fair enough, but let's do some analysis! The city provides mostly current data on assessments, property transactions, and parcel details at its Open Data Portal, which I have been mirroring to a public dataset using Google BigQuery for ease of use. Let's dig into the claims in the blog post. As I read it, there are two key arguments that we can evaluate:

  • Parcels with the Medium-Intensity Residential designation have been selling for over their official assessments
  • The difference between sale prices and assessments is greater for Medium-Intensity Residential than for other designations

First, let's compare median sale prices, assessments, and the ratio between the two across land use designations. I'm looking at all sales in 2022 to begin with. Note that I'm excluding sales with a price of $0 and sales that included multiple parcels.

bq.query(
    """
    select distinct
      percentile_cont(sales.saleamount, 0.5) over (partition by flum.desig_oct) as saleamount,
      percentile_cont(assessments.totalvalue, 0.5) over (partition by flum.desig_oct) as assessment,
      percentile_cont(sales.saleamount / assessments.totalvalue, 0.5) over (partition by flum.desig_oct) as saleassessmentratio,
      count(*) over (partition by flum.desig_oct) as count,
      flum.desig_oct as designation,
    from `cvilledata.cville_open_data.real_estate_sales` sales
    join `cvilledata.cville_open_data.real_estate_all_assessments` assessments on sales.parcelnumb = assessments.parcelnumb and assessments.taxyear = 2022
    join `cvilledata.cville_plans_together.flum_202110` flum on sales.parcelnumb = flum.parcelnumb
    where sales.saledate >= '2022-01-01'
      and sales.saleamount > 0
      and sales.bookpage not in (
        select
          bookpage
        from `cvilledata.cville_open_data.real_estate_sales`
        where saledate >= '2022-01-01'
          and saleamount > 0
        group by bookpage
        having count(*) > 1
      )
      and flum.desig_oct in (
        'General Residential',
        'Medium-Intensity Residential',
        'High-Intensity Residential'
      )
    order by count desc
    """
).result().to_dataframe()
saleamount assessment saleassessmentratio count designation
0 423750.0 345100.0 1.128854 100 General Residential
1 355350.0 364200.0 1.054195 24 Medium-Intensity Residential
2 430000.0 440800.0 0.975198 2 High-Intensity Residential

As Sean noted, Medium-Intensity Residential parcels are selling for over their assessments, with the median ratio of sale price to assessed value at 1.05, meaning that sales were typically about 5% over assessments. However, General Residential parcels had an even higher ratio of 1.13, with the median parcel selling for about 13% more than its assessed value. But Sean only considered March; let's use that same filter to make sure we're looking at the same parcels:

bq.query(
    """
    select distinct
      percentile_cont(sales.saleamount, 0.5) over (partition by flum.desig_oct) as saleamount,
      percentile_cont(assessments.totalvalue, 0.5) over (partition by flum.desig_oct) as assessment,
      percentile_cont(sales.saleamount / assessments.totalvalue, 0.5) over (partition by flum.desig_oct) as saleassessmentratio,
      count(*) over (partition by flum.desig_oct) as count,
      flum.desig_oct as designation,
    from `cvilledata.cville_open_data.real_estate_sales` sales
    join `cvilledata.cville_open_data.real_estate_all_assessments` assessments on sales.parcelnumb = assessments.parcelnumb and assessments.taxyear = 2022
    join `cvilledata.cville_plans_together.flum_202110` flum on sales.parcelnumb = flum.parcelnumb
    where sales.saledate >= '2022-03-01' and sales.saledate < '2022-04-01'
      and sales.saleamount > 0
      and sales.bookpage not in (
        select
          bookpage
        from `cvilledata.cville_open_data.real_estate_sales`
        where saledate >= '2022-03-01' and saledate < '2022-04-01'
          and saleamount > 0
        group by bookpage
        having count(*) > 1
      )
      and flum.desig_oct in (
        'General Residential',
        'Medium-Intensity Residential',
        'High-Intensity Residential'
      )
    order by count desc
    """
).result().to_dataframe()
saleamount assessment saleassessmentratio count designation
0 520000.0 412400.0 1.165224 43 General Residential
1 421000.0 396300.0 1.115945 14 Medium-Intensity Residential

Looking at March alone, Medium-Intensity Residential parcels had sale prices exceeding their assessments by about 12%, and General Residential parcels had prices exceeding their assessmens by about 18%.

Let's revisit the claims from above:

Parcels with the Medium-Intensity Residential designation have been selling for over their official assessments

This is consistent with the data! Medium-Intensity Residential parcels sold for about 5% more than assessments overall for 2022 and 12% in March alone. What about the next claim?

The difference between sale prices and assessments is greater for Medium-Intensity Residential than for other designations

This claim isn't supported here. While Medium-Intensity Residential parcels sold for over their assessment prices, this was also true for General Residential parcels, and it turns out that sale prices exceeeded assessments by an even higher proportion in General Residential. Sean wrote that

This month's key phrase is "Medium Intensity Residential".

But maybe the unusual thing about Medium-Intensity Residential is that the recent sale prices of these parcels have been lower, relative to assessments, than the General Residential category that makes up the bulk of the city's residential land.

I've tried to evaluate these claims in a bit more detail, but there are many limitations to this quick analysis. Maybe the Medium-Intensity Residential properties that have been sold this year are in different neighborhoods than the General Residential properties; maybe the city assesses properties differently by land use designation in a biased way. Maybe there was a pre-existing difference in land or property values across designations. Maybe correcting for these potential differences, or others that I haven't thought of, would support the claim that Medium-Intensity Residential properties are suddenly uniquely expensive. But at least so far, it appears that sale prices are higher than assessments citywide, and if anything this is more true of General Residential than Medium-Intensity Residential in recent months.

It's also worth pointing out that we don't have much data yet. The Comprehensive Plan was passed in December 2021, and only 23 parcels zoned Medium-Intensity Residential have sold in 2022 (not including multi-parcel transactions or homes built after 2020). Meanwhile, the zoning rewrite is just starting:we haven't actually changed the rules yet. It's interesting to look at the early data we have, but realistically, it's going to take years to draw conclusions with any confidence. Anyway, thanks to Sean for raising some interesting questions. If you're still reading, subscribe to his substack if you haven't already.

One last point: maybe this analysis has been skewed by a small number of unusual sales. Using medians rather than means should reduce the influence of outliers. And I've excluded sales that I don't think we should consider: specifically, properties that sold for $0 and properties that were sold as a package along with other properties. But maybe I missed something! So for completeness, here are the individual parcels that have sold in 2022, first Medium-Intensity Residential, then General Residential:

bq.query(
    """
    select
      sales.parcelnumb as parcelnumber,
      sales.saleamount,
      sales.saledate,
      assessments.totalvalue,
      sales.saleamount / assessments.totalvalue as saleassessmentratio,
      sales.streetnumb,
      sales.streetname,
      sales.unit,
    from `cvilledata.cville_open_data.real_estate_sales` sales
    join `cvilledata.cville_open_data.real_estate_all_assessments` assessments on sales.parcelnumb = assessments.parcelnumb and assessments.taxyear = 2022
    join `cvilledata.cville_plans_together.flum_202110` flum on sales.parcelnumb = flum.parcelnumb
    where sales.saledate >= '2022-01-01'
      and sales.saleamount > 0
      and sales.bookpage not in (
        select
          bookpage
        from `cvilledata.cville_open_data.real_estate_sales`
        where saledate >= '2022-01-01'
          and saleamount > 0
        group by bookpage
        having count(*) > 1
      )
      and flum.desig_oct = 'Medium-Intensity Residential'
    order by sales.saledate desc
    """
).result().to_dataframe()
parcelnumber saleamount saledate totalvalue saleassessmentratio streetnumb streetname unit
0 470041000 525000 2022-04-04 386300 1.359047 607 WATSON AVE None
1 050013000 962500 2022-03-31 706300 1.362735 807 RUGBY RD None
2 070003180 835000 2022-03-31 681700 1.224879 111 ALDERMAN RD None
3 550049000 385000 2022-03-31 400900 0.960339 1338 CHESAPEAKE ST None
4 43C041000 312500 2022-03-29 325200 0.960947 2239 BANBURY ST None
5 21A131200 360700 2022-03-28 312500 1.154240 103 LONGWOOD DR E
6 440028230 511000 2022-03-24 328400 1.556029 1435 WESTWOOD RD None
7 41A101100 900000 2022-03-24 698700 1.288106 1616 MEADOWBROOK HEIGHTS RD None
8 25A175000 365000 2022-03-21 338700 1.077650 159 BROOKWOOD DR None
9 110076000 550000 2022-03-16 425900 1.291383 516 VALLEY RD None
10 600145100 606500 2022-03-15 579900 1.045870 1010 ELLIOTT AVE None
11 220195101 350000 2022-03-10 425300 0.822949 1526 CHERRY AVE None
12 540249000 260000 2022-03-04 275700 0.943054 213 MEADE AVE None
13 470045110 330000 2022-03-04 391700 0.842481 905 MARSHALL ST None
14 110061100 457000 2022-03-02 316500 1.443918 126 MAYWOOD LN None
15 200100100 345000 2022-02-24 347500 0.992806 2601 JEFFERSON PARK AVE None
16 43C026000 314000 2022-02-22 368400 0.852334 2238 BANBURY ST None
17 610017110 239000 2022-02-17 175500 1.361823 959 RIVES ST None
18 190034340 235000 2022-02-17 376300 0.624502 201 OLD LYNCHBURG RD None
19 270056000 233000 2022-02-14 285500 0.816112 405 ELLIOTT AVE None
20 540246000 286000 2022-02-08 293700 0.973783 305 MEADE AVE None
21 200031000 392000 2022-02-02 360000 1.088889 107 HARRIS RD None
22 440018100 300000 2022-01-28 387600 0.773994 1439 RUGBY AVE None
23 290266024 345000 2022-01-13 324700 1.062519 210 BURNET ST None

bq.query(
    """
    select
      sales.parcelnumb as parcelnumber,
      sales.saleamount,
      sales.saledate,
      assessments.totalvalue,
      sales.saleamount / assessments.totalvalue as saleassessmentratio,
      sales.streetnumb,
      sales.streetname,
      sales.unit,
    from `cvilledata.cville_open_data.real_estate_sales` sales
    join `cvilledata.cville_open_data.real_estate_all_assessments` assessments on sales.parcelnumb = assessments.parcelnumb and assessments.taxyear = 2022
    join `cvilledata.cville_plans_together.flum_202110` flum on sales.parcelnumb = flum.parcelnumb
    where sales.saledate >= '2022-01-01'
      and sales.saleamount > 0
      and sales.bookpage not in (
        select
          bookpage
        from `cvilledata.cville_open_data.real_estate_sales`
        where saledate >= '2022-01-01'
          and saleamount > 0
        group by bookpage
        having count(*) > 1
      )
      and flum.desig_oct = 'General Residential'
    order by sales.saledate desc
    """
).result().to_dataframe()
parcelnumber saleamount saledate totalvalue saleassessmentratio streetnumb streetname unit
0 230094200 360000 2022-04-07 372100 0.967482 512 PATON ST None
1 41A006000 750000 2022-04-07 553800 1.354280 1631 BRANDYWINE DR None
2 230090000 60000 2022-04-01 218200 0.274977 1306 KING ST None
3 380045000 625000 2022-04-01 504100 1.239833 1610 BRUCE AVE None
4 25A116101 550000 2022-04-01 471000 1.167728 948 RAYMOND RD None
5 560114200 622431 2022-04-01 104500 5.956278 120 FRANKLIN ST None
6 290164000 751100 2022-03-31 495300 1.516455 412 5TH ST SW None
7 410043000 592000 2022-03-31 462400 1.280277 1427 GENTRY LN None
8 050006000 1300000 2022-03-31 1154100 1.126419 1816 WINSTON RD None
9 18A077B00 525000 2022-03-31 414600 1.266281 257 HUNTLEY AVE None
10 490054000 400000 2022-03-31 375000 1.066667 1217 RIVER VISTA AVE None
11 540064100 375000 2022-03-30 360000 1.041667 420 13TH ST NE None
12 48A040039 737995 2022-03-30 160000 4.612469 1341 PEN PARK LN None
13 41A076000 711501 2022-03-30 549900 1.293873 1644 ST ANNES RD None
14 260072000 265500 2022-03-28 239900 1.106711 510 ROUGEMONT AVE None
15 48A040015 706807 2022-03-25 160000 4.417544 430 LOCHLYN HILL DR None
16 600088000 388000 2022-03-24 295100 1.314809 906 STONEHENGE AVE None
17 200136000 485000 2022-03-24 418200 1.159732 234 MONTE VISTA AVE None
18 610065200 449000 2022-03-23 300600 1.493679 904 RIVES ST None
19 600120007 520000 2022-03-23 429600 1.210428 1301 CASTALIA ST EXT None
20 230048000 270000 2022-03-22 233600 1.155822 1008 GROVE ST None
21 18A013000 315000 2022-03-22 342100 0.920783 227 STRIBLING AVE None
22 310035000 645000 2022-03-21 563600 1.144429 723 WEST ST None
23 470048800 750000 2022-03-21 692200 1.083502 928 MARSHALL ST None
24 48A040005 202860 2022-03-21 160000 1.267875 425 LOCHLYN HILL DR None
25 48A040008 200655 2022-03-21 160000 1.254094 407 LOCHLYN HILL DR None
26 48A040029 157658 2022-03-21 160000 0.985363 706 LOCHLYN HILL DR None
27 060048000 1055000 2022-03-18 1059500 0.995753 1844 EDGEWOOD LN None
28 18A121000 605000 2022-03-18 487300 1.241535 220 HUNTLEY AVE None
29 030026000 1150000 2022-03-18 789900 1.455880 1617 WESTWOOD RD None
30 240071000 305000 2022-03-18 301400 1.011944 713 ROCK CREEK RD None
31 400034000 1225000 2022-03-17 1051300 1.165224 2035 HESSIAN RD None
32 48A040038 806222 2022-03-17 160000 5.038888 1347 PEN PARK LN None
33 550066180 550000 2022-03-11 476700 1.153765 102 CHISHOLM PL None
34 520016400 599000 2022-03-10 590700 1.014051 736 LYONS AVE None
35 240068000 425000 2022-03-10 356600 1.191812 707 ROCK CREEK RD None
36 200019100 65000 2022-03-09 150000 0.433333 0 PORTER AVE None
37 260043110 480000 2022-03-08 444300 1.080351 120 ROY'S PL None
38 070003600 1295000 2022-03-08 931000 1.390977 2109 MORRIS RD None
39 610079150 236500 2022-03-08 243000 0.973251 812 NASSAU ST None
40 48A040034 739993 2022-03-07 160000 4.624956 736 LOCHLYN HILL DR None
41 510162000 337000 2022-03-04 321700 1.047560 1301 POPLAR ST None
42 42A087000 970000 2022-03-04 808200 1.200198 1625 YORKTOWN DR None
43 47A095000 330000 2022-03-02 293400 1.124744 1224 AGNESE ST None
44 21A023000 455000 2022-03-01 412400 1.103298 403 ALLEN DR None
45 190037290 380000 2022-03-01 347700 1.092896 417 MOBILE LN None
46 210080000 497000 2022-03-01 424300 1.171341 108 RAYMOND AVE None
47 480050000 520000 2022-03-01 428900 1.212404 1025 ST CHARLES AVE None
48 060068000 1375000 2022-03-01 919400 1.495541 1831 UNIVERSITY CIR None
49 43B008000 522600 2022-02-28 430400 1.214219 1403 LEHIGH CIR None
50 55A088618 468000 2022-02-28 390100 1.199692 109 RIVERBLUFF CIR None
51 22A013000 435000 2022-02-25 522400 0.832695 1504 TRAILRIDGE RD None
52 190075000 450000 2022-02-25 476400 0.944584 311 MONTE VISTA AVE None
53 590134000 460000 2022-02-24 261100 1.761777 705 ROCKLAND AVE None
54 470020100 480000 2022-02-22 486500 0.986639 505 PARK HILL None
55 570139000 345000 2022-02-18 221200 1.559675 304 SPRUCE ST None
56 48A004000 315000 2022-02-18 283400 1.111503 1209 HOLMES AVE None
57 55A124000 306000 2022-02-18 284500 1.075571 1703 E MARKET ST None
58 48A040051 134505 2022-02-17 136000 0.989007 456 NICHOLSON ST None
59 48A040052 134505 2022-02-17 136000 0.989007 452 NICHOLSON ST None
60 230143000 420000 2022-02-16 350700 1.197605 108 NORTH BAKER ST None
61 230068000 340000 2022-02-15 273400 1.243599 402 JONES ST None
62 300093000 400000 2022-02-15 290700 1.375989 856 NALLE ST None
63 410050000 260000 2022-02-15 340300 0.764032 1439 GENTRY LN None
64 240147000 185801 2022-02-15 187600 0.990410 739 PROSPECT AVE None
65 240148000 162000 2022-02-15 170900 0.947923 741 PROSPECT AVE None
66 220046110 365000 2022-02-14 344300 1.060122 113 THOMAS DR None
67 48A014000 345000 2022-02-10 294200 1.172672 1109 HOLMES AVE None
68 190035260 340000 2022-02-09 332800 1.021635 2749 MCELROY DR None
69 490099000 570000 2022-02-09 525700 1.084269 1304 BELLEVIEW AVE None
70 260110100 189000 2022-02-08 156600 1.206897 1505 ROSA TER None
71 40C018000 161000 2022-02-08 318400 0.505653 1915 SWANSON DR None
72 55A08811A 260000 2022-02-08 215300 1.207617 338 RIVERSIDE AVE None
73 590379012 505000 2022-02-04 131900 3.828658 1624 RIALTO ST None
74 030111000 200000 2022-02-04 243300 0.822030 704 12TH ST NW None
75 41A059000 485000 2022-02-04 514400 0.942846 1627 ST ANNES RD None
76 43C032000 450000 2022-02-03 453100 0.993158 2226 BANBURY ST None
77 48A040012 799749 2022-02-03 160000 4.998431 412 LOCHLYN HILL DR None
78 220046120 350000 2022-02-02 345900 1.011853 111 THOMAS DR None
79 590379011 535585 2022-02-01 131900 4.060538 1622 RIALTO ST None
80 500142000 120000 2022-01-31 110000 1.090909 516 CAROLINE AVE None
81 40C034000 422500 2022-01-28 465200 0.908212 2305 SHELBY DR None
82 030060800 633000 2022-01-28 579800 1.091756 113 ROBINSON WOODS None
83 48A040014 685436 2022-01-27 657600 1.042330 424 LOCHLYN HILL DR None
84 300167000 522000 2022-01-24 340800 1.531690 609 7 1/2 ST SW None
85 590311000 250000 2022-01-20 215000 1.162791 802 DRUID AVE None
86 48A012000 349000 2022-01-19 292700 1.192347 708 ELIZABETH AVE None
87 47A124000 367500 2022-01-18 357500 1.027972 1242 HOLMES AVE None
88 490142000 404000 2022-01-14 350700 1.151982 1105 LOCUST AVE None
89 190034140 345000 2022-01-14 336100 1.026480 2722 MCELROY DR None
90 300117100 305000 2022-01-12 242100 1.259810 813 KING ST None
91 220046201 380000 2022-01-12 335900 1.131289 117 DAVID TER None
92 390001000 585000 2022-01-11 578200 1.011761 2006 MEADOWBROOK RD None
93 210105230 370000 2022-01-10 424000 0.872642 2310 CRESTMONT AVE None
94 310261000 250000 2022-01-07 297800 0.839490 708 WEST ST None
95 230027000 200000 2022-01-07 254000 0.787402 1206 GROVE ST None
96 43A024000 805916 2022-01-06 810100 0.994835 1320 KENWOOD LN None
97 18A060000 580000 2022-01-05 529400 1.095580 219 HUNTLEY AVE None
98 210105160 368000 2022-01-05 399100 0.922075 2324 CRESTMONT AVE None
99 22B303000 205000 2022-01-04 165900 1.235684 952 ROCK CREEK RD None