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
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.
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.
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")
| 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 |
kable(tesla_data, caption = "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 |
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
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")
| 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 |
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.
I want to examine whether executive compensation changed meaningfully across the years and whether those changes were steady or highly uneven.
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()
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.
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()
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.
I want to analyze whether Tesla’s business and market performance improved over time by examining revenue growth, stock price, and stock return.
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()
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.
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()
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.
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()
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.
I want to explore whether Kirkhorn’s compensation appears to track Tesla’s revenue and stock performance over time.
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()
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.
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()
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.
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")
| Metric | Correlation |
|---|---|
| Compensation vs Revenue | -0.734 |
| Compensation vs Stock Price | -0.102 |
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.
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.