├── .gitignore ├── A predictive analysis approach using linear regression to estimate software effort.html ├── Avaliação de Modelos de Preditivos de Regressão para Estimar Esforço de Software.pdf ├── Datasets ├── 02.desharnais.arff └── 02.desharnais.csv ├── Notebooks ├── .ipynb_checkpoints │ ├── 01.albrecht-checkpoint.ipynb │ ├── 02.desharnais-checkpoint.ipynb │ ├── 03.sdr-checkpoint.ipynb │ ├── 03.srd-checkpoint.ipynb │ ├── 04.isbsg10-checkpoint.ipynb │ ├── 05.cocomo81-checkpoint.ipynb │ ├── 06.nasa93-checkpoint.ipynb │ ├── A predictive analysis approach using linear regression to estimate software effort-checkpoint.ipynb │ ├── Knn Regressor-checkpoint.ipynb │ ├── New Study on China Dataset-checkpoint.ipynb │ ├── Untitled-checkpoint.ipynb │ └── predictive analysis approach using linear regression to estimate software effort-checkpoint.ipynb ├── A predictive analysis approach using linear regression to estimate software effort.ipynb └── __pycache__ │ └── visuals.cpython-36.pyc ├── Presentation └── Presentation - A predictive analysis approach using linear regression to estimate software effort.pdf ├── README.md ├── output_10_1.png ├── output_25_0.png ├── output_25_1.png ├── output_25_2.png ├── output_25_3.png └── output_25_4.png /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /Avaliação de Modelos de Preditivos de Regressão para Estimar Esforço de Software.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniesteves/sw-effort-predictive-analysis/f857d3844335891ebc3031b21c904981cbc7984c/Avaliação de Modelos de Preditivos de Regressão para Estimar Esforço de Software.pdf -------------------------------------------------------------------------------- /Datasets/02.desharnais.arff: -------------------------------------------------------------------------------- 1 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 | % This is a PROMISE Software Engineering Repository data set made publicly 3 | % available in order to encourage repeatable, verifiable, refutable, and/or 4 | % improvable predictive models of software engineering. 5 | % 6 | % If you publish material based on PROMISE data sets then, please 7 | % follow the acknowledgment guidelines posted on the PROMISE repository 8 | % web page http://promise.site.uottawa.ca/SERepository . 9 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10 | 11 | @relation desharnais.csv 12 | 13 | % Domain: software cost estimation 14 | % Donor: Martin Shepperd 15 | % Corrections by: Dan Port with information from Barbara Kitchenham 16 | % 17 | % Notes: 4 incomplete projects (projects 38,44,66,75) so often people use the 77 complete cases. 18 | % The original source is [1]. 19 | % Our paper [2] provides a basic overview of the data set. 20 | % References: 21 | % [1] J. M. Desharnais, "Analyse statistique de la 22 | % productivitie des projets informatique a partie de la 23 | % technique des point des fonction," University of Montreal, 24 | % Masters Thesis, 1989. 25 | % 26 | % [2] M. J. Shepperd and C. Schofield, "Estimating software 27 | % project effort using analogies," IEEE Transactions on 28 | % Software Engineering, vol. 23, pp. 736-743, 1997. 29 | % 30 | % [3] Dreger, J. Brian. "Function Point Analysis" 31 | % Englewood Cliffs, NJ: Prentice Hall, 1989. 32 | % 33 | % Attributes: 34 | % 35 | @attribute Project numeric % proj ID 36 | @attribute TeamExp numeric % measured in years 37 | @attribute ManagerExp numeric % measured in years 38 | @attribute YearEnd numeric % Year project ended (catagorical) 39 | @attribute Length numeric % Actual project schedule in months (note this is dependent variable like ActualEffort) 40 | @attribute Effort numeric % ActualEffort is measured in person-hours 41 | @attribute Transactions numeric % Transactions is a count of basic logical transactions in the system (function points) 42 | @attribute Entities numeric % Entities is the number of entities in the systems data model (function points) 43 | @attribute PointsNonAdjust numeric % This is Transactions + Entities (function points) Note: in the orginal data set this was mislabeled as PointsAjust 44 | @attribute Adjustment numeric % Function point complexity adjustment factor (Total Processing Complexity) 45 | @attribute PointsAjust numeric % This is the function points adjusted by the Adjustment factor =0.65 + (0.01 * PointsNonAdjust) Note: in the orginal data set this was mislabeled as PointsNonAjust 46 | @attribute Language {1,2,3} % programming language (catagorical) 47 | % 48 | % Note: Many of the above attributes are numerically coded catagorical variables. Values of -1 indicate missing data, 49 | % 50 | % Sample run (WEKA): 51 | % === Run information === 52 | % 53 | % Scheme: weka.classifiers.functions.LinearRegression -S 0 -R 1.0E-8 54 | % Relation: martin.csv 55 | % Instances: 81 56 | % Attributes: 12 57 | % Project 58 | % TeamExp 59 | % ManagerExp 60 | % YearEnd 61 | % Length 62 | % Effort 63 | % Transactions 64 | % Entities 65 | % PointsNonAdjust 66 | % Adjustment 67 | % PointsAjust 68 | % Langage 69 | % 70 | % Note from dport: the regression model below is problematic in that it treats catagorical variables as continuous values 71 | % and it includes the dependent variable Length as an independent variable which is likely a mistake. 72 | % 73 | % Test mode: 10-fold cross-validation 74 | % 75 | % === Classifier model (full training set) === 76 | % 77 | % Linear Regression Model 78 | % 79 | % Effort = 80 | % -433.25 * TeamExp + 81 | % 408.8057 * ManagerExp + 82 | % 201.2701 * Length + 83 | % 4.2361 * Transactions + 84 | % 7.9056 * Entities + 85 | % 4.4594 * PointsAdjust + 86 | % 92.1389 * Adjustment + 87 | % -1777.4579 * Langage + 88 | % -278.0786 89 | 90 | % 91 | % Time taken to build model: 0.02 seconds 92 | % 93 | % === Cross-validation === 94 | % === Summary === 95 | % 96 | % Correlation coefficient 0.7303 97 | % Mean absolute error 2082.1182 98 | % Root mean squared error 3007.0504 99 | % Relative absolute error 64.9965 % 100 | % Root relative squared error 67.3788 % 101 | % Total Number of Instances 81 102 | 103 | @data 104 | 105 | 1,1,4,85,12,5152,253,52,305,34,302,1 106 | 2,0,0,86,4,5635,197,124,321,33,315,1 107 | 3,4,4,85,1,805,40,60,100,18,83,1 108 | 4,0,0,86,5,3829,200,119,319,30,303,1 109 | 5,0,0,86,4,2149,140,94,234,24,208,1 110 | 6,0,0,86,4,2821,97,89,186,38,192,1 111 | 7,2,1,85,9,2569,119,42,161,25,145,2 112 | 8,1,2,83,13,3913,186,52,238,25,214,1 113 | 9,3,1,85,12,7854,172,88,260,30,247,1 114 | 10,3,4,83,4,2422,78,38,116,24,103,1 115 | 11,4,1,84,21,4067,167,99,266,24,237,1 116 | 12,2,1,84,17,9051,146,112,258,40,271,1 117 | 13,1,1,84,3,2282,33,72,105,19,88,1 118 | 14,3,4,85,8,4172,162,61,223,32,216,1 119 | 15,4,4,85,9,4977,223,121,344,28,320,1 120 | 16,3,2,85,8,1617,119,48,167,26,152,2 121 | 17,4,3,85,8,3192,57,43,100,43,108,1 122 | 18,4,4,86,14,3437,68,316,384,20,326,2 123 | 19,3,4,87,14,4494,9,386,395,21,340,2 124 | 20,4,2,86,5,840,58,34,92,29,86,1 125 | 21,4,4,86,12,14973,318,269,587,34,581,2 126 | 22,2,4,85,18,5180,88,170,258,34,255,1 127 | 23,2,4,86,5,5775,306,132,438,37,447,1 128 | 24,4,1,87,20,10577,304,78,382,39,397,1 129 | 25,1,4,86,8,3983,89,200,289,33,283,1 130 | 26,4,1,85,14,3164,86,230,316,33,310,1 131 | 27,2,0,86,6,3542,71,235,306,37,312,1 132 | 28,3,1,85,14,4277,148,324,472,39,491,1 133 | 29,4,4,85,16,7252,116,170,286,27,263,1 134 | 30,4,1,85,14,3948,175,277,452,37,461,1 135 | 31,4,3,86,6,3927,79,128,207,27,190,1 136 | 32,1,1,86,9,710,145,38,183,27,168,3 137 | 33,4,4,87,9,2429,174,78,252,41,267,3 138 | 34,1,1,85,5,6405,194,91,285,35,285,1 139 | 35,2,2,88,3,651,126,49,175,38,180,3 140 | 36,1,3,86,17,9135,317,119,436,34,432,2 141 | 37,2,4,87,11,1435,289,88,377,28,351,3 142 | 38,-1,-1,87,8,5922,260,144,404,24,360,1 143 | 39,1,4,88,4,847,158,59,217,18,180,3 144 | 40,3,3,88,16,8050,302,145,447,52,523,2 145 | 41,1,1,87,9,4620,451,48,499,28,464,1 146 | 42,2,4,87,34,2352,661,132,793,23,698,3 147 | 43,1,1,88,10,2174,64,54,118,25,106,1 148 | 44,-1,4,86,39,19894,284,230,514,50,591,1 149 | 45,2,1,86,18,6699,182,126,308,35,308,1 150 | 46,2,3,87,27,14987,173,332,505,19,424,1 151 | 47,2,2,88,9,4004,252,7,259,28,241,1 152 | 48,4,3,85,11,12824,131,180,311,51,361,1 153 | 49,2,3,85,8,2331,106,39,145,6,103,1 154 | 50,3,3,85,9,5817,96,108,204,29,192,1 155 | 51,2,3,85,7,2989,116,72,188,18,156,1 156 | 52,3,3,85,6,3136,86,49,135,32,131,1 157 | 53,2,3,85,17,14434,221,121,342,35,342,1 158 | 54,1,1,87,12,2583,61,96,157,18,130,1 159 | 55,1,3,86,12,3647,132,89,221,5,155,2 160 | 56,3,7,86,13,8232,45,387,432,16,350,2 161 | 57,1,1,86,12,3276,55,112,167,12,129,2 162 | 58,1,4,87,8,2723,124,52,176,14,139,2 163 | 59,3,3,87,5,3472,120,126,246,15,197,2 164 | 60,1,2,87,6,1575,47,32,79,14,62,2 165 | 61,1,1,86,12,2926,126,107,233,23,205,2 166 | 62,3,2,86,6,1876,101,45,146,15,117,2 167 | 63,1,1,86,5,2520,78,99,177,14,140,1 168 | 64,4,7,86,13,1603,69,74,143,14,113,1 169 | 65,1,3,86,8,3626,194,97,291,35,291,2 170 | 66,2,-1,87,10,6783,224,110,334,28,309,2 171 | 67,2,4,87,15,11361,323,184,507,35,507,2 172 | 68,1,3,86,6,1267,42,31,73,27,67,2 173 | 69,1,2,87,5,2548,74,43,117,25,105,2 174 | 70,3,4,87,10,1155,101,57,158,9,117,2 175 | 71,0,4,86,6,546,97,42,139,6,99,3 176 | 72,2,3,84,13,2275,134,77,211,13,165,2 177 | 73,4,5,86,26,9100,482,227,709,26,645,2 178 | 74,0,2,84,6,595,213,73,286,6,203,3 179 | 75,0,-1,84,22,3941,139,143,282,22,245,2 180 | 76,2,3,86,24,13860,473,182,655,40,688,2 181 | 77,4,4,85,12,1400,229,169,398,39,414,3 182 | 78,4,3,83,12,2800,227,73,300,34,297,1 183 | 79,4,4,82,24,9520,395,193,588,40,617,1 184 | 80,4,3,86,12,5880,469,176,645,43,697,3 185 | 81,4,4,85,36,23940,886,241,1127,34,1116,1 186 | -------------------------------------------------------------------------------- /Datasets/02.desharnais.csv: -------------------------------------------------------------------------------- 1 | id,Project,TeamExp,ManagerExp,YearEnd,Length,Effort,Transactions,Entities,PointsNonAdjust,Adjustment,PointsAjust,Language 2 | 1,1,1,4,85,12,5152,253,52,305,34,302,1 3 | 2,2,0,0,86,4,5635,197,124,321,33,315,1 4 | 3,3,4,4,85,1,805,40,60,100,18,83,1 5 | 4,4,0,0,86,5,3829,200,119,319,30,303,1 6 | 5,5,0,0,86,4,2149,140,94,234,24,208,1 7 | 6,6,0,0,86,4,2821,97,89,186,38,192,1 8 | 7,7,2,1,85,9,2569,119,42,161,25,145,2 9 | 8,8,1,2,83,13,3913,186,52,238,25,214,1 10 | 9,9,3,1,85,12,7854,172,88,260,30,247,1 11 | 10,10,3,4,83,4,2422,78,38,116,24,103,1 12 | 11,11,4,1,84,21,4067,167,99,266,24,237,1 13 | 12,12,2,1,84,17,9051,146,112,258,40,271,1 14 | 13,13,1,1,84,3,2282,33,72,105,19,88,1 15 | 14,14,3,4,85,8,4172,162,61,223,32,216,1 16 | 15,15,4,4,85,9,4977,223,121,344,28,320,1 17 | 16,16,3,2,85,8,1617,119,48,167,26,152,2 18 | 17,17,4,3,85,8,3192,57,43,100,43,108,1 19 | 18,18,4,4,86,14,3437,68,316,384,20,326,2 20 | 19,19,3,4,87,14,4494,9,386,395,21,340,2 21 | 20,20,4,2,86,5,840,58,34,92,29,86,1 22 | 21,21,4,4,86,12,14973,318,269,587,34,581,2 23 | 22,22,2,4,85,18,5180,88,170,258,34,255,1 24 | 23,23,2,4,86,5,5775,306,132,438,37,447,1 25 | 24,24,4,1,87,20,10577,304,78,382,39,397,1 26 | 25,25,1,4,86,8,3983,89,200,289,33,283,1 27 | 26,26,4,1,85,14,3164,86,230,316,33,310,1 28 | 27,27,2,0,86,6,3542,71,235,306,37,312,1 29 | 28,28,3,1,85,14,4277,148,324,472,39,491,1 30 | 29,29,4,4,85,16,7252,116,170,286,27,263,1 31 | 30,30,4,1,85,14,3948,175,277,452,37,461,1 32 | 31,31,4,3,86,6,3927,79,128,207,27,190,1 33 | 32,32,1,1,86,9,710,145,38,183,27,168,3 34 | 33,33,4,4,87,9,2429,174,78,252,41,267,3 35 | 34,34,1,1,85,5,6405,194,91,285,35,285,1 36 | 35,35,2,2,88,3,651,126,49,175,38,180,3 37 | 36,36,1,3,86,17,9135,317,119,436,34,432,2 38 | 37,37,2,4,87,11,1435,289,88,377,28,351,3 39 | 38,38,-1,-1,87,8,5922,260,144,404,24,360,1 40 | 39,39,1,4,88,4,847,158,59,217,18,180,3 41 | 40,40,3,3,88,16,8050,302,145,447,52,523,2 42 | 41,41,1,1,87,9,4620,451,48,499,28,464,1 43 | 42,42,2,4,87,34,2352,661,132,793,23,698,3 44 | 43,43,1,1,88,10,2174,64,54,118,25,106,1 45 | 44,44,-1,4,86,39,19894,284,230,514,50,591,1 46 | 45,45,2,1,86,18,6699,182,126,308,35,308,1 47 | 46,46,2,3,87,27,14987,173,332,505,19,424,1 48 | 47,47,2,2,88,9,4004,252,7,259,28,241,1 49 | 48,48,4,3,85,11,12824,131,180,311,51,361,1 50 | 49,49,2,3,85,8,2331,106,39,145,6,103,1 51 | 50,50,3,3,85,9,5817,96,108,204,29,192,1 52 | 51,51,2,3,85,7,2989,116,72,188,18,156,1 53 | 52,52,3,3,85,6,3136,86,49,135,32,131,1 54 | 53,53,2,3,85,17,14434,221,121,342,35,342,1 55 | 54,54,1,1,87,12,2583,61,96,157,18,130,1 56 | 55,55,1,3,86,12,3647,132,89,221,5,155,2 57 | 56,56,3,7,86,13,8232,45,387,432,16,350,2 58 | 57,57,1,1,86,12,3276,55,112,167,12,129,2 59 | 58,58,1,4,87,8,2723,124,52,176,14,139,2 60 | 59,59,3,3,87,5,3472,120,126,246,15,197,2 61 | 60,60,1,2,87,6,1575,47,32,79,14,62,2 62 | 61,61,1,1,86,12,2926,126,107,233,23,205,2 63 | 62,62,3,2,86,6,1876,101,45,146,15,117,2 64 | 63,63,1,1,86,5,2520,78,99,177,14,140,1 65 | 64,64,4,7,86,13,1603,69,74,143,14,113,1 66 | 65,65,1,3,86,8,3626,194,97,291,35,291,2 67 | 66,66,2,-1,87,10,6783,224,110,334,28,309,2 68 | 67,67,2,4,87,15,11361,323,184,507,35,507,2 69 | 68,68,1,3,86,6,1267,42,31,73,27,67,2 70 | 69,69,1,2,87,5,2548,74,43,117,25,105,2 71 | 70,70,3,4,87,10,1155,101,57,158,9,117,2 72 | 71,71,0,4,86,6,546,97,42,139,6,99,3 73 | 72,72,2,3,84,13,2275,134,77,211,13,165,2 74 | 73,73,4,5,86,26,9100,482,227,709,26,645,2 75 | 74,74,0,2,84,6,595,213,73,286,6,203,3 76 | 75,75,0,-1,84,22,3941,139,143,282,22,245,2 77 | 76,76,2,3,86,24,13860,473,182,655,40,688,2 78 | 77,77,4,4,85,12,1400,229,169,398,39,414,3 79 | 78,78,4,3,83,12,2800,227,73,300,34,297,1 80 | 79,79,4,4,82,24,9520,395,193,588,40,617,1 81 | 80,80,4,3,86,12,5880,469,176,645,43,697,3 82 | 81,81,4,4,85,36,23940,886,241,1127,34,1116,1 -------------------------------------------------------------------------------- /Notebooks/.ipynb_checkpoints/01.albrecht-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 2, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "from scipy.io import arff\n", 17 | "import pandas as pd\n", 18 | "import numpy as np\n", 19 | "from sklearn.linear_model import LinearRegression\n", 20 | "from sklearn.metrics import mean_squared_error, r2_score\n", 21 | "\n", 22 | "# Formatação mais bonita para os notebooks\n", 23 | "import seaborn as sns\n", 24 | "import matplotlib.pyplot as plt\n", 25 | "\n", 26 | "%matplotlib inline\n", 27 | "plt.style.use('fivethirtyeight')\n", 28 | "plt.rcParams['figure.figsize'] = (15,5)" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 3, 34 | "metadata": {}, 35 | "outputs": [ 36 | { 37 | "data": { 38 | "text/html": [ 39 | "
\n", 40 | "\n", 53 | "\n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | "
idInputOutputInquiryFileFPAdjRawFPcountsAdjFPEffort
012515075601.001750.001750102.4
121939870361.001902.001902105.2
2370270120.80535.0042811.1
34406020121.15660.0075921.1
451069190.90478.8943128.8
\n", 131 | "
" 132 | ], 133 | "text/plain": [ 134 | " id Input Output Inquiry File FPAdj RawFPcounts AdjFP Effort\n", 135 | "0 1 25 150 75 60 1.00 1750.00 1750 102.4\n", 136 | "1 2 193 98 70 36 1.00 1902.00 1902 105.2\n", 137 | "2 3 70 27 0 12 0.80 535.00 428 11.1\n", 138 | "3 4 40 60 20 12 1.15 660.00 759 21.1\n", 139 | "4 5 10 69 1 9 0.90 478.89 431 28.8" 140 | ] 141 | }, 142 | "execution_count": 3, 143 | "metadata": {}, 144 | "output_type": "execute_result" 145 | } 146 | ], 147 | "source": [ 148 | "df_albrecht = pd.read_csv('../Datasets/01.albrecht.csv')\n", 149 | "df_albrecht.head()" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 1, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": null, 162 | "metadata": {}, 163 | "outputs": [], 164 | "source": [] 165 | } 166 | ], 167 | "metadata": { 168 | "kernelspec": { 169 | "display_name": "Python 3", 170 | "language": "python", 171 | "name": "python3" 172 | }, 173 | "language_info": { 174 | "codemirror_mode": { 175 | "name": "ipython", 176 | "version": 3 177 | }, 178 | "file_extension": ".py", 179 | "mimetype": "text/x-python", 180 | "name": "python", 181 | "nbconvert_exporter": "python", 182 | "pygments_lexer": "ipython3", 183 | "version": "3.6.2" 184 | } 185 | }, 186 | "nbformat": 4, 187 | "nbformat_minor": 2 188 | } 189 | -------------------------------------------------------------------------------- /Notebooks/.ipynb_checkpoints/04.isbsg10-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "from scipy.io import arff\n", 17 | "import pandas as pd\n", 18 | "import numpy as np\n", 19 | "from sklearn.linear_model import LinearRegression\n", 20 | "from sklearn.metrics import mean_squared_error, r2_score\n", 21 | "\n", 22 | "# Formatação mais bonita para os notebooks\n", 23 | "import seaborn as sns\n", 24 | "import matplotlib.pyplot as plt\n", 25 | "\n", 26 | "%matplotlib inline\n", 27 | "plt.style.use('fivethirtyeight')\n", 28 | "plt.rcParams['figure.figsize'] = (15,5)" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 2, 34 | "metadata": {}, 35 | "outputs": [ 36 | { 37 | "data": { 38 | "text/html": [ 39 | "
\n", 40 | "\n", 53 | "\n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | "
idIDData_QualityUFPYearISOTAGATDT...MAJ_T_DefectsX_T_DefectsTOT_T_DefectsMIN_I_DefectsMAJ_I_DefectsX_I_DefectsTOT_I_DefectsUnnamed: 95Unnamed: 96Unnamed: 97
0110592BB2010ManufacturingManufacturingBusiness ApplicationTrack test managementNew Development...???????NaNNaNNaN
1211245BB2010ManufacturingManufacturingBusiness ApplicationPart management in factoryNew Development...???????NaNNaNNaN
2311623BB2010ManufacturingManufacturingBusiness ApplicationAfter sales Parts documentationNew Development...??110????NaNNaNNaN
3414319BB2010BankingBankingBusiness ApplicationAuditing ManagementNew Development...???????NaNNaNNaN
4514653BB2010ManufacturingManufacturingBusiness ApplicationParts documentationNew Development...???????NaNNaNNaN
\n", 203 | "

5 rows × 98 columns

\n", 204 | "
" 205 | ], 206 | "text/plain": [ 207 | " id ID Data_Quality UFP Year IS OT \\\n", 208 | "0 1 10592 B B 2010 Manufacturing Manufacturing \n", 209 | "1 2 11245 B B 2010 Manufacturing Manufacturing \n", 210 | "2 3 11623 B B 2010 Manufacturing Manufacturing \n", 211 | "3 4 14319 B B 2010 Banking Banking \n", 212 | "4 5 14653 B B 2010 Manufacturing Manufacturing \n", 213 | "\n", 214 | " AG AT DT \\\n", 215 | "0 Business Application Track test management New Development \n", 216 | "1 Business Application Part management in factory New Development \n", 217 | "2 Business Application After sales Parts documentation New Development \n", 218 | "3 Business Application Auditing Management New Development \n", 219 | "4 Business Application Parts documentation New Development \n", 220 | "\n", 221 | " ... MAJ_T_Defects X_T_Defects TOT_T_Defects MIN_I_Defects \\\n", 222 | "0 ... ? ? ? ? \n", 223 | "1 ... ? ? ? ? \n", 224 | "2 ... ? ? 110 ? \n", 225 | "3 ... ? ? ? ? \n", 226 | "4 ... ? ? ? ? \n", 227 | "\n", 228 | " MAJ_I_Defects X_I_Defects TOT_I_Defects Unnamed: 95 Unnamed: 96 Unnamed: 97 \n", 229 | "0 ? ? ? NaN NaN NaN \n", 230 | "1 ? ? ? NaN NaN NaN \n", 231 | "2 ? ? ? NaN NaN NaN \n", 232 | "3 ? ? ? NaN NaN NaN \n", 233 | "4 ? ? ? NaN NaN NaN \n", 234 | "\n", 235 | "[5 rows x 98 columns]" 236 | ] 237 | }, 238 | "execution_count": 2, 239 | "metadata": {}, 240 | "output_type": "execute_result" 241 | } 242 | ], 243 | "source": [ 244 | "df_albrecht = pd.read_csv('../Datasets/04.isbsg10.csv')\n", 245 | "df_albrecht.head()" 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": null, 251 | "metadata": {}, 252 | "outputs": [], 253 | "source": [] 254 | } 255 | ], 256 | "metadata": { 257 | "kernelspec": { 258 | "display_name": "Python 3", 259 | "language": "python", 260 | "name": "python3" 261 | }, 262 | "language_info": { 263 | "codemirror_mode": { 264 | "name": "ipython", 265 | "version": 3 266 | }, 267 | "file_extension": ".py", 268 | "mimetype": "text/x-python", 269 | "name": "python", 270 | "nbconvert_exporter": "python", 271 | "pygments_lexer": "ipython3", 272 | "version": "3.6.2" 273 | } 274 | }, 275 | "nbformat": 4, 276 | "nbformat_minor": 2 277 | } 278 | -------------------------------------------------------------------------------- /Notebooks/.ipynb_checkpoints/05.cocomo81-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "#### Tim Menzies\n", 8 | "\n", 9 | "#### This is a cross-listed data set that contains effort and defect information.\n", 10 | "\n", 11 | "#### The data in this file confirms to the [model.\n", 12 | "\n", 13 | "* URL\n", 14 | "\n", 15 | " - Latest version:\n", 16 | " - coc81-dem (with defect and month counts)\n", 17 | " - coc81\n", 18 | " - coc81lnh: effort multipliers expresses as “low,medium,hight”\n", 19 | " - cocomo2000: cocomo data set transferred to cocomo II via Rosetta Stone\n", 20 | "\n", 21 | "* With change log:\n", 22 | " \n", 23 | " - coc81-dem (with defect and month counts)\n", 24 | " - coc81\n", 25 | " - coc81lnh\n", 26 | "\n", 27 | "#### Change Log\n", 28 | "\n", 29 | "WhenWhatMarch 2010JPL experts added expected number of defects and months to create coc81-demDec 2009Correction: the original PROMISE repository data set had incorrect DATA and CPLX effort multiplier values for project 32 and did not include prjoject_id, dev_mode, and the first row of headers as it does nowFebruary 8, 2006Donated by Tim Menzies\n", 30 | "\n", 31 | "##### Reference\n", 32 | "\n", 33 | "Reifer, D., Boehm, B. W., and Chulani, S. (1999). The Rosetta Stone: Making COCOMO 81 Estimates Work with COCOMO II. Crosstalk. The Journal of Defense Software Engineering., pages 11–15.\n", 34 | "\n", 35 | "URL: https://zenodo.org/record/268424#.Wv4kgNMvw1I" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 3, 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "from scipy.io import arff\n", 45 | "import pandas as pd\n", 46 | "import numpy as np\n", 47 | "from sklearn.linear_model import LinearRegression\n", 48 | "from sklearn.metrics import mean_squared_error, r2_score\n", 49 | "\n", 50 | "# Formatação mais bonita para os notebooks\n", 51 | "import seaborn as sns\n", 52 | "import matplotlib.pyplot as plt\n", 53 | "\n", 54 | "%matplotlib inline\n", 55 | "plt.style.use('fivethirtyeight')\n", 56 | "plt.rcParams['figure.figsize'] = (15,5)" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 4, 62 | "metadata": {}, 63 | "outputs": [ 64 | { 65 | "data": { 66 | "text/html": [ 67 | "
\n", 68 | "\n", 81 | "\n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | "
idrelydatacplxtimestorvirtturnacapaexppcapvexplexpmodptoolscedlocactual
010.881.160.701.01.061.151.071.191.131.171.11.001.241.101.04113.02040.0
120.881.160.851.01.061.001.071.000.911.000.90.951.101.001.00293.01600.0
231.001.160.851.01.000.870.940.860.820.860.90.950.910.911.00132.0243.0
340.751.160.701.01.000.871.001.190.911.421.00.951.241.001.0460.0240.0
450.880.941.001.01.000.871.001.001.000.860.90.951.241.001.0016.033.0
\n", 213 | "
" 214 | ], 215 | "text/plain": [ 216 | " id rely data cplx time stor virt turn acap aexp pcap vexp lexp \\\n", 217 | "0 1 0.88 1.16 0.70 1.0 1.06 1.15 1.07 1.19 1.13 1.17 1.1 1.00 \n", 218 | "1 2 0.88 1.16 0.85 1.0 1.06 1.00 1.07 1.00 0.91 1.00 0.9 0.95 \n", 219 | "2 3 1.00 1.16 0.85 1.0 1.00 0.87 0.94 0.86 0.82 0.86 0.9 0.95 \n", 220 | "3 4 0.75 1.16 0.70 1.0 1.00 0.87 1.00 1.19 0.91 1.42 1.0 0.95 \n", 221 | "4 5 0.88 0.94 1.00 1.0 1.00 0.87 1.00 1.00 1.00 0.86 0.9 0.95 \n", 222 | "\n", 223 | " modp tool sced loc actual \n", 224 | "0 1.24 1.10 1.04 113.0 2040.0 \n", 225 | "1 1.10 1.00 1.00 293.0 1600.0 \n", 226 | "2 0.91 0.91 1.00 132.0 243.0 \n", 227 | "3 1.24 1.00 1.04 60.0 240.0 \n", 228 | "4 1.24 1.00 1.00 16.0 33.0 " 229 | ] 230 | }, 231 | "execution_count": 4, 232 | "metadata": {}, 233 | "output_type": "execute_result" 234 | } 235 | ], 236 | "source": [ 237 | "df_cocomo81 = pd.read_csv('../Datasets/05.cocomo81.csv')\n", 238 | "df_cocomo81.head()" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": 8, 244 | "metadata": {}, 245 | "outputs": [ 246 | { 247 | "name": "stdout", 248 | "output_type": "stream", 249 | "text": [ 250 | "R-Squared coefficient of 'pcap' : 0.024672262263196743\n", 251 | "R-Squared coefficient of 'time' : 0.023209516898305194\n", 252 | "R-Squared coefficient of 'cplx' : 0.00011639518839945406\n" 253 | ] 254 | } 255 | ], 256 | "source": [ 257 | "def print_r2(dependents_var_list, independent_var):\n", 258 | " model = LinearRegression()\n", 259 | " for x in dependents_var_list:\n", 260 | " model.fit(np.reshape(np.array(df_cocomo81[x]), (len(df_cocomo81[x]), 1)), independent_var) \n", 261 | " print(\"R-Squared coefficient of '{}' : {}\".format(x,model.score(np.reshape(np.array(df_cocomo81[x]), (len(df_cocomo81[x]), 1)),independent_var)))\n", 262 | "\n", 263 | "\n", 264 | "effort = np.reshape(np.array(df_cocomo81['actual']), (len(df_cocomo81['actual']), 1)) \n", 265 | "print_r2(['pcap','time','cplx'], effort)" 266 | ] 267 | }, 268 | { 269 | "cell_type": "code", 270 | "execution_count": 7, 271 | "metadata": {}, 272 | "outputs": [ 273 | { 274 | "data": { 275 | "image/png": "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\nAACAxRH+AQAAAACwOMI/AAAAAAAWR/gHAAAAAMDiCP8AAAAAAFgc4R8AAAAAAIsj/AMAAAAAYHGE\nfwAAAAAALI7wDwAAAACAxRH+AQAAAACwOMI/AAAAAAAWR/gHAAAAAMDiCP8AAAAAAFgc4R8AAAAA\nAIsj/AMAAAAAYHGEfwAAAAAALC6o4X/jxo265557lJGRodjYWL344ot+603T1IIFC9S3b18lJSVp\nzJgx2rVrl98Yt9utnJwcpaamKjU1VTk5OXK73X5jduzYodtvv11JSUnKyMhQXl6eTNP0G/PnP/9Z\nWVlZSkhIUFZWltauXRuYgwYAAAAAoJUFNfzX1NSoX79+WrhwoZxO53nrly5dqmXLlikvL0/r1q1T\nfHy8xo0bp6qqKt+YyZMnq6ioSAUFBSooKFBRUZGmTJniW3/69GmNGzdOCQkJWrdunRYuXKinnnpK\nTz/9tG+My+XSv/7rv+quu+7Shg0bdNddd+lHP/qRPvzww8B+AAAAAAAAtAJHMHd+22236bbbbpMk\n5ebm+q0zTVP5+fmaOXOmxo4dK0nKz89XWlqaCgoKNGnSJO3Zs0fvvPOO3nzzTWVmZkqSFi9erOzs\nbBUXFystLU0rV65UbW2t8vPz5XQ61a9fP+3du1fPPPOMpk+fLsMwlJ+fr5tvvlmzZ8+WJKWnp2vD\nhg3Kz8/XCy+80IqfCAAAAAAALa/N3vNfUlKisrIyDR8+3LfM6XRqyJAh2rx5s6SzZ+yjoqKUlZXl\nGzNo0CBFRkb6jRk8eLDflQUjRoxQaWmpSkpKJEkffPCB337OjTm3DQAAAAAA2rOgnvn/KmVlZZKk\n+Ph4v+Xx8fEqLS2VJJWXlysuLk6GYfjWG4ahrl27qry83DcmJSXlvG2cW9erVy+VlZVdcD/ntvFl\niouLv8aRBU97qxeXhr5aE321JvpqTfTVeuipNdFXa6Kvn0tLS/vK9W02/LcHF/tw25Jzt0HAWuir\nNdFXa6Kv1kRfrYeeWhN9tSb62jxt9rL/xMRESVJFRYXf8oqKCiUkJEiSEhISVFlZ6Tdzv2maOn78\nuN+YC23j3Lpz+/qq/QAAAAAA0J612fDfs2dPJSYmqrCw0Lesrq5OmzZt8t3jn5mZqerqarlcLt8Y\nl8ulmpoavzGbNm1SXV2db0xhYaGSk5PVs2dPSdI3vvENv/2cG/PFuQQAAAAAAGivghr+q6urVVRU\n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\nfGMmT56soqIiFRQUqKCgQEVFRZoyZYpv/enTpzVu3DglJCRo3bp1WrhwoZ566ik9/fTTAT9GAAAA\nAAACrdkz35w5c0YRERG64YYbNGbMGPXq1UtOp/9jcwzD0AMPPHDZxf3ud79TUlKSnn32Wd+yXr16\n+f7fNE3l5+dr5syZGjt2rCQpPz9faWlpKigo0KRJk7Rnzx698847evPNN5WZmSlJWrx4sbKzs1Vc\nXKy0tDStXLlStbW1ys/Pl9PpVL9+/bR3714988wzmj59ugzDuOxjAQAAAAAgWJod/h955BHf/7/6\n6qsXHNNS4f+vf/2rRowYoUmTJmnDhg1KSkrSvffeq5/85CcyDEMlJSUqKyvT8OHDfe9xOp0aMmSI\nNm/erEmTJsnlcikqKkpZWVm+MYMGDVJkZKQ2b96stLQ0uVwuDR482O+XGCNGjNBvfvMblZSU+P3C\nAQAAAACA9qbZ4X/79u2BqOOCDh48qBdeeEG5ubmaOXOmPv74Yz300EOSpJycHJWVlUmS320A516X\nlpZKksrLyxUXF+d39t4wDHXt2lXl5eW+MSkpKedt49w6wj8AAAAAoD1rdvhPTU0NRB0X5PV6df31\n12v+/PmSpAEDBmj//v1avny5cnJyWq2OL1NcXBzsEpqlvdWLS0NfrYm+WhN9tSb6aj301JroqzXR\n18+lpaV95fpmh/9z3G63/va3v+nTTz+VdPaXArfeeqtiY2O/7ibPk5iYqPT0dL9lV111lQ4fPuxb\nL0kVFRXq0aOHb0xFRYUSEhIkSQkJCaqsrJRpmr6z/6Zp6vjx435j/nkCw3Ovz425kIt9uG3JufkN\nYC301ZroqzXRV2uir9ZDT62JvloTfW2erxX+ly5dqoULF6q+vt7vcXjh4eGaN29ei9zvL529N/+T\nTz7xW/bJJ5/4gn7Pnj2VmJiowsJC3XDDDZKkuro6bdq0SY8++qgkKTMzU9XV1XK5XL77/l0ul2pq\nanyvMzMz9cgjj6iurk7h4eGSpMLCQiUnJ6tnz54tciwAAAAAAARLsx/194c//EGPPPKIsrKy9PLL\nL2vr1q3aunWrXnnlFQ0aNEiPPPKI/vjHP7ZIcbm5ufrggw/0xBNPaP/+/frTn/6k5557TpMnT5Z0\n9t79qVOnaunSpVqzZo127typ3NxcRUZGasKECZKk9PR0jRw5UrNmzZLL5ZLL5dKsWbM0atQo32+J\n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\nse80isEAAAAASUVORK5CYII=\n", 276 | "text/plain": [ 277 | "" 278 | ] 279 | }, 280 | "metadata": {}, 281 | "output_type": "display_data" 282 | }, 283 | { 284 | "data": { 285 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/8AAAFfCAYAAAAYgXyRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xt8VPWd//H3mUuSIUACIReCJtxi\nCBdRsQliRbm0iHSLVJT+uru6bDFKpEVaQKnb6s/acqkrsIp5VNHtdrdeU9zCVnHlR6oISLyAQa7h\nFgKEZAIMuU6SmTm/PyhTR0BEkpzk5PV8PHg8mHO+c+Zz5nwJeZ9zvt9j+Hw+UwAAAAAAwLYcVhcA\nAAAAAABaF+EfAAAAAACbI/wDAAAAAGBzhH8AAAAAAGyO8A8AAAAAgM0R/gEAAAAAsDnCPwAAAAAA\nNmdp+N+4caO+//3vKysrS/Hx8frDH/4QXtfc3KxHH31Uo0aNUmpqqjIzMzVjxgyVlZVFbKOxsVHz\n5s1T//79lZqaqu9///s6evRoRJuysjJNmzZNqamp6t+/v+bPn6+mpqaINu+//75uvvlmJScna/jw\n4XrxxRdbb8cBAAAAAGhDlob/uro6DR48WIsWLZLH44lYV19fr08//VRz587Vu+++q5deeklHjx7V\n1KlTFQgEwu0WLFigNWvW6IUXXtCbb76pmpoaTZs2TcFgUJIUDAY1bdo01dbW6s0339QLL7yg1atX\n65FHHglv49ChQ7rrrruUnZ2t9957Tz/5yU80f/58/elPf2qbLwIAAAAAgFZk+Hw+0+oiJKlPnz5a\nsmSJ/v7v//6CbXbv3q2RI0dq48aNGjJkiE6fPq2BAwdqxYoVuuuuuyRJR44c0bBhw1RQUKBx48bp\nnXfe0V133aXt27friiuukCS9+uqr+vGPf6ySkhJ1795djz76qNasWaNPPvkk/Fk/+tGPtHv3br3z\nzjutu+MAAAAAALSyDjXmv6amRpIUHx8vSdq2bZuam5s1duzYcJsrrrhCmZmZ2rJliySpqKhImZmZ\n4eAvSePGjVNjY6O2bdsWbvP5bZxts3XrVjU3N7fqPgEAAAAA0No6TPhvamrSv/zLv+jWW29Vnz59\nJEmVlZVyOp1KSEiIaJuYmKjKyspwm8TExIj1CQkJcjqdX9omMTFRgUBAJ06caK1dAgAAAACgTbis\n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\nkpSfn6+MjAwVFBRo+vTp2rNnj9atW6e1a9cqOztbkrR06VJNnDhRJSUlysjI0Ouvv66Ghgbl5+fL\n4/Fo8ODB2rt3r5599lnNmjVLhmFc9r4AAAAAAGCVSw7/jz32WPjvr7766nnbtFT4//Of/6xx48Zp\n+vTp2rBhg1JSUnT33Xfr3nvvlWEYKi0tVUVFhcaOHRt+j8fj0ahRo7RlyxZNnz5dRUVF6tq1q3Jy\ncsJtRo4cqdjYWG3ZskUZGRkqKirSDTfcEHESY9y4cfrVr36l0tLSiBMOAAAAAAB0NJcc/j/99NPW\nqOO8Dh06pBdeeEF5eXl68MEHtX37dj300EOSpNzcXFVUVEhSxDCAs6/Ly8slSZWVlUpISIi4em8Y\nhnr16qXKyspwm9TU1HO2cXYd4R8AAAAA0JFdcvhPS0trjTrOKxQK6dprr9Wjjz4qSRo+fLgOHDig\nlStXKjc3t83quJCSkhKrS7gkHa1etDz6QOfG8Qd9oHPj+IM+APqAvWVkZHzp+ksO/2f5fD795S9/\n0eHDhyWdOSlwyy23KD4+/utu8hzJycnKzMyMWHbVVVfpyJEj4fWS5PV6deWVV4bbeL1eJSUlSZKS\nkpJ04sQJmaYZvvpvmqaqqqoi2nxxAsOzr8+2OZ+Lfbntydn5DdB50Qc6N44/6AOdG8cf9AHQB/C1\nwv/y5cu1aNEiNTY2RjwOLyYmRgsWLGiR8f7SmbH5+/bti1i2b9++cNBPT09XcnKyCgsLdd1110mS\n/H6/Nm/erMcff1ySlJ2drdraWhUVFYXH/RcVFamuri78Ojs7W4899pj8fr9iYmIkSYWFherdu7fS\n09NbZF8AAAAAALDKJT/q7/e//70ee+wx5eTk6OWXX9bWrVu1detWvfLKKxo5cqQee+wx/ed//meL\nFJeXl6cPP/xQTz75pA4cOKD//u//1nPPPacZM2ZIOjN2f+bMmVq+fLlWr16tnTt3Ki8vT7GxsZo6\ndaokKTMzU+PHj9ecOXNUVFSkoqIizZkzRxMmTAif+Zo6dao8Ho/y8vK0c+dOrV69WsuWLVNeXh4z\n/QMAAAAAOjzD5/OZF2/2N6NGjVJSUpLeeOONc4KxaZq6/fbb5fV6tWnTphYp8O2339bjjz+uffv2\n6YorrtC9996r++67L+IW/kWLFul3v/udfD6fRowYoSeffFKDBw8Ob8Pn82n+/Pl66623JEkTJ07U\n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\nazBnzhxMmjQJM2bMUD7qz9raGgsXLlQ7//z583Hv3j0EBATAxsYGNTU12LNnDywtLeHn5wcA8PDw\ngIGBAVJTU9HY2AgTExP4+Ph0ed27i4sLnJycsHLlSty6dQuDBg3CsWPHcOvWLbUzdsXR0RECgQBp\naWkwNTWFqakp3Nzc4O7urlY/CxcuRE5ODiIiIlQe9VdeXo49e/bA0LDnX7GmTp2KxMRESCQSlJaW\nIiwsDPb29mhqakJhYSHy8/OxcuVKtftdtGgRcnNzERISgj//+c8YNmwY6urqkJ2djevXryM9Pf2x\nl04QEVHfx+KfiIhIwzZv3gwPDw/s27cP69atg6GhIWxtbTF16lQEBAQ8cfkRI0bg7Nmz2LFjB/Ly\n8pCTkwOFQoGhQ4dCJBIpnyUPPLzLvImJCVJTUyEWi2FiYoKgoCCIxWKYmZmpnX3GjBnIyMjAvn37\n0NDQoHx8XmJionKIulAoxNatW/HOO+/g9ddfh0wmw86dO7ss/o2MjJCVlYVly5Zh+/bt0NfXx4QJ\nE5CTkwMXFxe1c3a1HqlUitWrV2PJkiX4+eefkZiYqHbxb25ujry8PIjFYrz33nv48ccf4ebmhv37\n93d6I0B1JSUlYezYsfj73/+O/fv34969ezA1NYWXlxd2796N8PBwtfsUCoUoKCiARCLBkSNHkJaW\nhmeeeQY+Pj5ITU3t1r5HRER9l15DQ4P274JDRERERERERL2G1/wTERERERER6TgW/0REREREREQ6\njsU/ERERERERkY5j8U9ERERERESk41j8ExEREREREek4Fv9EREREREREOo7FPxEREREREZGOY/FP\nREREREREpONY/BMRERERERHpOBb/RERERERERDruv5y9+wHcGq7JAAAAAElFTkSuQmCC\n", 286 | "text/plain": [ 287 | "" 288 | ] 289 | }, 290 | "metadata": {}, 291 | "output_type": "display_data" 292 | }, 293 | { 294 | "data": { 295 | "image/png": "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\nbtyoXr16hfqsW7dOS5Ys0bRp0yRJOTk5WrlyZWh7fHy8XnrpJS1atEjjx49XQkKC5s6dq3nz5nX6\n/gAAAAAA0N4Mr9fLheyBdsJCJrADxjHsgrEMO2Acwy4Yy9br0uf8AwAAAACAq0f4BwAAAADA5gj/\nAAAAAADYHOEfAAAAAACbI/wDAAAAAGBzhH8AAAAAAGyO8A8AAAAAgM0R/gEAAAAAsDnCPwAAAAAA\nNkf4BwAAAADA5gj/AAAAAADYHOEfAAAAAACbI/wDAAAAAGBzhH8AAAAAAGyO8A8AAAAAgM0R/gEA\nAAAAsDnCPwAAAAAANkf4BwAAAADA5gj/AAAAAADYHOEfAAAAAACbI/wDAAAAAGBzhH8AAAAAAGyO\n8A8AAAAAgM0R/gEAAAAAsDnCPwAAAAAANkf4BwAAF1VX16ia2garywAAAFfBZXUBAACga6qrb1TR\nziOqqq6XJMXERGrMbdcpvrfb4soAAMDl4sg/AABoVdHOI2ps9CvGHakYd6TMoKntOw7JNE2rSwMA\nAJeJ8A8AAM5TV9eoqmqfHA4j1GYYhhoa/Ko8XWdhZQAA4EoQ/gEAwHmCFzm6z5F/AAC6H8I/AAA4\nT1xslGJiIs4L+hERLiX2jbWoKgAAcKUI/wAAoFVjb7teppoX/qutb1RTIKisWzPCTgUAAADdA6v9\nAwCAVvXuHa277hyh02fqZJqm+vaJJfgDANBNEf4BAMAFGYbBNH8AAGyAaf8AAAAAANgcR/5trrHR\nr8OHylVX16gBA/oqKbm31SUBAAAAADpZlz7y/9hjj2n8+PEaMGCABg0apHvvvVd79+4N62OappYv\nX65hw4YpNTVVU6ZM0b59+8L6eL1e5ebmKj09Xenp6crNzZXX6w3rs2fPHk2ePFmpqakaPny48vPz\nu/2ljM566/R/L3+gQwcrVFFerTdePyTPjsNWlwUAAAAA6GRdOvy//vrr+t73vqdXXnlFmzZtksvl\n0te+9jWdOXMm1GfNmjVau3at8vPztXXrViUlJWnq1Kmqrq4O9Zk1a5Z2796tDRs2aMOGDdq9e7dm\nz54d2l5VVaWpU6cqOTlZW7du1YoVK/T444/riSee6NT9bW/vvvORIiKdiohwyjAMuWMiVPqxV5Wn\naqwuDQAAAADQibr0tP+NGzeG3X7qqaeUnp6uHTt2KCcnR6ZpqqCgQAsWLNA999wjSSooKFBmZqY2\n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\nVdX5Ob4//vjDPATeaDTW6hH39vYG4OTJkwBUVFRY7LexsTEPiTfVqYu9vT1jxozhwIEDTJ48uc6e\n99zcXDZt2mRuf1lZGStXrjTvr6qqYv78+djZ2V1Xsn0jTpw4wZo1a8zblZWVLF68GGdnZ4vF9C5n\na2tLeHg4OTk57Nmzp9b+srIyi+2pU6dSXFxMWloa06ZNo2PHjowaNYqzZ89eNTbTlIs/T1UwiY6O\n5vTp07z88ssYjUaioqKuej4REZHLqedfRETEipKSkli9ejUDBw60+NTf/v37SU9PNy8QGBUVRXZ2\nNlOmTOGbb76hZ8+enD9/np07d9K/f3+ioqLw8/MjLi6Od999l7179/LYY49hZ2fHjz/+yPr165k0\naRLPPfccH330ERkZGfTt2xdXV1cqKytZtmwZtra29OvXD4CEhAQqKirw9/fH2dmZX375hfT0dFq3\nbn3Fb86bJCQkcODAAebPn8/OnTuJiIigdevWlJeXs3XrVnbs2EFGRgZQswhiZmYmCQkJFBUV0b59\ne3Jycti+fTuvv/56rc8l3io3NzfGjh1LUVERbdu2JTs7m4MHD5Kenn7Flf6hJqHfuXMnvXv3ZtCg\nQXh5eWE0GtmzZw8bN26ktLQUgPz8fN5//32SkpLMU0HS0tIIDg7mtddeIzU19YrXMH15Yfz48QQH\nB9OwYUP69OljfinQpUsXunTpwtq1a7n33nuvOPpCRESkLkr+RURErMjBwYFNmzYxdepUMjIyqKys\nxMvLi8WLF1ssBGhra8uKFSuYNWsWq1atYuPGjTRv3hwfHx/z6ACAmTNn0rVrVxYtWsS0adNo2LAh\nLi4uRERE4O/vD4Cfnx/ffPMNa9eu5ddff6VJkyZ07dqVGTNm4OPjA9Ssnr9kyRIWLVqE0WjE0dGR\nxx9/nAkTJlxzJX8bGxvmzp3LE088Yf704MmTJ83xLl++nNDQUAAaN27Mhg0bSE5OZuXKlZw8eZIO\nHTrwzjvvEBMT81ffbtq3b09qaipTpkxh//79ODs7M2/ePCIjI696nIODA1u3bmXGjBnk5OSwcOFC\nmjdvjqenp3nRvdOnTzNq1Ci8vLyYNGmS+dgHHniAcePGMX36dMLCwggMDKzzGmFhYcTHx7N69WpW\nrVpFdXU1hYWF5uQfanr/J0+ezDPPPHPVhRdFRET+zMZoNN76SjgiIiIi/3L3338/np6erF692tqh\n3LT09HTGjx/PV199hbu7u7XDERGR/xDN+RcRERH5j1i8eDG+vr5K/EVE5IZp2L+IiIjIv9jZs2f5\n5JNP+Pzzz9mzZw+ZmZnWDklERP6DlPyLiIiI/IuVlZUxbNgwmjVrRmJionlRRhERkRuhOf8iIiIi\nIiIi9Zzm/IuIiIiIiIjUc0r+RUREREREROo5Jf8iIiIiIiIi9ZySfxEREREREZF6Tsm/iIiIiIiI\nSD2n5F9ERERERESknvsfofPXC7k+KLsAAAAASUVORK5CYII=\n", 296 | "text/plain": [ 297 | "" 298 | ] 299 | }, 300 | "metadata": {}, 301 | "output_type": "display_data" 302 | } 303 | ], 304 | "source": [ 305 | "def show_corr(columnName, xlabel, ylabel):\n", 306 | " model = LinearRegression()\n", 307 | " column = df_cocomo81[columnName].values.reshape(-1,1)\n", 308 | " model.fit(column, df_cocomo81['actual'])\n", 309 | " predictions = model.predict(column)\n", 310 | " plt.plot(column, predictions, color='red', linewidth=1)\n", 311 | " plt.scatter(column, df_cocomo81['actual'], alpha=0.4, c=df_cocomo81['actual'])\n", 312 | " plt.xlabel(xlabel)\n", 313 | " plt.ylabel(ylabel)\n", 314 | " plt.show()\n", 315 | " \n", 316 | "show_corr('pcap',\"Programmer Capability\",'Effort')\n", 317 | "show_corr('time',\"Time Constraint for CPU\",'Effort')\n", 318 | "show_corr('cplx',\"Process Complexity\",'Effort')" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": null, 324 | "metadata": {}, 325 | "outputs": [], 326 | "source": [] 327 | } 328 | ], 329 | "metadata": { 330 | "kernelspec": { 331 | "display_name": "Python 3", 332 | "language": "python", 333 | "name": "python3" 334 | }, 335 | "language_info": { 336 | "codemirror_mode": { 337 | "name": "ipython", 338 | "version": 3 339 | }, 340 | "file_extension": ".py", 341 | "mimetype": "text/x-python", 342 | "name": "python", 343 | "nbconvert_exporter": "python", 344 | "pygments_lexer": "ipython3", 345 | "version": "3.6.2" 346 | } 347 | }, 348 | "nbformat": 4, 349 | "nbformat_minor": 2 350 | } 351 | -------------------------------------------------------------------------------- /Notebooks/__pycache__/visuals.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniesteves/sw-effort-predictive-analysis/f857d3844335891ebc3031b21c904981cbc7984c/Notebooks/__pycache__/visuals.cpython-36.pyc -------------------------------------------------------------------------------- /Presentation/Presentation - A predictive analysis approach using linear regression to estimate software effort.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniesteves/sw-effort-predictive-analysis/f857d3844335891ebc3031b21c904981cbc7984c/Presentation/Presentation - A predictive analysis approach using linear regression to estimate software effort.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ### This is a PROMISE Software Engineering Repository data set made publicly available in order to encourage repeatable, verifiable, refutable, and/or improvable predictive models of software engineering. 3 | 4 | If you publish material based on PROMISE data sets then, please 5 | follow the acknowledgment guidelines posted on the PROMISE repository 6 | web page http://promise.site.uottawa.ca/SERepository . 7 | 8 | ## _Abstract_ 9 | 10 | _Making decisions with a highly uncertain level is a critical problem 11 | in the area of software engineering. Predicting software quality requires high 12 | accurate tools and high-level experience. Otherwise, AI-based predictive models 13 | could be a useful tool with an accurate degree that helps on the prediction 14 | of software effort based on historical data from software development metrics. 15 | In this study, we built a software effort estimation model to predict this effort 16 | using a linear regression model. This statistical model was developed using a 17 | non-parametric linear regression algorithm based on the K-Nearest Neighbours 18 | (KNN). So, our results show the possibility of using AI methods to predict the 19 | software engineering effort prediction problem with an coefficient of determination 20 | of 76%_ 21 | 22 | 23 | ```python 24 | import math 25 | from scipy.io import arff 26 | from scipy.stats.stats import pearsonr 27 | import pandas as pd 28 | import numpy as np 29 | 30 | from sklearn.linear_model import LinearRegression 31 | from sklearn.neighbors import KNeighborsRegressor 32 | from sklearn.model_selection import GridSearchCV 33 | from sklearn.svm import SVR 34 | from sklearn.model_selection import train_test_split 35 | 36 | # Formatação mais bonita para os notebooks 37 | import seaborn as sns 38 | import matplotlib.pyplot as plt 39 | 40 | %matplotlib inline 41 | plt.style.use('fivethirtyeight') 42 | plt.rcParams['figure.figsize'] = (15,5) 43 | 44 | ``` 45 | 46 | 47 | ```python 48 | df_desharnais = pd.read_csv('../Datasets/02.desharnais.csv', header=0) 49 | df_desharnais.head() 50 | ``` 51 | 52 | 53 | 54 | 55 |
56 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 |
idProjectTeamExpManagerExpYearEndLengthEffortTransactionsEntitiesPointsNonAdjustAdjustmentPointsAjustLanguage
011148512515225352305343021
122008645635197124321333151
23344851805406010018831
344008653829200119319303031
45500864214914094234242081
171 |
172 | 173 | 174 | 175 | 176 | ```python 177 | df_desharnais.info() 178 | ``` 179 | 180 | 181 | RangeIndex: 81 entries, 0 to 80 182 | Data columns (total 13 columns): 183 | id 81 non-null int64 184 | Project 81 non-null int64 185 | TeamExp 81 non-null int64 186 | ManagerExp 81 non-null int64 187 | YearEnd 81 non-null int64 188 | Length 81 non-null int64 189 | Effort 81 non-null int64 190 | Transactions 81 non-null int64 191 | Entities 81 non-null int64 192 | PointsNonAdjust 81 non-null int64 193 | Adjustment 81 non-null int64 194 | PointsAjust 81 non-null int64 195 | Language 81 non-null int64 196 | dtypes: int64(13) 197 | memory usage: 8.3 KB 198 | 199 | 200 | 201 | ```python 202 | df_desharnais.describe() 203 | ``` 204 | 205 | 206 | 207 | 208 |
209 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 |
idProjectTeamExpManagerExpYearEndLengthEffortTransactionsEntitiesPointsNonAdjustAdjustmentPointsAjustLanguage
count81.00000081.00000081.00000081.00000081.00000081.00000081.00000081.00000081.00000081.00000081.00000081.00000081.000000
mean41.00000041.0000002.1851852.53086485.74074111.6666675046.308642182.123457122.333333304.45679027.629630289.2345681.555556
std23.52658123.5265811.4151951.6438251.2224757.4246214418.767228144.03509884.882124180.21015910.591795185.7610880.707107
min1.0000001.000000-1.000000-1.00000082.0000001.000000546.0000009.0000007.00000073.0000005.00000062.0000001.000000
25%21.00000021.0000001.0000001.00000085.0000006.0000002352.00000088.00000057.000000176.00000020.000000152.0000001.000000
50%41.00000041.0000002.0000003.00000086.00000010.0000003647.000000140.00000099.000000266.00000028.000000255.0000001.000000
75%61.00000061.0000004.0000004.00000087.00000014.0000005922.000000224.000000169.000000384.00000035.000000351.0000002.000000
max81.00000081.0000004.0000007.00000088.00000039.00000023940.000000886.000000387.0000001127.00000052.0000001116.0000003.000000
372 |
373 | 374 | 375 | 376 | ## Applying Pearson’s correlation 377 | 378 | In this section, the correlations between attributes of Desharnais dataset and software effort are analyzed and applicability of the regression analysis is examined. The correlation between two variables is a measure of how well the variables are related. The most common measure of correlation in statistics is the Pearson Correlation (or the Pearson Product Moment Correlation - PPMC) which shows the linear relationship between two variables. 379 | 380 | Pearson correlation coefficient analysis produces a result between `-1` and `1`. A result of `-1` means that there is a perfect negative correlation between the two values at all, while a result of `1` means that there is a perfect positive correlation between the two variables. 381 | 382 | Results between `0.5` and `1.0` indicate high correlation.Correlation coefficients are used in statistics to measure how strong a relationship is between two variables. There are several types of correlation coefficient. `Pearson’s correlation` (also called Pearson’s R) is a correlation coefficient commonly used in linear regression. 383 | 384 | 385 | ```python 386 | df_desharnais.corr() 387 | ``` 388 | 389 | 390 | 391 | 392 |
393 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 |
idProjectTeamExpManagerExpYearEndLengthEffortTransactionsEntitiesPointsNonAdjustAdjustmentPointsAjustLanguage
id1.0000001.000000-0.0060070.2142940.0964860.2551870.1261530.2658910.0287870.226076-0.2077740.2026080.391475
Project1.0000001.000000-0.0060070.2142940.0964860.2551870.1261530.2658910.0287870.226076-0.2077740.2026080.391475
TeamExp-0.006007-0.0060071.0000000.424687-0.2103350.1439480.1195290.1037680.2566080.2038050.2356290.222884-0.079112
ManagerExp0.2142940.2142940.4246871.000000-0.0115190.2113240.1583030.1381460.2066440.207748-0.0668210.1873990.205521
YearEnd0.0964860.096486-0.210335-0.0115191.000000-0.095027-0.0483670.0343310.0016860.028234-0.0567430.0121060.342233
Length0.2551870.2551870.1439480.211324-0.0950271.0000000.6932800.6207110.4835040.7238490.2660860.714092-0.023810
Effort0.1261530.1261530.1195290.158303-0.0483670.6932801.0000000.5818810.5103280.7054490.4638650.738271-0.261942
Transactions0.2658910.2658910.1037680.1381460.0343310.6207110.5818811.0000000.1850410.8864190.3419060.8809230.136778
Entities0.0287870.0287870.2566080.2066440.0016860.4835040.5103280.1850411.0000000.6189130.2347470.598401-0.056439
PointsNonAdjust0.2260760.2260760.2038050.2077480.0282340.7238490.7054490.8864190.6189131.0000000.3838420.9859450.082737
Adjustment-0.207774-0.2077740.235629-0.066821-0.0567430.2660860.4638650.3419060.2347470.3838421.0000000.513197-0.199167
PointsAjust0.2026080.2026080.2228840.1873990.0121060.7140920.7382710.8809230.5984010.9859450.5131971.0000000.046672
Language0.3914750.391475-0.0791120.2055210.342233-0.023810-0.2619420.136778-0.0564390.082737-0.1991670.0466721.000000
636 |
637 | 638 | 639 | 640 | 641 | ```python 642 | colormap = plt.cm.viridis 643 | plt.figure(figsize=(10,10)) 644 | plt.title('Pearson Correlation of Features', y=1.05, size=15) 645 | sns.set(font_scale=1.05) 646 | sns.heatmap(df_desharnais.drop(['id'], axis=1).astype(float).corr(),linewidths=0.1,vmax=1.0, square=True,cmap=colormap, linecolor='white', annot=True) 647 | ``` 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | ![png](output_10_1.png) 658 | 659 | 660 | ## Split train/test data 661 | 662 | 663 | ```python 664 | features = [ 'TeamExp', 'ManagerExp', 'YearEnd', 'Length', 'Transactions', 'Entities', 665 | 'PointsNonAdjust', 'Adjustment', 'PointsAjust'] 666 | 667 | max_corr_features = ['Length', 'Transactions', 'Entities','PointsNonAdjust','PointsAjust'] 668 | 669 | X = df_desharnais[max_corr_features] 670 | y = df_desharnais['Effort'] 671 | ``` 672 | 673 | ## Models Costruction 674 | 675 | In this study the following algorithms were used: Linear Regression and K-Nearest Neighbors 676 | Regression. The training of the regressors models were performed on 67% of the 677 | instances 678 | 679 | ## 1) Knn Regression 680 | 681 | The K-Nearest Neighbor Regression is a simple algorithm that stores all 682 | available cases and predict the numerical target based on a similarity measure and it’s 683 | been used in a statistical estimation and pattern recognition as non-parametric technique 684 | classifying correctly unknown cases calculating euclidean distance between data points. 685 | In fact our choice by K-Nearest Neighbor Regression was motivated by the absence 686 | of a detailed explanation about how effort attribute value is calculated on Desharnais 687 | dataset. In the K-Nearest Neighbor Regression we choose to specify only 3 neighbors 688 | for k-neighbors queries and uniform weights, that means all points in each neighborhood 689 | are weighted equally. 690 | 691 | 692 | ```python 693 | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=30) 694 | 695 | neigh = KNeighborsRegressor(n_neighbors=3, weights='uniform') 696 | neigh.fit(X_train, y_train) 697 | print(neigh.score(X_test, y_test)) 698 | ``` 699 | 700 | 0.7379861869550943 701 | 702 | 703 | ## 2) Linear Regression 704 | 705 | 706 | The regression analysis aims to verify the existence of a functional relationship 707 | between a variable with one or more variables, obtaining an equation that explains the 708 | variation of the dependent variable Y, by the variation of the levels of the independent 709 | variables. The training of the Linear Regression model consists of generating a regression 710 | for the target variable Y. 711 | 712 | 713 | ```python 714 | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=22) 715 | 716 | model = LinearRegression() 717 | model.fit(X_train, y_train) 718 | print(model.score(X_test, y_test)) 719 | ``` 720 | 721 | 0.7680074954440712 722 | 723 | 724 | ## 3) Support Vector Machine 725 | 726 | 727 | 728 | ```python 729 | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=22) 730 | 731 | parameters = {'kernel':('linear', 'rbf'), 'C':[1,2,3,4,5,6,7,8,9,10]} 732 | 733 | svr = SVR() 734 | LinearSVC = GridSearchCV(svr, parameters) 735 | LinearSVC.fit(X_train, y_train) 736 | print("Best params hash: {}".format(LinearSVC.best_params_)) 737 | print(LinearSVC.score(X_test, y_test)) 738 | ``` 739 | 740 | Best params hash: {'C': 1, 'kernel': 'linear'} 741 | 0.735919788126071 742 | 743 | 744 | ## Results 745 | 746 | The figure shows the linear model (blue line) prediction is fairly close to Knn model effort prediction (red line), predicting the numerical target based on a similarity measure. 747 | According to the plot we observe that Linear Regression model (blue line) presents a better performance. Although Knn Regression model (red line) is fairly close to data points, the Linear Regression model shows a smaller mean squared error. It is possible to observe that the lines of both models present a slight tendency to rise, which justifies their correlation with the increase in effort. Some metrics are also highlighted by the presence of outliers. 748 | 749 | 750 | ```python 751 | 752 | plt.figure(figsize=(18,6)) 753 | plt.rcParams['legend.fontsize'] = 18 754 | plt.rcParams['legend.loc']= 'upper left' 755 | plt.rcParams['axes.labelsize']= 32 756 | 757 | for i, feature in enumerate(max_corr_features): 758 | 759 | # Knn Regression Model 760 | xs, ys = zip(*sorted(zip(X_test[feature], neigh.fit(X_train, y_train).predict(X_test)))) 761 | 762 | # Linear Regression Model 763 | model_xs, model_ys = zip(*sorted(zip(X_test[feature], model.fit(X_train, y_train).predict(X_test)))) 764 | 765 | # Support Vector Machine 766 | svc_model_xs, svc_model_ys = zip(*sorted(zip(X_test[feature], LinearSVC.fit(X_train, y_train).predict(X_test)))) 767 | 768 | plt.scatter(X_test[feature], y_test, label='Real data', lw=2,alpha= 0.7, c='k' ) 769 | plt.plot(model_xs, model_ys , lw=2, label='Linear Regression Model', c='cornflowerblue') 770 | plt.plot(xs, ys , lw=2,label='K Nearest Neighbors (k=3)', c='yellowgreen') 771 | plt.plot(svc_model_xs, svc_model_ys , lw=2,label='Support Vector Machine (Kernel=Linear)', c='gold') 772 | 773 | plt.xlabel(feature) 774 | plt.ylabel('Effort') 775 | plt.legend() 776 | plt.show() 777 | ``` 778 | 779 | 780 | ![png](output_25_0.png) 781 | 782 | 783 | 784 | ![png](output_25_1.png) 785 | 786 | 787 | 788 | ![png](output_25_2.png) 789 | 790 | 791 | 792 | ![png](output_25_3.png) 793 | 794 | 795 | 796 | ![png](output_25_4.png) 797 | 798 | -------------------------------------------------------------------------------- /output_10_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniesteves/sw-effort-predictive-analysis/f857d3844335891ebc3031b21c904981cbc7984c/output_10_1.png -------------------------------------------------------------------------------- /output_25_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniesteves/sw-effort-predictive-analysis/f857d3844335891ebc3031b21c904981cbc7984c/output_25_0.png -------------------------------------------------------------------------------- /output_25_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniesteves/sw-effort-predictive-analysis/f857d3844335891ebc3031b21c904981cbc7984c/output_25_1.png -------------------------------------------------------------------------------- /output_25_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniesteves/sw-effort-predictive-analysis/f857d3844335891ebc3031b21c904981cbc7984c/output_25_2.png -------------------------------------------------------------------------------- /output_25_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniesteves/sw-effort-predictive-analysis/f857d3844335891ebc3031b21c904981cbc7984c/output_25_3.png -------------------------------------------------------------------------------- /output_25_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniesteves/sw-effort-predictive-analysis/f857d3844335891ebc3031b21c904981cbc7984c/output_25_4.png --------------------------------------------------------------------------------