Python — тест Anova в нескольких циклах

#python #pandas #loops #statsmodels #anova

#python #pandas #циклы #statsmodels #anova

Вопрос:

В моем фрейме данных у меня мало категориальных переменных и несколько непрерывных переменных. Я хочу выполнить анализ Anova (anova_lm) для каждой комбинации категориальной и непрерывной переменных. До сих пор я смог создать цикл только для 1 целевой категории со всеми непрерывными переменными в качестве предикторов, например:

У меня есть мой исходный набор данных pima с этими столбцами:

ПОЛ — категориальный ВОЗРАСТ — непрерывное ОБРАЗОВАНИЕ — категориальный ДОХОД — категориальный ПРОЦЕНТ_ИНТЕРЕС — непрерывный SPD — категориальный TPD — категориальный AMT_ANNUITY — непрерывный АВАНСОВЫЙ ПЛАТЕЖ — непрерывный

Из набора данных я определил pima_cont , который содержит только непрерывные переменные. Из набора данных я также определил pima_categ, который содержит только категориальные переменные.

 keys = []
tables = []
for variable in pima_cont.columns:
    model = ols('{} ~ EDUCATION'.format(variable), data=pima).fit()
    anova_table = sm.stats.anova_lm(model, typ=2)

    keys.append(variable)
    tables.append(anova_table)

df_anova = pd.concat(tables, keys=keys, axis=0)
print(df_anova)
  

Здесь я должен вручную отредактировать свою цель в этой части инструкции model = ols('{} ~ EDUCATION'.format(variable), data=pima).fit()

Любые советы, как это можно автоматизировать, чтобы Python показывал мне тот же результат, но для всех моих категориальных переменных в качестве целевых?

Большое спасибо! Адам

Ответ №1:

Вам нужен мультииндекс, просто используя пример 2 x 2 ниже:

 import pandas as pd
import statsmodels.api as sm
import numpy as np
from statsmodels.formula.api import ols

pima = pd.DataFrame({'EDUCATION':np.random.choice(['A','B','C'],100),
                     'GENDER':np.random.choice(['M','F'],100),
                    'AGE':np.random.randn(100),
                    'RATE_INTEREST':np.random.randn(100)})
  

Создайте мультииндекс для возможных комбинаций:

 index = pd.MultiIndex.from_product([['AGE','RATE_INTEREST'],['EDUCATION','GENDER']],
                                   names=['cont', 'cat'])
index

MultiIndex([(          'AGE', 'EDUCATION'),
            (          'AGE',    'GENDER'),
            ('RATE_INTEREST', 'EDUCATION'),
            ('RATE_INTEREST',    'GENDER')],
           names=['cont', 'cat'])
  

Тогда аналогично тому, что у вас есть выше:

 tables = []
for cont_var,cat_var in index:
    model = ols('{} ~ {}'.format(cont_var,cat_var), data=pima).fit()
    anova_table = sm.stats.anova_lm(model, typ=2)

    tables.append(anova_table)

df_anova = pd.concat(tables, keys=index, axis=0)
  

Итоговая таблица выглядит следующим образом:

                                       sum_sq    df         F    PR(>F)
AGE           EDUCATION EDUCATION   0.358636   2.0  0.196421  0.821993
                        Residual   88.554164  97.0       NaN       NaN
              GENDER    GENDER      0.258418   1.0  0.285659  0.594226
                        Residual   88.654382  98.0       NaN       NaN
RATE_INTEREST EDUCATION EDUCATION   0.021586   2.0  0.012325  0.987752
                        Residual   84.942705  97.0       NaN       NaN
              GENDER    GENDER      0.656981   1.0  0.763684  0.384315
                        Residual   84.307310  98.0       NaN       NaN