Exploring Global Billionaire Wealth: The Role of Age, Gender, Country GDP, and Region

Introduction

Source: Magnific Free Images. <https://www.magnific.com/free-photo/financial-growth-investment-success_426493701.htm#fromView=keyword&page=1&position=2&uuid=7176f7a3-d9d0-456e-a5a0-3bb45fa083dc&track=ais_hybrid&query=Money+stock>

For this project, I analyzed the Billionaires dataset from the CORGIS Datasets Project, which has demographic, geographic, and financial records of the world’s wealthiest people. My analysis focuses on three quantitative variables, and two categorical variables. The quantitative variables are wealth.worth in billions (the individual’s net worth in billions of U.S. dollars), demographics.age (the billionaire’s age in years), and location.gdp (the Gross Domestic Product of their home country). The two categorical variables are demographics.gender (identifying whether the individual is male or female) and location.region (the global geographic region they live in).

I chose this dataset because I was personally interested in seeing what affects a person’s success and chances to become a billionaire. I wanted to focus on gender and age because I wanted to see the distribution of those two variables, and if it revealed something deeper socially than just seeing it as a lot of billionaires being one age or gender. I also wanted to see how the distribution looks for each region, and if living in a wealthy country actually matters. The gaps between each gender, age, or region among the wealthy made me very curious, and I aimed to look closer at those.

To clean up the data, I used the select() and filter() functions from the dplyr package. I selected the columns demographics.age, demographics.gender, location.gdp, location.region, and wealth.worth in billions to separate from the other variables I won’t be using. I then filtered each variable, removing observations that would change the way my data looks. When reviewing the data, I saw NA in the gender column, and I saw many zeros in the age column, GDP, gender, and one in region. I assume it’s because those values were missing, so they just used 0 as a placeholder, however I want all my observations to be completely filled out and be accurate, so I filtered those out. To filter out the zeros in age and GDP I used > 0 so R knows to keep every value above 0 from those columns, but I used the Boolean operator != 0 because location.region is a categorical variable. Lastly I removed the NAs in gender with !is.na. This left me with 632 observations.

Cleaning the data

Loading the libraries I’ll need.

library(readr)
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(ggplot2)
library(plotly)

Attaching package: 'plotly'
The following object is masked from 'package:ggplot2':

    last_plot
The following object is masked from 'package:stats':

    filter
The following object is masked from 'package:graphics':

    layout
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ lubridate 1.9.5     ✔ tibble    3.3.1
✔ purrr     1.2.2     ✔ tidyr     1.3.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ plotly::filter() masks dplyr::filter(), stats::filter()
✖ dplyr::lag()     masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(RColorBrewer)

Adding my dataset in RStudio.

billions_df <- readr::read_csv("billionaires.csv")
Rows: 2614 Columns: 22
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (13): name, company.name, company.relationship, company.sector, company....
dbl  (6): rank, year, company.founded, demographics.age, location.gdp, wealt...
lgl  (3): wealth.how.from emerging, wealth.how.was founder, wealth.how.was p...

ℹ 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.

I first cleaned the data by selecting the variables I will be using. When looking over the dataset I noticed that there were a lot of 0s and NA in the columns I wanted to use. If I included these observations, it would drastically change how my multiple linear regression model and two final visualizations look like, so I decided to remove them. I did it all in the filter() function, and then added it to the billions_clean data, reducing the dataset to 632 complete observations.

# Selecting my columns
billions_clean <- select(billions_df, "demographics.age", "demographics.gender", "location.gdp", "location.region", "wealth.worth in billions")

# Filtering out ages that are 0, 0 GDP, NA in gender, and the 0 in region.
billions_clean <- filter(billions_clean, demographics.age > 0, location.gdp > 0, !is.na(demographics.gender), location.region != "0")

Simple Plots

# Simple plot 1: Quantitative 
ggplot(billions_clean, aes(x = demographics.age)) +
  geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value `binwidth`.

# Simple plot 2: Categorical
ggplot(billions_clean, aes(x = demographics.gender)) +
  geom_bar()

These two simple plots helped me find my focus for my two final visualizations. You can see that most billionaires are mostly concentrated between 50 and 80 years old, and that most billionaires are male and they vastly outnumber female billionaires. My final visualizations explore how net worth varies across age, gender, and world regions.

Multiple Linear Regression Analysis

I chose the variables wealth.worth in billions, demographics.age, and location.gdp for my multiple linear regression. I wanted to test and see if being older gives billionaires more years to compound and increase their wealth, and if living in a richer and larger economy helps billionaires becomes even wealthier.

# Predicting net worth & seeing how much of it is explained by age and country GDP.
model <- lm(`wealth.worth in billions` ~ demographics.age + location.gdp, data = billions_clean)
summary(model)

Call:
lm(formula = `wealth.worth in billions` ~ demographics.age + 
    location.gdp, data = billions_clean)

