class: center, middle, inverse, title-slide # Introdução à mineração de texto com R: Parte I ### Prof. Carlos Trucíos
ctruciosm.github.io
carlos.trucios@facc.ufrj.br
### Faculdade de Administração e Ciências Contábeis, Universidade Federal do Rio de Janeiro ### Última atualização: 2021-11-14 --- layout: true <a class="footer-link" href="http://ctruciosm.github.io">ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)</a> ---
# Agenda - Introdução ao R - Raspagem de dados do Twitter: o pacote `rtweet` - Introdução à manipulação de dados: o pacote `dplyr` --- class: inverse, right, middle # Introdução ao R --- ## Introdução ao R <center> R is not just a programming language, but it is also an interactive environment for doing data science. Handley W. </center> -- <center> <img src="imagens/R_Rstudio.png" width="50%" /> </center> -- - [*R*](https://cran.r-project.org) é um *software* gratuito, facil de usar e possui uma comunidade grande desenvolvendo pacotes novos todo dia. -- - É possivel utilizar o R *nativo*, mas uma IDE poderosa e muito útil é o [R studio](https://rstudio.com/products/rstudio/download/) (integra várias funcionalidade que deixam as coisas mais fáceis e simples). -- - Uma alternativa é utilizar o [R studio Cloud](https://rstudio.cloud), porém a versão gratuita tem certas limitações em tempo de processamento e capacidade de armazenamento. -- - Gosta de Python? com [R studio](https://rstudio.com/products/rstudio/download/) pode também rodar código em Python! --- ## Introdução ao R .left-column[ - **1 (editor)**: onde escrevemos o código, - **2 (consola)**: onde tudo no R acontece, - **3 (ambiente)**: objetos e funções carregadas no ambiente do R, - **4 (outros)**: arquivos, gráficos, pacotes, ajuda, ... ] .right-column[ <div class="figure"> <img src="imagens/RstudioCloud.png" alt="Rstudio Cloud" width="100%" /> <p class="caption">Rstudio Cloud</p> </div> ] --- ## Primeiros passos ```r # Importante: texto após um (#) serve para escrever comentários ``` .pull-left[ #### Operações básicas ```r 2+3 # Soma 5-6 # Substração 3*4 # Multiplicação 30/6 # Divisão 2^4 # Potenciação ``` ] .pull-right[ #### Perguntas lógicas ```r 1 == 1 # 1 é igual a 1? 1 != 2 # 1 é diferente de 2? 2 <= 3 # 2 é menor ou igual a 3? 3 < 3 # 3 é menor do que 3? 4 > 5 # 4 é maior do que 5? 7 >= 8 # 7 é maior ou igual a 8? ``` ] -- #### Atribuição ```r y <- 5 # Atribuição y # Mostra o valor atribuido x <- c(5, 7, 8, 1, 3, 8, 9) # c() cria um vetor de dados (com elementos separados por ",") x # Mostra os valores atribuidos z <- 1:10 # cria uma sequência do 1 ao 10 w <- c("João", "Paty", "Igor") # c() cria um vetor de dados ``` --- ## Primeiros passos Atribuição pode ser feita com ` = ` ou ` <- `. O simbolo ` <- ` pode ser feito apertando as teclas `alt` e `-` (menos) simultaneamente. -- .pull-left[ #### Algumas funções úteis ```r log(x) # aplica log a c/elemento sqrt(x) # aplica raíz2 a c/elemento abs(x) # aplica v. absoluto a c/elemento length(x) # tamanho do vetor x sort(x) # ordena os elementos scale(x) # padroniza (normaliza) os dados ``` ] .pull-right[ ```r sum(x) # soma dos elementos de x mean(x) # média dos elementos de x median(x) # mediana dos elementos de x sd(x) # desvio padrão amostral var(x) # variância amostral prod(x) # produto dos elementos de x cumsum(x) # soma acumulada cumprod(x) # produto acumulado str(x) # mostra a estrutura do objeto ``` ] -- > Uma lista com várias funções disponíveis no R podem ser encontradas nos _Cheatsheets_ do [R](https://cran.r-project.org/doc/contrib/Baggott-refcard-v2.pdf) e [Rstudio](https://www.rstudio.com/resources/cheatsheets/). **Não precisa** imprimir todos os _Cheatsheets_, mas ter por perto **unicamente aqueles** que lhe ajudarão nas suas tarefas diárias. -- .blue[R tem uma comunidade bastante ativa e novos `pacotes` (módulos com várias funções implementadas para trabalhar em assuntos específicos) são disponibilizados todo dia. **Daqui em diante** focaremos em alguns pacotes úteis para raspagem de dados do twitter e mineração de texto.] --- ## Instalando pacotes .bg-washed-green.b--dark-green.ba.bw2.br3.shadow-5.ph4.mt5[ Instalar pacotes faz parte do dia a dia quando trabalhamos com **R**. Muitas das coisas que gostariamos implementar, já foram implementadas por outra pessoa e estão disponíveis através de pacotes, basta aprender a usá-los. ] -- - Instalar pacotes é uma tarefa simples e pode ser feita com apenas uma linha de código: ```r install.packages("nome_do_pacote") # o nome_do_pacote sempre com aspas ``` -- - Uma vez que o pacote esteja instalado, precisamos carregá-lo no **R**. Isto é feito com a seguinte linha de código: ```r library(nome_do_pacote) # aqui não precisamos mais das aspas! ``` -- > Os pacotes são instalados uma **única vez** por computador, mas precisam ser carregados **toda vez** que formos utilizá-los. --- ## Instalando pacotes #### Exemplo ```r install.packages("tidyverse") # instalamos o pacote tidyverse library(tidyverse) # carregamos o pacote ``` > Se o pacote está instalado mas não carregado, não poderemos usar a funções implementadas no pacote. **É necessário carregar o pacote!** -- ### Hand-on: Instalar os pacotes `tidytext` e `rtweet`
03
:
00
--- class: inverse, right, middle # Raspagem de dados do Twitter --- ## Raspagem de dados do Twitter .bg-washed-blue.b--dark-blue.ba.bw2.br3.shadow-5.ph4.mt5[ Utilizaremos o pacote `rtweet` para coletar dados do `twitter`. O pacote acessará aos dados do twitter através da conta do proprio usuário. Por isso, antes de continuar, acesse a sua conta de twitter no seu computador. ] -- ```r library(rtweet) # carregando pacote ``` -- .pull-left[ <center> <img src="imagens/twitter.jpg" width="45%" /> </center> ] .pull-right[ O pacote `rtweet` traz várias funções implementadas e uma explicação do funcionamento de cada uma dessas funções está disponível na [documentação do pacote](https://cran.r-project.org/web/packages/rtweet/rtweet.pdf). ] -- > Existem outras ferramentas para extrair dados do Twitter, por exemplo: o pacote `twitteR` do **R** e as bibliotecas `twitter` e `Twint` do **Python**. --- ## Raspagem de dados do Twitter Algumas das principais funções do pacote `rtweet` são: - `search_tweets()`: coleta tweets que contenham alguma palvra ou frase específica. - `get_trends()`: coleta os trending topics do momento em que código rodar, permite especificar o lugar. Se quisermos todos os trendings disponíveis podemos usar `trends_available()` - `search_users()`: para saber quais usuários estão tweeteando sobre um determinado assunto - `get_followers()`: coleta os seguidores de um determinado usuário. - `get_timeline()`: coleta o tweets postados na timeline de um determinado usuário. - -- > .red[**Observação:** Todo que tem no **R** é um objeto, e tudo o que faz alguma coisa é uma função]. Todas as funções são do tipo `nome_da_função(parametros, de, entrada)` --- ## Raspagem de dados do Twitter ```r search_tweets(q, n = 100, type = "recent", include_rts = TRUE, geocode = NULL, max_id = NULL, parse = TRUE, token = NULL, retryonratelimit = FALSE, verbose = TRUE, ...) ``` -- **Principais argumentos da função:** - **q:** QUERY com o critério de busca. Exemplo: "#Neymar", "Bolsonaro AND COVID-19", "Bolsonaro OR Mourão", - **n:** número de tweets (máximo 18 mil). - **lan:** lingua em que os tweets foram escritos. - **include_rts:** se incluirmos retweets ou não. -- > Nota: só podemos acessar aos tweets dos ultimos 6 dias! -- **Exemplo:** ```r library(rtweet) # se já carregou, não precisa carregar de novo library(dplyr) # para manipulação de dados round6_tweets <- search_tweets("#round6", n = 100, include_rts = FALSE, lang = "pt") ``` -- Para ver as varáveis contidas no objeto `round6_tweets` faça ```r glimpse(round6_tweets) ``` --- ## Raspagem de dados do Twitter ```r get_trends(woeid = 1, lat = NULL, lng = NULL, exclude_hashtags = FALSE, token = NULL, parse = TRUE) ``` **Principais argumentos da função:** - **woeid:** (Where On Earth) permite especificar a cidade ou país. -- **Exemplo:** ```r trends_brazil <- get_trends(woeid = "Brazil") trends_argentina <- get_trends(woeid = "Argentina") ``` -- Para ver as varáveis contidas nos objetos `trends_brazil` e `trends_argentina` faça ```r glimpse(trends_brazil) glimpse(trends_argentina) ``` -- O que acontece se fizermos ```r trends_hoje <- trends_available() ``` --- ## Raspagem de dados do Twitter ```r search_users(q, n = 100, parse = TRUE, token = NULL, verbose = TRUE) ``` - **q:** QUERY com o critério de busca. Exemplo: "#Neymar", "COVID-19", "Lula OR Dilma", - **n:** número de usuários desejados (máximo 1000). -- **Exemplo:** ```r rstat_users <- search_users("#rstats", n = 100) round6_users <- search_users("round6", n = 100) ``` -- Para ver as varáveis contidas nos objetos faça ```r glimpse(rstat_users) glimpse(round6_users) ``` --- ## Raspagem de dados do Twitter É possivel também obter os seguidores de um determinado usuário e os últimos tweets na _timeline_ do usuário. -- ```r followers_netflixbr <- get_followers("netflixbrasil", n = 100) glimpse(followers_netflixbr) ``` ``` ## Rows: 100 ## Columns: 1 ## $ user_id <chr> "1459813725721042945", "1459815723715416064", "145981463649734… ``` -- ```r # Pegar os últimos 50 tweets postados pela netflixbrasil timeline_netflixbr <- get_timeline("netflixbrasil", n = 50) ``` -- > Alguma vezes `get_timeline()` falha e reporta o erro `API did not return json`. Uma possível solução pode ser essa [aqui](https://github.com/ropensci/rtweet/issues/418). --- class: inverse, right, middle # Introdução à manipulação de dados --- ## Introdução à manipulação de dados .bg-washed-green.b--dark-green.ba.bw2.br3.shadow-5.ph4.mt5[ **Manipulação de dados** refere-se ao processo de limpar, organizar e transformar os dados de forma a serem mais fáceis de utilizar na nossa análise. ] -- .pull-left[ [O pacote dplyr](https://dplyr.tidyverse.org/index.html) nos ajudará nessa tarefa. #### Verbos: - `select()`: para selecionar variáveis. - `filter()`: para filtra casos. - `mutate()`: para mutar/transformar variáveis. - `arrange()`: para ordenar dados. - `glimpse()`: para ver rapidamente um panorama geral dos dados. ] .pull-right[ .center[ <img src="imagens/dplyr.png" width="36%" /> ] ] -- .blue[O **pipe** ( `%>%` ), funciona como um "e então faça..." e nos ajuda a seguir uma order lógica de como manipulamos os dados.] --- ## Introdução à manipulação de dados **`select()`: ** para selecionar variáveis do _dataset_. -- ```r round6_tweets %>% select(created_at, text, source, status_url) ``` ``` ## # A tibble: 100 × 4 ## created_at text source status_url ## <dttm> <chr> <chr> <chr> ## 1 2021-11-14 08:21:21 "Terminei #Round6 estou… Twitter … https://twitter.com/M… ## 2 2021-11-14 05:50:03 "Eu nunca chorei tanto … Twitter … https://twitter.com/M… ## 3 2021-11-14 03:06:18 "\"A gente não confia n… Twitter … https://twitter.com/M… ## 4 2021-11-14 04:53:12 "Nesse episódio, temos … Twitter … https://twitter.com/A… ## 5 2021-11-14 04:18:21 "@ggukzitos Eu assisto … Twitter … https://twitter.com/j… ## 6 2021-11-14 04:08:11 "@rmbicycles boa noitin… Twitter … https://twitter.com/k… ## 7 2021-11-14 00:48:52 "@jenniesvodka continua… Twitter … https://twitter.com/k… ## 8 2021-11-13 23:54:41 "@buburjj é militante\n… Twitter … https://twitter.com/k… ## 9 2021-11-14 00:13:32 "@meowpjms boa noite am… Twitter … https://twitter.com/k… ## 10 2021-11-13 23:56:53 "@wintergogh esta sim\n… Twitter … https://twitter.com/k… ## # … with 90 more rows ``` -- **Pronto!** selecionamos 4 das 90 variávais do _dataset_. -- > .red[Observação: algumas vezes a função `select()` pode ter conflito com a função `select()` de outro pacote. Para resolver o problema apenas faça `dplyr::select()`.] --- ## Introdução à manipulação de dados **`filter()`: ** para filtrar casos ```r round6_tweets %>% select(created_at, text, source) %>% filter(source == "Twitter for iPhone") ``` ``` ## # A tibble: 1 × 3 ## created_at text source ## <dttm> <chr> <chr> ## 1 2021-11-14 02:30:33 A QUEM POSSA INTERESSAR: a técnica do velinh… Twitter for… ``` **Ficamos apenas com as observações em que `source == "Twitter for iPhone"`. Repare que não temos mais 100 linhas!.** --- ## Introdução à manipulação de dados **`arrange()`: ** ordena os dados segundo algum critério, ```r round6_tweets %>% select(created_at, text, source) %>% filter(source == "Twitter for iPhone") %>% arrange(desc(created_at)) # desc() para ordenar em forma descendente. ``` ``` ## # A tibble: 1 × 3 ## created_at text source ## <dttm> <chr> <chr> ## 1 2021-11-14 02:30:33 A QUEM POSSA INTERESSAR: a técnica do velinh… Twitter for… ``` --- ## Introdução à manipulação de dados Até agora: - temos **selecionado** variáveis do nosso conjunto de dados, - temos **filtrado** casos (source == "Twitter for iPhone"), - temos **ordenado** de forma descendente os tweets pela data em que foram criados (created_at). > Contudo, **nada disso foi salvo!** (se fizermos um `glimpse(round6_tweets)` aparecerão as 90 colunas, 100 linhas e na ordem em que vieram do twitter) ```r glimpse(round6_tweets) ``` -- Se quisermos salvar todas essas mudanças, precisamos criar um novo objeto (ou substituir o antigo). ```r round6_tweets_clean <- round6_tweets %>% select(created_at, text, source) %>% filter(source == "Twitter for iPhone") %>% arrange(desc(created_at)) ``` -- > **Voilà**, veja o que acontece ao fizer `glimpse(round6_tweets_clean)`. --- # Data-Tips: .pull-left[ <img src="https://octodex.github.com/images/minertocat.png" width="70%" /> ] .pull-right[ O Professor Walmes (UFPR) tem bastante material interessante sobre R. Slides introdutórios podem ser encontrados [aqui](http://www.leg.ufpr.br/~walmes/ensino/dsbd-linprog/slides/00-r-base.html#1). O livro [Text Mining with R](https://www.tidytextmining.com) contém bastante informação para fazermos mineração de texto. Nas próximas reuniões veremos os pontos mais importantes. Quando não lembrar como utilizar uma função, sempre pode usar o _help_. Exemplo: `help(get_followers)` ou `?search_tweets`. ]