Introduction

Who doesn’t want to be rich? Or at the very least, who doesn’t want to make enough to pursue their dreams?

In this report, we’re going to analyze the statistics that make up the billionaire population from around the globe to see what types of trends we can identify and to see how we all stack up against these demographics. We are going to analyze the characteristics of billionaires themselves such as age, gender, birth year, and also greater trends such as what countries and industries seem to hold the most billionaire wealth and billionaires in general.

Kaggle dataset cited URL :https://www.kaggle.com/datasets/nelgiriyewithana/billionaires-statistics-dataset

Dataset

The Billionaires Statistics dataset comes with 35 columns and 2640 rows. The rows add up to the total amount of billionaires listed at the date this file was pulled on April 4th, 2023. It covers demographics about the billionaires such as gender, age, and birth date. It also covers information such as each person’s net worth, country of residence, birth country, industry, and economics of the countries in which the billionaires reside. The dataset could be valuable in giving us insight on where these billionaires reside and how their wealth and population affects the economics of the countries in which they reside with further analysis.

Findings

The findings are quite interesting within the data set. During my analysis, I gained insights about which countries have a higher percentage of billionaire net worth that makes up their GDP, what the gender demographic is for billionaires, and which industries generate the highest net worth and amount of billionaires. Interestingly, different industries take top rank for most billionaires and highest average net worth. Lastly, I gained some interesting insights into the age make-up of the billionaire population. For example, the data set shows a higher count of billionaires born in January compared to all other months.

Scatterplot by Birth Month & Year

The first graph is a count of all of the Billioniares within the data set by birth month and birth year. This is our first demographic analysis of the people within the data set to get an understanding of our billionaire population. Interestingly, there seems to be a higher clustering of billionaires born in January between 1962 and 1967. Could the tech boom of the 1990s be a driver of all of these billionaires? Why are so many more of them born in January?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
from matplotlib.ticker import FuncFormatter
import folium
import seaborn as sns
#Kaggle citation for dataset:https://www.kaggle.com/datasets/nelgiriyewithana/billionaires-statistics-dataset

path = "C:/Users/cford/OneDrive - Loyola University Maryland/Spring 2024/Python/Lesson Download/"
filename = 'Billionaires Statistics Dataset.csv'
df = pd.read_csv(path + filename, skiprows = 0)

#Code cleanup:
dfscatter = df[df['birthYear'].notna()]
#created a new df to plot scatter plot. I wanted to keep the old datafram info in tact in case i need the 76b rows that were removed

dfscatter = dfscatter.groupby(['birthYear','birthMonth'])['personName'].count().reset_index(name='count')
dfscatter=pd.DataFrame(dfscatter)
dfscatter['birthMonth'] = dfscatter['birthMonth'].astype('int') 
dfscatter['birthYear'] = dfscatter['birthYear'].astype('int') 

#I am shortening the range a bit to lessen outliers and make the graph easier to see:
dfscatter = dfscatter.loc[ ~dfscatter['birthYear'].isin(range(1940))]
dfscatter = dfscatter.loc[ ~dfscatter['birthYear'].isin(range(1981,9999))]
dfscatter['count_multiplied'] = round(dfscatter['count']*10,0)
#multiplied by 10 to enhance size of cirles in count
dfscatter = dfscatter.reset_index(drop=True)

#Here's the Graph:
plt.figure(figsize=(10,12))

plt.scatter(dfscatter['birthMonth'],dfscatter['birthYear'],marker='o', cmap='bwr',
           c=dfscatter['count_multiplied'], s=dfscatter['count_multiplied'],edgecolors='black')
plt.title('Count of Billionaires by Birth Month and Birth Year', fontsize=18, fontweight = 'bold')
plt.xlabel('Months of the Year', fontsize=20)
plt.ylabel('Birth Year', fontsize=20)
cbar = plt.colorbar()
cbar.set_label('Number of Billionaires', rotation=270, fontsize=20,color='black', labelpad=30)
cbar.ax.tick_params(labelsize=18)

my_colorbar_ticks = [*range(20,int(dfscatter['count_multiplied'].max()+1),20)]
cbar.set_ticks(my_colorbar_ticks)
#added 1 to the max so that I could populate the max range

