Análisis estadístico descriptivo con Python / Anova, Pearson y Mapas de Calor
Análisis estadístico descriptivo con Python / Anova, Pearson y Mapas de Calor
[wp_ad_camp_1]
Análisis estadístico descriptivo
Primero echemos un vistazo a las variables utilizando un método de descripción.
La función "describe" automáticamente calcula estadísticas básicas para todas las variables continuas. Cualquier valor de NaN se omite automáticamente en estas estadísticas.
Esta publicación es la continuación del post anterior Análisis de datos exploratorios con Python
Esto mostrará:
- el recuento de esa variable.
- la media aritmética.
- la desviación estándar (std).
- el valor mínimo.
- el IQR (rango intercuartil: 25%, 50% y 75%).
- el valor máximo.
Podemos aplicar el método "describe" de la siguiente manera:
df.describe()
La configuración predeterminada de "describe" omite las variables de tipo objeto. Podemos aplicar el método "describe" en las variables de tipo 'objeto' de la siguiente manera:
df.describe(include=['object'])
Value Counts / Contar Valores
El conteo de valores es una buena forma de entender cuántas unidades de cada característica / variable tenemos. Podemos aplicar el método "value_counts" en la columna 'drive-wheels'. No olvide que el método "value_counts" solo funciona en series Pandas, no en Pandas Dataframes. Como resultado, solo incluimos un soporte "df ['drive-wheels']" no dos soportes "df [['drive-wheels']]".
df['drive-wheels'].value_counts().to_frame()
Repitamos los pasos anteriores, pero guardemos los resultados en el dataframe "drive_wheels_counts" y cambiemos el nombre de la columna 'drive-wheels' a 'value_counts'.
[wp_ad_camp_2]
drive_wheels_counts = df['drive-wheels'].value_counts().to_frame() drive_wheels_counts.rename(columns={'drive-wheels': 'value_counts'}, inplace=True) drive_wheels_counts
Podemos repetir el proceso anterior para la variable 'engine-location'.
engine_loc_counts = df['engine-location'].value_counts().to_frame() engine_loc_counts.rename(columns={'engine-location': 'value_counts'}, inplace=True) engine_loc_counts.index.name = 'engine-location' engine_loc_counts.head(10)
Examinar los recuentos de valores de la ubicación del motor no sería una buena variable predictiva del precio. Esto se debe a que solo tenemos tres autos con motor trasero y 198 con motor delantero, este resultado es sesgado. Por lo tanto, no podemos sacar ninguna conclusión sobre la ubicación del motor.
Básicos de agrupar
El método "groupby" agrupa los datos por diferentes categorías. Los datos se agrupan en función de una o varias variables y el análisis se realiza en los grupos individuales.
Por ejemplo, agrupemos por la variable "drive-wheels". Sabemos que hay 3 categorías diferentes de ruedas.
Si queremos saber, en promedio, qué tipo de rueda es más valiosa, podemos agrupar "drive-wheels" y luego promediarlas.
Podemos seleccionar las columnas 'drive-wheels', 'body-style' y 'price', luego asignarlo a la variable "df_group_one".
df_group_one = df[['drive-wheels','body-style','price']] df_group_one.head(10)
Luego podemos calcular el precio promedio para cada una de las diferentes categorías de datos.
df_group_one = df_group_one.groupby(['drive-wheels'],as_index=False).mean() df_group_one
Según nuestros datos, parece que los vehículos con tracción trasera son, en promedio, los más caros, mientras que las 4 ruedas y las ruedas delanteras tienen aproximadamente el mismo precio.
[wp_ad_camp_3]
También puede agrupar con múltiples variables. Por ejemplo, agrupemos por 'drive-wheels' y 'body-style'. Esto agrupa el marco de datos por las combinaciones únicas 'drive-wheels' y 'body-style'. Podemos almacenar los resultados en la variable 'grouped_test1'.
df_gptest = df[['drive-wheels','body-style','price']] grouped_test1 = df_gptest.groupby(['drive-wheels','body-style'],as_index=False).mean() grouped_test1
Estos datos agrupados son mucho más fáciles de visualizar cuando se convierten en una tabla dinámica. Una tabla dinámica es como una hoja de cálculo de Excel, con una variable a lo largo de la columna y otra a lo largo de la fila. Podemos convertir el marco de datos en una tabla dinámica utilizando el método "pivote" para crear una tabla dinámica a partir de los grupos.
En este caso, dejaremos la variable drive-wheels como las filas de la tabla y giraremos el body-style para convertirlas en las columnas de la tabla:
grouped_pivot = grouped_test1.pivot(index='drive-wheels',columns='body-style') grouped_pivot
A menudo, no tendremos datos para algunas de las celdas dinámicas. Podemos llenar estas celdas faltantes con el valor 0, pero cualquier otro valor también podría usarse. Cabe mencionar que la falta de datos es un tema bastante complejo y es un curso completo por sí solo.
grouped_pivot = grouped_pivot.fillna(0) grouped_pivot
Mapas de calor
Usemos un mapa de calor para visualizar la relación entre Body Style vs Price.
plt.pcolor(grouped_pivot) plt.colorbar() plt.show()
El mapa de calor traza la variable objetivo (precio) proporcional al color con respecto a las variables 'drive-wheel' y 'body-style' en los ejes vertical y horizontal, respectivamente. Esto nos permite visualizar cómo se relaciona el precio con 'drive-wheel' y 'body-style'.
[wp_ad_camp_4]
Las etiquetas predeterminadas no nos transmiten información útil. Cambiemos eso:
fig, ax = plt.subplots() im = ax.pcolor(grouped_pivot, cmap='RdBu') #label names r ow_labels = grouped_pivot.columns.levels[1] col_labels = grouped_pivot.index #move ticks and labels to the center ax.set_xticks(np.arange(grouped_pivot.shape[1]) + 0.5, minor=False) ax.set_yticks(np.arange(grouped_pivot.shape[0]) + 0.5, minor=False) #insert labels ax.set_xticklabels(row_labels, minor=False) ax.set_yticklabels(col_labels, minor=False) #rotate label if too long plt.xticks(rotation=90) fig.colorbar(im) plt.show()
La visualización es muy importante en la ciencia de datos, y los paquetes de visualización de Python proporcionan una gran libertad. Vamos a profundiza sobre esto en otras publicaciones.
La pregunta principal que queremos responder en este módulo es "¿Cuáles son las características principales que tienen el mayor impacto en el precio del automóvil?".
Para obtener una mejor medición de las características importantes, observamos la correlación de estas variables con el precio del automóvil, en otras palabras: ¿cómo depende el precio del automóvil de esta variable?
Correlación y causalidad
Correlación: una medida del grado de interdependencia entre variables.
Causalidad: la relación entre causa y efecto entre dos variables.
Es importante saber la diferencia entre estos dos y que la correlación no implica causalidad. Determinar la correlación es mucho más simple que la causalidad determinante ya que la causalidad puede requerir experimentación independiente.
Correlación de Pearson
La correlación de Pearson mide la dependencia lineal entre dos variables X e Y.
El coeficiente resultante es un valor entre -1 y 1 inclusive, donde:
- 1: correlación lineal positiva total.
- 0: Sin correlación lineal, las dos variables probablemente no se afectan entre sí.
- -1: correlación lineal negativa total.
Correlación de Pearson es el método predeterminado de la función "corr". Como antes, podemos calcular la correlación de Pearson de las variables 'int64' o 'float64'.
df.corr()
a veces nos gustaría saber lo significativo de la estimación de correlación.
Valor p:
¿Qué es este valor P? El valor P es el valor de probabilidad de que la correlación entre estas dos variables sea estadísticamente significativa. Normalmente, elegimos un nivel de significancia de 0.05, lo que significa que estamos 95% seguros de que la correlación entre las variables es significativa.
Por convención, cuando el
- El valor p es <0.001: decimos que hay pruebas sólidas de que la correlación es significativa.
- el valor p es <0.05: existe evidencia moderada de que la correlación es significativa.
- el valor p es <0.1: existe evidencia débil de que la correlación es significativa.
- el valor p es> 0.1: no hay evidencia de que la correlación sea significativa.
Podemos obtener esta información usando el módulo "stats" en la biblioteca "scipy".
Calculemos el coeficiente de correlación de Pearson y el valor P de 'wheel-base' y 'price'.
from scipy import stats pearson_coef, p_value = stats.pearsonr(df['wheel-base'], df['price']) print("El coeficiente de correlación Pearson is", pearson_coef, " con un valor P de P =", p_value)
El coeficiente de correlación Pearson is 0.584641822265508 con un valor P de P = 8.076488270733218e-20
Conclusión:
Dado que el valor p es <0.001, la correlación entre la distancia entre wheel-base y price es estadísticamente significativa, aunque la relación lineal no es extremadamente fuerte (~ 0.585).
Ahora los invito a que prueben con otras categorías y deduzcan estadísticamente de acuerdo a los valores P y al coficiente de correlación Pearson.
ANOVA
ANOVA: análisis de varianza
El Análisis de varianza (ANOVA) es un método estadístico utilizado para evaluar si existen diferencias significativas entre las medias de dos o más grupos. ANOVA devuelve dos parámetros:
Puntuación de la prueba F:
ANOVA supone que las medias de todos los grupos son iguales, calcula cuánto se desvían las medias reales de la suposición y lo informa como la puntuación de la prueba F. Una puntuación mayor significa que hay una diferencia mayor entre las medias.
[wp_ad_camp_5]
Valor P:
El valor P indica cuán estadísticamente significativo es nuestro valor de puntaje calculado.
Si nuestra variable de precio está fuertemente correlacionada con la variable que estamos analizando, esperemos que ANOVA devuelva una puntuación considerable en la prueba F y un valor p pequeño.
Dado que ANOVA analiza la diferencia entre diferentes grupos de la misma variable, la función groupby será útil. Debido a que el algoritmo ANOVA promedia los datos automáticamente, no necesitamos tomar el promedio de antemano.
Veamos si diferentes tipos de 'wheel-base' impactan 'price', agrupamos los datos.
grouped_test2=df_gptest[['drive-wheels', 'price']].groupby(['drive-wheels']) grouped_test2.head(2) df_gptest.head() grouped_test2.get_group('4wd')['price']
Podemos usar la función 'f_oneway' en el módulo 'stats' para obtener el puntaje de la prueba F y el valor P.
f_val, p_val = stats.f_oneway(grouped_test2.get_group('fwd')['price'], grouped_test2.get_group('rwd')['price'], grouped_test2.get_group('4wd')['price']) print( "Resultados ANOVA: F=", f_val, ", P =", p_val)
Resultados ANOVA: F= 67.95406500780399 , P = 3.3945443577151245e-23
Este es un gran resultado, con un puntaje de prueba F grande que muestra una fuerte correlación y un valor de P de casi 0 que implica una significación estadística casi segura. Pero, ¿significa esto que los tres grupos probados están altamente correlacionados?
Igualmente puede realizar pruebas ANOVA con las demás categorías.
Conclusión: variables importantes
Ahora tenemos una mejor idea de cómo se ven nuestros datos y qué variables son importantes a tener en cuenta al predecir el precio del automóvil. Lo hemos reducido a las siguientes variables:
Variables numéricas continuas:
- Length
- Width
- Curb-weight
- Engine-size
- Horsepower
- City-mpg
- Highway-mpg
- Wheel-base
- Bore
Variables categóricas:
- Drive-wheels
A medida que avanzamos en la construcción de modelos de aprendizaje automático para automatizar nuestro análisis, alimentar el modelo con variables que afecten significativamente nuestra variable objetivo mejorará el rendimiento de predicción de nuestro modelo.
También les comparto el código en github el cual fue usado en esta publicación, adicionalmente pueden descargar el notebook para su uso personal exclusivamente con fines didácticos.
https://github.com/rjromo/rubenjromo.com/blob/master/An%C3%A1lisis_de_Datos_Exploratorios.ipynb
-
Muchas gracias por el tutorial, me cae como anillo al dedo.
-
Justo lo que andaba buscando para un proyecto de la Universidad. Muchas gracias!
-
🤯🤯🤯
-
Todo bien, solo que hay unas partes que no comprendí =(
-
Gracias! Justo lo que estaba buscando.
-
Thank you!
-
Gracias por el tutorial!
-
Todo bien! Unas partes aún tengo duda pero igual muchas gracias
-
¿Sabes cómo hacer para que te muestre la tabla anova completa y no solo los valores? Lo he hecho en excel pero necesito en python. Agradecería tu pronta respuesta.
-
I think the admin of this web page is actually working
hard in favor of his site, because here every stuff is quality
based data. -
Hola, creo que este trabajo es excelente, solo falta complementarlo con el aprendizaje en un red neuronal densa (al menos como un ejemplo) y ver si la predicción del precio es acertada.
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.
very nice blog have a good info.