An谩lisis estad铆stico de hip贸tesis en Python con ANOVAs, Chi-cuadrado y correlaci贸n de Pearson

    Introducci贸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 statsmodelsbiblioteca .

    Presentamos la biblioteca statsmodels en Python

    La statsmodelsbiblioteca 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 nulldatos 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 NaNvalores, 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 statsmodelbiblioteca 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 multicompm贸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 rejectcolumna 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_contingencyfunci贸n in statsmodelpara 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.05umbral, 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

    statsmodelses 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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *