Estandarización
En ocasiones necesitamos saber si un valor es muy alto o muy bajo, pero esto depende de factores como las unidades de medida, las medidas de tendencia central y la dispersión de la variable. Por ejemplo:
- Un precio de 100 dólares es distinto a un precio de 100 yenes
- Alguien que mida 1.80m es una persona alta en Perú, pero no tanto en Alemania, porque las estaturas promedio son distintas
- Una falla de 1m de distancia en un tiro libre es distinta para un jugador de la NBA que para un juego de aficionados, porque los jugadores de la NBA probablemente tengan una menor variabilidad en sus disparos
Hay un procedimiento que funciona como una especia de bala de plata para todos estos casos: estandarizar. Lo que hacemos es transformar la variable original, restándole a cada valor la media y dividiendo esto entre la disviación típica. Formalmente, dada una muestra \(x_1, x_2, ..., x_n\), calculamos:
\[ z_i = \frac{x_i - \bar{X}}{S_X} \]
Usualmente en la literatura nos dirán que esta nueva variable \(Z\) no tiene unidades, y esto es cierto. Sin embargo, una manera de interpretar los valores \(z_i\) es pensar que está expresada en desviaciones típicas. Efectivamente, si \(z_i = 1\), esto significa que \(x_i\) está una desviación típica por encima de la media. Por ejemplo, si \(x_i = 20\), la media \(\bar{X} = 15\) y la desviación típica \(S_X = 5\), \(z_i = (20 - 15) / 5 = 1\), y como podemos ver, \(x_i\) está una desviación típica por encima de la media.
La estandarización también se conoce como normalización
Pregunta
¿Cómo interpretarías un valor de \(z_i = -3\)
- El valor está 3 desviaciones estándar por debajo de la media
- El valor está 3 desviaciones estándar por arriba de la media
- \(z_i\) no puede ser negativo
Propiedades de la estandarización
Vamos a descargar iris
desde un repositorio público de github. Ya los nombres vienen en un formato legible y que cumple con las características del PEP8
import pandas as pd
iris = pd.read_csv("https://raw.githubusercontent.com/toneloy/data/master/iris.csv")
iris.head()
## sepal_length sepal_width petal_length petal_width species
## 0 5.1 3.5 1.4 0.2 setosa
## 1 4.9 3.0 1.4 0.2 setosa
## 2 4.7 3.2 1.3 0.2 setosa
## 3 4.6 3.1 1.5 0.2 setosa
## 4 5.0 3.6 1.4 0.2 setosa
Dada una muestra \(x_1, x_2, ..., x_n\), los valores estandarizados \(z_i\) complen con las siguientes propiedades:
- La media de los valores estandarizados es \(\bar{Z} = 0\) y la varianza de los valores estandarizados es \(S^2_Z = 1\).
petal_length_mean = iris["petal_length"].mean()
petal_length_sd = iris["petal_length"].std()
iris["petal_length_z"] = (iris["petal_length"] - petal_length_mean) / petal_length_sd
iris["petal_length_z"].mean()
## -2.842170943040401e-16
iris["petal_length_z"].var()
## 1.0000000000000004
- Si previamente aplicamos una transformación lineal a cada valor \(x_i\), como \(y_i = ax_i + b\), los valores estandarizados \(z_i = \frac{x_i - \bar{Y}}{S_Y}\) seguirán siendo los mismos
iris["y"] = 100 * iris["petal_length"] + 20
y_mean = iris["y"].mean()
y_sd = iris["y"].std()
iris["z1"] = (iris["petal_length"] - petal_length_mean) / petal_length_sd
iris["z2"] = (iris["y"] - y_mean) / y_sd
iris.loc[:, ["z1", "z2"]]
## z1 z2
## 0 -1.335752 -1.335752
## 1 -1.335752 -1.335752
## 2 -1.392399 -1.392399
## 3 -1.279104 -1.279104
## 4 -1.335752 -1.335752
## .. ... ...
## 145 0.816859 0.816859
## 146 0.703564 0.703564
## 147 0.816859 0.816859
## 148 0.930154 0.930154
## 149 0.760211 0.760211
##
## [150 rows x 2 columns]
En otras palabras, no importa que movamos la variable a la derecha o a la izquierda sumando la constante \(a\) o que cambiemos la escala de la variable multiplicando por la constante \(b\); los valores estandarizados son los mismos. Esto es muy últil, por ejemplo, si tenemos la misma variable expresada en distintas unidades.
Pregunta