knitr::opts_chunk$set(echo = FALSE)
options(scipen = 999)

Introduction

Making a case in favor of the need for affordable housing for the aging population (65+) on Staten Island (Year we’re looking at - 2016). This is a comparitive analysis across boroughs including state averages followed by a deep dive into granular areas within Staten Island.

Preliminaries

We use an IPUMS data extract to get state, city, borough and PUMA (Public Use Microdata Area) level data for the state of New York and accordingly build the dataset. Then, we filter the data only including the aging population (65+). We now have data per household at the state level which is further granulated into city level (New York City) followed by borough and PUMA (for Staten Island) through a series of transformations .

The following analysis is conducted through a series of graphs, each briefly explained followed by a final summary at the end.

Definitions:

1) “Other” - In the graphs, “Other” is a combined set of all other counties outside New York City in the state of New York.

2) The Blue line in the graphs are the state level averages/medians.

Just to get a general sense of what the demographics are like across boroughs and within the island we first look at the number of people per household who are 65 and above.

Average Persons Per Household Per Borough (65+)

# Mean Function for Average number of people

pernum.func <- function(df){
  m <- summarize(group_by(df,SERIAL), households = n(), income = mean(HHINCOME))
  mean(m$households)
}

# Average Persons in household per Borough (Age 65+)

avperhobo <- melt(sapply(borough.split, pernum.func)); colnames(avperhobo) <- "Average"

ggplot(avperhobo)+
  geom_bar(aes(rownames(avperhobo),Average, 
               fill = c(NA,NA,NA,NA,NA, "withcolor")), stat = "identity") +
  geom_text(aes(rownames(avperhobo),Average, label=round(Average, 2)), vjust=-0.25) +
  geom_hline(aes(yintercept = mean(data$PERNUM)), color = "blue") +
  ggtitle("Average Persons in household per Borough (Age 65+)") +
  xlab("Borough") + ylab("Persons") + theme(legend.position = "none")

Takeaway:

Staten Island has the highest density of 65+ year olds per household out of all the boroughs.

Average Persons Per Household in Staten Island (65+)

avperhosi <- melt(sapply(si.split, pernum.func)); colnames(avperhosi) <- "Average"

ggplot(avperhosi)+
  geom_bar(aes(rownames(avperhosi),Average), stat = "identity") +
  geom_text(aes(rownames(avperhosi),Average, label=round(Average, 2)), vjust=-0.25) +
  geom_hline(aes(yintercept = mean(si$PERNUM)), color = "blue") +
  ggtitle("Average Persons per Household of each PUMA in Staten Island (Age 65+)") +
  xlab("Borough") + ylab("Persons") + theme(legend.position = "none")

Takeaway:

Diving further deeper, we see that South Shore has got the highest density of 65+ year olds per household in Staten Island.

Percentage of Aging population Across Boroughs

# Percentage of Aging Population

perc.func <- function(df){
  (sum(df$AGE >= 65)/length(df$AGE))*100
}

peragpo <- melt(sapply(b.split, perc.func)); colnames(peragpo) <- "Percentage"

# PLot

ggplot(peragpo)+
  geom_bar(aes(rownames(peragpo),Percentage, 
               fill = c(NA,NA,NA,NA,NA, "withcolor")), stat = "identity") +
  geom_text(aes(rownames(peragpo),Percentage, label=round(Percentage, 2)), vjust=-0.25) +
  geom_hline(aes(yintercept = perc.func(dat)), color = "blue") +
  ggtitle("Percentage of Aging population per Borough (Age 65+)") +
  xlab("Borough") + ylab("Percentage") + theme(legend.position = "none")

Takeaway:

Staten Island also has the highest percentage of aging population amongst the boroughs with 19.8% of the people being 65+ which is much higher than the state and city averages.

Percentage of Aging population in Staten Island

# Percentage of Aging Population

perc.func <- function(df){
  (sum(df$AGE >= 65)/length(df$AGE))*100
}

peragpo <- melt(sapply(sitot.split, perc.func)); colnames(peragpo) <- "Percentage"

# PLot

