

Cuando nos subimos a un auto observamos un tablero con muchos indicadores que permiten al conductor validar el estado del vehículo. Todos los podemos visualizar al tiempo con el fin de darnos una idea del nivel de combustible, la temperatura, el estado de la batería, si alguna puerta está abierta, la velocidad a la que se viaja, entre otros.
Al igual que la situación anterior, cuando nos enfrentamos a un análisis de datos, requerimos resumirlos en indicadores, tablas y gráficos que nos permitan un análisis más fácil.
Tomaremos una base de datos de clientes para analizar indicadores asociados a hábitos de compra y características generales.
library(DT)
# CAMBIAR DATA ---------------------------------------------------
DT::datatable(head(clientes, 218),fillContainer = FALSE, options = list(pageLength = 8))
# DT::datatable(head(Visitantes, 389455),fillContainer = FALSE, options = list(pageLength = 8))
Las bases de datos utilizadas se encuentran en el directorio
data/ del curso.

Las distribuciones de frecuencia o también llamadas tablas de frecuencia nos sirven para agrupar los datos y así permitir resumir para poder tener una idea más clara de sus características.
Para las variables cualitativas la tabla posee 3 columnas :
c1: los diferentes valores que toma la variable.
c2: frecuencia absoluta que consiste en el conteo para cada uno de los valores distintos que toma la variable.
c3: frecuencia relativa que corresponde al porcentaje de la cantidad de datos para cada uno de los valores.
# Forma simple
# tabla1 <- table(Visitantes$Mes)
# names(tabla1) <- c("Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic")
# tabla1
# Forma simple
# CAMBIAR DATA ---------------------------------------------------
table(clientes$categoria_preferida)
Alimentos Deportes Electrónica Hogar Ropa
238 191 198 184 189
#utilizando summarytools
categoria=as.factor(clientes$categoria_preferida)
summarytools::freq(categoria, cumul = FALSE)
Frequencies
| Freq | % Valid | % Total | |
|---|---|---|---|
| Alimentos | 199 | 19.90 | 19.90 |
| Deportes | 210 | 21.00 | 21.00 |
| Electrónica | 215 | 21.50 | 21.50 |
| Hogar | 206 | 20.60 | 20.60 |
| Ropa | 170 | 17.00 | 17.00 |
| Total | 1000 | 100.00 | 100.00 |
Para las variables cuantitativas las tablas de frecuencias tienen una presentación diferente a la vista anteriormente. Como se trata de variables con un gran número de valores diferentes, es necesario dividirlas por intervalos.
Pensemos ahora en las notas de 90 estudiantes que cursaron Matemáticas Fundamentales en su primer semestre y obtuvieron las siguientes notas:
nf=c(4.1, 2.7, 3.1, 3.2, 3.0, 3.2, 2.0, 2.4, 1.6, 3.2, 3.1, 2.6, 2.0, 2.4, 2.8, 3.3, 4.0, 3.4, 3.0, 3.1, 2.7, 2.7, 3.0, 3.8, 3.2, 2.2, 3.5, 3.5, 3.8, 3.5, 3.9, 4.2, 4.3, 3.9, 3.2, 3.5, 3.5, 3.7, 4.1, 3.7, 3.5, 3.6, 3.2, 3.1, 3.4, 3.0, 3.0, 3.0, 2.7, 1.7, 3.6, 2.1, 2.4, 3.0, 3.1, 2.5, 2.5, 3.6, 2.2, 2.4, 3.1, 3.3, 2.7, 3.7, 3.0, 2.7, 3.0, 3.2, 3.1, 2.4, 3.0, 2.7, 2.5, 3.0, 3.0, 3.0, 3.2, 3.1, 3.8, 4.1, 3.7, 3.5, 3.0, 3.7, 3.7, 4.1, 3.7, 3.9, 3.7, 2.0)
nf
[1] 4.1 2.7 3.1 3.2 3.0 3.2 2.0 2.4 1.6 3.2 3.1 2.6 2.0 2.4 2.8 3.3 4.0 3.4 3.0
[20] 3.1 2.7 2.7 3.0 3.8 3.2 2.2 3.5 3.5 3.8 3.5 3.9 4.2 4.3 3.9 3.2 3.5 3.5 3.7
[39] 4.1 3.7 3.5 3.6 3.2 3.1 3.4 3.0 3.0 3.0 2.7 1.7 3.6 2.1 2.4 3.0 3.1 2.5 2.5
[58] 3.6 2.2 2.4 3.1 3.3 2.7 3.7 3.0 2.7 3.0 3.2 3.1 2.4 3.0 2.7 2.5 3.0 3.0 3.0
[77] 3.2 3.1 3.8 4.1 3.7 3.5 3.0 3.7 3.7 4.1 3.7 3.9 3.7 2.0
Cuando tenemos los datos sin agrupar nos es difícil extraer información que nos permita hacer un análisis de los mismos
Una primera aproximación puede ser el diagrama de tallos y hojas, que consiste en separar los dígitos de los datos en dos: una primera parte que se repite, llamada tallo, y otra parte que tiene diversos valores. Este diagrama también nos permite ordenar los datos de menor a mayor.
stem(nf)
The decimal point is at the |
1 | 67
2 | 00012244444
2 | 555677777778
3 | 0000000000000011111111222222223344
3 | 555555566677777777888999
4 | 0111123
Vamos a leer la línea 4 de la tabla:
Una forma de construir una tabla de frecuencias por intervalos es
utilizando la función graph.freq del paquete agricolae.
library(agricolae)
k <- 6
brks <- pretty(range(nf, na.rm = TRUE), n = k)
h2 <- agricolae::graph.freq(nf, plot = FALSE, breaks = brks)
t2 <- agricolae::table.freq(h2)
colnames(t2) <- c("LI","LS","Marca_Clase","Frec.Abs","Frec.Rel","Frec.Abs.Ac","Frec.Rel.Ac")
t2
LI LS Marca_Clase Frec.Abs Frec.Rel Frec.Abs.Ac Frec.Rel.Ac
1 1.5 2.0 1.75 2 2.2 2 2.2
2 2.0 2.5 2.25 11 12.2 13 14.4
3 2.5 3.0 2.75 12 13.3 25 27.8
4 3.0 3.5 3.25 34 37.8 59 65.6
5 3.5 4.0 3.75 24 26.7 83 92.2
6 4.0 4.5 4.25 7 7.8 90 100.0
En el caso de las notas se requiere un tratamiento especial al
momento de contruir los intervalos, pues el intervalo 2.5 a 3.00, debe
contener los estudiantes que perdieron, por tanto se tienen en cuenta
hasta 2.99 y de esta forma no se incluyen los que obtuvieron como nota
final 3.0, solo los de 2.5 a 2.99. En estos casos se emplea la función
cut
nota <- cut(
nf,
breaks = c(0, 0.99, 1.99,2.99,3.99,5), # cubre TODO
right = FALSE, # [a, b) incluye el límite izquierdo
include.lowest = TRUE
)
levels(nota) <- c(
"0.0 - 0.9",
"1.0 - 1.9",
"2.0 - 2.9",
"3.0 - 3.9",
"4.0 - 5.0")
as.data.frame(table(nota))
nota Freq
1 0.0 - 0.9 0
2 1.0 - 1.9 2
3 2.0 - 2.9 23
4 3.0 - 3.9 58
5 4.0 - 5.0 7
Es un número que divide la muestra en dos partes. \(x\) % de los datos de la muestra son iguales o menores que \(P_{x}\) y un \((100-x)\) % por encima de él.

