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 “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.
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.
# Leemos el archivo
Cotizadas <- read_excel("C:/Users/diego/Downloads/Cotizadas.xlsx",
sheet = "Worksheet")
Cotizadas-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.
Seleccionamos las siguientes variables:
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.
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.
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) (%)`))
)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) (%)`)# 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")| 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 |
# # 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) (%)")# 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)
}Aqui la idea es escribir toda la infroamcion de lo que se saco arriba y ver su comportamiento. Se puede deducir que:
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.
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.
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.
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.
# 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) (%)")# 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>")| 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>")| 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>")| 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 |
# 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>"
)| 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 |
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: 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 (%)"
)# 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)
}# 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)| 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)| 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)| 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 |
#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
)| 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 |
# 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)#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)
}