Как я мог бы построить график относительной частоты разделения данных на категории?

#python #python-3.x #pandas #matplotlib

#python #python-3.x #панды #matplotlib

Вопрос:

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

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

Фрейм данных выглядит следующим образом:

 Weight   Category
83.8     A
87.3     A
75.1     B
70.9     A
69.8     C
75.5     B
...      ...
 

Я думал о том, чтобы извлечь вес каждой категории в ее собственный фрейм данных, и мне удалось получить относительную частоту одной категории, но я не уверен, как построить их все вместе.

 # This holds the total number of people in each category, with categories in alphabetical order
counts = df.groupby("Category")["Weight"].count()

catA = df.loc[df["Category"] == "A"]["Weight"].reset_index().drop(columns="index")
catA["bucket"] = pd.cut(catA["Weight"], 10)

newA = catA[["bucket", "Weight"]].groupby("bucket").count()
newE["relative"] = newE["Weight"] / counts[0]

ax = newA["relative"].plot(kind="bar", title="Relative Frequency of Weight for Category A")
ax.set(xlabel="Weight Bucket", ylabel="Relative Frequency (%)")
ax.tick_params(axis="x", labelrotation=45)
plt.show()
 

Ответ №1:

Seaborn — это библиотека визуализации данных Python, основанная на matplotlib. Он предоставляет высокоуровневый интерфейс для рисования привлекательных и информативных статистических графиков. (https://seaborn.pydata.org /)

у вас не будет такой гибкости, как с необработанным matplotlib, но, возможно, это просто работает для вас и дает вам мощные настройки по умолчанию.

использование гистограммы с hue и multiple= dodge, похоже, делает то, что вы ищете. из официальных документов по адресу https://seaborn.pydata.org/generated/seaborn.histplot.html#seaborn.histplot

 sns.histplot(data=tips, x="day", hue="sex", multiple="dodge", shrink=.8)
 

сиборн

Ответ №2:

pd.cut Используйте для определения вашей частоты и для подсчета pd.crosstab :

 (pd.crosstab(pd.cut(df['Weight'], bins=np.linspace(0,100,10)),
             df['Category'])
   .plot.bar()
)
 

Комментарии:

1. Это выглядит многообещающе! Однако есть ли способ преобразовать его в график относительной частоты?

2. Передайте normalize=’index’ в перекрестную вкладку?

3. Кроме того, вы можете передать ‘вероятность’ атрибуту ‘stat’ функции histplot.