Para continuar con nuestro análisis del impacto de la administración de inventarios, debemos tener presente algunas razones financieras. No vamos a cubrirlas todas, pero sí vamos a estimar los valores de las Pymes en el Valle del Cauca, con la intención de que puedas usar estos datos para el desarrollo de la serie.
Lo primero, por si no lo sabías, existe un Sistema Integrado de Información Societaria donde puedes ver el Estado de Situación Financiera, el Estado de Resultado Integral, entre otros, que reportan las empresas. Lo administra una entidad adscrita del Ministerio de Comercio, Industria y Turismo: la Superintendencia de Sociedades.
Adscrita: creada por la ley o autorizadas por esta, que cumplen funciones administrativas que integran la rama ejecutiva y cuentan con personería jurídica (tiene libertad para desarrollar su objeto, capaz de adquirir derechos y obligaciones, representar y ser representada), patrimonio propio y autonomía propia.
data <- openxlsx::read.xlsx("./210030_Estado de situación financiera, corriente_no corriente.xlsx") |>data.table()# Función para extraer texto dentro de parentesisextraer_texto <-function(texto){ inicial <-gregexpr("\\(", texto)[[1]] final <-gregexpr("\\)", texto)[[1]]substring(texto, inicial +1, final -1)}# Vector con los nombres extraídosnuevo_nombre <-colnames(data) |> purrr::map(~extraer_texto(.x)) |>unlist()# Asignar nombres en inglésdata <-setNames(data, ifelse(nuevo_nombre !="", nuevo_nombre, colnames(data)))# Cambiar otros nombresdata <- data |>rename(Razon.Social ="Razón.social.de.la.sociedad",Direccion ="Dirección.de.notificación.judicial.registrada.en.Cámara.de.Comercio",Departamento ="Departamento.de.la.dirección.del.domicilio",Ciudad ="Ciudad.de.la.dirección.del.domicilio",TotalCurrentFinancialAssetsSELL="Total_activos_corrientes_distintos_de_los_activos_no_corrientes_o_grupo_de_activos_para_su_disposicion_clasificados_como_mantenidos_para_la_venta_o_como_mantenidos_para_distribuir_a_los_propietarios",OtherCurrentFinancialAssetsSELL="Activos_no_corrientes_o_grupos_de_activos_para_su_disposicion_clasificados_como_mantenidos_para_la_venta_o_como_mantenidos_para_distribuir_a_los_propietarios",PropertyPlantAndEquipmentWithDEP="Propiedades_de_inversión_al_costo_menos_depreciacion_acumulada_y_deterioro",TotalCurrentFinancialLiabilitiesSELL ="Total_pasivos_corrientes_distintos_de_los_pasivos_incluidos_en_grupos_de_activos_para_su_disposicion_clasificados_como_mantenidos_para_la_venta",OtherCurrentFinancialLiabilitiesSELL="Pasivos_incluidos_en_grupos_de_activos_para_su_disposicion_clasificados_como_mantenidos_para_la_venta")# Solo veremos el periodo finaldata <- data |>filter(Periodo =="Periodo Actual", Fecha.de.Corte =="2022-12-31")gt(head(data,5)) |>aplicar_theme_table() |>tab_options(table.width =pct(50))
Estado de situación financiera, corriente/no corriente
800000090
2022-12-31
Ingenieros Servicios Constructivos SAS
F4111 - Construcción de edificios residenciales
08. SOCIEDAD POR ACCIONES SIMPLIFICADA SAS
Carrera 38 26 17 OFICINA 922 y 926
ANTIOQUIA
MEDELLIN-ANTIOQUIA
Periodo Actual
2922
3769426
0
108391
NA
NA
NA
8548153
NA
12428892
NA
12428892
357599
NA
NA
NA
NA
NA
NA
NA
NA
NA
NA
NA
NA
NA
357599
12786491
304289
3279
307568
1292633
733077
1235364
1235364
NA
NA
3568642
NA
3568642
NA
NA
NA
NA
NA
NA
NA
NA
4743536
4743536
8312178
1500000
2392140
NA
NA
0
NA
10616
571557
4474313
12786491
Pymes-Individuales
Estado de situación financiera, corriente/no corriente
800000241
2022-12-31
CERERIA EL SAGRADO CORAZON LTDA
C3290 - Otras industrias manufactureras n.c.p.
03. SOCIEDAD LIMITADA
KM 5.5 VIA LA BUITRERA PREDIO LA CANANEA
VALLE
CALI-VALLE
Periodo Actual
434850
3294074
2412864
NA
NA
NA
51621
NA
NA
6193409
NA
6193409
564126
NA
NA
NA
NA
NA
NA
NA
NA
NA
NA
18708
NA
NA
582834
6776243
114962
NA
114962
2775642
294400
253216
253216
NA
NA
3438220
NA
3438220
NA
NA
NA
NA
NA
NA
NA
NA
NA
NA
3438220
200000
NA
NA
NA
NA
132740
130902
2874381
3338023
6776243
Pymes-Individuales
Estado de situación financiera, corriente/no corriente
800000268
2022-12-31
INVERSIONES SCHLEGEL DONADO SAS
L6810 - Actividades inmobiliarias realizadas con bienes propios o arrendados
08. SOCIEDAD POR ACCIONES SIMPLIFICADA SAS
CARRERA 53 82 115
ATLANTICO
BARRANQUILLA-ATLANTICO
Periodo Actual
53687
0
25408
17038
0
0
0
516081
0
612214
0
612214
NA
4939698
2189617
0
0
0
0
0
0
0
0
0
0
0
7129315
7741529
0
0
0
1531298
44434
0
0
0
0
1575732
0
1575732
0
0
0
0
345913
0
2780438
2780438
0
3126351
4702083
70000
0
0
0
0
1970655
35000
963791
3039446
7741529
Pymes-Individuales
Estado de situación financiera, corriente/no corriente
800000276
2022-12-31
AVICOLA EL MADROÑO SA
A0145 - Cría de aves de corral
01. SOCIEDAD ANÓNIMA
KM 6 VIA GIRON CR 12 # 57 - 88
SANTANDER
BUCARAMANGA-SANTANDER
Periodo Actual
2331706
60436680
42997280
14035926
20869714
NA
1391059
3106904
NA
145169269
NA
145169269
132086107
NA
NA
NA
50000
NA
NA
NA
NA
1266864
NA
141186
NA
NA
133544157
278713426
4079708
NA
4079708
84899951
8285620
26275037
18918026
7357011
69993
123610309
NA
123610309
NA
NA
NA
NA
10438735
NA
47342439
47342439
2230000
60011174
183621483
3576000
17073150
NA
NA
NA
41224684
1788000
31430109
95091943
278713426
Pymes-Individuales
Estado de situación financiera, corriente/no corriente
800000296
2022-12-31
ZR INGENIERIA SA
F4290 - Construcción de otras obras de ingeniería civil
01. SOCIEDAD ANÓNIMA
CL 106 57 23 OF 204
BOGOTA D.C.
BOGOTA D.C.
Periodo Actual
8991
416673
1482034
NA
NA
NA
527379
NA
NA
2435077
NA
2435077
648
NA
NA
NA
NA
NA
NA
4202324
NA
NA
NA
27131
NA
200
4230303
6665380
25059
NA
25059
28018
21233
NA
NA
NA
37349
111659
NA
111659
NA
NA
NA
2665814
49490
232926
NA
NA
NA
2948230
3059889
1000000
NA
NA
NA
NA
NA
276021
2329470
3605491
6665380
Revisemos cuántos datos tenemos envolatados (missing values):
Código
# Aplicar a cada columna una validación de NAsapply(data, function(x) sum(is.na(x))) |>data.frame() |>rownames_to_column() |>setNames(c("Rubro","Missing")) |>gt_preview(top_n =5, bottom_n =10) |>aplicar_theme_table()
Rubro
Missing
1
Punto.de.Entrada
0
2
Nombre.Formulario
0
3
NIT
0
4
Fecha.de.Corte
0
5
Razon.Social
0
6..62
63
IssuedCapital
0
64
SharePremium
17590
65
TreasuryShares
21859
66
InversionSuplementariaAlCapitalAsignado
21697
67
OtherEquityInterest
19220
68
SuperavitPorRevaluacion
16563
69
OtherReserves
5426
70
RetainedEarnings
22
71
Equity
0
72
EquityAndLiabilities
0
Y qué pasa entonces con los valores en cero:
Código
# Aplicar a cada columna una validación de CEROSsapply(data, function(x) sum(x==0, na.rm =TRUE)) |>data.frame() |>rownames_to_column() |>setNames(c("Rubro","Missing")) |>gt_preview(top_n =5, bottom_n =10) |>aplicar_theme_table()
Rubro
Missing
1
Punto.de.Entrada
0
2
Nombre.Formulario
0
3
NIT
0
4
Fecha.de.Corte
0
5
Razon.Social
0
6..62
63
IssuedCapital
0
64
SharePremium
2136
65
TreasuryShares
2678
66
InversionSuplementariaAlCapitalAsignado
2607
67
OtherEquityInterest
2331
68
SuperavitPorRevaluacion
1977
69
OtherReserves
695
70
RetainedEarnings
12
71
Equity
2
72
EquityAndLiabilities
3
Me parece razonable suponer que habrán errores en las empresas que no reportan, o que reportan en ceros, Assets, Liabilities, Equity y EquityAndLiabilities. Así que van para afuera.
Código
# Descartar NA y 0's# data <- data |> # filter_at(vars(Assets, Liabilities, Equity, EquityAndLiabilities),# all_vars(!is.na(.))) |> # filter_at(vars(Assets, Liabilities, Equity, EquityAndLiabilities),# all_vars(!.==0))cols <-c("Assets", "Liabilities", "Equity", "EquityAndLiabilities")data <- data |>filter_at(vars(!!!cols), ~!is.na(.) & . !=0)
Vamos a ver por departamento cuántas empresas tiene el reporte:
Código
# Tabla para cantidad de empresas por departamentodata |>group_by(Departamento) |>summarise(Cantidad =n()) |>arrange(desc(Cantidad)) |>mutate(Proporcion =round(100*Cantidad /sum(Cantidad),2),Acumulado =paste0(cumsum(Proporcion),"%")) |>gt_preview() |>aplicar_theme_table()
Departamento
Cantidad
Proporcion
Acumulado
1
BOGOTA D.C.
10207
41.61
41.61%
2
ANTIOQUIA
4308
17.56
59.17%
3
VALLE
2386
9.73
68.9%
4
ATLANTICO
1548
6.31
75.21%
5
CUNDINAMARCA
1254
5.11
80.32%
6..31
32
GUAINIA
1
0.00
100%
El balance general resume los bienes, pasivos y capital de los dueños de un negocio en un momento, que generalmente es a final del año o de un trimestre. El estado de pérdidas y ganancias resume los ingresos y gastos de la compañía durante un periodo determinado. El primero es una foto de la posición financiera, el segundo es el resumen de la rentabilidad en el tiempo.
Existen razones financieras para comparar las empresas.
Razones de liquidez
Capacidad de una empresa para cumplir con sus obligaciones a corto plazo.
En teoría, entre más alta sea la liquidez corriente, mayor será la capacidad de la empresa para pagar sus deudas. Aunque esta razón debe verse como una medida burda porque no toma en cuenta la liquidez de los componentes individuales de los activos corrientes. Una empresa que tiene activos corrientes compuestos principalmente de efectivo y cuentas por cobrar no vencidas, en general se ve como con más liquidez que una empresa cuyos activos corrientes son principalmente inventarios. En consecuencia, recurrimos a una prueba de la liquidez de la empresa más severa: la razón de la prueba ácida.
La liquidez tiene dos dimensiones:
1. El tiempo requerido para convertir el activo en efectivo.
2. La certidumbre del precio obtenido.
Incluso si el precio obtenido en cuentas por cobrar fuera tan predecible como el obtenido sobre los inventarios, las cuentas por cobrar serían un activo más líquido que los inventarios, en virtud del tiempo más corto requerido para convertir el activo en efectivo. Si se tuviera más certidumbre del precio obtenido sobre las cuentas por cobrar que sobre los inventarios, las cuentas por cobrar se considerarían de mayor liquidez.
Código
data |>filter(Departamento =="VALLE") |>mutate(liquidez_corriente = CurrentAssets/CurrentLiabilities) |>filter(liquidez_corriente <10) |>ggplot(aes(liquidez_corriente))+geom_density(col ="orange", size =1.2) +labs(x ="RAZÓN LIQUIDEZ CORRIENTE", y ="DENSIDAD",title ="LIQUIDEZ CORRIENTE EN EL VALLE DEL CAUCA")+scale_x_continuous(breaks =c(seq(0, 100, by =1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
Aquí las cifras más aterrizadas para los que les gustan los datos;
Esta razón sirve como complemento de la liquidez corriente al analizar la liquidez. Excluye los inventarios —que se supone es la porción menos líquida de los activos corrientes— del numerador. La razón se concentra principalmente en los activos corrientes más líquidos —efectivo, valores de corto plazo y cuentas por cobrar— en relación con las obligaciones actuales. Así, esta razón ofrece una medida más precisa de la liquidez que la liquidez corriente:
Código
data |>filter(Departamento =="VALLE") |>mutate(prueba_acida = (CurrentAssets - Inventories)/CurrentLiabilities) |>filter(prueba_acida <10) |>ggplot(aes(prueba_acida))+geom_density(col ="orange", size =1.2) +labs(x ="RAZÓN LIQUIDEZ CORRIENTE (sin Inventarios)", y ="DENSIDAD",title ="PRUEBA ÁCIDA EN EL VALLE DEL CAUCA")+scale_x_continuous(breaks =c(seq(0, 100, by =1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
Tenemos una diferencia de NA, 0.6206 entre las medianas de las razones.
Estas razones no nos dicen si las cuentas por cobrar y/o los inventarios de hecho son demasiado altos. Si lo son, esto afectaría nuestra impresión inicial favorable de la liquidez de la compañía. Por eso, necesitamos ir detrás de las razones y examinar el tamaño, la composición y la calidad de estos dos activos corrientes importantes
Razones de apalancamiento financiero(deuda)
Indican el grado en el que una empresa se financia mediante deuda.
Razón entre deuda y capital
\[
\frac{\text{Deuda total}}{\text{Capital de accionistas}}
\]
Nos dice cuánto de cada peso aportan los accionistas como financiamiento. En general, si fueras un acreedor, querrías tener una razón baja, porque así será mayor el nivel de financiamiento de la empresa que aportan los accionistas, el márgen de protección de los acreedores en caso de una disminución del valor de los activos o de pérdidas totales.
Código
data |>filter(Departamento =="VALLE") |>mutate(deuda_capital = Liabilities/Equity) |>filter(deuda_capital >=0, deuda_capital <=5) |>ggplot(aes(deuda_capital))+geom_density(col ="orange", size =1.2) +labs(x ="RAZÓN DEUDA CAPITAL", y ="DENSIDAD",title ="DEUDA / CAPITAL EN EL VALLE DEL CAUCA")+#scale_x_continuous(breaks = c(seq(0, 100, by = 1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
Podría requerirse, dependiendo de la naturaleza del negocio, excluir las acciones preferenciales del capital e incluirlo en deuda porque representan una reclamación anterior desde el punto de vista de los inversionistas en acciones ordinarias. Pero aquí, lo hacemos de manera sencilla.
Una comparación de la razón entre deuda y capital para una companía dada con empresas similares nos indica si es digna de crédito, así como el riesgo financiero de la empresa.
Razón entre deuda y activos totales
Esta razón tiene un propósito similar a la razón entre deuda y capital. Resalta la importancia relativa del financiamiento mediante deuda mostrando el porcentaje de los activos de la empresa que está solventado por el financiamiento mediante deuda.
Si la empresa tuviera que liquidarse ya, los activos podrían venderse por una cantidad neta antes de que los acreedores tuvieran pérdidas. Cuanto más alta esta razón, más alto el riesgo de financiamiento.
Código
data |>filter(Departamento =="VALLE") |>mutate(deuda_activos_total = Liabilities/Assets) |>filter(deuda_activos_total >=0, deuda_activos_total <=2) |>ggplot(aes(deuda_activos_total))+geom_density(col ="orange", size =1.2) +labs(x ="RAZÓN DEUDA ACTIVOS TOTALES", y ="DENSIDAD",title ="DEUDA / ACTIVOS TOTALES EN EL VALLE DEL CAUCA")+#scale_x_continuous(breaks = c(seq(0, 100, by = 1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
Aquí se nos presenta una distribución con dos picos. Seguro que algún día les explico cómo enfrentarse a esto.
Podríamos decir por ahora que el 46% de los bienes de la empresa están financiados con deuda, de varios tipos. Y el 54% restante del financiamiento proviene del capital de los accionistas.
Los datos anteriores reflejan cortes de diciembre del año 2022. Si te interesa conocer la información más actual, o profundizar en otro tipo de análisis no dudes en contactarme.
Recuerda que ninguna razón por sí sola nos entrega suficiente información para juzgar las condiciones financieras y el desempeño de una empresa. Debemos asegurarnos de analizar un grupo de indicadores, determinar si hay estacionalidad en las cifras, revisar las tendencias.
Razones de cobertura
Relacionan los cargos financieros de una empresa con su capacidad para servirlos o cubrirlos.
Razón de cobertura de interés
Código
# Función para extraer texto dentro de parentesisextraer_texto <-function(texto){ inicial <-gregexpr("\\(", texto)[[1]] final <-gregexpr("\\)", texto)[[1]]substring(texto, inicial +1, final -1)}# Vector con los nombres extraídosnuevo_nombre <-function(info){colnames(info) |> purrr::map(~last(extraer_texto(.x))) |>unlist()}pyg <- openxlsx::read.xlsx("./310030_Estado de resultado integral, resultado del periodo, por funcion de gasto(3).xlsx") |>data.table() |>filter(Fecha.de.Corte =="2022-12-31")# Asignar nombres en ingléspyg <-setNames(pyg, ifelse(nuevo_nombre(pyg) !="", nuevo_nombre(pyg), colnames(pyg)))pyg <- pyg |>filter(Periodo =="Periodo Actual", `Departamento.de.la.dirección.del.domicilio`=="VALLE")
Esta razón sirve como medida de la capacidad de una empresa para cumplir con los pagos de interés y evitar bancarrota. A mayor valor, mayor la probabilidad de lograr cubrir pagos sin dificultad. Además, da información acerca de la posibilidad de enfrentar nueva deuda.
Código
pyg |>mutate(cobertura_interes = ProfitLossBeforeTax/FinanceCosts) |>filter(cobertura_interes >=0, cobertura_interes <=20) |>ggplot(aes(cobertura_interes))+geom_density(col ="orange", size =1.2) +labs(x ="RAZÓN COBERTURA INTERÉS", y ="DENSIDAD",title ="UAII/GASTO INTERÉS EN EL VALLE DEL CAUCA")+#scale_x_continuous(breaks = c(seq(0, 100, by = 1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
Estos son los resultados para la razón de cobertura de interés:
Además de los pagos de interés, podemos agregar pagos del principal sobre las obligaciones de deuda, los dividendos de acciones preferenciales y los pagos de arrendamiento. Un análisis más amplio evaluará la capacidad de una empresa para cubrir todos los cargos de naturaleza fija.
Razones de actividad
Miden qué tan efectiva es la manera en que la empresa usa sus activos.
Razón de rotación de cuentas por cobrar
Proporciona un panorama de la calidad de las cuentas por cobrar de la empresa y qué tan exitosa es en sus cobros.
\[
\frac{\text{Ventas netas a crédito anuales}}{\text{Cuentas por cobrar}}
\]
Código
caratula <- openxlsx::read.xlsx("./10000_Carátula.xlsx") |>data.table()full_join(data |>filter(Periodo =="Periodo Actual") |> dplyr::select(c(3,4,5,13,14,62,72)) |>unique() ,pyg |>filter(Periodo =="Periodo Actual") |> dplyr::select(c(3,4,5,12)) |>unique()) |>left_join(caratula[,c(3,11)], by =c("NIT")) |>mutate(RCC = Revenue /`TradeAndOtherCurrentReceivables`,tiempo =2024-as.numeric(substr(`Fecha.de.constitución.(Aaaa-Mm-Dd)`,1,4))) |>filter(RCC >0, RCC <=20, !is.na(RCC), tiempo >=0, !is.na(tiempo)) |>filter(tiempo <50) |># ggplot(aes(as.numeric(tiempo), RCC, group = as.factor(tiempo)))+ggplot(aes(RCC))+geom_density(col ="orange", size =1.2) +labs(x ="RAZÓN ROTACIÓN CUENTAS POR COBRAR", y ="DENSIDAD",title ="VENTAS A CRÉDITO / CUENTAS POR COBRAR EN EL VALLE DEL CAUCA")+#scale_x_continuous(breaks = c(seq(0, 100, by = 1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
Nos dice el número de veces que las cuentas por cobrar se han convertido en efectivo durante el año. Aquí estamos suponiendo que todos los ingresos fueron por ventas a crédito (no tenemos información acerca de la cantidad exacta a través de los archivos de SIIS).
Cuando las ventas son estacionales o han aumentado considerablemente en el año, usar el balance de las cuentas por cobrar al final del año puede no ser adecuado. Con estacionalidad, un promedio de los balances mensuales puede ser lo más apropiado. Con crecimiento, el balance de las cuentas por cobrar será engañosamente alto en relación con las ventas. El resultado es que la conversión de cuentas por cobrar en efectivo calculado es una estimación sesgada y baja del número de conversiones durante el año. En este caso, un promedio de las cuentas por cobrar al inicio y final del año será adecuado si el crecimiento en las ventas fue estable en el año.
Rotación de cuentas por cobrar en días
\[
\frac{\text{Días del año}}{\text{Rotación de cuentas por cobrar}} = \frac{\text{Cuentas por cobrar x días del año}}{\text{Ventas a crédito anuales}}
\]
Nos dice el número promedio de días que las cuentas por cobrar están en circulación antes de ser cobradas, que para el caso de las empresas del Valle del Cauca es:
\[
\frac{365}{4}≅90
\]
Podríamos decir que aunque un periodo promedio de cobro demasiado alto suele ser malo, un promedio muy bajo no necesariamente es bueno. Un periodo promedio muy bajo de cobro puede ser un síntoma de una política de crédito excesivamente restrictiva. Las pocas cuentas por cobrar que aparecen en los libros tal vez sean de primera calidad, pero las ventas quizás estén indebidamente restringidas —y las ganancias son menores a las que podrían ser— debido a que se otorgan créditos con muchas restricciones a los clientes.
Razón de rotación de cuentas por pagar
Capacidad de pago oportuno a los proveedores o el de algún potencial cliente candidato a crédito.
\[
\frac{\text{Días en el año}}{\text{Rotación de cuentas por pagar}}=\frac{\text{Cuentas por pagar x días en el año}}{\text{Compras a crédito anuales}}
\]
Código
full_join(data |>filter(Periodo =="Periodo Actual") |> dplyr::select(c(3,4,5,13,14,43,51,62,72)) |>unique() ,pyg |>filter(Periodo =="Periodo Actual") |> dplyr::select(c(3,4,5,12,13)) |>unique()) |>left_join(caratula[,c(3,11)], by =c("NIT")) |>mutate(RCP = (CurrentLiabilities+Inventories) / CostOfSales,tiempo =2024-as.numeric(substr(`Fecha.de.constitución.(Aaaa-Mm-Dd)`,1,4))) |>filter(RCP >0, RCP <5, !is.na(RCP), tiempo >=0, !is.na(tiempo)) |>filter(tiempo <50) |># ggplot(aes(as.numeric(tiempo), RCC, group = as.factor(tiempo)))+ggplot(aes(RCP))+geom_density(col ="orange", size =1.2) +labs(x ="RAZÓN ROTACIÓN CUENTAS POR PAGAR", y ="DENSIDAD",title ="CUENTAS POR PAGAR / COMPRAS A CRÉDITO EN EL VALLE DEL CAUCA")+#scale_x_continuous(breaks = c(seq(0, 100, by = 1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
Determina qué tan efectiva es la empresa al administrar el inventario y también es una indicación de la liquidez del inventario.
\[
\frac{\text{Costo de bienes vendidos}}{\text{Inventarios}}
\]
Código
full_join(data |>filter(Periodo =="Periodo Actual") |> dplyr::select(c(3,4,5,13,14,62,72)) |>unique() ,pyg |>filter(Periodo =="Periodo Actual") |> dplyr::select(c(3,4,5,12,13)) |>unique()) |>left_join(caratula[,c(3,11)], by =c("NIT")) |>mutate(RDI = CostOfSales / Inventories,tiempo =2024-as.numeric(substr(`Fecha.de.constitución.(Aaaa-Mm-Dd)`,1,4))) |>filter(RDI >0, RDI <=20, !is.na(RDI), tiempo >=0, !is.na(tiempo)) |>filter(tiempo <50) |>ggplot(aes(RDI))+geom_density(col ="orange", size =1.2) +labs(x ="RAZÓN ROTACIÓN INVENTARIOS", y ="DENSIDAD",title ="COSTO DE BIENES / INVENTARIOS EN EL VALLE DEL CAUCA")+#scale_x_continuous(breaks = c(seq(0, 100, by = 1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
La razón de rotación de inventario nos dice cuántas veces el inventario se convierte en cuentas por cobrar a través de las ventas durante el año. Esta razón, como las otras, debe juzgarse en relación con las razones del pasado y el futuro esperado de la empresa y en relación con las razones de empresas similares, o el promedio de la industria o ambos.
En general, cuanto más alta sea la rotación de inventario, más eficiente será su manejo, y más “fresco” y líquido será ese inventario. Sin embargo, algunas veces una rotación alta del inventario indica una existencia precaria. Por lo tanto, en realidad puede ser un síntoma de que hay un nivel de inventario muy bajo y con frecuencia se incurre en faltantes. Una rotación de inventario relativa- mente baja muchas veces es señal de un movimiento lento o de artículos obsoletos en el inventario
Rotación de inventario en días
\[
\frac{\text{Días del año}}{\text{Rotación de inventario}}=\frac{\text{Inventario x Días en el año}}{\text{Costo de bienes vendidos}}
\]
Nos dice cuántos días, en promedio, pasan antes de que el inventario se convierta en cuentas por pagar mediante las ventas.
\[
\frac{365}{3.61}≅100
\]
Ciclo de operación
Es el tiempo que transcurre desde el compromiso de efectivo para compras hasta el cobro de las cuentas por cobrar que resultan de la venta de bienes o servicios.
\[
\text{Rotación de inventario en días } +\text{ Rotación de cuentas por cobrar en días}
\]
La mayoría de las empresas no pagan la materia prima de inmediato, sino compran a crédito e incurren en una cuenta por pagar.
\[
100+90=190 \text{ días para empresas del Valle del Cauca}
\]
¿Por qué preocuparse por el ciclo de operación de una empresa? Una empresa con un ciclo de operación muy corto puede operar de manera efectiva con una cantidad relativamente pequeña de activos corrientes, y liquidez corriente y razón de prueba ácida relativamente bajas. Esta empresa tiene una liquidez relativa en un sentido “dinámico”: puede generar un producto, venderlo y cobrar en efectivo por él, todo en un periodo relativamente corto. No tiene que apoyarse en niveles de liquidez “estáticos” altos como los mide la liquidez corriente o la razón de la prueba ácida.
Razón de rotación de activos totales
Nos indica la eficiencia relativa con la que una empresa usa sus activos totales para generar ventas.
Podría existir una inversión excesiva en cuentas por cobrar y en inventarios.
Razones de rentabilidad
Relacionan las ganancias con las ventas y la inversión.
Márgen de ganancias brutas
Nos da la ganancia de la empresa relativa a las ventas, después de deducir el costo de producir los bienes. Es una medida de la eficiencia en la operación de la empresa, al igual que un indicador de cómo se asigna precio a los productos.
\[
\frac{\text{Ventas netas - Costo de bienes vendidos}}{\text{Ventas netas}}
\]
Código
pyg |>left_join(caratula[,c(3,11)], by =c("NIT")) |>mutate(margen_bruto =100* (Revenue-CostOfSales)/Revenue,tiempo =2024-as.numeric(substr(`Fecha.de.constitución.(Aaaa-Mm-Dd)`,1,4))) |>filter(margen_bruto >0, margen_bruto <=200, !is.na(margen_bruto), tiempo >=0, !is.na(tiempo)) |>ggplot(aes(margen_bruto))+geom_density(col ="orange", size =1.2) +labs(x ="MARGEN DE GANANCIAS BRUTAS (%)", y ="DENSIDAD",title ="RENTABILIDAD (VENTAS) EN EL VALLE DEL CAUCA")+#scale_x_continuous(breaks = c(seq(0, 100, by = 1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
Código
pyg |>left_join(caratula[,c(3,11)], by =c("NIT")) |>mutate(margen_bruto =100* (Revenue-CostOfSales)/Revenue,tiempo =2024-as.numeric(substr(`Fecha.de.constitución.(Aaaa-Mm-Dd)`,1,4))) |>filter(margen_bruto >0, margen_bruto <=200, !is.na(margen_bruto), tiempo >=0, !is.na(tiempo)) |>with(ecdf(margen_bruto)) |>estilo_summary() |>gt() |>aplicar_theme_table()
Medida
Frecuencia
Min.
0.0747
1st Qu.
18.2208
Median
29.5569
Mean
35.1813
3rd Qu.
46.7363
Max.
100.0000
Si el márgen de tu empresa está por encima del \(30\%\) significa que es más efectiva al producir y vender productos por arriba del costo que la mitad de las empresas en la región considerada.
Márgen de ganancia neta
Una medida de la rentabilidad de las ventas después de impuestos de la empresa tomando en cuenta todos los gastos e impuestos sobre la renta. Nos indica el ingreso neto por peso de venta.
\[
\frac{\text{Ganancia neta después de impuestos}}{\text{Ventas netas}}
\]
Código
pyg |>left_join(caratula[,c(3,11)], by =c("NIT")) |>mutate(margen_neto =100* (ProfitLoss)/Revenue,tiempo =2024-as.numeric(substr(`Fecha.de.constitución.(Aaaa-Mm-Dd)`,1,4))) |>filter(margen_neto >0, margen_neto <=30, !is.na(margen_neto), tiempo >=0, !is.na(tiempo)) |>ggplot(aes(margen_neto))+geom_density(col ="orange", size =1.2) +labs(x ="MARGEN DE GANANCIAS NETAS (%)", y ="DENSIDAD",title ="RENTABILIDAD (VENTAS) EN EL VALLE DEL CAUCA")+#scale_x_continuous(breaks = c(seq(0, 100, by = 1)))+theme_minimal()+theme(text =element_text(color ="#1e2c46"))
Código
pyg |>left_join(caratula[,c(3,11)], by =c("NIT")) |>mutate(margen_neto =100* (ProfitLoss)/Revenue,tiempo =2024-as.numeric(substr(`Fecha.de.constitución.(Aaaa-Mm-Dd)`,1,4))) |>filter(margen_neto >0, margen_neto <=30, !is.na(margen_neto), tiempo >=0, !is.na(tiempo)) |>with(ecdf(margen_neto)) |>estilo_summary() |>gt() |>aplicar_theme_table()
Medida
Frecuencia
Min.
0.0118
1st Qu.
2.1408
Median
4.5822
Mean
6.5547
3rd Qu.
8.5911
Max.
29.9613
Si el margen de ganancia bruta en esencia no cambia en un periodo de varios años, pero el margen de ganancia neta disminuye en el mismo periodo, sabemos que se puede deber a gastos de ventas, generales y administrativos más altos en relación con las ventas o a una tasa de impuestos más alta. Por otro lado, si el margen de ganancia bruta disminuye, sabemos que el costo de producir bienes con respecto a las ventas ha aumentado. Este suceso, a la vez, puede deberse a precios más bajos o a menor eficiencia operativa en relación con el volumen.
Rendimiento sobre la inversión
Es la capacidad de generar ganancias sobre los activos totales.
\[
\text{Capacidad para generar ganancias = Rentabilidad x Eficiencia de activos}
\]
\[
\text{RSI = Márgen de ganancia neta x Rotación de activos totales}
\]
Ni el margen de ganancia neta ni la razón de rotación de activos totales, por sí mismos, representan una medida adecuada de la efectividad global. El margen de ganancia neta ignora la utilización de activos, y la razón de rotación de los activos totales ignora la rentabilidad sobre las ventas. La razón del rendimiento sobre la inversión, o capacidad de generar ganancias, resuelve estas deficiencias.
Para el Valle del Cauca:
\[
\text{4.58\% x 0.74= 3.38\%}
\]
Aquí lo calculamos usando valores de la mediana y no la media.
Rendimiento sobre capital
Compara la ganancia neta después de impuestos (menos los dividendos de acciones preferenciales, si las hay) con el capital que los accionistas han invertido en la empresa:
\[
\frac{\text{Ganancia neta después de impuestos}}{\text{Capital de accionistas}}
\]
O con el enfoque Du Pont:
\[
\text{Rendimiento sobre capital = Márgen de ganancia neta x Rotación de activos totales x Multiplicador de capital}
\]
Código
data |>left_join(caratula[,c(3,11)], by =c("NIT")) |>mutate(multiplicador = Assets/Equity,tiempo =2024-as.numeric(substr(`Fecha.de.constitución.(Aaaa-Mm-Dd)`,1,4))) |>filter(multiplicador >0, multiplicador <=30, !is.na(multiplicador), tiempo >=0, !is.na(tiempo)) |>with(ecdf(multiplicador)) |>estilo_summary() |>gt() |>aplicar_theme_table()
Medida
Frecuencia
Min.
1.0000
1st Qu.
1.2796
Median
1.8143
Mean
2.8331
3rd Qu.
2.9409
Max.
29.9845
El multiplicador de capital se calcula como \(\text{Activos totales / Capital accionistas}\) por lo que para el Valle del Cauca el rendimiento sobre capital es
\[
3.38\% \text{ x } 1.81=6.11\%
\]
Aquí terminamos con las bases financieras para nuestra serie.
Cómo citar
BibTeX
@online{chiquito_valencia2025,
author = {Chiquito Valencia, Cristian},
title = {Análisis de Las Razones Financieras},
date = {2025-02-21},
url = {https://cchiquitovalencia.github.io/posts/2025-02-21-finantial_ratios/},
langid = {en}
}