W3docs

Desviación estándar en Python

Aprende a calcular la desviación estándar en Python con el módulo statistics, NumPy y pandas, con casos de uso reales en ML con scikit-learn.

La desviación estándar mide cuán dispersos están los valores alrededor de su media. Es una de las estadísticas más utilizadas en el análisis de datos y el aprendizaje automático: desde comprobar si un conjunto de datos sigue una distribución normal hasta escalar características antes de entrenar un modelo. Este capítulo explica qué es la desviación estándar, cómo calcularla en Python con el módulo statistics, NumPy y pandas, y cómo se integra en los flujos de trabajo habituales de ML.

¿Qué es la desviación estándar?

La desviación estándar (σ para una población, s para una muestra) cuantifica la distancia promedio de cada punto de datos respecto a la media. Una desviación estándar pequeña significa que los valores se agrupan estrechamente alrededor de la media; una grande indica que están muy dispersos.

Es la raíz cuadrada de la varianza:

variance  = Σ(xᵢ − x̄)² / N          # population
variance  = Σ(xᵢ − x̄)² / (N − 1)    # sample (Bessel's correction)
std dev   = √variance

Desviación estándar poblacional vs. muestral

TérminoDivisor de la fórmulaCuándo usarlo
Std poblacionalNTienes todos los puntos de datos (p. ej., todas las calificaciones de una clase)
Std muestralN − 1Tienes un subconjunto y quieres estimar toda la población

El denominador N − 1 (corrección de Bessel) corrige el sesgo introducido al estimar a partir de una muestra. En la práctica, para conjuntos de datos grandes la diferencia es insignificante, pero importa con muestras pequeñas.

Ejemplo resuelto a mano

data = [10, 20, 30, 40, 50]
mean = (10 + 20 + 30 + 40 + 50) / 5 = 30

Differences from mean:  -20, -10, 0, 10, 20
Squared differences:    400, 100, 0, 100, 400

Population variance = (400 + 100 + 0 + 100 + 400) / 5   = 200
Sample variance     = (400 + 100 + 0 + 100 + 400) / 4   = 250

Population std dev  = √200 ≈ 14.14
Sample std dev      = √250 ≈ 15.81

El módulo statistics

El módulo integrado statistics de Python es la forma más sencilla de calcular la desviación estándar para conjuntos de datos pequeños, sin necesidad de bibliotecas de terceros.

python— editable, runs on the server

stdev() lanza StatisticsError si se le pasan menos de dos valores, porque una lista de un solo elemento no tiene una dispersión significativa.

std() de NumPy

NumPy es la opción estándar cuando se trabaja con arrays, matrices o conjuntos de datos grandes. Su función np.std() usa por defecto la desviación estándar poblacional (ddof=0). Pasa ddof=1 para obtener la desviación estándar muestral.

python— editable, runs on the server

NumPy también permite calcular la desviación estándar a lo largo de un eje específico de un array bidimensional, lo que es útil cuando cada fila es una observación y cada columna es una característica:

import numpy as np

# 3 samples, 2 features
X = np.array([[1, 10],
              [2, 20],
              [3, 30]])

print(np.std(X, axis=0, ddof=1))  # std per feature: [1. 10.]
print(np.std(X, axis=1, ddof=1))  # std per sample:  [6.36 6.36 6.36] (approx)

std() y describe() de pandas

Cuando los datos están en un DataFrame, pandas proporciona std() directamente sobre cualquier columna o sobre todo el frame. Por defecto, pandas usa ddof=1 (std muestral), siguiendo la convención de R.

import pandas as pd

temps = [72, 68, 75, 80, 65, 70, 78]
df = pd.DataFrame({"temperature": temps})

print(df["temperature"].std())    # 5.4116  (sample std, ddof=1)
print(df["temperature"].mean())   # 72.5714

describe() ofrece un resumen estadístico rápido que incluye la desviación estándar para cada columna numérica:

import pandas as pd

df = pd.DataFrame({
    "height_cm": [165, 170, 175, 160, 180],
    "weight_kg": [55,  70,  80,  50,  90],
})

print(df.describe())

La fila std en la salida muestra la desviación estándar muestral de cada columna:

       height_cm  weight_kg
count   5.000000   5.000000
mean  170.000000  69.000000
std     7.905694  16.733201
min   160.000000  50.000000
25%   165.000000  55.000000
50%   170.000000  70.000000
75%   175.000000  80.000000
max   180.000000  90.000000

Desviación estándar en aprendizaje automático

Escalado de características con StandardScaler

