15 de setembro de 2016

Em que você baseia suas decisões no dia-a-dia?

  • intuição?
  • dados?

Como interpretar os dados?

  • Exemplo: número de vendas diárias de um app
  • Em determinado dia, foram 50 vendas
  • Depois de uma campanha de marketing, foram 70 vendas
  • Houve um aumento das vendas?
  • Depende!

Análise qualitativa vs. quantitativa

Disciplina e avaliação

  • Na maior parte do tempo, não usaremos dados de experimentos
    • Usaremos dados históricos produzidos naturalmente como parte do desenvolvimento de software (código-fonte, bugs, commits etc.)
  • Nas partes práticas, usaremos a linguagem R
  • Avaliação
    • artigo curto com análise quantitativa de um conjunto de dados que será fornecido, usando R
    • apresentação de 5 minutos (ensaiem!)

Análise de dados

É o processo de inspecionar, limpar, transformar e modelar dados com o objetivo de descobrir informação útil, sugerindo conclusões e dando suporte à tomada de decisão

Etapas da análise de dados

  • requisitos
  • coleta
  • limpeza e transformação
  • análise exploratória
  • modelagem / análise
  • comunicação dos resultados

Requisitos

  • De quais dados preciso para atingir meus objetivos?
  • De que forma os dados devem estar representados?
  • Abordagem GQM (Goal-Question-Metric):

Coleta: abordagens

  • Manuais
    • Formulários
    • Entrevistas
    • Observação
  • Automáticas
    • Instrumentação de software (software que registra o que o usuário faz)
    • Download de arquivos (ex.: dump de banco de dados, exportar como XML…)
    • Acesso a APIs remotas (ex.: GitHub API, Travis CI API)
    • Crawling (pegar informações de páginas na web)

Coleta: fontes de dados

  • Código-fonte (ex.: Java, C, Python)
  • Sistemas de controle de versão (ex.: Git, Subversion)
  • Gerenciadores de tarefas/bugs (ex.: Bugzilla, Redmine, Jira, GitHub)
  • Sistemas de revisão de código (ex.: Gerrit, Review Board)
  • Sistemas de integração contínua (ex.: Jenkins, Travis CI, GitLab CI)
  • Sites de perguntas e respostas (ex.: StackOverflow)
  • Listas de discussão, fóruns e bate-papo (ex.: Mailman, IRC, )
  • Sites e wikis
  • e outros…

Coleta

  • Coleta de dados históricos pode ser difícil
  • Na disciplina vamos usar conjuntos de dados já coletados
  • Alguns conjuntos de dados prontos para analisar:
  • Conferência: Mining Software Repositories (todo ano tem MSR Challenge)

Coleta: exemplo

Limpeza

O que fazer com dados…

  • incompletos?
    • Ex.: não sei de qual versão é este bug.
  • inconsistentes?
    • Ex.: Quem consertou o bug? Commit diz Fulano, bug diz Sicrano.
  • que possuem múltiplas representações?
    • Ex.: nome de usuário em SCM, issues e e-mails. “Será que os usuários que mais enviam e-mails introduzem mais bugs no código-fonte?”
  • extremos? (outliers)
    • Ex.: Fulano consertou 2 mil bugs em uma hora

Transformação

  • Cálculos simples
    • Ex.: Calcular densidade de bugs a partir de bugs e LOC.
  • Operações básicas de bancos de dados
    • Ordenação, filtragem, junção…
  • Reshaping
  • Agregação de dados
    • Contagem, soma, média…
  • Recuperação de informação
    • Extrair dados quantitativos a partir de texto
    • expressões regulares, tf-idf, latent semantic analysis, word cloud, ngrams

Transformação

  • Entrada: tabela
    • cada linha é um registro
    • cada coluna é um atributo
  • Operadores: filter, arrange, select, mutate, summarise, group_by, inner_join

Transformação: filter

Seleciona linhas de acordo com critério. Original:

classe versao tamanho
Tela.java 1 235
Tela.java 3 311
Tela.java 2 288
Config.java 3 12
Config.java 2 23
Config.java 1 30

Transformação: filter

