Introducción

El archivo contiene una base de datos de empresas cotizadas en América Latina, con foco en sus indicadores financieros, organizacionales y de mercado para un año fiscal determinado.


El dataframe

El dataframe “Cotizadas” es una Hoja de cálculo de Microsoft Excel (.xlsx) en donde combina variables categóricas, numéricas continuas y discretas, además de algunas que necesitan limpieza para ser clasificadas correctamente, es por eso que, antes de subir este archivo se normalizo la base de datos.

Proceso de normalización

Se llevó a cabo un proceso de normalización sobre la base de datos conformada inicialmente por 1200 registros que contenían información sobre la caracterización de la situación financiera de empresas que cotizan en la Bolsa de América Latina. Durante la observación inicial, se identificaron registros que carecían de valores en la columna Sector (EMIS Industries), la cual se consideró de gran relevancia para el análisis, ya que aporta datos esenciales sobre la clasificación de las empresas según su sector económico. Como consecuencia, se decidió eliminar dichos registros debido a que su ausencia de información en esta columna limitaba su utilidad para el estudio.

Posteriormente, se aplicó un filtro para analizar los valores presentes en la columna de Total de Ingreso Operativo, encontrando que un número significativo de empresas no contaba con datos numéricos en esta columna ni en las otras 17 relacionadas con actividades financieras. A pesar de que algunos de estos registros sí contenían información en la columna Sector, la falta de datos numéricos en las columnas clave fue considerada como un impedimento para generar un análisis estadístico consistente, por lo cual también se optó por eliminarlos.

En relación con las columnas restantes, las cuales presentaban valores faltantes en varios de sus registros, se decidió reemplazar los valores nulos por 0, una estrategia que permitió preservar los datos sin alterar su estructura ni comprometer la interpretación del conjunto.

Luego de ejecutar este proceso en la Hoja de cálculo “Cotizadas”, paso de 1200 registros a 1086 registros; manteniendo asi el 90% de los registros de la base de datos inicial.

Base de datos

#install.packages("e1071")
library(e1071)
# Leemos el archivo
Cotizadas <- read_excel("C:/Users/diego/Downloads/Cotizadas.xlsx", 
                        sheet = "Worksheet")
Cotizadas


Variables contenidas

-Num: Número consecutivo del registro (índice o ID).

-País: País donde está registrada o opera la empresa.

-Compañía: Nombre completo de la empresa.

-Sector (EMIS Industries): Clasificación industrial según EMIS. Puede incluir múltiples sectores.

-Total Ingreso Operativo: Ingresos operativos anuales (en millones o miles, según fuente).

-Número de empleados: Cantidad de empleados, a veces con el año entre paréntesis.

-Ganancias antes de impuestos: Utilidad bruta antes de deducción de impuestos.

-Impuesto a la renta: Valor pagado o devuelto como impuesto a la renta.

-Ganancia (Pérdida) Neta: Resultado neto después de impuestos (utilidad neta).

-Activos Totales: Total de activos de la empresa (corrientes + no corrientes).

-Pasivos Totales: Total de deudas y obligaciones.

-Patrimonio Total: Diferencia entre activos y pasivos.

-Ingreso por empleado: Ingreso operativo dividido por número de empleados.

-Utilidad neta por empleado: Ganancia neta dividida por número de empleados.

-Activos por empleado: Total de activos dividido por empleados.

-Pasivos por empleado: Total de pasivos dividido por empleados.

-Rendimiento Sobre Los Activos (ROA)

-Retorno sobre activos: (utilidad neta / activos) * 100.

-Rendimiento Sobre El Patrimonio (ROE)

-Retorno sobre patrimonio: (utilidad neta / patrimonio) * 100.

-Rotación De Inventario (x): Veces que se renueva el inventario en el año.

-Valor Contable: Valor registrado en libros (patrimonio + otros activos).

-Valor de Empresa: Valor estimado de la empresa en el mercado (incluye deuda + capital).

-Deuda: Total de obligaciones financieras (pasivo con costo).

-Año Fiscal: Año al que corresponde la información financiera reportada.

-Auditado: Si la información ha sido auditada oficialmente.

-Consolidado: Si los estados financieros están consolidados (agrupados de subsidiarias).

-Fuente: Origen del dato: EMIS, WVB, CVM, SVS, entre otros.


Elección de las variables cuantitativas

Seleccionamos las siguientes variables:

Total Ingreso Operativo:

  • Representa los ingresos operacionales o ventas netas anuales de la empresa.

  • Cálculo: Se reporta directamente como suma de ingresos operativos.

  • Es una medida clave del tamaño y capacidad comercial de la empresa. Permite comparar niveles de actividad económica entre empresas, sectores y países.

Ganancia (Pérdida) Neta:

  • Resultado final después de restar todos los costos, gastos, e impuestos a los ingresos.

  • Cálculo: Ingreso total - Costos - Gastos - Impuestos.

  • Refleja la rentabilidad real. Es un indicador directo del desempeño financiero y permite evaluar si la empresa es capaz de generar beneficios sostenibles.

ROA (%) (Return on Assets):

  • Mide la eficiencia con que se usan los activos para generar ganancias.

  • Cálculo: (Ganancia Neta / Activos Totales) × 100

  • Es un indicador de eficiencia operativa. Compara la rentabilidad entre empresas de diferente tamaño y estructura de activos. Muy útil en análisis comparativos.

# Convertir columnas a numéricas (quitando comas o caracteres raros si es necesario)
Cotizadas <- Cotizadas %>%
  mutate(
    `Total Ingreso Operativo` = as.numeric(gsub(",", "", `Total Ingreso Operativo`)),
    `Ganancia (Pérdida) Neta` = as.numeric(gsub(",", "", `Ganancia (Pérdida) Neta`)),
    `Rendimiento Sobre Los Activos (ROA) (%)` = as.numeric(gsub("[,%]", "", `Rendimiento Sobre Los Activos (ROA) (%)`))
  )


Estadística descriptiva

