paquetes <- c("readxl", "dplyr", "ggplot2", "knitr")
for (p in paquetes) {
if (!requireNamespace(p, quietly = TRUE)) {
install.packages(p)
}
}
library(readxl)
library(dplyr)
library(ggplot2)
library(knitr)
Este informe desarrolla la Actividad 122 de la unidad de Análisis
Descriptivo, usando la base de datos
empresas_depuradas.xlsx, que contiene información de un
grupo de empresas registradas. El objetivo es analizar al menos dos
variables cualitativas y dos cuantitativas, apoyándose en tablas de
frecuencia e indicadores estadísticos calculados directamente a partir
de los datos.
datos <- read_excel("empresas_depuradas.xlsx")
dim(datos)
## [1] 354 10
str(datos)
## tibble [354 × 10] (S3: tbl_df/tbl/data.frame)
## $ nit : chr [1:354] "890200584-7" "91252545-4" "63348687-3" "91290712-1" ...
## $ razon_social : chr [1:354] "MANUEL COBOS DUARTE LIMITADA" "CASTILLO RUEDA DANIEL" "RIBERO GOMEZ MASSIEL" "CASTRO NAVAS YEBRAIL ARMANDO" ...
## $ tipo_juridico : chr [1:354] "SOC. LIMITADA" "PERSONA NATURAL" "PERSONA NATURAL" "PERSONA NATURAL" ...
## $ estado_matricula : chr [1:354] "ACTIVO" "ACTIVO" "CANCELADO" "ACTIVO" ...
## $ fecha_matricula : chr [1:354] "1955-03-10" "2002-04-25" "2002-03-19" "2002-03-19" ...
## $ actividad_economica_ciiu: chr [1:354] "Comercio De Partes, Piezas (Autopartes) Y Accesorios (Lujos) Para Vehículos Automotores" "Comercio Al Por Menor De Productos Agrícolas Para El Consumo En Establecimientos Especializados" "Comercio Al Por Menor De Artículos De Ferretería, Pinturas Y Productos De Vidrio En Establecimientos Especializados" "Actividades De Producción De Películas Cinematográficas, Videos, Programas, Anuncios Y Comerciales De Televisión" ...
## $ ciudad : chr [1:354] "Bucaramanga" "Lebrija" "Bucaramanga" "Bucaramanga" ...
## $ departamento : chr [1:354] "SANTANDER" "SANTANDER" "SANTANDER" "SANTANDER" ...
## $ tamano_empresa : chr [1:354] "PEQUEÑA EMPRESA" "MICROEMPRESA" "MICROEMPRESA" "MICROEMPRESA" ...
## $ antiguedad_anios : num [1:354] 71 24 24 24 24 24 24 24 24 54 ...
colSums(is.na(datos))
## nit razon_social tipo_juridico
## 0 0 0
## estado_matricula fecha_matricula actividad_economica_ciiu
## 0 0 0
## ciudad departamento tamano_empresa
## 0 0 0
## antiguedad_anios
## 0
sum(duplicated(datos))
## [1] 0
La base tiene 354 observaciones y 10 variables. No se encontraron valores faltantes ni filas duplicadas, por lo que no fue necesario aplicar ningún tratamiento previo a los datos.
Las variables disponibles son: nit,
razon_social, tipo_juridico,
estado_matricula, fecha_matricula,
actividad_economica_ciiu, ciudad,
departamento, tamano_empresa y
antiguedad_anios. Las variables nit y
razon_social identifican a cada empresa de forma individual
y no se utilizan como variables de análisis. La variable
departamento no aporta información porque todas las
empresas de la base pertenecen al mismo departamento, y
actividad_economica_ciiu tiene un número muy alto de
categorías (135), lo que la hace poco práctica para una tabla de
frecuencia.
sapply(datos[, c("tipo_juridico", "estado_matricula", "ciudad", "tamano_empresa")],
function(x) length(unique(x)))
## tipo_juridico estado_matricula ciudad tamano_empresa
## 7 4 11 4
summary(datos$antiguedad_anios)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 21.0 42.0 47.0 46.2 52.0 85.0
Con base en esta revisión se seleccionaron las siguientes variables:
Variables cualitativas:
tamano_empresa: clasifica cada empresa como
microempresa, pequeña, mediana o gran empresa. Tiene solo cuatro
categorías y, a diferencia de las demás variables cualitativas de la
base, sigue un orden lógico de tamaño, por lo que se clasifica como
cualitativa ordinal.estado_matricula: indica si la empresa está activa,
cancelada o en algún proceso de disolución. Tiene cuatro categorías sin
un orden natural entre ellas, por lo que se clasifica como
cualitativa nominal.Se descartaron ciudad y tipo_juridico para
este análisis principal: ciudad tiene once categorías, pero
la gran mayoría de ellas concentran una sola empresa, lo que produce una
tabla poco informativa; tipo_juridico tiene siete
categorías con el mismo problema en varias de ellas.
tamano_empresa y estado_matricula en cambio
tienen pocas categorías y permiten una lectura clara.
Variables cuantitativas:
antiguedad_anios: indica cuántos años lleva registrada
la empresa. Es una variable cuantitativa de razón,
porque tiene un cero verdadero (una empresa recién registrada tendría
antigüedad cero) y las razones entre valores tienen sentido (una empresa
de 60 años tiene el doble de antigüedad que una de 30).anio_matricula: la base original solo trae una variable
numérica lista para analizar (antiguedad_anios), por lo que
para cumplir con el mínimo de dos variables cuantitativas se construyó
una segunda variable a partir de fecha_matricula,
extrayendo el año de registro de cada empresa. Esta variable es
cuantitativa de intervalo, ya que las diferencias entre
años tienen sentido, pero no existe un cero real (el año cero no
representa ausencia de tiempo) ni tiene sentido decir que un año es “el
doble” de otro. Esta variable no fue inventada: proviene directamente de
la fecha de matrícula ya registrada en la base, solo se extrajo el
componente del año.Es importante aclarar que estas dos variables no son dos fenómenos
independientes: anio_matricula determina matemáticamente el
valor de antiguedad_anios (la antigüedad es, en la
práctica, el resultado de restar el año de matrícula a la fecha actual),
por lo que su correlación es prácticamente perfecta. Aun así, se
analizan las dos porque la base no ofrece otra variable numérica
distinta, y porque justamente esa relación permite mostrar con claridad
la diferencia entre una escala de razón (antiguedad_anios,
con cero real y razones interpretables) y una escala de intervalo
(anio_matricula, donde solo las diferencias tienen
sentido). Cada una se interpreta enfocándose en lo que aporta de forma
particular: la antigüedad describe el tiempo de operación de la empresa,
mientras que el año de matrícula permite ubicar en qué momento histórico
se concentran los registros.
datos <- datos %>%
mutate(anio_matricula = as.integer(format(as.Date(fecha_matricula), "%Y")))
orden_tamano <- c("MICROEMPRESA", "PEQUEÑA EMPRESA", "MEDIANA EMPRESA", "GRAN EMPRESA")
datos <- datos %>%
mutate(tamano_empresa = factor(tamano_empresa, levels = orden_tamano, ordered = TRUE))
tabla_tamano <- datos %>%
count(tamano_empresa) %>%
mutate(
frecuencia_relativa = round(n / sum(n), 4),
porcentaje = round(frecuencia_relativa * 100, 2),
frecuencia_acumulada = cumsum(n),
porcentaje_acumulado = round(cumsum(frecuencia_relativa) * 100, 2)
) %>%
rename(frecuencia_absoluta = n)
kable(tabla_tamano, col.names = c("Tamaño de empresa", "Frecuencia absoluta", "Frecuencia relativa",
"Porcentaje (%)", "Frecuencia acumulada", "Porcentaje acumulado (%)"))
| Tamaño de empresa | Frecuencia absoluta | Frecuencia relativa | Porcentaje (%) | Frecuencia acumulada | Porcentaje acumulado (%) |
|---|---|---|---|---|---|
| MICROEMPRESA | 257 | 0.7260 | 72.60 | 257 | 72.60 |
| PEQUEÑA EMPRESA | 85 | 0.2401 | 24.01 | 342 | 96.61 |
| MEDIANA EMPRESA | 11 | 0.0311 | 3.11 | 353 | 99.72 |
| GRAN EMPRESA | 1 | 0.0028 | 0.28 | 354 | 100.00 |
Como tamano_empresa es una variable ordinal, en este
caso sí tiene sentido incluir la frecuencia acumulada, ya que las
categorías siguen un orden lógico de menor a mayor tamaño.
ggplot(datos, aes(x = tamano_empresa)) +
geom_bar(fill = "gray40") +
labs(title = "Distribución de empresas según tamaño", x = "Tamaño de empresa", y = "Número de empresas") +
theme_minimal()
La categoría “microempresa” concentra la mayor parte de las empresas de la base, con un 72.6% del total, seguida de “pequeña empresa” con un 24.01%. Entre estas dos categorías se agrupa la gran mayoría de las empresas registradas, mientras que “mediana empresa” y “gran empresa” representan una proporción bastante pequeña. Esto muestra que el tejido empresarial que recoge esta base está compuesto principalmente por empresas de tamaño pequeño.
tabla_estado <- datos %>%
count(estado_matricula) %>%
arrange(desc(n)) %>%
mutate(
frecuencia_relativa = round(n / sum(n), 4),
porcentaje = round(frecuencia_relativa * 100, 2)
) %>%
rename(frecuencia_absoluta = n)
kable(tabla_estado, col.names = c("Estado de matrícula", "Frecuencia absoluta", "Frecuencia relativa", "Porcentaje (%)"))
| Estado de matrícula | Frecuencia absoluta | Frecuencia relativa | Porcentaje (%) |
|---|---|---|---|
| ACTIVO | 338 | 0.9548 | 95.48 |
| CANCELADO | 11 | 0.0311 | 3.11 |
| EN DISOLUCION ANTICIPADA | 4 | 0.0113 | 1.13 |
| EN DISOLUCION POR VIGENCIA | 1 | 0.0028 | 0.28 |
estado_matricula es una variable nominal, ya que sus
categorías (activo, cancelado, en disolución anticipada, en disolución
por vigencia) no tienen un orden entre sí. Por esa razón no se incluye
frecuencia acumulada.
ggplot(datos, aes(x = reorder(estado_matricula, estado_matricula, function(x) -length(x)))) +
geom_bar(fill = "gray40") +
labs(title = "Distribución de empresas según estado de matrícula", x = "Estado", y = "Número de empresas") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 20, hjust = 1))
La categoría “activo” concentra 338 de las 354 empresas, es decir, el 95.48% del total. Las otras tres categorías (canceladas y los dos tipos de disolución) suman en conjunto menos del 5% de los casos. Esto indica que la base recoge principalmente empresas que continúan operando, mientras que la cancelación o disolución aparece solo en un número reducido de registros.
skewness <- function(x) {
n <- length(x)
m2 <- sum((x - mean(x))^2) / n
m3 <- sum((x - mean(x))^3) / n
m3 / (m2^1.5)
}
media_ant <- mean(datos$antiguedad_anios)
mediana_ant <- median(datos$antiguedad_anios)
sd_ant <- sd(datos$antiguedad_anios)
var_ant <- var(datos$antiguedad_anios)
min_ant <- min(datos$antiguedad_anios)
max_ant <- max(datos$antiguedad_anios)
rango_ant <- max_ant - min_ant
q_ant <- quantile(datos$antiguedad_anios, probs = c(0.25, 0.5, 0.75))
cv_ant <- round((sd_ant / media_ant) * 100, 2)
asimetria_ant <- skewness(datos$antiguedad_anios)
tabla_ant <- data.frame(
Indicador = c("Media", "Mediana", "Desviación estándar", "Varianza",
"Mínimo", "Máximo", "Rango", "Q1", "Q3",
"Coeficiente de variación (%)", "Asimetría"),
Valor = round(c(media_ant, mediana_ant, sd_ant, var_ant,
min_ant, max_ant, rango_ant,
q_ant[1], q_ant[3], cv_ant, asimetria_ant), 3)
)
kable(tabla_ant)
| Indicador | Valor |
|---|---|
| Media | 46.201 |
| Mediana | 47.000 |
| Desviación estándar | 11.944 |
| Varianza | 142.671 |
| Mínimo | 21.000 |
| Máximo | 85.000 |
| Rango | 64.000 |
| Q1 | 42.000 |
| Q3 | 52.000 |
| Coeficiente de variación (%) | 25.850 |
| Asimetría | -0.078 |
ggplot(datos, aes(x = antiguedad_anios)) +
geom_histogram(binwidth = 5, fill = "gray40", color = "white") +
labs(title = "Distribución de la antigüedad de las empresas", x = "Antigüedad (años)", y = "Número de empresas") +
theme_minimal()
ggplot(datos, aes(y = antiguedad_anios)) +
geom_boxplot(fill = "gray80") +
labs(title = "Boxplot de la antigüedad de las empresas", y = "Antigüedad (años)") +
theme_minimal() +
theme(axis.text.x = element_blank(), axis.ticks.x = element_blank())
La media de antigüedad es de 46.2 años y la mediana es de 47 años, valores muy cercanos entre sí. El coeficiente de asimetría, de -0.08, confirma esta cercanía: al estar tan próximo a cero, indica que la distribución no tiene una inclinación marcada hacia ningún lado. Sin embargo, el histograma muestra algo que estos indicadores por sí solos no dejan ver: hay un grupo grande de empresas con una antigüedad cercana a 24 años, separado por un vacío del resto de las empresas, que se distribuyen de forma más continua entre los 39 y los 85 años. Esto sugiere que dentro de la base conviven dos grupos distintos de empresas: uno más numeroso de constitución más reciente y otro de empresas con una trayectoria bastante más larga.
La desviación estándar es de 11.9 años, con un coeficiente de variación de 25.85%, lo que indica una dispersión moderada. En el boxplot se observan varios puntos fuera de los bigotes, tanto hacia valores bajos como hacia valores altos; estos no parecen errores de digitación, sino que corresponden justamente a los dos grupos mencionados: el grupo de empresas más jóvenes (alrededor de 21 a 25 años) y un grupo reducido de empresas mucho más antiguas (por encima de los 69 años).
media_anio <- mean(datos$anio_matricula)
mediana_anio <- median(datos$anio_matricula)
sd_anio <- sd(datos$anio_matricula)
min_anio <- min(datos$anio_matricula)
max_anio <- max(datos$anio_matricula)
rango_anio <- max_anio - min_anio
q_anio <- quantile(datos$anio_matricula, probs = c(0.25, 0.5, 0.75))
tabla_anio <- data.frame(
Indicador = c("Media", "Mediana", "Desviación estándar",
"Mínimo", "Máximo", "Rango", "Q1", "Q3"),
Valor = round(c(media_anio, mediana_anio, sd_anio,
min_anio, max_anio, rango_anio,
q_anio[1], q_anio[3]), 2)
)
kable(tabla_anio)
| Indicador | Valor |
|---|---|
| Media | 1979.80 |
| Mediana | 1979.00 |
| Desviación estándar | 11.94 |
| Mínimo | 1941.00 |
| Máximo | 2005.00 |
| Rango | 64.00 |
| Q1 | 1974.00 |
| Q3 | 1984.00 |
ggplot(datos, aes(x = anio_matricula)) +
geom_histogram(binwidth = 5, fill = "gray40", color = "white") +
labs(title = "Distribución del año de matrícula", x = "Año de matrícula", y = "Número de empresas") +
theme_minimal()
correlacion_ant_anio <- cor(datos$antiguedad_anios, datos$anio_matricula)
El coeficiente de variación no se reporta para esta variable porque, al ser de intervalo y no tener un cero real, dividir la desviación estándar entre la media no tiene una interpretación válida.
La media del año de matrícula es 1979.8 y la mediana es 1979, valores
casi idénticos. El rango es de 64 años (entre 1941 y 2005), el mismo
valor que el rango de antiguedad_anios, lo cual es
consistente con que -1 es el coeficiente de correlación entre ambas
variables: al ser una relación matemática directa, cualquier diferencia
entre dos años de matrícula corresponde exactamente a la misma
diferencia, en sentido contrario, entre las antigüedades
respectivas.
Lo que aporta esta variable, más allá de repetir lo ya visto en
antiguedad_anios, es una lectura en términos de momento
histórico: el primer cuartil corresponde al año 1974 y el tercer cuartil
al año 1984, de manera que la mitad central de las empresas de la base
fue registrada dentro de ese rango de una década. El histograma muestra
el mismo grupo numeroso alrededor del año 2002 que ya se identificó al
analizar la antigüedad, lo cual es esperable dado que ambas variables
describen el mismo hecho desde dos escalas distintas.
El análisis de las variables cualitativas mostró que la mayoría de las empresas de la base son microempresas o pequeñas empresas, y que casi todas se encuentran activas, con muy pocos casos de cancelación o disolución. Esto describe una base compuesta principalmente por empresas pequeñas que siguen en funcionamiento.
En cuanto a las variables cuantitativas, la antigüedad y el año de matrícula describen el mismo hecho desde dos escalas de medición distintas, por lo que su correlación es prácticamente perfecta y no deben leerse como fenómenos separados. Lo que sí aportó el análisis fue identificar, a través del histograma y el boxplot, un patrón que la media y la mediana por sí solas no muestran: existe un grupo considerable de empresas registradas alrededor del año 2002 (con una antigüedad cercana a 24 años), separado del resto de empresas, que tienen una antigüedad más variada y en general mayor.
En conjunto, el análisis cumple con lo solicitado en la actividad: se
trabajaron dos variables cualitativas (una ordinal y una nominal) y dos
cuantitativas (una de razón y una de intervalo), apoyadas en tablas de
frecuencia, indicadores estadísticos y gráficos, todos calculados
directamente a partir de empresas_depuradas.xlsx.