Explorando os visitantes ao site do NYT (Parte 2)

Este é o segundo post de uma série que analisa os perfis de acesso dos usuários do site do jornal The New York Times. Para acessar ao primeiro post da série clique aqui.

Criando faixas etárias de visitantes

No arquivo importado temos uma coluna de idades. Como será a sua distribuição para o primeiro dia? Para criar gráficos, usamos o pacote ggplot2, que é extremamente versátil mas merece um tutorial específico. Por ora basta sabermos que ao escrever ggplot(data = nyt[[1]]) dizemos que criaremos um gráfico usando o ggplot2, com os dados de nyt[[1]], e quando “somamos” o comando geom_bar(mapping = aes(x = Age), dizemos que queremos barras (um histograma) no qual o eixo x será a coluna idade.

ggplot(data = nyt[[1]]) + geom_bar(mapping = aes(x = Age))

E percebemos que muitas pessoas com zero ano frequentam o site! Assim precisamos excluir essa informação, que é obviamente um ponto não disponível que está representado com um zero.

Outra maneira é verificar via linha de comando como as idades se distribuem. Para isso usamos a função summary, como já fizemos no primeiro post desta série. Ao chamar nyt[[1]]$Age nos referimos à coluna Age da tabela que se encontra na primeira posição da variável nyt, ou seja, o primeiro dia.

summary(nyt[[1]]$Age)

##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    0.00   31.00   29.48   48.00  108.00

E como suspeitávamos, mais de 25% dos acessos são referentes a pessoas com 0 ano. Sabemos disso porque o valor mínimo (Min.) é zero, e primeiro quartil (1st Qu.) também é zero. Ou seja, tudo entre o mínimo e os primeiros 25% dos dados ordenados de maneira crescente são necessariamente zeros.

Será que isso acontece porque esses usuários não estão logados? Filtraremos somente os usuários logados e assim refazemos o histograma. Existem várias maneiras de se fazer isso, mas aqui usamos a função filter que se encontra no conjunto Tidyverse. Note o filtro no segundo argumento da função filter.

nyt1_1 <- nyt[[1]]
nyt1_2 <- filter(nyt1_1,Signed_In == 1)
ggplot(nyt1_2) + geom_bar(mapping = aes(x = Age))

Sim! Como suspeitamos esses eram os usuários não logados porque não temos mais usuários com zero ano depois do filtro. Mas antes de qualquer coisa, vamos atribuir a tabela referente ao primeiro dia a uma variável chamada nyt1_1, para não precisarmos mais destes operadores chaves: [[ ]].

É interessante termos alguns intervalos etários com um menor número acessos. Normalmente esperaríamos uma curva razoavelmente bem comportada, e não estes cinco picos e vales. Eles podem denotar algum problema na maneira como os dados são coletados: um bug de software ou alguma operação de filtro que não está sendo feita corretamente. Problemas nos dados são mais freqüentes do que se imagina. Por isso, vamos fazer a mesma análise, mas agora do dia seguinte.

nyt2_1 <- nyt[[2]]
nyt2_2 <- filter(nyt2_1,Signed_In == 1)
ggplot(data = nyt2_2) + geom_bar(mapping = aes(x = Age))

… e temos um comportamento bem semelhante. Caso trabalhássemos no NYT, esse seria um bom momento para conversar com os desenvolvedores ou com o administrador do banco de dados sobre a validade do que estamos vendo. Mas para o nosso propósito atual vamos seguir em frente.

Faixas etárias

Crio que seja melhor criar faixas etárias, afinal temos idades de 7 a 90 anos. Queremos dividir as nossas faixas de idade em 5 grupos, mas não sabemos quais as idades limites entre cada um. Podemos:

  1. Simplesmente escolher números bonitos e criar faixas arbitrárias
  2. Tentar escolher números que aloquem um número semelhante de acessos dentro de cada faixa

Independentemente da faixa escolhida, é muito importante que ela não mude ao longo do tempo. Uma das coisas mais frustrantes é ter intervalos que mudam de ano para ano, e que assim não permitem uma análise ao longo do tempo. Afinal de contas, se em 2012 temos a primeira faixa sendo “< 27 anos” e em 2013 “< 30 anos”, como podemos comparar uma com a outra? Este é um dos grandes problemas de dados abertos de órgãos públicos.

Para descobrir quais idades utilizar, usaremos a função quantile, que dividirá os dados em “blocos” com número de integrantes mais ou menos semelhantes. Como queremos 5 faixas, especificamos a função seq(0, 1, length.out = 6) que resulta em na sequência 0.0 0.2 0.4 0.6 0.8 1.0.

intervalosIdade &lt;- quantile(nyt1_2$Age,seq(0, 1, length.out = 6))
intervalosIdade

##   0%  20%  40%  60%  80% 100% 
##    7   27   37   46   57  108

Assim as nossas faixas sugeridas são:

  • 7 a 27 anos
  • 28 a 37 anos
  • 38 a 46 anos
  • 47 a 57 anos
  • >= 58 anos

Faremos uma pequena modificação nessa variável de categorias de anos. Como excluímos os zeros, a menor idade que temos na amostra é 7 anos. Criaremos também a idade “desconhecida”, para 0 anos.

intervalosIdade <- c(0,intervalosIdade) # adicionamos o 0 ao início do vetor com os intervalos etários
intervalosIdade[7] <- 200               # fazemos a idade máxima do último intervalo ser 200 anos
intervalosIdade

##        0%  20%  40%  60%  80% 100% 
##    0    7   27   37   46   57  200

Agora criaremos uma nova variável chamada gruposIdade que contemple essas faixas nas nossas tabelas.

gruposIdade <- tibble(grupos = findInterval(nyt1_2$Age, intervalosIdade, rightmost.closed = TRUE))

A função findInterval(nyt1_2$Age,intervalosIdade) cria a sequência numérica que tem as nossas faixas etárias e a função tibble(grupos = <EXPR>) é usada para criar uma tabela Table Data Frame, com uma coluna chamada grupos, e que tem os valores especificados por findInterval.

Vejamos qual a distribuição da variável nyt1_2 (na qual havíamos retirado os zeros):

ggplot(gruposIdade) + geom_bar(aes(x = grupos, fill = grupos))

Como esperávamos, cada grupo etário tem um número parecido de integrantes. Agora podemos aplicar essa mesma função para todos os dias, mas antes, precisamos explicar o que são factors, que chamarei em Português de fatores.

Fatores

Fatores são um tipo de variável. Eles podem representar textos, números inteiros e etc e são usados quando os valores se repetem com muita frequência, como no caso de categorias, como faixas etárias, estados e cidades. Em nosso caso, ao invés de ter categorias etárias numéricas não muito intuitivas (faixa etária 1, 2, …, 5), ou textos, que ocupam muito espaço em memória, podemos ter fatores. Internamente eles são guardados como números inteiros, mas têm um dicionário que os converte para os labels que definirmos.

Muito do que se faz em ciência de dados e programação em geral é documentação para que outras pessoas (e você mesmo!) não se perderem tentando entender o que foi feito no passado. Categorias 1, 2 e 3 são receita para o azar! Use fatores e documente o que você escreve.

Assim, vamos primeiro criar os labels das nossas categorias. Abaixo criamos os nossos labels que representam as faixas etárias:

labelsIdades <- c("Idade desconhecida", "1 a 27 anos", "28 a 37 anos", "38 a 46 anos", "47 a 57 anos", ">= 58 anos")

Em seguida criamos os fatores a partir da variável

gruposIdade

, atribuindo os labels corretos.

gruposIdade$grupos <- factor(gruposIdade$grupos)  # grupos agora serão substituídos por fatores
levels(gruposIdade$grupos) <- labelsIdades        # damos nomes aos fatores
ggplot(gruposIdade) + geom_bar(aes(x = grupos, fill = grupos))

E assim, como já fizemos em outros casos, aplicamos isto com um loop a todos os dias de nossa amostra.

for (day in 1:length(nyt)) {
  gruposIdade <- tibble(grupos = findInterval(nyt[[day]]$Age, intervalosIdade, rightmost.closed = TRUE))
  gruposIdade$grupos <- factor(gruposIdade$grupos)
  levels(gruposIdade$grupos) <- labelsIdades
  nyt[[day]] = cbind(nyt[[day]], ageGroup = gruposIdade$grupos)
}

Criando o Click Through Rate

Falamos de um negócio digital. Embora o NYT seja uma instituição centenária, a maior fonte de renda para sites de notícias ainda são anúncios publicitários online. Para eles, umas das métricas mais importante é o CTR (Click Through Rate) ou taxa de clique por impressão. Ela representa quantas vezes as pessoas clicam em anúncios para cada mil vezes em que ele é exibido. Como será que essa essa taxa se comporta por grupo etário?

Primeiro criamos uma nova variável que será o nosso CTR: número de cliques / número de impressões. A função mutate no código abaixo cria uma nova coluna chamada CTR e a anexa à variável nyt para cada dia da semana.

for (day in 1:length(nyt)) {
  nyt[[day]] <- mutate(nyt[[day]], CTR = Clicks/Impressions)
}

Para saber a média de CTR, precisaremos agrupar os dados. Isso é feito pela função group_by, na qual especificamos que desejamos agrupar por ageGroup e em seguida o operador %>% envia o resultado para a função summarise, que criará uma média para cada grupo grupo etário.

tmp <- group_by(nyt[[1]], ageGroup) %>% summarise(avgCTR = mean(CTR, na.rm = TRUE))
ggplot(tmp, aes(x = ageGroup, y = avgCTR, fill = ageGroup)) + geom_bar(stat = "identity")

Interessante, não? Os grupos de idade desconhecida e a partir de 58 anos têm muito maior propensão a clicar em anúncios que as outras faixas. Enquanto a faixa de 28 a 37 anos clica em 10 anúncios por milhar de exibições, os usuários de idade desconhecida clicam em quase 30 anúncios por milhar. Em nosso próximo post continuaremos com nossa análise de acessos. Clique aqui para continuar.

Deixe uma resposta

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