¿Qúe es la estadística descriptiva?

La estadística descriptiva es una rama de la estadística que se encarga de recolectar, organizar, resumir y presentar datos de manera clara y efectiva. Su objetivo principal es proporcionar una descripción general de las características principales de un conjunto de datos, sin realizar inferencias o predicciones sobre una población más amplia.

#Convierte las variables caracter (chr) a variables numéricas
Cotizadas$`Total Ingreso Operativo`<-as.numeric(Cotizadas$`Total Ingreso Operativo`)

Cotizadas$`Ganancia (Pérdida) Neta`<-as.numeric(Cotizadas$`Ganancia (Pérdida) Neta`)

Cotizadas$`Rendimiento Sobre Los Activos (ROA) (%)`<-as.numeric(Cotizadas$`Rendimiento Sobre Los Activos (ROA) (%)`)

Summary

# Calcular estadísticas descriptivas para variables clave
calcular_estadisticas_global <- function(var) {
  var <- var[!is.na(var)]
  c(
    Min = min(var),
    Q1 = quantile(var, 0.25),
    Promedio = mean(var),
    Mediana = median(var),
    Q3 = quantile(var, 0.75),
    Max = max(var),
    `Rango IQR` = IQR(var),
    Asimetría = skewness(var),
    Curtosis = kurtosis(var)
  )
}

# Variables a analizar
variables <- c("Total Ingreso Operativo", 
               "Ganancia (Pérdida) Neta", 
               "Rendimiento Sobre Los Activos (ROA) (%)")

# Aplicar a cada variable
tabla_global <- lapply(variables, function(var) {
  calcular_estadisticas_global(Cotizadas[[var]])
})

# Organizar en tabla
tabla_global_df <- as.data.frame(do.call(rbind, tabla_global))
tabla_global_df <- round(tabla_global_df, 2)
tabla_global_df <- tibble::rownames_to_column(tabla_global_df, var = "Variable")

# Mostrar como tabla bonita
kable(tabla_global_df, caption = "📊 Estadísticas descriptivas generales por variable")
📊 Estadísticas descriptivas generales por variable
Variable Min Q1.25% Promedio Mediana Q3.75% Max Rango IQR Asimetría Curtosis
1 -4598.66 26.13 1484.82 186.43 783.70 90572.75 757.57 9.34 119.65
2 -15199.52 0.00 127.56 7.85 72.38 14046.86 72.38 3.00 153.09
3 -307.64 0.00 2.48 2.40 7.08 261.91 7.08 -2.94 90.40


Histogramas

# # Tabla de estadísticas de Total Ingreso Operativo
hist(Cotizadas$`Total Ingreso Operativo`,
     breaks = 12,
     col = "lightblue",
     border = "blue",
     main = "Ingreso Operativo Total",
     xlab = "Total Ingreso Operativo")

# # Tabla de estadísticas de Ganancias
hist(Cotizadas$`Ganancia (Pérdida) Neta`,
     breaks = 12,
     col = "lightblue",
     border = "blue",
     main = "Ganancias",
     xlab = "Ganancia (Pérdida) Neta")

# # Tabla de estadísticas de (ROA) (%)
hist(Cotizadas$`Rendimiento Sobre Los Activos (ROA) (%)`,
     breaks = 12,
     col = "lightblue",
     border = "blue",
     main = "(ROA) (%)",
     xlab = "Rendimiento Sobre Los Activos (ROA) (%)")

Boxplots de las variables elegidas

# Lista de variables a graficar
variables <- c("Total Ingreso Operativo", 
               "Ganancia (Pérdida) Neta", 
               "Rendimiento Sobre Los Activos (ROA) (%)")

# Loop para crear boxplots individuales
for (var in variables) {
  ggplot(Cotizadas, aes(y = .data[[var]])) +
    geom_boxplot(fill = "#69b3a2", outlier.color = "red", outlier.shape = 16) +
    labs(title = paste(" ", var),
         y = var, x = NULL) +
    theme_minimal() +
    theme(plot.title = element_text(face = "bold", size = 14),
          axis.text.x = element_blank(),
          axis.ticks.x = element_blank()) -> plot
  print(plot)
}

Análisis de la Estadísctica Descriptiva

Aqui la idea es escribir toda la infroamcion de lo que se saco arriba y ver su comportamiento. Se puede deducir que:

Total Ingreso Operativo

  • Mínimo (-4598.66): Algunas empresas tienen ingresos operativos negativos, lo que podría indicar pérdidas operativas.

  • Mediana (186.43): La mitad de las empresas tienen ingresos operativos menores o iguales a este valor, lo que sugiere que la mayoría opera con ingresos moderados.

  • Media (1484.83): El promedio es significativamente mayor que la mediana, lo que indica la presencia de valores extremos (outliers) con ingresos operativos muy altos.

  • Máximo (90572.75): Algunas empresas tienen ingresos operativos excepcionalmente altos, lo que podría corresponder a grandes corporaciones.

  • NA’s (2): Hay dos valores faltantes que podrían requerir atención para evitar sesgos en el análisis.

Ganancia (Pérdida) Neta

  • Mínimo (-15199.52): Existen empresas con pérdidas netas significativas, lo que podría reflejar problemas financieros.

  • Mediana (7.85): La mitad de las empresas tienen ganancias netas menores o iguales a este valor, lo que sugiere que muchas operan con márgenes de ganancia bajos.

  • Media (127.56): El promedio es mayor que la mediana, lo que nuevamente sugiere la influencia de valores extremos con ganancias muy altas.

  • Máximo (14046.86): Algunas empresas tienen ganancias netas excepcionales, lo que podría reflejar un desempeño financiero sobresaliente.