my_x_ticks = [*range( dfscatter['birthMonth'].min(), dfscatter['birthMonth'].max()+1,1)]
plt.xticks(my_x_ticks, fontsize=18, color='black')
my_y_ticks = [*range( dfscatter['birthYear'].min(), dfscatter['birthYear'].max()+1,5)]
plt.yticks(my_y_ticks, fontsize=18, color='black')
#I am setting the tick labels back to the normal count so that a viewer doesn't get the impression that there are so many billionaires as the count_multiplied field implies. That field was made purely to enhance the size of the circles in the plot.
my_colorbar_tick_labels = [*range(2, int(dfscatter['count'].max()+1), 2 )]
cbar.set_ticklabels(my_colorbar_tick_labels)


plt.show()

Pie Chart by Gender

We now spin our demographic analysis in a different manner and view our make-up by gender and who is self-made or who isn’t self-made. According to the data, 87% of the billionaires in our population are male and 12.8% are female. Also, 65% of male billionaires are self-made, while only 3.6% of female billionaires are self-made.

This leaves one to ask, what drives the higher number of self-made billionaires who are male and the higher number of male billionaires in general? Are there overarching societal structures that one could study based on these statistics?

# I added these two lines as I had some errors when knitting my rmarkdown code
#Data Prep:

df_pie = df.groupby(['gender','selfMade'])['personName'].count().reset_index()
#I used selfMade column instead of status because it's less confusing to use true and false in my opinion for the groupby
df_pie = pd.DataFrame(df_pie)

#I am changing the names of the SelfMade column to make it easier to tell what it is:

df_pie.selfMade[0] = 'NotSM'
df_pie.selfMade[1] = 'SM'
df_pie.selfMade[2] = 'NotSM'
df_pie.selfMade[3] = 'SM'

df_pie['Concat'] = df_pie['gender'] + ':' +  df_pie['selfMade'].astype(str)
#I concatinated the two columns for my pie chart to make the labels easier to follow
df_pie.columns = ['Gender','SelfMade','Count','Concat']
df_pie = df_pie.sort_values('Count', ascending=False)
df_pie.reset_index(inplace=True, drop=True)
#Setting up Color Maps for a nested pie chart:

number_outside_colors = len(df_pie.Gender.unique())
outside_color_ref_number = np.arange(number_outside_colors)*2

number_inside_colors = len(df_pie.SelfMade.unique())
all_color_ref_number = np.arange(number_outside_colors + number_inside_colors)

inside_color_ref_number = []
for each in all_color_ref_number:
    if each not in outside_color_ref_number:
        inside_color_ref_number.append(each)

#Graphing Pie Chart:
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(1,1,1)

colormap= plt.get_cmap("Set2")
outer_colors = colormap(outside_color_ref_number)

all_count = df_pie.Count.sum()

df_pie.groupby(['Gender'])['Count'].sum().plot(
       kind='pie', radius=1, colors = outer_colors, pctdistance = 0.85, labeldistance = 1.03,
       wedgeprops = dict(edgecolor='w'), textprops= {'fontsize':13},
       autopct = lambda p: '{:.2f}%\n({:.1f})'.format(p,(p/100)*all_count),
       startangle=90)

inner_colors = colormap(inside_color_ref_number)
df_pie.Count.plot(
       kind='pie', radius=0.7, colors = inner_colors, pctdistance = 0.75, labeldistance = 1.13,
       wedgeprops = dict(edgecolor='w'), textprops= {'fontsize':11.5,'ha':'center'},
        labels = df_pie.Concat,
       autopct = '%1.2f%%',
       startangle=90)

hole = plt.Circle((0,0), 0.3, fc='white')
fig1 = plt.gcf()
fig1.gca().add_artist(hole)

ax.yaxis.set_visible(False)
plt.title('Count of Billionaires by Gender \n & Self-Made vs Not Self-Made',fontsize=18)
ax.axis('equal')
plt.tight_layout()
ax.text(0, 0, 'Total Billionaires\n' + str(round(all_count,2)), ha='center', va='center',size=20)

#I added a little caption to the bottom to help the viewer ID what the acronyms mean; the acronyms are to keep the labeling more clean
txt='F = Female and M = Male \n SM=Self Made and NotSM = Not Self Made'
plt.figtext(0.5, 0.01, txt, wrap=True, horizontalalignment='center', fontsize=12)

plt.show()

Heat Map of Average Age by Industry & Country

