1. Introducción

En Colombia, las microempresas representan la gran mayoría del tejido empresarial: según el Ministerio de Comercio, Industria y Turismo, con datos del RUES de Confecámaras, en el primer bimestre de 2023 concentraron el 95,9 % de las empresas. Dentro de este contexto se encuentran los microestablecimientos como tiendas de barrio, panaderías, peluquerías, pequeños talleres y demás negocios de industria, comercio y servicios, que el DANE define como el espacio físico donde se desarrolla una actividad económica, con hasta nueve personas ocupadas y no más de tres sucursales (DANE, 2016).

La Encuesta de Microestablecimientos (MICRO) del DANE surge de la necesidad de capturar información sobre las dinámicas de este segmento, cuyas unidades, por su número, dinámica y dispersión, quedan excluidas de las encuestas anuales de comercio, industria y servicios. Desde 2012 la encuesta estudia un grupo específico de negocios que cumplen cuatro condiciones: ser identificados como la misma unidad legal, desarrollar actividades de industria, comercio o servicios, tener más de un año de operación y ocupar hasta nueve personas. En su edición de 2016 investigó 33.013 microestablecimientos en las 24 ciudades principales y sus áreas metropolitanas, que en conjunto ocupaban 72.691 personas (DANE, 2016).

A pesar de su tamaño reducido, el desempeño económico de estos negocios puede estar relacionado con diferentes características propias de su funcionamiento. Entre ellas se encuentran el número de personas ocupadas, los costos asociados a la actividad económica, el sector al que pertenecen, la forma en que llevan su contabilidad y el acceso a mecanismos de financiación. De hecho, la propia encuesta dedica módulos específicos a la formalización, la inclusión financiera y los costos y gastos, lo que muestra que estas dimensiones se consideran relevantes para entender cómo funcionan estos negocios.

Para estudiar estas relaciones de forma conjunta se emplea la regresión lineal múltiple, una técnica que expresa una variable numérica en función de varias variables explicativas y permite estimar la asociación de cada una manteniendo constantes las demás.

Comprender e identificar los factores que asocian con las ventas de los microestablecimientos resulta relevante en un país donde estas unidades sostienen buena parte del empleo. Este análisis puede ser de utilidad tanto para los propios microempresarios, al reconocer qué aspectos de su operación podrían fortalecer, como desde el punto de vista académico, dado el impacto directo de estos negocios en la economía de miles de familias colombianas.

1.1 Pregunta de Investigación

En este trabajo se busca responder a la siguiente pregunta de investigación:

¿Qué factores estructurales y operativos están asociados con el nivel de ventas o ingresos de los microestablecimientos en Colombia?

1.2 Objetivo de Modelación

Ajustar un modelo de regresión lineal múltiple que explique el valor de las ventas o ingresos del microestablecimiento en función de un conjunto de variables predictoras durante el año 2016, evaluando además la calidad del ajuste y el cumplimiento de los supuestos del modelo.


2. Fuente y construcción de la base

2.1 Fuente

Campo Detalle
Entidad que publica Departamento Administrativo Nacional de Estadística (DANE), Dirección de Metodología y Producción Estadística (DIMPE)
Nombre del conjunto de datos Encuesta de Microestablecimientos — MICRO — 2012-2016
Enlace microdatos.dane.gov.co/index.php/catalog/560
Archivo específico utilizado Microestablecimientos_2016 (corte transversal)
Fecha de acceso 21/09/2026

2.2 Unidad de análisis y período

La unidad de análisis es el microestablecimiento: un espacio físico dedicado a actividades de industria, comercio o servicios, con máximo nueve personas ocupadas, ubicado en alguna de las 24 principales ciudades y áreas metropolitanas del país. Se trabaja con el corte transversal correspondiente al año 2016.

Nota sobre representatividad: el DANE clasifica esta encuesta como “no probabilística – estudio de caso”, lo que significa que los establecimientos no fueron elegidos al azar entre todos los negocios del país, sino que se estudiaron específicamente los ubicados en las 24 principales ciudades y sus áreas metropolitanas. Por esta razón, los resultados de este trabajo aplican a los microestablecimientos de esas ciudades, y no deben generalizarse a todos los microestablecimientos de Colombia (por ejemplo, no incluye zonas rurales ni ciudades pequeñas).

Cobertura geográfica

El siguiente mapa muestra las 24 ciudades principales y sus áreas metropolitanas cubiertas por la encuesta:

Fuente: elaboración propia a partir del listado de ciudades cubiertas por la Encuesta de Microestablecimientos del DANE.

Nota: “A.M.” hace referencia a “Área Metropolitana”. Algunas ciudades se investigan junto con los municipios que conforman su área metropolitana (por ejemplo, Medellín y A.M. incluye también Bello, Itagüí, Envigado, entre otros).

2.3 Variables seleccionadas

Variable dependiente (Y)

Ventas o ingresos del negocio : Es el valor total de las ventas o ingresos del microestablecimiento en los últimos 12 meses, en pesos colombianos (código DANE P1010). Se transforma logarítmicamente (log_Ventas) para reducir el sesgo observado en su distribución.

Variables predictoras (X)

tabla_variables <- tibble::tibble(
  Variable = c("Y", "X1", "X2", "X3", "X4", "X5"),
  Descripción = c(
    "Ventas o ingresos del negocio (últimos 12 meses)",
    "Personal ocupado promedio",
    "Costo de mercancía/insumos/materias primas (últimos 12 meses)",
    "Sector económico (Industria/Comercio/Servicios)",
    "Forma de llevar la contabilidad",
    "Solicitud de crédito o préstamo para el negocio (últimos 12 meses)"
  ),
  `Código DANE` = c("P1010", "P607", "P3012", "SECTOR", "P640", "P1765"),
  Naturaleza = c(
    "Continua (pesos COP) — se usa log_Ventas en el modelo",
    "Continua (número de personas)",
    "Continua (pesos COP) — se usa log_Costos en el modelo",
    "Categórica",
    "Categórica (4 niveles)",
    "Categórica (Sí/No)"
  )
)

tabla_variables_inicial <- tabla_variables %>%
  gt() %>%
  tab_header(
    title = "Operacionalización de variables",
    subtitle = "Modelo de regresión lineal múltiple — Microestablecimientos 2016 (DANE)"
  ) %>%
  cols_align(align = "center", columns = c(Variable, `Código DANE`)) %>%
  cols_align(align = "left", columns = c(Descripción, Naturaleza)) %>%
  cols_width(
    Variable ~ px(60),
    Descripción ~ px(320),
    `Código DANE` ~ px(100),
    Naturaleza ~ px(280)
  ) %>%

  tab_style(
    style = list(
      cell_fill(color = jade_medio),
      cell_text(font = "Cormorant Garamond", weight = "bold", color = "white", size = px(15))
    ),
    locations = cells_column_labels()
  ) %>%

  tab_style(
    style = list(
      cell_fill(color = aqua_claro),
      cell_text(weight = "bold", color = jade_oscuro)
    ),
    locations = cells_body(columns = Variable)
  ) %>%

  tab_style(
    style = cell_text(font = "monospace", color = jade_medio, weight = "bold"),
    locations = cells_body(columns = `Código DANE`)
  ) %>%

  tab_style(
    style = cell_text(color = jade_texto, font = "EB Garamond"),
    locations = cells_body(columns = c(Descripción, Naturaleza))
  ) %>%

  tab_style(
    style = cell_borders(sides = "all", color = jade_grid, weight = px(1.2)),
    locations = cells_body(columns = everything())
  ) %>%
  tab_style(
    style = cell_borders(sides = "all", color = jade_oscuro, weight = px(1.2)),
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.background.color = jade_fondo,
    table.font.color = jade_texto,
    table.font.names = "EB Garamond",
    table.font.size = 14,
    heading.background.color = jade_oscuro,
    heading.title.font.size = 18,
    heading.title.font.weight = "bold",
    heading.subtitle.font.size = 13,
    heading.align = "left",
    data_row.padding = px(10),
    column_labels.padding = px(10),
    table.border.top.color = jade_oscuro,
    table.border.top.width = px(2),
    table.border.bottom.color = jade_oscuro,
    table.border.bottom.width = px(2),
    source_notes.font.size = 10
  ) %>%
  tab_style(
    style = cell_text(font = "Cormorant Garamond", weight = "bold", color = "white"),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = cell_text(font = "EB Garamond", color = "white"),
    locations = cells_title(groups = "subtitle")
  )

tabla_variables_inicial
Operacionalización de variables
Modelo de regresión lineal múltiple — Microestablecimientos 2016 (DANE)
Variable Descripción Código DANE Naturaleza
Y Ventas o ingresos del negocio (últimos 12 meses) P1010 Continua (pesos COP) — se usa log_Ventas en el modelo
X1 Personal ocupado promedio P607 Continua (número de personas)
X2 Costo de mercancía/insumos/materias primas (últimos 12 meses) P3012 Continua (pesos COP) — se usa log_Costos en el modelo
X3 Sector económico (Industria/Comercio/Servicios) SECTOR Categórica
X4 Forma de llevar la contabilidad P640 Categórica (4 niveles)
X5 Solicitud de crédito o préstamo para el negocio (últimos 12 meses) P1765 Categórica (Sí/No)

¿Por qué se usa log_Ventas y log_Costos en vez de los valores originales?

Al revisar los datos, encontramos que la mayoría de los microestablecimientos tiene ventas “normales” (la mitad vende 47 millones de pesos al año o menos), pero un pequeño grupo de negocios vende muchísimo más hasta 5.000 millones. Esta diferencia tan grande entre la mayoría y esos pocos casos extremos se conoce como sesgo, y puede afectar los resultados del modelo de regresión, que funciona mejor cuando los datos no tienen valores tan alejados del resto.

El logaritmo no elimina esos negocios grandes de la base, sino que comprime la escala en la que se miden: por ejemplo, la diferencia entre 47 millones y 5.000 millones (unos 4.950 millones) se reduce a una diferencia de apenas 4,7 unidades en escala logarítmica. Así, esos casos extremos pesan mucho menos en el modelo, sin perder la información de que siguen siendo negocios grandes. Se aplicó el mismo tratamiento a Costos, por presentar el mismo patrón.

2.4 Proceso de limpieza

  1. Selección de variables: A partir de la base original (104 variables, 33.013 observaciones), se seleccionaron las 6 variables de interés mediante sus códigos DANE, y se renombraron a nombres descriptivos.

  2. Verificación de valores faltantes: no se encontraron datos faltantes (NA) en ninguna de las 6 variables seleccionadas.

  3. Verificación de duplicados: no se encontraron identificadores repetidos (33.013 observaciones únicas).

  4. Codificación de variables categóricas: Sector, Contabilidad y Credito se convirtieron de códigos numéricos a factores, con las etiquetas según el diccionario de datos del DANE. En el archivo original, el código 2 de SECTOR no trae etiqueta; se identificó como Comercio porque representa el 60,8 % de los establecimientos, coincidiendo con la participación reportada por el DANE (2016).

  5. Identificación de valores atípicos: mediante el percentil 99 se identificaron 328 observaciones de Ventas y 331 de Costos con valores extremos. Se documentaron pero no se eliminaron, por corresponder a microestablecimientos reales de mayor escala, y no a errores de captura.

  6. Transformación de variables: se aplicó logaritmo a Ventas y Costos (log(x + 1) en el caso de Costos, por contener una observación con valor cero) para reducir su sesgo.

  7. Exportación: la base final se guardó como archivo CSV para su uso en las siguientes etapas del análisis.