Para ilustrar el concepto, pensemos en que participamos de una carrera y que el grupo está conformado por 100 corredores. El percentil dará cuenta de mi posición dentro del grupo. Por ejemplo, si mi posición en la carrera en orden de llegada es la décima posicion, indica que depues de mi llegada lo hicieron 90 atletas. Indica esto que soy el percentil 90 (\(P_{90}\)).
Qué significado tiene:
Participar en una carrera K10 y ocupar el percentil 30 : \(P_{30}\)
Una nota en un examen de matemáticas ocupó el percentil 90 : \(P_{90}\)
Que significa: \(P_{25}\) ; \(P_{50}\) ; \(P_{75}\)
# Paquetes
library(ggplot2)
# ---- Datos de ejemplo (puedes reemplazar "tiempo" por tu vector real) ----
set.seed(123)
tiempo <- c(rnorm(50, mean = 10, sd = 2.8), 0.5, 18.8) # incluye 2 atípicos aprox.
# ---- Cálculos: Q1, mediana, Q3, RIQ y cercas (fences) ----
Q1 <- unname(quantile(tiempo, 0.25, type = 7))
Q2 <- unname(quantile(tiempo, 0.50, type = 7))
Q3 <- unname(quantile(tiempo, 0.75, type = 7))
RIQ <- Q3 - Q1
LI_low <- Q1 - 1.5 * RIQ
LI_high <- Q3 + 1.5 * RIQ
# Atípicos (según 1.5*RIQ)
outliers <- tiempo[tiempo < LI_low | tiempo > LI_high]
df_out <- data.frame(tiempo = outliers, y = 1)
# ---- Gráfico ----
p <- ggplot(data.frame(tiempo = tiempo), aes(x = tiempo, y = 1)) +
# Caja
geom_boxplot(
width = 0.55,
fill = c32, alpha = 0.85,
color = c41, outlier.shape = NA
) +
# Puntos atípicos (manuales para poder etiquetar)
geom_point(
data = df_out,
aes(x = tiempo, y = y),
size = 2.8, color = c21
) +
# Líneas verticales punteadas (límites 1.5*RIQ)
geom_vline(xintercept = LI_low, linetype = "dashed", linewidth = 1, color = c41) +
geom_vline(xintercept = LI_high, linetype = "dashed", linewidth = 1, color = c41) +
# Etiquetas Q1, Q2, Q3
annotate("text", x = Q1-0.3, y = 1.22, label = "Q1", fontface = "bold", color = c41) +
annotate("text", x = Q2-0.3, y = 1.22, label = "Q2", fontface = "bold", color = "white") +
annotate("text", x = Q3+0.3, y = 1.22, label = "Q3", fontface = "bold", color = c41) +
# Texto "mediana" dentro de la caja
annotate("text", x = Q2+0.8, y = 1.22, label = "mediana", fontface = "bold", color = "white") +
# Labels tipo “cajita” para atípicos (izq y der si existen)
{
if (length(outliers) > 0) {
# Toma el menor y el mayor outlier para ubicar etiquetas a ambos lados
left_o <- min(outliers)
right_o <- max(outliers)
list(
annotate("label", x = left_o, y = 1.10, label = "atípico",
fill = c21, color = "white", label.size = 0, alpha = 0.95),
annotate("label", x = right_o, y = 1.10, label = "atípico",
fill = c21, color = "white", label.size = 0, alpha = 0.95)
)
}
} +
# Labels de los límites (como en tu imagen)
annotate("label", x = LI_low, y = 0.75,
label = "LI = Q1 - 1.5(Q3-Q1)",
fill = c41, color = "white", label.size = 0, alpha = 0.95) +
annotate("label", x = LI_high, y = 0.75,
label = "LI = Q3 + 1.5(Q3-Q1)",
fill = c41, color = "white", label.size = 0, alpha = 0.95) +
# Ejes / tema
scale_y_continuous(NULL, breaks = NULL) +
labs(x = "tiempo") +
theme_minimal(base_size = 14) +
theme(
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
panel.grid.minor.x = element_line(alpha = 0.25),
panel.grid.major.x = element_line(alpha = 0.35),
plot.background = element_rect(fill = "white", color = NA),
panel.background = element_rect(fill = c42, color = NA)
)
p

