Entendendo os visitantes ao site do NYT (Parte 1)

Este é o primeiro artigo de uma série de posts que faz a análise dos dados de visitantes ao website do jornal New York Times. Nosso objetivo é entender as características e comportamento deste público. Ao longo dessa jornada eu vou explicar alguns conceitos básicos da ferramenta R, que um sistema bastante poderoso para análise de dados e machine learning. Se você não o tiver instalado em sua máquina, baixe e execute a instalação do Microsoft R Open e o RStudio.

Os dados que utilizaremos acompanham o livro Doing Data Science de Cathy O’Neil e Rachel Schutt, um livro que recomendo bastante. Eles estão disponíveis em seu repositório do Github.

Em primeiro lugar devemos baixar os arquivos para a máquina local. Uma vez descomprimido o conteúdo do primeiro dataset — chamado dds_ch2_nyt — encontramos trinta e um arquivos: nyt1.csv a nyt31.csv. Eles apresentam os dados referentes aos acessos diários ao site do NYT. Vamos explorá-los?

Carregando um arquivo

Existem várias maneiras de se carregar os dados no R porque ele é um sistema modular no qual são instalados pacotes, também chamados de bibliotecas, que são desenvolvidos por diferentes autores. Embora ter muitos contribuidores o torna poderoso, com o tempo o R se tornou confuso: cada pacote tem uma interface diferente e muitos fazem exatamente a mesma coisa!

Por sorte existe um conjunto chamado Tidyverse, que é família coerente de bibliotecas. Ele é uma curadoria que seleciona blocos que se encaixam bem uns aos outros. Tudo o que faremos aqui será à maneira Tidyverse de se trabalhar dentro desse universo.

O comando library importa a biblioteca Tidyverse:

library(tidyverse)

Em seguida, importamos um arquivo do NYT. Eles são arquivos .csv: comma separated values. Ou seja, são arquivos delimitados por vírgulas. Será? Na verdade os arquivos .csv no Brasil são geralmente delimitados por ponto vírgula. A função read_csv permite que você altere o delimitador de seu arquivo de entrada: seja vírgula, ponto vírgula, tabulação ou espaço em branco. Para você aprender mais sobre como fazer isso, consulte a documentação dessa função. Toda a ajuda de funções do R pode ser acessada via o comando ?<NOME DA FUNÇÃO>, em nosso caso ?read_csv.

O símbolo <- é usado para a atribuição no R. Ou seja, o valor que a função read_csv retorna será guardado dentro da nova variável nyt.

nyt <- read_csv("./dds_ch2_nyt/nyt1.csv")  

## Parsed with column specification:
## cols(
##   Age = col_integer(),
##   Gender = col_integer(),
##   Impressions = col_integer(),
##   Clicks = col_integer(),
##   Signed_In = col_integer()
## )

A mensagem acima diz que esse arquivo importado tem 5 colunas:

  • Age (idade)
  • Gender (gênero)
  • Impressions (número de impressões)
  • Clicks (número de clicks)
  • Signed_In (logado)

e todas elas foram interpretadas como números inteiros.

Carregando todos os arquivos de uma só vez

Importamos um arquivo, mas devemos importar 31 arquivos! Então é melhor encontramos uma maneira mais eficiente de fazermos isso. Vamos importar cada arquivo em um índice diferente de nossa variável NYT através de um loop, ou um laço de execução. Em uma analogia com o MS Excel, cada arquivo será uma “aba” de nossa planilha.

Assim, primeiro criamos um objeto do tipo list e armazenamos nele cada um dos arquivos importados. Listas no R são simplesmente uma maneira de criar sequências de um mesmo tipo de dado, ou seja, ao invés ter somente um valor armazenado, temos vetor com n valores que podem ser acessados por um índice.

nyt <- list()
for (day in c(1:31)) {
  nyt[[day]] &lt;- read_csv(paste("./dds_ch2_nyt/nyt",day,".csv", sep = ""))  
}

Algumas explicações sobre o código acima:

  • c(1:31) é uma maneira curta de representar um vetor de números de 1 a 31
  • a expressão day in c(1:31) dentro desse laço for irá atribuir a day os valores 1 a 31, executando o código do interior do laço em cada uma destas vezes
  • paste é uma função que “cola” valores de texto um ao outro. Por padrão ela insere espaços (” “) entre os valores, por isso especificamos a opção sep = "", ou seja, os separadores são textos vazios
  • Assim, paste("./dds_ch2_nyt/nyt",day,".csv", sep = "") irá gerar dinamicamente os nomes dos arquivos que desejamos importar:
    • ./dds_ch2_nyt/nyt1.csv
    • ./dds_ch2_nyt/nyt2.csv
    • ./dds_ch2_nyt/nyt31.csv
  • nyt[[day]] é uma referência a cada uma das posições na lista onde armazenaremos o conteúdo dos arquivos

Finalmente, podemos verificar o que importamos com as funções summary e str, que nos mostram informações sobre uma variável.

summary(nyt)

##       Length Class  Mode
##  [1,] 5      tbl_df list
##  [2,] 5      tbl_df list
##  [3,] 5      tbl_df list
##  [4,] 5      tbl_df list
##  [5,] 5      tbl_df list
##  [6,] 5      tbl_df list
##  [7,] 5      tbl_df list
##  [8,] 5      tbl_df list
##  [9,] 5      tbl_df list
## [10,] 5      tbl_df list
## [11,] 5      tbl_df list
## [12,] 5      tbl_df list
## [13,] 5      tbl_df list
## [14,] 5      tbl_df list
## [15,] 5      tbl_df list
## [16,] 5      tbl_df list
## [17,] 5      tbl_df list
## [18,] 5      tbl_df list
## [19,] 5      tbl_df list
## [20,] 5      tbl_df list
## [21,] 5      tbl_df list
## [22,] 5      tbl_df list
## [23,] 5      tbl_df list
## [24,] 5      tbl_df list
## [25,] 5      tbl_df list
## [26,] 5      tbl_df list
## [27,] 5      tbl_df list
## [28,] 5      tbl_df list
## [29,] 5      tbl_df list
## [30,] 5      tbl_df list
## [31,] 5      tbl_df list

Ou seja, a variável nyt é composta por 31 tbl_df (Table Data Frame) com 5 colunas. Os Table Data Frames são como “planilhas” nas quais cada coluna é nossa variável de interesse e em cada linha temos uma observação. No jargão de ciência de dados isso é chamado de tidy data.

Para verificar uma destas “planilhas importadas” na lista, a acessamos através do índice (note a expressão [[1]] acessando o índice 1):

str(nyt[[1]])

## Classes 'tbl_df', 'tbl' and 'data.frame':    458441 obs. of  5 variables:
##  $ Age        : int  36 73 30 49 47 47 0 46 16 52 ...
##  $ Gender     : int  0 1 0 1 1 0 0 0 0 0 ...
##  $ Impressions: int  3 3 3 3 11 11 7 5 3 4 ...
##  $ Clicks     : int  0 0 0 0 0 1 1 0 0 0 ...
##  $ Signed_In  : int  1 1 1 1 1 1 0 1 1 1 ...
##  - attr(*, "spec")=List of 2
##   ..$ cols   :List of 5
##   .. ..$ Age        : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ Gender     : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ Impressions: list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ Clicks     : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ Signed_In  : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr  "collector_guess" "collector"
##   ..- attr(*, "class")= chr "col_spec"

e aqui vemos as mesmas cinco colunas já mencionadas.

Neste post importamos todos os dados que precisaremos para a nossa análise. Clique aqui para seguir para o próximo post, no qual vamos criar novas variáveis categóricas para estes dados.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *