load the library

library(tidyverse)

load the data

setwd("~/Nassor/MC/Data101")
boxing <- read_csv("boxing_pay_data.csv")
## Rows: 4670 Columns: 27
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (3): Boxer, Date, Venue
## dbl (24): Purse, lnRPurse, weight, Age, Wins, Losses, KO, W-Title, PPV, ESPN...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Part A: Introduction

This project seeks to answer the research question - Is a boxers wins related to their earnings?

The money involved in professional entertainment gets a lot of attention. Professional athletes tend to be some of the highest paid individuals globally. This is no different in the combat sports world where boxer pay is scrutinized. Names like Floyd Money Mayweather” and “Saul Canelo Alvarez” have made a name for the money they generate as athletes in the sport of boxing.

Professional boxers or “prize fighters” and legally classified as independent contractors and must negotiate contract agreements to get paid for their work. A purse is the total amount of “prize” money a boxer will be paid - including up front and back end money. However, the average boxer is not in a position to earn much from their fights and according to the Latino Policy and Politics Institute, most professional boxers need to work multiple jobs. Within a changing landscape of professional combat sports, the athletes themselves tend to be under-informed on the business-side of their profession. This exploration will seek insights to inform larger conversations about fighter pay as professional athletes.

This project will begin by looking into wins as a predictor for increased earnings, but will also explore other variables that may also contribute to higher pay.

First Let’s Take a Look at the data

dim(boxing)
## [1] 4670   27
head(boxing)
## # A tibble: 6 × 27
##   Boxer     Date  Venue Purse lnRPurse weight   Age  Wins Losses    KO `W-Title`
##   <chr>     <chr> <chr> <dbl>    <dbl>  <dbl> <dbl> <dbl>  <dbl> <dbl>     <dbl>
## 1 Gamboa, … 2009… Buff… 37998    10.7     126  27.1    12      0    10         0
## 2 Gonzalez… 2009… Buff… 20000    10.0     127  30.7    27      2    18         0
## 3 Lara, Er… 2009… Buff…  3000     8.14    154  25.8     2      0     1         0
## 4 Bogere, … 2009… Buff…  1500     7.45    135  20.2     4      0     2         0
## 5 Frazier,… 2009… Buff…  1000     7.04    139  30.9     1      0     1         0
## 6 Gonzalez… 2009… Buff…  1500     7.45    146  31.5     2      1     1         0
## # ℹ 16 more variables: PPV <dbl>, ESPN <dbl>, HBO <dbl>, FOX <dbl>,
## #   TopRank <dbl>, GoldenBoy <dbl>, RDS <dbl>, Y2009 <dbl>, Y2010 <dbl>,
## #   Y2011 <dbl>, Y2012 <dbl>, Y2013 <dbl>, Y2014 <dbl>, Y2015 <dbl>,
## #   Y2016 <dbl>, Y2017 <dbl>

Key Variables

Part B: Clean the Dataset and Conduct an Exploratory Data Analysis (EDA)

Exploring the class of key variables

summary(boxing$KO)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   1.000   4.000   6.881  10.000  51.000
class(boxing$KO)
## [1] "numeric"
summary(boxing$Wins)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    3.00    8.00   11.39   17.00   65.00
class(boxing$Wins)
## [1] "numeric"
max(boxing$Wins)
## [1] 65
#Max number of wins is 65

summary(boxing$lnRPurse)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   6.587   7.366   8.195   8.567   9.210  18.455
unique(boxing$PPV)
## [1] 0 1
class(boxing$PPV)
## [1] "numeric"
boxing_venue <- boxing |>
  group_by(Venue) |>
  count() |>
  arrange(desc(n))|>
  head(10)
boxing_venue
## # A tibble: 10 × 2
## # Groups:   Venue [10]
##    Venue                n
##    <chr>            <int>
##  1 MGM Grand          313
##  2 Doubletree Hotel   272
##  3 Fantasy Springs    268
##  4 Hard Rock          261
##  5 Mandalay Bay       185
##  6 StubHub            176
##  7 MGM Arena          161
##  8 CosmoLV            160
##  9 Texas Station      122
## 10 Belasco Theater    112
options(scipen = 999)
boxer_count <- boxing |>
  group_by(Boxer) |>
  summarize(count = n(), mean_purse = mean(Purse), max_purse = max(Purse), mean_win = mean(Wins), mean_KO = mean(KO)) |>
  arrange(desc(count)) |>
  filter(count >= 10)
