Exploring Property Records

SDS 236

Benjamin S. Baumer

Smith College

Mar 8, 2026

Property ownership

Massachusetts Property Tax Parcels

  • Data are separated by town
  • Don’t want to have to re-download it
  • Set cache location
library(tidyverse)
cache_dir <- here::here("data")
cache_dir
[1] "/home/runner/work/sds236/sds236/data"

Towns in Massachusetts

  • Download the spreadsheet about the towns
download.file(
  url = "https://www.mass.gov/doc/massgis-parcel-data-download-links-table/download", 
  destfile = "/tmp/towns.xlsx"
)
  • Reads the towns data frame
ma_towns <- readxl::read_excel("/tmp/towns.xlsx") |>
  janitor::clean_names()

Town info

ma_towns |>
  select(town_name, shapefile_download_url)
# A tibble: 351 × 2
   town_name shapefile_download_url                                             
   <chr>     <chr>                                                              
 1 ABINGTON  http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
 2 ACTON     http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
 3 ACUSHNET  http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
 4 ADAMS     http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
 5 AGAWAM    http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
 6 ALFORD    http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
 7 AMESBURY  http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
 8 AMHERST   http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
 9 ANDOVER   http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
10 AQUINNAH  http://download.massgis.digital.mass.gov/shapefiles/l3parcels/L3_S…
# ℹ 341 more rows

Your turn: Towns

  • Download the ma_towns data frame
  • Inspect it

Pick a town

  • Download data for Northampton
noho_lcl_zip <- tempfile()

ma_towns |>
  filter(town_name == "NORTHAMPTON") |>
  pull(shapefile_download_url) |>
  download.file(destfile = noho_lcl_zip)
noho_dsn <- noho_lcl_zip |>
  unzip(exdir = cache_dir) |>
  dirname() |>
  unique()

noho_dsn
[1] "/home/runner/work/sds236/sds236/data/L3_SHP_M214_Northampton"

Your turn: Download shapefiles

  • Download the data for Northampton…
  • …and at least one other town

What’s in there?

  • Zip files contain both shapefiles and assessor data
  • Linked by LOC_ID
library(sf)
noho_dsn |>
  st_layers()
Driver: ESRI Shapefile 
Available layers:
            layer_name geometry_type features fields
1   M214Misc_CY26_FY26       Polygon      122      4
2 M214TaxPar_CY26_FY26       Polygon    10663     12
3 M214OthLeg_CY26_FY26       Polygon     2331      9
4 M214UC_LUT_CY26_FY26            NA      613      3
5 M214Assess_CY26_FY26            NA    11415     37
6   M214_LUT_CY26_FY26            NA       66      4
                        crs_name
1 NAD83 / Massachusetts Mainland
2 NAD83 / Massachusetts Mainland
3 NAD83 / Massachusetts Mainland
4                           <NA>
5                           <NA>
6                           <NA>

Read Assessor’s data

assess_layer_name <- noho_dsn |>
  st_layers() |>
  pluck("name") |>
  str_subset("Assess.+FY26")

assess_layer_name
[1] "M214Assess_CY26_FY26"
assess <- noho_dsn |>
  st_read(layer = assess_layer_name)
