Media geométrica y media armónica en Python

Por el equipo de promedio.net · Actualizado el

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
MediaFórmulaRequisitosUso típico
Aritmética(x₁ + … + xₙ) / nNingunoCalificaciones, medidas
Geométrica(x₁ · … · xₙ)^(1/n)Todos positivosCrecimiento, rendimientos, índices
Armónican / (1/x₁ + … + 1/xₙ)Ninguno negativoVelocidades, 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

  1. 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.
  2. Para tasas en porcentaje, convierte cada una a factor: +10 % → 1.10, −5 % → 0.95.
  3. Llama a la función correspondiente.
  4. 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

Puedes verificar resultados con la calculadora de media geométrica, la de media armónica y la de tasa de crecimiento promedio.

Fuentes

  1. 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.