1. Faro

Nivel 5 · ¿Qué hace mean() con los costes ausentes?

La solicitud

De Laura Bennett, Directora de Finanzas

“Nueve productos no tienen coste registrado. Antes de citar a la junta el coste unitario medio, ¿qué es exactamente lo que está promediando pandas?”

Tu objetivo

Elige la afirmación correcta.

`products["unit_cost"]` tiene 120 filas y 9 de ellas son NaN. ¿Qué devuelve `products["unit_cost"].mean()`?

Elige una respuesta y luego compruébala.

La lección

NaN en las agregaciones

Las agregaciones de pandas (sum, mean, median, min, max, std, count) omiten los valores ausentes por defecto. Así que:

products["unit_cost"].count()   # 111, non-missing values only
products["unit_cost"].mean()    # sum of the 111 known costs / 111
products["unit_cost"].mean(skipna=False)   # NaN

Este valor por defecto es cómodo y normalmente correcto, pero cambia en silencio la población. “Coste unitario medio” significa en realidad “coste unitario medio de los productos cuyo coste conocemos”. Si los productos ausentes son especiales (todos muebles caros, por ejemplo), la media está sesgada. Comprueba qué filas faltan antes de fiarte de la cifra:

products.loc[products["unit_cost"].isna(), ["product_id", "name", "category", "unit_price"]]

NumPy puro se comporta distinto: np.mean sobre un array con NaN devuelve NaN. Es una razón para quedarte con los métodos de pandas para el análisis, y para saber qué biblioteca estás llamando.

Sumas y recuentos

sum() de una columna que es toda NaN devuelve 0, no NaN. Eso puede hacer que “sin datos” parezca “cero ingresos” en un panel. Cuando importe, comprueba count() junto a la suma.

NaN nunca es igual a nada

np.nan == np.nan                     # False
products["unit_cost"] == np.nan      # all False, even on missing rows
products["unit_cost"].isna()         # the right test

Por definición, un valor ausente no es igual a nada, ni siquiera a otro valor ausente. Usa siempre isna() y notna() para comprobarlo.

La aritmética propaga los NaN

products["unit_price"] - products["unit_cost"]    # NaN where cost is missing

Es el comportamiento correcto: el margen de un producto con coste desconocido es desconocido. Si luego tomas el margen medio, esos productos se omiten, así que tu media de margen cubre 111 productos. Infórmalo así: “margen medio de los 111 productos con un coste registrado”.

Valores ausentes en grupos

La misma omisión ocurre dentro de groupby. Si calculas el coste medio por categoría, la media de cada categoría usa solo sus productos con un coste conocido, así que una categoría puede basarse en 20 productos y otra en 17. Añade un recuento junto a la media, por ejemplo con la agregación con nombre n_with_cost=("unit_cost", "count"), para que los lectores vean lo sólida que es cada cifra.

La regla del analista

Para cada cifra que informes de una columna con huecos, di en cuántas filas se basa. Lleva una línea de texto y evita la pregunta de seguimiento más común en cualquier reunión.

Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.