Este gráfico se contruye con los siguiente elementos
\(LI =Q_1 - 1.5(Q_3-Q_1)\) : límite inferior, que determina si se contiene un valor atipico si existen valores inferiores a el
\(Q_1\) : cuartil 1 (\(Q_1\)) o percentil 25 (\(P_25\))
\(Q_2\) : cuartil 2 (\(Q_2\)), percentil 50 (\(P_50\)) o tambien la Mediana
\(Q_3\) : cuartil 3 (\(Q_3\)) o percentil 75 (\(P_75\))
\(LS =Q_3 + 1.5(Q_3-Q_1)\) : límite superior, que determina si se contiene un valor atipico si existen valores superiores a el
Con ayuda del diagrama de tallos y hojas es posible ubicar los percentiles en un conjunto de datos
#set.seed(567)
# edad = sample(clientes$edad_cliente, 50)
edad = c(41, 30, 68, 41, 43, 32, 56, 35, 30, 53, 43, 19, 20, 26, 36, 56, 33, 28, 64, 36, 41, 30, 67, 60, 53, 43, 26, 40, 27, 49, 69, 48, 52, 28, 38, 47, 44, 22, 21, 18, 62, 22, 45, 49, 33, 40, 18, 34, 67, 56)
stem(edad)
The decimal point is 1 digit(s) to the right of the |
1 | 889
2 | 012266788
3 | 00023345668
4 | 00111333457899
5 | 233666
6 | 0247789
En este caso el valor mínimo (18) y el máximo (69) corresponden a los extremos observados de la variable.
Ahora determine en este diagrama los percentiles :
Es más rápido utilizando la función de R : quantile
quantile(edad, c(0.10, 0.25, 0.50, 0.75))
10% 25% 50% 75%
21.90 30.00 40.50 51.25
| Percentiles | Divide la muestra en 100 partes de igual porcentaje, cada una con un 1%. \(P_{1}, P_{2}, \dots P_{99}\) |
| Deciles | Dividen la muestra en 10 parte de igual porcentaje, cada una con un 10%. \(D_{1}, D_{2}, \dots D_{9}\) |
| Quintiles | Dividen la muestra en 5 partes de igual porcentaje, cada una con un 20%. \(K_{1}, K_{2}, K_{3}, K_{4}\) |
| Cuartiles | Dividen la muestra en 4 partes de igual porcentaje, cada una con un 25%. \(Q_{1}, Q_{2}, Q_{3}\) |
| Central | Dispersión | Forma |
|---|---|---|
| media | rango | sesgo o asimetría |
| mediana | varianza | curtosis |
| moda | desviación estándar | |
| media truncada | coeficiente de variación | |
| rango medio | ||
| media armónica | ||
| media geométrica | ||
| media ponderada |
\[\bar{x}= \frac{1}{n} \sum_{i=1}^{n} x_{i}\]
Es uno de los indicadores estadísticos más conocidos y empleados por la gran mayoría de las personas
Propiedades de la media :
La suma de las desviaciones de los datos con respecto a la media es cero. \(\sum (x_{i}-\bar{x})=0\).
La suma de los cuadrados de las desviaciones de los datos con respecto a un valor \(a\) es mínimo cuando \(a=\bar{x}\).
Si \(x_{i}=k\) para todo \(i\), entonces, \(\bar{x}=k\).
Si a todos los datos de una variable se le suma una constante \(k\), es decir \(y_{i}=x_{i} + k\), entonces \(\bar{y}=\bar{x} +k\)
Si todos los datos de una variable se multiplican por una constante \(k\), es decir \(y_{i}=kx_{i}\), entonces \(\bar{y}=k\bar{x}\)
Si \(z_{i}=a x_{i}+b y_{i}\), donde: a, b constantes y \(x_{i}\), \(y_{i}\) variables, entonces: \(\bar{z}=a\bar{x}+b\bar{y}\).
El promedio de edad de los clientes se obtiene con:
mean(edad,na.rm = TRUE)
[1] 40.78
cat("media : ", mean(edad,na.rm = TRUE))
media : 40.78
El valor promedio de ingresos de los clientes se obtiene con:
#ingresos = sample(clientes$ingresos, 50)
ingresos = c(112050, 80072, 104099, 54530, 145251, 101929, 69718, 103675, 109683, 114460, 98434, 141044, 136072, 67489, 119350, 95647, 106056, 145291, 70400, 37984, 121469, 91926, 125635, 150000, 132742, 52620, 132933, 146043, 128391, 113604, 91400, 128127, 84802, 57368, 141404, 100410, 127152, 53548, 96133, 104872, 99625, 134255, 58500, 128575, 83955, 108677, 118430, 131466, 71134, 128893)
mean(ingresos, na.rm = TRUE)
[1] 105146.5
El promedio del conjunto de números enteros entre uno y diez es 5.5
x=sample(1:100, 10, replace = TRUE)
x
[1] 25 52 22 89 32 25 87 35 40 30
cat("suma :", sum(x), "\n")
suma : 437
cat("media :",mean(x))
media : 43.7
Surge el problema de qué se puede tener este indicador cuando uno de sus datos cambia drásticamente. Por ejemplo, si se cambia el último dato (10) por otro valor como 100, ¿qué pasaría con la media?
En este caso el promedio se eleva por el cambio realizado. Esto puede suceder en algunos casos donde trabajamos información que puede presentar datos extremos o atípicos.
x=1:10
x[10]=100
x
[1] 1 2 3 4 5 6 7 8 9 100
cat("media :" ,mean(x))
media : 14.5
Me :Es el número que divide la muestra en dos partes de igual proporción (50% : 50%). Es decir que corresponde a:
\[P_{50} = D_{5} = Q_{2}\]
también corresponde a la línea central del diagrama de cajas.
median(clientes$edad_cliente,na.rm = TRUE)
[1] 45
boxplot(clientes$edad_cliente, las=1, horizontal = TRUE, col = c21)

La Me corresponde a la línea central de la caja en el diagrama de cajas.
La mediana es más robusta a los cambios en los datos extremos. En presencia de datos atípicos es mejor utilizar la mediana en lugar de la media.
x=1:10
x
[1] 1 2 3 4 5 6 7 8 9 10
cat("media :" ,median(x))
media : 5.5
x[10]=20
x
[1] 1 2 3 4 5 6 7 8 9 20
cat("media :" ,median(x))
media : 5.5
Mo : Dato o valor que más se repite. Es utilizada como medida de tendencia central en variables cualitativas o en cuantitativas discretas con pocos valores. En una tabla o gráfico se puede distinguir fácilmente.
# Tabla de frecuencias y porcentajes
tabla_categoria <- table(clientes$categoria_preferida, useNA = "ifany")
resumen_categoria <- data.frame(
Categoria = names(tabla_categoria),
Frecuencia = as.integer(tabla_categoria),
Porcentaje = round(100 * prop.table(tabla_categoria), 2)
)
knitr::kable(resumen_categoria)
| Categoria | Frecuencia | Porcentaje.Var1 | Porcentaje.Freq |
|---|---|---|---|
| Alimentos | 238 | Alimentos | 23.8 |
| Deportes | 191 | Deportes | 19.1 |
| Electrónica | 198 | Electrónica | 19.8 |
| Hogar | 184 | Hogar | 18.4 |
| Ropa | 189 | Ropa | 18.9 |
moda: la categoría con mayor frecuencia.
Con el fin de evitar que los datos atípicos generen sesgos en el indicador de la media, es posible separar el 90% de los datos, quitando un 5% de los datos más pequeños y un 5% de los datos mayores. A este indicador se le llama media truncada al 10% (\(\bar{x}_{_{0.10}}\)).
mean(clientes$edad_cliente, na.rm = TRUE, trim = 0.10)
[1] 43.87
\[\frac{1}{2}\Big(max(x)+min(x)\Big)\]
(max(clientes$edad_cliente,na.rm = TRUE)+min(clientes$edad_cliente,na.rm = TRUE))/2
[1] 43.5
La diferencia entre el valor máximo y el mínimo corresponde al rango
de la variable.
Este indicador de tendencia central se utiliza para promediar tasa de crecimiento o de interés. Para encontrar su valor se multiplican los valores de \(n\) tasas incrementadas en uno (\(1+r\)). A ese producto se le extrae la raíz n-esima.
\[MG = \Bigg(\displaystyle\prod_{i=1}^n (r_{i}+1)\Bigg)^{1/n}\]
La inflación anual (IPC, variación anual a diciembre) de los últimos 5 años completos en Colombia (2021–2025), según comunicados del DANE:
| Año | 2021 | 2022 | 2023 | 2024 | 2025 |
|---|---|---|---|---|---|
| Inflación anual (Dic vs Dic) | 5.62% | 13.12% | 9.28% | 5.20% | 5.10% |
# install.packages("psych")
library(psych)
x <- c(0.0562,0.1312,0.0928,0.0520,0.0510)
psych::geometric.mean(x, na.rm = TRUE)
[1] 0.07108179
\[\text{inflación promedio : } 7.11 \%\]
\[H = \dfrac{n}{\frac{1}{x_{1}}+\frac{1}{x_{2}}+ ... + \frac{1}{x_{n}}} \]
Este indicador corresponde al inverso de la media aritmética
Un equipo tiene 3 personas que realizan la misma tarea repetitiva (por ejemplo: revisar formularios). Medimos su productividad en tareas/hora:
El promedio que represente el tiempo típico por tarea cuando todos hacen tareas del mismo tipo, conviene usar media armónica porque productividad es una tasa.
\[x_1 = 12,\quad x_2 = 8,\quad x_3 = 6 \qquad \text{(tareas/hora)}\] \[H=\frac{n}{\frac{1}{x_1}+\frac{1}{x_2}+\frac{1}{x_3}}\]
Calculamos:
\[H=\frac{3}{\frac{1}{12}+\frac{1}{8}+\frac{1}{6}} = 8 \ \text{tareas/hora}\]
Supongamos que solo se nos dice que un grupo conformado por 4 personas tiene un promedio de edad de \(20\) años. Todos inicialmente suponemos que se trata de cuatro jóvenes que tienen edades cercanas a \(20\) años. Pero puede ocurrir que estemos lejos de acertarlo, pues existen múltiples combinaciones de edades que tienen como promedio \(20\) años.
Por ello es necesario tener más información sobre el grupo.
| Grupo 1 | Grupo 2 |
| Edades : 19, 22, 18, 21 | Edades : 39, 38, 2, 1 |
| Promedio : 20 años | Promedio : 20 años |

