<<<<<<< HEAD Assignment 2: Transit-Oriented Development

Policy Analysis Background

Transit Oriented Development (TOD) promotes density of housing and other amenities around transit systems with the goal of increasing overall density, connecting residents to efficient multimodal transit options, and creating neighborhood centers. To understand if Phoenix residents value living closer to Valley Metro Rail light rail stations, we looked at census tracts using total population, rent prices, annual median household income, and rates of poverty as key indicators. The Valley Metro Rail operates 26.3 miles of light rail provides transit stops mostly in Phoenix, but also travels to Tempe and Mesa. For this reason, our analysis includes all of Maricopa County.

To begin the analysis, we first accessed census data.

tracts2016PHX <-  
  get_acs(geography = "tract",
          variables = c("B25026_001E","B02001_002E",
                        "B15001_050E","B15001_009E",
                        "B19013_001E", "B25058_001E",
                        "B06012_002E"), 
          year=2016, state=04,
          county=013, geometry=TRUE) %>% 
  st_transform('ESRI:102728')

tracts2020PHX <-  
  get_acs(geography = "tract",
          variables = c("B25026_001E","B02001_002E",
                        "B15001_050E","B15001_009E",
                        "B19013_001E", "B25058_001E",
                        "B06012_002E"), 
          year=2020, state=04,
          county=013, geometry=TRUE) %>% 
  st_transform('ESRI:102728')

We then added the light rail stops.

PHXstops <- st_read("https://services2.arcgis.com/2t1927381mhTgWNC/arcgis/rest/services/ValleyMetroLightRailRidership/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson") %>%
      mutate(Line = "Valley Metro") %>%
      dplyr::select(StationId, Line) %>%
  st_transform('ESRI:102728') 
PHXBuffers <- 
  rbind(
    st_buffer(PHXstops, 2640) %>%
      mutate(Legend = "Buffer") %>%
      dplyr::select(Legend),
    st_union(st_buffer(PHXstops, 2640)) %>%
      st_sf() %>%
      mutate(Legend = "Unioned Buffer"))

Four small multiples

This analysis looks at population, median rent, median household incomes, and percent of poverty in each census tract in the county.

Population

More people live in non-TOD census tracts than in TOD census tracts in Maricopa County, but population has increased slightly between 2016 and 2020 in TOD tracts.

Pop16_20 <- 
  rbind(
      tracts2016PHX %>%
      filter(variable=="B25026_001") %>%
      mutate(year=2016), 
      tracts2020PHX %>%
      filter(variable=="B25026_001") %>%
      mutate(year=2020) )

ggplot() +
  geom_sf(data = Pop16_20, aes(fill = q5(estimate), group=year), color=NA) +
    scale_fill_manual(values = palette5,
                    labels = qBr(Pop16_20, "estimate"),
                    name = "Popluation\n(Quintile Breaks)") +
    facet_wrap(~year) +
    labs(title = "Figure 1: Population in Occupied Housing", subtitle = "Phoenix; 2016 vs. 2020") +
    mapTheme() + theme(plot.title = element_text(size=22)) +
    geom_sf(data=PHXBuffers, color="red", fill=NA)

Rent

Rent in both Non-TOD and TOD census tracts as increased between 2016 and 2020. Rent in Non-TOD census tracts increased by about 19% over these years, while rent in TOD areas increased by over 26%. However, rent on average is higher in non-TOD areas.

Rent16_20 <- 
  rbind(
      tracts2016PHX %>%
      filter(variable=="B25058_001") %>%
      mutate(year=2016),
      tracts2020PHX %>%
      filter(variable=="B25058_001") %>%
      mutate(year=2020))

ggplot() +
  geom_sf(data = Rent16_20, aes(fill = q5(estimate), group=year), color=NA) +
    scale_fill_manual(values = palette5,
                    labels = qBr(Rent16_20, "estimate"),
                    name = "Rent ($ per month)\n(Quintile Breaks)") +
    facet_wrap(~year) +
    labs(title = "Figure 2: Rent", subtitle = "Phoenix; 2016 vs. 2020") +
    mapTheme() + theme(plot.title = element_text(size=22)) +
    geom_sf(data=PHXBuffers, color="red", fill=NA)

