estimativas_raw = read_projectdata()
glimpse(estimativas_raw)
## Observations: 12,299
## Variables: 17
## $ TaskNumber <chr> "1735", "1742", "1971", "2134", "2251", "22…
## $ Summary <chr> "Flag RI on SCM Message Summary screen usin…
## $ Priority <dbl> 1, 1, 2, 5, 10, 1, 5, 5, 6, 5, 2, 1, 3, 1, …
## $ RaisedByID <chr> "58", "58", "7", "50", "46", "13", "13", "1…
## $ AssignedToID <chr> "58", "42", "58", "42", "13", "13", "13", "…
## $ AuthorisedByID <chr> "6", "6", "6", "6", "6", "58", "6", "6", "6…
## $ StatusCode <chr> "FINISHED", "FINISHED", "FINISHED", "FINISH…
## $ ProjectCode <chr> "PC2", "PC2", "PC2", "PC2", "PC2", "PC9", "…
## $ ProjectBreakdownCode <chr> "PBC42", "PBC21", "PBC75", "PBC42", "PBC21"…
## $ Category <chr> "Development", "Development", "Operational"…
## $ SubCategory <chr> "Enhancement", "Enhancement", "In House Sup…
## $ HoursEstimate <dbl> 14.00, 7.00, 0.70, 0.70, 3.50, 7.00, 7.00, …
## $ HoursActual <dbl> 1.75, 7.00, 0.70, 0.70, 3.50, 7.00, 7.00, 7…
## $ DeveloperID <chr> "58", "42", "58", "42", "13", "13", "43", "…
## $ DeveloperHoursActual <dbl> 1.75, 7.00, 0.70, 0.70, 3.50, 7.00, 7.00, 7…
## $ TaskPerformance <dbl> 12.25, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, …
## $ DeveloperPerformance <dbl> 12.25, 0.00, 0.00, 0.00, 0.00, 0.00, NA, 0.…
estimativas_raw %>%
select(ProjectCode, TaskNumber, HoursEstimate, HoursActual) %>%
skimr::skim()
| Name | Piped data |
| Number of rows | 12299 |
| Number of columns | 4 |
| _______________________ | |
| Column type frequency: | |
| character | 2 |
| numeric | 2 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| ProjectCode | 0 | 1 | 3 | 4 | 0 | 20 | 0 |
| TaskNumber | 0 | 1 | 4 | 5 | 0 | 10266 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| HoursEstimate | 0 | 1 | 10.15 | 28.84 | 0.01 | 1 | 3 | 7.0 | 910.00 | ▇▁▁▁▁ |
| HoursActual | 0 | 1 | 13.18 | 68.72 | 0.01 | 1 | 3 | 8.5 | 2490.16 | ▇▁▁▁▁ |
Temos 20 projetos, com 12299 estimativas_raw. Não há apenas uma estimativa por tarefa, já que há apenas 10266 valores distintos de TaskNumber.
estimativas_raw %>%
group_by(TaskNumber) %>%
mutate(estimativas = n()) %>%
filter(estimativas > 1) %>%
count(TaskNumber, sort = T)
Para nossa análise, usaremos uma estimativa por task. Caso haja mais de uma usaremos a média das estimativas_raw:
estimativas = estimativas_raw %>%
group_by(ProjectCode, TaskNumber, Category, Priority, Summary) %>%
summarise(
HoursEstimate = mean(HoursEstimate),
HoursActual = mean(HoursActual),
DeveloperPerformance = mean(DeveloperPerformance)
) %>%
ungroup()
por_time = estimativas_raw %>%
group_by(ProjectCode) %>%
summarise(devs = NROW(unique(DeveloperID)),
erro_medio_abs = mean(abs(HoursEstimate - HoursActual)),
estimativas = n())
Analisaremos, primeiramente, a relação entre as estimativas e horas reais na empresa como um todo, utilizando gráficos e medidas de correlação, como por exemplo, os coeficientes Pearson, Spearman e Kendall.
estimativas %>%
ggplot(aes(x = HoursEstimate, y = HoursActual)) +
geom_point(alpha = .5, colour = "red") +
labs(x = "Horas Estimadas", y = "Horas reais", title = "Relação entre as estimativas e horas reais na empresa")
Pelo gráfico acima é difícil visualizar uma relação entre as variáveis, pois boa parte dos dados estão concentrados nas primeiras faixas de valores, e também existem muitos outliers. É ideal realizar transformações nas escalas para ajudar na análise. Transformando as escalas do eixos em escala logarítmica, temos o seguinte:
estimativas %>%
ggplot(aes(x = HoursEstimate, y = HoursActual)) +
geom_point(alpha = .5, colour = "red") +
labs(x = "Horas estimadas em escala logarítmica", y = "Horas reais em escala logarítmica", title = "Relação entre as estimativas e horas reais na empresa") +
scale_x_log10() +
scale_y_log10()
O gráfico mostra que parece existir alguma relação entre as estimativas e as horas reais. Pelo formato da distribuição dos pontos, essa relação é positiva e forte. Ainda é um pouco difícil confirmar isso com a visualização acima, então iremos calcular a correlação entre essas variáveis utilizando os coeficiente de correlação Pearson, Spearman e Kendall.
Os coeficientes de correlação são métodos estatísticos utilizados para medir as relações entre variáveis. A partir dos valores deles é possível identificar a força e o sinal da relação.
estimativas %>%
summarise(Pearson = cor(HoursEstimate, HoursActual, method = "pearson"),
Spearman = cor(HoursEstimate, HoursActual, method = "spearman"),
Kendall = cor(HoursEstimate, HoursActual, method = "kendall"))
O método Pearson mostrou uma relação fraca e positiva entre as variávies, porém esse método avalia relações lineares, e não é o caso da relação entre essas variáveis, então esse coeficiente será desconsiderado na análise.
O Spearman é mais resistente à outliers e não requer que a relação entre as variáveis seja linear. De acordo com esse método, as estimativas e as horas reias possui uma relação forte e positiva, pois o seu valor está entre 0.7 e 0.9. O mesmo foi obtido com o coeficiente Kendall, que é bem semelhante ao Spearman, muito resistente à outliers e não requer que a relação seja linear.
Então, de acordo com a discussão acima, podemos concluir que existe um relação entre as estimativas e as horas reais, e que essa relação é positiva e forte.
Por fim, analisaremos a relação entre as estimativas e horas reais em cada categoria de tarefas, utilizando gráficos e medidas de correlação, como por exemplo, os coeficientes Pearson, Spearman e Kendall.
estimativas %>%
ggplot(aes(x = HoursEstimate, y = HoursActual, color = Category)) +
geom_point(alpha = .5) +
facet_wrap(~Category) +
labs(x = "Horas estimadas", y = "Horas reais", title = "Relação entre as estimativas e horas reais na empresa\npor categoria") +
guides(color=guide_legend(title="Categoria"))
Da mesma forma que o primeiro gráfico, é difícil visualizar uma relação entre as variáveis para cada uma das categorias. Os dados estão concentrados nas primeiras faixas de valores, então aplicaremos transformações nas escalas para ajudar na análise.
Transformando as escalas dos eixos em escala logarítmica, temos o seguinte:
estimativas %>%
ggplot(aes(x = HoursEstimate, y = HoursActual, color = Category)) +
geom_point(alpha = .5) +
scale_x_log10() +
scale_y_log10() +
facet_wrap(~Category) +
labs(x = "Horas estimadas em escala logarítmica", y = "Horas reais em escala logarítmica", title = "Relação entre as estimativas e horas reais na empresa\npor categoria") +
guides(color=guide_legend(title="Categoria"))
As visualizações mostram que talvez existe alguma relação entre as estimativas e as horas reais em cada uma das categorias. Pelo formato da distribuição dos pontos, parece existir uma relação forte e positiva entre as variáveis, principalmente na primeira categoria, Development. Ainda é um pouco difícil confirmar isso, então iremos calcular a correlação entre essas variáveis para cada uma das categorias, utilizando os coeficientes de correlação Pearson, Spearman e Kendall.
estimativas %>%
group_by(Category) %>%
summarise(Pearson = cor(HoursEstimate, HoursActual, method = "pearson"),
Spearman = cor(HoursEstimate, HoursActual, method = "spearman"),
Kendall = cor(HoursEstimate, HoursActual, method = "kendall"))
Como já foi discutido anteriormente, o coeficiente de Person não será considerado, pois não temos relações lienares.
De acordo com Spearman, em todas as categorias existe uma relação positiva e forte entre as estimativas e as horas reais. No Kendall, as variáveis na categoria Management possui um relação moderada, mas o valor é bem próximo a 0.7, e as outras categorias possui uma relação forte.
Então, podemos concluir que nas categorias Development e Operational existe uma relação positiva e forte entre as estimativas e as horas reais. Na categoria Management, se considerado o coeficiente Kendall, a relação entre essas variáveis é positiva e moderada.
Analisando a relação entre o número de desenvolvedores de cada equipe e o erro médio das estimativas temos o seguinte:
por_time %>%
ggplot(aes(x = devs, y = erro_medio_abs)) +
geom_point(colour = "red") +
labs(x = "Número de desenvolvedores", y = "Erro médio", title = "Relação entre o número de desenvolvedores e erro médio das estimativas")
Pela visualização acima não é possível ver qual é a relação existente entre o número de desenvolvedores e o erro médio das estimativas, pelo formato ela parece ser linear. Então, iremos utilizar as medidas dos coeficientes de correlação, para saber se com eles é possível descobrir a relação existente entre essas variáveis.
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"))
Todos os coeficientes mostraram valores de correlação muito próximos de zero. Levando em consideração que não conseguimos saber se a relação é linear e que existem outliers na visualização, então iremos considerar os coeficientes Spearman e Kendall. Então podemos concluir que não existe relação entre as variáveis, pois os valores dos coeficientes estudados são muito próximos à 0. Não é possível afirmar que equipes com mais desenvolvedores produzem estimativas com mais, ou com menos, erro médio que equipes menores.