La eficiencia en los intermediarios financieros ha sido un tema recurrente en la investigación económica, entendemos la eficiencia como el mejor uso que se le da a los recursos con los que cuenta una organización (inputs) para obtener la mayor cantidad de producto o servicio (outputs), o viceversa obtener el mismo resultados con una menor cantidad de insumos (inputs).
Para iniciar el análisis, el primer lugar presentamos el análisis de estadística descriptiva de la base de datos obtenida de la Comisión Nacional Bancaria y de Valores sobre las Sociedades de Ahorrro y Préstamo, donde cada fila representa una serie de tiempo (concepto) y cada columna representa una fecha. El análisis se realiza a nivel de serie de tiempo individual.
Una vez hecho esto, se presentan los resultados de una anális ANOVA, diferencias de medias, para establecer el nivel de eficiencia medido a partir de los datos obtenidos del Rendimiento sobre Activos (ROA), como medida del grado de eficiencia, y los compararemos entre diversos niveles de operaciones, en los que clasifica la autoridad a estos tipos de intermediarios.
Iniciamos nuestro análisis con una breve revisión de la situación financiera de las Sociedades Cooperativas de Ahorro y Préstamos (SOCAP) con información integrada por la Comisión Nacional Bancaría y de Valores, entiendad supervisora del sector.
La información selecionada proviene de los informes mensuales que deben remitir estos intermediarios a dicha Comisión para su supervisión. Primeramente se trabajaron dichas cifras para obtener los datos deflactados con información del INPC que emite el INEGI, base al año 2014.
Para el desarrollo del análisis en R, cargamos los paquetes
necesarios para la manipulación de datos (tidyverse),
estadística (psych) y hacemos la carga de los datos del
archivo (readxl).
datos <- read_excel("C:/Users/LENOVO/Dropbox/MAO/BaseSocapSistema.xlsx")
nombres <- colnames(datos)
nombres_fechas <- c(
"Concepto",
as.character(as.Date(as.numeric(nombres[-1]), origin = "1899-12-30"))
)
colnames(datos) <- nombres_fechas
# Conversión a formato largo y limpieza
df_long <- datos %>%
mutate(across(-Concepto, ~ as.numeric(.))) %>%
pivot_longer(
cols = -Concepto,
names_to = "Fecha",
values_to = "Valor"
) %>%
mutate(Fecha = as.Date(Fecha))
head(df_long)
## # A tibble: 6 × 3
## Concepto Fecha Valor
## <chr> <date> <dbl>
## 1 ACTIVO 2013-01-01 62786.
## 2 ACTIVO 2013-02-01 62226.
## 3 ACTIVO 2013-03-01 62786.
## 4 ACTIVO 2013-04-01 64326.
## 5 ACTIVO 2013-05-01 65267.
## 6 ACTIVO 2013-06-01 66584.
Filtramos los datos solo para las series de interés, dejamos para una
segunda parte realizar un análisis de correlación para validar la
relevancia de cada una de las series selecconadas. En este sentido se
propuso un total de 22 indicadores, sin embargo por diversos problemas
en la base de datos solo pudo trabajar con 15 (el nombre de la columna
valida, la identificamos con el nombre de Concepto.)
# Lista de conceptos propuestos
SERIES_SELECCIONADAS <- c(
"ACTIVO", # Se usará esta etiqueta si la tienes
"IMOR",
"margen financiero", # Ajusta el nombre si es diferente
"cartera de crédito total",
"captación tradicional",
"ICOR",
"Coeficiente de liquidez 4/",
"Activos líquidos de corto plazo",
"Pasivos de corto plazo",
"Rendimiento sobre el activo (ROA) 5/",
"Rendimiento sobre el capital contable (ROE) 6/",
"Capital contable /Activo total",
"Gastos de administración y prom. (suma flujos 12 meses) / Activo total (promedio 12 meses)",
"Número de socios 7/",
"Numero de sucursales",
"CAPITALIZACIÓN",
"Nivel de Capitalización (NICAP) 8/",
"Índice de Capitalización (ICAP) 9/",
"Capital neto",
"TASAS DE INTERÉS IMPLÍCITAS ACTIVAS 10/",
"TASAS DE INTERÉS IMPLÍCITAS PASIVAS 11/"
)
# Filtrado de los datos
df_filtrado <- df_long %>%
filter(Concepto %in% SERIES_SELECCIONADAS)
# Series seleccionadas
series_encontradas <- unique(df_filtrado$Concepto)
cat("Series encontradas para el análisis (", length(series_encontradas), " de ", length(SERIES_SELECCIONADAS), " solicitadas):\n")
## Series encontradas para el análisis ( 15 de 21 solicitadas):
print(series_encontradas)
## [1] "ACTIVO"
## [2] "Coeficiente de liquidez 4/"
## [3] "Activos líquidos de corto plazo"
## [4] "Pasivos de corto plazo"
## [5] "Rendimiento sobre el activo (ROA) 5/"
## [6] "Rendimiento sobre el capital contable (ROE) 6/"
## [7] "Capital contable /Activo total"
## [8] "Gastos de administración y prom. (suma flujos 12 meses) / Activo total (promedio 12 meses)"
## [9] "Numero de sucursales"
## [10] "CAPITALIZACIÓN"
## [11] "Nivel de Capitalización (NICAP) 8/"
## [12] "Índice de Capitalización (ICAP) 9/"
## [13] "Capital neto"
## [14] "TASAS DE INTERÉS IMPLÍCITAS ACTIVAS 10/"
## [15] "TASAS DE INTERÉS IMPLÍCITAS PASIVAS 11/"
Calculamos y presentamos las métricas descriptivas por serie, incluyendo asimetría y curtosis. (en esta parte desarrollaremos un análisis tipo CAMEL, utilizando los datos como medida del sector, y comparando estos con cada una de las organizaciones con el fin de realizar su clasificación.
# Función para calcular Asimetría y Curtosis usando el paquete 'psych'
# usamos una función wrapper ya que describe() es para columnas
calcular_descriptiva <- df_filtrado %>%
group_by(Concepto) %>%
summarise(
N = sum(!is.na(Valor)),
Media = mean(Valor, na.rm = TRUE),
Mediana = median(Valor, na.rm = TRUE),
Min = min(Valor, na.rm = TRUE),
Max = max(Valor, na.rm = TRUE),
DesvStd = sd(Valor, na.rm = TRUE),
Asimetria = psych::skew(Valor, na.rm = TRUE),
Curtosis = psych::kurtosi(Valor, na.rm = TRUE),
.groups = 'drop'
)
# Mostrar la tabla formateada con kableExtra
calcular_descriptiva %>%
knitr::kable("html", digits = 4, caption = "Estadística Descriptiva por Serie de Tiempo") %>%
kableExtra::kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE
)
| Concepto | N | Media | Mediana | Min | Max | DesvStd | Asimetria | Curtosis |
|---|---|---|---|---|---|---|---|---|
| ACTIVO | 152 | 167052.1616 | 159175.9487 | 62225.7556 | 311240.1605 | 69697.7099 | 0.2861 | -1.0972 |
| Activos líquidos de corto plazo | 152 | 32763.0613 | 34245.1309 | 0.0000 | 56121.9330 | 18582.4466 | -0.6828 | -0.7738 |
| CAPITALIZACIÓN | 152 | 43571.9605 | 43571.0000 | 41275.0000 | 45870.0000 | 1339.9440 | 0.0000 | -1.2237 |
| Capital contable /Activo total | 152 | 17.0276 | 16.9234 | 14.9243 | 18.7752 | 0.8811 | 0.0111 | -0.8961 |
| Capital neto | 152 | 25631.2172 | 27411.6836 | 0.0000 | 53210.9663 | 15916.7077 | -0.2301 | -0.8618 |
| Coeficiente de liquidez 4/ | 152 | 32.8394 | 39.4066 | 0.0000 | 46.4971 | 16.1313 | -1.4964 | 0.3438 |
| Gastos de administración y prom. (suma flujos 12 meses) / Activo total (promedio 12 meses) | 152 | 6.5800 | 6.8517 | 0.0000 | 9.7278 | 2.0210 | -2.2444 | 5.4564 |
| Nivel de Capitalización (NICAP) 8/ | 152 | 234.3508 | 284.8356 | 0.0000 | 317.4071 | 114.7975 | -1.5174 | 0.3720 |
| Numero de sucursales | 152 | 1725.0592 | 2107.0000 | 0.0000 | 2319.0000 | 849.9116 | -1.4765 | 0.3088 |
| Pasivos de corto plazo | 152 | 80958.3853 | 86740.0256 | 0.0000 | 148552.9861 | 46213.0390 | -0.6327 | -0.7471 |
| Rendimiento sobre el activo (ROA) 5/ | 152 | 2.1359 | 2.3639 | 0.0000 | 3.3280 | 0.7928 | -1.1871 | 1.3044 |
| Rendimiento sobre el capital contable (ROE) 6/ | 152 | 12.4720 | 13.4762 | 0.0000 | 19.3822 | 4.4715 | -1.3551 | 1.8421 |
| TASAS DE INTERÉS IMPLÍCITAS ACTIVAS 10/ | 152 | 43571.9605 | 43571.0000 | 41275.0000 | 45870.0000 | 1339.9440 | 0.0000 | -1.2237 |
| TASAS DE INTERÉS IMPLÍCITAS PASIVAS 11/ | 152 | 43571.9605 | 43571.0000 | 41275.0000 | 45870.0000 | 1339.9440 | 0.0000 | -1.2237 |
| Índice de Capitalización (ICAP) 9/ | 152 | 18.7481 | 22.7868 | 0.0000 | 25.3926 | 9.1838 | -1.5174 | 0.3720 |
Presentamos un sencillo gráfico de línea para visualizar la tendencia de cada serie a lo largo del periodo, además de una línea de suavizado (LOESS) para ver la tendencia de fondo.
# gráficos usando un bucle
lista_graficos <- list()
for (serie in series_encontradas) {
df_temp <- df_filtrado %>% filter(Concepto == serie)
# Gráfico de línea con suavizado
p <- ggplot(df_temp, aes(x = Fecha, y = Valor)) +
geom_line(color = "blue", linewidth = 0.8) +
geom_smooth(method = "loess", color = "red", se = FALSE, linetype = "dashed") +
theme_minimal(base_size = 12) +
labs(
title = paste("Evolución Temporal de:", serie),
x = "Fecha",
y = "Valor"
) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
lista_graficos[[serie]] <- p
# Imprimir el gráfico en el documento R Markdown
cat('### Evolución de', serie, '\n\n')
print(p)
cat('\n\n---\n\n')
}
## ### Evolución de ACTIVO
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Coeficiente de liquidez 4/
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Activos líquidos de corto plazo
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Pasivos de corto plazo
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Rendimiento sobre el activo (ROA) 5/
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Rendimiento sobre el capital contable (ROE) 6/
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Capital contable /Activo total
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Gastos de administración y prom. (suma flujos 12 meses) / Activo total (promedio 12 meses)
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Numero de sucursales
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de CAPITALIZACIÓN
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Nivel de Capitalización (NICAP) 8/
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Índice de Capitalización (ICAP) 9/
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de Capital neto
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de TASAS DE INTERÉS IMPLÍCITAS ACTIVAS 10/
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
##
## ### Evolución de TASAS DE INTERÉS IMPLÍCITAS PASIVAS 11/
## `geom_smooth()` using formula = 'y ~ x'
##
##
## ---
SECCIÓN
En esta parte, nos comenzamos aproximar al reonocimiento del impacto de la regulación en el sistema de la SOCAP´s a traves de examinar los resultados que tienen las organizaciones, y evaluar si existe diferencia entre los grados de regulación y supervisión que aplica la autoridad a partir del nivel asignado a cada entidad, esto es, la norma establece que en razón al nivel autorizado por la CNBV, las organizaciones pueden ofrecer mayores servicios, hasta el nivel de operaciones IV donde prcaticamente tienen el derecho de ofrecer todos los servicios y productos que ofrece la banca (excepto manejar cuentas de cheques), sin embargo, no se debe escapar del análisis que esa ampliación de los servicios en cada nivel de operación, conlleva también un aumento de sus obligaciones regulatorias.
En este sentido, esta ampliación debería tener impacto mínimo en los rendimientos obtenidos por la organización, y con ello se demostraría que existen los incentivos adecuados en la regulación para promover el crecimiento del sector, sin castigar precisamente la ampliación de mas servicios financieros a la población.
# Datos
data <- read_excel("C:/Users/LENOVO/Dropbox/MAO/DatAnova.xlsx")
## New names:
## • `` -> `...1`
# Preparación inicial de la data
names(data)[1] <- "Variable"
### 6. PREPARACIÓN DE DATOS PARA ANÁLISIS ANOVA
# Carga de la segunda base
# 1.
nivel_operacion <- data %>%
filter(Variable == "Nivel de operación Autorizado")
nivel_long <- nivel_operacion %>%
pivot_longer(
cols = 2:ncol(nivel_operacion),
names_to = "Sociedad",
values_to = "Nivel"
)
nivel_long$Nivel <- as.factor(nivel_long$Nivel)
# 2. Crear el objeto 'valores_variable_ROA'
variable_objetivo <- "Rendimiento Sobre los Activos (ROA)"
valores_variable_ROA <- data %>%
filter(Variable == variable_objetivo) %>%
pivot_longer(
cols = 2:ncol(data),
names_to = "Sociedad",
values_to = "Valor"
)
cat("Objeto 'nivel_long' creado.\n")
## Objeto 'nivel_long' creado.
# 3. Crear el objeto 'valores_variable_IMOR'
variable_objetivo_IMOR <- "IMOR"
valores_variable_IMOR <- data %>%
filter(Variable == variable_objetivo_IMOR) %>%
pivot_longer(
cols = 2:ncol(data),
names_to = "Sociedad",
values_to = "Valor"
)
cat("Objetos clave ('nivel_long', 'valores_variable_ROA', 'valores_variable_IMOR') creados y listos para el análisis.\n")
## Objetos clave ('nivel_long', 'valores_variable_ROA', 'valores_variable_IMOR') creados y listos para el análisis.
Comenzaremos con evaluar el Rendimiento sobre activos como una medida aproximada de la eficacia de la organización, se esperaría que mientras si tienen más operaciones y las entidades son más grandes debieran de manifestarse en economias de alcance y escala, sin embargo los hallazgos no son de todo concluyentes.
Este análisis evalúa si existe una diferencia significativa en el Rendimiento sobre el Activo (ROA) entre las sociedades de Nivel 2 y Nivel 3.
variable_objetivo <- "Rendimiento Sobre los Activos (ROA)"
# --- Obtener los valores de la variable objetivo (ROA) ---
valores_variable_ROA <- data %>%
filter(Variable == variable_objetivo) %>%
pivot_longer(
cols = 2:ncol(data),
names_to = "Sociedad",
values_to = "Valor"
)
# --- Filtrado de Datos (Niveles 2 y 3) ---
niveles_filtrados_2_3 <- nivel_long %>%
filter(Nivel %in% c("2", "3"))
# Unir con los valores de ROA
anova_data_2_3 <- niveles_filtrados_2_3 %>%
left_join(valores_variable_ROA, by = "Sociedad")
anova_data_2_3$Valor <- as.numeric(anova_data_2_3$Valor)
# --- Modelo ANOVA ---
modelo_ROA_2_3 <- aov(Valor ~ Nivel, data = anova_data_2_3)
cat("\n*** RESULTADOS ANOVA (ROA: Nivel 2 vs 3) ***\n")
##
## *** RESULTADOS ANOVA (ROA: Nivel 2 vs 3) ***
print(summary(modelo_ROA_2_3))
## Df Sum Sq Mean Sq F value Pr(>F)
## Nivel 1 0.00118 0.0011782 3.245 0.0747 .
## Residuals 99 0.03595 0.0003631
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# --- Prueba Post-Hoc ---
cat("\n*** Prueba Tukey HSD ***\n")
##
## *** Prueba Tukey HSD ***
print(TukeyHSD(modelo_ROA_2_3))
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Valor ~ Nivel, data = anova_data_2_3)
##
## $Nivel
## diff lwr upr p adj
## 3-2 0.006955047 -0.0007064458 0.01461654 0.0747066
# --- Visualización ---
p_value_2_3 <- summary(modelo_ROA_2_3)[[1]][["Pr(>F)"]][1]
boxplot(Valor ~ Nivel,
data = anova_data_2_3,
col = c("lightcoral", "lightskyblue"),
main = paste("ANOVA: Comparación de ROA por Nivel (2 vs 3)\n(p =", round(p_value_2_3, 4), ")"),
xlab = "Nivel de Operación Autorizado",
ylab = variable_objetivo)
# --- Conclusión ---
cat("\nValor p del ANOVA:", p_value_2_3, "\n")
##
## Valor p del ANOVA: 0.07470657
if(p_value_2_3 < 0.05){
cat("Conclusión: Se **rechaza H0**. Existe una **diferencia significativa** en el ROA entre los niveles 2 y 3.\n")
} else {
cat("Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el ROA entre los niveles 2 y 3.\n")
}
## Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el ROA entre los niveles 2 y 3.
Este análisis evalúa si existe una diferencia significativa en el ROA entre las sociedades de Nivel 1 y Nivel 3
variable_objetivo <- "Rendimiento Sobre los Activos (ROA)"
# --- Filtrado de Datos (Niveles 1 y 3) ---
niveles_filtrados_1_3 <- nivel_long %>%
filter(Nivel %in% c("1", "3"))
# Unir con los valores de ROA (valores_variable_ROA ya está cargado)
anova_data_1_3 <- niveles_filtrados_1_3 %>%
left_join(valores_variable_ROA, by = "Sociedad")
anova_data_1_3$Valor <- as.numeric(anova_data_1_3$Valor)
# --- Modelo ANOVA ---
modelo_ROA_1_3 <- aov(Valor ~ Nivel, data = anova_data_1_3)
cat("\n*** RESULTADOS ANOVA (ROA: Nivel 1 vs 3) ***\n")
##
## *** RESULTADOS ANOVA (ROA: Nivel 1 vs 3) ***
print(summary(modelo_ROA_1_3))
## Df Sum Sq Mean Sq F value Pr(>F)
## Nivel 1 0.001154 0.0011539 3.425 0.0675 .
## Residuals 90 0.030324 0.0003369
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# --- Prueba Post-Hoc ---
cat("\n*** Prueba Tukey HSD ***\n")
##
## *** Prueba Tukey HSD ***
print(TukeyHSD(modelo_ROA_1_3))
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Valor ~ Nivel, data = anova_data_1_3)
##
## $Nivel
## diff lwr upr p adj
## 3-1 0.007125185 -0.0005239984 0.01477437 0.0675106
# --- Visualización ---
p_value_1_3 <- summary(modelo_ROA_1_3)[[1]][["Pr(>F)"]][1]
boxplot(Valor ~ Nivel,
data = anova_data_1_3,
col = c("lightcoral", "lightskyblue"),
main = paste("ANOVA: Comparación de ROA por Nivel (1 vs 3)\n(p =", round(p_value_1_3, 4), ")"),
xlab = "Nivel de Operación Autorizado",
ylab = variable_objetivo)
# --- Conclusión ---
cat("\nValor p del ANOVA:", p_value_1_3, "\n")
##
## Valor p del ANOVA: 0.0675106
if(p_value_1_3 < 0.05){
cat("Conclusión: Se **rechaza H0**. Existe una diferencia significativa en el ROA entre los niveles 1 y 3.\n")
} else {
cat("Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el ROA entre los niveles 1 y 3.\n")
}
## Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el ROA entre los niveles 1 y 3.
Este análisis evalúa si existe una diferencia significativa en el ROA entre las sociedades de Nivel 1 y Nivel 2.
variable_objetivo <- "Rendimiento Sobre los Activos (ROA)"
# --- Filtrado de Datos (Niveles 1 y 2) ---
niveles_filtrados_1_2 <- nivel_long %>%
filter(Nivel %in% c("1", "2"))
# Unir con los valores de ROA
anova_data_1_2 <- niveles_filtrados_1_2 %>%
left_join(valores_variable_ROA, by = "Sociedad")
anova_data_1_2$Valor <- as.numeric(anova_data_1_2$Valor)
# --- Modelo ANOVA ---
modelo_ROA_1_2 <- aov(Valor ~ Nivel, data = anova_data_1_2)
cat("\n*** RESULTADOS ANOVA (ROA: Nivel 1 vs 2) ***\n")
##
## *** RESULTADOS ANOVA (ROA: Nivel 1 vs 2) ***
print(summary(modelo_ROA_1_2))
## Df Sum Sq Mean Sq F value Pr(>F)
## Nivel 1 0.00000 0.0000008 0.002 0.969
## Residuals 109 0.05718 0.0005246
# --- Prueba Post-Hoc ---
cat("\n*** Prueba Tukey HSD ***\n")
##
## *** Prueba Tukey HSD ***
print(TukeyHSD(modelo_ROA_1_2))
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Valor ~ Nivel, data = anova_data_1_2)
##
## $Nivel
## diff lwr upr p adj
## 2-1 0.0001701375 -0.008475919 0.008816194 0.9689607
# --- Visualización ---
p_value_1_2 <- summary(modelo_ROA_1_2)[[1]][["Pr(>F)"]][1]
boxplot(Valor ~ Nivel,
data = anova_data_1_2,
col = c("lightcoral", "lightskyblue"),
main = paste("ANOVA: Comparación de ROA por Nivel (1 vs 2)\n(p =", round(p_value_1_2, 4), ")"),
xlab = "Nivel de Operación Autorizado",
ylab = variable_objetivo)
# --- Conclusión ---
cat("\nValor p del ANOVA:", p_value_1_2, "\n")
##
## Valor p del ANOVA: 0.9689607
if(p_value_1_2 < 0.05){
cat("Conclusión: Se **rechaza H0**. Existe una diferencia significativa en el ROA entre los niveles 1 y 2.\n")
} else {
cat("Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el ROA entre los niveles 1 y 2.\n")
}
## Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el ROA entre los niveles 1 y 2.
Una vez revisado la eficacia, ahora centraremos nuestro interés en encontrar un indicio sobre la eficacia operativa de las organiaciones, partimos del hecho que el indice de morosidad es un buen indicador de la forma en que esta trabajando la organización, dado que el proceso crediticio es el elemento esencial y razón de ser de estos intermediarios financieros, por lo tanto, no se esperaría diferencias sustantivas entre los niveles de operación, en razón que con independencia de las operaciones conexas, esta actividad es el fundamento para medir la eficacia de la organización.
variable_objetivo_IMOR <- "IMOR"
# --- Obtener los valores de la variable objetivo IMOR ---
valores_variable_IMOR <- data %>%
filter(Variable == variable_objetivo_IMOR) %>%
pivot_longer(
cols = 2:ncol(data),
names_to = "Sociedad",
values_to = "Valor"
)
# --- Filtrado de Datos (Niveles 2 y 3) ---
niveles_filtrados_2_3 <- nivel_long %>%
filter(Nivel %in% c("2", "3"))
# Unir con los valores de roa
anova_data_2_3 <- niveles_filtrados_2_3 %>%
left_join(valores_variable_ROA, by = "Sociedad")
anova_data_2_3$Valor <- as.numeric(anova_data_2_3$Valor)
# --- Modelo ANOVA ---
modelo_IMOR_2_3 <- aov(Valor ~ Nivel, data = anova_data_2_3)
cat("\n*** RESULTADOS ANOVA (IMOR: Nivel 2 vs 3) ***\n")
##
## *** RESULTADOS ANOVA (IMOR: Nivel 2 vs 3) ***
print(summary(modelo_ROA_2_3))
## Df Sum Sq Mean Sq F value Pr(>F)
## Nivel 1 0.00118 0.0011782 3.245 0.0747 .
## Residuals 99 0.03595 0.0003631
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# --- Prueba Post-Hoc ---
cat("\n*** Prueba Tukey HSD ***\n")
##
## *** Prueba Tukey HSD ***
print(TukeyHSD(modelo_IMOR_2_3))
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Valor ~ Nivel, data = anova_data_2_3)
##
## $Nivel
## diff lwr upr p adj
## 3-2 0.006955047 -0.0007064458 0.01461654 0.0747066
# --- Visualización ---
p_value_2_3 <- summary(modelo_IMOR_2_3)[[1]][["Pr(>F)"]][1]
boxplot(Valor ~ Nivel,
data = anova_data_2_3,
col = c("lightcoral", "lightskyblue"),
main = paste("ANOVA: Comparación de IMOR por Nivel (2 vs 3)\n(p =", round(p_value_2_3, 4), ")"),
xlab = "Nivel de Operación Autorizado",
ylab = variable_objetivo)
# --- Conclusión ---
cat("\nValor p del ANOVA:", p_value_2_3, "\n")
##
## Valor p del ANOVA: 0.07470657
if(p_value_2_3 < 0.05){
cat("Conclusión: Se **rechaza H0**. Existe una **diferencia significativa** en el ROA entre los niveles 2 y 3.\n")
} else {
cat("Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el ROA entre los niveles 2 y 3.\n")
}
## Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el ROA entre los niveles 2 y 3.
Este análisis compara si existe una diferencia significativa en el Índice de Morosidad (IMOR) entre las sociedades de Nivel 1 y Nivel 3.
nivel_operacion <- data %>%
filter(Variable == "Nivel de operación Autorizado")
nivel_long <- nivel_operacion %>%
pivot_longer(
cols = 2:ncol(nivel_operacion),
names_to = "Sociedad",
values_to = "Nivel"
)
nivel_long$Nivel <- as.factor(nivel_long$Nivel)
# Crear el objeto 'valores_variable_IMOR' (Variable Dependiente)
variable_objetivo_IMOR <- "IMOR"
valores_variable_IMOR <- data %>%
filter(Variable == variable_objetivo_IMOR) %>%
pivot_longer(
cols = 2:ncol(data),
names_to = "Sociedad",
values_to = "Valor"
)
cat("Objeto 'nivel_long' creado y listo para el análisis.\n")
## Objeto 'nivel_long' creado y listo para el análisis.
variable_objetivo_IMOR <- "IMOR"
# --- Filtrado de Datos (Niveles 1 y 3) ---
variable_objetivo_IMOR <- nivel_long %>%
filter(Nivel %in% c("1", "3"))
# --- Filtrado de Datos (Niveles 1 y 3) ---
niveles_filtrados_1_3 <- nivel_long %>%
filter(Nivel %in% c("1", "3"))
# Unir con los valores de IMOR
anova_data_IMOR_1_3 <- niveles_filtrados_1_3 %>%
left_join(valores_variable_IMOR, by = "Sociedad")
anova_data_1_3$Valor <- as.numeric(anova_data_1_3$Valor)
# --- Modelo ANOVA ---
modelo_IMOR_1_3 <- aov(Valor ~ Nivel, data = anova_data_1_3)
cat("\n*** RESULTADOS ANOVA (IMOR: Nivel 1 vs 3) ***\n")
##
## *** RESULTADOS ANOVA (IMOR: Nivel 1 vs 3) ***
print(summary(modelo_IMOR_1_3))
## Df Sum Sq Mean Sq F value Pr(>F)
## Nivel 1 0.001154 0.0011539 3.425 0.0675 .
## Residuals 90 0.030324 0.0003369
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# --- Prueba Post-Hoc ---
cat("\n*** Prueba Tukey HSD ***\n")
##
## *** Prueba Tukey HSD ***
print(TukeyHSD(modelo_IMOR_1_3))
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Valor ~ Nivel, data = anova_data_1_3)
##
## $Nivel
## diff lwr upr p adj
## 3-1 0.007125185 -0.0005239984 0.01477437 0.0675106
# --- Visualización ---
p_value_1_3 <- summary(modelo_IMOR_1_3)[[1]][["Pr(>F)"]][1]
boxplot(Valor ~ Nivel,
data = anova_data_1_3,
col = c("lightblue", "lightgreen"),
main = paste("ANOVA: Comparación de IMOR por Nivel (1 vs 3)\n(p =", round(p_value_1_3, 4), ")"),
xlab = "Nivel de Operación Autorizado",
ylab = variable_objetivo)
# --- Conclusión ---
cat("\nValor p del ANOVA:", p_value_1_3, "\n")
##
## Valor p del ANOVA: 0.0675106
if(p_value_1_3 < 0.05){
cat("Conclusión: Se **rechaza H0**. Existe una diferencia significativa en el IMOR entre los niveles 1 y 3.\n")
} else {
cat("Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el IMOR entre los niveles 1 y 3.\n")
}
## Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el IMOR entre los niveles 1 y 3.
Este análisis compara si existe una diferencia significativa en el Índice de Morosidad (IMOR) entre las sociedades de Nivel 1 y Nivel 2.
# --- Filtrado de Datos (Niveles 1 y 2) ---
niveles_filtrados_1_2 <- nivel_long %>%
filter(Nivel %in% c("1", "2"))
# Unir con los valores de IMOR
anova_data_1_2 <- niveles_filtrados_1_2 %>%
left_join(valores_variable_IMOR, by = "Sociedad")
anova_data_1_2$Valor <- as.numeric(anova_data_1_2$Valor)
# --- Modelo ANOVA ---
modelo_IMOR_1_2 <- aov(Valor ~ Nivel, data = anova_data_1_2)
cat("\n*** RESULTADOS ANOVA (IMOR: Nivel 1 vs 2) ***\n")
##
## *** RESULTADOS ANOVA (IMOR: Nivel 1 vs 2) ***
print(summary(modelo_IMOR_1_2))
## Df Sum Sq Mean Sq F value Pr(>F)
## Nivel 1 4.99 4.992 2.305 0.132
## Residuals 109 236.08 2.166
# --- Prueba Post-Hoc ---
cat("\n*** Prueba Tukey HSD ***\n")
##
## *** Prueba Tukey HSD ***
print(TukeyHSD(modelo_IMOR_1_2))
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Valor ~ Nivel, data = anova_data_1_2)
##
## $Nivel
## diff lwr upr p adj
## 2-1 0.4255219 -0.1300102 0.981054 0.1318765
# --- Visualización ---
p_value_1_2 <- summary(modelo_IMOR_1_2)[[1]][["Pr(>F)"]][1]
boxplot(Valor ~ Nivel,
data = anova_data_1_2,
col = c("lightblue", "lightgreen"),
main = paste("ANOVA: Comparación de IMOR por Nivel (1 vs 2)\n(p =", round(p_value_1_2, 4), ")"),
xlab = "Nivel de Operación Autorizado",
ylab = variable_objetivo)
# --- Conclusión ---
cat("\nValor p del ANOVA:", p_value_1_2, "\n")
##
## Valor p del ANOVA: 0.1318765
if(p_value_1_2 < 0.05){
cat("Conclusión: Se **rechaza H0**. Existe una diferencia significativa en el IMOR entre los niveles 1 y 2.\n")
} else {
cat("Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el IMOR entre los niveles 1 y 2.\n")
}
## Conclusión: **No se rechaza H0**. No hay evidencia de diferencia significativa en el IMOR entre los niveles 1 y 2.
Antes de interpretar el ANOVA, es crucial verificar los supuestos de Normalidad y Homogeneidad de Varianzas.
Hipótesis Nula ($H_0$): Los datos siguen una distribución normal.
Criterio: Si $p < 0.05$, se rechaza $H_0$ (no hay normalidad).
cat("\n*** PRUEBA DE NORMALIDAD (Shapiro-Wilk) por Nivel ***\n")
##
## *** PRUEBA DE NORMALIDAD (Shapiro-Wilk) por Nivel ***
normalidad <- anova_data_IMOR_1_3 %>%
group_by(Nivel) %>%
summarise(
p_value = shapiro.test(Valor)$p.value,
.groups = 'drop'
)
knitr::kable(
normalidad,
caption = "Resultados de la Prueba de Normalidad de Shapiro-Wilk para IMOR (Niveles 2 y 3)",
digits = 4
)
| Nivel | p_value |
|---|---|
| 1 | 0.0068 |
| 3 | 0.0973 |
cat("\n*** PRUEBA DE NORMALIDAD (Shapiro-Wilk) por Nivel ***\n")
##
## *** PRUEBA DE NORMALIDAD (Shapiro-Wilk) por Nivel ***
normalidad <- anova_data_IMOR_1_3 %>%
group_by(Nivel) %>%
summarise(
p_value = shapiro.test(Valor)$p.value,
.groups = 'drop'
)
knitr::kable(
normalidad,
caption = "Resultados de la Prueba de Normalidad de Shapiro-Wilk para IMOR (Niveles 2 y 3)",
digits = 4
)
| Nivel | p_value |
|---|---|
| 1 | 0.0068 |
| 3 | 0.0973 |
Interpretación: La normalidad es violada si el p-valor es bajo. Si la normalidad falla, los resultados del ANOVA estándar deben tomarse con precaución o se debe considerar la prueba no paramétrica de Kruskal-Wallis.
Hipótesis Nula ($H_0$): Las varianzas de los grupos son iguales (homocedasticidad).
Criterio: Si $p < 0.05$, se rechaza $H_0$ (las varianzas son diferentes).
cat("\n*** PRUEBA DE HOMOGENEIDAD DE VARIANZAS (Levene) ***\n")
##
## *** PRUEBA DE HOMOGENEIDAD DE VARIANZAS (Levene) ***
levene <- leveneTest(Valor ~ Nivel, data = anova_data_2_3)
print(levene)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 5.503 0.02098 *
## 99
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretación: Si la homogeneidad falla, se deben usar correcciones como la prueba de Welch en lugar del ANOVA estándar.
Calculamos el ANOVA para determinar si existe una diferencia significativa en el IMOR entre las sociedades de Nivel 2 y Nivel 3.
Hipótesis Nula (\(H_0\)): \(\mu_{Nivel 2} = \mu_{Nivel 3}\) (Las medias son iguales).
cat("\n*** RESULTADOS DEL ANOVA (IMOR: Nivel 2 vs 3) ***\n")
##
## *** RESULTADOS DEL ANOVA (IMOR: Nivel 2 vs 3) ***
modelo <- aov(Valor ~ Nivel, data = anova_data_2_3)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## Nivel 1 0.00118 0.0011782 3.245 0.0747 .
## Residuals 99 0.03595 0.0003631
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Conclusión y Valor p
p_value <- summary(modelo)[[1]][["Pr(>F)"]][1]
cat("Valor p del ANOVA:", p_value, "\n")
## Valor p del ANOVA: 0.07470657
if(p_value < 0.05){
cat("Conclusión: Se **rechaza H0**. Existe una **diferencia significativa** en el IMOR entre las sociedades de Nivel 2 y Nivel 3.\n")
} else {
cat("Conclusión: **No se rechaza H0**. No hay evidencia de una diferencia significativa en el IMOR entre las sociedades de Nivel 2 y Nivel 3.\n")
}
## Conclusión: **No se rechaza H0**. No hay evidencia de una diferencia significativa en el IMOR entre las sociedades de Nivel 2 y Nivel 3.
Este análisis descriptivo permite evaluar la tendencia central (Media, Mediana) y la volatilidad (Desviación Estándar) de los indicadores clave de la SOCAP a lo largo del tiempo. Los gráficos individuales confirman visualmente las tendencias y la estacionalidad (si existe) en cada serie.
Con el breve análisis, afectado por la excases de tiempo y conocimiento de la paqueteria, podemos concluir que exsten indicios significativos para decir que la normatividad es correcta en el sentido de no cargar con un mayor costo las operaciones de la organizaciones que estan creciendo, sin embargo la similitud de los datos que reportan las comparaciones entre las organizacones que pertenecen al nivel 2 y nivel 3, pueden sugerir que existen áreas de oportunidad en la reglamentación, ya que contrario a lo que se esperaría, no existe diferencia entre los resultados promedio entre las organizaciones del nivel 2 y 3. por lo que no existen incentivos correctos para el desarrollo de estos intermedirios y la profundización de la inclusión financiera.