ggplot суммирует среднее значение категориальной переменной по оси y - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь скопировать Python график в R, который я нашел в этой записной книжке Kaggle: Titani c Data Science Solutions

Это код Python для создать график, используемый набор данных можно найти здесь :

import seaborn as sns
...

grid = sns.FacetGrid(train_df, row='Embarked', size=2.2, aspect=1.6)
grid.map(sns.pointplot, 'Pclass', 'Survived', 'Sex', palette='deep')
grid.add_legend()

Вот результирующий график .

Seaborn Plot

Столбец survival принимает значения 0 и 1 (выжить или не выжить), а на оси Y отображается среднее значение для pclass. При поиске способа вычисления среднего значения с использованием ggplot2 я обычно нахожу функцию stat_summary(). Лучшее, что я мог сделать, это:

library(dplyr)
library(ggplot2)
...

train_df %>%
  ggplot(aes(x = factor(Pclass), y = Survived, group = Sex, colour = Sex)) +
  stat_summary(fun.y = mean, geom = "line") +
  facet_grid(Embarked ~ .)

Выход можно найти здесь .

R Plot Output

Есть некоторые проблемы:

  • Кажется, есть пустой аспект, может быть, от NA в Embarked?
  • Точки не совпадают с линией
  • Линии отличаются от линий на Python графике

Я думаю, что я тоже не полностью схватил многоуровневую концепцию ggplot. Я хотел бы отделить geom = "line" в функции stat_summary() и добавить его как + geom_line().

1 Ответ

3 голосов
/ 05 февраля 2020

На самом деле в train_df$Embarked есть пустой уровень (т.е. ""). Вы можете отфильтровать это перед построением графика.

train_df <- read.csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')
train_df <- subset(train_df, Embarked != "")

ggplot(train_df, aes(x = factor(Pclass), y = Survived, group = Sex, colour = Sex)) +
  stat_summary(fun.data = 'mean_cl_boot') +
  geom_line(stat = 'summary', fun.y = mean) +
  facet_grid(Embarked ~ .)

Вы можете повторить график python, нарисовав доверительные интервалы, используя stat_summary. Хотя ваши строки с stat_summary были великолепны, я переписал их как вызов geom_line, как вы и просили.

Обратите внимание, что ваш код ggplot не рисует никаких точек, поэтому я не могу ответить эта часть, но, вероятно, вы рисуете необработанные значения, которые просто много 0 и 1.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...