Correlações no SIP Dataset

O que são os dados

Conjunto de dados com informações de 12299 tarefas realizadas por 22 desenvolvedores em 20 códigos de projeto utilizando metodologia ágil.

Entendendo os dados

estimativas_raw %>% 
    summarise(
        projetos = n_distinct(project_code), 
        categoprias = n_distinct(category), 
        sub_categorias = n_distinct(sub_category), 
        estimativas = n(), 
        tasks = n_distinct(task_number), 
        prioridades = n_distinct(priority)
    )
## # A tibble: 1 x 6
##   projetos categoprias sub_categorias estimativas tasks prioridades
##      <int>       <int>          <int>       <int> <int>       <int>
## 1       20           3             24       12299 10266          10

Temos 20 projetos, com 12299 estimativas de tempo para tasks. Não há apenas uma estimativa por tarefa, já que há apenas 10266 valores distintos de task_number.

estimativas_raw %>% 
    count(task_number, category, summary, sort = T)
## # A tibble: 10,268 x 4
##    task_number category    summary                                             n
##    <chr>       <chr>       <chr>                                           <int>
##  1 10605       Management  Staff Meeting                                       8
##  2 6889        Management  SiP Staff Meeting                                   8
##  3 10089       Operational Office Move and bits and bobs                       7
##  4 10974       Management  Extended SiP Lunch                                  7
##  5 11056       Management  SiP Company Meeting                                 7
##  6 11270       Management  Staff Meeting                                       7
##  7 13124       Management  Company Meeting - scorecard and discussion          7
##  8 13190       Management  Marketing management meeting                        7
##  9 13253       Management  YYY ZZZ's Marketing presentation and meeting        7
## 10 3812        Development Weekly Developer Meeting 14th September 2005 -~     7
## # ... with 10,258 more rows

Dados com uma estimativa por task

Para nossa análise, usaremos uma estimativa por task. Caso haja mais de uma usaremos a média das estimativas_raw.

por_task = estimativas_raw %>%
    group_by(project_code, task_number, category, sub_category, priority, summary) %>%
    summarise(
        hours_estimate = mean(hours_estimate),
        hours_actual = mean(hours_actual),
        erro_absoluto = abs(hours_estimate - hours_actual),
        .groups = "drop"
    ) 

Dados por time

Agrupando o número de Desenvolvedores que trabalharam em tarefas referentes aos Projetos.

por_time = estimativas_raw %>% 
    group_by(project_code) %>% 
    summarise(devs = n_distinct(developer_id),
              erro_medio_abs = mean(abs(hours_estimate - hours_actual)), 
              estimativas = n(), 
              .groups = "drop")

Correlação de Valores

1- Qual a relação entre as estimativas e horas reais tomadas na empresa como um todo e como é essa relação em diferentes subcategorias de tarefa?

por_task %>%
    ggplot(aes(y=hours_estimate, hours_actual)) +
    facet_wrap(~sub_category) +
    geom_point(size=.5, alpha=.5) +
    geom_smooth() +
    scale_x_continuous(breaks=seq(0,2500,1000), minor_breaks=seq(0,2500,500)) +
    labs(title="Gráfico 1:\nRelação de Horas Estimadas x Horas Reais\npor Subcategoria das Tarefas", x="Horas Atuais", y='Horas Estimadas') +
    theme(plot.title=element_text(hjust=0.5))

por_task %>% 
    ggplot(aes(y=hours_estimate, hours_actual)) +
    facet_wrap(~sub_category) +
    geom_point(size=.5, alpha=.5) +
    geom_smooth() +
    scale_y_log10() +
    scale_x_continuous(breaks=seq(0,2500,1000), minor_breaks=seq(0,2500,500)) +
    labs(title="Gráfico 2:\nRelação de Horas Estimadas (Escala Logarítmica) x Horas Reais\npor Subcategoria das Tarefas", x="Horas Atuais", y='Horas Estimadas') +
    theme(plot.title=element_text(hjust=0.5))

por_task %>% 
    ggplot(aes(y=hours_estimate, hours_actual)) +
    facet_wrap(~sub_category) +
    geom_point(size=.5, alpha=.5) +
    geom_smooth() +
    scale_y_log10() +
    scale_x_log10() +
    labs(title="Gráfico 3:\nRelação de Horas Estimadas x Horas Reais\npor Subcategoria das Tarefas em Escalas Logarítmicas", x="Horas Atuais", y='Horas Estimadas') +
    theme(plot.title=element_text(hjust=0.5))