Hace falta otro indicador que nos oriente de cuál grupo hablamos
cuando solo tenemos como información: media = \(20\) años. Esta necesidad la suplen los
indicadores de dispersión.
\(r = max(x) - min(x)\)
En caso de los dos grupos:
| Grupo 1 | Grupo 2 |
|---|---|
| \(\bar{x} = 20\) años | \(\bar{x} = 20\) años |
| \(r = 4\) años | \(r = 38\) años |
Es importante hacer notar que si además de la media conocemos también un indicador de dispersión, en este caso el rango, podemos intuir si se trata del primero o segundo grupo. El rango es un indicador muy útil cuando se deben realizar cálculos rápidos.
Es la medida de dispersión más utilizada en estadística y está definida por
\[s^{2}=\frac{1}{n-1} \sum_{i=1}^{n} (x_{i}-\bar{x})^{2}\]
\(s^{2} = \frac{1}{n} \sum x_{i}^{2}- (\bar{x})^{2}\)
La varianza es siempre no negativa \(s^{2} >=0\)
La varianza de una constante es cero \(s_{k}^{2}=0\)
Si \(y_{i}= x_{i} + k\), entonces \(s_{y}^{2}= s_{x}^{2}\)
Si \(y_{i}=k x_{i}\), entonces \(s_{y}^{2}= k^{2} s_{x}^{2}\)
Si \(y_{i}=x_{i} + k\) , entonces \(s_{y}^{2} = s_{x}^{2}\)
Si \(z_{i} = a x_{i} + b y_{i}\), entonces \(s_{z}^{2}\) = \(a^{2}s_{x}^{2}\) + \(b^{2}s_{y}^{2}\) + \(2ab\) \(cov(xy)\)
La varianza se puede interpretar como el promedio de las diferencias cuadradas entre cada uno de los datos y la media
El problema de la varianza es su interpretación
Sus unidades son al cuadrado y en la mayoría de los casos no es posible interpretarlos. Por esta razón se optó por utilizar otra medida de dispersión.
Es la raíz cuadrada de la varianza
\[s=\sqrt{s^{2}}\]
no aplican todas las propiedades de la varianza
cat( "Varianza :",var(clientes$edad_cliente),"años cuadrados", "\n" )
Varianza : 226.2682 años cuadrados
cat("Desviación estándar :",sd(clientes$edad_cliente),"años")
Desviación estándar : 15.04221 años
Aunque la desviación estándar reduce el problema debido a tener las mismas unidades de la variable, es útil para comparación de dos grupos
Nos indica qué tan grande o qué tan pequeña es la desviación estándar con respecto a su media.
\[CV= \dfrac{s}{\bar{x}} \times 100 \% \]
Existen diferentes reglas empíricas para la interpretación del coeficiente de variación. Una de ellas establece como límite el 20% para separar los grupos homogéneos de los heterogéneos. Por lo general se utiliza un valor hasta el 20% para determinar que un grupo de datos es homogéneo; de lo contrario, se calificará como heterogéneo.
cat("Coeficiente de variación :",sd(clientes$edad_cliente)/mean(clientes$edad_cliente)*100, " %")
Coeficiente de variación : 34.35629 %
En este caso se obtiene un valor del coeficiente de variación que indica la dispersión relativa de la edad de los clientes, pudiendo calificar la variable como más homogénea o heterogénea según el valor obtenido.
Se mide a través del coeficiente de curtosis que mide cuán puntiaguda es una distribución respecto a la curva de la distribución normal estándar.
De acuerdo con su valor, la puntiagudez de los datos puede clasificarse en tres grupos:
Leptocúrtica, con valores grandes para el coeficiente ( CA>0)
Mesocúrtica, con valores medianos para el coeficiente ( CA=0)
Platicúrtica, con valores pequeños para el coeficiente ( CA<0)

