#load coded SRHS survey data
df <- readRDS("C:/Users/court/Google Drive/Research/SRHS/SRHS_coded.RDS")
df_svy <- svydesign(ids = ~ 1, data = df, weights = df$rrio_wt)

#Landlord Characteristics

Landlord size

New landlord category that separates landlords with 1 unit that is a single family home (at least larger than a studio).

waffle_data1 <- c(`Small, single-fam homes` = (1899),
                  `Small, non single-fam homes` =(1047), 
                 `Big, single-fam homes` =(60),
                 `Big, non single-fam homes` = (830))
 
# # weighted
# waffle_data2 <- c(`Small Landlords (1-4 units)`=(3235), 
#                  `Large Landlords (5+ units)`=601)


w1 <- waffle(waffle_data1/60, rows=7, size=1, colors=c("deeppink3", "midnightblue", "gold", "darkorange1"),
       title="50% of respondents are small landlords with single family homes (unweighted)", 
       xlab="One square ~ 60 landlords")


# w2 <- waffle(waffle_data2/100, rows=5, size=1, colors=c("pink", "red"),
#        title="weighted: 84% of respondents are small landlords", 
#        xlab="One square ~ 100 landlords")

grid.arrange(w1)

# PIE CHART - DIFFICULT TO FIGURE OUT ....
# df %>%  ggplot(aes(x="",
#                      y=ll_size,
#                      fill=ll_size)) +
#   geom_bar(stat="identity", width=1) +
#   coord_polar("y", start=0) +
#   theme_void() +
#    labs(title = "Landlord size and financial role",
#        fill = "Landlord Size") 

Note:

  • ‘small’ landlords have 1-4 units
  • ‘big’ landlords have 5+ units
  • ‘single family homes’ indicate a landlord’s largest building is a 1-unit building
  • studios or in-law apartments do not count as single family homes




Units and Buildings

p1 <- df %>% ggplot(aes(x=ll_tot_units)) +
  geom_histogram(fill="midnightblue") +
  xlim(0,50) + 
  theme_classic() +
  labs(title="Total number of units")

p2 <- df %>% ggplot(aes(x=ll_tot_bldg)) +
   geom_bar(fill="deeppink3") +
  theme_classic() +
  labs(title="Total number of buildings") 
  

grid.arrange(p1)

grid.arrange(p2)

df %>% select(ll_size2, ll_role, ll_finrole, ll_livein, ll_tenure,
              ll_miles, ll_age, ll_gender) %>%
  ggpairs(aes(colour=ll_size2))

Professionalization

Landlord role

df %>% ggplot(aes(x=ll_role, fill=ll_size2)) +
   geom_bar() +
  theme_classic() +
  labs(title="Landlord role by landlord size")  +
  coord_flip() +
  theme(legend.position="bottom") +
  guides(fill=guide_legend(nrow=2,byrow=TRUE))

Financial role

df %>% ggplot(aes(x=ll_finrole, fill=ll_size2)) +
   geom_bar() +
  theme_classic() +
  labs(title="Financial role and landlord size") + coord_flip() +
  theme(legend.position="bottom") +
  guides(fill=guide_legend(nrow=2,byrow=TRUE))

Live-in landlords

df %>% ggplot(aes(x=ll_livein, fill=ll_size2)) +
   geom_bar() +
  theme_classic() +
  labs(title="Live-in landlords") + coord_flip() +
  theme(legend.position="bottom") +
  guides(fill=guide_legend(nrow=2,byrow=TRUE))

Tenure

df %>% ggplot(aes(x=ll_tenure_group, fill=ll_size2)) +
   geom_bar() +
  theme_classic() +
  labs(title="Tenure and landlord size")  +
  theme(legend.position="bottom") +
  guides(fill=guide_legend(nrow=2,byrow=TRUE))

Demographics

Further discussion needed (gender, ethnicity/race, age, etc)

Business Practices

Tenant Income


df %>%  ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(bp_income))) +
  geom_bar(position='fill') +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Landlord size and tenant income",
       fill = "Tenant Income") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))

df %>%  ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(as.factor(bp_income_b)))) +
  geom_bar(position="fill") +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Binary tenant income (above and below %50,000)",
       fill = "Tenant Income") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))