Reading layer `M214Assess_CY26_FY26' from data source 
  `/home/runner/work/sds236/sds236/data/L3_SHP_M214_Northampton' 
  using driver `ESRI Shapefile'
head(assess)
      PROP_ID          LOC_ID BLDG_VAL LAND_VAL OTHER_VAL TOTAL_VAL   FY
1 01 -001-001 M_103188_902866   774900   127300     53500    902200 2026
2 01 -001-601 M_102807_902812        0     2400         0      2400 2026
3 02 -001-001 M_103254_902620   762100   167200         0    929300 2026
4 02 -002-001 M_103258_902921   468500   119700     13480    588200 2026
5 02 -003-001 M_103322_902851        0    94100         0     94100 2026
6 02 -005-001 M_104001_902887        0     5300         0      5300 2026
  LOT_SIZE  LS_DATE LS_PRICE USE_CODE SITE_ADDR ADDR_NUM       FULL_STR
1    2.000 20190830   545000      101      <NA>      710 NORTH FARMS RD
2   23.039 20190830   545000      601      <NA>     <NA> NORTH FARMS RD
3    7.504 20240726      100      101      <NA>      650 NORTH FARMS RD
4    1.210 20150612   230000      101      <NA>      705 NORTH FARMS RD
5    4.350 99990101        0      130      <NA>     <NA> NORTH FARMS RD
6    4.200 99990101        0      132      <NA>     <NA> NORTH FARMS RD
  LOCATION        CITY   ZIP                     OWNER1             OWN_ADDR
1     <NA> NORTHAMPTON 01060   BRIERLY-BOWERS KEITH W & 710 NORTH FARMS ROAD
2     <NA> NORTHAMPTON 01060  BRIERLEY-BOWERS KEITH W &   710 NORTH FARMS RD
3     <NA> NORTHAMPTON 01060 SANDERS, JUDITH R, TRUSTEE   650 NORTH FARMS RD
4     <NA> NORTHAMPTON 01060 KENNEDY ANDREA M & BRIAN C   705 NORTH FARMS RD
5     <NA> NORTHAMPTON 01060 DEROSE CHARLES W & LEILA K   677 NORTH FARMS RD
6     <NA> NORTHAMPTON 01060           KURTIS SUZANNE S   569 NORTH FARMS RD
  OWN_CITY OWN_STATE OWN_ZIP OWN_CO LS_BOOK LS_PAGE REG_ID ZONING YEAR_BUILT
1 FLORENCE        MA   01062   <NA>   13376     245   <NA>   <NA>       1998
2 FLORENCE        MA   01062   <NA>   13376     245   <NA>   <NA>          0
3 FLORENCE        MA   01062   <NA>   15193     322   <NA>   <NA>       2003
4 FLORENCE        MA   01062   <NA>   11968     120   <NA>   <NA>       1962
5 FLORENCE        MA   01062   <NA>    1587     155   <NA>   <NA>          0
6 FLORENCE        MA   01062   <NA>   10129     336   <NA>   <NA>          0
  BLD_AREA UNITS RES_AREA              STYLE STORIES NUM_ROOMS LOT_UNITS
1        0     1     2598            2:RANCH       1         9         A
2        0     0        0               <NA>    <NA>         0         A
3        0     1     1815     7:CONTEMPORARY       1         9         A
4        0     1     2010 4:COLONIAL/GAMBREL       2         7         A
5        0     0        0               <NA>    <NA>         0         A
6        0     0        0               <NA>    <NA>         0         A
  CAMA_ID TOWN_ID
1       0     214
2       0     214
3       0     214
4       0     214
5       0     214
6       0     214

Read town parcel shapefiles

parcel_layer_name <- noho_dsn |>
  st_layers() |>
  pluck("name") |>
  str_subset("TaxPar.+FY26")

parcels <- noho_dsn |>
  st_read(layer = parcel_layer_name) |>
  st_transform(4326)
Reading layer `M214TaxPar_CY26_FY26' from data source 
  `/home/runner/work/sds236/sds236/data/L3_SHP_M214_Northampton' 
  using driver `ESRI Shapefile'
Simple feature collection with 10663 features and 12 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 97757.07 ymin: 893258.2 xmax: 110641.8 ymax: 903377.7
Projected CRS: NAD83 / Massachusetts Mainland
head(parcels)
Simple feature collection with 6 features and 12 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -72.68429 ymin: 42.36846 xmax: -72.66976 ymax: 42.37164
Geodetic CRS:  WGS 84
  SHAPE_Leng SHAPE_Area  MAP_PAR_ID          LOC_ID POLY_TYPE MAP_NO SOURCE