Residuals:
   Min     1Q Median     3Q    Max 
-2.495 -1.811 -1.184  0.158 55.384 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)      2.561e+00  8.064e-01   3.176  0.00157 **
demographics.age 5.585e-03  1.268e-02   0.441  0.65972   
location.gdp     4.752e-14  3.653e-14   1.301  0.19381   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 4.105 on 629 degrees of freedom
Multiple R-squared:  0.003041,  Adjusted R-squared:  -0.0001292 
F-statistic: 0.9593 on 2 and 629 DF,  p-value: 0.3837

The equation I got from this is:

Wealth (in billions) = 2.561 + 0.005585(Age) - 4.752e-14(GDP)

This means that with every extra year of age, it adds about $0.0056 billion (around $5.6 million) to a billionaire’s predicted net worth. Location GDP barely changes the prediction, so a billionaire living in a country with a high or low GDP doesn’t really matter because their net worth depends more on their business.

The P-value I got is 0.3837, meaning that the regression model is not significant. demographics.age (0.65972) and location.gdp (0.19381) have no asterisks which means that they are not a significant predictor of net worth.

The adjusted R^2 value is -0.0001292, or basically 0%. This means that age and location GDP explains nothing about the variation in net worth. The net worth figures are explained by other factors like company industry, inherited wealth, or stock market performance.

Creating my graphs

GGplot graph

For my first graph, I wanted to see if older billionaires are wealthier, and whether male and female billionaires follow the same wealth trends. The variables I used are demographics.age, wealth.worth in billions, and demographics.gender, and I did a scatter-plot because it can show outliers and trend lines.

ggplot(billions_clean, aes(x = demographics.age, y = `wealth.worth in billions`, color = demographics.gender)) +
  geom_point(alpha = 0.3,  size = 2.1) +
  geom_smooth(method = lm, se = FALSE, lty = 2, linewidth = 1.3) +
  scale_color_manual(values = c("#FF7256","#556B2F"),
                    labels = c("Female",
                    "Male")) +
  labs(x = "Age",
       y = "Net worth (in billions)",
       title = "Billionaire Net Worth by Age and Gender",
       caption = "Source: CORGIS Datasets Project",
       color = "Gender") +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

In this chart, the forest green trend-line and dots represent males, and the coral trend-line and dots represent female billionaires. The male trend-line stays fairly constant regardless of age. The female trend-line is upward-sloping, which means that older female billionaires tend to have a higher net worth than younger female billionaires. However, men still make up most of the dataset and outliers, the highest being close to $60 billion dollars. The graph is very compacted ages 50 to 75, and most of them have net worths less than $10 billion.

Interactive graph

For my interactive graph, I decided to explore which parts of the world have the richest billionaires, and I wanted to see thee outliers as well, so that’s why I’ve chosen to use a box plot. The variables I used to create this graph is location.region and wealth.worth in billions.

# Source: CORGIS Datasets Project
p2 <- ggplot(billions_clean, aes(x = location.region, y = `wealth.worth in billions`, fill = location.region)) +
  geom_boxplot(alpha = 0.6) +
  coord_flip() +
  labs(x = "World Region",
       y = "Net worth (in billions)",
       title = "Billionaire Net Worth Distribution by World Region",
       fill = "Regions") +
  scale_fill_brewer(palette = "Paired") +
  theme_bw()
ggplotly(p2)

All the box plots are in the same part of the graph, below $10 billion dollars, and they all have similar median net worth. The highest medians seem to be East Asia, Middle East/North Africa, and Sub-Saharan Africa. the region with the biggest range is East Asia with it being reaching almost $5 billion dollars. The region with the greatest outliers is North America with the highest being close to $60 billion dollars. Since this is an interactive graph, I am able to deselect North America, and I can see that with north america not in the graph, the highest net worth would be 20 billion and it would be from the Middle East/North Africa. That’s interesting because Middle East/ North Africa region only has one outlier, so now I’m wondering who it is.

Conclusion

These two visualizations represent how billionaire net worth varies across individual demographics (age and gender) as well as broader global geography (world regions). There were a few surprising patterns that I’ve found. I was surprised to see the male trend-line stay fairly constant throughout the whole chart, but the female trend-line was upward-sloping even though there’s a smaller portion. This told me that males have a more evenly distributed wealth across those ages, but females have more wealth with age. This made me want to investigate more on why that is. Another surprising thing was the median net worth from the box plots were consistent around $2 to $3 billion across every region. I expected the medians to be more dramatic.

If I could expand my analysis further, I would’ve included the variables wealth.how.industry, and wealth.how.inherited. If I could see how net worth changed depending on industry would be interesting and great for seeing how it possibly explains the net worth of the billionaires. I believe knowing whether or not the money was self-made or inherited could help explain some outliers, and I could see what region it comes from.