1. Load Libraries and Data

library(readxl)
library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)
library(knitr)

setwd("~/Desktop")

tesla_data <- read_excel("Tesla_Compensation_Dataset_v2.xlsx", sheet = "Chart Data", range = "A3:G8")

names(tesla_data) <- c(
  "Year",
  "Kirkhorn_Salary",
  "Kirkhorn_Total_Comp",
  "Musk_SCT_Total",
  "Revenue_M",
  "Stock_Price",
  "Notes"
)

tesla_data <- tesla_data %>%
  mutate(
    Year = as.numeric(Year),
    Kirkhorn_Salary = as.numeric(Kirkhorn_Salary),
    Kirkhorn_Total_Comp = as.numeric(Kirkhorn_Total_Comp),
    Musk_SCT_Total = as.numeric(Musk_SCT_Total),
    Revenue_M = as.numeric(Revenue_M),
    Stock_Price = as.numeric(Stock_Price)
  ) %>%
  mutate(
    Revenue_Growth = (Revenue_M / lag(Revenue_M)) - 1,
    Stock_Return = (Stock_Price / lag(Stock_Price)) - 1
  )

tesla_data

2. Dataset Description

2.1 Overview

This report analyzes Tesla’s C-suite compensation and company performance using a multi-year dataset. The data focuses on two executives, Zachary Kirkhorn and Elon Musk, and compares their compensation patterns with Tesla’s revenue and stock-price trends over time. The purpose is to evaluate whether executive pay appears to move alongside company performance and whether the relationship is direct or more complicated.

2.2 What Each Row Represents

Each row represents one year of chart-ready Tesla data. The observations run from 2019 through 2023 and combine executive compensation data with company-level performance data for the same year.

2.3 What Each Column Represents

column_description <- tibble(
  Column = c(
    "Year",
    "Kirkhorn_Salary",
    "Kirkhorn_Total_Comp",
    "Musk_SCT_Total",
    "Revenue_M",
    "Stock_Price",
    "Notes",
    "Revenue_Growth",
    "Stock_Return"
  ),
  Description = c(
    "Fiscal year of the observation",
    "Zachary Kirkhorn's annual salary",
    "Zachary Kirkhorn's total proxy-reported compensation",
    "Elon Musk's total proxy-reported compensation under the Summary Compensation Table",
    "Tesla annual revenue in millions of dollars",
    "Tesla year-end stock price",
    "Contextual note for the year",
    "Year-over-year revenue growth rate",
    "Year-over-year stock return"
  )
)

kable(column_description, caption = "Description of Variables")
Description of Variables
Column Description
Year Fiscal year of the observation
Kirkhorn_Salary Zachary Kirkhorn’s annual salary
Kirkhorn_Total_Comp Zachary Kirkhorn’s total proxy-reported compensation
Musk_SCT_Total Elon Musk’s total proxy-reported compensation under the Summary Compensation Table
Revenue_M Tesla annual revenue in millions of dollars
Stock_Price Tesla year-end stock price
Notes Contextual note for the year
Revenue_Growth Year-over-year revenue growth rate
Stock_Return Year-over-year stock return

2.4 Data Preview

kable(tesla_data, caption = "Tesla Chart-Ready Data")
Tesla Chart-Ready Data
Year Kirkhorn_Salary Kirkhorn_Total_Comp Musk_SCT_Total Revenue_M Stock_Price Notes Revenue_Growth Stock_Return
2019 276058 21243957 23760 24578 27.89 Full year; Musk salary only NA NA
2020 269663 46562116 0 31536 235.22 Kirkhorn large stock grant; Musk declined salary 0.2830987 7.4338473
2021 300000 301154 0 53823 352.26 Both: no new equity; Musk $23.5B option exercise NOT in SCT 0.7067161 0.4975767
2022 300000 303000 0 81462 123.18 Both: no new equity; TSLA -65% for year 0.5135165 -0.6503151
2023 NA NA 1917 96773 248.48 Kirkhorn partial year; Musk minimal 2013 option exercises 0.1879527 1.0172106

2.5 Structure and Summary Statistics

