Я собираюсь проигнорировать ваш комментарий относительно:
Я не хочу преобразовывать его в числовые данные.Позже становится сложно объяснить клиенту.
Предполагая, что вашим главным приоритетом является понимание, а не как вы получаете это понимание, вот как я это сделаю:
Задача:
Ваша основная проблема заключается в том, что ваши категориальные данные собраны в столбец, а не закодированы как фиктивные переменные.Таким образом, суть вашей задачи заключается в перекодировании ваших данных из столбца категориальных переменных в набор фиктивных переменных.pd.get_dummies()
сделает это за вас в одной строке кода.После этого вы можете очень легко добавить и / или удалить любую переменную, которая вам нужна в вашей окончательной модели.
Некоторые данные:
Поскольку вы не предоставили образецданные, вот фрагмент кода, который создаст кадр данных с некоторыми случайными данными для возраста дохода, а также некоторые случайно расположенные уровни образования:
фрагмент 1:
import pandas as pd
import numpy as np
import statsmodels.api as sm
# Sample data
np.random.seed(123)
rows = 50
dfx = pd.DataFrame(np.random.randint(90,110,size=(rows, 1)), columns=['Income'])
dfy = pd.DataFrame(np.random.randint(25,68,size=(rows, 1)), columns=['Age'])
df = pd.concat([dfx,dfy], axis = 1)
# Categorical column
dummyVars = ['std_10', 'std_12', 'Graduate', 'PG', 'Dr']
df['education'] = np.random.choice(dummyVars, len(df))
print(df.tail(5))
Выход 1:
Index Income Age education
45 103 60 std_12
46 108 60 PG
47 94 26 std_12
48 105 41 std_10
49 101 30 std_12
Теперь вы можете использовать pd.get_dummies()
, чтобы разбить столбец образования на несколько столбцов с каждым уровнем как отдельным столбцом, содержащим нули и единицы, указывающие, действительно лификтивная переменная встречается для данного индекса.
Фрагмент 2:
# Split dummy variables
df = pd.concat([df, pd.get_dummies(df['education'].astype('category'), prefix = 'd')], axis = 1)
print(df.tail(5))
Выход 2:
Index Income Age education d_Dr d_Graduate d_PG d_std_10 d_std_12
45 103 60 std_12 0 0 0 0 1
46 108 60 PG 0 0 1 0 0
47 94 26 std_12 0 0 0 0 1
48 105 41 std_10 0 0 0 1 0
49 101 30 std_12 0 0 0 0 1
И теперь вы можете легко увидеть, какие фиктивные переменные являются значимыми, и выбрать, сохранять их в своем анализе или нет:
Фрагмент 3:
# Explanatory variables, subset 1
regression1 = sm.OLS(df['Income'], df[['Age', 'd_Dr', 'd_Graduate', 'd_PG', 'd_std_10', 'd_std_12']]).fit()
regression1.summary()
Выход 3:
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Age -0.0123 0.075 -0.165 0.870 -0.163 0.138
d_Dr 98.8509 3.759 26.300 0.000 91.276 106.426
d_Graduate 98.5567 4.684 21.042 0.000 89.117 107.996
d_PG 97.0613 4.109 23.622 0.000 88.780 105.342
d_std_10 100.2472 3.554 28.209 0.000 93.085 107.409
d_std_12 98.3209 3.804 25.845 0.000 90.654 105.988
Неудивительно, что все фиктивные переменные несущественныМы используем (небольшую) случайную выборку, но вы можете удалить не менее значимых переменных и повторно запустить анализ следующим образом:
Фрагмент 4:
# Explanatory variables, subset 2
regression2 = sm.OLS(df['Income'], df[['Age', 'd_Dr', 'd_Graduate', 'd_PG']]).fit()
regression2.summary()
Выход 4:
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Age 1.9771 0.123 16.011 0.000 1.729 2.226
d_Dr 11.0105 9.601 1.147 0.257 -8.316 30.337
d_Graduate 8.5356 15.304 0.558 0.580 -22.270 39.341
d_PG 6.2942 11.543 0.545 0.588 -16.940 29.529
Надеюсь, это то, что вы можете использовать.Не стесняйтесь, дайте мне знать, если нет.
Вот все, что нужно для простого копирования и вставки:
#%%
import pandas as pd
import numpy as np
import statsmodels.api as sm
# Sample data
np.random.seed(123)
rows = 50
dfx = pd.DataFrame(np.random.randint(90,110,size=(rows, 1)), columns=['Income'])
dfy = pd.DataFrame(np.random.randint(25,68,size=(rows, 1)), columns=['Age'])
df = pd.concat([dfx,dfy], axis = 1)
# Categorical column
dummyVars = ['std_10', 'std_12', 'Graduate', 'PG', 'Dr']
df['education'] = np.random.choice(dummyVars, len(df))
print(df.tail(5))
#%%
# Split dummy variables
df = pd.concat([df, pd.get_dummies(df['education'].astype('category'), prefix = 'd')], axis = 1)
print(df.tail(5))
# Explanatory variables, subset 1
regression1 = sm.OLS(df['Income'], df[['Age', 'd_Dr', 'd_Graduate', 'd_PG', 'd_std_10', 'd_std_12']]).fit()
regression1.summary()
# Explanatory variables, subset 2
regression2 = sm.OLS(df['Income'], df[['Age', 'd_Dr', 'd_Graduate', 'd_PG']]).fit()
regression2.summary()