Household Income

Median household income is higher in non-TOD census tracts compared to TOD census tracts.

HHinc16_20 <- 
  rbind(
      tracts2016PHX %>%
      filter(variable=="B19013_001") %>%
      mutate(year=2016),
      tracts2020PHX %>%
      filter(variable=="B19013_001") %>%
      mutate(year=2020))

ggplot() +
  geom_sf(data = HHinc16_20, aes(fill = q5(estimate), group=year), color=NA) +
    scale_fill_manual(values = palette5,
                    labels = qBr(HHinc16_20, "estimate"),
                    name = "Household Income ($)\n(Quintile Breaks)") +
    facet_wrap(~year) +
    labs(title = "Figure 3: Median Household Income", subtitle = "Phoenix, in the last 12 months: 2016 vs. 2020") +
    mapTheme() + theme(plot.title = element_text(size=22)) +
    geom_sf(data=PHXBuffers, color="red", fill=NA)

Poverty

Poverty is more common in census tracts near transit stops. The number of households with incomes below 100% of the poverty line is greater in TOD census tracts than non-TOD census tracts.

Pov16_20 <- 
  rbind(
      tracts2016PHX %>%
      filter(variable=="B06012_002") %>%
      mutate(year=2016),
      tracts2020PHX %>%
      filter(variable=="B06012_002") %>%
      mutate(year=2020))

ggplot() +
  geom_sf(data = Pov16_20, aes(fill = q5(estimate), group=year), color=NA) +
    scale_fill_manual(values = palette5,
                    labels = qBr(Pov16_20, "estimate"),
                    name = "Below 100% of the Poverty Level\n(Quintile Breaks)") +
    facet_wrap(~year) +
    labs(title = "Figure 4: Poverty", subtitle = "Phoenix; 2016 vs. 2020") +
    mapTheme() + theme(plot.title = element_text(size=22)) +
    geom_sf(data=PHXBuffers, color="red", fill=NA)

Then, we mutated our data.

tracts2016PHX <- 
  tracts2016PHX %>%
  dplyr::select( -NAME, -moe) %>%
  spread(key = variable, value = estimate) %>%
  rename(TotalPop = B25026_001, 
         Whites = B02001_002,
         FemaleBachelors = B15001_050, 
         MaleBachelors = B15001_009,
         MedHHInc = B19013_001, 
         MedRent = B25058_001,
         TotalPoverty = B06012_002)

tracts2016PHX <- 
  tracts2016PHX %>%
  mutate(pctWhite = ifelse(TotalPop > 0, Whites / TotalPop, 0),
         pctBachelors = ifelse(TotalPop > 0, ((FemaleBachelors + MaleBachelors) / TotalPop), 0),
         pctPoverty = ifelse(TotalPop > 0, TotalPoverty / TotalPop, 0),
         year = "2016") %>%
  dplyr::select(-Whites,-FemaleBachelors,-MaleBachelors,-TotalPoverty)
tracts2020PHX <- 
  get_acs(geography = "tract", 
          variables = c("B25026_001E","B02001_002E",
                        "B15001_050E","B15001_009E",
                        "B19013_001E","B25058_001E",
                        "B06012_002E"), 
          year=2020, state=04, county=013, 
          geometry=TRUE, output="wide") %>%
  st_transform('ESRI:102728') %>%
  rename(TotalPop = B25026_001E, 
         Whites = B02001_002E,
         FemaleBachelors = B15001_050E, 
         MaleBachelors = B15001_009E,
         MedHHInc = B19013_001E, 
         MedRent = B25058_001E,
         TotalPoverty = B06012_002E) %>%
  dplyr::select(-NAME, -starts_with("B")) %>%
  mutate(pctWhite = ifelse(TotalPop > 0, Whites / TotalPop,0),
         pctBachelors = ifelse(TotalPop > 0, ((FemaleBachelors + MaleBachelors) / TotalPop),0),
         pctPoverty = ifelse(TotalPop > 0, TotalPoverty / TotalPop, 0),
         year = "2020") %>%
  dplyr::select(-Whites, -FemaleBachelors, -MaleBachelors, -TotalPoverty)
