En esta publicación voy a mostrar un caso de uso de R para analizar estados contables Este es sólo un ejemplo sencillo pero muestra como se pueden aplicar este tipo de herramientas de analisis de datos (ya sea R python, etc.) en diversos ámbitos, tanto para realizar análisis como para automatizar tareas.
library(readxl) #Lectura de arhivos .xlsx
library(tidyverse) #Manipulación de tablas,datos y gráficos
library(corrplot) #Grafico de correlación
library(psych) #Estadísticos descriptivos
options(scipen = 999) #Desactiva notación cienctíficaEstados <- read_xlsx("Estados.xlsx",sheet = "Estados_Consolidados")Muestra de 5 filas del dataset:
| Apertura | Año 2012 | Año 2013 | Año 2014 | Año 2015 | Año 2016 | Año 2017 | Año 2018 | Año 2019 | Año 2020 | Tipo |
|---|---|---|---|---|---|---|---|---|---|---|
| ACTIVO CORRIENTE | 89280157 | 106808572 | 127981468 | 133236812 | 145932260 | 161691553 | 171136122 | 175034341 | 179255248 | ESTADO DE SITUACION FINANCIERA |
| ACTIVO NO CORRIENTE | 30134240 | 34137367 | 39394739 | 42944871 | 44412384 | 51481978 | 56241853 | 77938278 | 77943263 | ESTADO DE SITUACION FINANCIERA |
| ACTIVOS | 119414397 | 140945939 | 167376206 | 176181683 | 190344644 | 213173530 | 227377975 | 252972618 | 257198511 | ESTADO DE SITUACION FINANCIERA |
| PASIVO CORRIENTE | 32905907 | 26160905 | 37878184 | 30370883 | 30890241 | 37639159 | 34881650 | 32961816 | 32751050 | ESTADO DE SITUACION FINANCIERA |
| PASIVO NO CORRIENTE | 3944831 | 12116701 | 4965328 | 6140325 | 6635056 | 7191573 | 7804871 | 28284310 | 28390605 | ESTADO DE SITUACION FINANCIERA |
Balance <- Estados %>%
filter(Tipo == "ESTADO DE SITUACION FINANCIERA") %>%
select(Apertura,starts_with("Añ")) %>%
pivot_longer(!Apertura,names_to = "Periodo",values_to = "Importe") %>%
group_by(Periodo,Apertura) %>%
summarise(Total = sum(Importe)) %>%
pivot_wider(names_from = Apertura,values_from = Total)| Periodo | ACTIVO CORRIENTE | ACTIVO NO CORRIENTE | ACTIVOS | PASIVO CORRIENTE | PASIVO NO CORRIENTE | PASIVOS | PATRIMONIO |
|---|---|---|---|---|---|---|---|
| Año 2012 | 89280157 | 30134240 | 119414397 | 32905907 | 3944831 | 28961077 | 82563659 |
| Año 2013 | 106808572 | 34137367 | 140945939 | 26160905 | 12116701 | 38277606 | 102668333 |
| Año 2014 | 127981468 | 39394739 | 167376206 | 37878184 | 4965328 | 44025072 | 123351134 |
| Año 2015 | 133236812 | 42944871 | 176181683 | 30370883 | 6140325 | 36511208 | 139670474 |
| Año 2016 | 145932260 | 44412384 | 190344644 | 30890241 | 6635056 | 37525298 | 152819346 |
| Año 2017 | 161691553 | 51481978 | 213173530 | 37639159 | 7191573 | 44830733 | 168342798 |
| Año 2018 | 171136122 | 56241853 | 227377975 | 34881650 | 7804871 | 42686520 | 184691455 |
| Año 2019 | 175034341 | 77938278 | 252972618 | 32961816 | 28284310 | 61246126 | 191726492 |
| Año 2020 | 179255248 | 77943263 | 257198511 | 32751050 | 28390605 | 61141655 | 196056856 |
Estado_Resultados <- Estados %>%
filter(Tipo == "ESTADO DE RESULTADOS") %>%
select(Apertura,starts_with("Añ")) %>%
pivot_longer(!Apertura,names_to = "Periodo",values_to = "Importe") %>%
group_by(Periodo,Apertura) %>%
summarise(Total = sum(Importe)) %>%
pivot_wider(names_from = Apertura,values_from = Total)| Periodo | COSTOS | Ganancia Bruta | GASTOS | INGRESOS | Utilidad antes de impuestos |
|---|---|---|---|---|---|
| Año 2012 | 134644066 | 56685905 | 27767072 | 191329971 | 29457933 |
| Año 2013 | 168140123 | 70620734 | 34161040 | 238760857 | 36790013 |
| Año 2014 | 192566011 | 80464977 | 37923831 | 273030988 | 42541146 |
| Año 2015 | 193185204 | 83699788 | 39601143 | 276884992 | 44098646 |
| Año 2016 | 169226644 | 75461034 | 37769059 | 244687678 | 37691975 |
| Año 2017 | 186781737 | 80831729 | 40287571 | 267613466 | 40544158 |
| Año 2018 | 197412085 | 89818669 | 44303162 | 287230754 | 45515506 |
| Año 2019 | 195495224 | 88446713 | 46052358 | 283941937 | 42394355 |
| Año 2020 | 173881570 | 83842214 | 45620680 | 257723784 | 38221535 |
Balance %>%
select(-ACTIVOS,-PASIVOS) %>%
pivot_longer(!1,values_to = "importe",names_to = "indicador") %>%
ggplot(aes(x = Periodo,y = importe, group = indicador, color = indicador)) +
geom_line() +
geom_point() +
labs(x = "",y = "",title = "Evolución Elementos del Balance") +
theme(legend.position = 'bottom')Balance %>%
select(ACTIVOS,PASIVOS,PATRIMONIO) %>%
pivot_longer(!1,values_to = "importe",names_to = "indicador") %>%
ggplot(aes(x = Periodo,y = importe, group = indicador, color = indicador)) +
geom_line() +
geom_point() +
labs(x = "",y = "",title = "Evolución Elementos del Balance") +
theme(legend.position = 'bottom')Estado_Resultados %>%
pivot_longer(!1,values_to = "importe",names_to = "indicador") %>%
ggplot(aes(x = Periodo,y = importe, group = indicador, color = indicador)) +
geom_line() +
geom_point() +
labs(x = "",y = "",title = "Evolución Estado de Resultados") +
theme(legend.position = 'bottom')A continuación vamos a ver algunos de los indicadores más comunes que se calculan al momento de analizar balances:
\[Ind.Rentabilidad = \frac{Utilidad_{AI}}{ACTIVO_{T}}\]
Donde: - Numerador: Utilidad Antes de Impuestos
- Denominador: Activo Total
Estados %>%
select(-11) %>%
pivot_longer(!1,names_to = "Periodo",values_to = "Importe") %>%
pivot_wider(names_from = Apertura,values_from = Importe) %>%
mutate(ACTIVO_TOTAL = `ACTIVO CORRIENTE`+`ACTIVO NO CORRIENTE`,
PASIVO_TOTAL = `PASIVO CORRIENTE`+`PASIVO NO CORRIENTE`,
RENTABILIDAD = `Utilidad antes de impuestos`/ACTIVO_TOTAL) %>%
select(Periodo,RENTABILIDAD) %>%
kbl() %>%
kable_styling(bootstrap_options = "striped",font_size = 9,full_width = F,position = "center")| Periodo | RENTABILIDAD |
|---|---|
| Año 2012 | 0.2466866 |
| Año 2013 | 0.2610222 |
| Año 2014 | 0.2541648 |
| Año 2015 | 0.2503021 |
| Año 2016 | 0.1980196 |
| Año 2017 | 0.1901932 |
| Año 2018 | 0.2001755 |
| Año 2019 | 0.1675848 |
| Año 2020 | 0.1486071 |
\[Ind.Liquidez = \frac{ACTIVO_{CORRIENTE}}{PASIVO_{CORRIENTE}}\]
Estados %>%
select(-11) %>%
pivot_longer(!1,names_to = "Periodo",values_to = "Importe") %>%
pivot_wider(names_from = Apertura,values_from = Importe) %>%
mutate(ACTIVO_TOTAL = `ACTIVO CORRIENTE`+`ACTIVO NO CORRIENTE`,
PASIVO_TOTAL = `PASIVO CORRIENTE`+`PASIVO NO CORRIENTE`,
LIQUIDEZ = `ACTIVO CORRIENTE` / `PASIVO CORRIENTE`) %>%
select(Periodo,LIQUIDEZ) %>%
kbl() %>%
kable_styling(bootstrap_options = "striped",font_size = 9,full_width = F,position = "center")| Periodo | LIQUIDEZ |
|---|---|
| Año 2012 | 2.713195 |
| Año 2013 | 4.082755 |
| Año 2014 | 3.378765 |
| Año 2015 | 4.386992 |
| Año 2016 | 4.724219 |
| Año 2017 | 4.295833 |
| Año 2018 | 4.906193 |
| Año 2019 | 5.310215 |
| Año 2020 | 5.473267 |
\[Ind.CalidadDeuda = \frac{PASIVO_{CORRIENTE}}{ACTIVO_{TOTAL}}\]
Estados %>%
select(-11) %>%
pivot_longer(!1,names_to = "Periodo",values_to = "Importe") %>%
pivot_wider(names_from = Apertura,values_from = Importe) %>%
mutate(ACTIVO_TOTAL = `ACTIVO CORRIENTE`+`ACTIVO NO CORRIENTE`,
PASIVO_TOTAL = `PASIVO CORRIENTE`+`PASIVO NO CORRIENTE`,
CALIDAD_DEUDA = `PASIVO CORRIENTE` / PASIVO_TOTAL) %>%
select(Periodo,CALIDAD_DEUDA) %>%
kbl() %>%
kable_styling(bootstrap_options = "striped",font_size = 9,full_width = F,position = "center")| Periodo | CALIDAD_DEUDA |
|---|---|
| Año 2012 | 0.8929511 |
| Año 2013 | 0.6834520 |
| Año 2014 | 0.8841055 |
| Año 2015 | 0.8318236 |
| Año 2016 | 0.8231844 |
| Año 2017 | 0.8395839 |
| Año 2018 | 0.8171584 |
| Año 2019 | 0.5381861 |
| Año 2020 | 0.5356585 |
\[Ind.Solvencia = \frac{ACTIVO_{TOTAL}}{PASIVO_{TOTAL}}\]
Estados %>%
select(-11) %>%
pivot_longer(!1,names_to = "Periodo",values_to = "Importe") %>%
pivot_wider(names_from = Apertura,values_from = Importe) %>%
mutate(ACTIVO_TOTAL = `ACTIVO CORRIENTE`+`ACTIVO NO CORRIENTE`,
PASIVO_TOTAL = `PASIVO CORRIENTE`+`PASIVO NO CORRIENTE`,
SOLVENCIA = ACTIVO_TOTAL / PASIVO_TOTAL) %>%
select(Periodo,SOLVENCIA) %>%
kbl() %>%
kable_styling(bootstrap_options = "striped",font_size = 9,full_width = F,position = "center")| Periodo | SOLVENCIA |
|---|---|
| Año 2012 | 3.240489 |
| Año 2013 | 3.682204 |
| Año 2014 | 3.906687 |
| Año 2015 | 4.825414 |
| Año 2016 | 5.072435 |
| Año 2017 | 4.755076 |
| Año 2018 | 5.326693 |
| Año 2019 | 4.130426 |
| Año 2020 | 4.206600 |
Tindicadores <- Estados %>%
select(-11) %>%
pivot_longer(!1,names_to = "Periodo",values_to = "Importe") %>%
pivot_wider(names_from = Apertura,values_from = Importe) %>%
mutate(ACTIVO_TOTAL = `ACTIVO CORRIENTE`+`ACTIVO NO CORRIENTE`,
PASIVO_TOTAL = `PASIVO CORRIENTE`+`PASIVO NO CORRIENTE`,
RENTABILIDAD = `Utilidad antes de impuestos`/ACTIVO_TOTAL,
LIQUIDEZ = `ACTIVO CORRIENTE` / `PASIVO CORRIENTE`,
CALIDAD_DEUDA = `PASIVO CORRIENTE` / PASIVO_TOTAL,
SOLVENCIA = ACTIVO_TOTAL / PASIVO_TOTAL) %>%
select(Periodo,RENTABILIDAD,LIQUIDEZ,CALIDAD_DEUDA,SOLVENCIA)| Periodo | RENTABILIDAD | LIQUIDEZ | CALIDAD_DEUDA | SOLVENCIA |
|---|---|---|---|---|
| Año 2012 | 0.2466866 | 2.713195 | 0.8929511 | 3.240489 |
| Año 2013 | 0.2610222 | 4.082755 | 0.6834520 | 3.682204 |
| Año 2014 | 0.2541648 | 3.378765 | 0.8841055 | 3.906687 |
| Año 2015 | 0.2503021 | 4.386992 | 0.8318236 | 4.825414 |
| Año 2016 | 0.1980196 | 4.724219 | 0.8231844 | 5.072435 |
| Año 2017 | 0.1901932 | 4.295833 | 0.8395839 | 4.755076 |
| Año 2018 | 0.2001755 | 4.906193 | 0.8171584 | 5.326693 |
| Año 2019 | 0.1675848 | 5.310215 | 0.5381861 | 4.130426 |
| Año 2020 | 0.1486071 | 5.473267 | 0.5356585 | 4.206600 |
Tindicadores %>%
pivot_longer(!1,values_to = "importe",names_to = "indicador") %>%
ggplot(aes(x = Periodo,y = importe, group = indicador, color = indicador)) +
geom_line() +
geom_point() +
labs(x = "",y = "",title = "Evolución indicadores") +
theme(legend.position = 'bottom')Por último, para llevarlo al siguiente nivel una buena idea es
automatizar el script para ejecutar el proceso de manera automática con
una frecuencia establecida y regular.
Autor:
Marcelo G Gonzalez
LinkTree