My next demographical analysis looks at the billionaire population by average age by industry and country. To keep things simple, I have pulled a sample of five eastern countries and five western countries for comparison on average ages. The purpose of this is to get an idea of what age range one is more likely to hit billionaire status in each industry when living in a particular country.

Overall, it looks like the typical age range for our billionaires in this data set is between 55 to 80 years old. Based on this data, I think that one could surmise that if they are just about to enter their thirties like myself, they would have some aging to do before they make their billions!

Interestingly, it looks like the average age of a billionaire in western countries such as the US and Canada seem to be higher than in eastern countries such as China and South Korea. Could it be different cultural values? Could it be different times of economic maturity for each country? Or could it be the dominance of certain industries within different countries?

#Code Prep:
df_heatmap = df.groupby(['country','category']).agg({'age':['mean']}).reset_index()
df_heatmap = pd.DataFrame(df_heatmap)
df_heatmap.columns = ['Country of Residence','Industry','AvgAge']
df_heatmap = df_heatmap.sort_values('AvgAge', ascending=False)
df_heatmap.reset_index(inplace=True, drop=True)
#drop NAs and turn AvgAge into an integer so that it doesn't have a lot of decimal places:
df_heatmap = df_heatmap.dropna()
df_heatmap['AvgAge']=df_heatmap['AvgAge'].astype(int)
#round AvgAge to the nearest whole decimal since it's an age:
df_heatmap['AvgAge'] = round(df_heatmap['AvgAge'],0)
df_heatmap = df_heatmap[df_heatmap['Country of Residence'].isin(['Australia','Canada','China','Germany','Mexico','Singapore','South Korea','France','United States','Vietnam'])]
df_heatmap = pd.pivot_table(df_heatmap, index='Industry', columns='Country of Residence',values='AvgAge')
df_heatmap = df_heatmap.fillna(0)

#Graph:
fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(1, 1, 1)

ax = sns.heatmap(df_heatmap, linewidth = 0.2, annot = True, cmap = 'coolwarm', fmt='.0f',
                square = True, annot_kws={'size':11}, linecolor = 'black',
                 cbar_kws = {'orientation':'vertical'})

plt.title('Heatmap of Average Billionaire Age by Industry and Country \n 5 Western vs 5 Eastern Countries ', fontsize = 18, pad=15)
plt.xlabel('',fontsize=10)
plt.ylabel('',fontsize=10)

plt.yticks(size=12)
plt.xticks(size=12)
cbar = ax.collections[0].colorbar

max_count = df_heatmap.to_numpy().max().astype(int)

my_colorbar_ticks = [*range(10, max_count, 10)]
cbar.set_ticks(my_colorbar_ticks)

#make variable for labels:
my_colorbar_tick_labels = ['{:.0f}'.format(each) for each in my_colorbar_ticks]
cbar.set_ticklabels(my_colorbar_tick_labels)

cbar.set_label('Average Age', rotation = 270, fontsize=14, color = 'black', labelpad=20)


plt.show()
*Zero has been used to fill in tiles where no billionaires exist

*Zero has been used to fill in tiles where no billionaires exist

Dual Axis Chart Average Networth by Industry

Now, we shift away from viewing the specific demographic of our billionaires and move to study the industries and countries in which they reside more specifically. Our next two graphs analyze the count of billionaires by Industry and the average net worth of a billionaire by Industry. In this first graph, we sort the top ten industries by the highest average net worth. Within this graph, we see that Automotive comes in much higher than the rest, followed by Telecom and Fashion & Retail. Also, there seems to be a sizable drop (roughly $1B) between the sixth (Technology) and seventh (Diversified) industries. What about those last four industries could be the drivers in them leveling off?

Interestingly, there seem to be a relatively low count of billionaires within the Automotive and Telecom industries when compared to other ones like Fashion & Retail or Technology, despite the higher average net worth. What could be the cause of lower counts of billionaires in certain industries? Could it be the social popularity of certain industries? Could it be higher barriers to entry in others?

#Code Clean Prep:
df_dual2 = df.groupby(['category']).agg({'category':['count'], 'finalWorth':['sum','mean']}).reset_index()
df_dual2 = pd.DataFrame(df_dual2)
df_dual2.columns = ['Industry','Count','TotalNetWorth','AvgNetWorth']
df_dual2 = df_dual2.sort_values('AvgNetWorth', ascending=False)
df_dual2.reset_index(inplace=True, drop=True)
bottom1 = 0
top2 = 9
df_dual2 = df_dual2.loc[bottom1:top2]