Rendimiento Sobre Los Activos (ROA) (%)

  • Mínimo (-307.64): Algunas empresas tienen un rendimiento negativo sobre los activos, lo que podría indicar una gestión ineficiente o pérdidas.

  • Mediana (2.40): La mitad de las empresas tienen un ROA menor o igual a este valor, lo que sugiere que la mayoría tiene un rendimiento moderado.

  • Media (2.48): El promedio es cercano a la mediana, lo que indica una distribución más equilibrada en comparación con las otras variables.

  • Máximo (261.91): Algunas empresas tienen un ROA excepcionalmente alto, lo que podría reflejar una gestión eficiente de los activos.

Estadisctica Descriptiva con Variables Cruzadas

Hemos decidido enfocar nuestro análisis en las variables Países y Sectores, con el objetivo de obtener una visión más precisa y detallada del comportamiento de las empresas dentro de diferentes contextos geográficos y sectoriales. Estas variables nos permitirán segmentar la información de manera más específica, facilitando la identificación de patrones y tendencias que podrían no ser evidentes al observar los datos de forma global. Al centrarnos en estos aspectos, podremos tener una comprensión más profunda de las diferencias y particularidades que existen entre los distintos países y sectores, lo que enriquecerá el análisis general.

Para profundizar aún más en este estudio, analizaremos cómo cada país se comporta en relación a variables elegidas anteriorment [Ingreso Operativo Total, Ganancia (Pérdida) Neta y Rendimiento sobre los Activos (ROA) (%)]. A través de este análisis detallado, podremos proporcionar un informe más exhaustivo y fundamentado, que ofrecerá una perspectiva clara y específica.

Estadística Descriptiva cruzada con Paises

# Crear un vector para cada país
Brasil    <- Cotizadas %>% filter(País == "Brasil")
Venezuela <- Cotizadas %>% filter(País == "Venezuela")
Chile     <- Cotizadas %>% filter(País == "Chile")
Colombia  <- Cotizadas %>% filter(País == "Colombia")
Argentina <- Cotizadas %>% filter(País == "Argentina")
Uruguay   <- Cotizadas %>% filter(País == "Uruguay")
Perú      <- Cotizadas %>% filter(País == "Perú")
Ecuador   <- Cotizadas %>% filter(País == "Ecuador")
Bolivia   <- Cotizadas %>% filter(País == "Bolivia")
Paraguay  <- Cotizadas %>% filter(País == "Paraguay")
Surinam   <- Cotizadas %>% filter(País == "Surinam")


#ya tenemos separados los paises para poder hacer analitica descriptiva
#Lllamamos un dataset como "paisesa" para poder usarl este dataset especifico para esta sección


# Lista de países
paises <- c("Brasil", "Venezuela", "Chile", "Colombia", "Argentina",
            "Uruguay", "Perú", "Ecuador", "Bolivia", "Paraguay", "Surinam")


# Función para calcular estadísticas descriptivas
calcular_estadisticas <- function(var) {
  var <- var[!is.na(var)]
  c(
    Min = min(var),
    Q1 = quantile(var, 0.25),
    Promedio = mean(var),
    Mediana = median(var),
    Q3 = quantile(var, 0.75),
    Max = max(var),
    `Rango IQR` = IQR(var),
    Asimetría = skewness(var),
    Curtosis = kurtosis(var)
  )
}



# Función para generar tabla limpia y clara por variable
generar_tabla_variable <- function(nombre_variable) {
  tabla <- sapply(paises, function(pais) {
    datos_pais <- Cotizadas %>% filter(País == pais)
    calcular_estadisticas(datos_pais[[nombre_variable]])
  })

  tabla <- as.data.frame(t(tabla))
  tabla <- round(tabla, 2)
  tabla <- tibble::rownames_to_column(tabla, var = "País")
  return(tabla)
}

# Crear las tablas individuales
tabla_ingreso <- generar_tabla_variable("Total Ingreso Operativo")
tabla_ganancia <- generar_tabla_variable("Ganancia (Pérdida) Neta")
tabla_roa <- generar_tabla_variable("Rendimiento Sobre Los Activos (ROA) (%)")

Summary