str(tesla_data)
## tibble [5 × 9] (S3: tbl_df/tbl/data.frame)
##  $ Year               : num [1:5] 2019 2020 2021 2022 2023
##  $ Kirkhorn_Salary    : num [1:5] 276058 269663 300000 300000 NA
##  $ Kirkhorn_Total_Comp: num [1:5] 21243957 46562116 301154 303000 NA
##  $ Musk_SCT_Total     : num [1:5] 23760 0 0 0 1917
##  $ Revenue_M          : num [1:5] 24578 31536 53823 81462 96773
##  $ Stock_Price        : num [1:5] 27.9 235.2 352.3 123.2 248.5
##  $ Notes              : chr [1:5] "Full year; Musk salary only" "Kirkhorn large stock grant; Musk declined salary" "Both: no new equity; Musk $23.5B option exercise NOT in SCT" "Both: no new equity; TSLA -65% for year" ...
##  $ Revenue_Growth     : num [1:5] NA 0.283 0.707 0.514 0.188
##  $ Stock_Return       : num [1:5] NA 7.434 0.498 -0.65 1.017
summary(tesla_data)
##       Year      Kirkhorn_Salary  Kirkhorn_Total_Comp Musk_SCT_Total 
##  Min.   :2019   Min.   :269663   Min.   :  301154    Min.   :    0  
##  1st Qu.:2020   1st Qu.:274459   1st Qu.:  302538    1st Qu.:    0  
##  Median :2021   Median :288029   Median :10773478    Median :    0  
##  Mean   :2021   Mean   :286430   Mean   :17102557    Mean   : 5135  
##  3rd Qu.:2022   3rd Qu.:300000   3rd Qu.:27573497    3rd Qu.: 1917  
##  Max.   :2023   Max.   :300000   Max.   :46562116    Max.   :23760  
##                 NA's   :1        NA's   :1                          
##    Revenue_M      Stock_Price        Notes           Revenue_Growth  
##  Min.   :24578   Min.   : 27.89   Length:5           Min.   :0.1880  
##  1st Qu.:31536   1st Qu.:123.18   Class :character   1st Qu.:0.2593  
##  Median :53823   Median :235.22   Mode  :character   Median :0.3983  
##  Mean   :57634   Mean   :197.41                      Mean   :0.4228  
##  3rd Qu.:81462   3rd Qu.:248.48                      3rd Qu.:0.5618  
##  Max.   :96773   Max.   :352.26                      Max.   :0.7067  
##                                                      NA's   :1       
##   Stock_Return    
##  Min.   :-0.6503  
##  1st Qu.: 0.2106  
##  Median : 0.7574  
##  Mean   : 2.0746  
##  3rd Qu.: 2.6214  
##  Max.   : 7.4338  
##  NA's   :1

2.6 Missing Value Review

missing_summary <- tibble(
  Variable = names(tesla_data),
  Missing_Values = sapply(tesla_data, function(x) sum(is.na(x))),
  Percent_Missing = round(sapply(tesla_data, function(x) mean(is.na(x)) * 100), 2)
)

kable(missing_summary, caption = "Missing Value Summary")
Missing Value Summary
Variable Missing_Values Percent_Missing
Year 0 0
Kirkhorn_Salary 1 20
Kirkhorn_Total_Comp 1 20
Musk_SCT_Total 0 0
Revenue_M 0 0
Stock_Price 0 0
Notes 0 0
Revenue_Growth 1 20
Stock_Return 1 20

2.7 Descriptive Interpretation

The dataset is small, focused, and appropriate for exploratory analysis. It is especially useful for trend charts and comparison visuals. One important limitation is that Elon Musk’s proxy-reported compensation is near zero in most of these years, which means the dataset is much more informative for Kirkhorn’s compensation trend than for Musk’s realized economic gains. This should be kept in mind when interpreting the results.

3. Question 1: How did executive compensation change over time?

3.1 Objective

I want to examine whether executive compensation changed meaningfully across the years and whether those changes were steady or highly uneven.

3.2 Plot 1: Kirkhorn salary vs total compensation

3.2.1 R code and output

q1_comp <- tesla_data %>%
  select(Year, Kirkhorn_Salary, Kirkhorn_Total_Comp) %>%
  pivot_longer(
    cols = c(Kirkhorn_Salary, Kirkhorn_Total_Comp),
    names_to = "Comp_Type",
    values_to = "Amount"
  )