filter(versao == 1)

classe versao tamanho
Tela.java 1 235
Tela.java 3 311
Tela.java 2 288
Config.java 3 12
Config.java 2 23
Config.java 1 30

Transformação: filter

filter(versao == 1)

classe versao tamanho
Tela.java 1 235
Config.java 1 30

Transformação: arrange

Ordena de acordo o valor de uma ou mais colunas. Original:

classe versao tamanho
Tela.java 1 235
Tela.java 3 311
Tela.java 2 288
Config.java 3 12
Config.java 2 23
Config.java 1 30

Transformação: arrange

arrange(classe, versao) - ordena por classe e versao

classe versao tamanho
Config.java 1 30
Config.java 2 23
Config.java 3 12
Tela.java 1 235
Tela.java 2 288
Tela.java 3 311

Transformação: arrange

arrange(desc(tamanho)) - ordem decrescente de tamanho

classe versao tamanho
Tela.java 3 311
Tela.java 2 288
Tela.java 1 235
Config.java 1 30
Config.java 2 23
Config.java 3 12

Transformação: select

Seleciona colunas. Original:

classe versao tamanho
Tela.java 1 235
Tela.java 3 311
Tela.java 2 288
Config.java 3 12
Config.java 2 23
Config.java 1 30

Transformação: select

select(classe, tamanho)

classe tamanho
Tela.java 235
Tela.java 311
Tela.java 288
Config.java 12
Config.java 23
Config.java 30

Transformação: mutate

Cria colunas computadas. Original:

classe versao tamanho
Tela.java 1 235
Tela.java 3 311
Tela.java 2 288
Config.java 3 12
Config.java 2 23
Config.java 1 30

Transformação: mutate

mutate(x = tamanho / versao)

classe versao tamanho x
Tela.java 1 235 235.0
Tela.java 3 311 103.7
Tela.java 2 288 144.0
Config.java 3 12 4.0
Config.java 2 23 11.5
Config.java 1 30 30.0

Transformação: summarise

Combina todos os valores de uma coluna em um único valor (ex.: máximo, mínimo, soma, média…). Original:

classe versao tamanho
Tela.java 1 235
Tela.java 3 311
Tela.java 2 288
Config.java 3 12
Config.java 2 23
Config.java 1 30

Transformação: summarise

summarise(x = max(tamanho), y = min(tamanho))

x y
311 12

Transformação: group_by

Agrupa os dados de acordo com o valor de uma coluna.

classe versao tamanho
Tela.java 1 235
Tela.java 3 311
Tela.java 2 288
Config.java 3 12
Config.java 2 23
Config.java 1 30

Transformação: group_by

group_by(versao)

classe versao tamanho
Tela.java 1 235
Tela.java 3 311
Tela.java 2 288
Config.java 3 12
Config.java 2 23
Config.java 1 30

Transformação: group_by

group_by(versao)

classe versao tamanho
Tela.java 1 235
Config.java 1 30
Tela.java 2 288
Config.java 2 23
Tela.java 3 311
Config.java 3 12

Transformação: group_by + summarise

group_by(versao) %>% summarise(total = sum(tamanho))

versao total
1 265
2 311
3 323

Exemplo: Predicting Eclipse Defects

Análise exploratória

  • Ou exploratory data analysis (EDA)
  • Consiste em sumarizar e visualizar características importantes de um conjunto de dados.
  • É útil para levantar hipóteses sobre os dados, identificar problemas com os dados (que requerem limpeza)
  • Como:
    • estatística descritiva
    • visualização

Estatística descritiva

  • Univariada (uma variável) – calcular, para cada variável:
    • média, mediana, desvio-padrão, quartis, assimetria, curtose
    • plotar histograma, boxplot, violin plot (talvez usar escala logarítmica)
  • Bivariada (duas variáveis)
    • correlação/covariância
    • plotar gráfico de dispersão (scatter plot), tabelas de contingência/mosaic plots
    • plotar série temporal (se uma das variáveis for tempo)

Estatística descritiva: exemplo