def autolabel(these_bars, this_ax, place_of_decimals, symbol):
    for each_bar in these_bars: 
        height = each_bar.get_height()
        this_ax.text(each_bar.get_x()+each_bar.get_width()/2, height*1.01, symbol+format(height, place_of_decimals),
                    fontsize=15, color='black', ha='center', va = 'bottom')

#Graph:
#Plot Graph 2.2 (graph sorted by top 10 industries with highest Avg Net worths instead):

fig = plt.figure(figsize=(20,30))
ax1 = fig.add_subplot(1, 1, 1)
ax2 = ax1.twinx()
bar_width = 0.4

#left axis side:
x_pos = np.arange(top2+1)
count_bars = ax1.bar(x_pos-(0.5*bar_width), df_dual2.Count, bar_width, color = 'gold', edgecolor = 'black', label = 'Count of Billionaires')

#the right axis bars:
avg_networth_bars = ax2.bar(x_pos+(0.5*bar_width), df_dual2.AvgNetWorth/1000, bar_width, color = 'green', edgecolor = 'black', label = 'Average Net Worth')


ax1.set_ylabel('Count of Billionaires', fontsize=25, labelpad=20)
ax2.set_ylabel('Average Net Worth (Billions)', fontsize=25, rotation=270, labelpad=30)
ax1.tick_params(axis='y', labelsize=20)
ax2.tick_params(axis='y',labelsize=20)

plt.title('Count of Billionaires and their Average Net Worth\n Top 10 Industries by Average Net Worth', fontsize = 28)
ax1.set_xticks(x_pos)
ax1.set_xticklabels(df_dual2.Industry, fontsize=20, rotation=90)

#Adding Legend:
count_color, count_label = ax1.get_legend_handles_labels()
fine_color, fine_label = ax2.get_legend_handles_labels()
legend = ax1.legend(count_color + fine_color, count_label + fine_label, loc='upper left', frameon=True, ncol=1, shadow=True,
                   borderpad=1, fontsize=22)
#adjusting y-lim down for the legend:
ax1.set_ylim(0, df_dual2.Count.max()*1.2)
ax2.set_ylim(0, df_dual2.AvgNetWorth.max()/1000*1.12)
autolabel(count_bars, ax1, '.0f','')
autolabel(avg_networth_bars, ax2, '.2f','$')

#Adding $ and B to second y axis so that it is more clear what the averages represent:
ax2.yaxis.set_major_formatter(FuncFormatter( lambda x, pos: ('$%1.1fB')%(x)))

plt.show()

Dual Axis Chart Count of Billionaires by Industry

The next graph goes in part with the last graph, but is now analyzing the top ten industries by billionaire count. What I find interesting, is that the top ten industries with the most billionaires is not one-for-one with the industries with the highest average billionaire net worth. For example, Finance & Investments has the highest count of billionaires in all industries when it did not crack the top ten list for highest average net worth.

As we saw in the other graph, there appear to be steep drop offs in the number of billionaires by industry with the max being 372 within Finance & Investments and our tenth spot having 91 billionaires within Media & Entertainment.

#Code Clean Prep:
df_dual = df.groupby(['category']).agg({'category':['count'], 'finalWorth':['sum','mean']}).reset_index()
df_dual = pd.DataFrame(df_dual)
df_dual.columns = ['Industry','Count','TotalNetWorth','AvgNetWorth']
df_dual = df_dual.sort_values('Count', ascending=False)
df_dual.reset_index(inplace=True, drop=True)
bottom1 = 0
top2 = 9
df_dual = df_dual.loc[bottom1:top2]

def autolabel(these_bars, this_ax, place_of_decimals, symbol):
    for each_bar in these_bars: 
        height = each_bar.get_height()
        this_ax.text(each_bar.get_x()+each_bar.get_width()/2, height*1.01, symbol+format(height, place_of_decimals),
                    fontsize=15, color='black', ha='center', va = 'bottom')

#Graph:
#Plot Graph 2.1 (graph sorted by top 10 industries with most billionaires instead):

fig = plt.figure(figsize=(20,30))
ax1 = fig.add_subplot(1, 1, 1)
ax2 = ax1.twinx()
bar_width = 0.4