Las características en bruto suelen abarcar escalas muy diferentes (edad en años frente a ingresos en miles). Algoritmos como la regresión lineal, las SVM y los k-vecinos más cercanos son sensibles a este desequilibrio. La estandarización (también llamada normalización por puntuación z) transforma cada característica para que tenga media = 0 y desviación estándar = 1:

z = (x − mean) / std

StandardScaler de scikit-learn aplica esto de forma automática:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 3 samples, 2 features
features = np.array([[1, 2],
                     [3, 4],
                     [5, 6]])

scaler = StandardScaler()
scaled = scaler.fit_transform(features)

print(scaled)
# [[-1.2247  -1.2247]
#  [ 0.       0.    ]
#  [ 1.2247   1.2247]]

Tras el escalado, cada columna tiene una media de 0 y una desviación estándar de 1. Puedes inspeccionar los parámetros aprendidos más adelante:

print(scaler.mean_)   # [3. 4.]
print(scaler.scale_)  # [1.6330 1.6330]

Comparar la variabilidad entre grupos

La desviación estándar ayuda a determinar si dos grupos son verdaderamente distintos o simplemente ruidosos. Dos clases pueden tener una media similar pero diferir drásticamente en dispersión:

import statistics

scores_a = [78, 80, 82, 79, 81]   # consistent group
scores_b = [60, 100, 55, 95, 70]  # high-variance group

print(f"Group A — mean: {statistics.mean(scores_a)}, std: {statistics.stdev(scores_a):.2f}")
# Group A — mean: 80, std: 1.58

print(f"Group B — mean: {statistics.mean(scores_b)}, std: {statistics.stdev(scores_b):.2f}")
# Group B — mean: 76, std: 20.43

El grupo A y el grupo B tienen medias similares, pero la desviación estándar del grupo B es ~13 veces mayor, lo que indica resultados mucho menos predecibles.

Detección de anomalías con puntuaciones z

Una puntuación z indica cuántas desviaciones estándar se aleja un valor de la media. Los valores con |z| > 3 son candidatos convencionales a valores atípicos:

import numpy as np

values = np.array([2.0, 2.5, 3.0, 2.8, 100.0, 2.2, 3.1])

mean = np.mean(values)
std  = np.std(values, ddof=1)

z_scores = (values - mean) / std
print(z_scores.round(2))
# [-0.39 -0.38 -0.37 -0.37  2.27 -0.39 -0.36]

El valor 100.0 tiene una puntuación z de 2.27, que —dado el pequeño conjunto de datos— ya destaca con fuerza como probable valor atípico.

Comprensión de la incertidumbre del modelo

La desviación estándar también aparece al evaluar un modelo en múltiples pliegues de validación cruzada. Una desviación estándar alta entre pliegues sugiere que el modelo es inestable o que los datos tienen alta varianza. Consulta el capítulo sobre validación cruzada para un recorrido completo.

Elegir la herramienta adecuada

SituaciónHerramienta recomendada
Cálculo rápido, sin dependenciasstatistics.stdev() / statistics.pstdev()
Operaciones con arrays o matricesnumpy.std()
Estadísticas de columnas en DataFramepandas.DataFrame.std()
Preprocesamiento de características para MLsklearn.preprocessing.StandardScaler

Errores comunes

  • ddof incorrecto: NumPy usa por defecto ddof=0 (población), mientras que pandas usa ddof=1 (muestra). Verifica siempre cuál necesitas antes de comparar resultados entre las dos bibliotecas.
  • Listas de un solo elemento: statistics.stdev() lanza un error; np.std() devuelve 0.0 silenciosamente.
  • Ajustar el scaler con datos de prueba: llama siempre a scaler.fit_transform() sobre el conjunto de entrenamiento y a scaler.transform() (no fit_transform) sobre el conjunto de prueba. Ajustar con datos de prueba filtra información e infla las métricas de rendimiento. Consulta el capítulo sobre división entrenamiento/prueba para más detalles.
  • Los valores atípicos distorsionan la std: un único valor extremo puede inflar drásticamente la desviación estándar, como se muestra en el ejemplo de detección de anomalías. Considera identificar los valores atípicos primero (consulta el capítulo sobre distribución de datos).

Capítulos relacionados

  • Media, mediana y moda — otras medidas de tendencia central que complementan la desviación estándar
  • Percentiles — medidas de dispersión basadas en rangos que son robustas ante valores atípicos
  • Distribución normal de datos — la desviación estándar es el parámetro central de la distribución normal
  • Escala — estrategias de escalado de características más amplias que van más allá de la estandarización
  • Distribución de datos — visualización de la dispersión e identificación de la asimetría
Was this page helpful?