allTractsPHX <- rbind(tracts2016PHX,tracts2020PHX)
PHXstops <- st_read("https://services2.arcgis.com/2t1927381mhTgWNC/arcgis/rest/services/ValleyMetroLightRailRidership/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson") %>%
      mutate(Line = "Valley Metro") %>%
      dplyr::select(StationId, Line) %>%
  st_transform('ESRI:102728')  

We then added the light rail stations to our census tract data.

selectionPHX <- tracts2016PHX %>% 
  st_join(PHXBuffers, join = st_intersects) %>% 
  filter(!is.na(Legend)) %>% 
  dplyr::select(TotalPop) %>%
  mutate(Selection_Type = "Spatial Intersects")

Summary Table

The table below summarizes the data used for this analysis. It shows median income, percent of households below the poverty line, population, and median rent for TOD and non-TOD areas in both 2016 and 2020.

allTractsPHX.group <-
  rbind(
    st_centroid(allTractsPHX)[PHXBuffers,] %>%
      st_drop_geometry() %>%
      left_join(allTractsPHX) %>%
      st_sf() %>%
      mutate(TOD = "TOD"),
   
     st_centroid(allTractsPHX)[PHXBuffers, op = st_disjoint] %>%
      st_drop_geometry() %>%
      left_join(allTractsPHX) %>%
      st_sf() %>%
      mutate(TOD = "Non-TOD")) %>%
  mutate(MedRent.inf = ifelse(year == "2009", MedRent * 1.14, MedRent)) 

allTractsPHX.Summary <- 
  st_drop_geometry(allTractsPHX.group) %>%
  group_by(year, TOD) %>%
  summarize(Rent = mean(MedRent, na.rm = T),
            Population = mean(TotalPop, na.rm = T),
            Percent_White = mean(pctWhite, na.rm = T),
            Percent_Bach = mean(pctBachelors, na.rm = T),
            Percent_Pov = mean(pctPoverty, na.rm = T),
            Median_Income = mean(MedHHInc, na.rm = T))

allTractsPHX.SummaryEdit <- select(allTractsPHX.Summary, -c(5,6))


allTractsPHX.SummaryEdit %>%
  rename("Percent Poverty" = Percent_Pov) %>%
  rename("Median Income" = Median_Income) %>%
  unite(year.TOD, year, TOD, sep = ": ", remove = T) %>%
  gather(Variable, Value, -year.TOD) %>%
  mutate(Value = round(Value, 2)) %>%
  spread(year.TOD, Value) %>%
  kable() %>%
    kable_styling() %>%
    footnote(general_title = "\n",
             general = "Table 1")
Variable 2016: Non-TOD 2016: TOD 2020: Non-TOD 2020: TOD
Median Income 61590.62 36098.83 74922.36 43608.53
Percent Poverty 0.17 0.34 0.13 0.28
Population 4407.43 3029.31 4318.51 3265.88
Rent 970.01 790.62 1160.38 1001.12

Table 1

Grouped Bar Plot

This plot depicts the same indicators across time and space in a more visual manner. TOD census tracts have lower median incomes, smaller populations, less expensive rents, and higher percentages of poverty than non-TOD census tracts.

allTractsPHX.SummaryEdit %>%
  rename("Median Income" = Median_Income) %>%
  rename("Percent Poverty" = Percent_Pov) %>% 
  gather(Variable, Value, -year, -TOD) %>%
  ggplot(aes(year, Value, fill = TOD)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~Variable, scales = "free", ncol=5) +
  scale_fill_manual(values = c("#bae4bc", "#0868ac")) +
  labs(title = "Figure 5: Indicator differences across time and space") +
  plotTheme() + theme(legend.position="bottom")