#left axis side:
x_pos = np.arange(top2+1)
count_bars = ax1.bar(x_pos-(0.5*bar_width), df_dual.Count, bar_width, color = 'gold', edgecolor = 'black', label = 'Count of Billionaires')

#the right axis bars:
avg_networth_bars = ax2.bar(x_pos+(0.5*bar_width), df_dual.AvgNetWorth/1000, bar_width, color = 'green', edgecolor = 'black', label = 'Average Net Worth')


ax1.set_xlabel('Industry', fontsize=25)
ax1.set_ylabel('Count of Billionaires', fontsize=25, labelpad=20)
ax2.set_ylabel('Average Net Worth (Billions)', fontsize=25, rotation=270, labelpad=30)
ax1.tick_params(axis='y', labelsize=20)
ax2.tick_params(axis='y',labelsize=20)

plt.title('Count of Billionaires and their Average Net Worth\n Top 10 Industries by Billionaire Count', fontsize = 28)
ax1.set_xticks(x_pos)
ax1.set_xticklabels(df_dual.Industry, fontsize=20, rotation=90)

#Adding Legend:
count_color, count_label = ax1.get_legend_handles_labels()
fine_color, fine_label = ax2.get_legend_handles_labels()
legend = ax1.legend(count_color + fine_color, count_label + fine_label, loc='upper left', frameon=True, ncol=1, shadow=True,
                   borderpad=1, fontsize=22)
#adjusting y-lim down for the legend:
ax1.set_ylim(0, df_dual.Count.max()*1.20)
autolabel(count_bars, ax1, '.0f','')
autolabel(avg_networth_bars, ax2, '.2f','$')

#Adding $ and B to second y axis so that it is more clear what the averages represent:
ax2.yaxis.set_major_formatter(FuncFormatter( lambda x, pos: ('$%1.1fB')%(x)))

plt.show()

Bump Chart Ranking Countries & Industries

My next graph zooms out further and is being used to get a ranking of countries with the most billionaires. Here you will find a ranking of countries with more than 25 billionaires by industry. What’s interesting, is that there are only three countries that crack more than 25 billionaires by any single industry: the United States, China, and India, with the US holding the majority of spots at #1. We see that China has taken the top spot within the Healthcare and Manufacturing industries by a wide margin vs the other two countries.

I find it interesting that China is so much higher ranked in Healthcare with the number of billionaires. What is it about the healthcare industry in China that has led to more billionaires there than within the US or another western country?

#Data Prep:
df_bump = df.groupby(['country','category']).agg({'category':['count']}).reset_index()
df_bump = pd.DataFrame(df_bump)
df_bump.columns = ['Country of Residence','Industry','Count']
df_bump = df_bump.sort_values('Count', ascending=False)
df_bump.reset_index(inplace=True, drop=True) 
df_bump = df_bump[df_bump.Count.astype(int)>=25]
df_bump = df_bump.pivot(index='Country of Residence',columns='Industry',values = 'Count')
df_bump = df_bump.fillna(0)
df_bump_ranked = df_bump.rank(0, ascending=False, method='max')
df_bump_ranked = df_bump_ranked.T


#Graph
fig = plt.figure(figsize=(35, 30))
#30,26
ax = fig.add_subplot(1, 1, 1)

df_bump_ranked.plot(kind = 'line', ax=ax, marker='o', markeredgewidth=1, linewidth=8,
                   markersize=84,
                   markerfacecolor='white', colormap = 'Set1')

#labels is an automatic way to fill out the xaxis:
labels = df_bump_ranked.index

ax.invert_yaxis()

num_rows = df_bump_ranked.shape[0]
num_cols = df_bump_ranked.shape[1]

plt.ylabel('Country Ranking', fontsize=30, labelpad=10)
plt.title('Ranking of Countries with more than 25 Billionaires by Industry \n Bump Chart', fontsize = 40, pad=15)

plt.xticks(np.arange(num_rows),labels, fontsize=26, rotation = 45)
plt.yticks(range(1,num_cols+1, 1), fontsize=30)
ax.legend(bbox_to_anchor=(1.01, 1.01),fontsize=21,
         labelspacing=1,
         markerscale = .4,
         handletextpad = 0.8)