ggplot(q1_comp, aes(x = Year, y = Amount, color = Comp_Type)) +
  geom_line(linewidth = 1.1) +
  geom_point(size = 2.5) +
  scale_y_continuous(labels = label_dollar()) +
  labs(
    title = "Kirkhorn Salary vs Total Compensation",
    x = "Year",
    y = "Amount ($)",
    color = "Compensation Type"
  ) +
  theme_minimal()

3.2.2 Interpretation

The chart shows that Kirkhorn’s salary stayed relatively stable across the years, but his total compensation was extremely volatile. The biggest spike occurred in 2020, when total compensation rose sharply because of a large stock-based grant. After that, total compensation dropped back to a much lower level even though salary stayed around the same range. This suggests that equity awards, not base pay, were the main driver of changes in reported compensation.

3.3 Plot 2: CEO vs CFO proxy-reported compensation

3.3.1 R code and output

q1_compare <- tesla_data %>%
  select(Year, Kirkhorn_Total_Comp, Musk_SCT_Total) %>%
  pivot_longer(
    cols = c(Kirkhorn_Total_Comp, Musk_SCT_Total),
    names_to = "Executive",
    values_to = "Compensation"
  )

ggplot(q1_compare, aes(x = Year, y = Compensation, color = Executive)) +
  geom_line(linewidth = 1.1) +
  geom_point(size = 2.5) +
  scale_y_continuous(labels = label_dollar()) +
  labs(
    title = "Proxy-Reported Compensation: Kirkhorn vs Musk",
    x = "Year",
    y = "Compensation ($)",
    color = "Executive"
  ) +
  theme_minimal()

3.3.2 Interpretation

This comparison shows that Kirkhorn’s compensation was much larger and more volatile than Musk’s Summary Compensation Table values during this period. Musk’s proxy-reported pay appears extremely small because he received no new equity grants in most of these years. This means the proxy figures do not fully represent Musk’s actual wealth creation from earlier option packages, so the chart should be interpreted as a disclosure-based comparison rather than a full economic-pay comparison.

4. Question 2: How did Tesla’s company performance change over time?

4.1 Objective

I want to analyze whether Tesla’s business and market performance improved over time by examining revenue growth, stock price, and stock return.

4.2 Plot 1: Revenue trend

4.2.1 R code and output

ggplot(tesla_data, aes(x = Year, y = Revenue_M)) +
  geom_line(linewidth = 1.1, color = "steelblue") +
  geom_point(size = 2.5, color = "steelblue") +
  scale_y_continuous(labels = label_number(suffix = "M")) +
  labs(
    title = "Tesla Revenue Over Time",
    x = "Year",
    y = "Revenue ($M)"
  ) +
  theme_minimal()

4.2.2 Interpretation

Tesla’s revenue increased every year in the dataset. This indicates strong and consistent top-line growth from 2019 to 2023. The pattern is much smoother than the compensation pattern, which suggests that company growth was steady even when reported compensation changed dramatically.

4.3 Plot 2: Stock price trend

4.3.1 R code and output

ggplot(tesla_data, aes(x = Year, y = Stock_Price)) +
  geom_line(linewidth = 1.1, color = "firebrick") +
  geom_point(size = 2.5, color = "firebrick") +
  scale_y_continuous(labels = label_dollar()) +
  labs(
    title = "Tesla Year-End Stock Price",
    x = "Year",
    y = "Stock Price ($)"
  ) +
  theme_minimal()

4.3.2 Interpretation

The stock price increased sharply from 2019 through 2021, dropped significantly in 2022, and then recovered in 2023. This shows that market performance was much more volatile than revenue. The stock market responded strongly to changing investor expectations, so Tesla’s market performance did not move in a perfectly smooth line like revenue did.

4.4 Plot 3: Revenue growth vs stock return

4.4.1 R code and output

q2_growth <- tesla_data %>%
  select(Year, Revenue_Growth, Stock_Return) %>%
  pivot_longer(
    cols = c(Revenue_Growth, Stock_Return),
    names_to = "Metric",
    values_to = "Rate"
  )