\[CA = \dfrac{1}{s^{4}}\Bigg(\dfrac{1}{n}
\sum_{i=1}^{n} (x-\bar{x})^{4} \Bigg) - 3\]
rapportools::kurtosis(clientes$edad_cliente)
[1] -1.19632
Mide que tanto la forma de la distribución de frecuencias de los datos es simétrica o no con respecto a la media. Esta característica de los datos se mide a través del coeficiente de asimetría o sesgo.
Es simétrica si el valor del indicador es 0 (\(\bar{x}=Me\))
Es asimétrica a la izquierda si el valor del indicador es negativo (\(\bar{x}<Me\))
Es asimétrica a la derecha si el valor del indicador es positivo (\(\bar{x}>Me\))

\[CA = \dfrac{1}{s^{4}}\Bigg(\dfrac{1}{n} \sum_{i=1}^{n} (x-\bar{x})^{4} \Bigg) - 3\]
rapportools::skewness(clientes$edad_cliente)
[1] -0.04586223
El valor obtenido para el sesgo nos indica que existe un sesgo positivo o a la derecha (mucho con poco - poco con mucho). Este resultado se interpreta como una mayor concentración de valores bajos y pocos valores altos.
psych::describe(clientes["edad_cliente"])
vars n mean sd median trimmed mad min max range skew
edad_cliente 1 1000 43.78 15.04 45 43.87 19.27 18 69 51 -0.05
kurtosis se
edad_cliente -1.2 0.48
psych::describe(mtcars["mpg"])
vars n mean sd median trimmed mad min max range skew kurtosis se
mpg 1 32 20.09 6.03 19.2 19.7 5.41 10.4 33.9 23.5 0.61 -0.37 1.07
# CAMBIAR DATA ---------------------------------------------------
d1=density(clientes$edad_cliente, na.rm=TRUE); plot(d1, col = c41, lwd = 2)

