forked from fkviteri/moduloR_Viteri_Ayala_Flavia_Kamila
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmoduloR_Viteri_Ayala_Flavia.Rmd
514 lines (410 loc) · 19 KB
/
moduloR_Viteri_Ayala_Flavia.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
---
title: "Proyecto Final Módulo R"
author: "Viteri Ayala Flavia Kamila"
date: "2023-08-06"
output:
pdf_document:
latex_engine: xelatex
toc: true
header-includes:
- \usepackage{tocloft}
- \renewcommand{\contentsname}{Tabla de Contenidos}
mainfont: Calibri
execute:
warning: false
message: false
error: false
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)
```
# Parte 1. Setup
## 1.1. Librerías
Para este proyecto se utilizan las siguientes librerías:
```{r}
#| label: librerias
#| include: true
library(openxlsx)
library(magrittr)
library(dplyr)
library(tidyverse)
library(readxl)
library(ggplot2)
library(patchwork)
library(janitor)
library(ggrepel)
```
## 1.2. Establecer formato de números
Este parámetro se utiliza para controlar la forma en que los números se imprimen en la consola cuando se presenta el resultado de un cálculo o una operación.
```{r}
options(scipen = 999)
```
## 1.3. Bases de datos
Para el desarrollo de este proyecto se utilizan tres bases principales las cuales contienen información oficial emitida por la Superintentencia de Compañías, Valores y Seguros (SUPERCIAS).
```{r}
data_balances <- read.xlsx("Data/balances_2014.xlsx", sheet = 1, detectDates = TRUE)
data_ciiu <- read.xlsx("Data/ciiu.xlsx", sheet = 1, detectDates = TRUE)
data_codebook <- read.xlsx("Data/cias_codebook.xlsx", sheet = 1, detectDates = TRUE)
```
La base de datos **`data_balances`** contiene información de diversas empresas ecuatorianas. Tiene **`r nrow(data_balances)`** filas, donde cada una representa un registro en el catastro empresarial y cuenta con **`r ncol(data_balances)`** columnas que incluyen el número de expediente, el Registro Único de Contribuyentes (RUC), nombre de la compañía, situación legal (activa/inactiva/en liquidación, etc.), tipo de compañía, fecha de constitución, ubicación geográfica, código ciiu, características de empleo, tamaño de la empresa, año de constitución e indicadores financieros. Esta base de datos es una fuente rica y diversa de información sobre empresas en Ecuador, útil para análisis económicos y empresariales.
A continuación, se presenta la estructura de la base **`data_balances`** con una muestra de sus primeras 2 columnas más 3 columnas aleatorias.
```{r}
data_balances |>
select(1:2, sample(3:ncol(data_balances), 3)) |>
glimpse()
```
Como segundo punto, la base de datos **`data_ciiu`** constituye una clasificación jerárquica que abarca diversas actividades vinculadas con los sectores económicos del Ecuador. Específicamente, se trata de una adaptación de la Clasificación Internacional Uniforme (CIIU) para este país. En esta base de datos, las actividades se encuentran estructuradas en diferentes niveles jerárquicos, donde el primer nivel representa categorías generales, y los niveles subsiguientes detallan subcategorías más específicas. Estos niveles desembocan en un código único para cada actividad, proporcionando así una identificación única para cada una de ellas.
A continuación, se presenta la estructura de la base **`data_ciiu`** :
```{r}
data_ciiu |>
glimpse()
```
Por último, la base de datos **`data_codebook`** se encuentra estructurada de manera vertical, donde cada columna representa un registro y las filas son las variables asociadas a los mismos. Los campos incluidos en esta base de datos corresponden al diccionario de variables de la base de datos "data_balance", es decir, para poder entender la base de datos en mención, es necesario recurrir a la base de datos "data_codebook".
A continuación, se presenta la estructura de la base **`data_codebook`** :
```{r}
data_codebook |>
glimpse()
```
# Parte 2. Manipulación de datos
## 2.1. Base **`data_codebook`**
Se manipula esta base en primera instancia porque la misma nos permite identificar las variables necesarias para el desarrollo y cálculo de los indicadores financieros establecidos para la ejecución del proyecto.
```{r}
## Identificar variables de interés ----
data_codebook <- data_codebook |>
filter(
str_detect(EXPEDIENTE, "NOMBRE") |
str_detect(EXPEDIENTE, "SITUACIÓN") |
str_detect(EXPEDIENTE, "TIPO") |
str_detect(EXPEDIENTE, "PAÍS") |
str_detect(EXPEDIENTE, "PROVINCIA") |
str_detect(EXPEDIENTE, "CANTÓN") |
str_detect(EXPEDIENTE, "CIUDAD") |
str_detect(EXPEDIENTE, "NÚMERO DE TRABAJADORES DIRECTIVOS") |
str_detect(EXPEDIENTE, "NÚMERO DE TRABAJADORES ADMINISTRATIVOS") |
str_detect(EXPEDIENTE, "NÚMERO DE TRABAJADORES PRODUCCIÓN") |
str_detect(EXPEDIENTE, "NÚMERO DE TRABAJADORES OTROS") |
str_detect(EXPEDIENTE, "TAMAÑO") |
str_detect(EXPEDIENTE, "^CIIU4 NIVEL 1") |
str_detect(EXPEDIENTE, "CIIU4 NIVEL 6") |
str_detect(EXPEDIENTE, "TOTAL ACTIVOS CORRIENTE") |
str_detect(EXPEDIENTE, "TOTAL PASIVOS CORRIENTES") |
str_detect(EXPEDIENTE, "TOTAL DEL ACTIVO") |
str_detect(EXPEDIENTE, "TOTAL DEL PASIVO") |
str_detect(EXPEDIENTE, "TOTAL PATRIMONIO NETO") |
str_detect(EXPEDIENTE, "TOTAL ACTIVOS NO CORRIENTES")
)
```
En este sentido, se filtra **`data_codebook`** sobreescribiendo el mismo dataframe. Es menester mencionar que se decide usar este tipo de filtro porque facilita la identificación de las variables dentro de la base y además el código se muestra más amigable para su lectura y comprensión.
## 2.2. Base **`data_balances`**
Se manipula esta base tomando en cuenta la base data_codebook con el objetivo de identificar el nombre de cada indicador para su análisis.
```{r}
## 1. Seleccionar variables ----
data_balances <- data_balances |>
select(all_of(data_codebook$expediente))
## 2. Cambiar nombres ----
names(data_balances) <- data_codebook$EXPEDIENTE
## 3. Limpiar nombres de variables----
data_balances <- data_balances |>
clean_names()
```
En este sentido, se filtra **`data_balances`** sobreescribiendo el mismo dataframe. A continuación se presenta la estructura de la base en mención:
```{r}
data_balances |>
glimpse()
```
## 2.3. Base **`data_ciiu`**
El objetivo de manipular esta base se enmarca en dejarla lista para posteriormente cargar en la nueva base que nos permitirá hacer los análisis de investigación.
```{r}
## Seleccionar variables de interés ----
data_ciiu <- data_ciiu |>
select(-NIVEL) |>
## Limpiar nombres de variables ----
clean_names()
```
A continuación se presenta la estructura de la base **`data_ciiu`**:
```{r}
data_ciiu |>
glimpse()
```
## 2.4. Base **`empresas`** (creación)
La base **`empresas`** nos permitirá abordar el y la resolución de las preguntas de investigación.
```{r}
## Cálculo de indicadores ----
empresas <- data_balances |>
mutate(
ind_liquidez_corriente = total_activos_corrientes / total_pasivos_corrientes,
ind_endeudamiento_del_activo = total_del_pasivo / total_del_activo,
ind_endeudamiento_patrimonial = total_del_pasivo / total_patrimonio_neto,
ind_endeudamiento_del_activo_fijo = total_patrimonio_neto / total_activos_no_corrientes,
ind_apalancamiento = total_del_activo / total_patrimonio_neto
)
## Quitar variables ya utilizadas ----
empresas <- empresas |>
select(-starts_with("total"))
## Agregar descripción de los CIIU nivel 1 ----
empresas <- empresas |>
left_join(data_ciiu, by = c("ciiu4_nivel_1" = "codigo")) |>
rename(desc_ciiu_nivel_1 = descripcion)
## Agregar descripción de los CIIU nivel 1 ----
empresas <- empresas |>
left_join(data_ciiu, by = c("ciiu4_nivel_6" = "codigo")) |>
rename(desc_ciiu_nivel_6 = descripcion)
## Colocar columnas en orden ----
empresas <- empresas |>
relocate(desc_ciiu_nivel_1, .after = ciiu4_nivel_1) |>
relocate(desc_ciiu_nivel_6, .after = ciiu4_nivel_6)
## Cambiar datos infinitos a NA ----
empresas <- empresas |>
mutate(across(starts_with("ind"), function(x) {
case_when(
is.infinite(x) ~ NA_real_,
TRUE ~ x
)
})
)
```
A continuación se presenta la estructura de la base de datos **`empresas`**:
```{r}
empresas |>
glimpse()
```
# Parte 3. Análisis
## 3.1. Número de empresas por actividad económica por cantón
```{r}
## Número total de empresas ----
empresas |>
group_by(canton, ciiu4_nivel_1, desc_ciiu_nivel_1) |>
count() |>
rename("Cantón" = canton,
"Ciiu Nivel 1" = ciiu4_nivel_1,
"Descripción Ciiu" = desc_ciiu_nivel_1,
"Número de empresas" = n)
## Número total de cantones de participación ----
cantones <- empresas |>
distinct(canton, .keep_all = TRUE)
## Número total de actividades realizadas ----
actividades <- empresas |>
distinct(desc_ciiu_nivel_1, .keep_all = TRUE)
```
**RESULTADO:** Existe un total de **`r count(empresas)`** empresas que realizan **`r count(actividades)`** actividades distintas distribuidas en **`r count(cantones)`** cantones ecuatorianos.
En el siguiente gráfico se presenta el top 10 de actividades con mayor número de empresas a nivel nacional y su participaión en los 4 principales cantones con mayor número de empresas.
```{r}
## GRÁFICO: Top 10 actividades con mayor número de empresas a nivel nacional
## y su participación en los 4 principales cantones.
top_5_actividades <- empresas |>
count(ciiu4_nivel_1, desc_ciiu_nivel_1) |>
slice_max(n, n = 5)
top_4_cantones <- empresas |>
semi_join(top_5_actividades, by = "ciiu4_nivel_1") |>
count(canton) |>
slice_max(n, n = 4)
conteo_empresas <- empresas |>
semi_join(top_5_actividades, by = "ciiu4_nivel_1") |>
semi_join(top_4_cantones, by = "canton") |>
count(canton, ciiu4_nivel_1, desc_ciiu_nivel_1) |>
mutate(ciiu4_nivel_1 = factor(ciiu4_nivel_1,
levels = top_5_actividades$ciiu4_nivel_1,
ordered = TRUE),
canton = factor(canton,
levels = top_4_cantones$canton,
ordered = TRUE),
desc_ciiu_nivel_1 = factor(desc_ciiu_nivel_1,
levels = top_5_actividades$desc_ciiu_nivel_1,
ordered = TRUE))
conteo_empresas |>
ggplot(aes(n, fct_rev(ciiu4_nivel_1), fill = desc_ciiu_nivel_1)) +
geom_col() +
geom_text(aes(label = n)) +
facet_wrap(~canton) +
labs(title = "Top 10 actividades con mayor número de empresas a nivel nacional",
fill = "Actividades") +
theme(
legend.position = "bottom",
legend.direction = "vertical",
axis.title.x = element_blank(),
axis.title.y = element_blank())
```
Guayaquil, Quito, Cuenca y Manta son los principales cantones a nivel nacional que poseen el mayor número de empresas. En términos de actividades, Comercio, Transporte, Actvidades Inmobiliarias, Actividades Profesionales y Construcción son las actividades que cuentan con el mayor número de empresas.
## 3.2. Liquidez y solvencia patrimonial por status y provincia
En este gráfico se pretende realizar un resumen en términos de media, máximo y mínimo de los indicadores de liquidez corriente y endeudamiento patrimonial para describir la solvencia, por situación legal y provincia.
```{r}
liquidez_solvencia_provincia_status <- empresas |>
group_by(provincia, situacion_legal) |>
summarise(liq_mean = mean(ind_liquidez_corriente, na.rm = TRUE),
liq_max = max(ind_liquidez_corriente, na.rm = TRUE),
liq_min = min(ind_liquidez_corriente, na.rm = TRUE),
sol_mean = mean(ind_endeudamiento_patrimonial, na.rm = TRUE),
sol_max = max(ind_endeudamiento_patrimonial, na.rm = TRUE),
sol_min = min(ind_endeudamiento_patrimonial, na.rm = TRUE)) |>
mutate(across(starts_with(c("liq", "sol")), function(x) {
case_when(
is.infinite(x) ~ NA_real_,
is.nan(x) ~ NA_real_,
TRUE ~ x
)
}))
liquidez_solvencia_provincia_status
```
```{r}
tipo_principal <- empresas |>
count(situacion_legal) |>
slice_max(n, n = 1)
top_3_provincias <- empresas |>
semi_join(tipo_principal, by = "situacion_legal") |>
count(provincia) |>
slice_max(n, n = 4)
indicadores_activas <- tipo_principal |>
left_join(liquidez_solvencia_provincia_status, by = "situacion_legal")
provincias_mayor_participacion <- top_3_provincias |>
left_join(indicadores_activas, by = "provincia")
provincias_mayor_participacion |>
pivot_longer(
cols = starts_with("liq") | starts_with("sol"),
names_to = c("indicador", "estadistico"),
names_sep = "_",
values_to = "valor") |>
ggplot(aes(provincia, valor, label = round(valor, 1))) +
geom_line(aes(group = provincia)) +
geom_point(aes(color = estadistico), size = 2) +
geom_text_repel(aes(color = estadistico)) +
scale_color_viridis_d() +
facet_wrap(~indicador) +
labs(title = "Resumen estadístico liquidez y solvencia por provincia",
fill = "Estadísticos") +
theme(
legend.position = "right",
legend.direction = "vertical",
axis.title.x = element_blank(),
axis.title.y = element_blank())
```
## 3.3. Liquidez y solvencia patrimonial (endeudamiento patrimonial) por tipo de empresa
En este gráfico se pretende mostrar la liquidez y solvencia (tomando en cuenta el endeudamiento patrimonial) por tipo de empresa.
```{r}
liquidez_solvencia_tipo_empresa <- empresas |>
group_by(tipo) |>
summarise(liq_mean = min(ind_liquidez_corriente, na.rm = TRUE),
liq_max = max(ind_liquidez_corriente, na.rm = TRUE),
liq_min = min(ind_liquidez_corriente, na.rm = TRUE),
sol_mean = mean(ind_endeudamiento_patrimonial, na.rm = TRUE),
sol_max = max(ind_endeudamiento_patrimonial, na.rm = TRUE),
sol_min = min(ind_endeudamiento_patrimonial, na.rm = TRUE)) |>
mutate(across(starts_with("ind"), function(x) {
case_when(
is.infinite(x) ~ NA_real_,
TRUE ~ x
)
})
)
liquidez_solvencia_tipo_empresa
```
```{r}
## Liquidez y solvencia por tipo de empresa
liquidez_solvencia_tipo_empresa |>
pivot_longer(
cols = starts_with("liq") | starts_with("sol"),
names_to = c("indicador", "estadistico"),
names_sep = "_",
values_to = "valor") |>
ggplot(aes(valor, tipo, label = round(valor, 1))) +
geom_line(aes(group = tipo)) +
geom_point(aes(color = estadistico), size = 2) +
geom_text_repel(aes(color = estadistico)) +
scale_color_viridis_d() +
facet_wrap(~indicador) +
labs(title = "Resumen estadístico liquidez y solvencia por tipo de empresa") +
theme(
legend.position = "top",
legend.direction = "horizontal",
axis.title.x = element_blank(),
axis.title.y = element_blank())
```
## 3.4. Endeudamiento del activo por tamaño de empresa
En este gráfico se pretende mostrar el endeudamiento del activo por tamaño de empresa (grande, mediana, micro, no definido y pequeña).
```{r}
endeudamiento_tamano_empresa <- empresas |>
group_by(tamano) |>
summarise(end_mean = mean(ind_endeudamiento_del_activo, na.rm = TRUE),
end_max = max(ind_endeudamiento_del_activo, na.rm = TRUE),
end_min = min(ind_endeudamiento_del_activo, na.rm = TRUE))
endeudamiento_tamano_empresa
```
```{r}
## Endeudamiento del activo por tamaño de empresa
endeudamiento_tamano_empresa |>
pivot_longer(
cols = starts_with("end"),
names_to = c("indicador", "estadistico"),
names_sep = "_",
values_to = "valor") |>
ggplot(aes(valor, tamano, label = round(valor, 1))) +
geom_line(aes(group = tamano)) +
geom_point(aes(color = estadistico), size = 2) +
geom_text_repel(aes(color = estadistico)) +
scale_color_viridis_d() +
labs(title = "Resumen estadístico endeudamiento por tamaño de empresa",
fill = "Actividades") +
theme(
legend.position = "top",
legend.direction = "horizontal",
axis.title.x = element_blank(),
axis.title.y = element_blank())
```
**RESULTADO:** Con el resultado expuesto en el gráfico anterior, se puede observar que el promedio de endeudamiento del activo de las empresas micro y pequeñas es mayor al endeudamiento del activo de las empresas grandes.
## 3.5. Liquidez por número de trabajadores
En este gráfico se pretende observar la liquidez corriente por número de empleados que trabaja en cada empresa. Para este análisis se toma en cuenta a las empresas que cumplen los dos criterios de tener más de 60 trabajadores directos y que contar con 100 a 800 trabajadores administrativos y se las cataloga como "Cumple ambos"; por otro lado se encuentran las empresas que cumplen con el criterio de tener más de 60 trabajadores directos y se las cataloga como "Cumple criterio 1"; y por último se toman en cuenta a las empresas que cumplen con el criterio de contar con 100 a 800 trabajadores administrativos a la cual se le cataloga como "Cumple criterio 2"; a todas las demás que no se encentran dentro de este grupo se les cataloga como "No cumple".
```{r}
liquidez_trabajadores_empresa <- empresas |>
mutate(tipo_por_trabajadores = case_when(
is.na(numero_de_trabajadores_directivos) &
is.na(numero_de_trabajadores_administrativos) ~ NA,
numero_de_trabajadores_produccion > 60 &
between(numero_de_trabajadores_administrativos, 100, 800) ~ "Cumple ambos",
numero_de_trabajadores_produccion > 60 ~ "Cumple criterio 1",
between(numero_de_trabajadores_administrativos, 100, 800) ~ "Cumple criterio 2",
TRUE ~ "No cumple"
)) |>
group_by(tipo_por_trabajadores) |>
summarise(liq_mean = round(mean(ind_liquidez_corriente, na.rm = TRUE), 1),
n = n())
liquidez_trabajadores_empresa
```
```{r}
## Liquidez por número de trabajadores
liquidez_trabajadores_empresa |>
ggplot(aes(liq_mean,
fct_rev(tipo_por_trabajadores),
fill = tipo_por_trabajadores)) +
geom_col() +
scale_color_viridis_d() +
labs(title = "Promedio liquidez corriente por número de trabajadores",
fill = "Actividades") +
theme(
legend.position = "top",
legend.direction = "horizontal",
axis.title.x = element_blank(),
axis.title.y = element_blank())
```
**RESULTADO:** La liquidez corriente promedio es mayor en las empresas que no cumplen con ningún criterio, sin embargo, las empresas que cumplen con tener más de 60 trabajadores directos tienen la liquidez corriente promedio más alta en términos de los demás criterios descritos en el primer párrafo de este análisis.
## 3.6. Apalancamiento por empresas
En este análisis se pretende observar el top 10 de empresas que cuentan con el volumen más alto de apalancamiento.
```{r}
apalancamiento_empresa <- empresas |>
select(nombre_de_la_compania, ind_apalancamiento) |>
slice_max(ind_apalancamiento, n = 10) |>
mutate(
ind_apalancamiento = round(ind_apalancamiento, 1),
ranking = min_rank(-ind_apalancamiento))
apalancamiento_empresa
```
**RESULTADO:** El resultado de este análisis lo demuestro en el siguiente gráfico que contiene las 10 empresas con el volumen más alto de apalancamiento.
```{r}
apalancamiento_empresa |>
ggplot(aes(ind_apalancamiento, fct_inorder(nombre_de_la_compania) |>
fct_rev(), fill = nombre_de_la_compania)) +
geom_col() +
scale_fill_viridis_d() +
labs(title = "Top 10 empresas con mayor volúmen de apalancamiento") +
theme(legend.position = "none",
axis.title.x = element_blank(),
axis.title.y = element_blank())
```