Colombina S.A. es una de las empresas más reconocidas en la industria de alimentos en Colombia y a nivel internacional. Fundada en 1927, ha consolidado su presencia en más de 80 países, ofreciendo una amplia gama de productos, incluyendo confitería, galletas, helados y alimentos procesados. Su crecimiento sostenido, estrategias de diversificación y solidez financiera la han convertido en un referente del sector.
El análisis financiero de Colombina es clave para evaluar su desempeño en el mercado, identificar tendencias y comprender los factores que impulsan su rentabilidad y estabilidad. En este documento, realizaremos un análisis exploratorio de algunas variables financieras clave de la empresa entre 2016 y 2024, utilizando R. Aplicaremos técnicas de estadística descriptiva y visualización de datos para detectar patrones, anomalías y relaciones entre variables, facilitando una mejor interpretación de su evolución financiera.
A través de este análisis, se busca proporcionar una visión más clara de la situación financiera de Colombina, lo cual puede ser útil para inversionistas, analistas financieros y académicos interesados en la industria de alimentos.
El análisis exploratorio de datos (EDA) es un paso clave para comprender la información financiera de Colombina S.A., identificar patrones y evaluar la distribución de las variables.
A través de estadísticas descriptivas y visualización de datos con R, identificaremos tendencias, relaciones entre variables y posibles anomalías, proporcionando una base sólida para interpretar el desempeño financiero de Colombina en el período 2016-2024.
PASO 1. Instalar y cargar librerias
# Cargar librerías necesarias
library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
library(knitr)
library(kableExtra)
library(tidyr)
library(tidyverse)
PASO 2: Cargar la base de datos
# Cargar datos desde el archivo Excel
datos_col <- read_excel("/Users/jasondevuijst/Downloads/Colombina.xlsx",
col_types = c("date", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric"))
# Ver las primeras filas de los datos
class(datos_col)
## [1] "tbl_df" "tbl" "data.frame"
colnames(datos_col)
## [1] "FECHA" "INGRESOS" "UTILIDADOPER" "ACTIVOS" "PASIVOS"
## [6] "EBITDA" "QUICKRATIO" "MEBITDA" "MBRUTO" "MOPERACIONAL"
## [11] "ROA" "ROE"
head(datos_col)
| FECHA | INGRESOS | UTILIDADOPER | ACTIVOS | PASIVOS | EBITDA | QUICKRATIO | MEBITDA | MBRUTO | MOPERACIONAL | ROA | ROE |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2016-01-01 | 400871238 | 134228489 | 1394448794 | 1195743931 | 47789382 | 0.46 | 11.92 | 33.48 | 7.66 | 3.75 | 22.90 |
| 2016-04-01 | 398002762 | 132113511 | 1383049000 | 1192835000 | 36523618 | 0.61 | 9.18 | 33.19 | 4.88 | 3.77 | 23.15 |
| 2016-07-01 | 480807000 | 163638000 | 1401579000 | 1204776000 | 55165000 | 0.59 | 11.47 | 34.03 | 8.05 | 3.79 | 23.40 |
| 2016-10-01 | 469500000 | 158209000 | 1416316000 | 1179764000 | 78004000 | 0.50 | 16.61 | 33.70 | 13.71 | 4.18 | 23.50 |
| 2017-01-01 | 397086000 | 138297000 | 1427549000 | 1240232000 | 49863000 | 0.54 | 12.56 | 34.83 | 8.74 | 3.57 | 26.64 |
| 2017-04-01 | 398514000 | 136094000 | 1460785000 | 1268580000 | 43652000 | 0.56 | 10.95 | 34.15 | 6.29 | 3.36 | 25.92 |
Indicadores de centralidad y dispersión
# Resumen estadístico de las variables financieras
resumen <- datos_col %>%
select(INGRESOS, UTILIDADOPER, ACTIVOS, PASIVOS, EBITDA) %>%
summary()
resumen
## INGRESOS UTILIDADOPER ACTIVOS
## Min. :397086000 Min. :117049000 Min. :1.383e+09
## 1st Qu.:457554500 1st Qu.:153991500 1st Qu.:1.465e+09
## Median :498207000 Median :174979000 Median :1.678e+09
## Mean :570795229 Mean :195623514 Mean :1.780e+09
## 3rd Qu.:709237000 3rd Qu.:240252000 3rd Qu.:2.124e+09
## Max. :871052000 Max. :318313000 Max. :2.571e+09
## PASIVOS EBITDA
## Min. :1.180e+09 Min. : 19556000
## 1st Qu.:1.279e+09 1st Qu.: 50363000
## Median :1.465e+09 Median : 61485000
## Mean :1.556e+09 Mean : 68257714
## 3rd Qu.:1.827e+09 3rd Qu.: 79529500
## Max. :2.273e+09 Max. :125447000
Gráfico de barras
# Crear el gráfico de barras interactivo
grafico_barras_ingresos <- datos_col %>%
plot_ly(x = ~FECHA, y = ~INGRESOS, type = 'bar',
marker = list(color = 'skyblue')) %>%
layout(title = "Figura 1. Ingresos de Colombina por Periodo",
xaxis = list(title = "Periodo"),
yaxis = list(title = "Ingreso (Miles de pesos)"),
hovermode = "x")
# Mostrar el gráfico
grafico_barras_ingresos
Gráfico de líneas-Crecimiento anual%)
# Ordenar por fecha
datos_col <- datos_col %>% arrange(FECHA)
# Calcular la tasa de crecimiento anual de los ingresos comparando con el mismo trimestre del año anterior
datos_col <- datos_col %>%
mutate(CRECIMIENTO_INGRESOS = (INGRESOS / lag(INGRESOS, 4) - 1) * 100)
# Crear el gráfico interactivo con Plotly
grafico_crecimiento <- datos_col %>%
filter(!is.na(CRECIMIENTO_INGRESOS)) %>% # Filtrar valores NA que aparecen en los primeros 4 trimestres
plot_ly(x = ~FECHA, y = ~CRECIMIENTO_INGRESOS, type = 'scatter', mode = 'lines+markers',
line = list(color = 'lightblue', width = 3),
marker = list(color = 'grey', size = 6)) %>%
layout(title = "Figura 2. Tasa de Crecimiento Anual de Ingresos (1T2017 - 3T2024)",
xaxis = list(title = "Periodo"),
yaxis = list(title = "Crecimiento (%)", tickformat = ".1f"),
hovermode = "x unified",
plot_bgcolor = "rgba(245, 245, 245, 0.9)")
# Mostrar el gráfico
grafico_crecimiento
Gráfico de líneas-niveles
grafico_ingresos <- datos_col %>%
plot_ly(x = ~FECHA, y = ~INGRESOS, type = 'scatter', mode = 'lines+markers',
line = list(color = 'lightblue', width = 3),
marker = list(color = 'black', size = 5)) %>%
layout(title = "Figura 2.1 Evolución de Ingresos totales (1T2016-3T2024",
xaxis = list(title = "Periodo"),
yaxis = list(title = "Ingreso (Miles de pesos)"),
hovermode = "x")
# Mostrar el gráfico
grafico_ingresos
Boxplot Ingresos
La figura 3, muestra que:
📊 La mediana está más cerca de Q1 que de Q3 → Indica una distribución sesgada hacia la derecha, es decir, hay algunos ingresos excepcionalmente altos que elevan la media.
🔼 Amplio rango intercuartil (IQR = Q3 - Q1 = 273,802,750) → Indica una variabilidad significativa en los ingresos.
🚀 No se observan valores atípicos (fuera de los bigotes), lo que sugiere que los ingresos no han tenido fluctuaciones extremas fuera de lo esperado.
📉 El mínimo y máximo muestran un rango amplio (397M - 871M) → La empresa ha tenido variaciones importantes en sus ingresos a lo largo del tiempo.
Los ingresos de la empresa han mostrado una tendencia general al alza con variabilidad en su comportamiento.
library(plotly)
plot_ly(
data = datos_col,
y = ~INGRESOS,
type = "box",
boxpoints = "outliers"
) %>%
layout(
title = "Figura 3. Boxplot de los ingresos totales",
yaxis = list(title = "Precio")
)
Gráfico de barras
# Crear el gráfico de barras interactivo
grafico_barras_ingresos <- datos_col %>%
plot_ly(x = ~FECHA, y = ~INGRESOS, type = 'bar',
marker = list(color = 'skyblue')) %>%
layout(title = "Ingresos de Colombina por Periodo",
xaxis = list(title = "Periodo"),
yaxis = list(title = "Figura 4. Ingreso (Miles de pesos)"),
hovermode = "x")
# Mostrar el gráfico
grafico_barras_ingresos
Correlación-Dispersión
En la Figura 5. se observa una fuerte correlación positiva entre los ingresos y la utilidad operacional, con un coeficiente de correlación de 0.99.
Esto indica que a medida que los ingresos aumentan, la utilidad operacional también crece en casi la misma proporción.
library(dplyr)
library(plotly)
datos_ok <- datos_col %>%
transmute(
INGRESOS = suppressWarnings(as.numeric(INGRESOS)),
UTILIDADOPER = suppressWarnings(as.numeric(UTILIDADOPER))
) %>%
filter(!is.na(INGRESOS), !is.na(UTILIDADOPER))
r <- if (nrow(datos_ok) >= 2) cor(datos_ok$INGRESOS, datos_ok$UTILIDADOPER) else NA
# Modelo lineal
modelo <- lm(UTILIDADOPER ~ INGRESOS, data = datos_ok)
# Crear valores para la línea
x_linea <- seq(min(datos_ok$INGRESOS), max(datos_ok$INGRESOS), length.out = 100)
y_linea <- predict(modelo, newdata = data.frame(INGRESOS = x_linea))
plot_ly(
datos_ok,
x = ~INGRESOS,
y = ~UTILIDADOPER,
type = "scatter",
mode = "markers",
marker = list(color = "lightblue")
) %>%
add_lines(
x = x_linea,
y = y_linea,
line = list(color = "grey", width = 2),
name = "Tendencia (LM)"
) %>%
layout(
title = if (!is.na(r)) paste0("Figura 5. Relación entre ingresos y utilidad operacional<br>r = ", round(r, 2))
else "Figura 5. Relación entre ingresos y utilidad operacional<br>(sin datos suficientes)",
xaxis = list(title = "Ingresos (miles de pesos)"),
yaxis = list(title = "Utilidad operacional (miles de pesos)")
)
# Crear gráfico de líneas interactivo comparando Activos y Pasivos
grafico_lineas_activos_pasivos <- plot_ly(datos_col, x = ~FECHA) %>%
add_lines(y = ~ACTIVOS, name = "Activos", line = list(color = 'green')) %>%
add_lines(y = ~PASIVOS, name = "Pasivos", line = list(color = 'purple')) %>%
layout(title = "Figura 6. Comparación de Activos y Pasivos de Colombina S.A",
xaxis = list(title = "Periodo"),
yaxis = list(title = "Valor en Miles de pesos"),
hovermode = "x")
# Mostrar el gráfico
grafico_lineas_activos_pasivos
# Crear gráfico de líneas interactivo comparando Ingresos y EBITDA
grafico_lineas_ingresos_ebitda <- plot_ly(datos_col, x = ~FECHA) %>%
add_lines(y = ~INGRESOS, name = "Ingresos", line = list(color = 'green')) %>%
add_lines(y = ~EBITDA, name = "EBITDA", line = list(color = 'purple')) %>%
layout(title = "fIGURA 7. Comparación de Ingresos y EBITDA de Colombina",
xaxis = list(title = "Periodo"),
yaxis = list(title = "Valor en Miles de pesos"),
hovermode = "x")
# Mostrar el gráfico
grafico_lineas_ingresos_ebitda