En Python, la media geométrica se calcula con statistics.geometric_mean(datos) (Python 3.8 o posterior) y la media armónica con statistics.harmonic_mean(datos), que desde Python 3.10 acepta pesos con weights=. La geométrica es la correcta para promediar tasas de crecimiento que se encadenan; la armónica, para promediar velocidades o precios por unidad sobre una misma cantidad.
Sintaxis
import statistics as st
st.geometric_mean(datos) # raíz n-ésima del producto
st.harmonic_mean(datos) # n / suma de inversos
st.harmonic_mean(datos, weights=pesos) # Python 3.10 o posterior
| Media | Fórmula | Requisitos | Uso típico |
|---|---|---|---|
| Aritmética | (x₁ + … + xₙ) / n | Ninguno | Calificaciones, medidas |
| Geométrica | (x₁ · … · xₙ)^(1/n) | Todos positivos | Crecimiento, rendimientos, índices |
| Armónica | n / (1/x₁ + … + 1/xₙ) | Ninguno negativo | Velocidades, precio por unidad, razones |
Para dos números positivos distintos siempre se cumple armónica < geométrica < aritmética. Con 4 y 9: harmonic_mean da 5.538…, geometric_mean da 6.0 y mean da 6.5.
Paso a paso
- Identifica qué estás promediando. Si los datos se multiplican entre sí (un año crece sobre el anterior), usa la geométrica. Si son cocientes con el mismo numerador (kilómetros recorridos a distintas velocidades), usa la armónica.
- Para tasas en porcentaje, convierte cada una a factor: +10 % → 1.10, −5 % → 0.95.
- Llama a la función correspondiente.
- Si promediaste factores, réstale 1 al resultado para volver a porcentaje.
Ejemplos resueltos
Ejemplo 1: rendimiento anual promedio de una inversión
Una inversión rinde +10 %, +25 % y −5 % en tres años consecutivos.
factores = [1.10, 1.25, 0.95]
g = st.geometric_mean(factores)
print(g)
print(g - 1)
print(st.mean(factores) - 1)
1.093139114651861
0.09313911465186098
0.10000000000000009
El rendimiento anual promedio es 9.31 %, no 10 %. La comprobación: 1,000 pesos crecen a 1,000 × 1.10 × 1.25 × 0.95 = 1,306.25, y aplicar 9.31 % tres veces da el mismo 1,306.25. Aplicar el promedio aritmético (10 %) tres veces daría 1,331, más de lo que realmente se ganó.
Ejemplo 2: velocidad promedio de ida y vuelta
Vas a 60 km/h y regresas por el mismo camino a 40 km/h.
print(st.harmonic_mean([60, 40]))
48.0
La velocidad promedio es 48 km/h, no 50: tardas más tiempo en el tramo lento, así que pesa más. Con 120 km de distancia, la ida toma 2 h y la vuelta 3 h: 240 km en 5 h son 48 km/h.
Ejemplo 3: tramos de distinta longitud con weights
Recorres 200 km a 80 km/h y 300 km a 120 km/h. Los pesos son las distancias:
print(st.harmonic_mean([80, 120], weights=[200, 300]))
100.0
200 km a 80 km/h son 2.5 h y 300 km a 120 km/h son otras 2.5 h: 500 km en 5 h dan 100 km/h. Si los tramos duraran lo mismo en tiempo (y no en distancia), lo correcto sería la media aritmética ponderada por horas.
Sin la biblioteca statistics
Si tu Python es anterior a la 3.8, la media geométrica se obtiene con logaritmos, lo que además evita desbordamientos con productos enormes:
import math
datos = [2, 8]
print(math.exp(sum(math.log(x) for x in datos) / len(datos)))
4.0
Y la armónica es len(datos) / sum(1 / x for x in datos).
Errores comunes
StatisticsError: geometric mean requires a non-empty dataset containing positive numbers. En Python 3.12 aparece con una lista vacía, con un cero o con un negativo. Si tus datos son tasas, probablemente olvidaste convertirlas a factores: −5 % es 0.95, no −0.05.StatisticsError: harmonic mean does not support negative values. La armónica no admite negativos. Un cero, en cambio, no da error:harmonic_mean([2, 0, 3])devuelve 0.- Promediar porcentajes de crecimiento con
mean. Sobrestima el rendimiento cuando las tasas varían; usa la geométrica. - Usar la armónica cuando los tramos duran el mismo tiempo. Si manejas 1 h a 60 km/h y 1 h a 40 km/h, la velocidad promedio sí es 50 km/h.
Puedes verificar resultados con la calculadora de media geométrica, la de media armónica y la de tasa de crecimiento promedio.
Fuentes
- Python Software Foundation, documentación del módulo statistics. geometric_mean (desde 3.8) y harmonic_mean (weights desde 3.10). Consultado el 11 de noviembre de 2026.