Graduated Symbol Maps

This plot depicts the size of population in each census tract located within 0.5 miles of a transit stop. The population around transit stops ranged from 2,000 to 5,000 people. As depicted in Figure 5. The average population in non-TOD areas is around 4,000 people over both years. There are a few sections of the light rail line where higher population numbers are clustered.

BufferOnly <- filter(PHXBuffers, Legend == "Buffer") %>%
  st_transform('ESRI:102728') %>%
  tibble::rowid_to_column("ID")

PHXstops <- st_join(BufferOnly, tracts2020PHX, join = st_intersects) %>%
  dplyr::select(ID, Legend, GEOID, TotalPop, MedRent, geometry) %>%
  dplyr::group_by(ID) %>%
  summarize(pop=mean(TotalPop, na.rm = TRUE), rent=mean(MedRent, na.rm = TRUE))

ggplot() +
  geom_sf(data = tracts2020PHX) +
  geom_sf(data = st_centroid(PHXstops),
          pch = 21,
          aes(size = pop),
          fill = alpha("#0868ac", 0.7),
          col = "grey20") +
  labs(size = "Population") +
  labs(title = "Figure 6: Size of Population within 0.5 mile of Valley Metro Light Rail Station", subtitle = "Census Tracts") +
scale_size(range = c(1, 5)) +
  mapTheme()

This plot shows the rent in each census tract located within 0.5 miles of a transit stop. Rent in TOD areas range from $800 to $1,200, while median rents in non-TOD areas increased from around $1,000 to $1,100, as shown in Figure 5. Higher rents cluster together in a few years of the line.

ggplot() +
  geom_sf(data = tracts2020PHX) +
  geom_sf(data = st_centroid(PHXstops),
          pch = 21,
          aes(size = rent),
          fill = alpha("#bae4bc"),
          col = "grey20") +
  labs(size = "Rent
$ per month") +
  labs(title = "Figure 7: Rent within 0.5 mile of Valley Metro Light Rail Station", subtitle = "") +
  scale_size(range = c(1, 5)) + 
  mapTheme()

We then created buffers around the transit stations.

GeomLine Plot

This plot shows the relationship between average rent and distance from Valley Metro Rail light rail stations in 2016 and 2020. As distance from transit stations increases, average rent increases as first before the relationship becomes unsteady. Therefore, there does not appear to be a relationship between rent and distance from stations in either year.

allTractsPHX.Summary <- allTracts.rings %>%
  dplyr::select(year, distance, MedRent) %>%
  st_drop_geometry() %>%
  group_by(year, distance) %>%
  summarize(Rent=median(MedRent, na.rm=TRUE))

ggplot(data=allTractsPHX.Summary, aes(x=distance, y=Rent, group=year)) +
  geom_line(aes(color=year), size=2) +
  geom_point(aes(color=year), size=3.5) +
  scale_color_manual(values = c("#bae4bc", "#0868ac")) +
  ylim(c(500,1000)) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) + 
  labs(title = "Figure 8: Rent as Function of Distance to Valley Metro Light Rail Stations", subtitle = "Census Tracts") +
  xlab("Miles") +
  ylab("Average Rent ($)") 

Conclusions

Based on rent, population, incomes, and levels of poverty, it is difficult to conclude that Phoenix and Maricopa residents value living near transit. While the TOD census tracts have lower rents, incomes, population and higher levels of poverty, this data does not tell the entire story. One limitation is that this analysis uses county-wide data, which includes suburbs. Attitudes toward transit and housing often differ in urban and suburban areas. Another limitation is that communities with lower incomes and higher rates of poverty may rely on transit more than other communities, meaning that these indicators may be important for understanding the households that live in these areas but may not prove that residents of Maricopa County do not value transit. Further studies and community engagement is necessary to learn more about residents’ view on TOD.

======= Assignment 2: Transit-Oriented Development