Rent Screening


df %>%  ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(bp_screen))) +
  geom_bar(position='fill') +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Landlord size and screening service",
       fill = "Screening Service") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))

df %>%  ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(as.factor(bp_screen_b)))) +
  geom_bar(position="fill") +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Binary rent screen (no and yes)",
       fill = "Screening Service") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))




Flexible decisions


df %>%  ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(bp_dec_flex))) +
  geom_bar(position='fill') +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Landlord size and flexible decisions",
       fill = "Flexible Decisions") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))

df %>%  filter(!is.na(bp_dec_flex_b)) %>%
                   ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(as.factor(bp_dec_flex_b)))) +
  geom_bar(position="fill") +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Binary flex decisions (disagree or agree)",
       fill = "Flexible Decisions") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))




Voucher Holders


df %>%  ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(bp_vouch))) +
  geom_bar(position='fill') +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Landlord size and voucher holders",
       fill = "Rent to Voucher Holders") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))




Monthly Rent


Note in the figure below, the average monthly rent for units was asked before landlords reported which type of unit was their most common unit.

# create means to plot
# mean1 <- aggregate( ~l tenure, land, mean)
# median1 <- aggregate(q7 ~ tenure, land, median)
  


df %>% select(ll_comm_unit, ll_size2, bp_comm_unit_rent) %>% na.omit() %>%
  ggplot(aes(x=ll_comm_unit,
                    y=bp_comm_unit_rent,
                    color=ll_size2)) +
  geom_point() +
  geom_jitter(height = 0.3, alpha=0.3) +
  geom_hline(yintercept=3.5, 
                color = "red", size=0.7) +
  labs(y = "Monthly Rent",
       x = "Most Common Unit",
       title = "Landlord size, monthly rent, and most common unit",
       subtitle = "Red line indicates binary cutoff >$1,500*") +
  theme(axis.text.x = element_text(angle = 15, vjust = 0.9, hjust=1)) +
  theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))




Raised Rent


df %>%  ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(bp_rent_raise))) +
  geom_bar(position='fill') +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Landlord size and raised rent",
       fill = "Amount raised rent") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))




Raised Rent Due to Market


df %>%  filter(!is.na(bp_rent_raise_market)) %>% 
                   ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(bp_rent_raise_market))) +
  geom_bar(position='fill') +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Landlord size and raised rent due to market",
       fill = "Amount raised rent due to market") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))




Tenancies Terminated


df %>%  filter(!is.na(bp_terminate)) %>% 
                   ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(bp_terminate))) +
  geom_bar(position='fill') +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Landlord size and num. of terminations",
       fill = "Tenancies Terminated") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))




Terminate Tenancies in Court


df %>%  filter(!is.na(bp_court)) %>% 
                   ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(bp_court))) +
  geom_bar(position='fill') +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Landlord size and terminate in court",
       fill = "Terminate in Court") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 2, label.position = "top", reverse=TRUE))

df %>%  filter(!is.na(bp_court_b)) %>%
                   ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(as.factor(bp_court_b)))) +
  geom_bar(position="fill") +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Binary terminate in court (w/ court or w/tenant)",
       fill = "Terminate in Court") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 1, label.position = "top", reverse=TRUE))

Zipcodes

  • 74% of landlords reported only one zip code
  • 91% of landlords reported 2 or less
df %>% ggplot(aes(x=ll_size2,
                    fill=forcats::fct_rev(zip_region))) +
  geom_bar(position='fill') +
  labs(y = "Prop",
       x = "Landlord size",
       title = "Landlord size and terminate in court",
       fill = "Terminate in Court") +
  coord_flip() +
    theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(fill = guide_legend(nrow = 2, label.position = "top", reverse=TRUE))

Next Steps

  • Composite measure (PCA) for all business practices
  • Look at composite measure of ‘flexible decisions’ indicators
  • Look at geographic spread of business practices
  • Back to models…
  • Other business practice indicators we could explore
    • Length of lease
    • Number of units rented to voucher holders
    • Option to pay fees in installments
    • Disability accomodation
    • Rent to someone with criminal records
    • Fees charged
    • % of recent tenant’s deposit that was kept
    • Reasons last tenant moved
    • Typical length to return deposit