i = 0
j = 0
for eachcol in df_bump_ranked.columns:
    for eachrow in df_bump_ranked.index:
        this_rank = df_bump_ranked.iloc[i,j]
        ax.text(i, this_rank, str(round(df_bump.iloc[j,i])), ha='center', va='center', fontsize=26)
        i+=1
    j+=1
    i=0

plt.show()        

Stacked Bar Chart: Billionaire Worth as % GDP

Our final graph zooms out and compares the macroeconomics of the countries in which our billionaires reside to the GDP of the countries themselves. How much of the billionaire net worth makes up a percentage of each country’s GDP? To keep my analysis readable, I limited the study to 19 countries, which made up 230 rows of the data set. This graph could be useful in studying wealth distributions in different countries when billionaire wealth is viewed as a percentage of the entire GDP of a country.

One note that I find very surprising is how much of Switzerland’s GDP is made up of billionaire net worth at nearly 60%! The highest industries look to be Logistics and Finance & Investments. Could the high percentage within Finance be due to lucrative Swiss bank accounts that foreign investors covet? What is it about the Swiss business practices that has lead to such a high distribution of billionaire wealth among the population?

#Data Prep:

#create new df so that i don't mess up original and cleaning data:
df2 = df
df2 = pd.DataFrame(df2)

#converting gdp_country into float by removing some string info that is hanging up the parsing:
df2['gdp_country'] = df2['gdp_country'].str.replace('$', '')
df2['gdp_country'] = df2['gdp_country'].str.replace(',', '')
df2['gdp_country']=df2['gdp_country'].astype(str).astype(float)

#get rid of NAs because it is causing errors (only dropped 164 rows):
df2.dropna(subset=['gdp_country'], inplace=True)
#chagning finalworth to same type of integer
df2['finalWorth']=df2['finalWorth'].astype(int)
df2['gdp_country']=df2['gdp_country']/1000000
df2['gdp_country']=df2['gdp_country'].astype(int)

#adding networth as % of GDP column:
df2['nw_%_of_GDP'] = df2['finalWorth'] / df2['gdp_country'] 
df2['nw_%_of_GDP'] = round(df2['nw_%_of_GDP']*100,2)
df_stacked = df2.groupby(['country','category']).agg({'gdp_country':['max'],'finalWorth':['sum'],'nw_%_of_GDP':['sum']}).reset_index()
df_stacked = pd.DataFrame(df_stacked)
df_stacked.columns = ['Country of Residence','Industry','Country GDP', 'Net Worth','NetWorth as % of GDP']
df_stacked = df_stacked.sort_values('Country GDP', ascending=False)
df_stacked.reset_index(inplace=True, drop=True)

#shortening the list to make it easier to graph:
df_stacked = df_stacked[0:230]

#pivoting data for stacked bar chart:
df_stacked = df_stacked.pivot(index='Country of Residence',columns = 'Industry', values='NetWorth as % of GDP')
#changing NAs to 0%
df_stacked= df_stacked.fillna(0)

#Graph:
fig=plt.figure(figsize=(16, 18))
ax=fig.add_subplot(1, 1, 1)

df_stacked.plot(kind='bar', stacked=True, ax=ax, colormap = 'tab20')

plt.legend(loc = 'upper center', fontsize=12, frameon=True,ncol=5, shadow = True)

#move the y-lim up so that the legend does not interfere with the bars
ax.set_ylim(0, df_stacked.values.max()*5)
plt.ylabel('Net Worth as % of GDP', fontsize = 18, labelpad=10)
plt.title('Billionaire Net Worth as % of Country GDP \n Stacked Bar Plot', fontsize = 22)
plt.xticks(rotation=90, horizontalalignment = 'center', fontsize = 16)
plt.yticks(fontsize=14)
plt.xlabel('',fontsize=10)

plt.show()

Conclusion

Sadly, our foray into studying the elite business population of the world has come to an end, but I believe that some very interesting insights have been gained from this analysis, such as what average age you can expect to be when you have your billions, what industries you’re more likely to make your billions, and which countries you will have an easier time in achieving elite status.

Some questions that I derived during this that would be worth further research are:

  1. Why does Switzerland have a high ratio of billionaire net worth to GDP?
  2. Why do some industries generate more billionaires?
  3. Why do some industries generate more billionaire net worth?
  4. Why are so many more billionaires born in the month of January vs all others?
  5. Why are there so many more male billionaires than female billionaires?