Policy Analysis Background

Transit Oriented Development (TOD) promotes density of housing and other amenities around transit systems with the goal of increasing overall density, connecting residents to efficient multimodal transit options, and creating neighborhood centers. To understand if Phoenix residents value living closer to Valley Metro Rail light rail stations, we looked at census tracts using total population, rent prices, annual median household income, and rates of poverty as key indicators. The Valley Metro Rail operates 26.3 miles of light rail provides transit stops mostly in Phoenix, but also travels to Tempe and Mesa. For this reason, our analysis includes all of Maricopa County.

To begin the analysis, we first accessed census data.

tracts2016PHX <-  
  get_acs(geography = "tract",
          variables = c("B25026_001E","B02001_002E",
                        "B15001_050E","B15001_009E",
                        "B19013_001E", "B25058_001E",
                        "B06012_002E"), 
          year=2016, state=04,
          county=013, geometry=TRUE) %>% 
  st_transform('ESRI:102728')

tracts2020PHX <-  
  get_acs(geography = "tract",
          variables = c("B25026_001E","B02001_002E",
                        "B15001_050E","B15001_009E",
                        "B19013_001E", "B25058_001E",
                        "B06012_002E"), 
          year=2020, state=04,
          county=013, geometry=TRUE) %>% 
  st_transform('ESRI:102728')

We then added the light rail stops.

PHXstops <- st_read("https://services2.arcgis.com/2t1927381mhTgWNC/arcgis/rest/services/ValleyMetroLightRailRidership/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson") %>%
      mutate(Line = "Valley Metro") %>%
      dplyr::select(StationId, Line) %>%
  st_transform('ESRI:102728') 
PHXBuffers <- 
  rbind(
    st_buffer(PHXstops, 2640) %>%
      mutate(Legend = "Buffer") %>%
      dplyr::select(Legend),
    st_union(st_buffer(PHXstops, 2640)) %>%
      st_sf() %>%
      mutate(Legend = "Unioned Buffer"))

Four small multiples

This analysis looks at population, median rent, median household incomes, and percent of poverty in each census tract in the county.

Population

More people live in non-TOD census tracts than in TOD census tracts in Maricopa County, but population has increased slightly between 2016 and 2020 in TOD tracts.

Pop16_20 <- 
  rbind(
      tracts2016PHX %>%
      filter(variable=="B25026_001") %>%
      mutate(year=2016), 
      tracts2020PHX %>%
      filter(variable=="B25026_001") %>%
      mutate(year=2020) )

ggplot() +
  geom_sf(data = Pop16_20, aes(fill = q5(estimate), group=year), color=NA) +
    scale_fill_manual(values = palette5,
                    labels = qBr(Pop16_20, "estimate"),
                    name = "Popluation\n(Quintile Breaks)") +
    facet_wrap(~year) +
    labs(title = "Figure 1: Population in Occupied Housing", subtitle = "Phoenix; 2016 vs. 2020") +
    mapTheme() + theme(plot.title = element_text(size=22)) +
    geom_sf(data=PHXBuffers, color="red", fill=NA)

Rent

Rent in both Non-TOD and TOD census tracts as increased between 2016 and 2020. Rent in Non-TOD census tracts increased by about 19% over these years, while rent in TOD areas increased by over 26%. However, rent on average is higher in non-TOD areas.

Rent16_20 <- 
  rbind(
      tracts2016PHX %>%
      filter(variable=="B25058_001") %>%
      mutate(year=2016),
      tracts2020PHX %>%
      filter(variable=="B25058_001") %>%
      mutate(year=2020))

ggplot() +
  geom_sf(data = Rent16_20, aes(fill = q5(estimate), group=year), color=NA) +
    scale_fill_manual(values = palette5,
                    labels = qBr(Rent16_20, "estimate"),
                    name = "Rent ($ per month)\n(Quintile Breaks)") +
    facet_wrap(~year) +
    labs(title = "Figure 2: Rent", subtitle = "Phoenix; 2016 vs. 2020") +
    mapTheme() + theme(plot.title = element_text(size=22)) +
    geom_sf(data=PHXBuffers, color="red", fill=NA)