Vamos considerar uma tabela com o tamanho (linhas de código, TLOC) dos arquivos do código-fonte do programa Eclipse, versão 3.0. Para fins didáticos, usaremos uma amostra aleatória de 9 linhas dessa tabela.

file TLOC
StateChangeListener.java 5
FieldCreationTime.java 44
ObjectVector.java 83
SWTUtil.java 53
IPluginImport.java 10
DebugCoreMessages.java 16
BundleActivator.java 6
BuildEditorContributor.java 11
Field.java 10

Estatística descritiva univariada

  • Vamos começar estudando funções que sumarizam um conjunto de valores através de um único valor representativo
  • Exemplo: média, mediana, desvio-padrão, quartis, assimetria, curtose…

Estatística descritiva: média, desvio-padrão

R possui as funções mean (média) e sd (desvio-padrão). Para fins didáticos, mostramos como calcular esses valores usando a fórmula:

n <- length(TLOC)
media <- sum(TLOC) / n
desvioPadrao <- sqrt( sum((TLOC - media) ^ 2) / (n - 1) )
media
## [1] 26.44444
desvioPadrao   # indica o quanto os dados estão "espalhados"
## [1] 27.33638

Estatística descritiva: mínimo, máximo

Identifique os valores mínimo e máximo de TLOC:

file TLOC
StateChangeListener.java 5
FieldCreationTime.java 44
ObjectVector.java 83
SWTUtil.java 53
IPluginImport.java 10
DebugCoreMessages.java 16
BundleActivator.java 6
BuildEditorContributor.java 11
Field.java 10

Estatística descritiva: mínimo, máximo

Fica mais fácil com a tabela ordenada:

file TLOC
StateChangeListener.java 5
BundleActivator.java 6
IPluginImport.java 10
Field.java 10
BuildEditorContributor.java 11
DebugCoreMessages.java 16
FieldCreationTime.java 44
SWTUtil.java 53
ObjectVector.java 83
  • Mínimo: primeiro valor (da tabela ordenada)
  • Máximo: último valor (da tabela ordenada)

Estatística descritiva: mediana

  • Mediana: elemento do meio
  • Propriedade:
    • 50% dos elementos são menores que a mediana
    • 50% dos elementos são maiores que a mediana
file TLOC
StateChangeListener.java 5
BundleActivator.java 6
IPluginImport.java 10
Field.java 10
BuildEditorContributor.java 11
DebugCoreMessages.java 16
FieldCreationTime.java 44
SWTUtil.java 53
ObjectVector.java 83

Estatística descritiva: mediana

  • E se não tiver elemento do meio?
    • Faz interpolação linear entre os dois elementos do meio.
    • Exemplo: x = 5, 6, 10, 11, 16, 44, 53, 83; mediana = 13.5

Estatística descritiva: média vs. mediana

  • Média e mediana são medidas de tendência central, que sumarizam um conjunto de valores através de um único valor
  • A média é mais sensível a valores extremos. Exemplo:
  • x = 5, 6, 10, 10, 11, 16, 44, 53, 83
    • média = 26.4444444, mediana = 11
  • x = 5, 6, 10, 10, 11, 16, 44, 53, 747 (alteramos o último elemento)
    • média = 100.2222222, mediana = 11
  • Não faz sentido falar em média quando os valores são tão variados: basta um milionário virar bilionário para aumentar o PIB per capita, mas isso quer dizer que a população está ganhando mais?

Estatística descritiva: quartil

  • Quartis são pontos que dividem os dados ordenados em 4 partes iguais
  • 1º quartil: maior que 1/4 (25%) dos outros valores
  • 2º quartil: maior que 2/4 (50%) dos outros valores (mediana)
  • 3º quartil: maior que 3/4 (75%) dos outros valores
  • mínimo: maior que 0/4 (0%) dos outros valores
  • máximo: maior que 4/4 (100%) dos outros valores

Estatística descritiva: quartil

  • x = 5, 6, 10, 10, 11, 16, 44, 53, 83; quartis = 10, 11, 44

