library(tidyverse)
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.
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`
# 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)
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.
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” |
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)
Here we write the file for use in the subsequent merge file
# Write file
saveRDS(pvad2, file="pvad2.rds")