Más sobre ciencia de datos: cienciadedatos.net
El supuesto de homogeneidad de varianzas, también conocido como supuesto de homocedasticidad, considera que la varianza es constante (no varía) en los diferentes niveles de un factor, es decir, entre diferentes grupos. En los modelos de regresión lineal, esta condición de homocedasticidad suele hacer referencia a los errores (residuos) del modelo, es decir, que la varianza de los errores es constante en todas las predicciones. Cuando la condición de homocedasticidad no se cumple, se utiliza el término heterocedasticidad.
Existen diferentes test que permiten evaluar si las observaciones proceden de poblaciones con la misma varianza. Todos ellos consideran como hipótesis nula que la varianza es igual entre los grupos y como hipótesis alternativa que no lo es. La diferencia entre ellos es el estadístico de centralidad que utilizan:
Los test que utilizan la media de la varianza son los que mayor poder estadístico consiguen cuando los datos siguen distribuciones normales.
Los test que utilizan la mediana de la varianza consiguen mejores resultados cuando los datos siguen distribuciones asimétricas o se alejan de la normalidad.
Por lo general, si no se puede alcanzar cierta seguridad de que las poblaciones que se comparan son de tipo normal, es recomendable recurrir a test que comparen la mediana de la varianza.
A lo largo de este documento se muestra como realizar análisis gráficos y cómo aplicar el test de Levene, el test de Bartlett y el test de Fligner-Killeen con Python.
Las librerías utilizadas en este documento son:
# Tratamiento de datos
# ==============================================================================
import pandas as pd
import numpy as np
# Gráficos
# ==============================================================================
import matplotlib.pyplot as plt
from matplotlib import style
import seaborn as sns
# Preprocesado y análisis
# ==============================================================================
from scipy import stats
# Configuración matplotlib
# ==============================================================================
plt.style.use('ggplot')
# Configuración warnings
# ==============================================================================
import warnings
warnings.filterwarnings('ignore')
Los datos utilizados en este ejemplo se han obtenido del libro Statistical Rethinking by Richard McElreath. El set de datos contiene información recogida por Nancy Howell a finales de la década de 1960 sobre el pueblo !Kung San, que viven en el desierto de Kalahari entre Botsuana, Namibia y Angola. El objetivo es identificar si existe diferencia entre la varianza del peso de hombres y mujeres.
# Datos
# ==============================================================================
url = ('https://raw.githubusercontent.com/JoaquinAmatRodrigo/' +
'Estadistica-machine-learning-python/master/data/Howell1.csv')
datos = pd.read_csv(url)
print(datos.info())
datos.head(4)
De todos los datos disponibles se seleccionan únicamente personas con más de 15 años.
datos['male'] = datos['male'].astype(str)
datos = datos[(datos.age > 15)]
peso_hombres = datos.loc[datos.male == '1', 'weight']
peso_mujeres = datos.loc[datos.male == '0', 'weight']
Dos de los métodos gráficos más empleados para el análisis homocedasticidad consiste en representar los datos mediante un boxplot o un violinplot. Con ambos gráficos el objetivo es comparar la dispersión de los grupos.
# Grafico violinplot
# ==============================================================================
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(7, 3.5))
sns.violinplot(
x = 'weight',
y = 'male',
data = datos,
palette = 'tab10',
inner = 'stick',
ax = ax
)
ax.set_title('Distribución de peso por sexo')
ax.set_xlabel('peso')
ax.set_ylabel('sexo(1=hombre 0=mujer)');
# Grafico boxplot
# ==============================================================================
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(7, 3.5))
sns.boxplot(
x = 'weight',
y = 'male',
data = datos,
palette = 'tab10',
ax = ax
)
ax.set_title('Distribución de peso por sexo')
ax.set_xlabel('peso')
ax.set_ylabel('sexo(1=hombre 0=mujer)');
El análisis gráfico parece indicar que los dos grupos tienen varianzas similares.
El test de Levene, el test de Bartlett y el test de Fligner-Killeen son tres de los test de hipótesis más empleados comparar la varianza entre grupos. En todos ellos, se considera como hipótesis nula que los datos proceden de distribuciones con la misma varianza (homocedasticidad). Por lo tanto, si el p-value es menor que un determinado valor (típicamente 0.05), entonces se considera que hay evidencias suficientes para rechazar la homocedasticidad en favor de la heterocedasticidad.
El test de Levene y el test de Fligner-Killeen (este último no paramétrico) son más robustos que el test de Bartlett ante la falta de normalidad, por lo que suele aconsejarse su uso. Además, tanto el test de Levene como el de Bartlett permiten elegir entre diferentes estadísticos de centralidad: mediana (por defecto), media, media truncada. Esto es importante a la hora de contrastar la homocedasticidad dependiendo de si los grupos se distribuyen de forma normal o no.
Si se tiene seguridad de que las muestras a comparar proceden de poblaciones que siguen una distribución normal, es recomendable el test de Bartlett. Si no se tiene la seguridad de que las poblaciones de origen son normales, se recomiendan el test de Leven utilizando la mediana o el test no paramétrico Fligner-Killeen que también se basa en la mediana.
Los tres test están disponibles en la librería scipy.stats
(scipy.stats.levene, scipy.stats.bartlett, scipy.stats.fligner) y en la librería pingouin
(pingouin.homoscedasticity).
# Levene test
# ==============================================================================
levene_test = stats.levene(peso_hombres, peso_mujeres, center='median')
levene_test
# Bartlett test
# ==============================================================================
bartlett_test = stats.bartlett(peso_hombres, peso_mujeres)
bartlett_test
# Levene test
# ==============================================================================
fligner_test = stats.fligner(peso_hombres, peso_mujeres, center='median')
fligner_test
Ninguno de los test muestra evidencias para rechazar la hipótesis de que los dos grupos tienen la misma varianza, homocedasticidad. p-value >>>> 0.05
from sinfo import sinfo
sinfo()
OpenIntro Statistics: Fourth Edition by David Diez, Mine Çetinkaya-Rundel, Christopher Barr
Handbook of Biological Statistics by John H. McDonald libro
Levene, H. (1960). In Contributions to Probability and Statistics: Essays in Honor of Harold Hotelling, I. Olkin et al. eds., Stanford University Press, pp. 278-292.
Conover, W. J., Johnson, M. E. and Johnson M. M. (1981). A comparative study of tests for homogeneity of variances, with applications to the outer continental shelf biding data. Technometrics, 23(4), 351-361.
Fligner, M.A. and Killeen, T.J. (1976). Distribution-free two-sample tests for scale. ‘Journal of the American Statistical Association.’ 71(353), 210-213.
https://www.itl.nist.gov/div898/handbook/eda/section3/eda357.htm
¿Cómo citar este documento?
Análisis de homocedasticidad y heterocedasticidad con python por Joaquín Amat Rodrigo, disponible con licencia CC BY-NC-SA 4.0 en https://www.cienciadedatos.net/documentos/pystats07-test-homocedasticidad-heterocedasticidad-python.html
¿Te ha gustado el artículo? Tu ayuda es importante
Mantener un sitio web tiene unos costes elevados, tu contribución me ayudará a seguir generando contenido divulgativo gratuito. ¡Muchísimas gracias! 😊
Este contenido, creado por Joaquín Amat Rodrigo, tiene licencia Attribution-NonCommercial-ShareAlike 4.0 International.
Se permite:
Compartir: copiar y redistribuir el material en cualquier medio o formato.
Adaptar: remezclar, transformar y crear a partir del material.
Bajo los siguientes términos:
Atribución: Debes otorgar el crédito adecuado, proporcionar un enlace a la licencia e indicar si se realizaron cambios. Puedes hacerlo de cualquier manera razonable, pero no de una forma que sugiera que el licenciante te respalda o respalda tu uso.
NoComercial: No puedes utilizar el material para fines comerciales.
CompartirIgual: Si remezclas, transformas o creas a partir del material, debes distribuir tus contribuciones bajo la misma licencia que el original.