Estatística descritiva: quantil

  • Quartil pode ser generalizado com o conceito de quantil
  • ex.:
    • 4-quantil (ou quartil) divide os valores em 4 partes iguais
    • 3-quantil (ou tercil) divide os valores em 3 partes iguais
    • 100-quantil (ou percentil) divide os valores em 100 partes iguais

Estatística descritiva: percentil

  • Ex.: 90º percentil = 9º decil = 59

Estatística descritiva: gráficos

  • Até agora vimos medidas que sumarizam um conjunto de dados através de um único valor
  • Com gráficos, conseguimos visualizar melhor a distribuição dos dados

Estatística descritiva: histograma

  • Divide a faixa de valores em partes iguais e conta quantos valores estão em cada faixa
  • Cada faixa de valores é chamada de bin.

Estatística descritiva: histograma

  • x = 5, 6, 10, 10, 11, 16, 44, 53, 83
hist(x)

Estatística descritiva: histograma

  • Outro exemplo (fictício)

Estatística descritiva: histograma

  • Mais um exemplo
hist(eclipse3$PAR_avg)

Estatística descritiva: ecdf

plot(ecdf(eclipse3$FOUT_avg))

Estatística descritiva: assimetria

  • A partir do histograma pode-se visualizar como os dados estão distribuídos
  • No exemplo anterior, há muito mais valores concentrados nas faixas menores (esquerda) do que nas maiores (direita)
  • Dizemos que a distribuição é assimétrica (possui cauda longa)
  • especificamente, assimétrica à direita
  • Podemos usar funções da biblioteca moments para calcular a assimetria (skewness):
skewness(eclipse3$PAR_avg)
## [1] 2.253637

Estatística descritiva: curtose

  • Indica o quanto a distribuição é espalhada, com valores extremos
kurtosis(eclipse3$PAR_avg)
## [1] 13.93165

Estatística descritiva: boxplot

  • Boxplot é um tipo de gráfico usado para visualizar a distribuição dos dados a partir de seus quartis

Estatística descritiva: boxplot

  • boxplot é bom pra comparar várias distribuições

Estatística descritiva: boxplot

Estatística descritiva: escala logarítmica

Às vezes os dados estão tão espalhados que é difícil visualizá-los.

Estatística descritiva: escala logarítmica

Uma solução é adotar uma escala logarítmica para os eixos do gráfico:

Estatística descritiva bivariada

  • Na estatística descritiva bivariada, buscamos entender o relacionamento entre duas variáveis
    • Quando x cresce, y cresce? (diminui?)
    • x e y variam na mesma proporção?

Estatística descritiva: séries temporais

Estatística descritiva: gráfico de dispersão (scatterplot)

Estatística descritiva: gráfico de dispersão (scatterplot)

Estatística descritiva: correlação

  • Correlação: [-1, 1]
cor(x, y)
## [1] 0.8879799

Estatística descritiva: correlação

Exemplo: matriz de correlação

##                post      TLOC    VG_avg    PAR_avg  FOUT_avg
## post     1.00000000 0.4721315 0.2045547 0.04405611 0.1733836
## TLOC     0.47213146 1.0000000 0.4180516 0.11092324 0.3790984
## VG_avg   0.20455465 0.4180516 1.0000000 0.27765238 0.6883466
## PAR_avg  0.04405611 0.1109232 0.2776524 1.00000000 0.2249910
## FOUT_avg 0.17338363 0.3790984 0.6883466 0.22499105 1.0000000

Exemplo: matriz de correlação

Exemplo: scatterplot matrix

Modelagem

  • Tirar conclusões a partir dos dados
  • Estabelecer causas e efeitos
  • Criar um modelo do fenômeno estudado
  • (Será tema de outras aulas)

Comunicação de resultados

  • Texto
  • Tabelas
  • Gráficos
  • O objetivo é informar, não enganar!

Comunicação de resultados: visualização

  • O humano não é bom em detectar padrões em conjuntos de muitas informações
  • A não ser que essa informação seja apresentada de forma visual
  • Visualização significa criar imagens para comunicar informações

Comunicação de resultados: visualização

Ferramentas para análise quantitativa

  • Calculadora
  • Excel
  • Programa Java
  • R