datos_crudos <- read_sav("DATOS/Microestablecimientos_2016.sav")

cat("Filas totales:", nrow(datos_crudos), "\n")
cat("Columnas totales:", ncol(datos_crudos), "\n")

# --- 2. Seleccionar y renombrar las 6 variables del modelo -------------

datos <- datos_crudos %>%
  select(
    id           = DENTIFICADOR_NEW,
    Ventas       = P1010,
    Personal     = P607,
    Costos       = P3012,
    Sector       = SECTOR,
    Contabilidad = P640,
    Credito      = P1765
  )

# --- 3. Etiquetar variables categóricas ---------------------------------

datos <- datos %>%
  mutate(
    Sector = factor(Sector, levels = c(1, 2, 3),
                    labels = c("Industria", "Comercio", "Servicios")),
    Contabilidad = factor(Contabilidad, levels = c(0, 1, 2, 3),
                          labels = c("Libro diario", "P&G o Balance",
                                     "Otro tipo de cuentas", "No lleva contabilidad")),
    Credito = factor(Credito, levels = c(1, 2),
                     labels = c("Sí", "No"))
  )

# --- Definir categorías de referencia ----------------------------------

datos <- datos %>%
  mutate(
    Sector = relevel(Sector, ref = "Comercio"),
    Contabilidad = relevel(Contabilidad, ref = "No lleva contabilidad"),
    Credito = relevel(Credito, ref = "No")
  )

# Comprobar categorías de referencia
levels(datos$Sector)
levels(datos$Contabilidad)
levels(datos$Credito)

# --- 4. Revisión de datos ----------------------------------------------

cat("\n--- Valores faltantes por columna ---\n")
print(colSums(is.na(datos)))

cat("\n--- IDs duplicados ---\n")
print(sum(duplicated(datos$id)))

cat("\n--- Resumen numérico (Ventas, Personal, Costos) ---\n")
print(summary(datos[, c("Ventas", "Personal", "Costos")]))

cat("\n--- Distribución de Sector ---\n")
print(table(datos$Sector))

cat("\n--- Distribución de Contabilidad ---\n")
print(table(datos$Contabilidad))

cat("\n--- Distribución de Credito ---\n")
print(table(datos$Credito))

# --- 5. Identificación de valores atípicos -----------------------------

p99_Ventas <- quantile(datos$Ventas, 0.99)
p99_Costos <- quantile(datos$Costos, 0.99)

cat("\nPercentil 99 de Ventas:", p99_Ventas, "\n")
cat("N° de observaciones de Ventas por encima del percentil 99:",
    sum(datos$Ventas > p99_Ventas), "\n")

cat("\nPercentil 99 de Costos:", p99_Costos, "\n")
cat("N° de observaciones de Costos por encima del percentil 99:",
    sum(datos$Costos > p99_Costos), "\n")

# --- 6.  logaritmos -------------------------------------

datos <- datos %>%
  mutate(
    log_Ventas = log(Ventas),
    log_Costos = log(Costos + 1)
  )

names(datos)
summary(datos$log_Ventas)
summary(datos$log_Costos)

# --- 7. Guardar base  --------------------------------------------

write.csv(
  datos,
  "DATOS/microestablecimientos_2016_limpio.csv",
  row.names = FALSE
)

cat("\nBase limpia guardada como 'DATOS/microestablecimientos_2016_limpio.csv'\n")
cat("Filas finales:", nrow(datos), "| Columnas finales:", ncol(datos), "\n")
## **Base original:** 33013 observaciones | 104 variables
## 
## **Base final:** 33013 observaciones | 9 variables

3. Metodología

3.1 Método empleado

Se buscó una base de datos pública que permitiera aplicar una regresión lineal múltiple. Se eligió la Encuesta de Microestablecimientos (MICRO) del DANE, en su versión de 2016. De la base original se escogieron la variable que se quiere explicar (las ventas) y cinco variables que pueden explicarla, se limpiaron los datos y se aplicó logaritmo a las dos variables de dinero (sección 2.4).

El modelo se estima con el método de mínimos cuadrados ordinarios, que es la forma estándar de calcular una regresión lineal. Antes se hace un análisis descriptivo, con tablas y gráficos, para conocer la muestra y ver cómo se relacionan las ventas con cada variable. Después de estimar el modelo se revisa qué tan bien explica las ventas (R² y R² ajustado) y si el modelo funciona en conjunto.

También se verifica que el modelo cumpla sus supuestos básicos:

  • Linealidad: que la relación entre las variables sea compatible con una línea recta.
  • Normalidad de los residuos: que los errores del modelo se distribuyan de forma parecida a una campana.
  • Homocedasticidad: que los errores tengan una dispersión similar en todos los niveles de ventas.
  • Multicolinealidad: que las variables explicativas no se repitan entre sí (se mide con el VIF).
  • Dependencia entre observaciones: que unos negocios no se parezcan tanto entre sí como para limitar la interpretación.

Como análisis complementario, se reestima el modelo excluyendo log_Costos (sección 5.3) para evaluar cuánto de la asociación de las demás variables con las ventas depende de la escala de operación del negocio.

3.2 Descripción y justificación de las variables

En este modelo, la variable dependiente es el logaritmo de las ventas o ingresos del microestablecimiento en los últimos 12 meses (log_Ventas), medido a partir de los valores originales en pesos colombianos. Se aplicó la transformación logarítmica porque la variable original presentaba un fuerte sesgo a la derecha, con un pequeño grupo de negocios de ventas extremadamente altas frente a la mayoría. Se eligió esta variable sobre la de “mes anterior” por ser menos sensible a la estacionalidad y más representativa del desempeño anual del negocio.

Por otro lado, se incluyeron cinco variables predictoras que buscan capturar diferentes características del funcionamiento del negocio:

  • Personal ocupado: número promedio de personas que trabajaron en el negocio en los últimos 12 meses. Según la función de producción concepto central de la teoría de la firma, la producción de una empresa depende directamente de la cantidad de trabajo y capital que utiliza; si un microestablecimiento cuenta con un mayor número de trabajadores, podría presentar un mayor nivel de producción y ventas.

  • Costos operativos (log_Costos): logaritmo del costo de mercancía, insumos o materias primas del negocio en los últimos 12 meses. Refleja la escala de actividad del negocio; a mayor volumen de operación, mayor necesidad de insumos, por lo que se espera una relación positiva con las ventas.

  • Sector económico (categórica): clasifica cada microestablecimiento en Industria, Comercio o Servicios. El boletín técnico del DANE (2016) muestra que la participación de cada sector en las ventas no es proporcional a su participación en el número de establecimientos (el comercio concentra 60,8% de los establecimientos pero 69,3% de las ventas), evidenciando diferencias estructurales entre sectores. Se incluye en el modelo como variable dummy, tomando Comercio como categoría de referencia.

  • Forma de llevar la contabilidad (categórica): indica cómo lleva sus cuentas el negocio (libro diario, P&G o balance general, otro tipo de cuentas, o ninguna). Se usa como aproximación de formalización y calidad de gestión, dado que, según el INCP, citando al DANE, parte de la informalidad empresarial en Colombia se asocia con no llevar una contabilidad completa. Se incluye como variable dummy, tomando “No lleva contabilidad” como categoría de referencia.

  • Solicitud de crédito (categórica): indica si el negocio solicitó crédito o préstamo en los últimos 12 meses (Sí/No). Según Confecámaras, la falta de financiamiento es el segundo reto más señalado por los microempresarios (27,2%), lo que confirma su relevancia como factor asociado al desempeño del negocio.

No se descartó ninguna de las cinco variables candidatas: todas se eligieron por su justificación teórica y no por su significancia estadística, y todas resultaron significativas al 5 % en el modelo.

Limitaciones de interpretación:

  1. Los costos están, por construcción, correlacionados con las ventas (a mayor actividad, mayores costos de mercancía o insumos), lo que puede introducir un problema de causalidad inversa. Se incluyen por su relevancia como indicador de escala operativa y por esta razón se compara el modelo con y sin costos (sección 5.3).

  2. Según el DANE, el 70,8 % de los negocios que no solicitaron crédito declara que no lo necesita, por lo que esta variable refleja más la demanda de crédito que el acceso efectivo a él.

3.3 Descripción del modelo

Las variables categóricas entran a la regresión como variables dummy: cada categoría se convierte en una variable que vale 1 si el negocio pertenece a ella y 0 si no. El coeficiente de cada una indica cuánto se diferencia ese grupo de un grupo de comparación, llamado categoría de referencia. Aquí las categorías de referencia son:

  • Sector: Comercio (es la que tiene más negocios).
  • Contabilidad: No lleva contabilidad.
  • Crédito: No solicitó crédito.

3.3.1 Ecuación del modelo

\[ \log\_Ventas_i = \beta_0 + \beta_1 \cdot Personal_i + \beta_2 \cdot \log\_Costos_i + \gamma_1 \cdot D\_Industria_i + \gamma_2 \cdot D\_Servicios_i + \delta_1 \cdot D\_LibroDiario_i + \delta_2 \cdot D\_PyG_i + \delta_3 \cdot D\_OtroTipo_i + \beta_3 \cdot D\_CreditoSi_i + \varepsilon_i \]

Donde:

  • \(i\) = Cada microestablecimiento de la muestra (\(i = 1, 2, \dots, 33.013\)).
  • log_Ventas = Logaritmo de las ventas o ingresos de los últimos 12 meses (variable dependiente).
  • \(\beta_0\) = Intercepto: valor esperado de log_Ventas cuando Personal y log_Costos son cero y el negocio está en las categorías de referencia (Comercio, No lleva contabilidad, No solicitó crédito).
  • \(\beta_1\), \(\beta_2\) = Coeficientes de regresión de Personal y log_Costos: efecto asociado a cada variable sobre log_Ventas, manteniendo las demás constantes.
  • \(D\_Industria_i\), \(D\_Servicios_i\) = Variables dummy del sector económico. Valen 1 si el negocio pertenece a esa categoría y 0 si no. Comercio es la categoría de referencia.
  • \(\gamma_1\), \(\gamma_2\) = Coeficientes de \(D\_Industria_i\) y \(D\_Servicios_i\): indican cuánto se diferencia cada sector de Comercio, manteniendo las demás variables constantes.
  • \(D\_LibroDiario_i\), \(D\_PyG_i\), \(D\_OtroTipo_i\) = Variables dummy de la forma de llevar contabilidad. Valen 1 si el negocio pertenece a esa categoría y 0 si no. “No lleva contabilidad” es la categoría de referencia.
  • \(\delta_1\), \(\delta_2\), \(\delta_3\) = Coeficientes de cada dummy de Contabilidad: indican cuánto se diferencia cada forma de contabilidad de “No lleva contabilidad”, manteniendo las demás variables constantes.
  • \(D\_CreditoSi_i\) = Variable dummy que vale 1 si el negocio solicitó crédito (“Sí”) y 0 si no (“No”, categoría de referencia).
  • \(\beta_3\) = Coeficiente de \(D\_CreditoSi_i\): diferencia en log_Ventas entre negocios con y sin crédito.
  • Personal, log_Costos, Sector, Contabilidad y Credito = Variables predictoras descritas en la sección 3.2.
  • \(\varepsilon_i\) = Término de error aleatorio, que recoge la variación de log_Ventas no explicada por las variables del modelo.

