Carga de datos

Es necesario cargar los datos del archivo csv, utilizando el paquete readr.

# Cargamos la librería
library(readr)
## Warning: package 'readr' was built under R version 4.2.3
# Escribimos el directorio en donde está el archivo:
dir <- paste0(dirname(rstudioapi::getActiveDocumentContext()$path),"/Dataset/2021_Inc_5000.csv")
data <- read.csv2(dir)
raw_data = data

Mostramos el encabezado para confirmar la correcta carga de los datos.

head(data)
##       Id Rank           Company Workers Previous_Workers FM_Ratio CEO_Gender
## 1  71106 3801        E-file.com       1                1        0       Male
## 2  88352 4860        Flexisales       1                1        0       Male
## 3 107673   71           BRUMATE       1               26        0       Male
## 4 121419  137   SmarterVitamins       1                1        0       Male
## 5 122159  457 Universal Spartan       1                1        0       Male
## 6 122403  565        BELDT Labs       1                1        0       Male
##   CEO_Age              Website State_Code      State               City Growth
## 1      58           e-file.com         FL    Florida  Ponte Vedra Beach     86
## 2      43       flexisales.com         NV     Nevada          Las Vegas     44
## 3      54          brumate.com         CO   Colorado             Denver   5320
## 4      48  smartervitamins.com         FL    Florida Green Cove Springs   2992
## 5      46 universalspartan.com         KY   Kentucky         Vine Grove   1052
## 6      54            beldt.com         CA California       Sherman Oaks    850
##    Revenue Funding Ifc_ifiid                     Industry Inter_Pres Ifc_Ifmid
## 1   9.49 M 0.086 M         4 Consumer Products & Services       TRUE     27260
## 2    2.9 M 0.061 M         5      Advertising & Marketing      FALSE     29820
## 3 109.49 M 0.319 M        18                       Retail       TRUE     19740
## 4   5.76 M 0.174 M        18                       Retail       TRUE     27260
## 5   2.06 M 0.013 M         6   Logistics & Transportation       TRUE     21060
## 6   6.28 M 0.070 M        10                       Health       TRUE     31080
##   Zipcode Founded
## 1   32082    2011
## 2   89179    2011
## 3   80202    2016
## 4   32043    2016
## 5   40175    2013
## 6   91423    2013
##                                                                                                              Business_Model
## 1                                                         Provides affordable online income tax software to U.S. taxpayers.
## 2 Offers marketing services to SMBs and large enterprise companies that strive to identify new opportunities and customers.
## 3                        Sells insulated drinkware and coolers designed to keep adult beverages at the perfect temperature.
## 4                                Manufactures high-quality, affordable supplements, including vitamins, minerals and herbs.
## 5                        Provides responsive, complete and compliant sourcing solutions for the public and private sectors.
## 6                 Designer, developer and seller of performance nutritional products for high-intensity endurance athletes.
##   Yrs_On_List
## 1           1
## 2           2
## 3           2
## 4           1
## 5           1
## 6           1

Descripción del dataset

El dataset “2021 Inc. 5000” corresponde a una de las listas anuales publicadas por Inc. Magazine. En específico, esta lista se refiere al año 2021 y destaca a las 5000 empresas privadas en Estados Unidos que han experimentado un crecimiento excepcional, tal como lo reconoce la mencionada revista. Este conjunto de datos no solo incluye información sobre la clasificación de estas empresas y sus nombres, sino también detalles relevantes como el número de empleados, la ubicación geográfica, el género de sus CEO, la industria en la que operan y sus ganancias. Al analizar este conjunto de datos, es posible identificar patrones y tendencias que podrían arrojar luz sobre los factores asociados con el crecimiento sostenido de estas empresas.

Es necesario aclarar que el archivo .csv original contaba con un total de 38 columnas, las cuales varias estaban vacías o contenían información completamente irrelevante e incompleta, por lo cual se decidió previamente eliminar estas columnas utilizando la herramienta de Power Query de Excel.

Presentamos las columnas del conjunto de datos y proporcionamos una explicación detallada del contenido de cada variable.

str(data, vec.len=1)
## 'data.frame':    5001 obs. of  23 variables:
##  $ Id              : int  71106 88352 ...
##  $ Rank            : int  3801 4860 ...
##  $ Company         : chr  "E-file.com" ...
##  $ Workers         : int  1 1 ...
##  $ Previous_Workers: int  1 1 ...
##  $ FM_Ratio        : chr  "0" ...
##  $ CEO_Gender      : chr  "Male" ...
##  $ CEO_Age         : int  58 43 ...
##  $ Website         : chr  "e-file.com" ...
##  $ State_Code      : chr  "FL" ...
##  $ State           : chr  "Florida" ...
##  $ City            : chr  "Ponte Vedra Beach" ...
##  $ Growth          : int  86 44 ...
##  $ Revenue         : chr  "9.49 M" ...
##  $ Funding         : chr  "0.086 M" ...
##  $ Ifc_ifiid       : int  4 5 ...
##  $ Industry        : chr  "Consumer Products & Services" ...
##  $ Inter_Pres      : logi  TRUE ...
##  $ Ifc_Ifmid       : int  27260 29820 ...
##  $ Zipcode         : int  32082 89179 ...
##  $ Founded         : int  2011 2011 ...
##  $ Business_Model  : chr  "Provides affordable online income tax software to U.S. taxpayers." ...
##  $ Yrs_On_List     : int  1 2 ...

Con un total de 5001 observaciones en 23 variables.

Las columnas presentes en el dataset se describen a continuación:

Observando el detalle de cada columna, vemos que no todas serán necesarias para el presente análisis, por lo cual se toma la decisión de no trabajar con las siguientes columnas: Id, Website, State_Code, Ifc_ifiid, Ifc_Ifmid, Zipcode, y Business_Model, quedando un total de 16 columnas.

Para realizar esta tarea es útil la librería dyplr.

# Cargar la librería dyplr
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
## 
## 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
# Establecer las columnas a eliminar
columnas_a_eliminar <- c("Id", "Website", "State_Code", "Ifc_ifiid", "Ifc_Ifmid", "Zipcode", "Business_Model")

# Filtrar las columnas deseadas
data <- data %>%
  select(-all_of(columnas_a_eliminar)) # Se seleccionan todas las columnas excepto las especificadas
head(data)
##   Rank           Company Workers Previous_Workers FM_Ratio CEO_Gender CEO_Age
## 1 3801        E-file.com       1                1        0       Male      58
## 2 4860        Flexisales       1                1        0       Male      43
## 3   71           BRUMATE       1               26        0       Male      54
## 4  137   SmarterVitamins       1                1        0       Male      48
## 5  457 Universal Spartan       1                1        0       Male      46
## 6  565        BELDT Labs       1                1        0       Male      54
##        State               City Growth  Revenue Funding
## 1    Florida  Ponte Vedra Beach     86   9.49 M 0.086 M
## 2     Nevada          Las Vegas     44    2.9 M 0.061 M
## 3   Colorado             Denver   5320 109.49 M 0.319 M
## 4    Florida Green Cove Springs   2992   5.76 M 0.174 M
## 5   Kentucky         Vine Grove   1052   2.06 M 0.013 M
## 6 California       Sherman Oaks    850   6.28 M 0.070 M
##                       Industry Inter_Pres Founded Yrs_On_List
## 1 Consumer Products & Services       TRUE    2011           1
## 2      Advertising & Marketing      FALSE    2011           2
## 3                       Retail       TRUE    2016           2
## 4                       Retail       TRUE    2016           1
## 5   Logistics & Transportation       TRUE    2013           1
## 6                       Health       TRUE    2013           1

Transformación y limpieza de datos

Es necesario transformar datos que están en un formato incorrecto para su análisis, mencionado anteriormente en la descripción de las columnas del dataset.

Variables con cadenas de texto

Algunas variables pueden presentar valores ausentes, pero figurando como cadenas de texto vacías, por lo que será necesario transformarlas a valores NA. Las variables que pueden presentar estas situaciones son: State, City, e Industry

data <- data %>%
  mutate(City = ifelse(City == "", NA, City),
         State = ifelse(State == "", NA, State),
         Industry = ifelse(Industry == "", NA, Industry))

Además es posible que estas variables presenten valores “duplicados” por errores ortográficos o la presencia de mayúsculas en la cadena de texto, Será necesario convertir a un formato apropiado todos los registros de estas variables. Para realizar esta operación se utiliza la librería stringr

# Cargar la librería stringr
library(stringr)

# Transformar los datos con la función str_to_title
data <- data %>%
  mutate(State = str_to_title(State),
         City = str_to_title(City),
         Industry = str_to_title(Industry))

Por otra parte, la variable FM_Ratio parece presentarse como cadena de caracteres, cuando debería ser un número:

data <- data %>%
  mutate(FM_Ratio = parse_number(FM_Ratio))

Revenue/Funding

Estas variables presentan los datos como cadenas de caracteres, por lo tanto lo primero será eliminar la letra ‘M’ al final de cada valor, que indica que este se presenta en millones de dólares. Esta acción se realiza fácilmente con la librería Dplyr. Lo correcto sería expresar todo en millones de dólares, por lo que si el registro dice ‘M’, se realiza la conversión adecuada.

library(dplyr)

data <- data %>%
  mutate(Revenue = parse_number(Revenue, na=''),
         Funding = parse_number(Funding, na=''))

# La función parse_number recorta todo caracter antes y después del primer número que encuentra al recorrer la cadena de texto.