ggplot(peragpo)+
  geom_bar(aes(rownames(peragpo),Percentage), stat = "identity") +
  geom_text(aes(rownames(peragpo),Percentage, label=round(Percentage, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = perc.func(sitot)), color = "blue") +
  ggtitle("Percentage of Aging population per PUMA on Staten Island (Age 65+)") +
  xlab("Borough") + ylab("Percentage") + theme(legend.position = "none")

Takeaway:

This is what the split of the aging population within the island looks like. Over 21% of the people on Mid Island and South Shore are 65 or older.

Average Gross Household Rent Across Boroughs (65+)

# Mean Rent Calculator

rent.func <- function(df){
  m <- summarize(group_by(df,SERIAL, OWNERSHP), households = n(), rent = mean(RENTGRS))
  k <- filter(m, rent > 0, OWNERSHP==2)
  mean(k$rent)
}


# Average Rent
avreperbo <- melt(sapply(borough.split, rent.func)); colnames(avreperbo) <- "Rent"


# Plot
ggplot(avreperbo)+
  geom_bar(aes(rownames(avreperbo),Rent, 
               fill = c(NA,NA,NA,NA,NA, "withcolor")), stat = "identity") +
  geom_text(aes(rownames(avreperbo),Rent, label=round(Rent, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = rent.func(data)), color = "blue") +
  ggtitle("Monthly Average Gross Household Rent Across Boroughs (Age 65+)") +
  xlab("Borough") + ylab("Rent") + theme(legend.position = "none")

Takeaway:

Staten Island renters (65+) on average pay $40 a month more than other renters in the state.

Average Gross Household Rent Across PUMA (65+)

# Average Rent
avreperbo <- melt(sapply(si.split, rent.func)); colnames(avreperbo) <- "Rent"


# Plot
ggplot(avreperbo)+
  geom_bar(aes(rownames(avreperbo),Rent), stat = "identity") +
  geom_text(aes(rownames(avreperbo),Rent, label=round(Rent, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = rent.func(si)), color = "blue") +
  ggtitle("Monthly Average Gross Household Rent Across PUMA on Staten Island (Age 65+)") +
  xlab("Borough") + ylab("Rent") + theme(legend.position = "none")

Takeaways:

South Shore senior renters on average pay 120 dollars a month more than other Staten Islanders and 150 dollars more than anyone else in the state.

North Shore senior renters on average pay 40 dollars a month more than other Staten Islanders and 80 dollars more than anyone else in the state.

Median Income Levels of Aging Population that rents by Borough

# Mean HH Income Calculator
inc.func <- function(df){
  m <- summarize(group_by(df, OWNERSHP), households = n(), income = mean(HHINCOME))
  k <- filter(m, income > 0, OWNERSHP==2)
  median(k$income)
}


# Average HH Income
avincperbo <- melt(sapply(borough.split, inc.func)); colnames(avincperbo) <- "Income"


# Plot
ggplot(avincperbo)+
  geom_bar(aes(rownames(avincperbo),Income, 
               fill = c(NA,NA,NA,NA,NA, "withcolor")), stat = "identity") +
  geom_text(aes(rownames(avincperbo),Income, label=round(Income, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = inc.func(data)), color = "blue") +
  ggtitle("Renters Median Household Income Across Boroughs (Age 65+)") +
  xlab("Borough") + ylab("Income") + theme(legend.position = "none")

Takeaways:

While the rents are higher than the state average, the household income is $325 lower than the state average for seniors who rent in Staten Island.

*50% of all Staten Island households have incomes lesser than $44,000.

Median Income Levels of Aging Population that rents by PUMA in Staten Island

# Mean HH Income Calculator
inc.func <- function(df){
  m <- summarize(group_by(df, OWNERSHP), households = n(), income = mean(HHINCOME))
  k <- filter(m, income > 0, OWNERSHP==2)
  median(k$income)
}


# Average HH Income
avincperbo <- melt(sapply(si.split, inc.func)); colnames(avincperbo) <- "Income"


# Plot
ggplot(avincperbo)+
  geom_bar(aes(rownames(avincperbo),Income), stat = "identity") +
  geom_text(aes(rownames(avincperbo),Income, label=round(Income, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = inc.func(si)), color = "blue") +
  ggtitle("Renters Median Household Income across PUMA in Staten Island (Age 65+)") +
  xlab("Borough") + ylab("Income") + theme(legend.position = "none")

Takeaways

Diving Deeper into this problem, we see that despite South Shore having the highest rents on Staten Island, the renters that live there have a household income $1150 lower than the average. From this graph, we can actually see the disparities present in Staten Island.

50% of the renting households in the North Shore have an income lower than $54,000.

Food Stamps by borough

# Mean HH Income Calculator
food.func <- function(df){
  (length(unique(df$SERIAL[df$FOODSTMP==2 & df$OWNERSHP==2]))/length(unique(df$SERIAL)))*100
}


# Average HH with Foodstamps
avfsperbo <- melt(sapply(borough.split, food.func)); colnames(avfsperbo) <- "Percentage"


# Plot
ggplot(avfsperbo)+
  geom_bar(aes(rownames(avfsperbo),Percentage, 
               fill = c(NA,NA,NA,NA,NA, "withcolor")), stat = "identity") +
  geom_text(aes(rownames(avfsperbo),Percentage, label=round(Percentage, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = food.func(data)), color = "blue") +
  ggtitle("Percentage of Households that receive Food Stamps per Borough (Age 65+)") +
  xlab("Borough") + ylab("Households") + theme(legend.position = "none")

Takeaway:

Just 12% of the households in Staten Island receive Foodstamps, which is the lowest amongst all the boroughs in New York City.

Food Stamps by PUMA on Staten Island

# Mean HH Income Calculator
food.func <- function(df){
  (length(unique(df$SERIAL[df$FOODSTMP==2 & df$OWNERSHP==2]))/length(unique(df$SERIAL)))*100
}


# Average HH with Foodstamps
avfsperbo <- melt(sapply(si.split, food.func)); colnames(avfsperbo) <- "Percentage"


# Plot
ggplot(avfsperbo)+
  geom_bar(aes(rownames(avfsperbo),Percentage), stat = "identity") +
  geom_text(aes(rownames(avfsperbo),Percentage, label=round(Percentage, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = food.func(si)), color = "blue") +
  ggtitle("Percentage of Households that receive Food Stamps by PUMA in Staten Island (Age 65+)") +
  xlab("Borough") + ylab("Households") + theme(legend.position = "none")

Takeaway:

But when we deep dive into this, we see that the North Shore requires most of these food stamps.

Percentage of Renting Aging Population by Borough

# Percentage of Aging Population

rentag.func <- function(df){
  m <- summarize(group_by(df,SERIAL, OWNERSHP), households = n(), rent = mean(RENTGRS))
  k <- filter(m, rent > 0, OWNERSHP==2)
  (nrow(k)/nrow(m))*100
}

peragpo <- melt(sapply(borough.split, rentag.func)); colnames(peragpo) <- "Percentage"

# Plot

ggplot(peragpo)+
  geom_bar(aes(rownames(peragpo),Percentage, 
               fill = c(NA,NA,NA,NA,NA, "withcolor")), stat = "identity") +
  geom_text(aes(rownames(peragpo),Percentage, label=round(Percentage, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = rentag.func(data)), color = "blue") +
  ggtitle("Percentage of Renting Aging population per Borough (Age 65+)") +
  xlab("Borough") + ylab("Percentage") + theme(legend.position = "none")

Takeaway:

Just 15% of Staten Island seniors are renters which is an overall good sign since this is the lowest number amongst all the boroughs.

Percentage of Renting Aging Population by PUMA on Staten Island

peragpo <- melt(sapply(si.split, rentag.func)); colnames(peragpo) <- "Percentage"

# PLot

ggplot(peragpo)+
  geom_bar(aes(rownames(peragpo),Percentage), stat = "identity") +
  geom_text(aes(rownames(peragpo),Percentage, label=round(Percentage, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = rentag.func(si)), color = "blue") +
  ggtitle("Percentage of Renting Aging population per PUMA on Staten Island (Age 65+)") +
  xlab("Borough") + ylab("Percentage") + theme(legend.position = "none")

Takeaway:

But deep diving into the situation, we see that North Shore has most of the renters which is 9% points higher than all of Staten Island.

Percentage of Aging Population that still has a Mortgage by Borough

# Percentage of Aging Population

mort.func <- function(df){
  m <- summarize(group_by(df,SERIAL, MORTGAGE), households = n())
  k <- filter(m, MORTGAGE!=0)
  (nrow(k)/nrow(m))*100
}

peragpo <- melt(sapply(borough.split, mort.func)); colnames(peragpo) <- "Percentage"

# Plot

ggplot(peragpo)+
  geom_bar(aes(rownames(peragpo),Percentage, 
               fill = c(NA,NA,NA,NA,NA, "withcolor")), stat = "identity") +
  geom_text(aes(rownames(peragpo),Percentage, label=round(Percentage, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = mort.func(data)), color = "blue") +
  ggtitle("Percentage of Aging population with Mortgages per Borough (Age 65+)") +
  xlab("Borough") + ylab("Percentage") + theme(legend.position = "none")

Takeaways:

Almost 76% of the people in Staten Island have got a mortgage on their house. This makes sense because just 15% are renters and hence, roughly 85% own homes. Out of these 85%, around 76% of the people have a Mortgage.

If 76% of the senior owners in the borough have mortgages, and the 15% of the seniors that rent have higher rents than most people in the city, then we really have a distressing situation regarding senior housing. The numbers show that just 24% of senior owners are mortgage free. We can build a case for affordable housing off this.

Percentage of Aging Population with a Mortgage by PUMA on Staten Island

peragpo <- melt(sapply(si.split, mort.func)); colnames(peragpo) <- "Percentage"

# PLot

ggplot(peragpo)+
  geom_bar(aes(rownames(peragpo),Percentage), stat = "identity") +
  geom_text(aes(rownames(peragpo),Percentage, label=round(Percentage, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = mort.func(si)), color = "blue") +
  ggtitle("Percentage of Aging population with a Mortgage per PUMA on Staten Island (Age 65+)") +
  xlab("Borough") + ylab("Percentage") + theme(legend.position = "none")

Takeaways:

Diving a little deeper we find out that The South Shore has got most of the people (88%) who have a Mortgage against their house and unsurprisingly since the North Shore doesn’t have a high home ownership rate, the mortgage rate naturally remains low.

Despite North Shore having a lower Mortgage rate than the rest of the parts of the island, it also has the highest percentage of seniors paying rent and a whopping percentage of seniors owning a house who have at least one mortgage. It seems like this should be the focus of affordable housing on the Island.

House Value by Borough (Homes owned/rented by 65+)

# Percentage of Aging Population

val.func <- function(df){
  m <- summarize(group_by(df,SERIAL, VALUEH), households = n(), mean(VALUEH))
  k <- filter(m, VALUEH < 9999999)
  median(k$VALUEH)
}

peragpo <- melt(sapply(borough.split, val.func)); colnames(peragpo) <- "Value"

# Plot

ggplot(peragpo)+
  geom_bar(aes(rownames(peragpo),Value, 
               fill = c(NA,NA,NA,NA,NA, "withcolor")), stat = "identity") +
  geom_text(aes(rownames(peragpo),Value, label=round(Value, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = val.func(data)), color = "blue") +
  ggtitle("House Value by Borough (Homes owned/rented by 65+)") +
  xlab("Borough") + ylab("Percentage") + theme(legend.position = "none")

Takeaway:

The median property value in Staten Island is almost $200,000 more than the state median property value. This means that 50% of Staten Island Properties are worth more than 450,000 dollars. There is a salient point to notice here. If property prices are too high and people want to switch to renting, they can’t because the renting population pays higher than average rent and has lower than average income. It seems to me that they have nowhere to go.

Percentage of Aging Population with a Mortgage by PUMA on Staten Island

peragpo <- melt(sapply(si.split, val.func)); colnames(peragpo) <- "Value"

# Plot

ggplot(peragpo)+
  geom_bar(aes(rownames(peragpo),Value), stat = "identity") +
  geom_text(aes(rownames(peragpo),Value, label=round(Value, 1)), vjust=-0.25) +
  geom_hline(aes(yintercept = val.func(si)), color = "blue") +
  ggtitle("House Value by Borough (Homes owned/rented by 65+)") +
  xlab("Borough") + ylab("Percentage") + theme(legend.position = "none")

Takeaway:

The North Shore has a marginally lower median property value than that of South Shore and Mid Island.

Short Summary

We can safely make the case that overall (for senior citizens 65+), Staten Island pays higher rents and earns lower incomes when compared to other boroughs in the city. While the percentage of aging population (which rents) for Staten Island is the lowest, this small cohort of Staten Islanders pay high rents in North Shore & South Shore. The median income touches $50,000 per household which means that half of the senior Staten Islanders that rent, have households which earn less than that amount.

The North Shore is affected the most here (closely followed by South Shore) because the renting population is the highest amongst all senior residents, the percentage of households receiving foodstamps is the highest too. This coupled with them paying rents higher than the state average paints a bleak picture for the renters of North Shore.

Even for Home Owners, the situation isn’t exactly great. The state median property value is 250,000 dollars. The same in Staten Island is 450,000. Which means that 50% of the properties on Staten Island cost more than $450,000. Moreover, 88% of the owners in the South Shore have at least one mortgage on the house and ~70% of the homeowners in the North Shore have at least one mortgage on the house.

Citation

Steven Ruggles, Sarah Flood, Ronald Goeken, Josiah Grover, Erin Meyer, Jose Pacas, and Matthew Sobek. IPUMS USA: Version 8.0 [dataset]. Minneapolis, MN: IPUMS, 2018. https://doi.org/10.18128/D010.V8.0