3.3.2 Interpretación de los coeficientes

Como la variable dependiente está en logaritmo, los coeficientes se interpretan en términos porcentuales:

Tipo de variable Interpretación
Personal (numérica) Cada persona adicional se asocia con un cambio de \((e^{\beta_1} - 1) \cdot 100\) % en las ventas (aprox. \(100 \cdot \beta_1\) % si \(\beta_1\) es pequeño)
log_Costos (en logaritmo) Elasticidad: un aumento de 1 % en los costos se asocia con un cambio de \(\beta_2\) % en las ventas
Categóricas (dummies) Diferencia porcentual frente a la categoría de referencia: \((e^{\beta} - 1) \cdot 100\) %

4. Resultados descriptivos

4.1 Caracterización general

tabla1 <- data.frame(
  Característica = c(
    "Número de microestablecimientos",
    "Año de referencia"
  ),
  Valor = c(
    nrow(datos),
    2016
  )
)

knitr::kable(tabla1)
Característica Valor
Número de microestablecimientos 33013
Año de referencia 2016

4.2 Variables numéricas

tabla2 <- data.frame(
  Variable = c("Ventas", "log_Ventas", "Costos", "log_Costos", "Personal"),

  Mínimo = c(
    min(datos$Ventas, na.rm = TRUE),
    min(datos$log_Ventas, na.rm = TRUE),
    min(datos$Costos, na.rm = TRUE),
    min(datos$log_Costos, na.rm = TRUE),
    min(datos$Personal, na.rm = TRUE)
  ),

  Media = c(
    mean(datos$Ventas, na.rm = TRUE),
    mean(datos$log_Ventas, na.rm = TRUE),
    mean(datos$Costos, na.rm = TRUE),
    mean(datos$log_Costos, na.rm = TRUE),
    mean(datos$Personal, na.rm = TRUE)
  ),

  Mediana = c(
    median(datos$Ventas, na.rm = TRUE),
    median(datos$log_Ventas, na.rm = TRUE),
    median(datos$Costos, na.rm = TRUE),
    median(datos$log_Costos, na.rm = TRUE),
    median(datos$Personal, na.rm = TRUE)
  ),

  DesvEst = c(
    sd(datos$Ventas, na.rm = TRUE),
    sd(datos$log_Ventas, na.rm = TRUE),
    sd(datos$Costos, na.rm = TRUE),
    sd(datos$log_Costos, na.rm = TRUE),
    sd(datos$Personal, na.rm = TRUE)
  ),

  Máximo = c(
    max(datos$Ventas, na.rm = TRUE),
    max(datos$log_Ventas, na.rm = TRUE),
    max(datos$Costos, na.rm = TRUE),
    max(datos$log_Costos, na.rm = TRUE),
    max(datos$Personal, na.rm = TRUE)
  )
)

knitr::kable(tabla2, digits = 2,
             format.args = list(big.mark = ".", decimal.mark = ","))
Variable Mínimo Media Mediana DesvEst Máximo
Ventas 20.000,0 97.078.678,77 47.000.000,00 193.160.239,54 5.000.000.000,00
log_Ventas 9,9 17,59 17,67 1,28 22,33
Costos 0,0 52.262.860,35 18.000.000,00 131.547.375,58 4.000.000.000,00
log_Costos 0,0 16,56 16,71 1,71 22,11
Personal 1,0 2,20 2,00 1,53 9,00

Los resultados confirman lo que se había identificado durante la limpieza de datos. En Ventas, la media (97.078.679) es mucho más alta que la mediana (47.000.000): esto significa que la mitad de los microestablecimientos vende 47 millones de pesos al año o menos, pero un grupo pequeño de negocios con ventas muy altas (hasta 5.000 millones) empuja el promedio hacia arriba. Esta diferencia tan grande entre media y mediana es la evidencia numérica del sesgo que motivó la transformación logarítmica.

En log_Ventas, la media (17,59) y la mediana (17,67) quedan mucho más cerca entre sí, lo que confirma que el logaritmo sí corrigió ese sesgo. Lo mismo ocurre con Costos (media muy superior a la mediana) frente a log_Costos (media y mediana casi iguales).

Personal no necesitó transformación: va de 1 a 9 personas (el máximo permitido para ser microestablecimiento), con un promedio de 2,2 personas por negocio, lo que confirma que la gran mayoría son negocios muy pequeños, típicamente familiares o con muy pocos empleados.

ggplot(datos, aes(x = log_Ventas)) +
  geom_histogram(aes(y = after_stat(density)), bins = 40, fill = verde_aqua, alpha = 0.6, color = jade_fondo) +
  geom_density(color = jade_oscuro, linewidth = 1.1) +
  labs(title = "Distribución de log(Ventas)", x = "log(Ventas)", y = "Densidad") +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(face = "bold", hjust = 0.5, color = jade_oscuro),
    panel.grid.minor = element_blank()
  )

Distribución de log(Ventas)

Al observar la distribución de log(Ventas), se identifica una forma aproximadamente simétrica y unimodal, con el punto de mayor concentración ubicado alrededor de 17,5, donde la densidad alcanza su valor más alto (cercano a 0,37). Este comportamiento indica que la mayoría de los microestablecimientos de la muestra presentan niveles de ventas relativamente similares entre sí, concentrados en un rango estrecho alrededor de dicho valor central.

Las colas de la distribución se muestran moderadas y relativamente equilibradas entre sí: hacia la izquierda, la densidad disminuye de forma gradual hasta aproximarse a cero alrededor de log(Ventas) = 12, mientras que hacia la derecha se extiende de forma comparable hasta valores cercanos a 22, sin que ninguna de las dos colas se prolongue de forma desproporcionada respecto a la otra. Este resultado es consistente con el efecto esperado de la transformación logarítmica: al comprimir la escala original de la variable, se atenúa la asimetría que presentaban los datos de ventas antes de dicha transformación, producto de un reducido grupo de negocios con niveles de ingresos considerablemente superiores al resto de la muestra.

Esta configuración de la distribución constituye un indicio favorable respecto al comportamiento posterior del modelo de regresión: si los residuos del modelo exhiben una forma similar a la observada aquí, se estaría satisfaciendo razonablemente el supuesto de normalidad, lo cual fortalece la validez de las inferencias que puedan derivarse de los resultados obtenidos.

ggplot(datos, aes(x = factor(Personal))) +
  geom_bar(fill = verde_aqua, alpha = 0.8, color = jade_fondo) +
  labs(title = "Distribución de Personal ocupado",
       x = "Personal ocupado", y = "Número de negocios") +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(face = "bold", hjust = 0.5, color = jade_oscuro),
    panel.grid.minor = element_blank()
  )

La distribución de Personal muestra que la gran mayoría de los microestablecimientos operan con muy pocos empleados: el valor más frecuente es 1 o 2 personas, y la cantidad de negocios disminuye de forma constante a medida que aumenta el personal ocupado, hasta el límite de 9 que define a un microestablecimiento. Esto confirma que se trata, en su mayoría, de negocios de muy pequeña escala, probablemente de carácter familiar.

ggplot(datos, aes(x = log_Costos)) +
  geom_histogram(aes(y = after_stat(density)), bins = 40, fill = verde_aqua, alpha = 0.6, color = jade_fondo) +
  geom_density(color = jade_oscuro, linewidth = 1.1) +
  labs(title = "Distribución de log(Costos)", x = "log(Costos)", y = "Densidad") +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(face = "bold", hjust = 0.5, color = jade_oscuro),
    panel.grid.minor = element_blank()
  )

La distribución de log(Costos) muestra una forma similar a la de log(Ventas): aproximadamente simétrica, sin el sesgo extremo que tenía la variable original en pesos. Esto confirma que la transformación logarítmica también fue efectiva para corregir el sesgo en esta variable.

4.3 Variables categóricas

datos %>%
  count(Sector) %>%
  arrange(desc(n)) %>%
  mutate(`Porcentaje (%)` = round(100 * n / sum(n), 1),
         `Porcentaje Acumulado (%)` = round(cumsum(`Porcentaje (%)`), 1)) %>%
  rename(Frecuencia = n) %>%
  gt() %>%
  tab_header(title = "Distribución según sector económico") %>%
  fmt_number(columns = Frecuencia, decimals = 0, sep_mark = ".") %>%
  cols_align(align = "left", columns = Sector) %>%
  cols_align(align = "center", columns = c(Frecuencia, `Porcentaje (%)`, `Porcentaje Acumulado (%)`)) %>%
  tema_jade_tabla()
Distribución según sector económico
Sector Frecuencia Porcentaje (%) Porcentaje Acumulado (%)
Comercio 20.086 60.8 60.8
Servicios 9.667 29.3 90.1
Industria 3.260 9.9 100.0

El comercio concentra el 60,8 % de los microestablecimientos de la muestra, seguido de servicios (29,3 %) e industria (9,9 %). Es decir, 6 de cada 10 negocios son de comercio, y la industria es el sector con menor presencia. Por ser la categoría más numerosa, se tomó Comercio como referencia en el modelo.

tabla_frecuencias <- datos %>%
  count(Contabilidad) %>%
  arrange(desc(n)) %>%
  mutate(
    `Porcentaje (%)` = round(100 * n / sum(n), 1),
    `Porcentaje Acumulado (%)` = round(cumsum(`Porcentaje (%)`), 1)
  ) %>%
  rename(Frecuencia = n)

tabla_Contabilidad <- tabla_frecuencias %>%
  gt() %>%
  tab_header(title = "Distribución según forma de llevar la contabilidad") %>%
  cols_label(
    Contabilidad = "Forma de contabilidad"
  ) %>%
  fmt_number(columns = Frecuencia, decimals = 0, sep_mark = ".") %>%
  cols_align(align = "left", columns = Contabilidad) %>%
  cols_align(align = "center", columns = c(Frecuencia, `Porcentaje (%)`, `Porcentaje Acumulado (%)`)) %>%
  tema_jade_tabla()

tabla_Contabilidad
Distribución según forma de llevar la contabilidad
Forma de contabilidad Frecuencia Porcentaje (%) Porcentaje Acumulado (%)
Otro tipo de cuentas 10.239 31.0 31.0
No lleva contabilidad 10.174 30.8 61.8
Libro diario 7.419 22.5 84.3
P&G o Balance 5.181 15.7 100.0

La distribución muestra que la categoría más frecuente es “Otro tipo de cuentas”, con 10.239 microestablecimientos (31,0% del total), seguida muy de cerca por “No lleva contabilidad”, con 10.174 negocios (30,8%). Juntas, estas dos categorías concentran el 61,8% de la muestra, lo que indica que más de 6 de cada 10 microestablecimientos no manejan un sistema de contabilidad formal como el libro diario o un esquema de P&G/Balance.