Podemos presentar los valores únicos de cada variable, para verificar visualmente algún error.

unique(data$State)
##  [1] "Florida"              "Nevada"               "Colorado"            
##  [4] "Kentucky"             "California"           "Texas"               
##  [7] "Utah"                 "Washington"           "Arizona"             
## [10] "Alabama"              "Minnesota"            "Louisiana"           
## [13] "Pennsylvania"         "Missouri"             "New York"            
## [16] "Idaho"                "Virginia"             "Illinois"            
## [19] "Vermont"              "Ohio"                 "Iowa"                
## [22] "Tennessee"            "Maryland"             "Massachusetts"       
## [25] "New Jersey"           "North Carolina"       "Oregon"              
## [28] "Georgia"              "District Of Columbia" "South Carolina"      
## [31] "Indiana"              "Oklahoma"             "Michigan"            
## [34] "Nebraska"             NA                     "West Virginia"       
## [37] "Connecticut"          "Kansas"               "Wisconsin"           
## [40] "Delaware"             "Hawaii"               "Montana"             
## [43] "Maine"                "Rhode Island"         "South Dakota"        
## [46] "New Hampshire"        "New Mexico"           "Mississippi"         
## [49] "Wyoming"              "Arkansas"             "North Dakota"        
## [52] "Alaska"               "Puerto Rico"

Visualmente, la variable State no presenta valores erróneos.

length(unique(data$City))
## [1] 1439

Dado que la variable City presenta 1439 valores únicos, no sería conveniente presentar los valores únicos. Una forma útil de verificar valores erróneos sería mostrar valores con una longitud menor o igual a 3.

data %>%
  filter(nchar(City) <= 3) %>%
  distinct(City, State)
##   City        State
## 1  Roy         Utah
## 2  Gap Pennsylvania
## 3   Ut         Utah
## 4   Sf   California
## 5   Ny     New York
## 6  Tea South Dakota
## 7   #2     Colorado
## 8  Nyc     New York

Esta consulta nos muestra algunos registros que podrían ser un error, tal es el caso de “Ny”, o “Nyc”, o “#2”. Podemos corregirlos manualmente:

data$City[which(data$City == "Sf")] = "San Francisco"
data$City[which(data$City == "Ny" | data$City == "Nyc" | data$City == "New York City")] = "New York"
data$City[which(data$City == "#2" | data$City == "Ut")] = NA

Valores ausentes

Además, necesitamos verificar si es que el dataset contiene valores faltantes, para lo cual

colSums(is.na(data))
##             Rank          Company          Workers Previous_Workers 
##                0                0                0                0 
##         FM_Ratio       CEO_Gender          CEO_Age            State 
##              238                0                0                5 
##             City           Growth          Revenue          Funding 
##                2                0                0                0 
##         Industry       Inter_Pres          Founded      Yrs_On_List 
##                0                0                0                0

Al analizar las sumas por columnas, se observa que la variable State contiene 5 valores faltantes, mientras que la variable City registra 2 valores faltantes. La omisión de estas filas en el análisis no supone una pérdida significativa de información, dada la presencia de 5000 registros completos en el conjunto de datos. Por consiguiente, se ha decidido desestimar por completo estas ausencias, ya que las restantes variables correspondientes en estos registros se encuentran debidamente completas.

Por otra parte, la variable FM_Ratio también presenta valores ausentes, 64 en total, pero tampoco representan una pérdida significante de información con respecto a la gran cantidad de registros con los que se cuenta.

Análisis univariado

El próximo paso es analizar individualmente cada variable y sacar conclusiones presentando gráficos y diversos estadísticos que aporten información valiosa sobre el conjunto de datos.

Dado que la variable Rank y Company son variables categóricas, se omite su análisis pero se las utiliza posteriormente para complementar otros análisis uni y bivariados.

Trabajadores

Esta variable numérica discreta indica la cantidad de trabajadores con los que cuenta la empresa en el momento de la creación de la lista. Un resúmen de esta variable es el siguiente:

# Resúmen
summary(data$Workers)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     1.0    21.0    47.0   212.1   120.0 72076.0

Este resumen muestra una enorme dispersión teniendo en cuenta el rango total, por lo cual la media de 212.1 no es una buena estimación de la posición central, en cambio la mediana de 47 trabajadores sí puede funcionar como una buena estimación. Esta afirmación está apoyada por el rango intercuartílico, la diferencia entre el tercer y primer cuartil:

IQR(data$Workers)
## [1] 99
cat("Compañía con la mayor cantidad de trabajadores es:", data$Company[which.max(data$Workers)])
## Compañía con la mayor cantidad de trabajadores es: Allied Universal
length(data$Workers[data$Workers == 1]) # Esto muestra que varias compañías presentan un solo trabajador
## [1] 17

Para presentar la dispersión mencionada, se puede generar un boxplot, utilizando la librería ggplot2

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
# Gráfico
ggplot(data, aes(x=0, y=Workers)) +
  geom_violin(width=0.4, alpha=0.2) + geom_boxplot(width=0.1) + 
  ggtitle("Boxplot de la variable Workers") +
  ylab('Cantidad de trabajadores')

Este gráfico es completamente ininteligible, ya que la dispersión en esta variable es muy grande. Por otro lado, una transformación del eje de cantidades a una escala logaritmica nos permite ver con mayor claridad la concentración de esta variable en valores bajos.

# Gráfico
ggplot(data, aes(x=0, y=Workers)) +
  geom_violin(width=0.4, alpha=0.2) + geom_boxplot(width=0.1) + 
  ggtitle("Boxplot de la variable Workers") +
  ylab('Cantidad de trabajadores') +
  scale_y_continuous(trans='log2')

El mismo resultado puede verse en un histograma, incluso trabajando sin los valores extremos superiores a 10000 por ejemplo.

new_data <- data

# Gráfico
ggplot(new_data, aes(x=Workers)) +
  geom_histogram(bins=15, color='black', fill='white') +
  ggtitle("Histograma de la variable Workers") +
  ylab('Cantidad de trabajadores')

Finalmente podemos hacer un análisis de normalidad utilizando una comparación con la distribución teórica normal de los cuantiles.

ggplot(data, aes(sample=Workers)) +
  stat_qq() + stat_qq_line() +
  ggtitle("QQplot de la variable Workers")

La cual muestra el resultado esperado de una falta de normalidad.

Trabajadores anteriores

Un análisis similar al realizado con la variable Workers se puede realizar con la variable Previous_Workers. Un resumen de esta variable es el siguiente:

summary(data$Previous_Workers)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     1.0     8.0    20.0   105.5    52.0 38400.0

En donde observamos un resultado similar al de la variable Workers, una gran dispersión, en donde la media no resulta útil como estimación de la posición central, y en su lugar resulta más representativa la mediana, de 20 trabajadores. Un boxplot, un histograma, y un análisis de cuantil-cuantil se presenta a continuación:

# Boxplot
pw_boxplot <- ggplot(data, aes(x=0, y=Previous_Workers)) +
  geom_violin(width=0.4, alpha=0.2) + geom_boxplot(width=0.1) + 
  ggtitle("Boxplot de la variable Previous_Workers") +
  ylab('Cantidad de trabajadores anteriormente')

# Histograma
pw_histograma <- ggplot(data, aes(x=Previous_Workers)) +
  geom_histogram(bins=15, color='black', fill='white') +
  ggtitle("Histograma de la variable Previous_Workers") +
  ylab('Cantidad de trabajadores anteriormente')

# QQ-plot
pw_qqplot <- ggplot(data, aes(sample=Previous_Workers)) +
  stat_qq() + stat_qq_line() +
  ggtitle("QQplot de la variable Previous_Workers")

# Librería cowplot
library(cowplot)
## Warning: package 'cowplot' was built under R version 4.2.3
plot_grid(pw_boxplot, pw_histograma, pw_qqplot, nrow=1)

El resultado y las conclusiones son similares a la variable Workers.

Crecimiento del número de trabajadores

Se puede realizar otro análisis al observar la diferencia entre la cantidad de trabajadores al momento de la creación de la lista con respecto a la cantidad que existía en un momento anterior. Es posible crear una nueva variable a partir de esto, llamada por ejemplo Workers_Growth.

# Creación de la nueva variable
data <- data %>%
  mutate(Workers_Growth = round(((Workers - Previous_Workers)/Previous_Workers) * 100,2))

# Primeros valores
head(data$Workers_Growth)
## [1]   0.00   0.00 -96.15   0.00   0.00   0.00

Un resumen de esta nueva variable es el siguiente:

summary(data$Workers_Growth)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##   -96.15    50.77   114.29   257.65   248.53 18200.00

En esta consulta vemos gran variabilidad, incluso el valor mínimo es de -96%, es decir que la empresa disminuyó su tamaño con respecto a un tiempo anterior. El valor máximo es de 18200% de crecimiento en el número de trabajadores. Dado que la dispersión es grande, la media no es una buena estimación de la posición central, en cambio, la mediana, de 114% de crecimiento, sí es una buena estimación. Con esto podemos concluir que la mayoría de las empresas aumentaron su cantidad de empleados en un poco más del doble.

paste0("Compañía con el mayor crecimiento en el número de trabajadores: ", data$Company[which.max(data$Workers_Growth)], ", con un crecimiento de ", max(data$Workers_Growth), "% en el número de empleados")
## [1] "Compañía con el mayor crecimiento en el número de trabajadores: IDIQ, con un crecimiento de 18200% en el número de empleados"

