Introduction

Column

De los 1937 socios productores de La Uruguaya, 173 auto-denominados intensos se han dado cita cotidianamente en un canal de Telegram para intercambiar opiniones, comentarios e historias de vida.

Sin hacer justicia a los lazos de fraternidad que se han tejido y continúan tejiéndose en esa comunidad, en este sitio recogemos algunos elementos cuantitativos de esos intercambios que intentan describir someramente una parte de esa historia.

Column

Ranking de intensidad

Por número de mensajes

Por número de palabras totales

Por número de palabras por mensaje

Tamaño y longitud de los mensajes

Evolución temporal

Row

Evolución del número de mensajes diarios (suavizado) por persona.

El número de mensajes diario de cada persona está representado por una “banda” en el gráfico. Pasar el mouse sobre las curvas muestra el usuario y los valores correspondientes. Click sobre los nombres en la leyenda para “apagar” o “encender” la banda correspondiente en el gráfico.

---
title: "Intensidad de los socios productores de La Uruguaya"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
---


```{r eval = interactive(), cache = FALSE, include = FALSE}
source("src/functions.R")
message("Assuming interactive session")
```


```{r load, include = FALSE}
tar_load(
  c(
    active_users,
    gauge_intensos,
    messages,
    msgs_per_user,
    msgs_per_user_day,
    significant_dates,
    user_metrics,
    waffle_intensos,
    words_per_user
  )
)
```

# Introduction

Column {data-width=500}
-----------------------------------------------------------------------