por_task %>%
    group_by(sub_category) %>% 
    summarise(pearson=cor(hours_estimate, hours_actual, method="pearson"), 
              spearman=cor(hours_estimate, hours_actual, method="spearman"), 
              kendall=cor(hours_estimate, hours_actual, method="kendall")) %>%
    ggplot(aes(y=sub_category, pearson)) +
    scale_x_continuous(breaks=seq(0,1,0.25), minor_breaks=seq(0,1,0.1)) +
    geom_point(color='orange', size=3, alpha=.5) +
    geom_point(aes(x=spearman), color='lightgreen', size=3, alpha=.5) +
    geom_point(aes(x=kendall), color='lightblue', size=3, alpha=.5) +
    labs(title="Gráfico 4:\nCorrelações entre Horas Estimadas x Horas Reais", x="Correlações", y='Subcategorias de Tarefas') +
    theme(plot.title=element_text(hjust=0.5))

Para a questão foram construídos 4 gráficos, sendo os Gráficos 1 a 3 mostrando a relação entre as variáveis de Horas Estimadas e Horas Reais, classificadas entre as Subcategorias das tarefas, porém em escalas distintas com o intuito de amostrar alguma linearidade entre as variáveis.

No Gráfico 1 foram utilizadas as escalas normais, através de gráficos de dispersão para as horas e gráficos de suavização visando possível linearidade, que como pode ser visto aparentemente as variáveis possuem pouca correlação.

No Gráfico 2 foi utilizada uma escala logarítmica na base 10 no eixo das Horas Estimadas, porém sem muita diferença visual com relação às proporções do Gráfico 1.

No Gráfico 3 utilizando escalas logarítmicas nos dois eixos, já é possível perceber uma linearidade dos dados, principalmente com o auxílio dos gráfico de suavização, em que é possível perceber uma linearidade positiva em basicamente todas as Subcategorias das tarefas, sendo Board Meeting e Staff Recruitment apresentando poucos valores para uma linearidade mais larga.

No Gráfico 4 são apresentadas as correlações de Pearson (cor laranja), Spearman (cor verde) e de Kendall (cor azul). Pelos valores gerados, é possível observar uma correlação maior na subcategoria Board Meeting, porém é possível que tenha obtido valores altos devido a poucas tarefas registradas. Aparentemente uma subcategoria com correlação mais forte é a Technical Specification, em que as 3 correlações atingiram valores entre 0.6 e 0.85 na escala.

2- Há uma relação perceptível entre o tamanho da equipe estar relacionado com o erro médio das estimativas da equipe? Como é essa relação?

por_time %>% 
    ggplot(aes(devs, erro_medio_abs)) +
    geom_point() +
    geom_smooth() +
    scale_x_log10() +
    scale_y_log10() +
    labs(title="Gráfico 5:\nRelação Logarítmica entre\nDesenvolvedores x Erro Absoluto", x="Correlações", y='Subcategorias de Tarefas') +
    theme(plot.title=element_text(hjust=0.5))

por_time %>% 
    summarise(pearson=cor(devs, erro_medio_abs, method="pearson"), 
              spearman=cor(devs, erro_medio_abs, method="spearman"), 
              kendall=cor(devs, erro_medio_abs, method="kendall"))
## # A tibble: 1 x 3
##   pearson spearman kendall
##     <dbl>    <dbl>   <dbl>
## 1  -0.137   0.0438  0.0324

No Gráfico 5 é amostrada a relação entre o número de Desenvolvedores e o Erro Absoluto de horas por Projeto. Porém, não foi possível verificar uma grande correlação entre as variáveis, utilizando escalas normais e também logarítmicas. A correlação fraca fica evidente com os valores das correlações calculadas, que não ultrapassaram 0.05 do valor, atingindo inclusive valor negativo na correlação de Pearson.

3- Qual a relação entre prioridade da tarefa e erro na sua estimativa?

task_erro = por_task %>%
    mutate(erro=hours_actual-hours_estimate)

por_task %>%
    ggplot(aes(y=priority, erro_absoluto)) +
    geom_point(size=3, alpha=.3, color="steelblue") +
    labs(title="Gráfico 6:\nRelação entre nível de Prioridade x Erro Absoluto das Tarefas", x="Erro Absoluto em Horas", y='Prioridade das Tarefas') +
    theme(plot.title=element_text(hjust=0.5)) +
    scale_y_continuous(breaks=1:10, minor_breaks=1:10)

por_task %>% 
    summarise(pearson=cor(priority, erro_absoluto, method="pearson"), 
              spearman=cor(priority, erro_absoluto, method="spearman"), 
              kendall=cor(priority, erro_absoluto, method="kendall"))
## # A tibble: 1 x 3
##   pearson spearman kendall
##     <dbl>    <dbl>   <dbl>
## 1 0.00594  -0.0312 -0.0250

No Gráfico 6 é possível visualizar a relação entre o Nível de Prioridade com o Erro Absoluto por tarefas. Analisando visualmente, pode-se inferir de certa forma que quanto maior a prioridade, menor é a concentração de tarefas com menos erros, o que significaria numa correlação linear negativa. Porém, realizando o cálculo das correlações de Pearson, Spearman e Kendall, os valores demonstram uma correlação quase nula, para Pearson, e negativa para as demais.