Explorando o mundo de The Office

Uma breve manipulação de dados

pt-br
R
the office
tidyverse
Author

Ricardo

Published

October 15, 2022

Sobre o que é essa postagem?

  • A melhor série de todos os tempos;
  • Importando dados da internet;
  • Coletando algumas informações utilizando dplyr.

História

Estava eu pensando sobre uma nova postagem para o blog, quando recebi no meu telefone uma notificação do reddit, com o título “Every line from Every Episode of ‘The Office (US)’” – Todas as falas de todos os episódios do The Office (EUA). Sem pensar duas vezes, fui dar uma olhada.

Explicando:

Nos idos de 2009 tive a felicidade de conhecer The Office, que se trata de uma série de comédia em formato de pseudodocumentário exibida pela rede estadunidense NBC (No Brasil dá pra assistir pela prime, bebês 😘. Esta é minha série favorita do coração (🦆 Boy, Camura, Sarah).

Figure 1: Yeah baby!

Voltando:

Após checar do que se tratava o banco de dados (BD), resolvi trazer pra cá, e mexer um pouco só pra ver o que conseguimos extrair dele.

Pensei em mostrar somente uma breve manipulação de dados agora, depois podemos transformar essas tabelas em belos gráficos 😉.

Mãos no computador

Por primeiro, devemos fazer o download dos dados. Há, pelo menos, três formas diferentes de fazer isso:

  1. Utilizando o próprio BD cedido pelo usuário misunderstoodpoetry.
  • Os dados estão em uma planilha do google sheets;
  • Para ter acesso pelo R, podemos utilizar o pacote googlesheets4, através da função read_sheet(), dessa forma:
# carregando o pacote necessário
library(googlesheets4) # ler diretamente do google sheets

# colocando o BD em um objeto do tipo dataframe (ou tibble)
theoffice <- read_sheet("https://docs.google.com/spreadsheets/d/18wS5AAwOh8QO95RwHLS95POmSNKA2jjzdt0phrxeAE0/edit#gid=747974534")
  1. Utilizando o BD fornecido pelo usuário Fabrizio Cominetti, lá no Kaggle (em outro post trago mais detalhes sobre);
  • Podemos fazer o download do BD utilizando uma API do Kaggle, utilizando o pacote kaggler;
  1. Baixando os dados manualmente.
  • Para ler o arquivo utilizarei o pacote readr, da família tidyverse:
# carregando os pacotes necessários
library(dplyr) # manipulação de dados
library(readr) # função read_csv()

# lendo o arquivo "the-office_lines.csv.zip"
theoffice <- read_csv(here::here("posts/004-explorando-the-office/the-office-lines - scripts.csv"),
                      show_col_types = FALSE)

# resumindo os dados
glimpse(theoffice)
Rows: 59,909
Columns: 7
$ id        <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…
$ season    <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ episode   <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ scene     <dbl> 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 7, …
$ line_text <chr> "All right Jim. Your quarterlies look very good. How are thi…
$ speaker   <chr> "Michael", "Jim", "Michael", "Jim", "Michael", "Michael", "M…
$ deleted   <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…

Como podemos ver, o objeto theoffice contém 7 variáveis e 59.909 observações (ou “falas” dos personagens).

Para melhor visualização (somente das 6 primeiras observações):

knitr::kable(head(theoffice, n = 6))
id season episode scene line_text speaker deleted
1 1 1 1 All right Jim. Your quarterlies look very good. How are things at the library? Michael FALSE
2 1 1 1 Oh, I told you. I couldn’t close it. So… Jim FALSE
3 1 1 1 So you’ve come to the master for guidance? Is this what you’re saying, grasshopper? Michael FALSE
4 1 1 1 Actually, you called me in here, but yeah. Jim FALSE
5 1 1 1 All right. Well, let me show you how it’s done. Michael FALSE
6 1 1 2 [on the phone] Yes, I’d like to speak to your office manager, please. Yes, hello. This is Michael Scott. I am the Regional Manager of Dunder Mifflin Paper Products. Just wanted to talk to you manager-a-manger. [quick cut scene] All right. Done deal. Thank you very much, sir. You’re a gentleman and a scholar. Oh, I’m sorry. OK. I’m sorry. My mistake. [hangs up] That was a woman I was talking to, so… She had a very low voice. Probably a smoker, so… [Clears throat] So that’s the way it’s done. Michael FALSE

Tá bom, Michael.

Renomeando as variáveis para pt-br

Agora, já que é uma postagem em português, vamos traduzir os nomes das variáveis.

theoffice_pt <- theoffice %>% 
    rename(temporada = season,
           episodio = episode,
           cena = scene,
           fala = line_text,
           personagem = speaker,
           deletado = deleted)

knitr::kable(head(theoffice_pt, n = 2))
id temporada episodio cena fala personagem deletado
1 1 1 1 All right Jim. Your quarterlies look very good. How are things at the library? Michael FALSE
2 1 1 1 Oh, I told you. I couldn’t close it. So… Jim FALSE

Nomes das variáveis alteradas.

Número de falas por temporada

Bom, dessa vez vamos ver quantas falas existiram em cada uma das 9 temporadas da série:

theoffice_pt %>% 
    # agrupando por temporada
    group_by(temporada) %>% 
    # somando as observações
    tally()
# A tibble: 9 × 2
  temporada     n
      <dbl> <int>
1         1  1996
2         2  7492
3         3  7483
4         4  5642
5         5  8170
6         6  7630
7         7  7302
8         8  7083
9         9  7111

A função tally() faz uma soma do número de vezes que certo grupo aparece, dada na função group_by(). Nesse exemplo acima, ele pega cada um dos grupos dentro de temporada, e identifica quantas observações há em cada uma.

A temporada que teve mais falas foi a (que, inclusive, considero a melhor!), com 8170 falas.

Número de falas por personagem no 1º episódio

Podemos também filtrar algumas informações, para ser mais específicos. Por exemplo, se quisermos saber quantas falas foram feitas por personagem no primeiro episódio da primeira temporada (a mais odiada):

theoffice_pt %>% 
    # filtramos a temporada 1 e o episódio 1
    filter(temporada == 1 & episodio == 1) %>% 
    # agrupamos por personagem
    group_by(personagem) %>% 
    # fazemos a somatória de observações
    tally() %>% 
    # organizando do número maior para o menor
    arrange(desc(n))
# A tibble: 16 × 2
   personagem                  n
   <chr>                   <int>
 1 Michael                    97
 2 Pam                        46
 3 Jim                        37
 4 Dwight                     35
 5 Jan                        12
 6 Ryan                       10
 7 Oscar                       6
 8 Angela                      5
 9 Roy                         5
10 Stanley                     5
11 Documentary Crew Member     3
12 Todd Packer                 3
13 Kevin                       2
14 Phyllis                     2
15 Man                         1
16 Michel                      1

Finalizando

Acho que já deu pra dar uma breve ideia do que conseguimos fazer com algumas poucas funções, em breve vamos explorar um pouco mais esses dados, e também brincar com visualizações.

É festa!

Nesta sessão apresentei os seguintes pacotes:

  • dplyr
  • googlesheets4
  • readr

Até mais!

Cheers,

Adendo: O Felipe Magalhães me sugeriu ver quantas vezes falaram “That’s what she said!” na série, não aguentei de curiosidade. Aí está:

# pacote para tratar com strings, também do tidyverse
library(stringr)

twss <- theoffice_pt %>% 
    # filtrando as falas que contém a famigerada frase
    filter(str_detect(fala, "[Tt]hat's what she said?"))

glimpse(twss)
Rows: 35
Columns: 7
$ id         <dbl> 2545, 2547, 5325, 6322, 6353, 7644, 8872, 9624, 10904, 1259…
$ temporada  <dbl> 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,…
$ episodio   <dbl> 2, 2, 10, 12, 12, 17, 21, 1, 5, 10, 12, 17, 17, 20, 22, 2, …
$ cena       <dbl> 24, 24, 2, 33, 38, 6, 22, 49, 59, 49, 41, 9, 23, 11, 68, 6,…
$ fala       <chr> "That's what she said. Pam?", "That's what she sai [clears …
$ personagem <chr> "Michael", "Michael", "Michael", "Dwight", "Michael", "Mich…
$ deletado   <lgl> FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALS…

35 falas com “That’s what she said”!

twss %>% 
    group_by(personagem) %>% 
    tally() %>% 
    arrange(desc(n))
# A tibble: 11 × 2
   personagem              n
   <chr>               <int>
 1 Michael                23
 2 Dwight                  3
 3 Creed                   1
 4 David                   1
 5 Deposition Reporter     1
 6 Everyone                1
 7 Holly                   1
 8 Jan                     1
 9 Jim                     1
10 Pam                     1
11 Stanley                 1

Claro que quem mais falou foi o Michael, mas o VAR vai ser chamado pra checar esse banco de dados aí 😅!