# Mostrar las tablas con kable (sin columna "Variable", países bien alineados)
kable(tabla_ingreso, caption = "<span style='font-size: 15px; color: black;'><strong>📊 Estadísticas de Total Ingreso Operativo por País</strong></span>")
📊 Estadísticas de Total Ingreso Operativo por País
País Min Q1.25% Promedio Mediana Q3.75% Max Rango IQR Asimetría Curtosis
Brasil -1645.90 96.07 2460.71 402.15 1543.58 90572.75 1447.51 7.42 71.34
Venezuela -4598.66 0.59 5099.53 239.34 3850.83 53786.30 3850.24 3.01 12.33
Chile 0.00 11.23 1473.12 264.02 1025.83 29784.27 1014.60 5.03 30.97
Colombia 0.33 37.23 1485.13 241.14 1120.50 25859.57 1083.27 4.94 30.38
Argentina 0.00 54.41 1140.50 243.26 1046.69 18729.35 992.28 4.81 32.50
Uruguay 10.07 25.98 689.80 45.34 287.67 4488.11 261.68 2.16 5.85
Perú -2.84 25.08 451.59 101.47 462.41 4146.63 437.34 2.90 11.62
Ecuador 0.00 1.72 196.21 37.39 181.22 3795.01 179.50 5.46 38.41
Bolivia 0.00 11.14 119.95 63.76 198.30 884.77 187.16 2.41 10.54
Paraguay 0.01 11.79 73.40 31.25 108.22 384.33 96.43 1.62 4.89
Surinam 23.27 39.94 56.60 56.60 73.26 89.93 33.33 0.00 1.00
kable(tabla_ganancia, caption = "<span style='font-size: 14px; color: black;'><strong>📊 Estadísticas de Ganancia (Pérdida) Neta por País</strong></span>")
📊 Estadísticas de Ganancia (Pérdida) Neta por País
País Min Q1.25% Promedio Mediana Q3.75% Max Rango IQR Asimetría Curtosis
Brasil -2239.78 0.12 206.92 22.82 125.94 7829.19 125.82 5.68 44.85
Venezuela -15199.52 -2.12 456.71 3.60 143.84 14046.86 145.96 0.32 9.12
Chile -591.24 0.01 104.43 13.15 130.10 2861.48 130.09 5.37 45.86
Colombia -159.46 0.38 207.28 8.84 80.53 3668.25 80.15 4.08 21.22
Argentina -5190.56 -2.08 67.95 1.19 116.98 1765.67 119.06 -5.48 48.59
Uruguay -61.02 3.70 32.73 9.40 50.64 149.38 46.94 0.64 2.39
Perú -1064.38 0.26 59.38 9.81 38.81 1388.21 38.55 2.53 24.38
Ecuador -5.24 -0.01 16.38 0.70 11.79 165.19 11.80 2.76 10.41
Bolivia -152.07 0.08 6.79 1.66 13.96 62.73 13.88 -3.06 23.13
Paraguay -29.41 0.00 12.65 1.09 4.97 174.30 4.97 3.29 13.78
Surinam -10.12 -2.49 5.14 5.14 12.77 20.40 15.26 0.00 1.00
kable(tabla_roa, caption = "<span style='font-size: 13px; color: black;'><strong>📊 Estadísticas de ROA (%) por País</strong></span>")
📊 Estadísticas de ROA (%) por País
País Min Q1.25% Promedio Mediana Q3.75% Max Rango IQR Asimetría Curtosis
Brasil -251.32 0.05 2.00 3.23 7.65 167.02 7.60 -3.65 52.05
Venezuela -307.64 -3.10 -14.42 1.75 5.26 32.06 8.36 -3.91 18.79
Chile -39.38 0.05 4.86 2.78 6.41 120.37 6.36 4.95 37.73
Colombia -16.09 0.19 3.41 2.92 5.92 19.63 5.73 -0.02 4.83
Argentina -74.75 -2.38 3.12 2.32 9.19 261.91 11.57 5.59 48.35
Uruguay -79.88 4.47 -1.19 9.56 12.78 17.72 8.31 -2.17 5.89
Perú -76.17 0.26 3.93 2.99 8.30 53.90 8.04 -2.47 22.91
Ecuador -7.03 -0.25 2.79 0.88 3.26 50.87 3.51 3.80 22.74
Bolivia -42.33 0.11 1.48 0.66 3.59 36.34 3.47 -1.00 14.54
Paraguay -8.73 0.00 2.61 1.67 3.76 14.70 3.76 0.69 5.34
Surinam -1.55 -0.69 0.17 0.17 1.04 1.90 1.73 0.00 1.00


Tablas de Frecuencia

# Convertir columnas a numéricas (quitando comas o caracteres raros si es necesario)
Cotizadas <- Cotizadas %>%
  mutate(
    `Total Ingreso Operativo` = as.numeric(gsub(",", "", `Total Ingreso Operativo`)),
    `Ganancia (Pérdida) Neta` = as.numeric(gsub(",", "", `Ganancia (Pérdida) Neta`)),
    `Rendimiento Sobre Los Activos (ROA) (%)` = as.numeric(gsub("[,%]", "", `Rendimiento Sobre Los Activos (ROA) (%)`))
  )