boxer_count
## # A tibble: 57 × 6
##    Boxer               count mean_purse max_purse mean_win mean_KO
##    <chr>               <int>      <dbl>     <dbl>    <dbl>   <dbl>
##  1 Magdaleno, Jessie      21     17576.    155000    11.5     8.52
##  2 Chavez, Joaquin R.     18      3000       6000     4.39    1.78
##  3 Vargas, Jessie         18    227028.   2800000    16.6     7.39
##  4 Magdaleno, Diego       17     11788.     25000    16.2     5.24
##  5 Diaz, Joseph Jnr.      16     32250     200000    11.1     6.75
##  6 Bogere, Sharif         15     11647.     75000    16.1    10.3 
##  7 De La Hoya, Diego      15     13967.     80000     7.4     4.8 
##  8 Gutierrez, Jesus A.    15      3343.     10000     7.2     2.27
##  9 Breazeale, Dominic     14     10464.     50000     7       6.64
## 10 Gavril, Ronald         14     21143.    125000    10.9     8.29
## # ℹ 47 more rows

filtering for top 10 venues

boxing1 <- boxing |>
  filter(Venue %in% c("MGM Grand",  "Doubletree Hotel", "Fantasy Springs", "Hard Rock", "Mandalay Bay", "StubHub", "MGM Arena", "CosmoLV", "Texas Station", "Belasco Theater"))

Check the distribution for number of wins

There are zeros so we have to use square root as opposed to the log transformation.

summary(boxing1$Wins)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    5.00   12.00   14.15   21.00   65.00
ggplot(boxing1, aes(x=Wins))+
  geom_density()

The distribution of wins is strongly skewed right.

Perform square root transformation for Wins

ggplot(boxing1, aes(x=sqrt(Wins)))+
  geom_density()

The square root function was able to make the distribution of wins more bell shaped

Check distribution for lnRPurse

ggplot(boxing1, aes(x=lnRPurse)) +
  geom_density()

Unable to transform this distribution because the numeric values for purse were already log transformed

Creating a vizualization

ggplot(boxing1, aes(x = Wins, y = lnRPurse)) +
  geom_point(alpha = 0.2) +
  geom_smooth(method = "lm", color = "red", se = FALSE) +
  labs(title = "Boxer Wins vs Purse",
       x = "Wins", y = "Fight Purse") +
  theme_minimal()

Scatterplot was selected to visualize the relationship of these two variables, which appears to be linear, meaning as wins increase, so does log purse. However, most of the wins were in 0 - 30 range and most of the purses were were around or below log 10 ($22026.5). Furthermore, we see much more variability on the upper end of our regression line.

Statistical Analysis: Regression Analysis

Compute a correlation coefficient between key variables

cor(boxing$Wins, boxing$lnRPurse, use = "complete.obs")
## [1] 0.7635325
cor(boxing$PPV, boxing$lnRPurse, use = "complete.obs")
## [1] 0.5261753
cor(boxing$KO, boxing$lnRPurse, use = "complete.obs")
## [1] 0.7394403

Perform Simple Regression

Predictor Variable(s): Wins Response Variable: Purse

options(scipen = 0)
model <- lm(lnRPurse ~ Wins, data = boxing1)
summary(model)
## 
## Call:
## lm(formula = lnRPurse ~ Wins, data = boxing1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.9618 -0.5350 -0.1228  0.4463  5.8516 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 7.419804   0.042128   176.1   <2e-16 ***
## Wins        0.120267   0.002313    52.0   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.195 on 2028 degrees of freedom
## Multiple R-squared:  0.5715, Adjusted R-squared:  0.5712 
## F-statistic:  2704 on 1 and 2028 DF,  p-value: < 2.2e-16

y = 7.42 + 0.12x - For every Win, the predicted lnRPurse goes up by 0.12 points. - If a boxer has 0 Wins, the predicted lnRPurse is 7.42 Adjusted R-squared: More than half of the variation are explained by this model (57.15%). The p value is close to zero: Having a p value < alpha of 0.05, indicates that wins are a meaningful predictor of log purse.

Predictions for wins in table format

winput <- data.frame(Wins = c(5, 15, 25, 35, 45, 55, 65))
purse_estimate <- exp(predict(model, winput))
cbind(winput, purse_estimate)
##   Wins purse_estimate
## 1    5       3044.636
## 2   15      10135.528
## 3   25      33740.963
## 4   35     112322.963
## 5   45     373920.804
## 6   55    1244774.570
## 7   65    4143828.624
plot(model, which = 1)

plot(model, which = 2)