Household Income

Median household income is higher in non-TOD census tracts compared to TOD census tracts.

HHinc16_20 <- 
  rbind(
      tracts2016PHX %>%
      filter(variable=="B19013_001") %>%
      mutate(year=2016),
      tracts2020PHX %>%
      filter(variable=="B19013_001") %>%
      mutate(year=2020))

ggplot() +
  geom_sf(data = HHinc16_20, aes(fill = q5(estimate), group=year), color=NA) +
    scale_fill_manual(values = palette5,
                    labels = qBr(HHinc16_20, "estimate"),
                    name = "Household Income ($)\n(Quintile Breaks)") +
    facet_wrap(~year) +
    labs(title = "Figure 3: Median Household Income", subtitle = "Phoenix, in the last 12 months: 2016 vs. 2020") +
    mapTheme() + theme(plot.title = element_text(size=22)) +
    geom_sf(data=PHXBuffers, color="red", fill=NA)

Poverty

Poverty is more common in census tracts near transit stops. The number of households with incomes below 100% of the poverty line is greater in TOD census tracts than non-TOD census tracts.

Pov16_20 <- 
  rbind(
      tracts2016PHX %>%
      filter(variable=="B06012_002") %>%
      mutate(year=2016),
      tracts2020PHX %>%
      filter(variable=="B06012_002") %>%
      mutate(year=2020))

ggplot() +
  geom_sf(data = Pov16_20, aes(fill = q5(estimate), group=year), color=NA) +
    scale_fill_manual(values = palette5,
                    labels = qBr(Pov16_20, "estimate"),
                    name = "Below 100% of the Poverty Level\n(Quintile Breaks)") +
    facet_wrap(~year) +
    labs(title = "Figure 4: Poverty", subtitle = "Phoenix; 2016 vs. 2020") +
    mapTheme() + theme(plot.title = element_text(size=22)) +
    geom_sf(data=PHXBuffers, color="red", fill=NA)

Then, we mutated our data.

tracts2016PHX <- 
  tracts2016PHX %>%
  dplyr::select( -NAME, -moe) %>%
  spread(key = variable, value = estimate) %>%
  rename(TotalPop = B25026_001, 
         Whites = B02001_002,
         FemaleBachelors = B15001_050, 
         MaleBachelors = B15001_009,
         MedHHInc = B19013_001, 
         MedRent = B25058_001,
         TotalPoverty = B06012_002)

tracts2016PHX <- 
  tracts2016PHX %>%
  mutate(pctWhite = ifelse(TotalPop > 0, Whites / TotalPop, 0),
         pctBachelors = ifelse(TotalPop > 0, ((FemaleBachelors + MaleBachelors) / TotalPop), 0),
         pctPoverty = ifelse(TotalPop > 0, TotalPoverty / TotalPop, 0),
         year = "2016") %>%
  dplyr::select(-Whites,-FemaleBachelors,-MaleBachelors,-TotalPoverty)
tracts2020PHX <- 
  get_acs(geography = "tract", 
          variables = c("B25026_001E","B02001_002E",
                        "B15001_050E","B15001_009E",
                        "B19013_001E","B25058_001E",
                        "B06012_002E"), 
          year=2020, state=04, county=013, 
          geometry=TRUE, output="wide") %>%
  st_transform('ESRI:102728') %>%
  rename(TotalPop = B25026_001E, 
         Whites = B02001_002E,
         FemaleBachelors = B15001_050E, 
         MaleBachelors = B15001_009E,
         MedHHInc = B19013_001E, 
         MedRent = B25058_001E,
         TotalPoverty = B06012_002E) %>%
  dplyr::select(-NAME, -starts_with("B")) %>%
  mutate(pctWhite = ifelse(TotalPop > 0, Whites / TotalPop,0),
         pctBachelors = ifelse(TotalPop > 0, ((FemaleBachelors + MaleBachelors) / TotalPop),0),
         pctPoverty = ifelse(TotalPop > 0, TotalPoverty / TotalPop, 0),
         year = "2020") %>%
  dplyr::select(-Whites, -FemaleBachelors, -MaleBachelors, -TotalPoverty)