![](https://m.media-amazon.com/images/M/MV5BYzBlZTU4Y2UtM2M3OS00ODkxLWEzMWItYzcxNDIxNjc0NzJjXkEyXkFqcGdeQXVyODQyODQ2MDA@._V1_QL75_UX180_CR0,19,180,266_.jpg)

De los 1937 socios productores de [La
Uruguaya](https://www.imdb.com/title/tt14731294/), `r nrow(active_users)`
auto-denominados _intensos_ se han dado cita cotidianamente en un canal de
[Telegram](https://telegram.org/) para intercambiar opiniones, comentarios e
historias de vida.

Sin hacer justicia a los lazos de fraternidad que se han tejido y continúan
tejiéndose en esa comunidad, en este sitio recogemos algunos elementos
cuantitativos de esos intercambios que intentan describir someramente una parte
de esa historia.

```{r}
# waffle_intensos
gauge_intensos
```


Column {.tabset data-width=500}
-----------------------------------------------------------------------

Ranking de intensidad

### Por número de mensajes

```{r ranking-mensajes, fig.height = 10}

rank_users(user_metrics, by = n_messages, top_n = 47) |> 
  hchart(
    "bar",
    hcaes(x = user_name, y = n_messages, color = n_messages),
    name = "Número total de mensajes"
  ) |> 
  hc_xAxis(
    title = NULL
  ) |> 
  hc_yAxis(
    title = list(text = "Número de mensajes")
  )

```

### Por número de palabras totales

```{r ranking-palabras, fig.height = 10}

rank_users(user_metrics, by = n_words, top_n = 47) |> 
  hchart(
    "bar",
    hcaes(x = user_name, y = n_words, color = n_words),
    name = "Número total de palabras"
  ) |> 
  hc_xAxis(
    title = NULL
  ) |> 
  hc_yAxis(
    title = list(text = "Número de palabras")
  )

```

### Por número de palabras por mensaje

```{r ranking-rates, fig.height = 10}

rank_users(user_metrics, by = word_rate, top_n = 47) |> 
  hchart(
    "bar",
    hcaes(x = user_name, y = word_rate, color = word_rate),
    name = "Promedio de palabras por mensaje"
  ) |> 
  hc_xAxis(
    title = NULL
  ) |> 
  hc_yAxis(
    title = list(text = "Número de palabras por mensaje")
  )

```

### Tamaño y longitud de los mensajes

```{r}

## An alternative plot that dedicates an axis to word rate which is orthogonal
## to "activity". But we should first extract the principal component of
## "activity" from number of words and messages.
p <- ggplot(user_metrics, aes(n_messages, word_rate)) +
  suppressWarnings(geom_point(aes(text = user_name))) +
  scale_x_log10() +
  labs(
    x = "Log-número de mensajes",
    y = "Promedio de palabras por mensaje"
  )

fm <- lm(log10(n_words) ~ log10(n_messages), data = user_metrics)

p <- rank_users(user_metrics, by = word_rate) |> 
  ggplot(aes(n_messages, n_words)) +
  geom_abline(
    intercept = coef(fm)[1],
    slope = coef(fm)[2],
    col = "lightgray"
  ) +
  suppressWarnings(
    geom_point(
      aes(text = user_name, color = word_rate),
      show.legend = FALSE
    )
  ) +
  scale_x_log10() + 
  scale_y_log10() +
  scale_colour_viridis_c(option = "inferno") +
  labs(
    x = "Log-número de mensajes",
    y = "Log-número de palabras totales"
  ) +
  theme_ipsum()

ggplotly()
```


# Evolución temporal

Row {data-height=650}
-------------------------------------

### Evolución del número de mensajes diarios (suavizado) por persona.

El número de mensajes diario de cada persona está representado por una "banda"
en el gráfico.
Pasar el mouse sobre las curvas muestra el usuario y los valores correspondientes.
Click sobre los nombres en la leyenda para "apagar" o "encender" la banda 
correspondiente en el gráfico.


```{r total-msgs, include = FALSE}
msgs_per_user_day |> 
  group_by(date) |> 
  summarise(
    n = sum(n)
  ) |> 
  mutate(
    rn = zoo::rollmean(n, k = 7, fill = NA)
  ) |>  
  filter(!is.na(rn)) |> 
  ggplot(aes(date, rn)) + 
  geom_area(fill = "gray") +
  geom_vline(
    data = significant_dates,
    aes(xintercept = as.numeric(date)),
    lwd = 1
  ) +
  theme_ipsum(grid = "Y") +
  labs(
    x = "Fecha",
    y = "Mensajes por día"
  )

ggplotly()
```


```{r msgs-users-dates}

p <- msgs_per_user_day |> 
  # mutate(
  #   week = as.numeric(floor(difftime(date, min(date), units = "weeks")))
  # ) |> 
  group_by(user_name) |> 
  mutate(
    n_msgs = sum(n),
    n_days = length(n)
  ) |>  
  arrange(user_name, date) |> 
  ## Group users with low activity
  mutate(
    user_name = ifelse(
      n_days > 30 & n_msgs > 100,
      user_name,
      "Otros"
    )
  ) |> 
  group_by(user_name, date) |> 
  summarise(n = sum(n), .groups = "drop_last") |> 
  mutate(
    rn = round(zoo::rollmean(n, k = 14, fill = NA), 1)
  ) |>  
  filter(!is.na(rn)) |> 
  ungroup() |> 
  complete(date, user_name, fill = list(rn = 0)) |> 
  ggplot(aes(date, rn)) + 
  # geom_line(
  #   aes(group = user_name),
  #   colour = "darkgray",
  #   position = position_stack()
  # ) +
  geom_area(
    aes(fill = user_name),
    show.legend = FALSE
  ) +
  geom_vline(
    data = significant_dates,
    aes(xintercept = as.numeric(date)),
    alpha = 0.5
  ) +
  geom_text(
    data = significant_dates,
    aes(x = date, y = 350, label = desc),
    # angle = 90,
    hjust = 1,
    vjust = 1,
    nudge_x = -1
  ) +
  labs(
    x = NULL,
    y = "Número suavizado de mensajes diarios"
  ) +
  scale_fill_viridis_d(option = "inferno") +
  theme_ipsum(grid = "Y")

ggplotly(p) |> 
  style(textposition = "left")
```


<!-- Column {data-width=650} -->
<!-- ----------------------------------------------------------------------- -->

<!-- ### Chart A -->

<!-- ```{r} -->

<!-- ``` -->

<!-- Column {data-width=350} -->
<!-- ----------------------------------------------------------------------- -->

<!-- ### Chart B -->

<!-- ```{r} -->

<!-- ``` -->

<!-- ### Chart C -->

<!-- ```{r} -->

<!-- ``` -->