Por su parte, “Libro diario” agrupa a 7.419 microestablecimientos (22,5%), mientras que “P&G o Balance” la forma más estructurada de llevar cuentas dentro de las categorías disponibles es la menos frecuente, con 5.181 negocios (15,7% del total). Este panorama resulta consistente con el nivel de informalidad que suele caracterizar al segmento de microestablecimientos en Colombia: la mayoría de estos negocios se concentra en formas de registro contable poco estructuradas o inexistentes, y solo un grupo reducido poco más del 15% lleva una contabilidad asimilable a un esquema financiero formal. Esta distribución resulta especialmente relevante al interpretar los coeficientes del modelo de regresión asociados a esta variable, dado que la categoría de referencia empleada (“No lleva contabilidad”) representa, en efecto, a casi un tercio de la muestra total.

datos %>%
  count(Credito) %>%
  arrange(desc(n)) %>%
  mutate(`Porcentaje (%)` = round(100 * n / sum(n), 1),
         `Porcentaje Acumulado (%)` = round(cumsum(`Porcentaje (%)`), 1)) %>%
  rename(Frecuencia = n) %>%
  gt() %>%
  tab_header(title = "Distribución según solicitud de crédito") %>%
  fmt_number(columns = Frecuencia, decimals = 0, sep_mark = ".") %>%
  cols_align(align = "left", columns = Credito) %>%
  cols_align(align = "center", columns = c(Frecuencia, `Porcentaje (%)`, `Porcentaje Acumulado (%)`)) %>%
  tema_jade_tabla()
Distribución según solicitud de crédito
Credito Frecuencia Porcentaje (%) Porcentaje Acumulado (%)
No 26.175 79.3 79.3
Sí 6.838 20.7 100.0

El 79,3 % de los microestablecimientos no solicitó crédito en los últimos 12 meses, frente a un 20,7 % que sí lo hizo. Ambos grupos cuentan con miles de negocios, lo que permite compararlos en el modelo, y se tomó “No” como categoría de referencia. Como se señaló en la sección 3.2, el 70,8 % de los negocios que no solicitaron crédito declara que no lo necesita.

4.4 Relación entre Y y las X

Correlación

variables_todas <- datos %>%
  select(log_Ventas, Personal, log_Costos, Sector, Contabilidad, Credito)

variables_dummy <- model.matrix(~ . - 1, data = variables_todas) %>%
  as.data.frame()

matriz_cor_todas <- cor(variables_dummy, use = "complete.obs")


paleta_jade_degradado <- colorRampPalette(c(aqua_claro, jade_oscuro))(200)

par(bg = jade_fondo, family = "ebgaramond")

corrplot(matriz_cor_todas,
         method = "color",
         type = "upper",
         col = paleta_jade_degradado,
         addCoef.col = jade_oscuro,
         number.cex = 0.55,
         tl.col = jade_oscuro,
         tl.srt = 45,
         tl.cex = 0.7,
         cl.cex = 0.8,
         diag = FALSE,
         mar = c(0, 0, 2, 0),
         title = "Matriz de correlación: todas las variables del modelo")

Entre las variables continuas, log_Costos presenta la correlación más fuerte de toda la matriz con log_Ventas (0,79), seguida de Personal (0,52). Este resultado es consistente con lo observado en el modelo de regresión, donde log_Costos resultó ser el predictor con el coeficiente de mayor magnitud, y confirma que la escala de operación del negocio —aproximada a través de sus costos de mercancía e insumos— está estrechamente ligada a su nivel de ventas. La correlación entre Personal y log_Costos, por su parte, es moderada (0,38), lo que indica que, si bien ambas variables están relacionadas, no se solapan al punto de representar la misma información.

En cuanto a las variables categóricas, se destaca la relación entre log_Ventas y la forma de llevar la contabilidad: los microestablecimientos que no llevan contabilidad presentan una correlación negativa de -0,41 con log_Ventas, mientras que quienes llevan contabilidad bajo el esquema de P&G o Balance muestran una correlación positiva de 0,36.

Este contraste es coherente con el patrón que se confirma en el modelo (sección 5): la formalización contable aparece asociada con mayores niveles de ventas. Se trata de una relación bivariada, que en la sección 5.3 se revisa al controlar por los costos. Las correlaciones de Sector con log_Ventas resultan comparativamente bajas (entre -0,07 y 0,07), lo que sugiere que, de forma bivariada y sin ajustar por las demás variables, el sector económico por sí solo no está fuertemente asociado al nivel de ventas.

Finalmente, la variable Credito presenta correlaciones prácticamente nulas con el resto de las variables del modelo, incluyendo log_Ventas (0,00), lo que es coherente con el reducido valor del coeficiente encontrado en la regresión. En conjunto, la matriz no muestra relaciones fuertes entre las variables predictoras entre sí (más allá de las mecánicas ya señaladas), lo cual respalda los bajos valores de GVIF obtenidos en el diagnóstico de multicolinealidad.

Relación entre Ventas(Y) y Personal (X1)

ggplot(datos, aes(x = Personal, y = log(Ventas))) +
  geom_point(color = verde_aqua, alpha = 0.5, size = 1.8) +
  geom_smooth(method = "lm", se = FALSE, color = jade_oscuro, linewidth = 1) +
  scale_x_continuous(breaks = 1:9) +
  labs(
    title = "RELACIÓN PERSONAL OCUPADO - VENTAS",
    subtitle = "Transformación logarítmica aplicada a las ventas | Curva de tendencia lineal",
    x = "Personal ocupado",
    y = "log(ventas)"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(family = "cormorant", face = "bold", hjust = 0.5,
                              color = jade_oscuro, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = jade_medio),
    plot.caption = element_text(size = 8, color = "#7A8F88"),
    axis.title = element_text(color = jade_texto),
    axis.text = element_text(color = jade_texto),
    panel.grid.major = element_line(color = "#D8E8E2"),
    panel.grid.minor = element_blank()
  )

El gráfico de dispersión evidencia una relación positiva entre el personal ocupado y el nivel de ventas de los microestablecimientos, confirmada por la pendiente ascendente de la línea de tendencia a lo largo de todo el rango de valores, desde 1 hasta 9 empleados.

La línea de tendencia pasa de un nivel de log(ventas) cercano a 17 cuando Personal es igual a 1, hasta aproximadamente 21 cuando Personal alcanza su valor máximo de 9, lo que indica un incremento sostenido en el nivel esperado de ventas a medida que aumenta el número de personas ocupadas. Se observa, sin embargo, una dispersión considerable de los datos en cada nivel de Personal, particularmente visible en los valores más bajos (1 a 3 empleados), donde coexisten microestablecimientos con niveles de ventas muy altos (log(ventas) superior a 22) y muy bajos (por debajo de 12).

Esta amplitud en la nube de puntos se mantiene de forma relativamente constante a lo largo de todo el rango de Personal, lo que indica que, si bien existe una tendencia clara y positiva, el número de empleados por sí solo no logra explicar la totalidad de la variación en las ventas de los microestablecimientos: negocios con la misma cantidad de personal pueden presentar niveles de ventas muy distintos entre sí, dependiendo de otros factores como el sector, los costos operativos o la forma en que llevan su contabilidad.

Los resultados obtenidos son consistentes con el coeficiente positivo y significativo asociado a la variable Personal en el modelo de regresión múltiple, y respalda la interpretación planteada desde la teoría de la firma: a mayor cantidad de trabajadores ocupados, mayor es la capacidad productiva y, en consecuencia, el nivel de ventas del negocio, aunque este efecto opera junto con otros factores estructurales y operativos del microestablecimiento.

Relación entre Ventas(Y) y Costos (X2)

ggplot(datos, aes(x = log_Costos, y = log_Ventas)) +
  geom_point(color = verde_aqua, alpha = 0.4, size = 1.3) +
  geom_smooth(method = "lm", se = FALSE, color = jade_oscuro, linewidth = 1) +
  labs(
    title = "Relación entre Costos y Ventas",
    subtitle = "log(Costos) vs. log(Ventas) | Curva de tendencia lineal",
    x = "log(Costos)",
    y = "log(Ventas)",
    caption = "Fuente: Elaboración propia con base en Microestablecimientos DANE 2016"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(family = "cormorant", face = "bold", hjust = 0.5,
                              color = jade_oscuro, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = jade_medio),
    plot.caption = element_text(size = 8, color = "#7A8F88"),
    axis.title = element_text(color = jade_texto),
    axis.text = element_text(color = jade_texto),
    panel.grid.major = element_line(color = "#D8E8E2"),
    panel.grid.minor = element_blank()
  )

El gráfico confirma la correlación más fuerte de todo el modelo (0,79, sección “Correlación”): a medida que aumenta el logaritmo de los costos, el logaritmo de las ventas crece de forma consistente y con una dispersión más estrecha alrededor de la línea de tendencia que la observada en la relación con Personal. Esto es coherente con que log_Costos sea la variable con el coeficiente de mayor magnitud en el modelo (sección 5.1): los costos de mercancía e insumos son el reflejo más directo de la escala de operación de un negocio, y por eso están tan ligados a su nivel de ventas.

Se observa además una concentración inusual de observaciones en ciertos valores específicos de Costos —principalmente múltiplos de 6.000.000 y 1.200.000 (por ejemplo, 12.000.000 con 1.376 casos, 6.000.000 con 1.030, y 24.000.000 con 917)—, visibles en el gráfico como la franja vertical densa alrededor de log(Costos) ≈ 8-9. Este patrón, conocido como “apilamiento” (heaping), es común en encuestas de autorreporte: sugiere que varios microempresarios no llevan un registro exacto de sus costos y reportan estimaciones redondeadas en términos mensuales (por ejemplo, “1.000.000 al mes”), que al anualizarse generan estos valores recurrentes. Este patrón no invalida la relación general observada entre costos y ventas, pero es un rasgo de la calidad de los datos que vale la pena documentar como limitación del autorreporte en la encuesta.

Relación entre Ventas(Y) y Sector (X3)

grafico_sector <- ggplot(datos, aes(x = Sector, y = log_Ventas, fill = Sector)) +
  geom_boxplot(alpha = 0.75, outlier.alpha = 0.3, width = 0.5) +
  scale_fill_manual(values = c("Industria" = jade_oscuro,
                               "Comercio"  = verde_aqua,
                               "Servicios" = aqua_claro)) +
  labs(
    title = "Ventas según sector económico",
    subtitle = "Distribución de log(Ventas) por sector",
    x = "Sector económico",
    y = "log(Ventas)",
    caption = "Fuente: Encuesta de Microestablecimientos, DANE (2016)"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(face = "bold", hjust = 0.5, color = jade_oscuro),
    plot.subtitle = element_text(hjust = 0.5, color = jade_medio),
    plot.caption = element_text(size = 8, color = "#7A8F88"),
    legend.position = "none",
    panel.grid.minor = element_blank()
  )


grafico_sector