allTractsPHX <- rbind(tracts2016PHX,tracts2020PHX)
PHXstops <- st_read("https://services2.arcgis.com/2t1927381mhTgWNC/arcgis/rest/services/ValleyMetroLightRailRidership/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson") %>%
      mutate(Line = "Valley Metro") %>%
      dplyr::select(StationId, Line) %>%
  st_transform('ESRI:102728')  

We then added the light rail stations to our census tract data.

selectionPHX <- tracts2016PHX %>% 
  st_join(PHXBuffers, join = st_intersects) %>% 
  filter(!is.na(Legend)) %>% 
  dplyr::select(TotalPop) %>%
  mutate(Selection_Type = "Spatial Intersects")

Summary Table

The table below summarizes the data used for this analysis. It shows median income, percent of households below the poverty line, population, and median rent for TOD and non-TOD areas in both 2016 and 2020.

allTractsPHX.group <-
  rbind(
    st_centroid(allTractsPHX)[PHXBuffers,] %>%
      st_drop_geometry() %>%
      left_join(allTractsPHX) %>%
      st_sf() %>%
      mutate(TOD = "TOD"),
   
     st_centroid(allTractsPHX)[PHXBuffers, op = st_disjoint] %>%
      st_drop_geometry() %>%
      left_join(allTractsPHX) %>%
      st_sf() %>%
      mutate(TOD = "Non-TOD")) %>%
  mutate(MedRent.inf = ifelse(year == "2009", MedRent * 1.14, MedRent)) 

allTractsPHX.Summary <- 
  st_drop_geometry(allTractsPHX.group) %>%
  group_by(year, TOD) %>%
  summarize(Rent = mean(MedRent, na.rm = T),
            Population = mean(TotalPop, na.rm = T),
            Percent_White = mean(pctWhite, na.rm = T),
            Percent_Bach = mean(pctBachelors, na.rm = T),
            Percent_Pov = mean(pctPoverty, na.rm = T),
            Median_Income = mean(MedHHInc, na.rm = T))

allTractsPHX.SummaryEdit <- select(allTractsPHX.Summary, -c(5,6))


allTractsPHX.SummaryEdit %>%
  rename("Percent Poverty" = Percent_Pov) %>%
  rename("Median Income" = Median_Income) %>%
  unite(year.TOD, year, TOD, sep = ": ", remove = T) %>%
  gather(Variable, Value, -year.TOD) %>%
  mutate(Value = round(Value, 2)) %>%
  spread(year.TOD, Value) %>%
  kable() %>%
    kable_styling() %>%
    footnote(general_title = "\n",
             general = "Table 1")
Variable 2016: Non-TOD 2016: TOD 2020: Non-TOD 2020: TOD
Median Income 61590.62 36098.83 74922.36 43608.53
Percent Poverty 0.17 0.34 0.13 0.28
Population 4407.43 3029.31 4318.51 3265.88
Rent 970.01 790.62 1160.38 1001.12

Table 1

Grouped Bar Plot

This plot depicts the same indicators across time and space in a more visual manner. TOD census tracts have lower median incomes, smaller populations, less expensive rents, and higher percentages of poverty than non-TOD census tracts.

allTractsPHX.SummaryEdit %>%
  rename("Median Income" = Median_Income) %>%
  rename("Percent Poverty" = Percent_Pov) %>% 
  gather(Variable, Value, -year, -TOD) %>%
  ggplot(aes(year, Value, fill = TOD)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~Variable, scales = "free", ncol=5) +
  scale_fill_manual(values = c("#bae4bc", "#0868ac")) +
  labs(title = "Figure 5: Indicator differences across time and space") +
  plotTheme() + theme(legend.position="bottom")

