1. Introducción

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.

1. Preparación de los Datos

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.

2. Definición de Series a Analizar

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/"

3. Tabla Resumen de Estadística Descriptiva

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
  )
Estadística Descriptiva por Serie de Tiempo
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

4. Gráficos de Evolución de las Series

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'

## 
## 
## ---
  1. SECCIÓN

    5. Análisis ANOVA: Comparación de Indicadores SOCAP por Nivel de Operació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.

5.1. Análisis ANOVA: ROA (Nivel 2 vs 3)

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.

5.2. Análisis ANOVA: ROA (Nivel 1 vs 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.

5.3. Análisis ANOVA: ROA (Nivel 1 vs 2)

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.
  1. Análisis del Índice de Morosidad (IMOR)

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.

Análisis ANOVA: IMOR (2 y 3)

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.

5.3 Análisis ANOVA: IMOR (Nivel 1 vs 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.

5.4. Análisis ANOVA: IMOR (Nivel 1 vs 2)

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.

6. Pruebas de Supuestos del ANOVA

Antes de interpretar el ANOVA, es crucial verificar los supuestos de Normalidad y Homogeneidad de Varianzas.

6.1. Prueba de Normalidad (Shapiro-Wilk)

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
)
Resultados de la Prueba de Normalidad de Shapiro-Wilk para IMOR (Niveles 2 y 3)
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
)
Resultados de la Prueba de Normalidad de Shapiro-Wilk para IMOR (Niveles 2 y 3)
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.

6.2. Prueba de Homogeneidad de Varianzas (Levene)

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.

7. Análisis de Varianza (ANOVA)

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.

8. Conclusión

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.