Final Project

Author

Noah Garczewski

The Cleveland Browns: Some Analysis

Introduction

Since I am (regrettably) a Cleveland Browns fan, I wanted to do some fun analysis related to the Browns’ abysmal performance in recent years for my BAIS 462 final project.

For this project, most of my data comes from Pro Football Reference, which contains a wealth of statistical data. Some of the data was scraped as part of a previous assignment, and some of it was downloaded in CSV format. I also made use of press conference transcripts for sentiment analysis. I scraped these transcripts from a website of the Browns press office for a previous assignment.

The PFR data required extensive data cleaning. Most of the cleaning focused on renaming columns, converting data types, and removing extraneous rows or columns. In some cases, I calculated additional columns and applied filters to the data.

A data dictionary explaining all of the fields in the PFR data can be found here: Download data dictionary

The transcript data required cleaning and preparation of a different sort. The transcripts were placed into a data frame and tokenized. Stop words were removed, as well as a manually-defined set of words (mostly names of individuals connected to the Browns). This produced a new, tidy data frame, which I was then able to use for sentiment analysis using the NRC lexicon.

For better readability of this document, the code for importing libraries, importing data, and cleaning the data is not shown.

Team-Level Analysis

Annual Win Percentage

In sports, winning takes priority over any stat line. Thus, it makes sense to begin by analyzing the Browns win percentage for each year of their existence.

A few important notes. The Browns played from 1946 to 1995, then suspended operations from 1996 to 1998 before returning for the 1999 season. This is reflected by a gap from 1996 to 1998. The gap seen in 2017 is not an error. The Browns did not win a single game that year. As the chart shows, in the pre-1995 era, the Browns had a mix of successful and unsuccessful seasons. From 1999 to the present, the Browns have experienced very few successful seasons. In this “modern era”, the Browns have had only four seasons in which they had a winning record (a win percentage above 0.500).

browns_all_time %>%
  ggplot(aes(x = Year, y = Win_Pct)) +
  geom_col(fill = "orange") + 
  labs(title = "Browns All-Time Win Percentage",
       x = "Year",
       y = "Win Percentage") + 
  scale_y_continuous(labels = scales::number_format(accuracy = 0.001))

Annual Point Differential

Aside from win percentage, one of the most telling statistics for a team is their point differential. Point differential is defined simply as the total number of points scored minus the total number of points given up. A positive point differential generally implies success, while a negative point differential implies failure.

In the earliest years of their existence (the ’40s, ’50s, and ’60s), the Browns had high positive point differentials almost every year. During the ’70s, ’80s, and ’90s saw more mixed numbers, but still a decent number of successful seasons. Since 1999, the Browns have had only three seasons with a positive point differential, and even in those seasons, the number was only slightly positive. In the case of the Browns, point differential is an extremely informative metric and it tracks well with subjective descriptions of the team’s performance.

browns_all_time %>%
  ggplot(aes(x = Year, y = PD)) +
  geom_col(fill = "purple") +
  labs(title = "Browns All-Time Point Differential",
       x = "Year",
       y = "Point Differential")

Press Conference Sentiment Analysis

Stefanski Preseason Press Conferences

One interesting metric of the team’s performance is the tone of coach press conferences. This chart shows the ratio of positive to negative sentiment words (based on the NRC lexicon), for preseason press conferences given by head coach Kevin Stefanski in late July of 2023, 2024, and 2025.

Noticeable in the chart is an increase in positivity from 2023 to 2024. This was after the Browns performed better than expected in 2023 (including a surprise postseason appearance) and entered 2024 with high expections.

The opposite pattern unfolded the following year. The Browns significantly underperformed in 2024 and entered 2025 with a very negative outlook. Unsurprisingly, the 2025 press conference was marked by considerably more negative sentiments.

tidy_transcripts %>%
  inner_join(nrc, by = "word") %>%
  filter(name %in% c("stefanski_2023", "stefanski_2024", "stefanski_2025"),
         sentiment %in% c("positive", "negative")) %>%
  count(name, sentiment) %>%
  pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) %>%
  mutate(ratio = positive / negative) %>%
  ggplot(aes(name, ratio)) +
  geom_col() +
  geom_text(aes(label = round(ratio, 2)), vjust = -0.4) +
  labs(title = "Positive:Negative Sentiment Ratio",
       x = "Transcript", 
       y = "Ratio")

Player-Level Analysis

The quarterback (QB) is unquestionably the most important player in modern football. QB statistics can often be used to draw broader conclusions about a team.

In the case of the Cleveland Browns, the tenure and passer rating of recent Browns QBs tell a striking story.

Passer Tenure

This scatter plot shows the total number of games that each passer (among those with at least 20 pass attempts) played in for the Browns, regardless of whether or not that player started at QB.

In the “old Browns” era (1946-1995), there is wide variation in passer tenure. All else being equal, this is expected. Teams typically have some QBs who play with a team for many years and others who play for only a short period of time.

The “new Browns” era (1999-present), displays a shockingly different pattern. Almost all Browns QBs from this time period were extremely short-tenured. Nearly all of them played fewer than 25 games (the equivalent of roughly one and a half seasons) with the Browns. While bad teams typically have high turnover at the QB position, this degree of turnover is unprecendented. It speaks volumes about the poor personnel decisions made by the Browns over the past 25 years.

browns_passers %>%
  ggplot(aes(x=From, y=Games)) +
  geom_point(position = "jitter", color = "red") + 
  labs(title = "Games Played By Browns Passers",
       x = "First Year with the Browns",
       y = "Games Played with the Browns") +
  scale_x_continuous(breaks = c(1950, 1960, 1970, 1980, 1990, 2000, 2010, 2020)) +
  scale_y_continuous(limits = c(0,140), breaks = c(0,20,40,60,80,100,120,140))

Passer Ratings

This bar chart shows the overall passer rating of every player who has thrown at least 20 passes for the Browns since 1999.

For context, the passer rating scale ranges from 0 to 158.3, but for the purposes of this analysis, the upper limit of the chart is set to 120 for reasonableness. The highest recorded single-season passer rating is 122.5, while the highest recorded career passer rating is approximately 103. A passer rating of 80 is generally considered “average”, but the true average passer rating today sits in the range of 90-95.

As the chart shows, almost all Browns QBs since 1999 have very poor ratings. Not a single one has a rating above 90. Only about a dozen have ratings above 80. Roughly a third have a rating below 70. The fact that almost all Browns QBs since 1999 have played so poorly is indicative of the persistent misery of the Browns in that time period, to say nothing of that fact that 40+ QBs have played for the Browns in only 26 years.

browns_passers %>%
  filter(From >= 1999) %>%
  mutate(Player = reorder(Player, Rate)) %>%
  ggplot(aes(y = Player, x = Rate)) +
  geom_col(fill = "brown") +
  labs(title = "Post-1999 Browns QB Ratings",
       x = "Passer Rating",
       y = "Name") + 
  scale_x_continuous(limits = c(0, 120), breaks = c(0, 20, 40, 60, 80, 100, 120))