#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