datos %>%
  group_by(Sector) %>%
  summarise(Frecuencia = n(),
            Mediana = round(median(log_Ventas), 2),
            Q1 = round(quantile(log_Ventas, 0.25), 2),
            Q3 = round(quantile(log_Ventas, 0.75), 2)) %>%
  gt() %>%
  tab_header(title = "log(Ventas) según sector") %>%
  tema_jade_tabla()
log(Ventas) según sector
Sector Frecuencia Mediana Q1 Q3
Comercio 20086 17.69 16.81 18.52
Industria 3260 17.62 16.81 18.37
Servicios 9667 17.50 16.71 18.25

El boxplot y la tabla muestran la distribución de log(Ventas) en cada sector. La mediana es 17,62 en Industria, 17,69 en Comercio y 17,50 en Servicios. El sector con la mediana más alta es Comercio y el más bajo es Servicios, con una diferencia de 0,18 unidades en escala logarítmica (≈ 20,0 % en pesos). Esta diferencia es pequeña frente a la variación dentro de cada sector, cuyo rango intercuartílico típico es de 1,56. Esto es coherente con las correlaciones bajas entre Sector y log(Ventas) de la matriz de correlación (entre -0,07 y 0,07).

En los tres sectores hay negocios con ventas muy altas y muy bajas (los puntos fuera de las cajas), lo que refleja la heterogeneidad de la muestra. Estas comparaciones son bivariadas: el efecto del sector, una vez controladas las demás variables, se estima en la sección 5.1.

Personal y Ventas según Sector

ggplot(datos, aes(x = Personal, y = log_Ventas, color = Sector)) +
  geom_point(alpha = 0.35, size = 1.3) +
  geom_smooth(method = "lm", se = FALSE, linewidth = 1) +
  scale_color_manual(values = c("Industria" = jade_oscuro, "Comercio" = verde_aqua, "Servicios" = "#B0413E")) +
  scale_x_continuous(breaks = 1:9) +
  labs(
    title = "Relación Personal-Ventas según Sector económico",
    x = "Personal ocupado", y = "log(Ventas)", color = "Sector",
    caption = "Fuente: Elaboración propia con base en Microestablecimientos DANE 2016"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(face = "bold", hjust = 0.5, color = jade_oscuro),
    plot.caption = element_text(size = 8, color = "#7A8F88"),
    panel.grid.minor = element_blank()
  )

El gráfico muestra una relación positiva entre el personal ocupado y el nivel de ventas en los tres sectores económicos, evidenciada por la pendiente ascendente de las tres líneas de tendencia a medida que aumenta el número de personas ocupadas, de 1 hasta 9.

Se observa que la línea correspondiente a Comercio se ubica consistentemente por encima de las de Industria y Servicios en todo el rango de Personal, lo que indica que, sin considerar otras variables, los microestablecimientos de este sector presentan en promedio niveles de ventas más altos para un mismo número de empleados. Por su parte, las líneas de Industria y Servicios se mantienen muy próximas entre sí a lo largo de todo el gráfico, con pendientes similares, lo que sugiere un comportamiento comparable entre ambos sectores en esta relación bivariada.

También se evidencia una dispersión considerable de los puntos en cada nivel de Personal, particularmente en los valores más bajos (1 a 3 empleados), donde coexisten microestablecimientos con niveles de ventas muy altos y muy bajos. Esta dispersión tiende a mantenerse a lo largo de todo el rango de Personal, lo que indica que, si bien existe una tendencia positiva clara, el número de empleados por sí solo no explica la totalidad de la variación en las ventas dentro de cada sector.

Relación entre Ventas(Y) y Contabilidad (X4)

datos_cont <- datos %>%
  mutate(Contabilidad = factor(Contabilidad,
                               levels = c("No lleva contabilidad", "Otro tipo de cuentas",
                                          "Libro diario", "P&G o Balance")))

grafico_contabilidad <- ggplot(datos_cont, aes(x = Contabilidad, y = log_Ventas, fill = Contabilidad)) +
  geom_boxplot(alpha = 0.75, outlier.alpha = 0.3) +
  scale_fill_manual(values = c("No lleva contabilidad" = aqua_claro,
                               "Otro tipo de cuentas"  = verde_aqua,
                               "Libro diario"          = jade_medio,
                               "P&G o Balance"         = jade_oscuro)) +
  labs(
    title = "Ventas según forma de llevar la contabilidad",
    subtitle = "Distribución de log(Ventas) por tipo de contabilidad",
    x = "Forma de llevar la contabilidad",
    y = "log(Ventas)"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(face = "bold", hjust = 0.5, color = jade_oscuro),
    plot.subtitle = element_text(hjust = 0.5, color = jade_medio),
    axis.text.x = element_text(angle = 20, hjust = 1),
    legend.position = "none",
    panel.grid.minor = element_blank()
  )

ggplotly(grafico_contabilidad, tooltip = c("y", "x"))

El boxplot evidencia un patrón claramente ordenado entre las cuatro categorías de la variable Contabilidad. Los microestablecimientos que no llevan contabilidad presentan la mediana más baja de log(Ventas), con un valor de 16,81, seguidos por quienes llevan “Otro tipo de cuentas” (mediana de 17,55), luego por “Libro diario” (18,06) y, finalmente, por “P&G o Balance”, que registra la mediana más alta del conjunto, con 18,60. Este orden coincide exactamente con el grado de formalización esperado de cada forma de contabilidad, de la menos a la más estructurada.

El mismo patrón se mantiene de forma consistente en los cuartiles: el primer cuartil (Q1) asciende de 16,08 en “No lleva contabilidad” a 17,91 en “P&G o Balance”, y el tercer cuartil (Q3) pasa de 17,64 a 19,36 entre esas mismas categorías extremas. Esta progresión ordenada en ambos cuartiles indica que la diferencia entre grupos no se concentra en un segmento particular de la distribución, sino que se sostiene de manera uniforme a lo largo de todo el rango central de los datos.

En cuanto a los valores mínimos y máximos, se observa que “No lleva contabilidad” presenta el mínimo más bajo del conjunto (9,90), notablemente inferior al de las demás categorías (11,70 en “Otro tipo de cuentas” y “P&G o Balance”), lo que indica que entre los negocios sin ningún tipo de registro contable se encuentran los casos de menor escala de ventas de toda la muestra.

En el extremo superior, “P&G o Balance” alcanza el valor máximo más alto (22,33), seguido de cerca por “Libro diario” (22,00), lo que sugiere que los negocios con mayor nivel de ventas de la muestra tienden a concentrarse en las categorías de contabilidad más formalizadas.

Este resultado configura un gradiente claro y consistente: a mayor formalización en la forma de llevar la contabilidad, mayor es el nivel de ventas típico del microestablecimiento. Este patrón descriptivo refuerza directamente los coeficientes obtenidos en el modelo de regresión múltiple, donde se identificó la misma progresión ordenada entre las categorías de esta variable, lo que brinda consistencia entre el análisis exploratorio y los resultados del modelo ajustado.

Esta es una relación bivariada; en la sección 5.3 se muestra cuánto de ella se mantiene al controlar por los costos.

Relación entre Ventas(Y) y Credito (X5)

grafico_credito <- ggplot(datos, aes(x = Credito, y = log_Ventas, fill = Credito)) +
  geom_boxplot(alpha = 0.75, outlier.alpha = 0.3, width = 0.5) +
  scale_fill_manual(values = c("Sí" = jade_oscuro, "No" = verde_aqua)) +
  labs(
    title = "Ventas según solicitud de crédito",
    x = "Solicitud de crédito o préstamo",
    y = "log(Ventas)"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(face = "bold", hjust = 0.5, color = jade_oscuro),
    legend.position = "none",
    panel.grid.minor = element_blank()
  )

ggplotly(grafico_credito, tooltip = c("y", "x"))

El boxplot evidencia una diferencia moderada pero consistente entre los dos grupos: los microestablecimientos que “no solicitaron crédito” presentan una mediana de log(Ventas) de 17,69, levemente superior a la mediana de 17,58 registrada en el grupo que “sí solicitó crédito”. Esta misma relación se mantiene en los cuartiles: el grupo “No” muestra un primer cuartil de 16,81 y un tercer cuartil de 18,42, frente a 16,71 y 18,38 respectivamente en el grupo “Sí”, lo que indica que la diferencia entre ambos grupos no se concentra en un segmento particular de la distribución, sino que se mantiene de forma relativamente estable a lo largo de todo el rango central de los datos.

En cuanto a la dispersión, ambos grupos presentan un comportamiento similar: el rango intercuartílico es prácticamente idéntico entre “No” (16,81 a 18,42) y “Sí” (16,71 a 18,38), lo que sugiere que la variabilidad de las ventas no cambia sustancialmente según si el negocio solicitó o no financiación.

Donde sí se observa una diferencia más notoria es en los valores mínimos: el grupo “No” alcanza un mínimo de 9,90, considerablemente más bajo que el mínimo de 11,70 del grupo “Sí”, lo que indica una mayor presencia de microestablecimientos con ventas muy reducidas entre quienes no solicitaron crédito.

tabla_credito_ventas <- datos %>%
  group_by(Credito) %>%
  summarise(
    Frecuencia = n(),
    `Media Ventas` = round(mean(Ventas), 0),
    `Mediana Ventas` = round(median(Ventas), 0),
    `Media log(Ventas)` = round(mean(log_Ventas), 3),
    `Mediana log(Ventas)` = round(median(log_Ventas), 3)
  ) %>%
  arrange(desc(`Mediana Ventas`))

tabla_credito_ventas %>%
  gt() %>%
  tab_header(
    title = "Ventas según solicitud de crédito",
    subtitle = "Comparación de medias y medianas (Ventas en COP y log_Ventas)"
  ) %>%
  cols_label(
    Credito = "Solicitud de crédito"
  ) %>%
  fmt_number(columns = c(Frecuencia, `Media Ventas`, `Mediana Ventas`), decimals = 0, sep_mark = ".") %>%
  fmt_number(columns = c(`Media log(Ventas)`, `Mediana log(Ventas)`), decimals = 3) %>%
  cols_align(align = "left", columns = Credito) %>%
  cols_align(align = "center", columns = c(Frecuencia, `Media Ventas`, `Mediana Ventas`,
                                           `Media log(Ventas)`, `Mediana log(Ventas)`)) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = c(`Mediana Ventas`, `Mediana log(Ventas)`))
  ) %>%
  tab_source_note(
    source_note = "Nota: Elaboración propia con base en Microestablecimientos DANE 2016. La mediana es la métrica más representativa del negocio típico de cada grupo, dado que la media se ve afectada por microestablecimientos con ventas inusualmente altas."
  ) %>%
  tema_jade_tabla()
Ventas según solicitud de crédito
Comparación de medias y medianas (Ventas en COP y log_Ventas)
Solicitud de crédito Frecuencia Media Ventas Mediana Ventas Media log(Ventas) Mediana log(Ventas)
No 26.175 95.447.866 48.000.000 17.592 17.687
Sí 6.838 103.321.225 43.200.000 17.587 17.581
Nota: Elaboración propia con base en Microestablecimientos DANE 2016. La mediana es la métrica más representativa del negocio típico de cada grupo, dado que la media se ve afectada por microestablecimientos con ventas inusualmente altas.