1  1675.0871  93187.078 01 -001-601 M_102807_902812       FEE   <NA> ASSESS
2   290.9858   4863.569 02 -002-001 M_103258_902921       FEE   <NA> ASSESS
3   681.4826  17222.044 02 -003-001 M_103322_902851       FEE   <NA> ASSESS
4   630.5125  16621.046 02 -021-001 M_103405_902891       FEE   <NA> ASSESS
5   792.8606  17873.390 02 -022-001 M_103511_902915       FEE   <NA> ASSESS
6   933.3184  27768.490 02 -024-001 M_103585_902857       FEE   <NA> ASSESS
  PLAN_ID LAST_EDIT BND_CHK NO_MATCH TOWN_ID                       geometry
1    <NA>  20250606    <NA>        N     214 MULTIPOLYGON (((-72.67554 4...
2    <NA>  20250604    <NA>        N     214 MULTIPOLYGON (((-72.67525 4...
3    <NA>  20250604    <NA>        N     214 MULTIPOLYGON (((-72.67418 4...
4    <NA>  20250604    <NA>        N     214 MULTIPOLYGON (((-72.67309 4...
5    <NA>  20250604    <NA>        N     214 MULTIPOLYGON (((-72.67164 4...
6    <NA>  20250604    <NA>        N     214 MULTIPOLYGON (((-72.67164 4...

Join the two data sets

noho <- parcels |>
  left_join(assess, by = c("LOC_ID"))

What data do we have now?

noho |>
  filter(str_detect(OWNER1, "BENJAMIN S BAUMER"))
Simple feature collection with 1 feature and 48 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -72.66648 ymin: 42.32266 xmax: -72.666 ymax: 42.32315
Geodetic CRS:  WGS 84
  SHAPE_Leng SHAPE_Area  MAP_PAR_ID          LOC_ID POLY_TYPE MAP_NO SOURCE
1    151.519   1297.477 30A-023-001 M_103869_897593       FEE   <NA> ASSESS
  PLAN_ID LAST_EDIT BND_CHK NO_MATCH TOWN_ID.x     PROP_ID BLDG_VAL LAND_VAL
1    <NA>  20260112    <NA>        N       214 30A-023-001   478700   122100
  OTHER_VAL TOTAL_VAL   FY LOT_SIZE  LS_DATE LS_PRICE USE_CODE SITE_ADDR
1      8300    600800 2026    0.257 20131213   244500      101      <NA>
  ADDR_NUM      FULL_STR LOCATION        CITY   ZIP
1       48 LEXINGTON AVE     <NA> NORTHAMPTON 01060
                             OWNER1         OWN_ADDR OWN_CITY OWN_STATE OWN_ZIP
1 MESCON CORY E & BENJAMIN S BAUMER 48 LEXINGTON AVE FLORENCE        MA   01062
  OWN_CO LS_BOOK LS_PAGE REG_ID ZONING YEAR_BUILT BLD_AREA UNITS RES_AREA
1   <NA>   11544     153   <NA>   <NA>       1869        0     1     1995
           STYLE STORIES NUM_ROOMS LOT_UNITS CAMA_ID TOWN_ID.y
1 1:CONVENTIONAL     1.5         6         A       0       214
                        geometry
1 MULTIPOLYGON (((-72.66624 4...

Your turn: Read town data

  • Read the property tax parcel data for Northampton…
  • …and at least one other town

What do we know?

Who are the richest landowners?

noho |>
  as_tibble() |>
  group_by(OWNER1) |>
  summarize(
    num_parcels = n(),
    acreage = sum(LOT_SIZE, na.rm = TRUE),
    value = sum(TOTAL_VAL)
  ) |>
  arrange(desc(value)) |>
  print(n = 15)
# A tibble: 9,621 × 4
   OWNER1                              num_parcels acreage     value
   <chr>                                     <int>   <dbl>     <dbl>
 1 SMITH COLLEGE                               156   195.  576572860
 2 NORTHAMPTON CITY OF                         134  3231.  261625812
 3 UNITED STATES VETERANS                        1   104.   85320200
 4 NORTHAMPTON HOUSING AUTHORITY                20    36.5  78940000
 5 MASSACHUSETTS COMMONWEALTH OF                18   108.   45694310
 6 HATHAWAY FARMS TOWNHOMES                      1    18.0  29772300
 7 COOLEY DICKINSON HOSPITAL INC                 4    43.2  24912700
 8 COCA COLA COMPANY THE                         1    21.8  21486800
 9 L-3 COMMUNICATIONS CORP                       1    13.6  20451200
10 NORTHAMPTON MANAGEMENT SYSTEMS, INC           2    21.6  19308800
11 OXBOW PROFESSIONAL PARK LLC                   3    15.1  17414100
12 MEADOWBROOK PRESERVATION                      1    26.5  17222400
13 D'AMOUR PAUL H     ET AL                      1    12.2  16155600
14 CITY OF NORTHAMPTON                          42  1375.   16000700
15 LATHROP COMMUNITY INC                         6    82.6  15683000
# ℹ 9,606 more rows

Land use codes

  • Residential properties have USE_CODE: 101-110
  • Single family homes: 101
  • See also this pdf

Who are the millionaires?

noho |>
  as_tibble() |>
  filter(USE_CODE == 101, TOTAL_VAL > 1e6) |>
  select(OWNER1, LOT_SIZE, TOTAL_VAL) |>
  arrange(desc(TOTAL_VAL)) |>
  print(n = 15)
# A tibble: 365 × 3
   OWNER1                                  LOT_SIZE TOTAL_VAL
   <chr>                                      <dbl>     <dbl>
 1 SPROULL ROBERT F & LEE S AND               5.7     2333500
 2 BENNETT ELIZABETH FRASER                   1.43    2280200
 3 ASHMAN, HARVEY A &                        40.3     2136500
 4 NIELDS KATRYNA &                           1.62    2129000
 5 KELLEY, JOHN E & KATRINA FRALICK KELLEY    8.05    2115200
 6 SIERROS KONSTANTINOS N &                   6.65    2047300
 7 GRADY TIMOTHY & JESSICA ANNE               0.916   2027000
 8 UGONE JANNA V                              6.73    1970800
 9 CATARACT CANYON LLC                        1.72    1929900
10 WEINSTEIN PETER J & KATHERINE J            0.294   1863900
11 DOWSETT, DEREK W. &                        0.863   1862000
12 EPSTEIN NOAH J & RACHEL B                  0.845   1849700
13 BROWN, LUKE C. & DANIELLE S.               1.18    1835300
14 RICHTER, BRENT &                           4.43    1784100
15 WILLIAMS BARBARA S &                       0.308   1781200
# ℹ 350 more rows

Where do they live?

library(leaflet)
millionaires <- noho |>
  filter(USE_CODE == 101, TOTAL_VAL > 1e6) |>
  mutate(
    popup = paste0(
      "ID: ", LOC_ID, "</br>", OWNER1, "</br>",
      "Lot size: ", LOT_SIZE, " acres</br>",
      "Assessed value: $", 
      format(round(TOTAL_VAL / 1000), big.mark = ",", scientific = FALSE), "k"
    )
  ) |>
  leaflet() |>
  addTiles() |>
  addPolygons(weight = 1, popup = ~popup)

Million dollar homes

millionaires

Eric Suher

Nu-Way

Affordable housing?

Empty building lots

noho |>
  filter(USE_CODE == 101, LAND_VAL > 0, BLDG_VAL == 0) |>  
  mutate(
    popup = paste0(
      "ID: ", LOC_ID, "</br>", OWNER1, "</br>",
      "Lot size: ", LOT_SIZE, " acres</br>",
      "Assessed value: $", 
      format(round(TOTAL_VAL / 1000), big.mark = ",", scientific = FALSE), "k"
    )
  ) |>
  leaflet() |>
  addTiles() |>
  addPolygons(weight = 1, popup = ~popup)

Your turn: brainstorm