# 2. Sumar cada variable por país
suma_por_pais <- Cotizadas %>%
  group_by(País) %>%
  summarise(
    Total_Ingreso_Operativo = sum(`Total Ingreso Operativo`, na.rm = TRUE),
    Ganancia_Neta = sum(`Ganancia (Pérdida) Neta`, na.rm = TRUE),
    ROA_Total = sum(`Rendimiento Sobre Los Activos (ROA) (%)`, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  arrange(desc(Total_Ingreso_Operativo))  # Ordenar por Total Ingreso Operativo

# 3. Mostrar la tabla bonita con kable
library(knitr)

kable(
  suma_por_pais,
  caption = "<span style='font-size: 15px; color: black;'><strong>📊 Suma de Variables Financieras por País</strong></span>"
)
📊 Suma de Variables Financieras por País
País Total_Ingreso_Operativo Ganancia_Neta ROA_Total
Brasil 925226.93 78008.45 753.27
Chile 248956.48 17648.27 820.88
Venezuela 147886.23 13244.59 -418.12
Argentina 100364.05 5979.70 274.69
Colombia 83167.12 11607.96 190.81
Perú 70448.15 9322.73 617.35
Ecuador 16089.30 1343.03 228.60
Bolivia 8036.55 454.84 99.38
Uruguay 5518.44 261.86 -9.50
Paraguay 3743.54 645.31 133.01
Surinam 113.20 10.28 0.35


Histograma

library(patchwork)

# 1. Filtrar datos para eliminar NA en "Total Ingreso Operativo"
Cotizadas <- Cotizadas %>% filter(!is.na(`Total Ingreso Operativo`))

# 2. Crear una lista de países únicos
paises <- unique(Cotizadas$País)

# 3. Crear lista para almacenar los gráficos individuales
graficos <- list()

# 4. Generar histogramas individuales para cada país
for (pais in paises) {
  datos_pais <- Cotizadas %>% filter(País == pais)
  
  histograma <- ggplot(datos_pais, aes(x = `Total Ingreso Operativo`)) +
    geom_histogram(bins = 30, fill = "lightblue", color = "black") +  # Puedes ajustar "bins" si quieres más o menos detalle
    labs(
      title = pais,
      x = "Total Ingreso Operativo",
      y = "Frecuencia"
    ) +
    theme_minimal() +
    theme(
      plot.title = element_text(face = "bold", size = 10),
      axis.text = element_text(size = 6),
      axis.title.x = element_text(size = 8),
      axis.title.y = element_text(size = 8)
    )
  
  # Agregar el gráfico a la lista
  graficos[[pais]] <- histograma
}

# 5. Combinar todos los gráficos en una cuadrícula (5 columnas por fila)
dashboard <- wrap_plots(graficos, ncol = 4)

# 6. Mostrar el dashboard
dashboard


Boxplot por Paises

# Boxplot: Total Ingreso Operativo por país
ggplot(Cotizadas, aes(x = País, y = `Total Ingreso Operativo`)) +
  geom_boxplot(fill = "#0073C2FF", color = "black", outlier.color = "red") +
  theme_minimal() +
  coord_flip() +
  labs(
    title = "Distribución del Total Ingreso Operativo por País",
    x = "País",
    y = "Total Ingreso Operativo"
  )

# Boxplot: Ganancia (Pérdida) Neta por país
ggplot(Cotizadas, aes(x = País, y = `Ganancia (Pérdida) Neta`)) +
  geom_boxplot(fill = "#EFC000FF", color = "black", outlier.color = "red") +
  theme_minimal() +
  coord_flip() +
  labs(
    title = "Distribución de Ganancia (Pérdida) Neta por País",
    x = "País",
    y = "Ganancia (Pérdida) Neta"
  )

# Boxplot: ROA (%) por país
ggplot(Cotizadas, aes(x = País, y = `Rendimiento Sobre Los Activos (ROA) (%)`)) +
  geom_boxplot(fill = "#868686FF", color = "black", outlier.color = "red") +
  theme_minimal() +
  coord_flip() +
  labs(
    title = "Distribución del ROA (%) por País",
    x = "País",
    y = "ROA (%)"
  )

Eliminacion de datos Atipicos

# Lista de variables
variables <- c("Total Ingreso Operativo", "Ganancia (Pérdida) Neta", "Rendimiento Sobre Los Activos (ROA) (%)")

# Función para calcular límites y detectar atípicos
encontrar_atipicos <- function(data, grupo, variable){
  data %>%
    group_by(across(all_of(grupo))) %>%
    mutate(
      Q1 = quantile(.data[[variable]], 0.25, na.rm = TRUE),
      Q3 = quantile(.data[[variable]], 0.75, na.rm = TRUE),
      IQR = Q3 - Q1,
      Liminf = Q1 - 1.5 * IQR,
      Limsup = Q3 + 1.5 * IQR,
      Atipico = (.data[[variable]] < Liminf | .data[[variable]] > Limsup)
    )
}


# Detectar atípicos por País
atipicos_por_pais <- lapply(variables, function(var){
  encontrar_atipicos(Cotizadas, "País", var)
})
names(atipicos_por_pais) <- variables




# Detectar atípicos por País
atipicos_por_pais <- lapply(variables, function(var){
  encontrar_atipicos(Cotizadas, "País", var)
})
names(atipicos_por_pais) <- variables





# Función para eliminar atípicos
eliminar_atipicos <- function(df){
  df %>% filter(!Atipico)
}

# Filtrados sin atípicos por País
sin_atipicos_pais <- lapply(atipicos_por_pais, eliminar_atipicos)


library(psych)  # para describe

# Estadística descriptiva por país
analisis_descriptivo_pais <- lapply(sin_atipicos_pais, function(df){
  describeBy(df[[variables[1]]], group = df$País)
})

# Boxplot por país para cada variable sin atípicos
for (var in variables) {
  ggplot(sin_atipicos_pais[[var]], aes(x = reorder(País, .data[[var]], median, na.rm=TRUE), y = .data[[var]])) +
    geom_boxplot(fill = "#69b3a2") +
    coord_flip() +
    labs(title = paste("Boxplot de", var, "por País (sin atípicos)"),
         x = "País", y = var) +
    theme_minimal() -> plot
  print(plot)
}

Estadística Descriptiva cruzada con Sectores


Summary

# Separar por sector (si hay más de uno por fila, crea nuevas filas)
Cotizadas_long <- Cotizadas %>%
  separate_rows(Sectores, sep = ";\\s*") %>%  # Separar por "; " o ";"
  mutate(Sectores = str_trim(Sectores))  # Elimina los espacios extra

# Convertir Sectores a texto, limpiar y separar
Cotizadas_long <- Cotizadas %>%
  mutate(Sectores = as.character(Sectores)) %>%  # Asegura que sea texto
  separate_rows(Sectores, sep = ";\\s*") %>%
  mutate(Sectores = str_trim(Sectores))  # Quita espacios adicionales


# Calcular estadísticas descriptivas por sector


# Tabla para "Total Ingreso Operativo"
tabla_ingreso <- Cotizadas_long %>%
  group_by(Sectores) %>%
  summarise(
    Min_Ingreso = min(`Total Ingreso Operativo`, na.rm = TRUE),
    Q1_Ingreso = quantile(`Total Ingreso Operativo`, 0.25, na.rm = TRUE),
    Promedio_Ingreso = mean(`Total Ingreso Operativo`, na.rm = TRUE),
    Mediana_Ingreso = median(`Total Ingreso Operativo`, na.rm = TRUE),
    Q3_Ingreso = quantile(`Total Ingreso Operativo`, 0.75, na.rm = TRUE),
    Max_Ingreso = max(`Total Ingreso Operativo`, na.rm = TRUE),
    Rango_IQR_Ingreso = IQR(`Total Ingreso Operativo`, na.rm = TRUE),
    Asimetría_Ingreso = skewness(`Total Ingreso Operativo`, na.rm = TRUE),
    Curtosis_Ingreso = kurtosis(`Total Ingreso Operativo`, na.rm = TRUE),
    .groups = "drop"
  )

# Tabla para "Rendimiento Sobre Los Activos (ROA) (%)"
tabla_roa <- Cotizadas_long %>%
  group_by(Sectores) %>%
  summarise(
    Min_ROA = min(`Rendimiento Sobre Los Activos (ROA) (%)`, na.rm = TRUE),
    Q1_ROA = quantile(`Rendimiento Sobre Los Activos (ROA) (%)`, 0.25, na.rm = TRUE),
    Promedio_ROA = mean(`Rendimiento Sobre Los Activos (ROA) (%)`, na.rm = TRUE),
    Mediana_ROA = median(`Rendimiento Sobre Los Activos (ROA) (%)`, na.rm = TRUE),
    Q3_ROA = quantile(`Rendimiento Sobre Los Activos (ROA) (%)`, 0.75, na.rm = TRUE),
    Max_ROA = max(`Rendimiento Sobre Los Activos (ROA) (%)`, na.rm = TRUE),
    Rango_IQR_ROA = IQR(`Rendimiento Sobre Los Activos (ROA) (%)`, na.rm = TRUE),
    Asimetría_ROA = skewness(`Rendimiento Sobre Los Activos (ROA) (%)`, na.rm = TRUE),
    Curtosis_ROA = kurtosis(`Rendimiento Sobre Los Activos (ROA) (%)`, na.rm = TRUE),
    .groups = "drop"
  )

# Tabla para "Ganancia (Pérdida) Neta"
tabla_ganancia <- Cotizadas_long %>%
  group_by(Sectores) %>%
  summarise(
    Min_Ganancia = min(`Ganancia (Pérdida) Neta`, na.rm = TRUE),
    Q1_Ganancia = quantile(`Ganancia (Pérdida) Neta`, 0.25, na.rm = TRUE),
    Promedio_Ganancia = mean(`Ganancia (Pérdida) Neta`, na.rm = TRUE),
    Mediana_Ganancia = median(`Ganancia (Pérdida) Neta`, na.rm = TRUE),
    Q3_Ganancia = quantile(`Ganancia (Pérdida) Neta`, 0.75, na.rm = TRUE),
    Max_Ganancia = max(`Ganancia (Pérdida) Neta`, na.rm = TRUE),
    Rango_IQR_Ganancia = IQR(`Ganancia (Pérdida) Neta`, na.rm = TRUE),
    Asimetría_Ganancia = skewness(`Ganancia (Pérdida) Neta`, na.rm = TRUE),
    Curtosis_Ganancia = kurtosis(`Ganancia (Pérdida) Neta`, na.rm = TRUE),
    .groups = "drop"
  )

# Mostrar las tres tablas
#print(tabla_ingreso)
#kable(tabla_ingreso, caption = "Estadísticas de Total Ingreso Operativo por Sector", format = "html")

# Mostrar la tabla de ingreso bonito con líneas
kable(tabla_ingreso, 
      caption = "<span style='font-size: 15px; color: black;'><strong>📊 Estadísticas de Total Ingreso Operativo por Sector</strong></span>",
      format = "html") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive"), position = "center", font_size = 13)
📊 Estadísticas de Total Ingreso Operativo por Sector
Sectores Min_Ingreso Q1_Ingreso Promedio_Ingreso Mediana_Ingreso Q3_Ingreso Max_Ingreso Rango_IQR_Ingreso Asimetría_Ingreso Curtosis_Ingreso
Administración pública(26) 57.52 101.5175 145.5150 145.515 189.5125 233.51 87.9950 0.000000 1.000000
Aeroespacial y defensa(16) 1916.60 3149.8250 4383.0500 4383.050 5616.2750 6849.50 2466.4500 0.000000 1.000000
Agronegocios(1) -4598.66 4.3500 2755.6572 147.110 1025.5500 77576.39 1021.2000 5.534433 37.949308
Automotor(3) 0.00 25.4500 666.1746 134.000 684.0600 6926.65 658.6100 3.162119 14.319779
Banca y seguros(9) -0.06 23.3825 1097.6879 133.700 594.5225 25420.70 571.1400 5.174551 33.577697
Bienes raíces y construcción(13) -168.39 22.6875 1008.3061 219.235 518.9125 32034.11 496.2250 6.544119 48.634776
Bienes y servicios de consumo(12) 0.00 89.6600 2773.0179 360.530 1579.8800 77576.39 1490.2200 5.708306 44.766110
Cuidado de la salud y farmacia(8) 9.91 105.2425 2811.2838 435.975 1408.7450 32034.11 1303.5025 3.373423 13.772495
Energía y servicios públicos(5) -58.81 175.9450 3585.5862 705.280 2053.1400 90572.75 1877.1950 5.734372 41.444682
Fabricación industrial(15) -1.03 52.5325 899.4072 299.165 1044.9250 7058.64 992.3925 2.647034 10.586732
Gestión de residuos(27) 107.25 324.0200 4038.5000 1100.090 1677.2750 32034.11 1353.2550 2.644155 8.040965
Metales y minería(6) 0.32 94.5500 2903.0614 410.560 2021.0750 37992.79 1926.5250 3.520328 15.818347
Producción de alimentos y bebidas(2) 0.00 105.7825 2602.6323 378.830 1474.4250 77576.39 1368.6425 6.907733 55.358552
Productos químicos y materiales(7) -0.23 61.5250 2610.7986 224.140 1552.6500 77576.39 1491.1250 7.020513 60.853557
Servicios(17) -1.03 120.5900 2125.8360 467.255 1648.6700 37992.79 1528.0800 4.487242 26.797069
TMT(10) -1.03 117.3650 1629.5824 460.160 1754.4900 17145.27 1637.1250 2.931101 13.387071
Transporte y logística(14) -1645.90 160.1850 3344.0293 543.960 2260.7300 77576.39 2100.5450 5.750000 43.131782
Turismo y ocio(11) -2.84 5.1850 404.5795 30.790 209.0700 7111.19 203.8850 4.650867 25.366659
Venta al por mayor(25) 0.00 113.5350 3399.5853 316.990 1567.9150 90572.75 1454.3800 5.679193 39.076405
# Mostrar la tabla de Rendimeinto sobre los activos bonito con líneas
kable(tabla_roa, 
      caption = "<span style='font-size: 15px; color: black;'><strong>📊 Estadísticas de ROA por Sector</strong></span>",
      format = "html") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive"), position = "center", font_size = 13)
📊 Estadísticas de ROA por Sector
Sectores Min_ROA Q1_ROA Promedio_ROA Mediana_ROA Q3_ROA Max_ROA Rango_IQR_ROA Asimetría_ROA Curtosis_ROA
Administración pública(26) 0.54 0.7150 0.8900000 0.890 1.0650 1.24 0.3500 0.0000000 1.000000
Aeroespacial y defensa(16) 2.63 4.2875 5.9450000 5.945 7.6025 9.26 3.3150 0.0000000 1.000000
Agronegocios(1) -89.64 -1.6800 0.5994737 1.420 5.4900 23.29 7.1700 -4.2067989 28.623583
Automotor(3) -52.67 0.0000 0.1469565 1.770 4.3225 15.06 4.3225 -2.8646951 12.698930
Banca y seguros(9) -307.64 0.5625 3.4995588 1.745 5.6925 167.02 5.1300 -7.3550889 122.615086
Bienes raíces y construcción(13) -140.67 -0.5900 4.0779070 3.020 7.6275 261.91 8.2175 3.3370275 37.105659
Bienes y servicios de consumo(12) -52.67 0.0000 3.8573023 2.820 7.4050 120.37 7.4050 3.2431175 33.830764
Cuidado de la salud y farmacia(8) -23.54 -0.1125 2.8815000 3.015 6.6700 25.41 6.7825 -0.4859868 5.288019
Energía y servicios públicos(5) -63.05 1.2600 4.1351309 5.060 8.4550 64.38 7.1950 -1.7607782 19.631554
Fabricación industrial(15) -39.45 -0.6825 3.6737500 2.175 10.1975 40.92 10.8800 -0.4314558 6.305329
Gestión de residuos(27) -0.53 1.1725 4.8590000 3.680 8.2100 12.99 7.0375 0.4031894 1.778232
Metales y minería(6) -131.44 0.1500 2.3210345 3.830 8.6950 53.90 8.5450 -4.7710125 34.318571
Producción de alimentos y bebidas(2) -10.42 0.7750 4.5913953 3.570 6.8975 40.55 6.1225 2.0775994 10.897073
Productos químicos y materiales(7) -74.75 -0.2000 0.7221622 2.690 5.9000 29.72 6.1000 -3.0054114 15.679688
Servicios(17) -52.67 0.0025 3.8932243 2.635 7.3400 167.02 7.3375 5.3224900 61.924939
TMT(10) -79.88 -4.2350 2.5651087 2.195 8.6325 107.59 12.8675 0.8628702 15.087382
Transporte y logística(14) -251.32 -0.9050 -0.3333645 2.910 6.3650 47.42 7.2700 -7.5025085 69.453185
Turismo y ocio(11) -27.09 -4.4350 0.5087179 0.070 2.5650 47.42 7.0000 1.0616240 6.696984
Venta al por mayor(25) -52.67 0.0000 2.6649669 2.780 7.3350 48.63 7.3350 -0.8018533 12.719575
# Mostrar la tabla de Rendimeinto sobre los activos bonito con líneas
kable(tabla_ganancia, 
      caption = "<span style='font-size: 15px; color: black;'><strong>📊 Estadísticas de Ganancia por Sector</strong></span>",
      format = "html") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive"), position = "center", font_size = 13)
📊 Estadísticas de Ganancia por Sector
Sectores Min_Ganancia Q1_Ganancia Promedio_Ganancia Mediana_Ganancia Q3_Ganancia Max_Ganancia Rango_IQR_Ganancia Asimetría_Ganancia Curtosis_Ganancia
Administración pública(26) 2.63 6.9675 11.30500 11.305 15.6425 19.98 8.6750 0.0000000 1.000000
Aeroespacial y defensa(16) 174.20 220.0325 265.86500 265.865 311.6975 357.53 91.6650 0.0000000 1.000000
Agronegocios(1) -15199.52 -0.1100 -83.30932 1.910 32.4100 2759.20 32.5200 -9.4481015 101.877130
Automotor(3) -164.61 0.0000 27.53348 2.950 30.4900 336.99 30.4900 1.8661262 9.344933
Banca y seguros(9) -446.58 0.8150 203.34632 17.010 109.6950 7829.19 108.8800 7.3337452 67.213596
Bienes raíces y construcción(13) -295.73 -0.0525 79.91727 11.960 73.2825 1785.97 73.3350 4.2992683 25.663967
Bienes y servicios de consumo(12) -2239.78 0.0000 111.52893 17.700 75.9700 2759.20 75.9700 2.3151329 23.121319
Cuidado de la salud y farmacia(8) -222.25 -0.8850 103.14900 17.295 86.4575 1183.26 87.3425 2.5031300 9.132506
Energía y servicios públicos(5) -5190.56 5.2700 196.18827 48.470 226.0500 6877.86 220.7800 1.9073261 34.219030
Fabricación industrial(15) -532.73 -2.7150 42.37750 6.360 36.1650 1174.30 38.8800 3.0295434 18.006717
Gestión de residuos(27) -13.55 10.7125 166.78300 30.355 103.2800 1183.26 92.5675 2.4629937 7.422857
Metales y minería(6) -1309.21 0.3350 329.99184 14.230 71.2150 13706.42 70.8800 6.9742844 55.642826
Producción de alimentos y bebidas(2) -1516.81 1.0875 241.61884 13.075 52.2550 14046.86 51.1675 8.1407381 71.899423
Productos químicos y materiales(7) -2239.78 -0.0200 226.07838 5.310 47.3200 13706.42 47.3400 7.9405105 75.589980
Servicios(17) -1309.21 0.0300 159.74916 21.860 117.6275 5655.38 117.5975 5.8598579 48.434796
TMT(10) -446.58 -4.5250 195.41609 19.860 98.1775 2759.20 102.7025 2.8239974 11.502258
Transporte y logística(14) -2239.78 -3.9700 70.84916 22.180 119.7400 1989.26 123.7100 -0.7036058 12.374561
Turismo y ocio(11) -109.93 -2.5800 52.21333 0.010 12.9100 1538.96 15.4900 5.6125092 33.853257
Venta al por mayor(25) -2239.78 0.0000 134.92404 8.610 70.9050 6877.86 70.9050 6.1765144 58.938380

Tablas de Frecuencia

#segunda opcion 
library(dplyr)
library(knitr)
library(kableExtra)
library(stringr)
library(tidyr)

# 1. Separar filas donde hay múltiples sectores
Cotizadas_long <- Cotizadas %>%
  separate_rows(Sectores, sep = ";\\s*") %>%
  mutate(Sectores = str_trim(Sectores))

# 2. Sumar las tres variables por Sector
suma_por_sector <- Cotizadas_long %>%
  group_by(Sectores) %>%
  summarise(
    Total_Ingreso_Operativo = sum(`Total Ingreso Operativo`, na.rm = TRUE),
    Ganancia_Neta = sum(`Ganancia (Pérdida) Neta`, na.rm = TRUE),
    ROA_Total = sum(`Rendimiento Sobre Los Activos (ROA) (%)`, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  arrange(Sectores)  # Ordenar por Ingreso Operativo

# 3. Mostrar tabla bonita con kable y kable_styling
kable(
  suma_por_sector,
  caption = "<span style='font-size: 15px; color: black;'><strong>📊 Suma de Variables Financieras por Sector</strong></span>",
  format = "html"
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    position = "left",
    font_size = 13
  )
📊 Suma de Variables Financieras por Sector
Sectores Total_Ingreso_Operativo Ganancia_Neta ROA_Total
Administración pública(26) 291.03 22.61 1.78
Aeroespacial y defensa(16) 8766.10 531.73 11.89
Agronegocios(1) 366502.41 -11080.14 79.73
Automotor(3) 30644.03 1266.54 6.76
Banca y seguros(9) 298571.12 55310.20 951.88
Bienes raíces y construcción(13) 173428.65 13745.77 701.40
Bienes y servicios de consumo(12) 596198.84 23978.72 829.32
Cuidado de la salud y farmacia(8) 112451.35 4125.96 115.26
Energía y servicios públicos(5) 684846.96 37471.96 789.81
Fabricación industrial(15) 28781.03 1356.08 117.56
Gestión de residuos(27) 40385.00 1667.83 48.59
Metales y minería(6) 252566.34 28709.29 201.93
Producción de alimentos y bebidas(2) 223826.38 20779.22 394.86
Productos químicos y materiales(7) 289798.64 25094.70 80.16
Servicios(17) 454928.91 34186.32 833.15
TMT(10) 149921.58 17978.28 235.99
Transporte y logística(14) 357811.14 7580.86 -35.67
Turismo y ocio(11) 15778.60 2036.32 19.84
Venta al por mayor(25) 513337.38 20373.53 402.41

Histogramas

Boxplot por Sectores

# Asegurar que la variable Sectores está en orden alfabético
Cotizadas_long$Sectores <- factor(Cotizadas_long$Sectores, levels = sort(unique(Cotizadas_long$Sectores)))

# Boxplot 1: Ingreso Operativo por Sector
p1 <- ggplot(Cotizadas_long, aes(x = Sectores, y = `Total Ingreso Operativo`, fill = Sectores)) +
  geom_boxplot() +
  coord_flip() +
  labs(title = "Ingreso Operativo por Sector",
       x = "Sector", y = "Ingreso Operativo Total") +
  theme_light() +
  theme(legend.position = "none")
print(p1)

# Boxplot 2: Ganancia Neta por Sector
p2 <- ggplot(Cotizadas_long, aes(x = Sectores, y = `Ganancia (Pérdida) Neta`, fill = Sectores)) +
  geom_boxplot() +
  coord_flip() +
  labs(title = "Ganancia (Pérdida) Neta por Sector",
       x = "Sector", y = "Ganancia Neta") +
  theme_light() +
  theme(legend.position = "none")
print(p2)

# Boxplot 3: ROA por Sector
p3 <- ggplot(Cotizadas_long, aes(x = Sectores, y = `Rendimiento Sobre Los Activos (ROA) (%)`, fill = Sectores)) +
  geom_boxplot() +
  coord_flip() +
  labs(title = "ROA (%) por Sector",
       x = "Sector", y = "ROA (%)") +
  theme_light() +
  theme(legend.position = "none")
print(p3)


Elimincación de datos Atipicos

#revisar de auqi a abajo
# 1. Separar y limpiar sectores
Cotizadas_long <- Cotizadas %>%
  mutate(Sectores = as.character(Sectores)) %>%
  separate_rows(Sectores, sep = ";\\s*") %>%
  mutate(Sectores = str_trim(Sectores))  # Quita espacios

# 2. Eliminar atípicos por sector para cada variable
sin_atipicos_sector <- list()

for (var in variables) {
  sin_atipicos_sector[[var]] <- Cotizadas_long %>%
    group_by(Sectores) %>%
    mutate(
      Q1 = quantile(.data[[var]], 0.25, na.rm = TRUE),
      Q3 = quantile(.data[[var]], 0.75, na.rm = TRUE),
      IQR = Q3 - Q1,
      LimInf = Q1 - 1.5 * IQR,
      LimSup = Q3 + 1.5 * IQR
    ) %>%
    filter(.data[[var]] >= LimInf & .data[[var]] <= LimSup) %>%
    ungroup()
}

# 3. (Opcional) Estadística descriptiva por sector
analisis_descriptivo_sector <- lapply(variables, function(var) {
  describeBy(sin_atipicos_sector[[var]][[var]], group = sin_atipicos_sector[[var]]$Sectores)
})

# 4. Boxplots por sector (sin atípicos)
for (var in variables) {
  ggplot(sin_atipicos_sector[[var]], aes(x = reorder(Sectores, .data[[var]], median, na.rm = TRUE), y = .data[[var]])) +
    geom_boxplot(fill = "#FFB347") +
    coord_flip() +
    labs(title = paste("📦 Boxplot de", var, "por Sector (sin atípicos)"),
         x = "Sector", y = var) +
    theme_minimal() +
    theme(text = element_text(size = 10)) -> plot
  print(plot)
}


Analisis de toda la infromación y Conclusion de todo el Proyecto