In business, a unicorn is a startup company valued at over US$1 billion which is privately owned and not listed on a share market. This dataset consists of unicorn companies and startups across the globe as of November 2021, including country of origin, sector, select investors, and valuation of each unicorn.
You have been hired as a data analyst for a global venture capital firm that specializes in investing in high-potential start-ups. Your manager is interested in understanding the current landscape of unicorn companies to identify emerging trends and investment opportunities.
Using the unicorn dataset provided, your task is to analyze various factors such as the geographical distribution of unicorns, industry sectors with the highest valuations, funding patterns, and key investors. Your goal is to provide insights that can guide the firm’s investment strategy, highlighting regions and industries with the most growth potential and identifying key investors who frequently back successful unicorns. This analysis will help the firm make data-driven decisions on where to allocate their resources for maximum return on investment.
To provide valuable insights into the dynamic landscape of unicorn companies for a global venture capital firm. The goal is to identify emerging trends, investment opportunities, and key factors contributing to the success of these companies. By analyzing the geography, industry, funding patterns, and key investors, the aim is to guide the firm’s investment strategy and optimize resource allocation for maximum returns. The insights will be presented through an interactive dashboard, showcasing the distribution and characteristics of unicorn companies worldwide.
library(knitr)
library(kableExtra)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::group_rows() masks kableExtra::group_rows()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(lubridate)
library(skimr)
library(janitor)
##
## Attaching package: 'janitor'
##
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(ggplot2)
companies_df <- read.csv("~/Documents/projects/unicorn/Unicorn_Companies.csv")
str(companies_df)
## 'data.frame': 1074 obs. of 18 variables:
## $ Company : chr "Bytedance" "SpaceX" "SHEIN" "Stripe" ...
## $ Valuation...B. : int 180 100 100 95 46 40 40 39 38 38 ...
## $ Date.Joined : chr "4/7/17" "12/1/12" "7/3/18" "1/23/14" ...
## $ Year.Joined : int 2017 2012 2018 2014 2011 2018 2019 2014 2017 2019 ...
## $ Month.Joined : int 4 12 7 1 12 1 5 12 12 2 ...
## $ Day.Joined : int 7 1 3 23 12 8 2 30 20 5 ...
## $ Industry : chr "Artificial intelligence" "Other" "E-commerce & direct-to-consumer" "Fintech" ...
## $ City : chr "Beijing" "Hawthorne" "Shenzhen" "San Francisco" ...
## $ Country : chr "China" "United States" "China" "United States" ...
## $ Continent : chr "Asia" "North America" "Asia" "North America" ...
## $ Years.to.Unicorn: int 5 10 10 4 6 6 7 2 2 6 ...
## $ Year.Founded : int 2012 2002 2008 2010 2005 2012 2012 2012 2015 2013 ...
## $ Funding...B. : num 8 7 2 2 4 0.572 2 3 14 3 ...
## $ Investor.1 : chr "Sequoia Capital China" "Founders Fund" "Tiger Global Management" "Khosla Ventures" ...
## $ Investor.2 : chr " SIG Asia Investments" " Draper Fisher Jurvetson" " Sequoia Capital China" " LowercaseCapital" ...
## $ Investor.3 : chr " Sina Weibo" " Rothenberg Ventures" " Shunwei Capital Partners" " capitalG" ...
## $ Investor.4 : chr " Softbank Group" "" "" "" ...
## $ Investors : chr "Sequoia Capital China, SIG Asia Investments, Sina Weibo, Softbank Group" "Founders Fund, Draper Fisher Jurvetson, Rothenberg Ventures" "Tiger Global Management, Sequoia Capital China, Shunwei Capital Partners" "Khosla Ventures, LowercaseCapital, capitalG" ...
summary(companies_df)
## Company Valuation...B. Date.Joined Year.Joined
## Length:1074 Min. : 1.000 Length:1074 Min. :2007
## Class :character 1st Qu.: 1.000 Class :character 1st Qu.:2019
## Mode :character Median : 2.000 Mode :character Median :2021
## Mean : 3.455 Mean :2020
## 3rd Qu.: 3.000 3rd Qu.:2021
## Max. :180.000 Max. :2022
## Month.Joined Day.Joined Industry City
## Min. : 1.00 Min. : 1.00 Length:1074 Length:1074
## 1st Qu.: 3.00 1st Qu.: 9.00 Class :character Class :character
## Median : 6.00 Median :16.00 Mode :character Mode :character
## Mean : 6.35 Mean :15.82
## 3rd Qu.: 9.00 3rd Qu.:23.00
## Max. :12.00 Max. :31.00
## Country Continent Years.to.Unicorn Year.Founded
## Length:1074 Length:1074 Min. :-4.000 Min. :1919
## Class :character Class :character 1st Qu.: 4.000 1st Qu.:2011
## Mode :character Mode :character Median : 6.000 Median :2014
## Mean : 7.001 Mean :2013
## 3rd Qu.: 9.000 3rd Qu.:2016
## Max. :98.000 Max. :2021
## Funding...B. Investor.1 Investor.2 Investor.3
## Min. : 0.0000 Length:1074 Length:1074 Length:1074
## 1st Qu.: 0.2240 Class :character Class :character Class :character
## Median : 0.3735 Mode :character Mode :character Mode :character
## Mean : 0.5573
## 3rd Qu.: 0.6030
## Max. :14.0000
## Investor.4 Investors
## Length:1074 Length:1074
## Class :character Class :character
## Mode :character Mode :character
##
##
##
head(companies_df)
# count of unicorn startups by sector
sector_counts <- table(companies_df$Industry)
plot_data <- data.frame(Industry = names(sector_counts),
count = as.numeric(sector_counts))
# bar chart showing unicorn startups by sector
ggplot(plot_data, aes(x = reorder(Industry, -count), y = count)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
geom_text(aes(label = count), vjust = 1.3, color = "black") +
labs(x = "Industry", y = "Count") +
theme(panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text.x = element_text(angle = 45, hjust = 1))
# Group by continent and count the number of companies
continent_counts <- companies_df %>%
group_by(Continent) %>%
summarise(total_companies = n()) %>%
arrange(desc(total_companies))
continent_counts$Continent <- factor(continent_counts$Continent, levels = continent_counts$Continent)
ggplot(continent_counts, aes(x = Continent, y = total_companies, fill = Continent)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
labs( x = "Continent", y = "Total Companies") +
theme(panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text.x = element_text(angle = 45, hjust = 1))
# Group by Year Joined and count the number of companies
yearly_counts <- companies_df %>%
group_by(Year.Joined) %>%
summarise(total_companies = n()) %>%
arrange(Year.Joined)
kable(yearly_counts) %>%
kable_styling(full_width = FALSE)
| Year.Joined | total_companies |
|---|---|
| 2007 | 1 |
| 2011 | 2 |
| 2012 | 4 |
| 2013 | 3 |
| 2014 | 13 |
| 2015 | 35 |
| 2016 | 21 |
| 2017 | 44 |
| 2018 | 103 |
| 2019 | 104 |
| 2020 | 108 |
| 2021 | 520 |
| 2022 | 116 |
average_valuation <- companies_df %>%
summarise(avg_valuation = mean(Valuation...B., na.rm = TRUE))
average_valuation
country_summary <- companies_df %>%
group_by(Country) %>%
summarise(
num_companies = n(),
avg_country_valuation = mean(Valuation...B., na.rm = TRUE)
) %>%
arrange(desc(avg_country_valuation))
country_summary
# total valuation for all unicorn companies
total_valuation_all <- sum(companies_df$Valuation...B., na.rm = TRUE)
continent_summary <- companies_df %>%
group_by(Continent) %>%
summarise(
total_valuation = sum(Valuation...B., na.rm = TRUE),
pct_contribution = (total_valuation / total_valuation_all) * 100
) %>%
arrange(desc(pct_contribution))
continent_summary
city_valuation_summary <- companies_df %>%
group_by(City) %>%
summarise(total_valuation = sum(Valuation...B., na.rm = TRUE)) %>%
arrange(desc(total_valuation))
top_10_cities <- head(city_valuation_summary, 10)
top_10_cities$City <- factor(top_10_cities$City, levels = rev(top_10_cities$City))
ggplot(top_10_cities, aes(x = reorder(City, total_valuation), y = total_valuation)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
labs(x = "City", y = "Total Valuation ($B)") +
theme_minimal() +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
coord_flip()
# Estimate each industry's valuation contribution
industry_valuation_summary <- companies_df %>%
group_by(Industry) %>%
summarise(total_valuation = sum(Valuation...B., na.rm = TRUE),
pct_contribution = round(total_valuation / sum(companies_df$Valuation...B., na.rm = TRUE) * 100, 1)) %>%
arrange(desc(total_valuation)) %>%
head(5)
# bubble chart
ggplot(industry_valuation_summary, aes(x = Industry, y = pct_contribution, size = total_valuation)) +
geom_point(color = "blue", alpha = 0.7) +
labs(x = "Industry", y = "% Contribution") +
scale_size_continuous(name = "Total Valuation ($B)", labels = scales::comma) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(size = 15),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10),
legend.title = element_text(size = 10),
legend.text = element_text(size = 10))
avg_valuation_vs_investors <- companies_df %>%
mutate(count_investors = str_count(Investors, "\\,") + 1) %>% # Count number of investors
group_by(count_investors) %>%
summarise(average_valuation = mean(`Valuation...B.`, na.rm = TRUE)) %>%
ungroup()
# bar chart to show average valuation by number of investors
ggplot(avg_valuation_vs_investors, aes(x = factor(count_investors), y = average_valuation)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
scale_x_discrete(name = "Number of Investors") +
scale_y_continuous(name = "Average Valuation ($B)", labels = scales::comma) +
theme_minimal() +
theme(axis.title = element_text(size = 12),
axis.text = element_text(size = 10),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
avg_valuation_vs_investors <- companies_df %>%
mutate(count_investors = str_count(Investors, "\\,") + 1) %>%
group_by(count_investors) %>%
summarise(average_valuation = mean(`Valuation...B.`, na.rm = TRUE)) %>%
ungroup()
# correlation between number of investors and average valuation
correlation <- cor(avg_valuation_vs_investors$count_investors, avg_valuation_vs_investors$average_valuation)
cat(correlation, "\n")
## 0.7839556
# Trim whitespace around Investors column
companies_df$Investors <- stringr::str_trim(companies_df$Investors)
# Count the number of companies each investor group is funding
investors_summary <- companies_df %>%
separate_rows(Investors, sep = ",\\s*") %>% # Separate multiple investors into rows
mutate(Investors = stringr::str_trim(Investors)) %>%
group_by(Investors) %>%
summarise(total_companies = n_distinct(Company)) %>%
arrange(desc(total_companies)) %>%
head(5)
print(investors_summary)
## # A tibble: 5 × 2
## Investors total_companies
## <chr> <int>
## 1 Accel 60
## 2 Tiger Global Management 53
## 3 Andreessen Horowitz 52
## 4 Sequoia Capital China 48
## 5 Insight Partners 47
accel_investments <- companies_df %>%
filter(grepl("Accel", Investors, ignore.case = TRUE))
# number of companies Accel has invested in each industry
accel_industry_summary <- accel_investments %>%
group_by(Industry) %>%
summarise(total_companies = n()) %>%
arrange(desc(total_companies))
print(accel_industry_summary)
## # A tibble: 13 × 2
## Industry total_companies
## <chr> <int>
## 1 Internet software & services 20
## 2 Fintech 14
## 3 E-commerce & direct-to-consumer 9
## 4 Cybersecurity 5
## 5 Supply chain, logistics, & delivery 4
## 6 Health 3
## 7 Artificial intelligence 2
## 8 Auto & transportation 2
## 9 Data management & analytics 2
## 10 Edtech 2
## 11 Other 2
## 12 Hardware 1
## 13 Mobile & telecommunications 1
By focusing on high-growth sectors, strategic locations, and understanding the impact of investor involvement, your company can make informed investment decisions and potentially identify future unicorns.