Llevo un tiempo como aficionado al aprendizaje automático y estoy intentando formalizar mi comprensión de los fundamentos estadísticos del análisis de datos y el aprendizaje automático. Mi lectura hasta ahora me ha llevado básicamente a pensar que el siguiente enfoque es válido.
Digamos que tengo algunos datos que representan la venta de casas; $n$ muestras de una variable dependiente $Y$ que es el precio de venta de la vivienda, más una serie de variables independientes que describen características de la vivienda o de la transacción. Para los fines de esta pregunta, consideraré sólo una; $X_0$ siendo "MSZoning", que es una clasificación de la transacción y por lo tanto es una variable categórica.
Quiero determinar si $X_0$ y $Y$ están asociados a un nivel estadísticamente significativo. Mis opciones son realizar un ANOVA o una prueba de Kruskal-Wallis. Mis lecturas me han llevado a elegir el ANOVA, a menos que los datos no cumplan los supuestos que hacen que esa prueba sea válida, por lo que al bajar la lista compruebo la distribución normal de cada grupo trazando esas distribuciones (transformadas en logaritmos):
import pandas as pd
import seaborn as sns
import scipy.stats as ss
# A dataframe is instantiated here
fig, ax = plt.subplots(figsize=(24, 12))
for val in df.MSZoning.unique():
sns.distplot(np.log1p(df.loc[df.MSZoning == val].SalePrice), ax=ax)
plt.show()
En este punto, considero que esas distribuciones están demasiado lejos de la normalidad para que se cumplan los supuestos del ANOVA, por lo que voy a realizar una prueba de Kruskal-Wallis. Mi primera pregunta es:
¿Existe una forma mejor de evaluar si las distribuciones de cada grupo se acercan lo suficiente a la normalidad para que se cumplan los supuestos del ANOVA que un simple juicio de valor?
A continuación, ejecuté la prueba de Kruskal-Wallis utilizando scipy:
a = [df.loc[df.MSZoning == c].SalePrice for c in df.MSZoning.unique()]
H, p = ss.kruskal(*a)
print('H-statistic: ', H, ' p-value: ', p)
Y sale la salida; H-statistic: 270.0701971937021 p-value: 3.0807239995999556e-57
. Esto es muy significativo, por lo que yo pasaría a realizar un análisis post-hoc. Scipy parece carecer en este sentido, así que usé scikit-posthocs y eligió la prueba de Iram-Conover (basándose únicamente en las respuestas cruzadas):
sp.posthoc_conover(df, val_col='SalePrice', group_col='MSZoning', p_adjust='holm')
Y la salida es una tabla que muestra los valores p por pares:
Así que basándome en eso, mi conclusión sería que hay una asociación entre $X_0$ y $Y$ importante para al menos el nivel del 5% (pero probablemente mucho más fuerte). Los grupos C (todos) - FV, C (todos) - RL, FV - RH, FV - RL, FV - RM, RH - RL, RL - RM mostraron diferencias significativas al al menos el nivel del 5%, pero los demás pares no mostraron una diferencia estadísticamente significativa.
Mi segunda pregunta es: ¿he cometido un error en mi metodología, o es razonable esa conclusión?