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).
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:
- 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çãoread_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)
<- read_sheet("https://docs.google.com/spreadsheets/d/18wS5AAwOh8QO95RwHLS95POmSNKA2jjzdt0phrxeAE0/edit#gid=747974534") theoffice
- 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
;
- Baixando os dados manualmente.
- Para ler o arquivo utilizarei o pacote
readr
, da famíliatidyverse
:
# 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"
<- read_csv(here::here("posts/004-explorando-the-office/the-office-lines - scripts.csv"),
theoffice 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):
::kable(head(theoffice, n = 6)) knitr
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 |
Renomeando as variáveis para pt-br
Agora, já que é uma postagem em português, vamos traduzir os nomes das variáveis.
<- theoffice %>%
theoffice_pt rename(temporada = season,
episodio = episode,
cena = scene,
fala = line_text,
personagem = speaker,
deletado = deleted)
::kable(head(theoffice_pt, n = 2)) knitr
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 5ª (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.
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)
<- theoffice_pt %>%
twss # 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í 😅!