La tabla muestra que, en términos de Media Ventas, los microestablecimientos que “solicitaron crédito presentan un promedio de 103.321.225 pesos, superior al de quienes “no solicitaron (95.447.866 pesos).

Sin embargo, al observar la Mediana Ventas medida menos sensible a valores extremos, el patrón se invierte: el grupo ““Sí” registra una mediana de 43.200.000 pesos, inferior a los 48.000.000 pesos del grupo “No”. Esta divergencia entre media y mediana dentro del grupo que solicitó crédito indica la presencia de un subconjunto de microestablecimientos con niveles de ventas considerablemente altos, que elevan el promedio de ese grupo sin ser representativos de la mayoría de sus integrantes.

Este mismo patrón se confirma en la escala logarítmica. La Media log(Ventas) es levemente superior en el grupo “No” (17,592) frente al grupo “Sí”” (17,587), una diferencia pequeña en magnitud.

No obstante, al observar la Mediana log(Ventas) que refleja de forma más fiel al microestablecimiento típico de cada grupo, al no verse afectada por los valores extremos que sí influyen en la media, la diferencia se vuelve considerablemente más clara: 17,687 en el grupo “No” frente a 17,581 en el grupo “Sí”, una brecha más de veinte veces mayor que la observada en la media. Esto confirma que la similitud entre las medias logarítmicas de ambos grupos es, en gran parte, un efecto de los mismos microestablecimientos de ventas altas que distorsionan el promedio del grupo “Sí”, y no un reflejo de que ambos grupos se comporten de manera parecida.

Tanto la comparación de medianas en pesos como en escala logarítmica llevan a la misma conclusión: el microestablecimiento típico que solicitó crédito en los últimos 12 meses presenta un nivel de ventas inferior al del microestablecimiento típico que no lo hizo. Este resultado es consistente con el coeficiente negativo asociado a la variable Crédito en el modelo de regresión múltiple. Una posible explicación es que los negocios con desempeño más moderado busquen financiamiento con mayor frecuencia, aunque se trata de una hipótesis que estos datos no permiten probar.

5. Resultados del modelo

5.1 Estimación del modelo

modelo <- lm(log_Ventas ~ Personal + log_Costos + Sector + Contabilidad + Credito, data = datos)
resumen <- summary(modelo)
n_obs <- nobs(modelo)
f_stat <- resumen$fstatistic[1]
p_modelo <- pf(resumen$fstatistic[1], resumen$fstatistic[2], resumen$fstatistic[3], lower.tail = FALSE)

num <- function(x, d = 5) format(round(x, d), decimal.mark = ",", nsmall = d, trim = TRUE)

tabla_modelo <- tidy(modelo) %>%
  mutate(
    Sig. = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01  ~ "**",
      p.value < 0.05  ~ "*",
      TRUE            ~ ""
    ),
    p.value_fmt = ifelse(p.value < 0.0001, "< 0,0001",
                         format(round(p.value, 4), nsmall = 4, decimal.mark = ","))
  ) %>%
  transmute(
    Variable = term,
    Coeficiente = num(estimate),
    `Error Estándar` = num(std.error),
    `Estadístico t` = num(statistic, 2),
    `Valor p` = p.value_fmt,
    Sig.
  )

fila_resumen <- tibble(
  Variable = c("R²", "R² ajustado", "F", "Valor p (modelo)", "N"),
  Coeficiente = c(num(resumen$r.squared, 3),
                  num(resumen$adj.r.squared, 3),
                  format(round(f_stat, 2), big.mark = ".", decimal.mark = ",", nsmall = 2, trim = TRUE),
                  ifelse(p_modelo < 0.0001, "< 0,0001", num(p_modelo, 4)),
                  format(n_obs, big.mark = ".", trim = TRUE)),
  `Error Estándar` = NA_character_,
  `Estadístico t` = NA_character_,
  `Valor p` = NA_character_,
  Sig. = NA_character_
)

tabla_modelo1 <- bind_rows(tabla_modelo, fila_resumen) %>%
  gt() %>%
  tab_header(title = "Resultados del modelo de regresión lineal múltiple") %>%
  sub_missing(columns = everything(), missing_text = "") %>%
  cols_align(align = "left", columns = Variable) %>%
  cols_align(align = "center", columns = c(Coeficiente, `Error Estándar`, `Estadístico t`, `Valor p`, Sig.)) %>%
  tema_jade_tabla()

tabla_modelo1
Resultados del modelo de regresión lineal múltiple
Variable Coeficiente Error Estándar Estadístico t Valor p Sig.
(Intercept) 8,41405 0,04228 199,00 < 0,0001 ***
Personal 0,14842 0,00295 50,39 < 0,0001 ***
log_Costos 0,51441 0,00266 193,63 < 0,0001 ***
SectorIndustria -0,03668 0,01334 -2,75 0,0060 **
SectorServicios 0,25886 0,00922 28,08 < 0,0001 ***
ContabilidadLibro diario 0,45231 0,01107 40,86 < 0,0001 ***
ContabilidadP&G o Balance 0,62564 0,01323 47,29 < 0,0001 ***
ContabilidadOtro tipo de cuentas 0,24361 0,00986 24,72 < 0,0001 ***
CreditoSí -0,07503 0,00940 -7,98 < 0,0001 ***
R² 0,713



R² ajustado 0,713



F 10.232,65



Valor p (modelo) < 0,0001



N 33.013



El modelo ajustado explica el 71,3% de la variabilidad en el logaritmo de las ventas (R² ajustado = 0,713), con un ajuste estadísticamente significativo en su conjunto (F = 10.232,65; p < 0,0001) sobre las 33.013 observaciones de la muestra.

En cuanto a las variables continuas, Personal presenta un coeficiente de 0,14842 (p < 0,0001), lo que indica que cada trabajador adicional está asociado con un incremento de aproximadamente 16,0 % en las ventas ((e^0,14842 − 1) · 100), manteniendo las demás variables constantes.

Log_Costos registra el coeficiente de mayor magnitud de todo el modelo (0,51441; p < 0,0001): un aumento de 1% en los costos de mercancía e insumos se asocia con un incremento de aproximadamente 0,51% en las ventas, confirmando a esta variable como el predictor con mayor peso relativo dentro del modelo.

Respecto al Sector económico, tomando Comercio como categoría de referencia, Industria presenta un coeficiente negativo de -0,03668 (≈ -3,6 %; p = 0,0060), mientras que Servicios muestra un coeficiente positivo de 0,25886 (≈ +29,5 %; p < 0,0001), una vez controladas las demás variables del modelo.

Con “No lleva contabilidad” como categoría de referencia, los tres tipos de registro contable se asocian con mayores ventas y siguen un orden consistente con el grado de formalización: “Otro tipo de cuentas” presenta un coeficiente de 0,24361 (≈ +27,6 %), “Libro diario” de 0,45231 (≈ +57,2 %) y “P&G o Balance” de 0,62564 (≈ +86,9 %), todos significativos (p < 0,0001). Es decir, a igual personal, costos, sector y solicitud de crédito, los negocios que llevan una contabilidad más estructurada registran ventas mayores.

Finalmente, la solicitud de crédito (CreditoSí) presenta un coeficiente negativo de -0,07503 (p < 0,0001): los microestablecimientos que solicitaron crédito en los últimos 12 meses registran, en promedio, un nivel de ventas 7,2% menor que quienes no lo solicitaron, manteniendo las demás variables constantes. Una posible explicación es que los negocios con desempeño más ajustado busquen financiamiento; sin embargo, al excluir los costos del modelo el coeficiente es prácticamente nulo (+0,014), por lo que este resultado depende del control por costos (sección 5.3).

De acuerdo a los coeficientes presentados en la tabla anterior, la ecuacion del modelo de regresion lineal multiple queda de la siguiente manera \[ \log\_Ventas_i = 8,41405 + 0,14842 \cdot Personal_i + 0.51441 \cdot \log\_Costos_i - 0,3668 \cdot D\_Industria_i + 0,25886 \cdot D\_Servicios_i + 0,45231 \cdot D\_LibroDiario_i + 0,62564 \cdot D\_PyG_i + 0,24361 \cdot D\_OtroTipo_i - 0,07503 \cdot D\_CreditoSi_i + \varepsilon_i \]

5.2 Sensibilidad: Modelo sin costos

modelo_sin_costos <- lm(log_Ventas ~ Personal + Sector + Contabilidad + Credito, data = datos)

full_join(
  tidy(modelo_sin_costos) %>% select(Variable = term, `Sin log_Costos` = estimate),
  tidy(modelo)            %>% select(Variable = term, `Con log_Costos` = estimate),
  by = "Variable"
) %>%
  mutate(across(where(is.numeric), ~ round(., 3))) %>%
  gt() %>%
  tab_header(title = "Coeficientes con y sin log_Costos") %>%
  sub_missing(missing_text = "—") %>%
  cols_align(align = "left", columns = Variable) %>%
  cols_align(align = "center", columns = -Variable) %>%
  tema_jade_tabla()
Coeficientes con y sin log_Costos
Variable Sin log_Costos Con log_Costos
(Intercept) 16.430 8.414
Personal 0.341 0.148
SectorIndustria -0.443 -0.037
SectorServicios -0.370 0.259
ContabilidadLibro diario 0.880 0.452
ContabilidadP&G o Balance 1.208 0.626
ContabilidadOtro tipo de cuentas 0.555 0.244
CreditoSí 0.014 -0.075
log_Costos — 0.514

Al excluir log_Costos, el R² ajustado cae de 0,713 a 0,386, lo que confirma que la escala de operación es el factor que más explica las ventas. Además, los coeficientes de las demás variables cambian. Las categorías de contabilidad mantienen su orden, pero sus coeficientes son casi el doble sin costos (Otro tipo de cuentas 0,555 frente a 0,244; Libro diario 0,880 frente a 0,452; P&G o Balance 1,208 frente a 0,626), y Personal pasa de 0,148 a 0,341. Otros coeficientes cambian de signo: Servicios de +0,259 a −0,370, Industria de −0,037 a −0,443 y Crédito de −0,075 a +0,014. Esto indica que los costos absorben buena parte de la asociación de estas variables con las ventas: los negocios más formalizados y con más personal tienden a operar a mayor escala. Aun controlando por costos, la contabilidad mantiene una asociación positiva y ordenada, por lo que su relación con las ventas no se explica solo por el tamaño del negocio.

6. Diagnóstico del modelo

6.1. Linealidad

La linealidad se evalúa con el gráfico de residuos frente a valores ajustados, que permite ver si los errores del modelo siguen algún patrón. Si la relación fuera lineal, los residuos se distribuirían de forma aleatoria alrededor de cero. ### 6.1.1 Gráfico de Residuos vs Valores Ajustados

#--- 1. Extraer valores ajustados y residuos del modelo -----------------
diagnostico <- augment(modelo) %>%
  mutate(extremo = abs(.resid) > quantile(abs(.resid), 0.999, na.rm = TRUE))