Graduated Symbol Maps

This plot depicts the size of population in each census tract located within 0.5 miles of a transit stop. The population around transit stops ranged from 2,000 to 5,000 people. As depicted in Figure 5. The average population in non-TOD areas is around 4,000 people over both years. There are a few sections of the light rail line where higher population numbers are clustered.

BufferOnly <- filter(PHXBuffers, Legend == "Buffer") %>%
  st_transform('ESRI:102728') %>%
  tibble::rowid_to_column("ID")

PHXstops <- st_join(BufferOnly, tracts2020PHX, join = st_intersects) %>%
  dplyr::select(ID, Legend, GEOID, TotalPop, MedRent, geometry) %>%
  dplyr::group_by(ID) %>%
  summarize(pop=mean(TotalPop, na.rm = TRUE), rent=mean(MedRent, na.rm = TRUE))

ggplot() +
  geom_sf(data = tracts2020PHX) +
  geom_sf(data = st_centroid(PHXstops),
          pch = 21,
          aes(size = pop),
          fill = alpha("#0868ac", 0.7),
          col = "grey20") +
  labs(size = "Population") +
  labs(title = "Figure 6: Size of Population within 0.5 mile of Valley Metro Light Rail Station", subtitle = "Census Tracts") +
scale_size(range = c(1, 5)) +
  mapTheme()

This plot shows the rent in each census tract located within 0.5 miles of a transit stop. Rent in TOD areas range from $800 to $1,200, while median rents in non-TOD areas increased from around $1,000 to $1,100, as shown in Figure 5. Higher rents cluster together in a few years of the line.

ggplot() +
  geom_sf(data = tracts2020PHX) +
  geom_sf(data = st_centroid(PHXstops),
          pch = 21,
          aes(size = rent),
          fill = alpha("#bae4bc"),
          col = "grey20") +
  labs(size = "Rent
$ per month") +
  labs(title = "Figure 7: Rent within 0.5 mile of Valley Metro Light Rail Station", subtitle = "") +
  scale_size(range = c(1, 5)) + 
  mapTheme()

We then created buffers around the transit stations.

GeomLine Plot

This plot shows the relationship between average rent and distance from Valley Metro Rail light rail stations in 2016 and 2020. As distance from transit stations increases, average rent increases as first before the relationship becomes unsteady. Therefore, there does not appear to be a relationship between rent and distance from stations in either year.

allTractsPHX.Summary <- allTracts.rings %>%
  dplyr::select(year, distance, MedRent) %>%
  st_drop_geometry() %>%
  group_by(year, distance) %>%
  summarize(Rent=median(MedRent, na.rm=TRUE))

ggplot(data=allTractsPHX.Summary, aes(x=distance, y=Rent, group=year)) +
  geom_line(aes(color=year), size=2) +
  geom_point(aes(color=year), size=3.5) +
  scale_color_manual(values = c("#bae4bc", "#0868ac")) +
  ylim(c(500,1000)) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) + 
  labs(title = "Figure 8: Rent as Function of Distance to Valley Metro Light Rail Stations", subtitle = "Census Tracts") +
  xlab("Miles") +
  ylab("Average Rent ($)") 

Conclusions

Based on rent, population, incomes, and levels of poverty, it is difficult to conclude that Phoenix and Maricopa residents value living near transit. While the TOD census tracts have lower rents, incomes, population and higher levels of poverty, this data does not tell the entire story. One limitation is that this analysis uses county-wide data, which includes suburbs. Attitudes toward transit and housing often differ in urban and suburban areas. Another limitation is that communities with lower incomes and higher rates of poverty may rely on transit more than other communities, meaning that these indicators may be important for understanding the households that live in these areas but may not prove that residents of Maricopa County do not value transit. Further studies and community engagement is necessary to learn more about residents’ view on TOD.

>>>>>>> 91c4d2ddc1c7bd448e3ebc4dcce644964ae93383