library(tidyverse)

Property Data

Here we do a domain dive on the Property data and produce a data dictionary. Additionally we’ll reduce the number of columns to have more meaningful data in the subsequent merge.




Load Property Data

Surprisingly there are parsing issues in four columns that weren’t parsing issues when I read the original database. (HOUSENUM_LO, HOUSENUM_HI, TENTAXCLASS, CURTAXCLASS) I believe this is because read_csv takes the first record to determine what the field type is and since I subset the original data there are different values in the first record now. Another reason I should write to RDS files (a binary file format native to R) instead of CSV from now on.

Interestingly the load had the following message, New names: however upon inspection there were no column names that looked like they had been automatically updated. My guess is the first column, what looks like a newly generated record number after I written the original subset to .csv in Code Chunk 2, had it’s name reset to ...1. We’ll dispose of that column.

# Load Property data with parsing issues resolved
pvad <- read_csv("~/Documents/D698/PVADex.csv", col_types = cols(HOUSENUM_LO = col_character(), HOUSENUM_HI = col_character(), TENTAXCLASS = col_character(), CURTAXCLASS = col_character(), .default = col_guess()))
## New names:
## • `` -> `...1`
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)
# Code to resolve parsing issues
# code to review parsing issues if any
#problems <- problems(pvad)
#problems

#problems %>%
#  distinct(col) %>%
#  pull(col)

#colnames(pvad)[c(76, 77, 35, 68)]
# Code to identify automatic column name changes
#colnames(pvad)



Domain Dive

Anything we’re not carrying over we are flagging as N/A in the Data Dictionary below. Additionally there are some described columns that we won’t carry over for reasons discussed below.

A lot of the data comes in five time categories Prior Year, Tentative, Current Year, Change by Notice and Final. Prior year is the prior tax assessment year’s final data. Tentative is what the DOF projected the values would be for the current year. The current year is the DOF’s actual initial assessment for the current year. The Change by Notice values reflect revisions to the initial assessment after appeals and corrections. And the Final is after any last minute changes due to late court proceedings or corrections.

For each of those five time categories there are ten values provided. The most important to us is the Market Total Value. This is the DOF’s calculation of the market value of a Class 2 building’s lot by treating it as if it were a rental building.

There are rules about the taxable value not increasing by more than 8% in a year or by 30% in five years, and the change in Market Total Value from year to year is recognized 20% at a time over a five year period, and so the assessed tax value is a lagging indicator of tax assessment compared to the Market Total Value.

Note, the Actual Market Value is 45% of the Market Total Value. There should be no difference charging a property tax of 12.5% on 45% of the market value versus charging 5.625% of the market value, however it looks like there’s a psychological benefit to the DOF. People will feel like they are getting a better deal than market so they are less likely to appeal and their not realizing they should be comparing how far their assessment is versus comparable properties. Hopefully this project should make it easier for a building to identify if they are paying more or less than comparable properties and whether they have an argument to appeal their assessed property taxes.

We could look at exemptions and abatements. These lower taxes through such conditions as an elderly person below a certain income living in a unit of the building, or by a unit of the building being owner occupied, however these are policy choices that don’t affect the inherent fairness of the DOF’s calculation of Market Value. If a building is looking to manage their tax exposure they should first check the accuracy of their filings which determine exemptions and abatements, then they should check the math based on historical market value assessments (which NYC has bigger problems if that is wrong), and lastly they should determine if their market value assessment is correct. For these reasons we can ignore exemptions and abatements.

Any building-lot can be looked up at this website, https://a836-pts-access.nyc.gov/care/forms/htmlframe.aspx?mode=content/home.htm. Once found for each tax year there is a statement with the following information: Five years historical market value, Building class, lot size, Irregular or not, Corner lot or not, number of buildings, building size, stories, and extension or not. Because of this we believe that these land information variables are major drivers of the market value assessments each year.




Data Dictionary

