Есть ли какой-либо способ построения нескольких категориальных переменных для одной числовой переменной в Python?

#python #matplotlib #seaborn #categorical-data

#python #matplotlib #сиборн #категориальный-данные

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

 categorical_1    categorical_2    categorical_3 ... dummy
A                YY               DDDE              0   
A                ZZ               EEFG              0    
B                ZZ               DDDE              1    
C                YY               DDDE              1    
A                XX               EEFG              0    
.
.
.
  

Я хочу составить графики среднего значения фиктивного столбца по оси y и категорий по оси x. Обычно я бы сделал что-то вроде этого:

 df.groupby("categorical_1")["dummy"].mean().plot(kind="bar")
  

Однако столбцов слишком много, и я не знаю, как это сделать для всех из них. Есть ли простой способ сделать это?

Я знаю, что для числовых переменных мы могли бы сделать что-то вроде этого:

 #scatterplot
sns.set()
cols = ['column1', 'column2',...,'columnn']
sns.pairplot(df[cols], size = 2.5)
  

Но я не уверен, что делать с категориальными переменными

Ответ №1:

Есть несколько возможностей, о которых я могу подумать.

Во-первых, вы можете использовать seaborn, но вам нужно изменить формат вашего фрейма данных. Проблема с этим решением заключается в том, что все уровни оттенков отображаются на каждом уровне x.

 df2 = df.melt(id_vars=['dummy'], value_vars=cols)
plt.figure()
sns.barplot(data=df2, x='variable', y='dummy', hue='value')
  

введите описание изображения здесь

Или вы можете использовать pandas и выполнять итерации по столбцам, но тогда будет проще создать один подзаголовок для каждого столбца:

 cols = df.columns[df.columns.str.startswith('categorical')]
target_col = 'dummy'
height = 2
width = 2
n_cols = len(cols)

fig, axs = plt.subplots(1,n_cols, figsize=(n_cols*width,height), gridspec_kw={'wspace':0}, sharey=True)

for col,ax in zip(cols,axs):
    df.groupby(col)[target_col].mean().plot(kind="bar", ax=ax)
plt.tight_layout()
  

введите описание изображения здесь