Una medida estadística no es una respuesta automática. Es una herramienta para resumir una parte de la realidad. El trabajo del analista consiste en decidir qué calcular, con qué datos, para responder cuál pregunta y con qué limitaciones.
Una empresa puede acumular millones de registros y, aun así, comprender muy poco de su negocio. Tener datos no equivale a tener información; tener información tampoco equivale a saber qué decisión tomar.
La estadística descriptiva reúne métodos para organizar, resumir, representar e interpretar los datos observados. Nos ayuda a responder preguntas como:
Alcance importante. La estadística descriptiva permite afirmar qué ocurre en los datos analizados. Por sí sola no demuestra causalidad ni garantiza que el patrón se mantenga en otros periodos o poblaciones. Si las ventas con descuento son mayores, todavía no podemos concluir que el descuento causó el aumento.
El análisis empresarial puede entenderse como una cadena:
La idea central del proyecto: no se evaluará cuántas estadísticas calculan, sino si las estadísticas elegidas permiten comprender el negocio y sostener una conclusión.
La unidad de observación es el elemento sobre el cual se registra información. Puede ser una persona, una empresa, un producto, una transacción, una ciudad o un periodo.
En Business Data Lab, cada fila representa principalmente una operación o transacción comercial. Esto cambia la interpretación:
Aunque una base tenga millones de filas, no debe asumirse automáticamente que representa toda la realidad. Puede excluir ventas no registradas, periodos anteriores, canales externos o transacciones con fallas en el sistema.
Una variable es una característica que puede tomar diferentes valores entre las unidades de observación.
| Tipo | ¿Qué representa? | Ejemplos empresariales | Operaciones apropiadas |
|---|---|---|---|
| Cualitativa nominal | Categorías sin orden natural | ciudad, canal, producto, devolución | conteos, porcentajes, moda |
| Cualitativa ordinal | Categorías con orden | satisfacción baja/media/alta, nivel de riesgo | conteos, porcentajes, mediana ordinal |
| Cuantitativa discreta | Conteos enteros | unidades, número de compras | media, mediana, dispersión |
| Cuantitativa continua | Mediciones en una escala | ingreso, costo, utilidad, tiempo | media, mediana, cuartiles, dispersión |
Que una variable esté guardada como número no significa que sea cuantitativa. Un código de cliente puede contener dígitos, pero sumar dos códigos no tiene interpretación. Es un identificador, no una cantidad.
La escala determina qué comparaciones tienen sentido.
| Escala | Propiedad principal | Ejemplo | Qué tiene sentido afirmar |
|---|---|---|---|
| Nominal | Solo diferencia categorías | canal | “App aparece más que teléfono” |
| Ordinal | Permite ordenar | calificación 1 a 5 | “4 es mayor que 3” |
| Intervalo | Diferencias comparables, cero no absoluto | temperatura °C | “aumentó 5 grados” |
| Razón | Cero real y razones interpretables | ingreso, unidades, días | “es el doble” |
Un diccionario evita analizar columnas cuyo significado no se comprende. Como mínimo debe registrar:
| Elemento | Pregunta que debe responder |
|---|---|
| Nombre | ¿Cómo aparece la variable en la base? |
| Definición | ¿Qué representa exactamente? |
| Tipo | ¿Es cualitativa o cuantitativa? |
| Escala | ¿Nominal, ordinal, intervalo o razón? |
| Unidad | ¿Pesos, días, unidades, porcentaje? |
| Valores válidos | ¿Qué categorías o rango son admisibles? |
| Faltantes | ¿Qué podría significar un NA? |
Analizar sin revisar la calidad de la información es como calcular la velocidad de un automóvil con el tablero apagado: el resultado puede tener decimales y seguir siendo inútil.
library(data.table)
ventas <- readRDS("Business_Data_Lab.rds")
# Dimensión de la base
dim(ventas)
# Tipo de cada variable
str(ventas)
# Cantidad y porcentaje de faltantes
faltantes <- data.table(
variable = names(ventas),
cantidad = sapply(ventas, function(x) sum(is.na(x)))
)
faltantes[, porcentaje := 100 * cantidad / nrow(ventas)]
faltantes[cantidad > 0][order(-porcentaje)]
# Identificadores repetidos
ventas[, .N, by = id_transaccion][N > 1]Conviene separar tres ideas:
Regla profesional: identificar un valor atípico no autoriza a borrarlo. Primero se investiga su origen; luego se documenta si se corrige, se excluye, se conserva o se analiza por separado.
Un NA puede significar que:
Si la satisfacción falta principalmente en tiendas físicas, los faltantes contienen información sobre el proceso de recolección. Eliminarlos sin revisar puede producir una visión sesgada de la experiencia del cliente.
Para una variable cualitativa, el primer resumen suele ser una tabla de frecuencias.
\[\text{Porcentaje de una categoría}=\frac{\text{frecuencia de la categoría}}{\text{total de observaciones}}\times 100\]
tabla_canal <- ventas[, .(
operaciones = .N
), by = canal]
tabla_canal[, porcentaje := 100 * operaciones / sum(operaciones)]
tabla_canal[order(-operaciones)]El segmento con más operaciones no tiene que ser el que genera más ingresos. Una tabla de conteos responde “¿dónde hay más transacciones?”, no “¿dónde se vende más?” ni “¿dónde se gana más?”.
Las medidas de tendencia central resumen la posición de una distribución. Ninguna es “la mejor” en todos los casos.
La media aritmética suma todos los valores y divide por el número de observaciones.
\[\bar{x}=\frac{x_1+x_2+\cdots+x_n}{n}\]
Ventajas: utiliza todos los valores y es útil para
cálculos posteriores.
Limitación: es sensible a valores extremos y a
distribuciones muy asimétricas.
La mediana es el valor que deja aproximadamente el 50 % de las observaciones por debajo y el 50 % por encima.
Ventajas: resiste mejor la influencia de valores
extremos.
Limitación: no refleja cuánto se alejan los valores ni
utiliza directamente sus magnitudes.
La moda es el valor o categoría con mayor frecuencia. Puede existir más de una moda o ninguna moda claramente útil.
Es especialmente apropiada para variables cualitativas: canal más frecuente, producto más vendido o ciudad con más operaciones.
pedidos <- c(180, 190, 205, 210, 215, 220, 225, 240, 250, 1800)
c(
media = mean(pedidos),
mediana = median(pedidos)
)## media mediana
## 373.5 217.5
La mayoría de los pedidos está alrededor de 180 a 250, pero un pedido de 1.800 eleva la media. La mediana representa mejor una operación habitual; el pedido grande no debe ocultarse, sino explicarse como parte de la cola superior.
| Situación | Medida que suele ayudar más | Razón |
|---|---|---|
| Distribución aproximadamente simétrica, sin extremos severos | Media | representa bien el centro y usa toda la información |
| Distribución asimétrica o con extremos | Mediana | es más resistente |
| Categoría más frecuente | Moda | identifica la mayor concentración |
| Presupuesto o resultado agregado | Media y total | el efecto de todos los valores sí importa |
| Comunicación completa | Media + mediana + gráfico | evita ocultar la forma de la distribución |
Si la media y la mediana difieren mucho, no hay que elegir una y esconder la otra. La diferencia es una pista sobre la asimetría, los extremos o la mezcla de grupos distintos.
Los percentiles dividen los datos ordenados en cien partes. El percentil 90 es un valor tal que aproximadamente el 90 % de las observaciones queda por debajo.
Los cuartiles son percentiles destacados:
## 0% 25% 50% 75% 90% 100%
## 180.0 206.2 217.5 236.2 405.0 1800.0
Los cuartiles no significan que cada intervalo tenga la misma amplitud; significan que contiene aproximadamente la misma proporción de observaciones.
Dos segmentos pueden tener la misma media y riesgos operativos completamente distintos.
segmento_estable <- c(95, 98, 100, 102, 105)
segmento_variable <- c(20, 60, 100, 140, 180)
data.frame(
segmento = c("Estable", "Variable"),
media = c(mean(segmento_estable), mean(segmento_variable)),
desviacion = c(sd(segmento_estable), sd(segmento_variable)),
minimo = c(min(segmento_estable), min(segmento_variable)),
maximo = c(max(segmento_estable), max(segmento_variable))
)Ambos promedian 100, pero el segundo segmento es mucho menos predecible.
\[Rango=\text{máximo}-\text{mínimo}\]
Es fácil de interpretar, pero depende únicamente de dos observaciones y cambia mucho ante un extremo.
\[RIC=Q_3-Q_1\]
Describe la amplitud del 50 % central de los datos. Es resistente a extremos y complementa naturalmente a la mediana.
La varianza resume las desviaciones cuadráticas respecto de la media. La desviación estándar es su raíz cuadrada y queda expresada en las mismas unidades de la variable.
\[s^2=\frac{\sum_{i=1}^{n}(x_i-\bar{x})^2}{n-1}\qquad s=\sqrt{s^2}\]
Una desviación mayor indica más variabilidad. Sin embargo, no debe interpretarse automáticamente como “la mayoría está exactamente a una desviación de la media”. Su lectura depende de la forma de la distribución.
\[CV=\frac{s}{\bar{x}}\times100\%\]
El CV expresa la dispersión relativa al promedio. Sirve para comparar estabilidad entre grupos con medias o escalas distintas, siempre que la variable tenga cero real y una media positiva alejada de cero.
El coeficiente de variación no es apropiado para variables con media cercana a cero o con valores positivos y negativos, como una utilidad que oscila alrededor de cero. Allí puede volverse enorme o perder sentido.
ventas[, .(
operaciones = .N,
media = mean(ingreso, na.rm = TRUE),
mediana = median(ingreso, na.rm = TRUE),
desviacion = sd(ingreso, na.rm = TRUE),
q1 = quantile(ingreso, .25, na.rm = TRUE),
q3 = quantile(ingreso, .75, na.rm = TRUE),
ric = IQR(ingreso, na.rm = TRUE),
cv_pct = 100 * sd(ingreso, na.rm = TRUE) /
mean(ingreso, na.rm = TRUE)
), by = canal]Una distribución es aproximadamente simétrica cuando sus dos lados presentan un comportamiento parecido.
La asimetría no debe diagnosticarse con una sola cifra. Conviene combinar histograma, diagrama de caja, media, mediana y conocimiento del negocio.
La curtosis ayuda a describir el peso de las colas y la presencia relativa de observaciones extremas. No es simplemente “qué tan puntiaguda” se ve una gráfica.
En el proyecto, asimetría y curtosis deben utilizarse para enriquecer una interpretación, no como etiquetas automáticas. Es mejor escribir “la distribución presenta una cola derecha explicada por pedidos corporativos” que limitarse a “es leptocúrtica”. El gerente no colecciona palabras raras; necesita entender el fenómeno.
Una regla exploratoria habitual considera potencialmente atípicos los valores menores que
\[Q_1-1.5(RIC)\]
o mayores que
\[Q_3+1.5(RIC).\]
Esta regla identifica observaciones alejadas del centro, pero no demuestra que sean errores.
q1 <- quantile(pedidos, .25)
q3 <- quantile(pedidos, .75)
ric <- IQR(pedidos)
limite_inferior <- q1 - 1.5 * ric
limite_superior <- q3 + 1.5 * ric
pedidos[pedidos < limite_inferior | pedidos > limite_superior]## [1] 1800
Antes de decidir qué hacer, pregunte:
Un gráfico es una forma de responder una pregunta, no decoración para que el informe “se vea estadístico”.
| Pregunta | Gráfico recomendado | Evite |
|---|---|---|
| ¿Cómo se distribuye una variable cuantitativa? | Histograma o densidad | gráfico circular |
| ¿Cómo comparar posición y dispersión entre grupos? | Cajas y bigotes | muchas medias sin dispersión |
| ¿Cómo se compone una variable cualitativa? | Barras ordenadas | circular con demasiadas categorías |
| ¿Cómo cambia una variable en el tiempo? | Líneas | barras desordenadas cronológicamente |
| ¿Cómo se relacionan dos variables cuantitativas? | Dispersión | unir puntos sin orden temporal |
Muestra la forma de una variable cuantitativa agrupando valores en intervalos. Su apariencia depende del número y ancho de los intervalos; por eso conviene probar una agrupación razonable y no manipularla para forzar una historia.
library(ggplot2)
# Para graficar millones de filas puede utilizarse una muestra reproducible
set.seed(2026)
muestra_grafica <- ventas[sample(.N, min(.N, 200000))]
ggplot(muestra_grafica[ingreso > 0], aes(x = ingreso)) +
geom_histogram(bins = 60, fill = "#1E638A", color = "white") +
scale_x_continuous(labels = scales::label_number(big.mark = ".")) +
labs(
title = "Distribución del ingreso por operación",
x = "Ingreso",
y = "Número de operaciones"
) +
theme_minimal()Resume mediana, cuartiles, RIC y observaciones potencialmente atípicas. Es excelente para comparar segmentos, aunque puede ocultar detalles de distribuciones multimodales.
ggplot(muestra_grafica[ingreso > 0], aes(x = canal, y = ingreso)) +
geom_boxplot(fill = "#EAF4F8", color = "#123B5D") +
coord_cartesian(ylim = quantile(muestra_grafica$ingreso, c(0, .95), na.rm = TRUE)) +
labs(
title = "Ingreso por canal",
subtitle = "La ventana visual llega hasta el percentil 95; los datos no se eliminan",
x = NULL,
y = "Ingreso"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 25, hjust = 1))Usar coord_cartesian() acerca la vista sin borrar
registros del análisis. Filtrar silenciosamente los extremos y luego
presentar el gráfico como si mostrara toda la base sería engañoso.
Cuando se comparan ciudades, canales o categorías, deben revisarse al menos cuatro dimensiones:
Además, una comparación empresarial suele necesitar resultados distintos:
resumen_canal <- ventas[estado_operacion == "Completada", .(
operaciones = .N,
ingreso_total = sum(ingreso, na.rm = TRUE),
ingreso_medio = mean(ingreso, na.rm = TRUE),
ingreso_mediano = median(ingreso, na.rm = TRUE),
utilidad_total = sum(utilidad, na.rm = TRUE),
margen_mediano = median(margen_pct, na.rm = TRUE),
cv_ingreso = sd(ingreso, na.rm = TRUE) /
mean(ingreso, na.rm = TRUE),
devolucion_pct = 100 * mean(devolucion == "Sí", na.rm = TRUE)
), by = canal]
resumen_canal[order(-ingreso_total)]Un canal puede tener:
No hay contradicción: cada indicador responde una pregunta distinta.
La base contiene operaciones completadas, canceladas y pendientes. El filtro correcto depende de la pregunta.
| Pregunta | Posible universo de análisis |
|---|---|
| ¿Cuántas solicitudes de compra ingresaron? | Todos los estados |
| ¿Cuál fue el ingreso efectivamente generado? | Operaciones completadas, según regla contable |
| ¿Cuál es la tasa de cancelación? | Completadas + canceladas; definir pendientes |
| ¿Cómo es la satisfacción? | Registros donde se recolectó respuesta válida |
| ¿Cómo funciona la logística? | Canales que requieren entrega |
Todo filtro importante debe declararse. “Se analizaron operaciones completadas con ingreso positivo” es una decisión verificable. Eliminar filas porque “se veían raras” no lo es.
Un resultado es una cifra. Un hallazgo es una afirmación relevante respaldada por varias piezas de evidencia y situada en el contexto del negocio.
Una frase clara que describa qué se descubrió.
Medidas, porcentajes, comparaciones y gráficos que sostienen la afirmación.
Explicación de qué significa el patrón y cuáles son sus límites.
Razón por la cual debería importarle a la gerencia y qué pregunta o decisión abre.
Resultado débil: “Marketplace tiene una utilidad promedio de X”.
Hallazgo más sólido: “Marketplace concentra un volumen importante de operaciones, pero su margen mediano es menor y presenta mayor porcentaje de devoluciones que otros canales. El canal aporta escala, aunque sus costos comerciales y logísticos podrían estar reduciendo la rentabilidad. La empresa debería revisar si el crecimiento del volumen compensa esos costos.”
Antes de escribir una conclusión, compruebe que puede recorrer estos cuatro niveles:
No salte del nivel 2 a una explicación causal. Si clientes con descuentos altos compran más unidades, puede hablarse de una asociación observada. Para demostrar el efecto causal del descuento sería necesario un diseño y análisis adicional.
Con una base grande, data.table permite resumir millones
de filas de manera eficiente. No hace falta imprimir la base completa ni
llevarla a Excel.
library(data.table)
library(ggplot2)
# 1. Cargar
ventas <- readRDS("Business_Data_Lab.rds")
# 2. Reconocer
dim(ventas)
names(ventas)
str(ventas)
# 3. Auditar sin duplicar toda la base
ventas[, id_duplicado := duplicated(id_transaccion) |
duplicated(id_transaccion, fromLast = TRUE)]
ventas[, satisfaccion_valida :=
is.na(satisfaccion) |
satisfaccion %between% c(1, 5)]
# 4. Definir el universo para una pregunta concreta
idx_completadas <- ventas$estado_operacion == "Completada" &
!is.na(ventas$ingreso) &
ventas$ingreso > 0
# 5. Resumir
resumen <- ventas[idx_completadas, .(
n = .N,
total = sum(ingreso),
media = mean(ingreso),
mediana = median(ingreso),
desviacion = sd(ingreso),
ric = IQR(ingreso)
), by = canal]
# 6. Comparar e interpretar
resumen[order(-total)]fread() para CSV y readRDS() para
RDS.data.table antes de graficar.set.seed() cuando use
muestras.Una muestra puede ser adecuada para visualizar la forma de una distribución, mientras que los indicadores finales pueden calcularse con toda la base. Debe explicarse cuándo y para qué se usó la muestra.
Para cada pregunta empresarial siga esta secuencia:
Pregunta: ¿qué queremos comprender del negocio?
Universo: ¿qué operaciones se incluyeron y por qué?
Variables: ¿qué representa cada una?
Herramientas: ¿por qué estas medidas y gráficos son apropiados?
Evidencia: ¿qué cifras o patrones sostienen la respuesta?
Interpretación: ¿qué significa y qué no permite concluir?
Implicación: ¿qué debería revisar o decidir la empresa?
Antes de abrir la solución del proyecto, seleccione una variable cuantitativa y una cualitativa de la base. Para cada una, escriba:
La estadística descriptiva no consiste en reducir una base a un promedio. Consiste en reconocer que el centro, la variabilidad, la forma, los extremos, los faltantes y las diferencias entre segmentos cuentan partes distintas de la historia.
Un buen analista no pregunta primero “¿qué función de R utilizo?”. Pregunta:
¿Qué necesita comprender la empresa, qué evidencia permitiría responderlo y qué tan lejos puedo llegar con los datos disponibles?
Cuando esa pregunta está clara, el código deja de ser el protagonista y se convierte en lo que debe ser: una herramienta para pensar mejor.