Column Example Description
PARID “1010460023” BBLE = Borough Block Lot Easement
BORO “1” Borough where 1 = Manhattan
BLOCK “1046” Which block of buildings bound by street and avenue
LOT “23” Which lot or parcel in the given block
EASEMENT NA NA = No Easement A = Air Easement B = Non-Air Rights E-M = Land Easement N = Non-Transit Easement P = Pier R = Railroad S = Street U = U.S. Government
SUBIDENT-REUC NA N/A
RECTYPE “1” N/A
YEAR “2025” Assessment Year
IDENT NA N/A
SUBIDENT NA N/A
ROLL_SECTION NA N/A
SECVOL “403” N/A
PYMKTLAND “693000” Prior Year Market Land Value
PYMKTTOT “7276000” Prior Year Market Total Value
PYACTLAND “311850” Prior Year Actual Land Value
PYACTTOT “3274200” Prior Year Actual Total Value
PYACTEXTOT “23200” Prior Year Actual Exemption Total Value
PYTRNLAND “311850” Prior Year Transitional Land Value
PYTRNTOT “3100240” Prior Year Transitional Total Value
PYTRNEXTOT “23200” Prior Year Transitional Exemption Land Total
PYTXBTOT “3100240” Prior Year Taxable Total Value
PYTXBEXTOT “23200” Prior Year Taxable Exemption Total
PYTAXCLASS “2” Prior Year Tax Class
TENMKTLAND “693000” Tentative Market Land Value
TENMKTTOT “7708000” Tentative Market Total Value
TENACTLAND “311850” Tentative Actual Land Value
TENACTTOT “3468600” Tentative Actual Total Value
TENACTEXTOT “23200” Tentative Actual Exemption Total Value
TENTRNLAND “311850” Tentative Transitional Land Value
TENTRNTOT “3198960” Tentative Transitional Total Value
TENTRNEXTOT “23200” Tentative Transitional Exemption Land Total
TENTXBTOT “3198960” Tentative Taxable Total Value
TENTXBEXTOT “23200” Tentative Taxable Exemption Total
TENTAXCLASS “2” Tentative Tax Class
CBNMKTLAND “693000” Change by Notice Market Land Value
CBNMKTTOT “7355000” Change by Notice Market Total Value
CBNACTLAND “311850” Change by Notice Actual Land Value
CBNACTTOT “3309750” Change by Notice Actual Total Value
CBNACTEXTOT “19350” Change by Notice Actual Exemption Total Value
CBNTRNLAND “311850” Change by Notice Transitional Land Value
CBNTRNTOT “3167190” Change by Notice Transitional Total Value
CBNTRNEXTOT “19350” Change by Notice Transitional Exemption Land Total
CBNTXBTOT “3167190” Change by Notice Taxable Total Value
CBNTXBEXTOT “19350” Change by Notice Taxable Exemption Total
CBNTAXCLASS “2” Change by Notice Tax Class
FINMKTLAND “693000” Final Market Land Value
FINMKTTOT “7355000” Final Market Total Value
FINACTLAND “311850” Final Actual Land Value
FINACTTOT “3309750” Final Actual Total Value
FINACTEXTOT “19350” Final Actual Exemption Total Value
FINTRNLAND “311850” Final Transitional Land Value
FINTRNTOT “3167190” Final Transitional Total Value
FINTRNEXTOT “19350” Final Transitional Exemption Land Total
FINTXBTOT “3167190” Final Taxable Total Value
FINTXBEXTOT “19350” Final Taxable Exemption Total
FINTAXCLASS “2” Final Tax Class
CURMKTLAND “693000” Current Year Market Land Value
CURMKTTOT “7355000” Current Year Market Total Value
CURACTLAND “311850” Current Year Actual Land Value
CURACTTOT “3309750” Current Year Actual Total Value
CURACTEXTOT “19350” Current Year Actual Exemption Total Value
CURTRNLAND “311850” Current Year Transitional Land Value
CURTRNTOT “3167190” Current Year Transitional Total Value
CURTRNEXTOT “19350” Current Year Transitional Exemption Land Total
CURTXBTOT “3167190” Current Year Taxable Total Value
CURTXBEXTOT “19350” Current Year Taxable Exemption Total
CURTAXCLASS “2” Current Year Tax Class
PERIOD “3” N/A - Assessment Period when data was collected
NEWDROP “0” N/A
NOAV “0” N/A
VALREF NA N/A
BLDG_CLASS “D4” Building Class
OWNER “315 W 55TH OWNERS CORP” Owner of Record
ZONING “R8” Zoning: R8 is High-Density Residential
HOUSENUM_LO “315” House Number Range allocated to lot_Low
HOUSENUM_HI “319” House Number Range allocated to lot_High
STREET_NAME “WEST 55 STREET” Street Name
ZIP_CODE “10019” Zip Code
GEPSUPPORT_RC “00” N/A
STCODE “1.3487e+10” N/A
LOT_FRT “57” Lot Front Length
LOT_DEP “100.42” Lot Depth Length
LOT_IRREG “R” Is the Lot Irregular?
BLD_FRT “57” Building Front Length
BLD_DEP “71” Building Depth Length
BLD_EXT “N” Extension Indicator
BLD_STORY “7” Number of Stories in Building
CORNER NA Is it a Corner Lot?
LAND_AREA “5725” Lot square footage
NUM_BLDGS “1” Number of Buildings
YRBUILT “1945” Year built
YRBUILT_RANGE “0” N/A
YRBUILT_FLAG NA N/A
YRALT1 “1972” N/A - Year of Alteration
YRALT1_RANGE “0” N/A
YRALT2 “0” N/A
YRALT2_RANGE “0” N/A
COOP_APTS “42” Number of Co-op units
UNITS “44” Number of total units
REUC_REF NA N/A
APTNO NA N/A
COOP_NUM “101228” N/A
CPB_BORO “1” N/A
CPB_DIST “4” N/A
APPT_DATE NA N/A
APPT_BORO NA N/A
APPT_BLOCK NA N/A
APPT_LOT NA N/A
APPT_EASE NA N/A
CONDO_Number NA How many Condo units
CONDO_SFX1 NA N/A
CONDO_SFX2 NA N/A
CONDO_SFX3 NA N/A
UAF_LAND “0” N/A
UAF_BLDG “0” N/A
PROTEST_1 “1” N/A
PROTEST_2 NA N/A
PROTEST_OLD “1” N/A
ATTORNEY_GROUP1 “135” N/A
ATTORNEY_GROUP2 NA N/A
ATTORNEY_GROUP_OLD “135” N/A
GROSS_SQFT “26959” Total Building Square footage
HOTEL_AREA_GROSS “0” N/A
OFFICE_AREA_GROSS “1000” Total Commercial Square footage
RESIDENTIAL_AREA_GROSS “25959” Total Residential Square footage
RETAIL_AREA_GROSS “0” N/A
LOFT_AREA_GROSS “0” N/A
FACTORY_AREA_GROSS “0” N/A
WAREHOUSE_AREA_GROSS “0” N/A
STORAGE_AREA_GROSS “0” N/A
GARAGE_AREA “0” N/A
OTHER_AREA_GROSS “0” N/A
REUC_DESCRIPTION NA N/A
EXTRACRDT “05/14/2024” N/A
PYTAXFLAG “T” Prior Year Tax Flag: “Taxable”
TENTAXFLAG “T” Tentative Tax Flag: “Taxable”
CBNTAXFLAG “T” Change by Notice Tax Flag: “Taxable”
FINTAXFLAG “T” Final Tax Flag: “Taxable”
CURTAXFLAG “T” Current Year Tax Flag: “Taxable”



Subsetting

Here we subset for the 31 fields we are interested. Additions from what we previously discussed are zoning, which could affect the value of the building, as well as year built and years of alterations if any. Also we have included Condo number to be able to identify if a building is a condo instead of a coop which could affect it’s value.

Lastly we select for only the year 2025, at least for the initial run of the project.

selected_vars <- c("PARID", "BORO", "BLOCK", "LOT", "EASEMENT", "YEAR", "FINMKTTOT", "FINTAXCLASS", "BLDG_CLASS", "ZONING", "ZIP_CODE", "LOT_FRT", "LOT_DEP", "LOT_IRREG", "BLD_FRT", "BLD_DEP", "BLD_EXT", "BLD_STORY", "CORNER", "LAND_AREA", "NUM_BLDGS", "YRBUILT", "YRALT1", "YRALT2", "COOP_APTS", "UNITS", "CONDO_Number", "GROSS_SQFT", "OFFICE_AREA_GROSS", "RESIDENTIAL_AREA_GROSS", "FINTAXFLAG")

pvad2 <- pvad[, selected_vars]

pvad2 <- pvad2 %>%
  filter(YEAR == 2025)



Writing

Here we write the file for use in the subsequent merge file

# Write file
saveRDS(pvad2, file="pvad2.rds")