Data Mining Techniques for Software Effort Estimation: A Comparative Study
Link: https://ieeexplore.ieee.org/document/5928350/
==> Relação entre o trabalho de referência e a reprodução
Dataset:
Atributos:
Técnicas de predição:
COnteúdo dos dados
Escolhemos nessa reprodução investigar o esforço de uma funcionalidade do projeto, no artigo original o autor focou no esforço do projeto como um todo. Nossa escolha foi motivada para conseguirmos mais dados para compor o dataset. Com relação aos atributos, a principal diferença foi que o artigo original catalogou o propósito do projeto, achamos mais relevante investigar o domínio. Com relação as técnicas de previsão, no trabalho original foram analisadas 13 técnicas, neste trabalho observamos os resultados de quatro métodos utilizando o software Weka. Por fim, resaltar que nesse trabalho realizamos diversas análises não presente no artigo de referência.
1.1 Contextualização
Realizar estimativas de esforço nas atividades dos projetos é uma tarefa complexa e desafiadora. Existem diversos métodos publicados na comunidade científica para realizar estimativas, porém a acurácia nestas previsões normalmente são baixas. Os erros em estimativas (normalmente calculados em Mean Relative Error- MRE) são comuns e acabam trazendo impacto no orçamento e cronograma. As Características do time (p.e conhecimento nas tecnologias do projeto, experiência de mercado, capacidade de trabalhar em equipe, etc.) e do projeto (tecnologias/linguagens utilizadas, complexidade da solução, restrições de projeto, volatilidade dos requisitos, etc.) precisam ser analisados cuidadosamente, pois influenciam diretamente no esforço necessário para executar as atividades dos projetos. Esses fatores são conhecidos na literatura como cost drivers.
Neste cenário que essa pesquisa se encaixa. Analisar correlações de cost drivers com o quantitativo de esforço para executar as tarefas dos projetos, bem como verificar correlações destes fatores com o valor dos erros das estimativas.
1.2 Objetivo
1.2.1 Avaliar qual a correlação de diferentes cost drivers no esforço para executar tarefas nos projetos. 1.2.2 Avaliar qual a correlação de diferentes cost drivers no MRE das estimativas de tarefas nos projetos.
1.3 Questões de pesquisa
Com relação a análise sobre esforço, as questões de pesquisa são:
RQ1: Qual a correlação entre a linguagem de programação e o esforço para implementar a tarefa?
RQ2: Qual a correlação entre o tamanho do projeto e o esforço para implementar a tarefa?
RQ3: Qual a correlação entre o tamanho do time e o esforço para implementar a tarefa?
RQ4: Qual a correlação entre a experiência do time e o esforço para implementar a tarefa?
No tocante a análise sobre o MRE, as questões de pesquisa são:
RQ5: Qual a correlação entre a linguagem de programação e os erros de estimativas nos projetos?
RQ6: Qual a correlação entre o tamanho do projeto e os erros de estimativas nos projetos?
RQ7: Qual a correlação entre o tamanho do time e os erros de estimativas nos projetos?
RQ8: Qual a correlação entre a experiência do time e os erros de estimativas nos projetos?
1.4 Método
O primeiro passo da pesquisa foi buscar backlogs de projetos encerrados em empresas de desenvolvimento de software. A fonte desses artefatos foram projetos de laboratórios da Universidade Federal de Campina Grande (UFCG), empresas de desenvolvimento de software de Campina Grande - PB, e por fim projetos diversos no Github.
Em seguida filtrou-se apenas os backlogs de projetos Web, que é o contexto escolhido para essa pesquisa.
O passo seguinte foi categorizar as tarefas desses projetos. Para isso, foi criado um modelo para representar todas as possíveis tarefas de projetos web. Esse trabalho aconteceu em parceria com o grupo Intelligent Software Engineering (ISE) da UFCG. Todos oS backlogs analisados foram mapeados de acordo com esse modelo.
Com todos estes backlogs mapeados, uma categoria foi escolhida para análise nessa pesquisa. Escolheu-se a categoria “Realizar Cadastro (CRUD)” por ser o item que mais se repetiu no mapeamento.
Por fim, montou-se o dataset, onde cada registro representa uma ocorrência da execução do CRUD em um projeto Web. Ao lado de cada ocorrência, outras informações foram preenchidas, no tocante a características das equipes de desenvolvimento e do projeto (cost drivers).
1.5 Organização do relatório
O restante deste relatório está organizado desta forma: no capítulo 02 iremos dar mais detalhes do dataset utilizado na pesquisa. No capítulo 03 cada pergunta de pesquisa referente a esforço será discutida de acordo com as análises realizadas, no capítulo 04 vamos responder as perguntas referentes aos erros de estimativas. No capítulo 05 vamos analisar algumas técnicas de previsão. E finalmente no capítulo 06 explanamos as considerações finais desta pesquisa.
Os campos do dataset são descritos a seguir:
{r} project : Identificador do Projeto
{r} domain : O Domínio da aplicação (web, mobile, games…)
{r} category : Categoria da atividade de Desenvolvimento de Software
{r} lang : Linguagem de programação
{r} size_project : Tamanho do projeto (numérico)
{r} size_team : Tamanho do time (Numérico)
{r} experience : Somatório dos anos de experiência do time (Numérico)
{r} effort : Esforço para executar a categoria (em horas)
{r} mre : Mean relative error (%)
Algumas informações dos dados coletados para montar o dataset:
{r} project : Foram utilizados informações de 27 backlogs de projetos de software
{r} domain : O Domínio dos projetos analisados é Web
{r} category : A categoria de atividades analisadas foi “Realizar Cadastros (CRUDs)”
{r} lang : Os backlogs analisados diferentem em três tipos de linguagens de programação
{r} size_project : Valor correspondente a quantidade de linhas de código de cada projeto
{r} size_team : Valor correspondente a quantidade de integrantes do time de cada projeto
{r} experience : Valor correspondente ao somatório dos anos de experiência de cada integrante
{r} effort : Valor correspondente a Quantidade de horas registradas para execução da tarefa
{r} mre : Valor calculado do Mean relative error (%)
Como mencionado, foram utilizados 27 backlogs na análise, todos estes de projetos de domínio web ({r} domain == Web). Para montar o dataset escolhemos uma categoria de tarefa: os cadastros ({r} category == CRUD). Ao todo, 121 registros formam nosso dataset. No trabalho original cada registro representa o esforço de um projeto, em nossaa pesquisa diminuimos a granularidade e vamos fazer análises sobre o esforço e MRE de uma funcionalidade específica.
library(tidyverse)
library(here)
library(lubridate)
library(knitr)
library(ggplot2)
library(boot)
library(resample)
library(readr)
theme_set(theme_bw())
Meusdados = read_csv(here::here("MeusDados.csv")) %>%
head(100000)
Meusdados$mre = as.numeric(Meusdados$mre)
Nessa parte do experimento iremos analisar a correlação de variáveis com o esforço (variável == {r} effort)
Hipótese: O esforço para executar determinada tarefa é o mesmo independente de linguagem de programação.
Inicialmente vamos observar a distribuição dos valores de esforço para cada linguagem de programação:
Meusdados %>%
ggplot(aes(x = effort, color = lang)) +
geom_density() +
labs(title="Figura 1 - Distribuição de Densidade por Linguagem ", x="Esforço", y="Densidade")
Podemos observar na Figura 1 que no intervalo inicial de valores de esforço (0 - 18), a linguagem PHP possui os menores valores de esforço. Outro ponto a observar é que apartir do valor 32, apenas valores para as linguagens JAVA e PYTHON foram catalogadas. Portanto a densidade não é constante no gráfico. Vamos então fazer outra análise, na Figura 2 observar os histogramas de esforço por linguagem.
Meusdados %>%
arrange(lang) %>%
ggplot(aes(x = effort, fill = lang )) +
geom_histogram(binwidth = 2) +
facet_grid(~ lang) +
labs(title="Figura 2 - Histograma por linguagem ", x="Esforço", y="Quantidade")
Com base na Figura 2 não podemos confirmar ou refutar nossa hipótese, pois fica claro que temos quantidades diferentes de ocorrências para cada linguagem em nosso Dataset
Portanto, vamos realizar uma terceira análise, analisar o BoxPlot (Figura 3):
Meusdados %>%
ggplot() +
geom_boxplot(aes(x = lang, y =effort, color = lang)) + scale_y_log10() +
labs(title="Figura 3 - BoxPlot ", x="Linguagem", y="Esforço")
Detalhando o valor dos quartis para cada linguagem:
with(Meusdados, tapply(effort, lang, summary))
## $JAVA
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6.00 8.00 16.00 18.76 23.00 78.00
##
## $PHP
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.00 7.50 8.00 11.31 15.00 26.00
##
## $PYTHON
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6.00 7.00 16.00 16.63 21.00 45.00
Conclusão: Hipótese refutada. Observando os quartis, percebemos que Java e Python tem mesmo valores de mediana (16 horas) e PHP um valor bem abaixo (8 horas). E em relação a média, PHP tem valores de esforço menor (11.31 horas) que as outras lingguagens (Java 18.76 e Python 16.63). Concluimos que o esforço para fazer CRUDs na linguagem PHP é menor, e que Python e Java tem valores de esforço bem próximos.
Discussão: PHP tem diversas ferramentas para geração automática de código o que diminui o esforço.
Hipótese: Projetos maiores tem uma quantidade maior de esforço para executar as tarefas.
Vamos analisar um gráfico das variáveis relacionadas ao tamanho do projeto e o esforço:
plot(Meusdados$effort~Meusdados$size_project, xlab="Tamanho do Projeto", ylab="Esforço")
Visualmente podemos observar que as duas variáveis não tem correlação, não existe uma concentração de pontos em nenhuma parte do gráfico. Também não existe uma curva linear entre as ocorrências das variáveis. Para uma análise mais precisa, vamos calcular o coeficiente de Pearson e Spearman. Através desses testes podemos calcular a correlação, analisando a direção (se valor positivo ou negativo) e força (valores mais próximos de 1 ou -1).
cor(Meusdados$size_project, Meusdados$effort, method = "pearson")
## [1] -0.125614
cor(Meusdados$size_project, Meusdados$effort, method = "spearman")
## [1] -0.005147473
Os coeficientes de pearson e spearman tiveram valores próximos de zero. Podemos concluir que a correlação é fraca.
Conclusão: Hipótese refutada. Não existe correlação entre o tamanho do projeto e o esforço.
Discussão: Acreditava-se que projetos maiores tendem a ter mais complexidade e que isso poderia inferir esforços maiores para implementar as funcionalidades. Porém, isso não foi verificado nas análises. Assim, entende-se que o esforço para implementar um CRUD em um projeto pequeno é similar em um projeto maior.
Hipótese: Projetos com equipe maiores tem uma quantidade menor de esforço para executar uma tarefa
Vamos analisar um gráfico das variáveis relacionados ao tamanho da equipe e o esforço:
plot(Meusdados$effort~Meusdados$size_team, xlab="Tamanho do Time", ylab="Esforço")
Visualmente podemos observar que as duas variáveis não tem correlação. Para uma análise mais precisa, vamos calcular o coeficiente de Pearson e Spearman.
cor(Meusdados$size_team, Meusdados$effort, method = "pearson")
## [1] -0.03991313
cor(Meusdados$size_team, Meusdados$effort, method = "spearman")
## [1] -0.006123808
Os coeficientes de pearson e spearman tiveram valores próximos de zero. Podemos concluir que a correlação é fraca.
Conclusão: Hipótese refutada. Não existe correlação entre o tamanho do time e o esforço.
Discussão: Acreditava-se que um time maior teria mais colaboração e que isso poderia inferir esforços menores para execução das tarefas do projeto. Porém, outros fatores podem justificar a não correlação dessas variáveis, como a dificuldade de comunicação em times maiores.
Hipótese: Projetos com equipes mais experientes tem uma quantidade menor de esforço para executar as tarefas do projeto.
Vamos analisar um gráfico das variáveis relacionados a experiência do time e o esforço:
plot(Meusdados$effort~Meusdados$experience, xlab="Experiência do time", ylab="Esforço")
Visualmente fica claro que os maiores valores de esforço concentra-se nas equipes com menos experiência.
Vamos calcular a correlação das variáveis:
cor(Meusdados$experience, Meusdados$effort, method = "pearson")
## [1] -0.5883064
cor(Meusdados$experience, Meusdados$effort, method = "spearman")
## [1] -0.5637217
Usando o teste de Pearson e Spearman verificamos valores de coeficientes negativos e altos, interpretamos esse valor como uma correlação negativa e forte.
Conclusão: Hipótese confirmada. Quanto maior é a experiência do time, menor é o esforço.
Discussão: time experiente tem mais conhecimento nas tecnologias do projeto, o que acarreta um esforço menor.
No artigo de referência (Table 9 - page 393) foram calculados os valores de erro de estimativas para cada um dos nove datasets. Foi verificado que na maioria dos casos os erros são altos, acima de 25%. E que isso não configura um valor preciso de previsão “the estimate is far from the actual value, e.g., more than 25 percent, the estimate can not be considered “accurate.”
No artigo de referência, cada dataset representa os projetos de uma organização. Em nossa reprodução, vamos verificar a média do MRE para cada um dos 27 projetos que compõe nosso dataset.
tapply(Meusdados$mre,Meusdados$project, mean)
## APP VIRTUS GLEC GQA GTC INTRANET LSW
## 59.00000 23.80000 29.66667 18.75000 15.00000 4.00000
## Monitoria MP OPME ORCAMENTO PORTAL PPT
## 44.75000 33.60000 23.60000 15.50000 26.20000 25.42857
## PTU REC RECGLOSA SAM SCCP SEC
## 27.00000 27.50000 14.50000 26.83333 29.00000 27.00000
## SHC SO STV SUAP SUT TID
## 48.33333 54.66667 0.00000 83.33333 41.00000 26.80000
## TISS TISS_Z TQ
## 26.40000 26.42857 27.50000
Podemos observar que na maioria dos projetos de nosso dataset o valor do MRE também foi superior a 25%.
Agora iremos analisar a correlação de variáveis (cost drivers) com o erro das estimativas (variável == {r} mre)
Hipótese: O valor do erro de estimativas não tem relação com a linguagem de programação do projeto.
Inicialmente vamos observar a distribuição dos valores de MRE para cada linguagem de programação:
Meusdados %>%
ggplot(aes(x = mre, color = lang)) +
geom_density()
A densidade não é constante no gráfico. Vamos verificar os quartis e observar o gráfico BoxPlot.
Meusdados %>%
ggplot() +
geom_boxplot(aes(x = lang, y =mre, color = lang)) + scale_y_log10()
with(Meusdados, tapply(mre, lang, summary))
## $JAVA
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 20.00 25.00 28.95 35.00 78.00
##
## $PHP
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 13.50 25.00 21.09 31.00 40.00
##
## $PYTHON
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 15.00 45.00 37.05 52.00 92.00
Conclusão: Hipótese refutada. Observamos na análise que Python tem média de MRE maior que as linguagems JAVA e PHP.
Discussão: Acreditamos que a falta de conhecimento na linguagem Pyhton possa ter influenciado em maiores erros de estimativa. Em pesquisas futuras, pode-se verificar quanto o nível de conhecimento na linguagem (criar uma variável sobre os anos de experiência com a linguagem) pode influir no valor das estimativas.
Hipótese: Projetos maiores proporcionam erros maiores de estimativas.
Vamos analisar um gráfico das variáveis relacionados ao tamanho do projeto e o MRE:
plot(Meusdados$mre~Meusdados$size_project, xlab="Tamanho do Projeto", ylab="MRE")
Visualmente podemos observar que as duas variáveis não tem correlação, não existe uma concentração de pontos em nenhuma parte do gráfico. Também não existe uma curva linear entre as ocorrências das variáveis. Para uma análise mais precisa, vamos calcular o coeficiente de Pearson e Spearman.
cor(Meusdados$size_project, Meusdados$mre, method = "pearson")
## [1] 0.09390703
cor(Meusdados$size_project, Meusdados$mre, method = "spearman")
## [1] 0.04631738
Os coeficientes de pearson e spearman tiveram valores próximos de zero. Podemos concluir que a correlação é fraca.
Conclusão: Hipótese refutada. Não existe correlação entre o tamanho do projeto e a taxa de erros de estimativas.
Discussão: Acreditava-se que projetos maiores tendem a ter mais complexidade e que isso poderia inferir maiores erros nas estimativas. Porém, isso não foi verificado nas análises.
Hipótese: Projetos com equipe maiores tem uma quantidade menor de erros em estimativas.
Vamos analisar um gráfico das variáveis relacionados ao tamanho da equipe e o MRE:
plot(Meusdados$mre~Meusdados$size_team, xlab="Tamanho do Time", ylab="MRE")
Visualmente podemos observar que as duas variáveis não tem correlação. Para uma análise mais precisa, vamos calcular o coeficiente de Pearson e Spearman.
cor(Meusdados$size_team, Meusdados$mre, method = "pearson")
## [1] -0.07288108
cor(Meusdados$size_team, Meusdados$mre, method = "spearman")
## [1] -0.02456927
Como o coeficiente foi pequeno, podemos concluir que a correlação é fraca.
Conclusão: Hipótese refutada. Não existe correlação entre o tamanho do time e o MRE.
Discussão: Acreditava-se que um time maior teria mais colaboração e que isso poderia inferir menores erros de estimativas. Porém, assim como na questão RQ3, outros fatores podem justificar a não correlação dessas variáveis, como a dificuldade de comunicação em times maiores.
Hipótese: Projetos com equipes experientes tem uma quantidade menor de erros em estimativas.
Vamos analisar um gráfico das variáveis relacionados a experiência do time e o MRE:
plot(Meusdados$mre~Meusdados$experience, xlab="Experiência do time", ylab="MRE")
Visualmente fica claro que os maiores valores de erros concentra-se nas equipes com menos experiência.
Vamos calcular a correlação das variáveis:
cor(Meusdados$experience, Meusdados$mre, method = "pearson")
## [1] -0.5650034
cor(Meusdados$experience, Meusdados$mre, method = "spearman")
## [1] -0.5378762
Usando o teste de Pearson e Spearman verificamos valores de coeficientes negativos e altos, interpretamos esse valor como uma correlação negativa e forte.
Conclusão: Hipótese confirmada. Quanto maior é a experiência do time, menor é o erro de estimativas
Discussão: time experiente tem mais conhecimento prévio e consegue estimar com mais precisão
Na tabela 05 do artigo de referência foram apresentados valores de MRE resultado da aplicação de diferentes técnicas em cada um dos 09 Dataset. No artigo de referência, as técnicas Log + OLS, BC + OLS, RiR, M5 obtiveram os melhores desempenhos. No trabalho foram utilizados diversos softwares para calcular as previsões: Weka, Matlab, MARS e LS-SVMlab.
Nesta pesquisa escolhemos usar algumas técnicas do Weka para fazer nossos experimentos. Os resultados estão na tabela a seguir
| Técnica | Erro |
|---|---|
| M5 | 48.06% |
| RandomTree | 5.64% |
| REpTree | 48.69% |
| MulilayerPerceptron | 128.86% |
Como podemos observar, das técnicas analisadas nesta pesquisa o RandomTree teve melhor desempenho.
OBS: em todas os experimentos, para avaliar a acurácia das técnicas foi utilizado a opção de teste que o programa utilize o próprio conjunto de dados (opção “Use Trainning set”“)
Foram mapeados 27 projetos de 04 diferentes organizações, ao todo foram encontradas 121 ocorrências da funcionalidade CRUD. Foi verificado neste experimento que projetos em Java tem em média mais esforço para implementar essa funcionalidade e que em Python concentram-se os maiores erros de estimativas. Foi observado também que o tamanho do projeto e/ou o tamanho do time não tem correlação com o esforço de desenvolvimento e o erro nas estimativas. E por fim, foi verificado que projetos com equipes mais experientes implementam a funcionalidade com menor esforço e erram menos ao estimar atividades em projetos de software.
6.1) Ameaças a validade
A proposta dessa pesquisa foi realizar uma reprodução do trabalho “Data Mining Techniques for Software Effort Estimation: A Comparative Study”. A principal ameaça a validade diz respeito ao tamanho do Dataset, em nossa pesquisa consideramos um conjunto de dados muito inferior.
6.2) Discussão
As análises realizadas nessa pesquisa servem para auxiliar no planejamento de projetos de software. Para realizar estimativas mais assertivas faz-se necessário conhecer dados históricos. Porém, como mencionado no artigo referência, opiniões de especialistas são necessárias: “These results also indicate that data mining techniques can make a valuable contribution to the set of software effort estimation techniques, but should not replace expert judgment.” Portanto, os dados dessa pesquisa são importantes, pois trazem indicadores para melhor planejamento dos projetos. Porém, para melhor previsão de esforço, além de analisar dados passados, opiniões de especialistas precisam ser considerados.
6.3) Trabalhos Futuros
Avaliar o comportamento das variáveis analisadas em um contexto diferente, por exemplo em projetos Mobile. Também se faz necessário analisar outras funcionalidades além de CRUD’s. Verificar se nestes outros cenários os resultados dessa pesquisa são uniformes.
Outros cost drivers poderiam ser utilizadas nas análises, como por exemplo o conhecimento do time nas tecnologias do projeto e o tipo de Project Owner (se interno ou externo). Analisar se esses fatores tem correlação com o esforço de desenvolvimento de tarefas e o valor dos erros de estimativas em projetos de desenvolvimento de software.