Medidas de dispersión y posición: varianza, desviación típica, coeficiente de variación, cuartiles, deciles y percentiles.
Se incluyen tres escenarios:
A. Datos NO agrupados (lista simple de valores).
B. Datos agrupados (tablas de frecuencias: intervalos de clase y marcas de clase o bien valores discretos con su frecuencia).
C. Con una base de datos (archivo .xlsx en este caso).
# Percentil genéricodef percentil_agrup(p): pos = p*N/100 clase = np.where(Fi >= pos)[0][0] L = xi[clase] -0.5 P = L + ((pos - (Fi[clase-1] if clase>0else0))/fi[clase])*1return PQ1 = percentil_agrup(25)Q1
np.float64(2.0)
D3 = percentil_agrup(30)D3
np.float64(2.2199999999999998)
P90 = percentil_agrup(90)P90
np.float64(4.45)
RESUMEN RÁPIDO DE FUNCIONES CLAVE
Estadístico
R (no agrupado)
Python (no agrupado)
Máximo
max(x)
np.max(x)
Mínimo
min(x)
np.min(x)
Media
mean(x)
np.mean(x)
Mediana
median(x)
np.median(x)
Moda
mfv(x) (pkg)
stats.mode(x)[0][0]
Varianza
var(x)
np.var(x, ddof=1)
Desv. típ.
sd(x)
np.std(x, ddof=1)
Cuartiles
quantile(x,…)
np.percentile(x,…)
Para datos agrupados es importante:
- Multiplicar xi*fi y xi²*fi.
- Usar frecuencias acumuladas para mediana y percentiles.
- Aplicar interpolación lineal dentro de la clase correspondiente.
C. CON UNA BASE DE DATOS
Se usará de ejemplo el análsis del archivo: “Encuesta a los estudiantes (respuestas).xlsx”, que contiene notas (generadas aleatoriamente) de 99 estudiantes ficticios.
En R
library(readxl)library(dplyr)
Adjuntando el paquete: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
import pandas as pdimport numpy as npfrom scipy import statsfrom pathlib import Patharchivo = Path("data", "Encuesta a los estudiantes (respuestas).xlsx")df = pd.read_excel(archivo, sheet_name=0, engine='openpyxl', index_col=None)# Última columna (la que SÍ tiene datos)notas = df.iloc[:, -1].dropna()print(f"Valores leídos: {len(notas)}")
#---------- 4. Histograma con polígono de frecuencias ----library(ggplot2)ggplot(as.data.frame(notas), aes(x = notas)) +geom_histogram(breaks = breaks, color ="white", fill ="steelblue") +geom_freqpoly(breaks = breaks, color ="orange", linewidth =1) +labs(title ="Histograma y polígono de frecuencias",x ="Nota", y ="Frecuencia") +theme_minimal()
#---------- 5. Boxplot con cuartiles anotados ------------ggplot(data.frame(notas = notas, x ="Est"), aes(x = x, y = notas)) +geom_boxplot(fill ="lightcyan") +stat_summary(fun = mean, geom ="point", color ="red", shape =18, size =3) +labs(title ="Boxplot (cruz roja = media)", y ="Nota") +theme_minimal() +theme(axis.title.x =element_blank(),axis.text.x =element_blank(),axis.ticks.x =element_blank())