d2=density(clientes$ingresos); plot(d2, col = c61, lwd = 2)

| Estadística | fórmula | código R |
|---|---|---|
| centro | ||
| media aritmética | \(\displaystyle\dfrac{1}{n}\sum_{i=1}^{n} x_{i}\) | mean(x) |
| mediana | \(Me = P_{50} = X_{n+1/2}\) | median(x) |
| moda | \(Mo\) dato que más se repite | |
| media truncada | media calculada con el 90% central de los datos | mean(x,trim=10/100) |
| rango medio | \(rm=\dfrac{min\{x\}-max\{x\}}{2}\) | max(x)-min(x) |
| media geométrica | \((x_{1} \times x_{2} \times x_{3} .... x_{n})^{1/n}\) | |
| media armónica | \(\dfrac{n}{\dfrac{1}{x_{1}}+\dfrac{1}{x_{2}}+\dfrac{1}{x_{3}}+...+\dfrac{1}{x_{n}}}\) | |
| dispersión | ||
| rango | \(r= max\{x\}-min\{x\}\) | max(x)-min(x) |
| varianza | \(s^{2} = \dfrac{1}{n-1} \displaystyle\sum_{i=1}^{n}(x_{i}-\bar{x})^{2}\) | var(x) |
| desviación estandar | \(s = \sqrt{s^{2}}\) | sd(x) |
| coeficiente de variación | \(cv= \dfrac{s}{\bar{x}} \times 100\) % | sd(x)/mean(x)*100 |
| forma | ||
| coeficiente de curtosis | \(\displaystyle\dfrac{Q_{3}-Q_{1}}{P_{90}-P_{10}}\) | rapportools::kurtosis(bpe$promedio) |
| coeficiente de asimetría | \(\displaystyle\dfrac{3(\bar{x}-Me)}{s}\) | rapportools::skewness(bpe$promedio) |
| percentil 25 | \(X_{n \times 0.25}\) | quantile(x,0.25) |
| percentil 50 | \(X_{n \times 0.50}\) | quantile(x,0.50) |
| percentil 75 | \(X_{n \times 0.75}\) | quantile(x,0.75) |
| rango intercuartílico | \(Q_{3}-Q_{1}\) |
![]() |
Los siguientes datos corresponden al nivel de ansiedad de un grupo de estudiantes de la universidad, valorados antes de la presentación del primer examen parcial. El investigador a cargo del proyecto utilizó una prueba para medir el nivel de ansiedad que permite puntajes entre 0 y 100. Los valores inferiores a 50 puntos se consideran como nivel bajo. Entre 50 y 80, nivel medio y superiores a 80 se consideran altos. |
Otra variable importante en el análisis corresponde a la facultad a la que pertenece el estudiante
Los resultados obtenidos se presenta a continuación :
nivans=c(28,33,34,36,38,38,41,41,45,45,46,46,47,47,48,48,49,50,51,51,51,52,53,53,
53,54,54,54,55,55,55,56,56,56,57,57,58,60,61,61,61,62,63,64,64,65,65,65,
65,65,66,67,67,68,68,68,69,69,69,70,70,71,74,77,77,78,79,79,80,82,85,89,
90,96,58,90,77,71,41,55,53,65,57,56,68,56,50,36,70,57,41,62,48,67,33,52,
65,67,79,55,34,46,55,56,47,69,61,54,74,47,64,79,85,61,28,46,65,51,49,45,
78,96,68,38,77,34,69,69,38,65,63,68,48,53,82,61,51,45,66,65,64,70,89,51,
54,53,80,54,60,53)
fac=c(2,1,2,2,4,3,4,2,4,2,4,1,1,1,1,1,1,2,3,3,3,3,1,2,1,2,2,1,1,2,3,2,3,2,2,3,3,
1,1,1,2,1,2,2,2,3,1,1,3,1,4,3,1,3,2,1,2,3,4,3,2,3,4,4,1,3,4,4,2,2,1,4,2,1,
2,4,1,1,1,3,4,1,1,1,1,1,3,3,3,3,1,1,1,2,2,1,3,1,1,1,3,2,2,2,2,1,2,2,1,3,2,
1,2,2,2,4,2,1,3,4,1,1,3,1,2,2,2,1,3,3,1,1,2,2,3,3,3,1,4,3,1,2,4,2,2,1,2,3,
2,2)
data=data.frame(fac, nivans) # forma base de datos
Primera forma : Utilizando el paquete
agricolae
h2=with(data,graph.freq(nivans,plot=FALSE))
t2=table.freq(h2);
colnames(t2) = c(" LI ", " LS ", "marca clase'", "Frec.Abs","Frec.Rel", "Frec.Abs.Ac","Frec.Rel.Ac")
t2
LI LS marca clase' Frec.Abs Frec.Rel Frec.Abs.Ac Frec.Rel.Ac
1 28.0 36.5 32.25 9 6.0 9 6.0
2 36.5 45.0 40.75 8 5.3 17 11.3
3 45.0 53.5 49.25 35 23.3 52 34.7
4 53.5 62.0 57.75 32 21.3 84 56.0
5 62.0 70.5 66.25 40 26.7 124 82.7
6 70.5 79.0 74.75 10 6.7 134 89.3
7 79.0 87.5 83.25 10 6.7 144 96.0
8 87.5 96.0 91.75 6 4.0 150 100.0
Segunda forma : utilizando la función
hist
h=hist(data$nivans, breaks = c(20,29.99,39.99,49.99,59.99,69.99,79.99,89.99,100), plot=FALSE)
LI=round(h$breaks[1:8],0)
LS=round(h$breaks[2:9],0)
ni=h$counts
hi=h$counts/150
Ni=cumsum(h$counts)
Hi=Ni/150
t=data.frame(LI,LS,ni,hi,Ni,Hi)
t
LI LS ni hi Ni Hi
1 20 30 2 0.01333333 2 0.01333333
2 30 40 11 0.07333333 13 0.08666667
3 40 50 22 0.14666667 35 0.23333333
4 50 60 41 0.27333333 76 0.50666667
5 60 70 44 0.29333333 120 0.80000000
6 70 80 18 0.12000000 138 0.92000000
7 80 90 8 0.05333333 146 0.97333333
8 90 100 4 0.02666667 150 1.00000000
Tercera forma : utilizando la funciones :
cut y cbind
nivans1=cut(data$nivans, breaks = c(20,29.99,39.99,49.99,59.99,69.99,79.99,89.99,100))
t2=table(nivans1)
t2=cbind(t2, t2/sum(t2),cumsum(t2), cumsum(t2)/sum(t2))
colnames(t2)=c("n","h","N","H")
t2
n h N H
(20,30] 2 0.01333333 2 0.01333333
(30,40] 11 0.07333333 13 0.08666667
(40,50] 22 0.14666667 35 0.23333333
(50,60] 41 0.27333333 76 0.50666667
(60,70] 44 0.29333333 120 0.80000000
(70,80] 18 0.12000000 138 0.92000000
(80,90] 8 0.05333333 146 0.97333333
(90,100] 4 0.02666667 150 1.00000000
El grupo observado corresponde a un total de 150 estudiantes de las cuatro facultades de la universidad (aún no estaba la Facultad de Hábitat) y presentan un valor promedio de 59.5 puntos que corresponde a un nivel medio. Su coeficiente de variación (24%) muestra un poco de heterogeneidad en los valores alcanzados por los estudiantes, mientras que su forma se aproxima a una distribución simétrica.
Tabla de frecuencias y porcentajes para variables cualitativas
data$fac[data$fac==1]="Facultad de Ingeniería y Ciencias"
data$fac[data$fac==2]="Facultad de Ciencias Económicas y Administrativas"
data$fac[data$fac==3]="Facultad de Humanidades"
data$fac[data$fac==4]="Facultad de Salud"
tabla_facultad <- table(data$fac, useNA = "ifany")
resumen_facultad <- data.frame(
Facultad = names(tabla_facultad),
Frecuencia = as.integer(tabla_facultad),
Porcentaje = round(100 * prop.table(tabla_facultad), 2)
)
knitr::kable(resumen_facultad)
| Facultad | Frecuencia | Porcentaje.Var1 | Porcentaje.Freq |
|---|---|---|---|
| Facultad de Ciencias Económicas y Administrativas | 48 | Facultad de Ciencias Económicas y Administrativas | 32.00 |
| Facultad de Humanidades | 34 | Facultad de Humanidades | 22.67 |
| Facultad de Ingeniería y Ciencias | 51 | Facultad de Ingeniería y Ciencias | 34.00 |
| Facultad de Salud | 17 | Facultad de Salud | 11.33 |
Los resultados indican una mayor proporción de estudiantes de la Facultad de Ingeniería y Ciencias (34%), mientras que la Facultad de Salud es la menor (11.3%).

Imagen tomada de : https://pixabay.com/es/images/search/paisaje/