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铆:
import 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:
- 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.
Dado 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.
No 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.
Sin 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.
Tenga 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:
def 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.