The residuals are not randomly scattered and the QQ plot does not fit. - Residuals vs Fitted Plot shows that most residuals are clumped at the left-most side of the line of fit, demonstrating the funnel shape. - The QQ Residuals Plot shows a non-normal distribution of the residuals at the tails ends of the line.

Run RMSE

rmse <- sqrt(mean(residuals(model)^2))
rmse
## [1] 1.194695

On average, my predicted fight purse is off by about 1.195 rmse points.”

Multiple Regression

Predictor Variable(s): Wins(#), KO(#), PPV(0 or 1), Venue (limited to the 10 most prevalent venues in the dataset) Response Variable: Purse

multi_model1 <- lm(lnRPurse ~ Wins + KO + Venue + PPV, data = boxing1)
summary(multi_model1)
## 
## Call:
## lm(formula = lnRPurse ~ Wins + KO + Venue + PPV, data = boxing1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.3575 -0.4606 -0.0662  0.3916  5.3464 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            7.511124   0.098788  76.032  < 2e-16 ***
## Wins                   0.075174   0.005664  13.272  < 2e-16 ***
## KO                     0.023850   0.007553   3.158 0.001614 ** 
## VenueCosmoLV           0.432796   0.127400   3.397 0.000694 ***
## VenueDoubletree Hotel -0.441198   0.115152  -3.831 0.000131 ***
## VenueFantasy Springs  -0.055508   0.115413  -0.481 0.630604    
## VenueHard Rock         0.113849   0.116315   0.979 0.327799    
## VenueMandalay Bay      0.299973   0.124036   2.418 0.015676 *  
## VenueMGM Arena         0.250859   0.132793   1.889 0.059023 .  
## VenueMGM Grand         0.662178   0.116842   5.667 1.66e-08 ***
## VenueStubHub           0.545236   0.125930   4.330 1.57e-05 ***
## VenueTexas Station    -0.106896   0.134190  -0.797 0.425778    
## PPV                    1.840537   0.097644  18.850  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.025 on 2017 degrees of freedom
## Multiple R-squared:  0.6865, Adjusted R-squared:  0.6846 
## F-statistic: 368.1 on 12 and 2017 DF,  p-value: < 2.2e-16

Adjusted R-squared: Nearly 70% of the variation are explained by this model (0.6846). The p value is close to zero for Wins and PPV, very small for some Venues such as “MGM Grand” and “StubHub”. KO and a couple other Venues (“Fantasy Springs”, “Doubletree Hotel”, and “Mandalay Bay”) had a p value < alpha 0.05, while other Venues were not relevant to this prediction model.

plot(multi_model1, which = 1)

plot(multi_model1, which = 2)

The residuals are not randomly scattered and the QQ plot does not fit.

rmse <- sqrt(mean(residuals(multi_model1)^2))
rmse
## [1] 1.021824

Part D: Conclusion and Future Directions

I began this exploration by asking - Is a boxers wins related to their earnings? 1. I looked over my distributions and plotted the variables. 2. I created a prediction model using a two-part regression analysis. 3. I made predictions and checked how well my model made predictions.

The results indicated a linear relationship between wins and log of the purse. However, the model was off by 1.195 rmse points and did not demonstrate homoscedasticity or normalcy of the residuals. In this case, the initial predictor variable was significant, however the accuracy of the model increased after adding other predictor variables and the model became more effective at explaining the overall variance in the dependent variable. In particular, the PPV demonstrated a strong influence on the response variable. I also ran a check for the Root Mean Square Error (RMSE) to measure the average difference between the predicted values and the actual observed values. I found that on average the multiple regression model was off by 1.02 rmse points, a 0.173 point improvement from the simple linear regression.However, the diagnostic plots did not improve much, indicating that this linear approach is not the best model for observing the relationship of these variables. Moving forward with this dataset, I would explore how well Pay Per View (PPV) and venue explain for earnings, given that it had the strongest magnitude in my multiple regression. In professional boxing, some broadcasting platforms have transformed to subscription based and no longer host PPV events. I wonder how this might affect boxer’s ability to negotiate for pay. Additionally, I would look for a dataset to compare with a MMA fighter earnings to further inform the discussion on fighter pay.

Part E: References

Anderson, Peter (2019), “Boxing Data”, Mendeley Data, V1, doi: 10.17632/vpbsd5bryy.1

Mondragón, R., Valenzuela, A., Jr., & Hernández, J. M. (2024, May 16). Down but not out: Labor struggles for professional boxers in California’s ring. UCLA Latino Policy and Politics Institute. https://latino.ucla.edu/wp-content/uploads/2024/05/Down-but-Not-Out-Labor-Struggles-for-Professional-Boxers-in-Californias-Ring.pdf