Eviction is the complex and lengthy process through which a renter is forced to vacate a property. This process is most commonly leveraged against people with low-incomes or the cost of housing takes up a large proportion of their income, which is called being cost burdened.
In Charlottesville, about 50% of renters are spending 30% or more of their income on rent. When an individual can not afford to pay the full amount of rent, they are vulnerable to eviction. When landlords evict individuals from a property, they can add late fees or fees from damages to the overdue rent amount. The individual may also be interested in finding legal representation, which could add an additional cost. This puts a person who was already facing hard financial circumstances to need to find even more money to cover these costs.
However, after an eviction is filed, that is not the end of the monetary and other costs borne from eviction. The person will have to find a new place to live in a short period. Finding new housing would require a security deposit, or be even more expensive than the previous situation. In Virginia, it is also legal for landlords to discriminate against potential tenants based on eviction history. So, eviction could impact a persons ability to find a new housing situation or make them vulnerable to being unhoused.
We believe that housing is a human right and that everyone deserves safe, stable, and affordable housing. Current eviction practices increase costs for people with low-incomes and increase their vulnerability. We hope that through this research we can understand the eviction process in Chancellorsville and how local legal advocates can prepare to protect individuals facing eviction.
The context of our research project is that in an eviction case, if the plaintiff (ie. the landlord) wins, the tenant or renter must pay an principal amount, most often missed rent, and an attorney fee to compensate the landlord’s representation. Tenant’s rights advocates are noticing a trend of increased attorney fees in eviction cases. The state of Virginia mandates that attorney be “reasonable” or what is defined in the written lease, however, it is not specified exactly what reasonable means. The goal of this research is to understand whether this perceived trend can be empirically validated.
This analysis concentrates on the Thomas Jefferson Planning District which contains the City of Charlottesville and Albemarle, Fluvanna, Greene, Louisa, and Nelson Counties. We investigate the questions:
We attempt to learn more about the following questions through this analysis:
We would like to acknowledge that we are visitors in this data. We do not know the individuals represented in this data, what they experienced in the process of their eviction, the circumstances which led to the eviction, nor the events which transpired after their eviction. We also acknowledge that we have represented evictions in this project as a single event involving one plaintiff and one tenant. However, we must recognize that evictions are a process that reflects a set of social relations, rather than a single, easily recordable, event. Evictions are not random, but are a function of choices made by policymakers and landlords. They are not a natural process, but a manufactured one that can be reconsidered and changed. Finally, we would like to acknowledge our lack of expertise. We have never experienced an eviction nor we do not know what it looks like to defend a tenant. We were unable to turn to the true experts, those with lived experience, in the development of these visualizations and these conclusions. This data should be evaluated with the support of an expert who can identify where we were accurate, but more importantly, where we failed.
This data comes from The Civil Court Data Intiative from the Legal Services Corporation. This initiative began in 2019 as an effort to inform legal aid providers about their communities’ needs. The data set contains eviction information from 2016 to 2023 from over 30 states.
The Article, Evictions: The Comparative Analysis Problem, highlights the principal idea that evictions look very different depending on locality. These differences include the number of eviction filings, whether tenants appear in court to defend themselves, the percentage of cases with judgments for the Plaintiff, and more. Many of these differences are constructed by the state laws and court filing regulations. For this reason, we want to get an understanding of one area and how evictions are processed in the locality.
For our project, we chose to study the Thomas Jefferson Planning District which contains the City of Charlottesville and Albemarle, Fluvanna, Greene, Louisa, and Nelson Counties. This decisions means we excluded all observations of evictions outside of these localities.
The next choice we made in constraining our datset was to exlude the 2023 data because this analysis began in the first half of the year, and there were very few variables. Reporting these values would not be representative of the entire 2023 year. In addition, there is an important caveat for the 2022 data in that the courts may have been backed up on cases for the year due to the volume after the eviction moratorium was lifted, so some individuals who faced eviction in 2022 may not have had their court date until 2023.
Next, although tenants can be evicted for other rental agreement violations, we constrained the dataset to those with prinicpal amount, which likely indicates non-payment of rent. One limitation of this is that the principal amount could also include charges for damages, but we do not know the breakdown of the principal amount, so we could have instances where the prinipal amount includes damages rather than rent owed.
In addition, we also removed observations where the prinvipal amount was NA since if this was left blank by the administative person filling out this paperwork, we can assume there was no principal amount.
Next, given the nature of our research question, we are interested in the additional burden of the attorney fees levied against the tenant. Tenants are only responsible for paying the Plaintiff’s attorney fees when the plaintiff wins. Therefore, we further constricted our dataset to only include the cases where the judgement is in favor of the plaintiff.
The result of these choices is a data set with observations of eviction cases won by the plaintff from 2016-2020 in the Thomas Jefferson Planning district in which there was a prinicpal amount.
Finally, this data is pulled from Administrative records, and the people filling out these files are human and may use short hand to describe certain things or may make spelling errors. This results in some of the same plaintiffs that had multiple spellings of their title entered into the dataset as separate plaintiffs. We tried to account for these differences and recode these plaintiffs to fall under the same name. However, since we are also human, we may not have properly accounted for every observation.
In many of the visualizations and averages, we constrained the data set to principal amounts and attorney fees up to $10,000. While there are a few values with principal amounts and attorney fees at this level, they are outliers. These outliers make visualizations hard to understand at the level that is generalization to the majority of cases. Furthermore, due to the volume of the dataset, excluding the outliers does not significantly change averages.
To understand the proportion that the attorney fees were of the total cost to the defendant, we created a variable called Percent Principal which calculates the proportion of the attorney’s fees over the principal amount the Defendant owes and multiplied this by 100 to get a percentage. For this variable, there were infinite values that we excluded in our work.
#identify number and share of cases with both principal amounts and attorney fees
# mpc revised
table_1 <-tj_data %>%
# mutate(attorney_fee = if_else(!is.na(attorney_original), 'yes', 'no')) %>% # mpc removed
group_by(filed_year) %>%
summarize(total_cases = n(),
principal_amount = sum(principal_amount>0 & !is.na(principal_amount)), # mpc revised
attorney_fees = sum(!is.na(attorney_fee_og))) %>% # mpc revised
mutate(percent_principal = round(principal_amount/total_cases*100,2),
percent_attorney = round(attorney_fees/total_cases*100,2))
reactable(table_1,
columns = list(
filed_year = colDef(name= "Year"),
total_cases = colDef(name = "Evictions"),
principal_amount = colDef(name = "Cases with Principal Chared"),
attorney_fees = colDef(name = "Cases with Attorney Fee Charged"),
percent_principal = colDef(name = "Principal Charged",
format = colFormat(suffix = "%")),
percent_attorney = colDef(name = "Attorney Fee Charged",
format = colFormat(suffix = "%"),
cell = data_bars(table_1,
text_position = "outside-base",
number_fmt = scales::percent_format(scale = 1),
fill_color = rcartocolor::carto_pal(n = 4, name = "SunsetDark")[4],
))))
Tenants can be evicted for a number of reasons including non-payment of rent or violation of the rental agreement or state rental laws. Based on our research question, we are interested in evictions that come from non-payment of rent rather than other causes of evictions.
To create a dataset to observe this, we limited our dataset to those with a prinicpal amount. While this is a good indicator of those who were evicted for non-payment of rent, it also may include instances where tenants are charged for damages to the apartment rather than late rent and late fees.
These visualizations and averages may be limited as they do not account for year-over-year inflation. All values are taken from administrative records which would have the value of money in the year in which it was recorded.
We wanted to understand how the principal amounts in eviction cases has changed over time. Changes in principal amounts may occur for several reasons. First, changes may reflect changing housing costs and rising rents because landlords can raise their rental prices year-over year. In Charlottesville, a 1 bedroom apartment cost $1,000 on average in June 2016, and $1,340 in June of 2022.
However, changes in principal amount may also may reflect changes in policy. As a response to the COVID-19 pandemic, in September of 2020, the CDC set a federal eviction moratorium that lasted through July of 2021. There were limited protections for some renters through October 2021.
Virginia extended protections for renters through June of 2022. These protections meant that landlords could not evict tenants for non-payment of rent unless they followed a set of rules. This could include creating a payment plan for up to 6 months. After this moratorium expired, renters could have accumulated higher costs from the accumulation of unpaid rent during the pandemic.
Another notable protection for Virginia renters was the Virginia Eviction Reduction program which allocated funds to support 1,353 households pay bills that impacted families’ budgets. Most of the families supported were cost burdened and paid over 30% of their income on housing. These funds supported families between June 2021 and June 2022.
Graph Interpretations
The first graph in this set show the distribution of principal amounts greater than 0 and less than $10,000 for all years over all counties. The average value of the principal amounts is $2,462.
The second graph in this set shows the average principal amount per year between 2016 and 2022. It shows that principal amounts were slightly increasing from year to year before 2020. One possible explanation for this year to year increase is increasing rent prices. However, the averages jumped considerably in 2020 and continued its sharp increase in 2021. Between 2021 and 2022, the average principal amount increased, but at a lower rate. 2020 is a notable year for the principal amounts because of the CDC eviction moratorium. A hypothesis for this jump may be that with the eviction moratorium tenants accrued a longer period of unpaid rent before eviction was filed against them.
The third graph in this set breaks the average principal amount down by county. The counties follow similar trends, increasing in 2020. An interesting discrepancy between this dis aggregated data and the overall graph is that we see several counties have decreasing averages between 2021 and 2022. One case with a principal amount of over $20,000 in Nelson county was excluded from the visual so that we could better see the trends in the county. While it was excluded in this visual
tj_data_p %>%
filter(principal_amount > 0 & principal_amount < 10000) %>% # mpc revised
ggplot(aes(x = principal_amount, )) +
geom_histogram(bins = 50, color="#b9257a", fill="#e34f6f") +
scale_y_continuous(breaks = seq(0, 1000, 100)) +
scale_x_continuous(labels=scales::dollar_format(),
breaks = seq(0, 10000, 1000)) +
theme_few() +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Distribution of Principal Amounts",
subtitle = "Cases with Principal Amounts",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "") +
geom_vline(xintercept = 2460, color = "Black", linetype = "dashed") +
annotate("text", label = "Average: $2,462",
x = 3200, y = 400, color = "Black", size = 2.5)
#creating a variable to store the average principal amount per year
yr_avgs_principal <- tj_data_p %>%
filter(principal_amount > 0) %>% # mpc added
group_by(filed_year) %>%
summarize(mean = mean(principal_amount, na.rm = TRUE),) %>%
ungroup()
#line graph of the above variable
yr_avgs_principal %>%
ggplot(aes(x = filed_year, y = mean)) +
geom_line(color="#b9257a") +
geom_point(color="#e34f6f")+
geom_text(aes(label=round(mean,0)), position=position_dodge(width=0.9), digits=0, vjust=-0.75, size=3, color= "#b9257a") +
theme_few() +
scale_color_few(palette = "Medium", name = "") +
scale_y_continuous(labels=scales::dollar_format(),
limits=c(0,6000),
breaks=seq(0,6000,500))+
scale_x_continuous(limits=c(2016,2022),
breaks= seq(2016,2022,1)) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Average Principle Amounts Over Time",
subtitle = "Across the Entire Thomas Jefferson Planning District",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. ",
x = "", y = "" )+
geom_vline(xintercept = 2020, color = "Black", linetype = "dashed") +
annotate("text", label = "CDC Eviction \n Moratorium",
x = 2019.6, y = 5500, color = "Black", size = 2.5)
#creating a variable which documents the average prinicpal amounts by county and yeat
principal_county <- tj_data_p %>%
filter(principal_amount > 0, principal_amount < 10000) %>%
group_by(filed_year, county) %>%
summarize( mean = mean(principal_amount, na.rm = TRUE),) %>%
ungroup()
ggplot(principal_county, aes(x = filed_year, y = mean, color = county)) +
geom_line() +
theme_few() +
scale_y_continuous(limits=c(0,8000),
breaks= seq(0,8000,1000),
labels=scales::dollar_format()) +
scale_x_continuous(limits=c(2016,2022),
breaks= seq(2016,2022,1)) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Average Principal Amounts Over Time",
subtitle = "By County",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "")
As mentioned, the state of Virginia mandates that attorney be “reasonable” or what is defined in the written lease, however, it is not specified exactly what reasonable means. We are interested in the way that fees change in response to differences in the principal amounts over time. While some plaintiffs do not charge for attorney fees, this analysis looks into those that do charge fees and how these have changed over time.
It is reasonable to assume that attorney fees may respond to changes in prinicpal amounts. So, if rents are increasing over time, attorney fees could also increase in response. One limitation of this data is that the changes in costs to not account for inflation. All values are taken from administrative records which would have the value of money in the year in which it was recorded. So, higher fees in the more recent years could also indicate inflation in that time period.
Graph Interpretations
The first graph in the set shows the distribution of attorney fees greater than zero dollars and less than 15,000. The vast majority of values fall below $1,000, and the average attorney fee for those charging fees is $$369.
The next graph shows the average yearly attorney fees across the entire planning district between 2016 and 2022. This graph increases slightly between 2016 and 2022 before jumping in 2020 and continuing a steep rise in 2021. In 2022, values return close to 2020 values.
The final graph splits the yearly values up by county. While all counties increased aver the time period, this disaggregated data show that the large jumps in 2020 and 2021 values may be driven by cases in potential outlier cases in Nelson in 2020 and Louisa in 2021.
tj_data_p %>%
filter(attorney_fees > 0, attorney_fees < 10000) %>% # mpc changed
ggplot(aes(x = attorney_fees)) +
geom_histogram(bins = 50, color="#7c1d6f", fill="#b9257a") +
scale_y_continuous(limits = c(0, 1000),
breaks = seq(0, 1500, 250)) +
scale_x_continuous(labels=scales::dollar_format(),
limits = c(0, 10000),
breaks = seq(0, 10000, 1000)) +
theme_few() +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Distribution of Attorney Fees",
subtitle = "Cases with Attorney Fees",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "Count") +
geom_vline(xintercept = 369, color = "Black", linetype = "dashed") +
annotate("text", label = "Average:\n $369",
x = 1100, y = 750, color = "Black", size = 2.5)
#creates a variable that takes the yearly average of attorney fees
yr_avgs_afees <- tj_data_p %>%
filter(attorney_fees > 0, attorney_fees < 10000) %>% # mpc added
group_by(filed_year) %>%
summarize( mean = mean(attorney_fees, na.rm = TRUE),)
yr_avgs_afees %>%
ggplot(aes(x = filed_year, y = mean)) +
geom_line(color= "#b9257a") +
geom_point(color= "#b9257a") +
#geom_text(aes(label= mean, digits = 2), nudge_y=.07, color="#b9257a")+
geom_text(aes(label=round(mean,0)), position=position_dodge(width=0.9), digits=0, vjust=-0.75, size=3, color= "#b9257a") +
theme_few() +
scale_y_continuous(labels=scales::dollar_format(),
limits=c(0,1500),
breaks=seq(0,1500,250))+
scale_x_continuous(limits=c(2016,2022),
breaks= seq(2016,2022,1)) +
scale_color_few(palette = "Medium", name = "") +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Average Attorney Fees Over Time",
subtitle = "Across the Entire Thomas Jefferson Planning District",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "") +
geom_vline(xintercept = 2020, color = "Black", linetype = "dashed") +
annotate("text", label = "CDC Eviction \n Moratorium",
x = 2019.6, y = 1250, color = "Black", size = 2.5)
#creates a data frame that looks at attorney fees by county and year
fees_county <- tj_data_p %>%
filter(attorney_fees > 0, attorney_fees < 10000) %>%
group_by(filed_year, county) %>%
summarize( mean = mean(attorney_fees, na.rm = TRUE),) %>%
ungroup()
ggplot(fees_county, aes(x = filed_year, y = mean, color = county)) +
geom_line() +
theme_few() +
scale_y_continuous(limits=c(0,8000),
breaks= seq(0,8000,1000),
labels=scales::dollar_format()) +
scale_x_continuous(limits=c(2016,2022),
breaks= seq(2016,2022,1)) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Attorney Fees Over Time",
subtitle = "By County",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "")
Both principal amounts and attorney fees have changed over time. We are interested in the relationship between the two. This will help us understand if lawyers are charging more in eviction cases relative to the principal amount now than they had previously.
As detailed in the data wrangling choices section, we calculate the proportion that attorney fees make up of the total cost of eviction which is the principal amount and attorney fees combined.
Graph Interpretations
The first graph in the series combines the previously shown over time metrics for the principal amounts and the attorney fees on one graph.
The second graph shows the distribution of the share of total costs that attorney fees make up over all years in the entire planning district. Cases with no attorney fees were excluded from this visual. The overall average describes the average share of the proportion including those with no attorney fees. This average is 4.7%. When only looking at cases with attorney fees, these costs make up 13.92% of total cost.
The third graph in this set shows the percent of the share of the cost that attorney fees make up by county. This graph includes all cases, even those that do not have attorney fees. Here, we see that the average share increases for all counties. Notably, We see that Albemarle county has a consistently higher rate of fees than the other counties.
The fourth and final graph filters the data for only those that have attorney fees. There is no discernible trend across the counties between the relationship of the percentage that the attorney fees made up of the total cost. It is interesting because several in the prior graph, many of the counties had overall increasing averages. while this shows that of the cases with attorney fees, the proportion of the overall cost decreased in multiple counties. This discrepancy may indicate that the number of plaintiffs charging for attorney fees in each county is increasing rather than the proportion of the fees relative to the principal amount. However, this graph is limited because there are some missing data points.
#combine the principal amount and attorney fee graphs
ggplot(yr_avgs, aes(filed_year)) +
geom_line(aes(y = mean.x, colour = "Attorney Fees")) +
geom_line(aes(y = mean.y, colour = "Principal Amounts")) +
geom_point(aes(y = mean.x, colour = "Attorney Fees")) +
geom_point(aes(y = mean.y, colour = "Principal Amounts")) +
theme_few() +
# geom_text(aes(label=mean.x), position=position_dodge(width=0.9), digits=0, vjust=-0.25, size=3) +
# geom_text(aes(label=mean.y), position=position_dodge(width=0.9), digits=0, vjust=-0.25, size=3) +
scale_color_manual(values=c("#f0746e", "#b9257a")) +
scale_y_continuous(limits=c(0,6000),
breaks= seq(0,6000,500),
labels=scales::dollar_format()) +
scale_x_continuous(limits=c(2016,2022),
breaks= seq(2016,2022,1)) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Attorney Fees and Principal Amounts",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "")+
geom_vline(xintercept = 2020, color = "Black", linetype = "dashed") +
annotate("text", label = "CDC Eviction \n Moratorium",
x = 2019.6, y = 5500, color = "Black", size = 2.5)
tj_data_p %>%
filter(principal_amount > 0, principal_amount < 10000, attorney_fees > 0, attorney_fees < 10000,# mpc added
!is.na(principal_amount),
percent_principal <= 100) %>%
mutate(percent_principal = percent_principal) %>%
ggplot(aes(x = percent_principal)) +
geom_histogram(bins=50, color="#f0746e", fill="#fcde9c")+
scale_y_continuous(breaks = seq(0, 300, 50)) +
scale_x_continuous(labels=scales::percent_format(scale= 1)) +
theme_few() +
scale_color_few(palette = "Medium") +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Distribution of Share of Attorney Fee in Total Cost",
subtitle = "",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "Count")+
geom_vline(xintercept = 4, color = "Black", linetype = "dashed") +
annotate("text", label = "Overall Average: \n 4.7%",
x = 8, y = 260, color = "Black", size = 2.5) +
geom_vline(xintercept = 13.85, color = "Black", linetype = "dashed") +
annotate("text", label = "Filtered Average: \n 13.94%",
x = 22, y = 260, color = "Black", size = 2.5)
ggplot(yr_percents, aes(filed_year)) +
geom_line(aes(y = mean.x, colour = "All Plaintiffs")) +
geom_line(aes(y = mean.y, colour = "Plaintiffs with Fees")) +
geom_point(aes(y = mean.x, colour = "All Plaintiffs")) +
geom_point(aes(y = mean.y, colour = "Plaintiffs with Fees")) +
theme_few() +
#geom_text(aes(label=round(mean.x,1)), position=position_dodge(width=0.9), vjust=-0.75, size=3, color= "#7c1d6f") +
#geom_text(aes(label=round(mean.y,1)), position=position_dodge(width=0.9), vjust=-0.75, size=3, color= "#7c1d6f") +
scale_color_manual(values=c("#f0746e", "#b9257a")) +
scale_y_continuous(limits=c(0,20),
breaks= seq(0,20,5),
labels=scales::percent_format(scale= 1)) +
scale_x_continuous(limits=c(2016,2022),
breaks= seq(2016,2022,1)) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Attorney Fees as Share of Total Cost",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "")+
geom_vline(xintercept = 2020, color = "Black", linetype = "dashed") +
annotate("text", label = "CDC Eviction \n Moratorium",
x = 2019.6, y = 8, color = "Black", size = 2.5)
percent_county <- tj_data_p %>%
filter(principal_amount > 0, # mpc added
!is.na(principal_amount)) %>%
group_by(filed_year, county) %>%
summarize( mean = mean(percent_principal, na.rm = TRUE),) %>%
ungroup()
ggplot(percent_county, aes(x = filed_year, y = mean, color = county)) +
geom_line() +
theme_few() +
scale_y_continuous(limits=c(0,15),
breaks= seq(0,15,5),
labels=scales::percent_format(scale=1)) +
scale_x_continuous(limits=c(2016,2022),
breaks= seq(2016,2022,1)) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Average Yearly Share of Attorney Fees within Total Cost ",
subtitle = "All cases by County",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "")
percent_county_f <- tj_data_p %>%
filter(principal_amount > 0, attorney_fees > 0, principal_amount < 10000, attorney_fees < 1000, # mpc added
!is.na(principal_amount)) %>%
group_by(filed_year, county) %>%
summarize( mean = mean(percent_principal, na.rm = TRUE),) %>%
ungroup()
ggplot(percent_county_f, aes(x = filed_year, y = mean, color = county)) +
geom_line() +
theme_few() +
scale_y_continuous(limits=c(0,40),
breaks= seq(0,40,5),
labels=scales::percent_format(scale=1)) +
scale_x_continuous(limits=c(2016,2022),
breaks= seq(2016,2022,1)) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text = element_text(size = 9),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1)) +
labs(title = "Average Yearly Share of Attorney Fees within Total Cost ",
subtitle = "by County with Fees ",
caption = "Source: Legal Services Corporation. 2023. “Civil Court Data Initiative.”\n Office of Governance and Data Analysis. https://www.lsc.gov/initiatives/civil-court-data-initiative. " ,
x = "", y = "")
tj_data$plaintiff_name <- gsub(".*ABBINGTON.*", "ABBINGTON", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*DOMINION PROPERTY.*", "DOMINION", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*BERKSHIRE.*", "BERKSHIRE", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*FOUR SEASONS APARTMENT.*", "FOUR SEASONS", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*FOUR SEASONS.*", "FOUR SEASONS", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*GOLDSTAR BARRACKS.*", "GOLDSTAR BARRACKS", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*AVEMORE.*", "AVEMORE", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*CHARLOTTESVILLE R AND H A.*", "CHARLOTTESVILLE R AND HA", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*LANDMARK.*", "LANDMARK", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*SQUIRE HILL.*", "SQUIRE HILL", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*WESTGATE.*", "WESTGATE", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*WESTHATE.*", "WESTGATE", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*FITZGERALD.*", "FITZGERALD", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*PEP UVA.*", "PEP UVA", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*RIO HILL.*", "RIO HILL", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*RIVERMEAD.*", "RIVERMEAD", tj_data$plaintiff_name)
tj_data$plaintiff_name <- gsub(".*MCDANIEL.*", "MCDANIEL", tj_data$plaintiff_name)
This section presents two interactive tables. Table 1 provides descriptive data for plaintiffs who have evicted more than 20 tenants between 2016 and 2020. Table 2 provides descriptive data for plaintiffs who charged attorney fees that were higher than the principal amount (clearly breaking the reasonable fees rule).
Simply sorting through Table 1, the following plaintiffs are particulary concnerning: Barracks West, Wilton, Rivermead, Landmark, SEMF, Rio Hill, Mallside Forest, and Four Seasons. All of these are maintained by private property management companies. These groups have the highest fees as a share of total cost. Notably, when sorting Table 2 by most frequent evictors, several of these companies have also charged attorney fees which are larger than the principal amount in multiple circumstances.
Sorting through Table 2, the plaintiffs with the highest attorney fees as a share of the principal amount are typically plaintiffs who have only had one eviction where attorney fees are higher than the principal amounts. In these cases, the principal amount is usually also 0. Therefore, it is unclear what is creating this issue. It is possible that these outliers are due to a record keeping error, a rare circumstance, or a broader issue with the legal protection of tenants. It is worth explaining the cases where attorney fees were higher than the principal amount. There is a possibility that these attorney fees were specified in a tenant’s rental agreement which would be particularly concerned to the legal aid justice center.
Reporting on high rates of evictions within these apartment complexes is relatively sparse. Barracks West has received criticism for poor conditions in their units with tenants complaining of roachs and mold. The only complex that has received reporting on eviction behaviors is Mallside Forest Apartments. They received significant local coverage when nearly half of their tenants received notice of potential eviction unless the renter paid what they owed in rent within 5 days of notice. These notices went out only two weeks after the pandemic-era protections ended on July 1st. Notably, several tenants came forward explaining that they applied for rent relief months prior, however, their landlord failed to provide the documentation necessary to receive relief.
frequent_plaintiffs <- tj_data %>%
group_by(plaintiff_name) %>%
summarize(evictions = n(),
pct_principal = round(sum(!is.na(principal_amount_og))/evictions*100, 0),
mean_principal = round(mean(principal_amount, na.rm = TRUE), 2),
pct_attyfees = round(sum(!is.na(attorney_fee_og))/evictions*100, 0),
mean_attyfees = round(mean(attorney_fees, na.rm = TRUE), 2),
mean_feepct = round(mean(fee_percent, na.rm = TRUE),1)) %>%
filter(evictions > 20)
reactable(frequent_plaintiffs,
columns = list(
plaintiff_name = colDef(name = "Plaintiff"),
evictions = colDef(name = "Evictions"),
pct_principal = colDef(name = "Principal Charged",
format = colFormat(suffix = "%")),
mean_principal = colDef(name = "Average Amount",
format = colFormat(prefix = "$")),
pct_attyfees = colDef(name = "Share of Cases With Fees Charged",
format = colFormat(suffix = "%"),
cell = data_bars(frequent_plaintiffs,
text_position = "outside-base",
number_fmt = scales::percent_format(scale = 1),
fill_color = rcartocolor::carto_pal(n = 4, "SunsetDark")[4],
)),
mean_attyfees = colDef(name = "Average Amount",
format = colFormat(prefix = "$")),
mean_feepct = colDef(name = "Fees as a Percent of Total Cost",
format = colFormat(suffix = "%"),
style = color_scales(frequent_plaintiffs,
colors = rcartocolor::carto_pal(n = 4, "SunsetDark")))
),
columnGroups = list(
colGroup(name = "Principal Amount", columns = c("pct_principal", "mean_principal")),
colGroup(name = "Attorney Fees", columns = c("pct_attyfees", "mean_attyfees", "mean_feepct"))
),
showSortable = TRUE, filterable = TRUE)
tj_data_p_100 <- tj_data %>%
# mpc revised -- thinking of ways to avoid the divide by zero issue while
# recognizing that attorney fees are present in some cases where prinipal is zero
# not sure if this is a good strategy though, yet...
mutate(principal_denominator = ifelse(attorney_fees > 0 & principal_amount == 0,
1, principal_amount),
principal_denominator = ifelse(attorney_fees > 0 & is.na(principal_amount),
1, principal_denominator),
percent_principal = (attorney_fees/principal_denominator)*100,
percent_principal = ifelse(is.nan(percent_principal), NA_real_, percent_principal)) %>%
group_by(plaintiff_name) %>%
filter(percent_principal > 100) %>%
summarize(evictions = n(),
pct_principal = round(sum(!is.na(principal_amount_og))/evictions*100, 0),
mean_principal = round(mean(principal_amount, na.rm = TRUE), 2),
pct_attyfees = round(sum(!is.na(attorney_fee_og))/evictions*100, 0),
mean_attyfees = round(mean(attorney_fees, na.rm = TRUE), 2),
mean_feepct = round(mean(percent_principal, na.rm = TRUE),1)) %>%
mutate(mean_principal, mean_principal_0 = ifelse(pct_principal == 0 , 0 , mean_principal)) %>%
subset(select=-c(mean_principal))
tj_data_p_100 <- tj_data_p_100[, c(1,2,3,7,4,5,6)]
reactable(tj_data_p_100,
columns = list(
plaintiff_name = colDef(name = "Plaintiff"),
evictions = colDef(name = "Evictions"),
pct_principal = colDef(name = "Principal Charged",
format = colFormat(suffix = "%")),
mean_principal_0 = colDef(name = "Average Principal Amount",
format = colFormat(prefix = "$")),
pct_attyfees = colDef(name = "Share of Cases With Fees Charged",
format = colFormat(suffix = "%")),
mean_attyfees = colDef(name = "Average Fee Amount",
format = colFormat(prefix = "$")),
mean_feepct = colDef(name = "Fees as a Percent of Principal Amount",
format = colFormat(suffix = "%"),
style = color_scales(tj_data_p_100,
colors = rcartocolor::carto_pal(n = 4, "SunsetDark")))
),
columnGroups = list(
colGroup(name = "Principal Amount", columns = c("pct_principal", "mean_principal_0")),
colGroup(name = "Attorney Fees", columns = c("pct_attyfees", "mean_attyfees", "mean_feepct"))
),
showSortable = TRUE, filterable = TRUE)
The Figures 1-3 presents a distribution of the share of total costs going to attorney fees by plaintiff. In creating these figures, we excluded the plaintiffs for whom attorney fees were 0% of their total cost. The vast majority of plaintiffs have attorney fees equal to 0% of their cost so including these plaintiffs made each graph unreadable. The number of plaintiffs with attorney fees equal to 0 is indicated via text on the graph.
Figure 1.a showcases all plaintiffs regardless of the number of evictions and finds that, generally, attorney fees amount to 10-20% of total costs, but there is a notable jump at 100%. Figure 2.a restricts the sample to plaintiffs with 3+ evictions. The distribution is slightly changed with most plaintiffs charging attorney fees less than 10% of total costs. Figure 3.a restricts the sample to plaintiffs with 5+ evictions. The distribution skewed further to the left with most plaintiffs charging attorney fees 5% of the total cost. This indicates that more frequent evictors tend to charge lower attorney fees as a share of total cost.
It was then unclear whether this trend is due to lower attorney costs or higher total costs for more frequent evictors. Therefore, we created figures showing the distribution of raw principal and attorney fee amounts. Looking at these figures, it is clear that plaintiffs with 5+ evictions tend to charge higher principal amounts than plaintiffs with 3+ evictions. However, when looking at all plaintiffs (with the exclusion of some outliers), the principal amounts range from a few dollars to $20,000. Therefore, we cannot conclude that the lower porportion to total costs going to attorney fees amoung frequent evictors is entirely due to higher principal amounts amount frequent evictors.
frequent_plaintiffs_r <- frequent_plaintiffs %>%
subset(select= c("plaintiff_name", "mean_principal", "mean_attyfees")) %>%
filter(mean_attyfees != 0) %>%
filter(mean_principal <= 20000)
frequent_plaintiffs_long <- pivot_longer(data = frequent_plaintiffs_r, cols = c("mean_principal", "mean_attyfees"), names_to = "Type", values_to = "Amount")
plot1.2<- ggplot(frequent_plaintiffs_long, aes(x = Amount, fill= Type, color = Type, after_stat(density))) +
geom_histogram(alpha = 0.5, position="identity") +
scale_y_continuous(labels=percent) +
theme_few() +
scale_color_few(palette = "Light", name = "") +
scale_color_manual(labels = c("Mean Attorney Fees", "Mean Principal Amounts"), values=c("#DC3977", "#E69F00")) +
scale_fill_manual(labels = c("Mean Attorney Fees", "Mean Principal Amounts"), values=c("#DC3977", "#E69F00")) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.title = element_text(size = 10),
plot.title = element_text(size = 12),
axis.text = element_text(size = 8),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1),
legend.key.size = unit(0.25, 'cm')) +
labs(title = "Distribution of Plaintiffs by Level of Fees",
subtitle = "",
x = "Amount (Dollars)", y = "Share of Plaintiffs")
plot_grid(plot1.1, plot1.2, ncol=2, align="v", rel_widths = c(2, 2.3))
frequent_plaintiffs_r <- frequent_plaintiffs %>%
subset(select= c("plaintiff_name", "mean_principal", "mean_attyfees")) %>%
filter(mean_attyfees != 0)
frequent_plaintiffs_long <- pivot_longer(data = frequent_plaintiffs_r, cols = c("mean_principal", "mean_attyfees"), names_to = "Type", values_to = "Amount")
plot2.2<-ggplot(frequent_plaintiffs_long, aes(x = Amount, fill= Type, color = Type, after_stat(density))) +
geom_histogram(alpha = 0.5, position="identity") +
scale_y_continuous(labels=percent) +
theme_few() +
scale_color_few(palette = "Light", name = "") +
scale_color_manual(labels = c("Mean Attorney Fees", "Mean Principal Amounts"), values=c("#DC3977", "#E69F00")) +
scale_fill_manual(labels = c("Mean Attorney Fees", "Mean Principal Amounts"), values=c("#DC3977", "#E69F00")) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.title = element_text(size = 10),
plot.title = element_text(size = 12),
axis.text = element_text(size = 8),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1),
legend.key.size = unit(0.25, 'cm')) +
labs(title = "Distribution of Plaintiffs by Level of Fees",
subtitle = "",
x = "Amount (Dollars)", y = "Share of Plaintiffs")
plot_grid(plot2.1, plot2.2, ncol=2, align="v", rel_widths = c(2, 2.3))
frequent_plaintiffs_r <- frequent_plaintiffs %>%
subset(select= c("plaintiff_name", "mean_principal", "mean_attyfees")) %>%
filter(mean_attyfees != 0)
frequent_plaintiffs_long <- pivot_longer(data = frequent_plaintiffs_r, cols = c("mean_principal", "mean_attyfees"), names_to = "Type", values_to = "Amount")
plot3.2 <- ggplot(frequent_plaintiffs_long, aes(x = Amount, fill= Type, color = Type, after_stat(density))) +
geom_histogram(alpha = 0.5, position="identity") +
scale_y_continuous(labels=percent) +
theme_few() +
scale_color_few(palette = "Light", name = "") +
scale_color_manual(labels = c("Mean Attorney Fees", "Mean Principal Amounts"), values=c("#DC3977", "#E69F00")) +
scale_fill_manual(labels = c("Mean Attorney Fees", "Mean Principal Amounts"), values=c("#DC3977", "#E69F00")) +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.title = element_text(size = 10),
plot.title = element_text(size = 12),
axis.text = element_text(size = 8),
axis.text.x = element_text (angle=45, vjust = 1, hjust = 1),
legend.key.size = unit(0.25, 'cm')) +
labs(title = "Distribution of Plaintiffs by Level of Fees\n(Attorneys with 5+ Evictions)",
subtitle = "",
x = "Amount (Dollars)", y = "Share of Plaintiffs")
plot_grid(plot3.1, plot3.2, ncol=2, align="v", rel_widths = c(2, 2.3))
Our analyst yields several key results.
This analysis is still preliminary. While we have presented key descriptive data, there is always more to understand. Presented below are several questions for further research.
The goal of this project was to identify if attorney fees in TJPD were meeting the criteria mandated by the Virginia government. However, the question of whether the attorney fees being charged in TJPD are “reasonable” is a normative one. It requires us to identify what a reasonable attorney fee is. Of course, determining the criteria for a reasonable attorney fee is incredibly complicated, and could vary from case to case. It is a question that must be answered with the support and insight of the tenants experiencing evictions.
Moving forward, there are actions that advocates, community members, and tenants can take to prevent eviction and protect renters. First, this is an ignored issue with limited media coverage. While media coverage is useful to raise awareness, it is also useful for potential tenants who are considering renting from particular management companies. It is important that information on frequent evictors is readily available to all. Second, community members should demand action from local government. Encourage continued funding for the TJPD Eviction Reduction Pilot Program. Vote for representatives who are committed to reducing evictions and protecting tenants. Finally, engage in mutual aid and localized, grassroots efforts to prevent evictions and promote stable housing. Inform renters about their legal rights relating to eviction. Donate to shelters like The Haven and organizations like the Legal Aid Justice Center who are working tirelessly to address housing issues in TJPD. Support renters facing eviction by responding to calls for mutual aid.
Evictions should be visible, understood, and preventable. Together, by combining expertise and resources, we can achieve this.