Introducción
Contenido
- 1 Introducción
- 2 Presentamos la biblioteca statsmodels en Python
- 3 Elegir un conjunto de datos
- 4 Análisis exploratorio de datos y preprocesamiento
- 5 Seleccionar una hipótesis adecuada
- 6 Análisis de varianza (ANOVA)
- 7 La prueba chi-cuadrado de independencia
- 8 correlación de Pearson
- 9 Moderadores e interacción estadística
- 10 Conclusión
Python es un lenguaje increíblemente versátil, útil para una amplia variedad de tareas en una amplia gama de disciplinas. Una de esas disciplinas es el análisis estadístico de conjuntos de datos y, junto con SPSS, Python es una de las herramientas más comunes para las estadísticas.
La naturaleza intuitiva y fácil de usar de Python facilita la ejecución de pruebas estadísticas y la implementación de técnicas analíticas, especialmente mediante el uso de la statsmodels
biblioteca .
Presentamos la biblioteca statsmodels en Python
La statsmodels
biblioteca es un módulo para Python que brinda fácil acceso a una variedad de herramientas estadísticas para realizar pruebas estadísticas y explorar datos. Hay una serie de pruebas y funciones estadísticas a las que la biblioteca otorga acceso, incluidas regresiones de mínimos cuadrados ordinarios (MCO), modelos lineales generalizados, modelos logit, análisis de componentes principales (PCA) y modelos de media móvil integrada autorregresiva (ARIMA).
Los resultados de los modelos se prueban constantemente con otros paquetes estadísticos para garantizar que los modelos sean precisos. Cuando se combina con SciPy y Pandas , es sencillo visualizar datos, ejecutar pruebas estadísticas y verificar la importancia de las relaciones.
Elegir un conjunto de datos
Antes de que podamos practicar estadísticas con Python, debemos seleccionar un conjunto de datos. Usaremos un conjunto de datos compilado por la Fundación Gapminder.
El conjunto de datos de Gapminder rastrea muchas variables utilizadas para evaluar la salud y el bienestar general de las poblaciones en países de todo el mundo. Usaremos el conjunto de datos porque está muy bien documentado, estandarizado y completo. No tendremos que hacer mucho en el proceso de preprocesamiento para poder utilizarlo.
Hay algunas cosas que queremos hacer solo para preparar el conjunto de datos para ejecutar regresiones, ANOVA y otras pruebas, pero en general el conjunto de datos está listo para trabajar.
El punto de partida para nuestro análisis estadístico del conjunto de datos de Gapminder es el análisis de datos exploratorio. Usaremos algunas funciones gráficas y de trazado de Matplotlib y Seaborn para visualizar algunas relaciones interesantes y tener una idea de qué relaciones variables podemos querer explorar.
Análisis exploratorio de datos y preprocesamiento
Empezaremos visualizando algunas posibles relaciones. Con Seaborn y Pandas podemos hacer algunas regresiones que analicen la fuerza de las correlaciones entre las variables de nuestro conjunto de datos para tener una idea de qué relaciones de variables vale la pena estudiar.
Importaremos esos dos y cualquier otra biblioteca que usemos aquí:
Te puede interesar:Patrones de diseño estructural en Pythonimport statsmodels.formula.api as smf
import statsmodels.stats.multicomp as multi
import scipy
from scipy.stats import pearsonr
import pandas as pd
from seaborn import regplot
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
No hay mucho preprocesamiento que tengamos que hacer, pero tenemos que hacer algunas cosas. Primero, comprobaremos que no falten null
datos o que falten y convertiremos cualquier entrada no numérica a numérica. También haremos una copia del marco de datos transformado con el que trabajaremos:
# Check for missing data
def check_missing_values(df, cols):
for col in cols:
print("Column {} is missing:".format(col))
print((df[col].values == ' ').sum())
print()
# Convert to numeric
def convert_numeric(dataframe, cols):
for col in cols:
dataframe[col] = pd.to_numeric(dataframe[col], errors="coerce")
df = pd.read_csv("gapminder.csv")
print("Null values:")
print(df.isnull().values.any())
cols = ['lifeexpectancy', 'breastcancerper100th', 'suicideper100th']
norm_cols = ['internetuserate', 'employrate']
df2 = df.copy()
check_missing_values(df, cols)
check_missing_values(df, norm_cols)
convert_numeric(df2, cols)
convert_numeric(df2, norm_cols)
Aquí están los resultados:
Null values:
Column lifeexpectancy is missing:
22
Column breastcancerper100th is missing:
40
Column suicideper100th is missing:
22
Column internetuserate is missing:
21
Column employrate is missing:
35
Hay un puñado de valores perdidos, pero nuestra conversión numérica debería convertirlos en NaN
valores, lo que permitiría realizar un análisis de datos exploratorio en el conjunto de datos.
Específicamente, podríamos intentar analizar la relación entre la tasa de uso de Internet y la esperanza de vida, o entre la tasa de uso de Internet y la tasa de empleo. Intentemos hacer gráficos individuales de algunas de estas relaciones usando Seaborn y Matplotlib:
sns.lmplot(x="internetuserate", y="breastcancerper100th", data=df2, fit_reg=False)
plt.title("Internet Use Rate and Breast Cancer Per 100k")
plt.show()
sns.lmplot(x="internetuserate", y="lifeexpectancy", data=df2, fit_reg=False)
plt.title("Internet Use Rate and Life Expectancy")
plt.show()
sns.lmplot(x="internetuserate", y="employrate", data=df2, fit_reg=False)
plt.title("Internet Use Rate and Employment Rate")
plt.show()
Aquí están los resultados de los gráficos:
Parece que hay algunas relaciones interesantes que podríamos investigar más a fondo. Curiosamente, parece haber una relación positiva bastante fuerte entre la tasa de uso de Internet y el cáncer de mama, aunque es probable que esto sea solo un artefacto de mejores pruebas en países que tienen más acceso a la tecnología.
También parece haber una relación bastante fuerte, aunque menos lineal, entre la esperanza de vida y la tasa de uso de Internet.
Por último, parece que existe una relación parabólica y no lineal entre la tasa de uso de Internet y la tasa de empleo.
Seleccionar una hipótesis adecuada
Queremos elegir una relación que merezca una mayor exploración. Aquí hay muchas relaciones potenciales sobre las que podríamos formular una hipótesis y explorar la relación con las pruebas estadísticas. Cuando hacemos una hipótesis y ejecutamos una prueba de correlación entre las dos variables, si la prueba de correlación es significativa, entonces necesitamos realizar pruebas estadísticas para ver qué tan fuerte es la correlación y si podemos decir de manera confiable que la correlación entre las dos variables es más que una simple casualidad.
El tipo de prueba estadística que utilicemos dependerá de la naturaleza de nuestras variables explicativas y de respuesta, también conocidas y variables independientes y dependientes . Repasaremos cómo ejecutar tres tipos diferentes de pruebas estadísticas:
Te puede interesar:Ordenar por cubos en Python- ANOVA
- Pruebas de chi-cuadrado
- Regresiones.
Seguiremos lo que visualizamos anteriormente y elegiremos explorar la relación entre las tasas de uso de Internet y la esperanza de vida.
La hipótesis nula es que no existe una relación significativa entre la tasa de uso de Internet y la esperanza de vida, mientras que nuestra hipótesis es que existe una relación entre las dos variables.
Realizaremos varios tipos de pruebas de hipótesis en el conjunto de datos. El tipo de prueba de hipótesis que utilizamos depende de la naturaleza de nuestras variables explicativas y de respuesta. Las diferentes combinaciones de variables explicativas y de respuesta requieren diferentes pruebas estadísticas. Por ejemplo, si una variable es categórica y una variable es de naturaleza cuantitativa, se requiere un análisis de varianza.
Análisis de varianza (ANOVA)
Un análisis de varianza (ANOVA) es una prueba estadística que se emplea para comparar dos o más medias juntas, que se determinan mediante el análisis de varianza. Las pruebas ANOVA unidireccionales se utilizan para analizar las diferencias entre grupos y determinar si las diferencias son estadísticamente significativas.
Los ANOVA unidireccionales comparan dos o más medias de grupos independientes, aunque en la práctica se utilizan con mayor frecuencia cuando hay al menos tres grupos independientes.
Para llevar a cabo un ANOVA en el conjunto de datos de Gapminder, necesitaremos transformar algunas de las características, ya que estos valores en el conjunto de datos son continuos, pero los análisis ANOVA son apropiados para situaciones en las que una variable es categórica y una variable es cuantitativa.
Podemos transformar los datos de continuos a cuantitativos seleccionando una categoría y agrupando la variable en cuestión, dividiéndola en percentiles. La variable independiente se convertirá en una variable categórica, mientras que la variable dependiente permanecerá continua. Podemos usar la qcut()
función en Pandas para dividir el marco de datos en bins:
def bin(dataframe, cols):
# Create new columns that store the binned data
for col in cols:
new_col_name = "{}_bins".format(col)
dataframe[new_col_name] = pd.qcut(dataframe[col], 10, labels=["1=10%", "2=20%", "3=30%", "4=40%", "5=50%", "6=60%", "7=70%", "8=80", "9=90%", "10=100%"])
df3 = df2.copy()
# This creates new columns filled with the binned column data
bin(df3, cols)
bin(df3, norm_cols)
Una vez que las variables se han transformado y están listas para ser analizadas, podemos usar la statsmodel
biblioteca para realizar un ANOVA sobre las características seleccionadas. Imprimiremos los resultados del ANOVA y comprobaremos si la relación entre las dos variables es estadísticamente significativa:
anova_df = df3[['lifeexpectancy', 'internetuserate_bins', 'employrate_bins']].dropna()
relate_df = df3[['lifeexpectancy', 'internetuserate_bins']]
anova = smf.ols(formula="lifeexpectancy ~ C(internetuserate_bins)", data=anova_df).fit()
print(anova.summary())
# We may also want to check the mean and standard deviation for the groups
mean = relate_df.groupby("internetuserate_bins").mean()
sd = relate_df.groupby("internetuserate_bins").std()
print(mean)
print(sd)
Aquí está la salida del modelo:
OLS Regression Results
==============================================================================
Dep. Variable: lifeexpectancy R-squared: 0.689
Model: OLS Adj. R-squared: 0.671
Method: Least Squares F-statistic: 38.65
Date: Mon, 11 May 2020 Prob (F-statistic): 1.71e-35
Time: 17:49:24 Log-Likelihood: -521.54
No. Observations: 167 AIC: 1063.
Df Residuals: 157 BIC: 1094.
Df Model: 9
Covariance Type: nonrobust
======================================================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------------------------------
Intercept 56.6603 1.268 44.700 0.000 54.157 59.164
C(internetuserate_bins)[T.2=20%] 1.6785 1.870 0.898 0.371 -2.015 5.372
C(internetuserate_bins)[T.3=30%] 5.5273 1.901 2.907 0.004 1.772 9.283
C(internetuserate_bins)[T.4=40%] 11.5693 1.842 6.282 0.000 7.932 15.207
C(internetuserate_bins)[T.5=50%] 14.6991 1.870 7.860 0.000 11.005 18.393
C(internetuserate_bins)[T.6=60%] 16.7287 1.870 8.946 0.000 13.035 20.422
C(internetuserate_bins)[T.7=70%] 17.8802 1.975 9.052 0.000 13.978 21.782
C(internetuserate_bins)[T.8=80] 19.8302 1.901 10.430 0.000 16.075 23.586
C(internetuserate_bins)[T.9=90%] 23.0723 1.901 12.135 0.000 19.317 26.828
C(internetuserate_bins)[T.10=100%] 23.3042 1.901 12.257 0.000 19.549 27.060
==============================================================================
Omnibus: 10.625 Durbin-Watson: 1.920
Prob(Omnibus): 0.005 Jarque-Bera (JB): 11.911
Skew: -0.484 Prob(JB): 0.00259
Kurtosis: 3.879 Cond. No. 10.0
==============================================================================
Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Podemos ver que el modelo da un valor P muy pequeño (estadístico Prob F) de 1.71e-35. Esto es mucho menor que el umbral de significación habitual de 0,05, por lo que concluimos que existe una relación significativa entre la esperanza de vida y la tasa de uso de Internet.
Te puede interesar:Leer y escribir archivos CSV en Python con PandasDado que el valor P de correlación parece ser significativo, y dado que tenemos 10 categorías diferentes, queremos ejecutar una prueba post-hoc para verificar que la diferencia entre las medias sigue siendo significativa incluso después de verificar el tipo 1 errores. Podemos realizar pruebas post-hoc con la ayuda del multicomp
módulo, utilizando una prueba de Tukey Honestly Significant Difference (Tukey HSD):
multi_comparison = multi.MultiComparison(anova_df["lifeexpectancy"], anova_df["internetuserate_bins"])
results = multi_comparison.tukeyhsd()
print(results)
Estos son los resultados de la prueba:
Multiple Comparison of Means - Tukey HSD, FWER=0.05
=======================================================
group1 group2 meandiff p-adj lower upper reject
-------------------------------------------------------
10=100% 1=10% -23.3042 0.001 -29.4069 -17.2015 True
10=100% 2=20% -21.6257 0.001 -27.9633 -15.2882 True
10=100% 3=30% -17.7769 0.001 -24.2097 -11.344 True
10=100% 4=40% -11.7349 0.001 -17.9865 -5.4833 True
10=100% 5=50% -8.6051 0.001 -14.9426 -2.2676 True
10=100% 6=60% -6.5755 0.0352 -12.913 -0.238 True
10=100% 7=70% -5.4241 0.2199 -12.0827 1.2346 False
10=100% 8=80 -3.4741 0.7474 -9.9069 2.9588 False
10=100% 9=90% -0.2319 0.9 -6.6647 6.201 False
1=10% 2=20% 1.6785 0.9 -4.3237 7.6807 False
1=10% 3=30% 5.5273 0.1127 -0.5754 11.6301 False
1=10% 4=40% 11.5693 0.001 5.6579 17.4807 True
1=10% 5=50% 14.6991 0.001 8.6969 20.7013 True
1=10% 6=60% 16.7287 0.001 10.7265 22.7309 True
1=10% 7=70% 17.8801 0.001 11.5399 24.2204 True
1=10% 8=80 19.8301 0.001 13.7274 25.9329 True
1=10% 9=90% 23.0723 0.001 16.9696 29.1751 True
2=20% 3=30% 3.8489 0.6171 -2.4887 10.1864 False
2=20% 4=40% 9.8908 0.001 3.7374 16.0443 True
2=20% 5=50% 13.0206 0.001 6.7799 19.2614 True
2=20% 6=60% 15.0502 0.001 8.8095 21.291 True
2=20% 7=70% 16.2017 0.001 9.6351 22.7683 True
2=20% 8=80 18.1517 0.001 11.8141 24.4892 True
2=20% 9=90% 21.3939 0.001 15.0563 27.7314 True
3=30% 4=40% 6.042 0.0678 -0.2096 12.2936 False
3=30% 5=50% 9.1718 0.001 2.8342 15.5093 True
3=30% 6=60% 11.2014 0.001 4.8638 17.5389 True
3=30% 7=70% 12.3528 0.001 5.6942 19.0114 True
3=30% 8=80 14.3028 0.001 7.87 20.7357 True
3=30% 9=90% 17.545 0.001 11.1122 23.9778 True
4=40% 5=50% 3.1298 0.8083 -3.0237 9.2833 False
4=40% 6=60% 5.1594 0.1862 -0.9941 11.3129 False
4=40% 7=70% 6.3108 0.0638 -0.1729 12.7945 False
4=40% 8=80 8.2608 0.0015 2.0092 14.5124 True
4=40% 9=90% 11.503 0.001 5.2514 17.7546 True
5=50% 6=60% 2.0296 0.9 -4.2112 8.2704 False
5=50% 7=70% 3.181 0.8552 -3.3856 9.7476 False
5=50% 8=80 5.131 0.2273 -1.2065 11.4686 False
5=50% 9=90% 8.3732 0.0015 2.0357 14.7108 True
6=60% 7=70% 1.1514 0.9 -5.4152 7.718 False
6=60% 8=80 3.1014 0.8456 -3.2361 9.439 False
6=60% 9=90% 6.3436 0.0496 0.0061 12.6812 True
7=70% 8=80 1.95 0.9 -4.7086 8.6086 False
7=70% 9=90% 5.1922 0.2754 -1.4664 11.8508 False
8=80 9=90% 3.2422 0.8173 -3.1907 9.675 False
-------------------------------------------------------
Ahora tenemos una mejor idea de qué grupos en nuestra comparación tienen diferencias estadísticamente significativas.
Si la reject
columna tiene una etiqueta de False
, sabemos que se recomienda rechazar la hipótesis nula y asumir que hay una diferencia significativa entre los dos grupos que se comparan.
La prueba chi-cuadrado de independencia
ANOVA es apropiado para instancias donde una variable es continua y la otra es categórica. Ahora veremos cómo realizar una prueba de independencia de chi-cuadrado .
La prueba de independencia de Chi-Cuadrado se utiliza cuando las variables explicativas y de respuesta son categóricas. Es probable que también desee utilizar la prueba de chi-cuadrado cuando la variable explicativa es cuantitativa y la variable de respuesta es categórica, lo que puede hacer dividiendo la variable explicativa en categorías.
La prueba de independencia de chi-cuadrado es una prueba estadística que se utiliza para analizar qué tan significativa es una relación entre dos variables categóricas. Cuando se ejecuta una prueba de chi-cuadrado, cada categoría en una variable tiene su frecuencia comparada con las categorías de la segunda variable. Esto significa que los datos se pueden mostrar como una tabla de frecuencia, donde las filas representan las variables independientes y las columnas representan las variables dependientes.
Al igual que convertimos nuestra variable independiente en una variable categórica (al agruparla), para la prueba ANOVA, necesitamos hacer ambas variables categóricas para realizar la prueba Chi-Cuadrado. Nuestra hipótesis para este problema es la misma que la del problema anterior, que existe una relación significativa entre la esperanza de vida y la tasa de uso de Internet.
Mantendremos las cosas simples por ahora y dividiremos nuestra variable de tasa de uso de Internet en dos categorías, aunque fácilmente podríamos hacer más. Escribiremos una función para manejar eso.
Realizaremos una comparación post-hoc para protegernos contra errores de tipo 1 (falsos positivos) utilizando un enfoque llamado Ajuste de Bonferroni. Para hacer esto, puede realizar comparaciones para los diferentes pares posibles de su variable de respuesta, y luego verificar su significado ajustado.
Te puede interesar:PNL simple en Python con TextBlob: tokenizaciónNo haremos comparaciones para todos los diferentes pares posibles aquí, solo mostraremos cómo se puede hacer. Haremos algunas comparaciones diferentes usando un esquema de recodificación y mapearemos los registros en nuevas columnas de características.
Luego, podemos verificar los conteos observados y crear tablas de esas comparaciones:
def half_bin(dataframe, cols):
for col in cols:
new_col_name = "{}_bins_2".format(col)
dataframe[new_col_name] = pd.qcut(dataframe[col], 2, labels=["1=50%", "2=100%"])
half_bin(df3, ['internetuserate'])
# Recoding scheme
recode_2 = {"3=30%": "3=30%", "7=70%": "7=70%"}
recode_3 = {"2=20%": "2=20%", "8=80": "8=80"}
recode_4 = {"6=60%": "6=60%", "9=90%": "9=90%"}
recode_5 = {"4=40%": "4=40%", "7=70%": "7=70%"}
# Create the new features
df3['Comp_3v7'] = df3['lifeexpectancy_bins'].map(recode_2)
df3['Comp_2v8'] = df3['lifeexpectancy_bins'].map(recode_3)
df3['Comp_6v9'] = df3['lifeexpectancy_bins'].map(recode_4)
df3['Comp_4v7'] = df3['lifeexpectancy_bins'].map(recode_5)
Ejecutar una prueba de chi-cuadrado y una comparación post-hoc implica primero construir una tabla de comparación de tabulaciones cruzadas. La tabla de comparación de tabulaciones cruzadas muestra el porcentaje de ocurrencia de la variable de respuesta para los diferentes niveles de la variable explicativa.
Solo para tener una idea de cómo funciona esto, imprimamos los resultados de todas las comparaciones de contenedores de esperanza de vida:
# Get table of observed counts
count_table = pd.crosstab(df3['internetuserate_bins_2'], df3['lifeexpectancy_bins'])
print(count_table)
lifeexpectancy_bins 1=10% 2=20% 3=30% 4=40% ... 7=70% 8=80 9=90% 10=100%
internetuserate_bins_2 ...
1=50% 18 19 16 14 ... 4 4 1 0
2=100% 0 0 1 4 ... 15 11 16 19
Podemos ver que una comparación de tablas cruzadas verifica la frecuencia de las categorías de una variable en la segunda variable. Arriba vemos la distribución de las expectativas de vida en situaciones en las que caen en uno de los dos contenedores que creamos.
Ahora necesitamos calcular las tablas cruzadas para los diferentes pares que creamos anteriormente, ya que esto es lo que ejecutamos a través de la prueba Chi-Cuadrado:
count_table_3 = pd.crosstab(df3['internetuserate_bins_2'], df3['Comp_3v7'])
count_table_4 = pd.crosstab(df3['internetuserate_bins_2'], df3['Comp_2v8'])
count_table_5 = pd.crosstab(df3['internetuserate_bins_2'], df3['Comp_6v9'])
count_table_6 = pd.crosstab(df3['internetuserate_bins_2'], df3['Comp_4v7'])
Una vez que hemos transformado las variables para que se pueda realizar la prueba de Chi-Cuadrado, podemos utilizar la chi2_contingency
función in statsmodel
para realizar la prueba.
Queremos imprimir los porcentajes de columna, así como los resultados de la prueba Chi-Cuadrado, y crearemos una función para hacer esto. Luego usaremos nuestra función para hacer la prueba Chi-Cuadrado para las cuatro tablas de comparación que creamos:
def chi_sq_test(table):
print("Results for:")
print(str(table))
# Get column percentages
col_sum = table.sum(axis=0)
col_percents = table/col_sum
print(col_percents)
chi_square = scipy.stats.chi2_contingency(table)
print("Chi-square value, p-value, expected_counts")
print(chi_square)
print()
print("Initial Chi-square:")
chi_sq_test(count_table)
print(" ")
chi_sq_test(count_table_3)
chi_sq_test(count_table_4)
chi_sq_test(count_table_5)
chi_sq_test(count_table_6)
Aquí están los resultados:
Initial Chi-square:
Results for:
lifeexpectancy_bins 1=10% 2=20% 3=30% 4=40% ... 7=70% 8=80 9=90% 10=100%
internetuserate_bins_2 ...
1=50% 18 19 16 14 ... 4 4 1 0
2=100% 0 0 1 4 ... 15 11 16 19
[2 rows x 10 columns]
lifeexpectancy_bins 1=10% 2=20% 3=30% ... 8=80 9=90% 10=100%
internetuserate_bins_2 ...
1=50% 1.0 1.0 0.941176 ... 0.266667 0.058824 0.0
2=100% 0.0 0.0 0.058824 ... 0.733333 0.941176 1.0
[2 rows x 10 columns]
Chi-square value, p-value, expected_counts
(102.04563740451277, 6.064860600653971e-18, 9, array([[9.45251397, 9.97765363, 8.9273743 , 9.45251397, 9.45251397,
9.97765363, 9.97765363, 7.87709497, 8.9273743 , 9.97765363],
[8.54748603, 9.02234637, 8.0726257 , 8.54748603, 8.54748603,
9.02234637, 9.02234637, 7.12290503, 8.0726257 , 9.02234637]]))
-----
Results for:
Comp_3v7 3=30% 7=70%
internetuserate_bins_2
1=50% 16 4
2=100% 1 15
Comp_3v7 3=30% 7=70%
internetuserate_bins_2
1=50% 0.941176 0.210526
2=100% 0.058824 0.789474
Chi-square value, p-value, expected_counts
(16.55247678018576, 4.7322137795376575e-05, 1, array([[ 9.44444444, 10.55555556],
[ 7.55555556, 8.44444444]]))
-----
Results for:
Comp_2v8 2=20% 8=80
internetuserate_bins_2
1=50% 19 4
2=100% 0 11
Comp_2v8 2=20% 8=80
internetuserate_bins_2
1=50% 1.0 0.266667
2=100% 0.0 0.733333
Chi-square value, p-value, expected_counts
(17.382650301643437, 3.0560286589975315e-05, 1, array([[12.85294118, 10.14705882],
[ 6.14705882, 4.85294118]]))
-----
Results for:
Comp_6v9 6=60% 9=90%
internetuserate_bins_2
1=50% 6 1
2=100% 13 16
Comp_6v9 6=60% 9=90%
internetuserate_bins_2
1=50% 0.315789 0.058824
2=100% 0.684211 0.941176
Chi-square value, p-value, expected_counts
(2.319693757720874, 0.12774517376836148, 1, array([[ 3.69444444, 3.30555556],
[15.30555556, 13.69444444]]))
-----
Results for:
Comp_4v7 4=40% 7=70%
internetuserate_bins_2
1=50% 14 4
2=100% 4 15
Comp_4v7 4=40% 7=70%
internetuserate_bins_2
1=50% 0.777778 0.210526
2=100% 0.222222 0.789474
Chi-square value, p-value, expected_counts
(9.743247922437677, 0.0017998260000241526, 1, array([[8.75675676, 9.24324324],
[9.24324324, 9.75675676]]))
-----
Si solo observamos los resultados de la tabla de recuento completo, parece que hay un valor P de 6.064860600653971e-18.
Te puede interesar:Reemplazar las apariciones de una subcadena en una cadena con PythonSin embargo, para determinar cómo los diferentes grupos divergen entre sí, necesitamos realizar la prueba de Chi-Cuadrado para los diferentes pares en nuestro marco de datos. Comprobaremos para ver si hay una diferencia estadísticamente significativa para cada uno de los diferentes pares que seleccionamos. Tenga en cuenta que el valor P que indica un resultado significativo cambia según la cantidad de comparaciones que esté haciendo, y aunque no lo cubriremos en este tutorial, deberá tenerlo en cuenta.
La comparación 6 vs 9 nos da un valor P de 0.127
, que está por encima del 0.05
umbral, lo que indica que la diferencia para esa categoría puede no ser significativa. Ver las diferencias de las comparaciones nos ayuda a comprender por qué necesitamos comparar diferentes niveles entre sí.
correlación de Pearson
Hemos cubierto la prueba que debe usar cuando tiene una variable explicativa categórica y una variable de respuesta cuantitativa (ANOVA), así como la prueba que usa cuando tiene dos variables categóricas (Chi-Cuadrado).
Ahora veremos el tipo de prueba apropiado para usar cuando tenga una variable explicativa cuantitativa y una variable de respuesta cuantitativa: la correlación de Pearson.
La prueba de correlación de Pearson se utiliza para analizar la fuerza de una relación entre dos variables proporcionadas, ambas de naturaleza cuantitativa. El valor, o la fuerza de la correlación de Pearson, estará entre +1 y -1.
Una correlación de 1 indica una asociación perfecta entre las variables y la correlación es positiva o negativa. Los coeficientes de correlación cercanos a 0 indican correlaciones muy débiles, casi inexistentes. Si bien existen otras formas de medir las correlaciones entre dos variables, como la correlación de Spearman o la correlación de rango de Kendall, la correlación de Pearson es probablemente la prueba de correlación más utilizada.
Como el conjunto de datos de Gapminder tiene sus características representadas con variables cuantitativas, no necesitamos hacer ninguna transformación categórica de los datos antes de ejecutar una correlación de Pearson en él. Tenga en cuenta que se supone que ambas variables se distribuyen normalmente y que no hay muchos valores atípicos significativos en el conjunto de datos. Necesitaremos acceso a SciPy para realizar la correlación de Pearson.
Graficaremos la relación entre la esperanza de vida y las tasas de uso de Internet, así como la tasa de uso de Internet y la tasa de empleo, solo para ver cómo se vería otro gráfico de correlación. Después de crear una función gráfica, usaremos la personr()
función de SciPy para realizar la correlación y verificar los resultados:
df_clean = df2.dropna()
df_clean['incomeperperson'] = df_clean['incomeperperson'].replace('', np.nan)
def plt_regression(x, y, data, label_1, label_2):
reg_plot = regplot(x=x, y=y, fit_reg=True, data=data)
plt.xlabel(label_1)
plt.ylabel(label_2)
plt.show()
plt_regression('lifeexpectancy', 'internetuserate', df_clean, 'Life Expectancy', 'Internet Use Rate')
plt_regression('employrate', 'internetuserate', df_clean, 'Employment Rate', 'Internet Use Rate')
print('Assoc. - life expectancy and internet use rate')
print(pearsonr(df_clean['lifeexpectancy'], df_clean['internetuserate']))
print('Assoc. - between employment rate and internet use rate')
print(pearsonr(df_clean['employrate'], df_clean['internetuserate']))
Aquí están los resultados:
Assoc. - life expectancy and internet use rate
(0.77081050888289, 5.983388253650836e-33)
Assoc. - between employment rate and internet use rate
(-0.1950109538173115, 0.013175901971555317)
El primer valor es la dirección y la fuerza de la correlación, mientras que el segundo es el valor P. Los números sugieren una correlación bastante fuerte entre la esperanza de vida y la tasa de uso de Internet que no se debe al azar. Mientras tanto, existe una correlación más débil, aunque significativa, entre la tasa de empleo y la tasa de uso de Internet.
Te puede interesar:Detección facial en Python con OpenCVTenga en cuenta que también es posible ejecutar una correlación de Pearson en datos categóricos, aunque los resultados se verán algo diferentes. Si quisiéramos, podríamos agrupar los niveles de ingresos y ejecutar la correlación de Pearson en ellos. Puede usarlo para verificar la presencia de variables moderadoras que podrían tener un efecto en su asociación de interés.
Moderadores e interacción estadística
Veamos cómo contabilizar la interacción estadística entre múltiples variables, también conocida como moderación.
La moderación es cuando una tercera (o más) variable impacta la fuerza de la asociación entre la variable independiente y la variable dependiente.
Hay diferentes formas de probar la moderación / interacción estadística entre una tercera variable y las variables independientes / dependientes. Por ejemplo, si realizó una prueba ANOVA, podría probar la moderación haciendo una prueba ANOVA bidireccional para probar una posible moderación.
Sin embargo, una forma confiable de probar la moderación, sin importar qué tipo de prueba estadística ejecutó (ANOVA, Chi-Cuadrado, Correlación de Pearson) es verificar si existe una asociación entre las variables explicativas y de respuesta para cada subgrupo / nivel del tercero. variable.
Para ser más concretos, si estuvieras realizando pruebas ANOVA, podrías ejecutar un ANOVA para cada categoría en la tercera variable (la variable que sospechas podría tener un efecto moderador en la relación que estás estudiando).
Si estuviera utilizando una prueba de Chi-Cuadrado, podría simplemente realizar una prueba de Chi-Cuadrado en nuevos marcos de datos que contengan todos los puntos de datos encontrados dentro de las categorías de su variable moderadora.
Si su prueba estadística es una correlación de Pearson, deberá crear categorías o bins para la variable moderadora y luego ejecutar la correlación de Pearson para los tres bins.
Echemos un vistazo rápido a cómo realizar correlaciones de Pearson para moderar variables. Crearemos categorías / niveles artificiales a partir de nuestras funciones continuas. El proceso de prueba de moderación para los otros dos tipos de prueba (Chi-Cuadrado y ANOVA) es muy similar, pero tendrá variables categóricas preexistentes con las que trabajar en su lugar.
Queremos elegir una variable adecuada para que actúe como nuestra variable moderadora. Probemos el nivel de ingresos por persona y dividímoslo en tres grupos diferentes:
Te puede interesar:Estimación de la densidad del kernel en Python usando Scikit-Learndef income_groups(row):
if row['incomeperperson'] <= 744.23:
return 1
elif row['incomeperperson'] <= 942.32:
return 2
else:
return 3
# Apply function and set the new features in the dataframe
df_clean['income_group'] = df_clean.apply(lambda row: income_groups(row), axis=1)
# Create a few subframes to try test for moderation
subframe_1 = df_clean[(df_clean['income_group'] == 1)]
subframe_2 = df_clean[(df_clean['income_group'] == 2)]
subframe_3 = df_clean[(df_clean['income_group'] == 3)]
print('Assoc. - life expectancy and internet use rate for low income countries')
print(pearsonr(subframe_1['lifeexpectancy'], subframe_1['internetuserate']))
print('Assoc. - life expectancy and internet use rate for medium income countries')
print(pearsonr(subframe_2['lifeexpectancy'], subframe_2['internetuserate']))
print('Assoc. - life expectancy and internet use rate for high income countries')
print(pearsonr(subframe_3['lifeexpectancy'], subframe_3['internetuserate']))
Aquí están los resultados:
Assoc. - life expectancy and internet use rate for low income countries
(0.38386370068495235, 0.010101223355274047)
Assoc. - life expectancy and internet use rate for medium income countries
(0.9966009508278395, 0.05250454954743393)
Assoc. - life expectancy and internet use rate for high income countries
(0.7019997488251704, 6.526819886007788e-18)
Una vez más, el primer valor es la dirección y la fuerza de la correlación, mientras que el segundo es el valor P.
Conclusión
statsmodels
es una biblioteca extremadamente útil que permite a los usuarios de Python analizar datos y ejecutar pruebas estadísticas en conjuntos de datos. Puede realizar ANOVA, pruebas de chi-cuadrado, correlaciones de Pearson y pruebas de moderación.
Una vez que se familiarice con cómo llevar a cabo estas pruebas, podrá probar las relaciones significativas entre las variables dependientes e independientes, adaptándose a la naturaleza categórica o continua de las variables.