---
title: "Geoms & EDA w/Titanic Data"
subtitle: "Statistical Transformations"
theme: darkly
date: today
toc: true
format:
  html: 
    code-overflow: wrap
    toc: true
    toc-title: "Contents"
    # hide code?

execute:
  warning: false
  message: false
---



These notes are based on the `ggstat` [vignette](https://cran.r-project.org/web/packages/ggstats/vignettes/stat_prop.html).

`stat_prop()` is part of `ggstat`, an extension to `ggplot2`. It is a variation of `stat_count()` allowing to compute custom proportions according to the `by`**aesthetic** defining the denominator (i.e. all proportions for a same value of `by` will sum to 1). **The by aesthetic should be a factor**. Therefore, `stat_prop()` requires the by aesthetic and this by aesthetic should be a factor.

### libraries & ggplot extensions

```{r}
#install.packages("ggstats")
suppressPackageStartupMessages({
library(ggstats)
library(tidyverse)
})
```

#### The Titanic dataset:

The Titanic dataset (in R's datasets) is a 4-D array.  Access it like this:

```{r}
# Examine all the entries
Titanic[,,,]

# The first-class data
Titanic[1,,,]

# The 3rd-class data
Titanic[3,,,]

# The Female 2nd-class data
Titanic[1,2,,]
```
To tidy this data we can use `as.data.frame`


```{r}
d <- as.data.frame(Titanic)
glimpse(d)
```

Count people on board by class and sex.

```{r}
group_by(d,Class,Sex) |> summarize(n = sum(Freq))
```


**In the following example, we:**

1.  use `stat = "prop"` to tell `geom_text()` to use `stat_prop()`
2.  used the `position_stack` in to place text atop its stack

```{r}
p <- ggplot(d) +
  # what happens when you remove "weight = Freq"?
  aes(x = Class, fill = Survived, weight = Freq) +
  geom_bar() +
  # halfway up the stack
  geom_text(stat = "prop", position = position_stack(.5)) +
  labs(title = "Both Counts & Percentages")

print(p)
```

**In the following example, we:**

1.  use `stat = "prop"` tell `` `geom_text() `` to use `stat_prop()`

2.  defined the **by** aesthetic (here we want to compute the proportions separately for each value of **x**)

3.  used `position_fill()` when calling `geom_text()` to match the position = "fill" in geom_bar()

```{r}
p <- ggplot(d) +
  aes(x = Class, fill = Survived, weight = Freq, by = Class) +
  geom_bar(position = "fill") +
  geom_text(stat = "prop", position = position_fill(.5)) + 
  labs(title = "Proportions & Percentages")

print(p)
```

**Facet over Gender.**

```{r}
p + facet_grid(~Sex)
```

# Displaying proportions of the total

If you want to display proportions of the total, simply map the by aesthetic to 1. Here an example using a stacked bar chart.

```{r}
ggplot(d) +
  aes(x = Class, fill = Survived, weight = Freq, by = 1) +
  geom_bar() +
  geom_text(
    aes(label = scales::percent(after_stat(prop), accuracy = 1)),
    stat = "prop",
    position = position_stack(.5)) +  
  labs(title = "Percentages of total")
```

# A dodged bar plot to compare two distributions

A dodged bar plot could be used to compare two distributions.

```{r}
ggplot(d) +
  aes(x = Class, fill = Sex, weight = Freq, by = Sex) +
  geom_bar(position = "dodge")
```

On the previous graph, it is difficult to see if first class is over- or under-represented among women, due to the fact they were much more men on the boat. `stat_prop()` could be used to adjust the graph by displaying instead the proportion within each category (i.e. here the proportion by sex).

```{r}
ggplot(d) +
  aes(x = Class, fill = Sex, weight = Freq, by = Sex, y = after_stat(prop)) +
  geom_bar(stat = "prop", position = "dodge") +
  scale_y_continuous(labels = scales::percent)
```

Finally, the same plot with labels

```{r}
ggplot(d) +
  aes(x = Class, fill = Sex, weight = Freq, by = Sex, y = after_stat(prop)) +
  geom_bar(stat = "prop", position = "dodge") +
  scale_y_continuous(labels = scales::percent) +
  geom_text(
    mapping = aes(
      label = scales::percent(after_stat(prop), accuracy = .1),
      y = after_stat(0.01)
    ),
    vjust = "bottom",
    # what does the .9 do?
    position = position_dodge(.9),
    stat = "prop"
  )
```
|> 
For more see the [geom_text](https://ggplot2.tidyverse.org/reference/geom_text.html) vignette.