Las compañías con mayor crecimiento en el número de sus trabajadores fueron:

data %>% select(Company, Previous_Workers, Workers, Workers_Growth) %>% arrange(desc(Workers_Growth)) %>% top_n(10)
## Selecting by Workers_Growth
##                   Company Previous_Workers Workers Workers_Growth
## 1                    IDIQ                1     183       18200.00
## 2  Intent Solutions Group                1     150       14900.00
## 3            Paxon Energy                1     125       12400.00
## 4              NP Digital                4     330        8150.00
## 5       Coldwater Capital                3     239        7866.67
## 6             Accelevents                1      65        6400.00
## 7       Hyperion Partners                1      65        6400.00
## 8        Just in Time GCP                1      64        6300.00
## 9                 Conexon                3     192        6300.00
## 10         Global Alliant                1      62        6100.00

Se pueden presentar los siguientes gráficos:

# Boxplot
wg_boxplot <- ggplot(data, aes(x=0, y=Workers_Growth)) +
  geom_violin(width=0.4, alpha=0.2) + geom_boxplot(width=0.1) + 
  ggtitle("Boxplot de la variable Workers_Growth") +
  ylab('Aumento porcentual de trabajadores')

# Histograma
wg_histograma <- ggplot(data, aes(x=Workers_Growth)) +
  geom_histogram(bins=15, color='black', fill='white') +
  ggtitle("Histograma de la variable Workers_Growth") +
  ylab('Aumento porcentual de trabajadores')

# QQ-plot
wg_qqplot <- ggplot(data, aes(sample=Workers_Growth)) +
  stat_qq() + stat_qq_line() +
  ggtitle("QQplot de la variable Workers_Growth")

# Librería cowplot
library(cowplot)
plot_grid(wg_boxplot, wg_histograma, wg_qqplot, nrow=1)

Y estos gráficos nos muestran que la variable tiene una notoria asimetría positiva, con un comportamiento muy alejado de una distribución normal. Es decir, la gran mayoría de las empresas presentaron un crecimiento bajo.

Proporcion de género

La variable FM_Ratio indica la proporción entre trabajadores femeninos y masculinos en las compañías registradas. Un resúmen de esta variable es el siguiente:

