Я бы использовал сюжет для скрипки или boxplot из библиотеки Seaborn. Вот фрагмент:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
income = list(np.random.normal(4000, 1500, 500)) + list(np.random.normal(7000, 800, 500))
alcoholic = ['no']*500 + ['yes']*500
df = pd.DataFrame({'income':income, 'alcoholic':alcoholic})
sns.violinplot(data=df, x='alcoholic', y='income')
![enter image description here](https://i.stack.imgur.com/zISJ4.png)
sns.boxplot(data=df, x='alcoholic', y='income')
![enter image description here](https://i.stack.imgur.com/LoGHA.png)