# --- 2. Gráfico (recortando el 1%-99% para evitar la cola poco confiable) -
ggplot(diagnostico, aes(x = .fitted, y = .resid)) +
  geom_point(aes(color = extremo), alpha = 0.4, size = 1.3) +
  scale_color_manual(values = c("FALSE" = verde_aqua, "TRUE" = "#B0413E"), guide = "none") +
  geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs"),
              se = TRUE, color = jade_oscuro, fill = jade_oscuro, alpha = 0.15, linewidth = 1) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "#B0413E", linewidth = 0.8) +
  coord_cartesian(xlim = c(quantile(diagnostico$.fitted, 0.01), quantile(diagnostico$.fitted, 0.99))) +
  labs(
    title = " ANÁLISIS DE RESIDUOS VS VALORES AJUSTADOS",
    subtitle = "Validación de los supuestos de linealidad y homocedasticidad",
    x = "Valores Ajustados (Predicciones)",
    y = "Residuos",
    caption = "Fuente: Elaboración propia con base en Microestablecimientos DANE 2016 | Línea jade: tendencia GAM | Línea roja: residuo cero"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(family = "cormorant", face = "bold", hjust = 0.5,
                              color = jade_oscuro, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = "#7A8F88", size = 10),
    plot.caption = element_text(size = 7, color = "#7A8F88", hjust = 0.5),
    axis.title = element_text(color = jade_texto),
    axis.text = element_text(color = jade_texto),
    panel.grid.major = element_line(color = "#D8E8E2"),
    panel.grid.minor = element_blank()
  )

El gráfico de residuos frente a los valores ajustados muestra que la gran mayoría de las observaciones se distribuye de forma relativamente simétrica alrededor de la línea de referencia en cero, sin una tendencia sistemática marcada: la curva de tendencia se mantiene cercana a cero en casi todo el rango de valores ajustados, lo que constituye un indicio favorable respecto al cumplimiento del supuesto de linealidad del modelo.

En conjunto, el supuesto de linealidad se cumple de forma razonable: no se observa una curvatura sistemática en los residuos, aunque se identifican algunos residuos extremos que se discuten en las secciones siguientes.

6.2 Normalidad

La normalidad de los residuos se evalúa con un gráfico Q-Q y con un histograma comparado con la curva normal teórica.

6.2.1 Gráfico Q-Q

diagnostico <- augment(modelo)

ggplot(diagnostico, aes(sample = .resid)) +
  stat_qq(color = verde_aqua, alpha = 0.5, size = 1.3) +
  stat_qq_line(color = "#B0413E", linewidth = 0.9) +
  labs(
    title = "Gráfico Q-Q de los residuos",
    subtitle = "Validación de normalidad: residuos vs. distribución normal teórica",
    x = "Cuantiles teóricos",
    y = "Cuantiles de los residuos",
    caption = "Fuente: Elaboración propia con base en Microestablecimientos DANE 2016"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(family = "cormorant", face = "bold", hjust = 0.5,
                              color = jade_oscuro, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = "#7A8F88", size = 10),
    plot.caption = element_text(size = 7, color = "#7A8F88", hjust = 0.5),
    axis.title = element_text(color = jade_texto),
    axis.text = element_text(color = jade_texto),
    panel.grid.major = element_line(color = "#D8E8E2"),
    panel.grid.minor = element_blank()
  )

El gráfico Q-Q muestra que, en la zona central de la distribución correspondiente a la mayoría de las observaciones, entre aproximadamente -2 y 2 en los cuantiles teóricos, los puntos se ajustan de forma muy cercana a la línea de referencia, lo que indica que gran parte de los residuos del modelo se comporta de manera consistente con una distribución normal.

No obstante, en ambos extremos de la distribución se observa una desviación sistemática respecto a la línea teórica. En el extremo inferior, los residuos observados caen por debajo de lo que predeciría una distribución normal, llegando hasta valores cercanos a -5 cuando la línea de referencia se ubica alrededor de -2,5 en ese mismo punto. De forma simétrica, en el extremo superior los residuos se ubican por encima de la línea teórica, alcanzando valores superiores a 7 frente a un valor esperado de aproximadamente 2,5. Este patrón de “colas pesadas” indica que el modelo presenta una proporción de observaciones con errores de predicción considerablemente más grandes tanto por exceso como por defecto de lo que se esperaría bajo el supuesto de normalidad perfecta.

En conjunto, el gráfico sugiere que el supuesto de normalidad de los residuos se cumple de forma razonable para la mayor parte de la muestra, pero no de manera estricta en los extremos, donde un grupo reducido de microestablecimientos presenta errores de predicción atípicamente grandes. Esta desviación es consistente con los residuos extremos ya identificados en el análisis de residuos frente a valores ajustados, y debe documentarse como una limitación del modelo en el cumplimiento de este supuesto.

6.2.2 Distribución de los residuos

diagnostico <- augment(modelo)

media_resid <- mean(diagnostico$.resid)
sd_resid    <- sd(diagnostico$.resid)

ggplot(diagnostico, aes(x = .resid)) +
  geom_histogram(aes(y = after_stat(density)), bins = 40,
                 fill = verde_aqua, color = jade_fondo, alpha = 0.75) +
  geom_density(aes(color = "Densidad observada"), linewidth = 1) +
  stat_function(aes(color = "Distribución normal teórica"),
                fun = dnorm, args = list(mean = media_resid, sd = sd_resid),
                linewidth = 1, linetype = "dashed") +
  geom_vline(xintercept = media_resid, linetype = "dashed", color = jade_texto, linewidth = 0.6) +
  scale_color_manual(
    name = NULL,
    values = c("Densidad observada" = jade_oscuro,
               "Distribución normal teórica" = "#B0413E")
  ) +
  labs(
    title = "DISTRIBUCIÓN DE LOS RESIDUOS DEL MODELO",
    subtitle = "Validación del supuesto de normalidad de los errores",
    x = "Residuos",
    y = "Densidad",
    caption = "Fuente: Elaboración propia con base en Microestablecimientos DANE 2016"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(family = "cormorant", face = "bold", hjust = 0.5,
                              color = jade_oscuro, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = "#7A8F88", size = 10),
    plot.caption = element_text(size = 7, color = "#7A8F88", hjust = 0.5),
    axis.title = element_text(color = jade_texto),
    axis.text = element_text(color = jade_texto),
    panel.grid.major = element_line(color = "#D8E8E2"),
    panel.grid.minor = element_blank(),
    legend.position = "top",
    legend.text = element_text(color = jade_texto)
  )

El histograma de los residuos muestra una forma unimodal y aproximadamente simétrica alrededor de cero, lo cual es consistente con el cumplimiento general del supuesto de normalidad. Sin embargo, al comparar la curva de densidad observada con la distribución normal teórica de igual media y desviación estándar, se evidencia que la curva real presenta un pico sustancialmente más pronunciado: alcanza una densidad cercana a 0,77 en torno a cero, mientras que la curva normal teórica alcanza un máximo de aproximadamente 0,58 en ese mismo punto.

Esta mayor concentración de residuos muy cercanos a cero, combinada con la presencia de colas que se extienden de forma visible más allá de los límites que predeciría una distribución normal (observándose densidad distinta de cero incluso más allá de 5 y -5), configura un patrón de leptocurtosis: los errores del modelo tienden a ser, en su mayoría, más pequeños de lo que una distribución normal anticiparía, pero el grupo reducido de errores grandes que sí ocurre tiende a ser más extremo de lo esperado bajo ese mismo supuesto.

Este resultado es consistente con lo observado previamente en el gráfico Q-Q de los residuos, donde se identificó la misma desviación en los extremos de la distribución. En conjunto, ambos diagnósticos apuntan a que el supuesto de normalidad se cumple de forma aproximada para la mayoría de las observaciones, pero no de manera estricta, producto de un subconjunto de microestablecimientos cuyos errores de predicción se alejan considerablemente del comportamiento esperado por el modelo.

6.3 Homocedasticidad

El gráfico de residuos frente a valores ajustados (sección 6.1.1) también permite evaluar la homocedasticidad. Al examinar la amplitud de la dispersión de los residuos, se identifica un comportamiento no completamente homogéneo a lo largo del eje de valores ajustados. En la zona correspondiente a predicciones más bajas (aproximadamente entre 15 y 16,5), los residuos presentan una mayor variabilidad, con observaciones que se alejan considerablemente de cero en ambas direcciones. En contraste, hacia los valores ajustados más altos (19 en adelante), la dispersión de los residuos se reduce de forma notoria, concentrándose en un rango mucho más estrecho alrededor de cero. Este patrón sugiere la presencia de heterocedasticidad: la varianza del error no permanece constante en todos los niveles de ventas predichas, sino que tiende a ser mayor en los microestablecimientos con niveles de ventas más bajos.

Adicionalmente, se identifican algunos residuos de magnitud considerablemente alta respecto al resto de la nube, principalmente concentrados en la zona de valores ajustados bajos, junto con un caso aislado de residuo fuertemente negativo. Estas observaciones corresponden a microestablecimientos cuyo nivel real de ventas se aleja de forma importante de lo que el modelo predice para negocios con características similares, y constituyen candidatos a revisar con mayor detalle como posibles datos atípicos dentro de la muestra.

diagnostico <- diagnostico %>%
  mutate(
    resid_estandarizado = .std.resid,
    raiz_resid = sqrt(abs(resid_estandarizado))
  )

media_raiz <- mean(diagnostico$raiz_resid, na.rm = TRUE)

ggplot(diagnostico, aes(x = .fitted, y = raiz_resid)) +
  geom_point(color = verde_aqua, alpha = 0.4, size = 1.3) +
  geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs"),
              se = TRUE, color = jade_oscuro, fill = jade_oscuro, alpha = 0.15, linewidth = 1) +
  geom_hline(yintercept = media_raiz, linetype = "dashed", color = "#B0413E", linewidth = 0.8) +
  coord_cartesian(xlim = c(quantile(diagnostico$.fitted, 0.01), quantile(diagnostico$.fitted, 0.99))) +
  labs(
    title = "Gráfico Scale-Location: verificación de homocedasticidad",
    subtitle = "Raíz cuadrada de los residuos estandarizados vs. valores ajustados",
    x = "Valores ajustados (predicciones)",
    y = expression(sqrt("|Residuos Estandarizados|")),
    caption = "Fuente: Elaboración propia con base en Microestablecimientos DANE 2016 | Línea roja: media | Línea jade: tendencia GAM"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    text = element_text(family = "ebgaramond", color = jade_texto),
    plot.background = element_rect(fill = jade_fondo, color = NA),
    panel.background = element_rect(fill = jade_fondo, color = NA),
    plot.title = element_text(family = "cormorant", face = "bold", hjust = 0.5,
                              color = jade_oscuro, size = 15),
    plot.subtitle = element_text(hjust = 0.5, color = "#7A8F88", size = 10),
    plot.caption = element_text(size = 7, color = "#7A8F88", hjust = 0.5),
    axis.title = element_text(color = jade_texto),
    axis.text = element_text(color = jade_texto),
    panel.grid.major = element_line(color = "#D8E8E2"),
    panel.grid.minor = element_blank()
  )