ggplot(q2_growth, aes(x = Year, y = Rate, fill = Metric)) +
  geom_col(position = "dodge") +
  scale_y_continuous(labels = label_percent()) +
  labs(
    title = "Revenue Growth vs Stock Return",
    x = "Year",
    y = "Rate",
    fill = "Metric"
  ) +
  theme_minimal()

4.4.2 Interpretation

This chart shows that revenue growth and stock return did not always move together. Revenue growth stayed positive throughout the period, but stock return changed much more aggressively. This suggests that market performance was influenced by both company fundamentals and investor sentiment, while revenue reflected Tesla’s operating growth more directly.

5. Question 3: Is there a relationship between compensation and company performance?

5.1 Objective

I want to explore whether Kirkhorn’s compensation appears to track Tesla’s revenue and stock performance over time.

5.2 Plot 1: Compensation vs revenue

5.2.1 R code and output

ggplot(tesla_data, aes(x = Kirkhorn_Total_Comp, y = Revenue_M, label = Year)) +
  geom_point(size = 3, color = "purple") +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  geom_text(nudge_y = 2500, size = 3.5) +
  scale_x_continuous(labels = label_dollar()) +
  scale_y_continuous(labels = label_number(suffix = "M")) +
  labs(
    title = "Kirkhorn Compensation vs Tesla Revenue",
    x = "Kirkhorn Total Compensation ($)",
    y = "Revenue ($M)"
  ) +
  theme_minimal()

5.2.2 Interpretation

The scatter plot shows no strong linear relationship between Kirkhorn’s total compensation and Tesla’s revenue. The 2020 point stands out because compensation was very high relative to revenue. In later years, revenue continued to grow but compensation was much lower. This implies that compensation did not move one-for-one with annual revenue and was more affected by grant timing.

5.3 Plot 2: Compensation vs stock price

5.3.1 R code and output

ggplot(tesla_data, aes(x = Kirkhorn_Total_Comp, y = Stock_Price, label = Year)) +
  geom_point(size = 3, color = "darkgreen") +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  geom_text(nudge_y = 8, size = 3.5) +
  scale_x_continuous(labels = label_dollar()) +
  scale_y_continuous(labels = label_dollar()) +
  labs(
    title = "Kirkhorn Compensation vs Tesla Stock Price",
    x = "Kirkhorn Total Compensation ($)",
    y = "Stock Price ($)"
  ) +
  theme_minimal()

5.3.2 Interpretation

This plot also shows that there is not a simple relationship between compensation and stock price. Tesla’s stock price reached high levels even when Kirkhorn’s reported pay was low. This again suggests that annual proxy compensation is not a perfect measure of ongoing pay-for-performance alignment, especially when equity awards are concentrated in certain years.

5.4 Correlation Check

5.4.1 R code and output

correlation_summary <- tibble(
  Metric = c("Compensation vs Revenue", "Compensation vs Stock Price"),
  Correlation = c(
    cor(tesla_data$Kirkhorn_Total_Comp, tesla_data$Revenue_M, use = "complete.obs"),
    cor(tesla_data$Kirkhorn_Total_Comp, tesla_data$Stock_Price, use = "complete.obs")
  )
)

kable(correlation_summary, digits = 3, caption = "Correlation Summary")
Correlation Summary
Metric Correlation
Compensation vs Revenue -0.734
Compensation vs Stock Price -0.102

5.4.2 Interpretation

The correlation results should be interpreted carefully because the dataset is very small and contains a major compensation outlier in 2020. Even if the numeric correlation appears weak or unstable, the visuals make the main point clear: there is no straightforward annual relationship between Kirkhorn’s reported compensation and Tesla’s yearly performance indicators.

6. Conclusion

This analysis shows three main takeaways. First, Kirkhorn’s compensation changed sharply over time, but those changes were mainly driven by stock-based awards rather than salary. Second, Tesla’s revenue increased steadily, while stock performance was much more volatile. Third, there is no simple year-to-year relationship between proxy-reported executive compensation and company performance. The report suggests that Tesla’s compensation structure is heavily influenced by the timing of equity grants, which makes annual proxy figures less useful for judging direct pay-for-performance alignment.

Overall, the dataset supports the idea that Tesla’s executive compensation story is more complicated than a basic comparison of pay and performance. A future extension of this project could compare realized compensation instead of only proxy-reported compensation, or expand the dataset to include other executives for a broader analysis.