summary(data$FM_Ratio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##  0.0000  0.3300  0.4600  0.4579  0.5900  1.0000     238

Este resumen muestra que la variable no presenta gran dispersión, con una media y una mediana muy cercanas entre sí, alrededor del valor 0.46, es decir 46% de trabajadoras femeninas en el total de trabajadores, a pesar que los valores máximos y mínimos están entre 0 y 1, obviamente representando una ausencia completa de trabajadoras femeninas, y una presencia total, respectivamente. Por otra parte, como se mencionó anteriormente, existen valores ausentes que representan una pérdida significativa de información.

Se pueden presentar los siguientes gráficos:

# Boxplot
fm_boxplot <- ggplot(data, aes(x=0, y=FM_Ratio)) +
  geom_violin(width=0.4, alpha=0.2) + geom_boxplot(width=0.1) + 
  ggtitle("Boxplot de la variable FM_Ratio") +
  ylab('Proporción trabajadores femeninos-masculinos')

# Histograma
fm_histograma <- ggplot(data, aes(x=FM_Ratio)) +
  geom_histogram(bins=15, color='black', fill='white') +
  ggtitle("Histograma de la variable FM_Ratio") +
  ylab('Proporción trabajadores femeninos-masculinos')

# QQ-plot
fm_qqplot <- ggplot(data, aes(sample=FM_Ratio)) +
  stat_qq() + stat_qq_line() +
  ggtitle("QQplot de la variable FM_Ratio")

# Librería cowplot
library(cowplot)
plot_grid(fm_boxplot, fm_histograma, fm_qqplot, nrow=1)
## Warning: Removed 238 rows containing non-finite values (`stat_ydensity()`).
## Warning: Removed 238 rows containing non-finite values (`stat_boxplot()`).
## Warning: Removed 238 rows containing non-finite values (`stat_bin()`).
## Warning: Removed 238 rows containing non-finite values (`stat_qq()`).
## Warning: Removed 238 rows containing non-finite values (`stat_qq_line()`).

A pesar que la variable tiene un comportamiento muy similar a una variable normal, es notoria cierta asimetría negativa, demostrando que las proporciones altas de mujeres en los grupos de trabajo no son similares a las proporciones altas de hombres.

Un gráfico de densidad de la variable es el siguiente:

# Gráfico de densidad
ggplot(data, aes(x=FM_Ratio, y=after_stat(density), ra.rm=TRUE)) +
  geom_histogram(bins=15, color='black', fill='white', na.rm=TRUE) +
  geom_density(aes(y=after_stat(density)), color='red', na.rm=TRUE, linewidth=1, fill='red', alpha=0.1)

Género del CEO

La variable CEO_Gender indica el género del CEO, esto es, si el mismo se identifica como femenino, masculino, prefiere no responder, o prefiere otra identificación.

Un resumen de esta variable es:

# Filtro por género, suma y generación de frecuencia
data %>%
  count(CEO_Gender, sort=TRUE) %>%
  mutate(freq = round(n / sum(n),3))
##                CEO_Gender    n  freq
## 1                    Male 4269 0.854
## 2                  Female  674 0.135
## 3   Prefer not to respond   55 0.011
## 4 Prefer to self-identify    3 0.001

En este resumen observamos que 4269 CEOs se identifican con el género masculino, lo cual representa 85% de la cantidad total, dejando muy por atras un 13% de CEOs que se identifican con el género femenino. 55 personas prefirieron no responder, y 3 personas prefieren una identificación distinta.

# Librería ColorBrewer
library(RColorBrewer)

# Filtrar datos
new_data <- data %>% count(CEO_Gender, sort=TRUE)

# Librería treemap
library(treemap)
## Warning: package 'treemap' was built under R version 4.2.3
paleta_col <- brewer.pal(4, "Dark2")

# Treemap de CEO_Gender
treemap(new_data,
        index="CEO_Gender", vSize="n", type="index",
        title="Género de los CEOs", palette=paleta_col,
        fontsize.labels=10, fontcolor.labels ="white",
        inflate.labels=TRUE)

library(RColorBrewer)

paleta_col <- c("#E7298A", "#7570B3", "#1B9E77", "#D95F02")

# Bar plot de CEO_Gender
ggplot(new_data, aes(x=factor(CEO_Gender, levels=CEO_Gender), y=n, fill=factor(n))) +
  geom_bar(stat="identity") +
  ggtitle("Gráfico de barras de la variable CEO_Gender") +
  labs(x ="Género del CEO", y="Frecuencia") +
  scale_fill_manual(values=paleta_col) +
  theme(legend.position = "none", axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Edad del CEO

La variable CEO_Age presenta en valores numéricos la edad de los CEOs de cada empresa registrada. Un resúmen de esta variable es el siguiente:

summary(data$CEO_Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   28.00   45.00   50.00   50.01   55.00   73.00

En este resúmen observamos que la dispersión no es demasiada, el valor mínimo es de 28 años, el valor máximo es de 73 años, y tanto la media como la mediana son cercanas al valor de 50 años. Se pueden presentar los siguientes gráficos:

# Boxplot
ceoage_boxplot <- ggplot(data, aes(x=0, y=CEO_Age)) +
  geom_violin(width=0.4, alpha=0.2) + geom_boxplot(width=0.1) + 
  ggtitle("Boxplot de la variable CEO_Age") +
  ylab('Edad del CEO')

# Histograma
ceoage_histograma <- ggplot(data, aes(x=CEO_Age)) +
  geom_histogram(bins=15, color='black', fill='white') +
  ggtitle("Histograma de la variable CEO_Age") +
  ylab('Edad del CEO')

# QQ-plot
ceoage_qqplot <- ggplot(data, aes(sample=CEO_Age)) +
  stat_qq() + stat_qq_line() +
  ggtitle("QQplot de la variable CEO_Age")

# Librería cowplot
library(cowplot)
plot_grid(ceoage_boxplot, ceoage_histograma, ceoage_qqplot, nrow=1)

Esta variable presenta un comportamiento muy similar a una variable con distribución normal, un histograma con una forma de campana, que también está apoyado por el boxplot. El QQplot presenta una línea prácticamente recta muy cercana al valor teórico.

Un gráfico de densidad de la variable es el siguiente:

# Gráfico de densidad
ggplot(data, aes(x=CEO_Age, y=after_stat(density), ra.rm=TRUE)) +
  geom_histogram(bins=15, color='black', fill='white', na.rm=TRUE) +
  geom_density(aes(y=after_stat(density)), color='red', na.rm=TRUE, linewidth=1, fill='red', alpha=0.1)

En donde se ve que la variable sí tiene un comportamiento my similar a una variable con distribución normal.

Localización geográfica

Las dos siguientes variables, City y State, representan la ubicación geográfica de la empresa en un estado y una ciudad de Estados Unidos.

# Cantidad de valores únicos de las ciudades
length(unique(data$City))
## [1] 1434
# Cantidad de valores únicos de los estados
length(unique(data$State))
## [1] 53

Al ser estas dos variables categóricas nominales, y que presentan muchos valores distintos, podríamos presentar únicamente los valores más recurrentes.

data %>% count(City, State, sort=TRUE) %>% top_n(10)
## Selecting by n
##             City      State   n
## 1       New York   New York 156
## 2        Chicago   Illinois 114
## 3        Atlanta    Georgia 100
## 4         Austin      Texas  97
## 5      San Diego California  65
## 6  San Francisco California  64
## 7        Houston      Texas  61
## 8         Dallas      Texas  58
## 9         Denver   Colorado  55
## 10   Los Angeles California  54

De esta consulta observamos que la ciudad con mayor cantidad de empresas presentes en la lista es la ciudad de New York, perteneciente al estado homónimo, le sigue Chicaco, Illinois, y Atlanta, Georgia.

Un gráfico de barra de las ciudades con mayor cantidad de empresas, identificadas por estado, es el siguiente:

# Librería RColorBrewer
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>% count(City, State, sort=TRUE) %>% top_n(10)
## Selecting by n
# Ordenar los valores para la leyenda
legend_ord <- levels(with(new_data, reorder(State, -n)))

# Gráfico de barras
ggplot(new_data, aes(x=factor(City, levels=City), y=n, fill=State)) +
  geom_bar(stat="identity") +
  ggtitle("Gráfico de barras de la variable City") +
  labs(x ="Ciudad", y="Frecuencia") +
  scale_fill_brewer(palette = "Dark2", breaks=legend_ord, name="Estado") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Este último gráfico apoya nuestra observación de que New York es la mayor ciudad con empresas presentes en la lista. Pero por otro lado, el estado de California aparece tres veces en la lista, junto con Texas, lo cual no es necesariamente irrelevante.

Para la variable State podemos hacer un análisis similar. Teniendo en cuenta que hay muchos estados, los que presentan mayor frecuencia son:

data %>% count(State, sort=TRUE) %>% top_n(10)
## Selecting by n
##           State   n
## 1    California 682
## 2         Texas 426
## 3       Florida 369
## 4      Virginia 310
## 5      New York 275
## 6      Illinois 230
## 7       Georgia 210
## 8  Pennsylvania 175
## 9      Colorado 163
## 10   New Jersey 147

Esta consulta confirma una observación que se hizo previamente, y es que el estado de California es el estado con mayor presencia en la lista, con un total de 682 empresas, y le sigue Texas, con 426 empresas. Por otra parte, el estado de New York, cuya ciudad homónima era la ciudad con mayor cantiad de empresas, no lidera la lista de estados mas presentes.

Un gráfico de barras de los estados es el siguiente:

new_data <- data %>% count(State, sort=TRUE) %>% mutate(per = round((n/sum(n))*100,1) ) %>% top_n(10)
## Selecting by per
ggplot(new_data, aes(x=factor(State, levels=State), y=n, fill=n)) +
  geom_bar(stat="identity") +
  geom_label(aes(label=per), vjust=2, fill='white', alpha=0.6) +
  scale_fill_distiller(palette="Spectral") +
  ggtitle("Gráfico de barras de la variable State") +
  labs(x ="Estado", y="Frecuencia") +
  theme(legend.position = "none", axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Finalmente podemos presentar los resultados en un mapa:

# Librería usmap
library(usmap)
## Warning: package 'usmap' was built under R version 4.2.3
# Filtrar los datos
new_data <- data %>% count(State) %>% rename(state="State")

# Plot
plot_usmap(data=new_data, values="n", labels=TRUE, label_color='black') +
  scale_fill_distiller(palette="Spectral", name="Cantidad de\n compañías") +
  labs(title="Cantidad de compañías por estado",
       subtitle="Fuente: Inc 5000") +
  theme(legend.position = "left")

Crecimiento porcentual

La variable Growth, mediante números enteros, presenta el crecimiento porcentual de las empresas en la lista de Inc 5000, un resúmen de esta variable es el siguiente:

summary(data$Growth)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    39.0    88.0   167.0   543.7   384.0 48345.0

En este resumen observamos que la dispersión es muy grande, siendo el menor un valor un 39% de crecimiento, mientras que algunas empresas tienen un crecimiento muy grande, siendo el máximo crecimiento 48345%. Las compañías con mayor crecimiento fueron las siguientes:

data %>% select(Company, Growth) %>%
  arrange(desc(Growth)) %>%
  top_n(10)
## Selecting by Growth
##                            Company Growth
## 1                       Human Bees  48345
## 2                    Carbon Health  39734
## 3  Upstream Life Insurance Company  36955
## 4            Revolutionary Clinics  32997
## 5                             Dave  28972
## 6                    Brander Group  27096
## 7                  Varo Bank, N.A.  23935
## 8             Hardbody Supplements  22948
## 9                     Paxon Energy  22742
## 10                       Budderfly  22486

En esta consulta vemos que la empresa con mayor crecimiento fue Human Bees, con el máximo mecinoado anteriormente, le sigue Carbon Health (39734%), Upstream Life (36955%), Revolutionary Clinics (32997%) y Dave (28972%).

La media de esta distribución, 543.7%, se ve afectada por estos valores extremos, por lo tanto la mediana, 167.0% de crecimiento gana utilidad.

Se presentan los siguientes gráficos:

# Boxplot
gr_boxplot <- ggplot(data, aes(x=0, y=Growth)) +
  geom_violin(width=0.4, alpha=0.2) + geom_boxplot(width=0.1) + 
  ggtitle("Boxplot de la variable Growth") +
  ylab('Crecimiento porcentual')

# Histograma
gr_histograma <- ggplot(data, aes(x=Growth)) +
  geom_histogram(bins=15, color='black', fill='white') +
  ggtitle("Histograma de la variable Growth") +
  ylab('Crecimiento porcentual')

# QQ-plot
gr_qqplot <- ggplot(data, aes(sample=Growth)) +
  stat_qq() + stat_qq_line() +
  ggtitle("QQplot de la variable Growth")

# Librería cowplot
library(cowplot)
plot_grid(gr_boxplot, gr_histograma, gr_qqplot, nrow=1)

Estos gráficos muestran una exagerada asimetría positiva, que incluso es notoria en un gráfico acotado intentando obviar valores extremos.

Ingresos

La variable Revenue presenta los ingresos de cada empresa, expresados en millones de dólares. Un resúmen de esta variable es el siguiente:

summary(data$Revenue)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    5.03   11.13   49.59   30.16 8501.05

En este resumen observamos también que existe una gran dispersión, dado que el valor mínimo es 2 millones de dólares, el valor máximo es de 8501 millones de dólares, y la media (11 millones) difere bastante de la mediana (50 millones). Las empresas con mayor ganancias son las siguientes:

data %>% select(Company, Revenue) %>%
  arrange(desc(Revenue)) %>%
  top_n(10)
## Selecting by Revenue
##                        Company Revenue
## 1             Allied Universal 8501.05
## 2   Carahsoft Technology Corp. 8319.68
## 3    Vensure Employer Services 8093.42
## 4            84 Lumber Company 4697.44
## 5      Total Quality Logistics 4138.16
## 6                 G&A Partners 3498.69
## 7             Big Block Realty 3044.56
## 8             Freedom Mortgage 2542.11
## 9               NFI Industries 2534.41
## 10 ARCO Construction Companies 2447.43

En esta consulta observamos que la compañía con mayor ingresoss es Allied Universal, con 8501.05 millones de dólares, le sigue Carahsoft Technology Corp. (8319 millones), y Vensure Employer Services (8093.42 millones).

Se presentan los siguientes gráficos:

# Boxplot
rev_boxplot <- ggplot(data, aes(x=0, y=Revenue)) +
  geom_violin(width=0.4, alpha=0.2) + geom_boxplot(width=0.1) + 
  ggtitle("Boxplot de la variable Revenue") +
  ylab('Ganancias (en millones de dólares)')

# Histograma
rev_histograma <- ggplot(data, aes(x=Revenue)) +
  geom_histogram(bins=15, color='black', fill='white') +
  ggtitle("Histograma de la variable Revenue") +
  ylab('Ganancias (en millones de dólares)')

# QQ-plot
rev_qqplot <- ggplot(data, aes(sample=Revenue)) +
  stat_qq() + stat_qq_line() +
  ggtitle("QQplot de la variable Revenue")

# Librería cowplot
library(cowplot)
plot_grid(rev_boxplot, rev_histograma, rev_qqplot, nrow=1)

Esta consulta nos muestra que, incluso filtrando valores superiores a tres desvíos estándar sobre la media, la variable sigue teniendo un comportamiento asimétrico positivo, es decir, que las ganancias tienden a ser bajas en la gran mayoría de las empresas, pero existen valores muy extremos en ganancias grandes.

Financiación

La variable Funding presenta el financiamiento que reciben las empresas por los inversores privados. Al igual que la variable Revenue, están expresados en millones de dólares. Un resúmen de esta variable es el siguiente:

summary(data$Funding)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.050   0.114   0.188   0.200   8.906

Y, al igual que las ganancias, existe una gran dispersión. El valor mínimo de financiación es de 0.00 millones de dólares, mientras que el valor máximo de financiación es de 8.906 millones de dólares. La media y la mediana difieren bastante entre sí, por lo que sería adecuado estimar la posición central utilizando la mediana, de 0.114 millones de dólares.

Las compañías que recibieron mayor financiación fueron:

data %>% select(Company, Funding) %>%
  arrange(desc(Funding)) %>%
  top_n(10)
## Selecting by Funding
##                        Company Funding
## 1   Carahsoft Technology Corp.   8.906
## 2             Allied Universal   8.836
## 3    Vensure Employer Services   8.523
## 4            84 Lumber Company   5.764
## 5      Total Quality Logistics   5.338
## 6                 G&A Partners   4.686
## 7             Big Block Realty   4.324
## 8             Freedom Mortgage   3.958
## 9  ARCO Construction Companies   3.787
## 10              NFI Industries   3.698

Se presentan los siguientes gráficos:

# Boxplot
fun_boxplot <- ggplot(data, aes(x=0, y=Funding)) +
  geom_violin(width=0.4, alpha=0.2) + geom_boxplot(width=0.1) + 
  ggtitle("Boxplot de la variable Funding") +
  ylab('Financiación (en millones de dólares)')

# Histograma
fun_histograma <- ggplot(data, aes(x=Funding)) +
  geom_histogram(bins=15, color='black', fill='white') +
  ggtitle("Histograma de la variable Funding") +
  ylab('Financiación (en millones de dólares)')

# QQ-plot
fun_qqplot <- ggplot(data, aes(sample=Funding)) +
  stat_qq() + stat_qq_line() +
  ggtitle("QQplot de la variable Funding")

# Librería cowplot
library(cowplot)
plot_grid(fun_boxplot, fun_histograma, fun_qqplot, nrow=1)

Estos gráficos muestran que, aún obviando los valores extremos, la variable se sigue comportando con una gran asimetría positiva, es decir, las empresas tienden a recibir poca financiación, pero existen valores extremos, implicando que hay unas pocas empresas que reciben mucha financiación.

Industria

La variable Industry es categórica nominal y, me diante distantas categorías, indica el rubro en el que se desempeña la compañía presente en la lista. Los valores únicos que toma esta variable son:

unique(data$Industry)
##  [1] "Consumer Products & Services"    "Advertising & Marketing"        
##  [3] "Retail"                          "Logistics & Transportation"     
##  [5] "Health"                          "Software"                       
##  [7] "Construction"                    "Real Estate"                    
##  [9] "Business Products & Services"    "Environmental Services"         
## [11] "Financial Services"              "Human Resources"                
## [13] "Education"                       "Government Services"            
## [15] "Manufacturing"                   "Security"                       
## [17] "Computer Hardware"               "It Management"                  
## [19] "Telecommunications"              "Engineering"                    
## [21] "Food & Beverage"                 "It Systems Development"         
## [23] "Media"                           "Insurance"                      
## [25] "It Services"                     "Energy"                         
## [27] "Travel & Hospitality"            "Agriculture & Natural Resources"
length(unique(data$Industry))
## [1] 28

Las categorías con mayor frecuencia de esta variable son:

data %>% count(Industry, sort=TRUE) %>% top_n(10)
## Selecting by n
##                        Industry   n
## 1                      Software 570
## 2  Business Products & Services 550
## 3       Advertising & Marketing 415
## 4                        Health 370
## 5  Consumer Products & Services 335
## 6            Financial Services 297
## 7                  Construction 286
## 8                 It Management 256
## 9                   Real Estate 207
## 10          Government Services 181

Esta consulta indica que la mayoría de las compañías pertenecen al rubro de Software, específicamente 570 compañías, pero a continuación, con 550 observaciones, se encuentra la categoría de Business Product y Services, seguido de Advertising & Marketing, con 415 observaciones.

# Filtrar los datos
new_data <- data %>% count(Industry, sort=TRUE) %>% mutate(per = round((n/sum(n))*100,1) ) %>% top_n(10)
## Selecting by per
# Plot
ggplot(new_data, aes(x=factor(Industry, levels=Industry), y=n, fill=n)) +
  geom_bar(stat="identity") +
  geom_label(aes(label=per), vjust=2, fill='white', alpha=0.6) +
  scale_fill_distiller(palette="YlOrRd", direction=1) +
  ggtitle("Gráfico de barras de la variable Industry") +
  labs(x ="Categoría", y="Frecuencia") +
  theme(legend.position = "none", axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Este último gráfico apoya nuestra observación, la categoría Software representa el 11.4% de las industrias presentes en la lista, seguido de Business Productos & Services, con un 11% de representación.

Presencia Internacional

La variable Inter_Pres es de tipo booleana, y representa mediante valores TRUE o FALSE si es que la compañía tiene presencia internacional, es decir, si participa en mercados de otros países. Un resúmen de esta variable es:

data %>% count(Inter_Pres, sort=TRUE) %>% mutate(Percent = round((n/sum(n))*100, 1))
##   Inter_Pres    n Percent
## 1       TRUE 3907    78.1
## 2      FALSE 1094    21.9

Esta consulta muestra que 78.1% de las empresas tienen presencia internacional, mientras que 21.9% no la tienen. Un gráfico de barras es el siguiente

# Librería RColorBrewer
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  count(Inter_Pres, sort=TRUE) %>%
  mutate(Percent = round((n/sum(n))*100, 1),
         Inter_Pres = ifelse(Inter_Pres == TRUE, "Sí", "No"))

# Bar plot
ggplot(new_data, aes(x=factor(Inter_Pres, levels=Inter_Pres), y=n, fill=factor(n))) +
  geom_bar(stat="identity") +
  geom_label(aes(label=Percent), vjust=2, fill='white', alpha=0.6) +
  ggtitle("Gráfico de barras de la variable Inter_Pres") +
  labs(x ="Presencia internacional de la compañía", y="Frecuencia") +
  scale_fill_brewer(palette="Set1") +
  theme(legend.position = "none", axis.text.x = element_text(size=15))

Y este último gráfico apoya nuestras observaciones. La presencia internacional parece ser un factor común y determinante para que las empresas pertenezcan a la lista.

Año de fundación

La variable Founded indica, mediante cadenas de caracteres, el año en el que la empresa se fundó. Un resumen de esta variable es el siguiente:

cat("La empresa más antigua perteneciente a la lista es", data$Company[which.min(data$Founded)],", fundada en", min(data$Founded),"\n")
## La empresa más antigua perteneciente a la lista es Seaway Printing Company , fundada en 1884
cat("La empresa más nueva perteneciente a la lista es", data$Company[which.max(data$Founded)],", fundada en", max(data$Founded))
## La empresa más nueva perteneciente a la lista es Legacy Roofing & Restoration , fundada en 2017

Los años más frecuentes de fundación son:

data %>% count(as.factor(Founded), sort=TRUE) %>% rename(Year = "as.factor(Founded)") %>% top_n(10)
## Selecting by n
##    Year   n
## 1  2015 524
## 2  2014 434
## 3  2013 407
## 4  2012 377
## 5  2016 364
## 6  2010 297
## 7  2011 282
## 8  2009 251
## 9  2008 236
## 10 2007 189

En esta consulta observamos que el el año 2015, 524 empresas se fundaron, seguido del 2014 con 434 empresas fundadas, y el 2013, con 407 empresas fundadas.

Un gráfico de barras de esta variable, ordenados cronológicamente, es el siguiente:

# Librerías
library(RColorBrewer)
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.2.3
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
# Filtrar los datos
new_data <- data %>% count(as.factor(Founded)) %>%
  rename(Year = "as.factor(Founded)")

# Generar tabla con leyenda
tablita <- new_data %>% arrange(-n) %>% top_n(10)
## Selecting by n
# Plot
ggplot(new_data, aes(x=factor(Year, levels=Year), y=n, fill=n)) +
  geom_bar(stat="identity", colour='black', width=1) +
  #geom_label(aes(label=n), size=4, vjust=0, fill='white', alpha=0.6) +
  scale_fill_distiller(palette="PuRd", direction=1) +
  ggtitle("Gráfico de barras de la variable Founded") +
  labs(x ="Año", y="Frecuencia") +
  theme(legend.position = "none", axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
  annotation_custom(tableGrob(tablita, rows=NULL), xmax=10, ymin=15)

Este gráfico nos proporciona contexto en las fundaciones de cada empresa presente en la lista, viendo que el año 2015 fue el año con más empresas fundadas, y que luego de ese año disminuyó rápidamente la cuenta.

Años en la lista

Finalmente, la variable Yrs_On_List proporciona mediante números enteros, la cantidad de años en los que determinada empresa estuvo presente en la lista de Inc 5000. Un resúmen de esta variable es el siguiente:

data %>% count(as.factor(Yrs_On_List), sort=TRUE) %>%
  rename(Years = "as.factor(Yrs_On_List)") %>%
  mutate(Percentage = round(n/sum(n),3))
##   Years    n Percentage
## 1     2 2560      0.512
## 2     1 2435      0.487
## 3     0    6      0.001

Esta consulta nos indica que 2560 empresas de la lista estuvieron ya dos años en la lista de Inc 5000, mientras que 2435 empresas estuvieron un año en la lista de Inc 5000, por otro lado, solo 6 empresas están en la lista por primera vez.

Además, nos indica que esta lista, o por lo menos la de este año, es bastante conservadora en general, ya que no incluye muchas empresas que ingresan por primera vez, y sigue el análisis de otras empresas por lo menos durante dos años.

Las proporciones son las siguientes:

# Librería ColorBrewer
library(RColorBrewer)

# Filtrar datos
new_data <- data %>% count(as.factor(Yrs_On_List), sort=TRUE) %>%
  rename(Years = "as.factor(Yrs_On_List)")

# Librería treemap
library(treemap)

paleta_col <- brewer.pal(4, "Set1")

# Treemap de CEO_Gender
treemap(new_data,
        index="Years", vSize="n", type="index",
        title="Cantidad de años en la lista Inc 5000", palette=paleta_col,
        fontsize.labels=10, fontcolor.labels ="white",
        inflate.labels=TRUE)

# Filtrar datos
new_data <- data %>% count(as.factor(Yrs_On_List), sort=TRUE) %>%
  rename(Years = "as.factor(Yrs_On_List)") %>%
  mutate(Percentage = round(n/sum(n),3))

# Bar plot
ggplot(new_data, aes(x=Years, y=n, fill=factor(n))) +
  geom_bar(stat="identity") +
  geom_label(aes(label=Percentage), vjust=0.5, fill='white', alpha=0.7) +
  ggtitle("Gráfico de barras de la variable Yrs_On_List") +
  labs(x ="Cantidad de años en la lista Inc 5000", y="Frecuencia") +
  scale_fill_brewer(palette="Set1") +
  theme(legend.position = "none", axis.text.x = element_text(size=15))

Estos gráficos muestran que es mucho más frecuente encontrar en la lista a compañías que ya pertenecían a listas anteriores, y tan solo 6 empresas (0.001%) ingresaron recientemente a la lista.

Análisis bivariados

A continuación se realizan análisis similares a los realizados anteriormente, pero agrupando los datos de cada variable utilizando otras.

## Warning: package 'GGally' was built under R version 4.2.3
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values

## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values
## Warning: Removed 238 rows containing missing values (`geom_point()`).
## Removed 238 rows containing missing values (`geom_point()`).
## Removed 238 rows containing missing values (`geom_point()`).
## Warning: Removed 238 rows containing non-finite values (`stat_density()`).
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values

## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values

## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values

## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values

## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values

## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values

## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 238 rows containing missing values
## Warning: Removed 238 rows containing missing values (`geom_point()`).
## Removed 238 rows containing missing values (`geom_point()`).
## Removed 238 rows containing missing values (`geom_point()`).
## Removed 238 rows containing missing values (`geom_point()`).
## Removed 238 rows containing missing values (`geom_point()`).
## Removed 238 rows containing missing values (`geom_point()`).
## Removed 238 rows containing missing values (`geom_point()`).

Este gráfico muestra la correlación entre variables y la distribución de las mismas. Observamos que las variables numéricas más correlacionadas son las siguientes: - Rank y Growth, Rank y Founded - Workers y Previous_Workers, Workers y Revenue, Workers y Funding - Previous_Workers y Revenue, Previous_Workers y Funding - Growth y Workers_Growth - Revenue y Funding - Funding y Founded

Pero además durante el posterior análisis se puede ir respondiendo otro tipo de preguntas agrupando los datos de una variable según otra variable, frecuentemente categórica.

Posición en el ranking y edad del CEO

data %>%
  group_by(Rank_range=cut(Rank, breaks= seq(0, 5000, by = 500))) %>% 
     summarise(mean_CEO_age = round(mean(CEO_Age),2)) %>%
     arrange(as.numeric(Rank_range))
## # A tibble: 10 × 2
##    Rank_range      mean_CEO_age
##    <fct>                  <dbl>
##  1 (0,500]                 50.2
##  2 (500,1e+03]             50.1
##  3 (1e+03,1.5e+03]         49.9
##  4 (1.5e+03,2e+03]         49.9
##  5 (2e+03,2.5e+03]         50.1
##  6 (2.5e+03,3e+03]         49.9
##  7 (3e+03,3.5e+03]         50.1
##  8 (3.5e+03,4e+03]         50.1
##  9 (4e+03,4.5e+03]         49.9
## 10 (4.5e+03,5e+03]         49.9

Esta consulta muestra que, al agrupar el dataset por 500 registros, la media de la edad de los CEOs permanece prácticamente constante, por lo que no existe una relación evidente entre ambas variables.

Posición en el ranking y el número de trabajadores

Si nos interesa encontrar una posible relación entre la variable Rank (el ranking de la empresa en la lista Inc 5000) y la variable Workers o Growth_Workers podemos presentar los primeros puestos del ranking en la lista.

data %>% select(Company, Rank, Workers, Workers_Growth) %>%
  arrange(Rank) %>%
  top_n(-10, Rank)
##                            Company Rank Workers Workers_Growth
## 1                       Human Bees    1      75         476.92
## 2                    Carbon Health    2     720         847.37
## 3  Upstream Life Insurance Company    3       9         200.00
## 4            Revolutionary Clinics    4     330         870.59
## 5                             Dave    5     151         843.75
## 6                    Brander Group    6       5         400.00
## 7                  Varo Bank, N.A.    7     561         819.67
## 8             Hardbody Supplements    8       2           0.00
## 9                     Paxon Energy    9     125       12400.00
## 10                       Budderfly   10      90         350.00

En esta consulta observamos que los primeros 10 puestos del ranking tuvieron un crecimiento significativo en el número de trabajadores, lo cual puede ser interesante de estudiar, ya que uno supondría que compañías que representan un gran crecimiento económico para los inversores, podrían tender a crecer en cantidad de trabajadores.

# Librerías
library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.2.3
## 
## Attaching package: 'ggpubr'
## The following object is masked from 'package:cowplot':
## 
##     get_legend
# Filtrar datos
new_data <- data %>%
  select(Rank, Workers)

ggplot(new_data, aes(x=Rank, y=Workers)) +
  geom_point(alpha=0.4) +
  labs(title="Posición en el ranking y cantidad de trabajadores", x="Rank", y="Cantidad de trabajadores")

Al observar un comportamiento prácticamente constante en el crecimiento de los trabajadores a medida que avanza el ranking, podemos suponer que estas variables no están correlacionadas.

data %>%
  group_by(Rank_range=cut(Rank, breaks= seq(0, 5000, by = 500))) %>% 
     summarise(mean_WG = round(median(Workers_Growth),2)) %>%
     arrange(as.numeric(Rank_range))
## # A tibble: 10 × 2
##    Rank_range      mean_WG
##    <fct>             <dbl>
##  1 (0,500]           500  
##  2 (500,1e+03]       300  
##  3 (1e+03,1.5e+03]   217. 
##  4 (1.5e+03,2e+03]   163. 
##  5 (2e+03,2.5e+03]   133. 
##  6 (2.5e+03,3e+03]   105. 
##  7 (3e+03,3.5e+03]    80.8
##  8 (3.5e+03,4e+03]    68.5
##  9 (4e+03,4.5e+03]    51.4
## 10 (4.5e+03,5e+03]    40.7

Esta consulta confirma nuestras suposiciones, en los primeros 500 puestos del ranking el valor medio del crecimiento en el número de trabajadores fue de 500%, y es el mayor número entre los segmentos, lo cual podría implicar una relación entre el Rank y el crecimiento en el número de trabajadores.

Posición en el ranking, proporción de género y género del CEO

data %>% select(Company, Rank, FM_Ratio, CEO_Gender) %>%
  arrange(Rank) %>%
  top_n(-10, Rank)
##                            Company Rank FM_Ratio CEO_Gender
## 1                       Human Bees    1     0.25       Male
## 2                    Carbon Health    2     0.66       Male
## 3  Upstream Life Insurance Company    3     0.33       Male
## 4            Revolutionary Clinics    4     0.43       Male
## 5                             Dave    5     0.32       Male
## 6                    Brander Group    6     0.40       Male
## 7                  Varo Bank, N.A.    7     0.23       Male
## 8             Hardbody Supplements    8     0.50       Male
## 9                     Paxon Energy    9     0.71     Female
## 10                       Budderfly   10     0.49       Male

Esta consulta no aporta mucha información para el análisis. No existe una relación evidente entre la posición en el ranking y las dos variables propuestas. Una sola observación es que entre las diez principales empresas en la lista, existe solo una CEO cuyo género es femenino.

Posición en el ranking y crecimiento de la empresa

# Librerías
library(ggpubr)

# Filtrar datos
new_data <- data %>%
  select(Rank, Growth)

ggplot(new_data, aes(x=Rank, y=Growth)) +
  geom_point(alpha=0.4) +
  labs(title="Posición en el ranking y crecimiento de la empresa", x="Rank", y="Crecimiento porcentual")

Este gráfico muestra una clara dependencia de ambas variables. Es decir, los primeros puestos en el ranking están ocupados por empresas que presentaron crecimientos porcentuales grandes.

data %>%
  group_by(Rank_range=cut(Rank, breaks= seq(0, 5000, by = 500))) %>% 
     summarise(median_Growth = round(median(Growth),2)) %>%
     arrange(as.numeric(Rank_range))
## # A tibble: 10 × 2
##    Rank_range      median_Growth
##    <fct>                   <dbl>
##  1 (0,500]                 1820.
##  2 (500,1e+03]              660.
##  3 (1e+03,1.5e+03]          384 
##  4 (1.5e+03,2e+03]          261 
##  5 (2e+03,2.5e+03]          189 
##  6 (2.5e+03,3e+03]          146 
##  7 (3e+03,3.5e+03]          112 
##  8 (3.5e+03,4e+03]           88 
##  9 (4e+03,4.5e+03]           68 
## 10 (4.5e+03,5e+03]           50

Esta consulta indica el valor medio del crecimiento de la empresa en segmentos de 500 compañías ordenadas por su posición en la lista. Observamos que en los primeros 500 puestos del ranking el valor medio de crecimiento económico fue de 1819.5%, y este valor es significativamente grande con respecto a los otros, los cuales descienden paulatinamente. Este resultado nos indica la relación que supusimos entre la posición de la compañía en la empresa y el crecimiento económico de la lista.

Los primeros diez puestos de la lista son:

data %>% select(Company, Rank, Growth) %>%
  arrange(Rank) %>%
  top_n(-10, Rank)
##                            Company Rank Growth
## 1                       Human Bees    1  48345
## 2                    Carbon Health    2  39734
## 3  Upstream Life Insurance Company    3  36955
## 4            Revolutionary Clinics    4  32997
## 5                             Dave    5  28972
## 6                    Brander Group    6  27096
## 7                  Varo Bank, N.A.    7  23935
## 8             Hardbody Supplements    8  22948
## 9                     Paxon Energy    9  22742
## 10                       Budderfly   10  22486

Número de trabajadores y las ganancias de una empresa

Nos interesa descubrir si es que existe alguna relación entre las variables Workers y Revenue.

# Librerías
library(ggpubr)

# Filtrar datos
new_data <- data %>%
  select(Workers, Revenue)

# Gráfico
ggplot(new_data, aes(x=Revenue, y=Workers)) +
  geom_point(alpha=0.2) +
  geom_smooth(method="lm", se=TRUE) +
  stat_regline_equation(label.y = 60000, aes(label = after_stat(eq.label))) +
  stat_regline_equation(label.y = 56000, aes(label = after_stat(rr.label)))
## `geom_smooth()` using formula = 'y ~ x'

Este gráfico nos muestra que no existe una clara relación entre las dos variables propuestas. Una mayor cantidad de trabajo no implica una mayor ganancia, ni el caso contrario, o por lo menos no en una relación fuerte.

Número de trabajadores actuales y la cantidad anterior

Nos interesa descubrir si es que existe una relación entre los trabajadores en un momento previo y actualmente, en las compañías presentes en la lista.

# Librerías
library(ggpubr)

# Filtrar datos
new_data <- data %>%
  select(Workers, Previous_Workers, Workers_Growth)

ggplot(new_data, aes(x=Workers, y=Previous_Workers)) +
  geom_point(aes(size=Workers_Growth), alpha=0.2) +
  geom_smooth(method="lm", se=TRUE) +
  stat_regline_equation(label.y = 30000, aes(label = after_stat(eq.label))) +
  stat_regline_equation(label.y = 28000, aes(label = after_stat(rr.label)))
## `geom_smooth()` using formula = 'y ~ x'

Este gráfico nos muestra una tendencia muy lineal con respecto al crecimiento en el número de trabajadores, esto implica que las empresas que tuvieron pocos trabajadores, tienden a duplicar el número de sus trabajadores, lo cual es lógico por nuestra intuición.

La correlación entre estas variables es:

cor(data$Workers, data$Previous_Workers)
## [1] 0.961265

Lo cual implica que están fuertemente relacionadas.

Crecimiento del número de trabajadores y el crecimiento de la empresa

Nos interesa descubrir si es que existe una relación entre ambos crecimientos, de la variable Workers_Growth y Growth, es decir, entre el crecimiento en el número de trabajadores, y el crecimiento de la empresa.

# Librerías
library(ggpubr)

# Filtrar datos
new_data <- data %>%
  select(Workers_Growth, Growth)

# Gráfico
ggplot(new_data, aes(x=Growth, y=Workers_Growth)) +
  geom_point(alpha=0.2) +
  geom_smooth(method="lm", se=TRUE) +
  stat_regline_equation(label.y = 15000, aes(label = after_stat(eq.label))) +
  stat_regline_equation(label.y = 14000, aes(label = after_stat(rr.label)))
## `geom_smooth()` using formula = 'y ~ x'

cor(data$Workers_Growth, data$Growth)
## [1] 0.2893831

Tanto el gráfico como el resultado de correlación muestran que, incluso obviando valores extremos, no existe una clara relación entre ambas variables. Tanto el coeficiente \(R^2\) de Pearson, como la correlación, son valores muy bajos, indicando esta débil dependencia.

Porcentaje de trabajadoras femeninas y el género del CEO

Al intentar encontrar una relación entre las variables FM_Ratio y CEO_Gender, podemos agrupar la primera variable según factores de la segunda.

# Librerías
library(ggplot2)

# Filtrar datos
new_data <- data %>% select(FM_Ratio, CEO_Gender) %>%
  mutate(CEO_Gender = factor(CEO_Gender)) %>%
  na.omit()

# Plot
paleta_col <- c("#D95F02", "#1B9E77", "#7570B3", "#E7298A")
ggplot(new_data, aes(x=CEO_Gender, y=FM_Ratio, fill=CEO_Gender)) +
  geom_boxplot(width=0.2) + geom_violin(width=0.8, alpha=0.2) +
  labs(title="Proporción de género por género del CEO", x="Género del CEO", y="Frecuencia") +
  scale_fill_manual(values=paleta_col, name="Género del CEO")

Este gráfico demuestra que, a pesar de la disparidad general de todas las empresas, al agruparlas por el género del CEO, esta asimetría no está marcada, y de hecho ambos géneros de CEO tienen una distribución de género similiar y con una media cercana a 0.5, aunque entre estas dos la menor la tienen las empresas cuyo CEO es de género masculino. Las observaciones en los otros dos grupos restantes son irrelevantes.

Crecimiento y edad del CEO

# Librerías
library(ggplot2)
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  group_by(Age_range=cut(CEO_Age, breaks=seq(27, 73, by=5))) %>% 
     summarise(mean_growth = round(mean(Growth),2)) %>%
     arrange(Age_range) %>%
  na.omit()

# Gráfico
ggplot(new_data, aes(x=factor(Age_range, levels=Age_range), y=mean_growth, fill=mean_growth)) +
  geom_bar(stat='identity', colour='black', width=1) +
  scale_fill_distiller(palette='YlOrRd', direction=1) +
  ggtitle("Crecimiento y edad del CEO") +
  labs(x="Edad del CEO", y="Promedio de crecimiento") +
  theme(legend.position = "none")

Este último gráfico muestra que la edad del CEO está levemente relacionada con el crecimiento de la empresa, en donde empresas con un CEO más jóven tienen un promedio de crecimiento mucho más grande que los demás rangos, que se comportan casi de manera uniforme.

Crecimiento separado por industria

Se pueden presentar los crecimientos (dados por la variable Growth) pero separados por las industrias principales en la lista (dadas por la variable Industry)

# Librerías
library(dplyr)
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  select(Industry, Growth) %>%
  group_by(Industry) %>%
  summarize(Growth_Mean = round(median(Growth),2)) %>%
  arrange(desc(Growth_Mean)) %>%
  top_n(10)
## Selecting by Growth_Mean
# Plot
ggplot(new_data, aes(x=factor(Industry, levels=Industry), y=Growth_Mean, fill=Growth_Mean)) +
  geom_bar(stat="identity", color='black') +
  geom_label(aes(label=Growth_Mean), vjust=2, fill='white', alpha=0.6) +
  scale_fill_distiller(palette="PuRd", direction=1) +
  ggtitle("Crecimiento porcentual mediano de las compañías separado por industria") +
  labs(x ="Categoría", y="Crecimiento porcentual mediano") +
  theme(legend.position = "none", axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Este gráfico indica que la industria de Costumer Products & Services es la que tuvo mayor crecimiento porcentual medio, aunque son todos muy similares, seguido de la industria energética. De todos modos, es curioso este resultado porque no está directamente relacionado al resultado de apariciones de industrias en la lista.

Ganancia separado por industria

Un análisis similar al anterior se puede hacer con la variable Revenue, que representa la ganancia de las empresas.

# Librerías
library(dplyr)
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  select(Industry, Revenue) %>%
  group_by(Industry) %>%
  summarize(Revenue_Mean = round(median(Revenue),2)) %>%
  arrange(desc(Revenue_Mean)) %>%
  top_n(10)
## Selecting by Revenue_Mean
# Plot
ggplot(new_data, aes(x=factor(Industry, levels=Industry), y=Revenue_Mean, fill=Revenue_Mean)) +
  geom_bar(stat="identity", color='black') +
  geom_label(aes(label=Revenue_Mean), vjust=1.5, fill='white', alpha=0.6) +
  scale_fill_distiller(palette="PuRd", direction=1) +
  ggtitle("Ganancias medianas de las compañías separado por industria") +
  labs(x ="Categoría", y="Ganancia mediana") +
  theme(legend.position = "none", axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Este gráfico nos muestra que las industria con mayor ganancia media fue Agriculture & Natural Resources, seguido de Logistics & Transportation. Este resultado es interesante porque neuvamente estas dos industrias no estaban entre las principales industrias con mayores crecimientos, o con mayor aparición.

Financiación separado por industria

Nuevamente se puede realizar el mismo análisis con la variable Funding

# Librerías
library(dplyr)
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  select(Industry, Funding) %>%
  group_by(Industry) %>%
  summarize(Funding_Mean = round(median(Funding),2)) %>%
  arrange(desc(Funding_Mean)) %>%
  top_n(10)
## Selecting by Funding_Mean
# Plot
ggplot(new_data, aes(x=factor(Industry, levels=Industry), y=Funding_Mean, fill=Funding_Mean)) +
  geom_bar(stat="identity", color='black') +
  geom_label(aes(label=Funding_Mean), vjust=1.5, fill='white', alpha=0.6) +
  scale_fill_distiller(palette="PuRd", direction=1) +
  ggtitle("Financiación media de las compañías separado por industria") +
  labs(x ="Categoría", y="Financiación mediana") +
  theme(legend.position = "none", axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Este gráfico indica un resultado similar al análisis de la variable Revenue, indicando una posible relación entre estas dos variables.

Crecimiento separado por presencia internacional

Una división del crecimiento promedio separado por si es que la compañía tiene presencia internacional o no es el siguiente:

# Librerías
library(dplyr)
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  select(Inter_Pres, Growth) %>%
  group_by(Inter_Pres) %>%
  summarize(Growth_Mean = round(median(Growth),2)) %>%
  arrange(desc(Growth_Mean)) %>%
  top_n(10) %>%
  mutate(Inter_Pres = ifelse(Inter_Pres == TRUE, "Sí", "No"))
## Selecting by Growth_Mean
# Plot
ggplot(new_data, aes(x=factor(Inter_Pres, levels=Inter_Pres), y=Growth_Mean, fill=factor(Growth_Mean))) +
  geom_bar(stat="identity", color='black') +
  geom_label(aes(label=Growth_Mean), vjust=2, fill='white', alpha=0.6) +
  scale_fill_brewer(palette="Set1") +
  ggtitle("Crecimiento porcentual mediano de las compañías separado por presencia internacional") +
  labs(x ="Presencia Internacional", y="Crecimiento porcentual mediano") +
  theme(legend.position = "none", axis.text.x = element_text(size=15))

Este gráfico muestra que la presencia o no internacional de la empresa no aporta una gran diferencia al crecimiento de esta. De hecho los valores medio son muy similares entre sí.

Crecimiento separado por estado

Podríamos observar los estados en donde las empresas presentaron mayor crecimiento.

# Librerías
library(dplyr)
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  na.omit() %>%
  select(State, Growth) %>%
  group_by(State) %>%
  summarize(GrowthTotal = sum(Growth), n = n()) %>%
  mutate(Weigth = n/sum(n),
         Weighted_Mean = round(GrowthTotal * Weigth,2)) %>%
  top_n(10)
## Selecting by Weighted_Mean
# Librerías
library(dplyr)
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  na.omit() %>%
  select(State, Growth) %>%
  group_by(State) %>%
  summarize(GrowthTotal = sum(Growth), n = n()) %>%
  mutate(Weigth = n/sum(n),
         Weighted_Mean = round(GrowthTotal/n * Weigth,2)) %>%
  arrange(desc(Weighted_Mean)) %>%
  top_n(10)
## Selecting by Weighted_Mean
# Plot
ggplot(new_data, aes(x=factor(State, levels=State), y=Weighted_Mean, fill=Weighted_Mean)) +
  geom_bar(stat="identity", color='black') +
  geom_label(aes(label=Weighted_Mean), vjust=1.5, fill='white', alpha=0.6) +
  scale_fill_distiller(palette="PuBu", direction=1) +
  ggtitle("Crecimiento porcentual medio de las compañías separado por estado") +
  labs(x ="Estado", y="Crecimiento porcentual medio") +
  theme(legend.position = "none")

Este gráfico apoya las observaciones que se realizaron en un principio sobre las observaciones de cantidad de compañías separadas por estados. El estado que tuvo mayor crecimiento porcentual promedio es California, con un 102.19% de crecimiento, seguido de New York y Texas con valores cercanos al 40% de crecimiento porcentual promedio.

# Librería usmap
library(usmap)

# Filtrar los datos
new_data <- data %>%
  na.omit() %>%
  select(State, Growth) %>%
  group_by(State) %>%
  summarize(GrowthTotal = sum(Growth), n = n()) %>%
  mutate(Weigth = n/sum(n),
         Weighted_Mean = round(GrowthTotal/n * Weigth,2)) %>%
  arrange(desc(Weighted_Mean)) %>%
  rename(state = "State")

# Plot
plot_usmap(data=new_data, values="Weighted_Mean", labels=TRUE, label_color='black') +
  scale_fill_distiller(palette="Spectral", name="Crecimiento\n porcentual medio") +
  labs(title="Crecimiento porcentual medio por estado",
       subtitle="Fuente: Inc 5000") +
  theme(legend.position = "left")

Este gráfico confirma nuestras afirmaciones anteriores.

Ganancia y Financiamiento

Como se mencionó anteriormente, es posible una relación entre estas dos variables, por lo cual podemos generar un scatterplot para verificar esto.

# Librerías
library(ggpubr)

# Filtrar datos
new_data <- data %>%
  select(Revenue, Funding)

ggplot(new_data, aes(x=Revenue, y=Funding)) +
  geom_point(alpha=0.2)

Este grafico sorprende al demostrar una obvia relación entre estas dos variables, precisamente una relación exponencial/logarítmica, indicando que la financiación de las empresas es proporcional a su ganancia.

Ganancia separado por presencia internacional

Se puede intentar verificar si es que la presencia internacional influye en las ganancias de las empresas.

# Librerías
library(dplyr)
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  select(Inter_Pres, Revenue) %>%
  group_by(Inter_Pres) %>%
  summarize(Revenue_Mean = round(median(Revenue),2)) %>%
  arrange(desc(Revenue_Mean)) %>%
  top_n(10) %>%
  mutate(Inter_Pres = ifelse(Inter_Pres == TRUE, "Sí", "No"))
## Selecting by Revenue_Mean
# Plot
ggplot(new_data, aes(x=factor(Inter_Pres, levels=Inter_Pres), y=Revenue_Mean, fill=factor(Revenue_Mean))) +
  geom_bar(stat="identity", color='black') +
  geom_label(aes(label=Revenue_Mean), vjust=2, fill='white', alpha=0.6) +
  scale_fill_brewer(palette="Set1") +
  ggtitle("Ganancia mediana de las compañías separado por presencia internacional") +
  labs(x ="Presencia Internacional", y="Ganancia mediana") +
  theme(legend.position = "none", axis.text.x = element_text(size=15))

Este gráfico muestra que tal relación supuesta no existe, y la presencia internacional no influye en las ganancias que pueden tener este tipo de compañías.

Ganancia separado por estado

Podríamos observar los estados en donde las empresas presentaron mayor ganancia media.

# Librerías
library(dplyr)
library(RColorBrewer)

# Filtrar los datos
new_data <- data %>%
  na.omit() %>%
  select(State, Revenue) %>%
  group_by(State) %>%
  summarize(RevenueTotal = sum(Revenue), n = n()) %>%
  mutate(Weigth = n/sum(n),
         Weighted_Mean = round(RevenueTotal/n * Weigth,2)) %>%
  arrange(desc(Weighted_Mean)) %>%
  top_n(10)
## Selecting by Weighted_Mean
# Plot
ggplot(new_data, aes(x=factor(State, levels=State), y=Weighted_Mean, fill=Weighted_Mean)) +
  geom_bar(stat="identity", color='black') +
  geom_label(aes(label=Weighted_Mean), vjust=2, fill='white', alpha=0.6) +
  scale_fill_distiller(palette="PuBu", direction=1) +
  ggtitle("Ganancia media de las compañías separado por estado") +
  labs(x ="Estado", y="Ganancia media") +
  theme(legend.position = "none")

Continuando con las conclusiones anteriores, este gráfico las apoya, California es el estado que tuvo una ganancia promedio mayor, con 8.27 millones de dóalres, seguido de Texas, quienes eran dos de los estados con mayor cantidad de compañías.

# Librería usmap
library(usmap)

# Filtrar los datos
new_data <- data %>%
  na.omit() %>%
  select(State, Revenue) %>%
  group_by(State) %>%
  summarize(RevenueTotal = sum(Revenue), n = n()) %>%
  mutate(Weigth = n/sum(n),
         Weighted_Mean = round(RevenueTotal/n * Weigth,2)) %>%
  arrange(desc(Weighted_Mean)) %>%
  rename(state = "State")

# Plot
plot_usmap(data=new_data, values="Weighted_Mean", labels=TRUE, label_color='black') +
  scale_fill_distiller(palette="Spectral", name="Ganancia\n media") +
  labs(title="Ganancia media por estado",
       subtitle="Fuente: Inc 5000") +
  theme(legend.position = "left")

Y este gráfico apoya nuestras afirmaciones anteriores.

Conclusiones

En conclusión, el análisis exhaustivo de la lista Inc 5000 del año 2021 revela varias tendencias significativas en el panorama empresarial de Estados Unidos. Primero, se observa una sólida correlación entre el crecimiento porcentual de las empresas y su posición en el ranking, lo que demuestra que un mayor crecimiento se traduce en una mejor clasificación en los primeros puestos. California lidera en cantidad de empresas en la lista, mientras que New York se destaca por tener la mayor concentración a nivel de ciudades. Además, estados como California, Texas y New York exhiben no solo un alto número de empresas, sino también un impresionante crecimiento y ganancias promedio. El género del CEO parece no influir en la proporción de género de los empleados, pero es interesante notar que los CEOs de las empresas de mayor crecimiento son notoriamente jóvenes, con edades entre 27 y 32 años, mientras que la edad promedio de los CEOs en la lista es de alrededor de 50 años. Asimismo, se destaca que 2015 fue un año de fundación destacado para las empresas en la lista, y la mayoría de ellas son veteranas en la lista, con pocas incorporaciones nuevas. La financiación se relaciona de manera proporcional con las ganancias, y la presencia internacional no parece ser un factor determinante en el éxito, aunque sí un factor determinan en la incorporación en la lista. Por último, aunque la industria de software lidera en cantidad, la de Customer Products & Services exhibe el mayor crecimiento porcentual, subrayando la diversidad y dinamismo del mercado empresarial en Estados Unidos.