El gráfico Scale-Location confirma de manera clara el patrón de heterocedasticidad que ya se había identificado en el análisis de residuos frente a valores ajustados. La línea de tendencia muestra una pendiente descendente pronunciada en el tramo correspondiente a los microestablecimientos con menores ventas predichas: parte de un valor aproximado de 1,5 en la raíz de residuos estandarizados para valores ajustados cercanos a 14, y desciende de forma sostenida hasta estabilizarse alrededor de 0,75 a partir de valores ajustados de 17 en adelante, manteniéndose prácticamente constante en ese nivel hasta el extremo superior del rango observado (20).

Esta disminución progresiva de la magnitud de los residuos estandarizados indica que la variabilidad del error del modelo no es constante a lo largo de todo el rango de predicción, sino que es considerablemente mayor para los microestablecimientos con niveles de ventas más bajos, y se reduce y estabiliza a medida que aumenta el nivel de ventas predicho. En otras palabras, el modelo predice con mayor precisión relativa a los negocios de mayor escala de ventas, mientras que para los negocios más pequeños la dispersión de los errores es notablemente mayor.

Este resultado, obtenido de forma independiente a partir de una métrica distinta a la empleada en el análisis de residuos original, refuerza la conclusión de que el supuesto de homocedasticidad no se cumple de manera estricta en este modelo. Se trata de una limitación consistente a lo largo de los distintos diagnósticos realizados, y debe documentarse como tal, sin que ello implique necesariamente que el modelo carezca de utilidad explicativa, pero sí que los errores estándar de los coeficientes podrían estar subestimados, particularmente para las predicciones correspondientes a microestablecimientos de menor escala de ventas.

Por lo tanto, el supuesto de homocedasticidad no se cumple de manera estricta, por lo que los resultados de significancia deben interpretarse con algo de cautela, en particular el de Industria (p = 0,0060), el coeficiente con el p-valor menos contundente del modelo.

6.4 Multicolinealidad

resultado_vif <- vif(modelo)

tabla_vif <- as.data.frame(resultado_vif) %>%
  tibble::rownames_to_column("Variable") %>%
  rename(
    GVIF = GVIF,
    `Grados de libertad` = Df,
    `GVIF Ajustado` = `GVIF^(1/(2*Df))`
  ) %>%
  mutate(
    GVIF = round(GVIF, 3),
    `GVIF Ajustado` = round(`GVIF Ajustado`, 3),
    Interpretación = case_when(
      `GVIF Ajustado` < 2.2  ~ "Sin problema",
      `GVIF Ajustado` < 3.16 ~ "Aceptable",
      TRUE                    ~ "Revisar"
    )
  )

tabla_vif %>%
  gt() %>%
  tab_header(title = "Diagnóstico de multicolinealidad (VIF)") %>%
  cols_align(align = "left", columns = Variable) %>%
  cols_align(align = "center", columns = c(GVIF, `Grados de libertad`, `GVIF Ajustado`, Interpretación)) %>%
  tab_style(
    style = cell_text(color = jade_oscuro, weight = "bold"),
    locations = cells_body(columns = Interpretación, rows = Interpretación == "Revisar")
  ) %>%
  tab_style(
    style = cell_text(color = verde_aqua, weight = "bold"),
    locations = cells_body(columns = Interpretación, rows = Interpretación == "Sin problema")
  ) %>%
  tema_jade_tabla()
Diagnóstico de multicolinealidad (VIF)
Variable GVIF Grados de libertad GVIF Ajustado Interpretación
Personal 1.423 1 1.193 Sin problema
log_Costos 1.438 1 1.199 Sin problema
Sector 1.200 2 1.047 Sin problema
Contabilidad 1.307 3 1.046 Sin problema
Credito 1.012 1 1.006 Sin problema

Los resultados del diagnóstico de multicolinealidad muestran valores de GVIF Ajustado notablemente bajos para las cinco variables predictoras del modelo, todos ubicados entre 1,006 y 1,199. Personal (1,193) y log_Costos (1,199) presentan los valores más altos del conjunto, aunque se mantienen muy por debajo del umbral de 2,2 que suele emplearse como referencia para considerar un GVIF Ajustado aceptable. Le siguen Sector (1,047), Contabilidad (1,046) y Credito (1,006), este último prácticamente sin inflación de varianza.

Estos resultados indican ausencia de problemas de multicolinealidad entre las variables explicativas del modelo: ninguna de ellas comparte una proporción relevante de información con las demás, lo que significa que cada una aporta variación propia y no redundante al momento de explicar log_Ventas. En particular, resulta relevante que log_Costos , variable sobre la cual se había señalado una posible relación con el nivel de ventas por construcción, no presenta un GVIF elevado, lo que sugiere que dicha relación no se traduce en un problema estadístico de colinealidad dentro del modelo ajustado.

En conjunto, el diagnóstico respalda la estabilidad de las estimaciones obtenidas: los coeficientes no están distorsionados por colinealidad entre predictores. Esto no contradice los cambios de coeficientes observados en la sección 5.3: esos cambios no se deben a colinealidad, sino a que los costos recogen parte de la variación asociada a contabilidad, sector y personal.

6.5 Independencia de las observaciones

Los datos son de corte transversal (2016), por lo que no existe dependencia temporal ni autocorrelación en sentido estricto. Sin embargo, los microestablecimientos provienen de 24 ciudades y áreas metropolitanas, y negocios de una misma ciudad o actividad pueden compartir condiciones de mercado que el modelo no recoge, lo que implicaría cierta correlación entre sus errores y, por tanto, errores estándar posiblemente subestimados. Además, la encuesta es no probabilística (estudio de caso), por lo que la inferencia estadística debe leerse como descriptiva del conjunto de negocios estudiado. Como la base utilizada no incluye la ciudad de cada negocio, esta dependencia no pudo evaluarse formalmente.

7. Conclusiones

El presente análisis se fundamentó en dar respuesta a la siguiente pregunta: ¿Qué factores estructurales y operativos están asociados con el nivel de ventas o ingresos de los micro establecimientos en Colombia? Identificar y comprender estos aspectos resulta fundamental para el desarrollo social, económico y productivo del país, dado que estos negocios representan la base del tejido empresarial y se constituyen como los principales generadores de empleo (interactuar, 2022). Pese a lo anterior, abordar este interrogante supone un gran reto dada la multiplicidad y heterogeneidad de los micro negocios, por lo que la estructuración de un modelo de regresión lineal múltiple se constituyó como la herramienta ideal para responder dicho interrogante.

7.1 Hallazgos principales

El modelo de regresión lineal presenta una capacidad explicativa robusta y un ajuste estadísticamente significativo, logrando explicar el 71,3% de la variabilidad del logaritmo de las ventas. Los resultados indican que las variables relacionadas a los factores de formalización financiera como la contabilidad realizada con PyG o balance general, y factores operativos como los costos operativos influyen enormemente en los ingresos de los micro negocios, mientras que el factor humano se constituyó como un motor esencial, aunque no al nivel de los factores anteriores. Los resultados también sugieren la existencia de brechas y barreras en la sostenibilidad de los micronegocios. Los micro establecimientos presentan mayores barreras en el sector industrial, esto debido posiblemente al desconocimiento del sector, la falta de experiencia y demás dificultades derivadas de los monopolios presentes (Tabares Sandoval, Tequia Barahona, & Trujillo Rincón, 2024). Por otro lado, el coeficiente negativo del acceso a crédito indica algo curioso a la vez que preocupante. Los micros establecimientos recurren al endeudamiento no como palanca de crecimiento, sino como herramienta de supervivencia (también llamado como crédito defensivo): se endeudan no para crecer, sino para cubrir gastos básicos (El Colombiano, 2025).

7.2 Limitaciones del estudio

A pesar de que la robustez del modelo se evidencia bajo el cumplimiento de los supuestos de linealidad, multicolinealidad e independencia de las observaciones, también es necesario recalcar las limitaciones presentadas en el supuesto de normalidad, además de que no se cumple el supuesto de homocedasticidad: todo esto dada la heterogeneidad de los micro establecimientos colombianos. Esto indica que, aunque las estimaciones de los coeficientes siguen siendo válidas, los p-valores no son del 100% confiables.

7.3 Recomendaciones

Con base en los resultados obtenidos, se recomienda que para futuras investigaciones se implementen errores estándar robustos a la heterocedasticidad, en la medida en que las pruebas de significancia sean más confiables y se corrija parcialmente la heterocedasticidad. Finalmente, las recomendaciones para políticas públicas orientadas al fortalecimiento del tejido micro empresarial se basan en la priorización de programas de alfabetización financiera: tener registros contables ordenados facilita el acceso a financiamiento, identifica oportunidades de ahorro y permite calcular impuestos de manera adecuada (Siigo, 2025), estímulos para la generación y formalización de empleo y asistencia estructural en micronegocios industriales.

8. Bibliografía

Confecámaras. (2024). Estudios económicos. https://confecamaras.org.co/investigaciones-economicas/estudios-economicos/

Departamento Administrativo Nacional de Estadística [DANE]. (2016). Boletín técnico: Encuesta de Microestablecimientos (MICRO) 2016. https://www.dane.gov.co/files/investigaciones/boletines/microestablec/Bol_micro_2016.pdf

Departamento Administrativo Nacional de Estadística [DANE]. (2018). Encuesta de Microestablecimientos – MICRO – 2012-2016 – Colombia [Conjunto de microdatos]. Dirección de Metodología y Producción Estadística (DIMPE). https://microdatos.dane.gov.co/index.php/catalog/560

Instituto Nacional de Contadores Públicos [INCP]. (2023). Una mirada a la informalidad laboral en Colombia. ContArte. https://incp.org.co/ContArte/contenidos/2023/08/una-mirada-a-la-informalidad-laboral-en-colombia/

Kiziryan, M. (2015). Función de producción: qué es y cómo funciona. Economipedia. https://economipedia.com/definiciones/funcion-de-produccion.html

Ministerio de Comercio, Industria y Turismo [Mincit]. (2023). Entre enero y febrero creció el tejido empresarial colombiano. https://www.mincit.gov.co/prensa/noticias/industria/entre-enero-y-febrero-crecio-el-tejido-empresarial

El Colombiano. (23 de julio de 2025). La mitad de las pymes en Medellín se endeudan para sobrevivir, no para crecer, revela informe. Obtenido de El Colombiano: https://www.elcolombiano.com/negocios/pymes-medellin-mitad-creditos-para-sobrevivir-no-para-crecer-EO28265908

interactuar. (22 de julio de 2022). Cinco razones para apoyar a las microempresas en Colombia. Obtenido de interactuar.org: https://interactuar.org.co/cinco-razones-para-apoyar-a-las-microempresas-en-colombia/

Siigo. (29 de mayo de 2025). Importancia de la contabilidad en las pymes y mipymes mexicanas. Obtenido de Siigo: https://www.siigo.com/mx/blog/gestion-administrativa/importancia-contabilidad-en-pymes/?srsltid=AU7gw4WIPdWJ7wEzc9TuFrxq8TjW8WzD0z5yKpLeeHGcAIJxXjXCF4p7

Tabares Sandoval, K. T., Tequia Barahona, T. M., & Trujillo Rincón, J. F. (9 de diciembre de 2024). Fracaso de las pymes del sector industrial. Obtenido de Repositorio Institucional Universidad Piloto de Colombia: https://repository.unipiloto.edu.co/handle/20.500.12277/14066