С Новым Годом, дорогие друзья! Сегодня я расскажу о методе для оценки времени выполнения сложной задачи (состоящей из нескольких подзадач). Его можно использовать для предварительной оценки проектных задач или при планировании спринтов в SCRUM.
Итак, пусть задача T разбита на подзадачи T1, T2, ... Tn и требуется получить интервал, в который с заданной вероятностью α попадет общее время, затраченное на выполнение задачи T (т.е. сформулировать оценку вида: на выполнение этой задачи уйдет от 85 до 110 часов с вероятностью 95%). Пусть каждую задачу оценивают несколько (для данного метода требуется не менее 2) экспертов (вспомним, например planning poker в SCRUM). Чтобы получить итоговую оценку, делаем следующее:
1) Для каждой задачи Tk подсчитываем среднее значение:
Ek = (ek1 + ek2 + ... + ekm)/mk
и несмещенную дисперсию:
sk = ((ek1 - Ek)2 + (ek2 - Ek)2 + ... + (ekm - Ek)2)/(mk - 1)
Где ek1, ek2, ... ekm - оценки подзадачи Tk, полученные от разных экспертов, а mk - количество экспертов, оценивших эту подзадачу
2) Для итоговой задачи считаем:
cреднее значение: E = E1 + E2 + ... + En
дисперсию: s = s1 + s2 + ... + sn
и стандартное отклонение: σ = s1/2
3) Согласно центральной предельной теореме распределение времени выполнения задачи при больших n приближается нормальным распределением со средним E и стандартным отклонением σ.
Поэтому в качестве оценки для времени выполнения задачи T с вероятностью α можно взять интервал (E - U(1+α)/2*σ, E + U(1+α)/2*σ), где U(1+α)/2 это (1+α)/2 - квантиль стандартного нормального распределения. В частности для 95% вероятности, т.е α = 0.95: U0.975 ≈ 1.959963985.
Значения квантилей нормального распределения можно опредедить по таблицам, часто прилагающимся к учебникам по теории вероятностей и математической статистике или воспользоваться Excel-функцией NORM.INV, т.е U(1+α)/2 в Excel записывается как =NORM.INV((1+α)/2,0,1)
Пример: Требуется оценить объем работ в человеко-часах сложной задачи, которая состоит из 14 подзадач. Оценить подзадачи дали 4 программистам и получили следующие оценки в часах:
Пропуски значений означают отсутствие оценки - вполне обычная ситуация, когда человек слабо знаком с предметной областью и не может сказать, сколько времени займет сделать подзадачу.
Расчеты:
Для первой подзадачи:
среднее: E1 = (2 + 3 + 5 + 2)/4 = 3
дисперсия: s1 = ((2 - 3)2 + (3 - 3)2 + (5 - 3)2 + (2 - 3)2)/(4 - 1) = 2
Для второй подзадачи:
среднее: E2 = (3 + 4 + 3)/3 = 3.333333333
дисперсия: s2 = ((3 - 3.333333333)2 + (4 - 3.333333333)2 + (3 - 3.333333333)2)/(3 - 1) = 0.333333333
Аналогично для последующих подзадач. Итоговая таблица со значениями средних и дисперсий для каждой подзадачи, а также средним и дисперсией для всей задачи:
Среднеквадратичное отклонение для всей задачи: σ = 44.666666671/2 = 6.683312552
Интервал для объема работ:
от E - U(1+α)/2*σ = 68.5 - 6.683312552*1.959963985 = 55.4009481 до E + U(1+α)/2*σ = 68.5 + 6.683312552*1.959963985 = 81.5990519
Таким образом, можно с 95% вероятностью утверждать, что затраты времени на задачу составляют от 55.4 до 81.6 человеко-часов.
P.S. Для удобства конечно лучше автоматизировать подобные вычисления. Поэтому я создал простой Excel-документ, в котором проводил все эти расчеты. Можно скачать отсюда. Поддерживается до 10 оценок каждой подзадачи (столбцы от F до K, которые я скрыл для удобства демонстрации примера выше) и до 30 подзадач (просто копируем формулы, если нужно больше). Можно изменять степень доверия (столбец Confidence). Границы интервала автоматически пересчитываются при добавлении задач и оценок.
Итак, пусть задача T разбита на подзадачи T1, T2, ... Tn и требуется получить интервал, в который с заданной вероятностью α попадет общее время, затраченное на выполнение задачи T (т.е. сформулировать оценку вида: на выполнение этой задачи уйдет от 85 до 110 часов с вероятностью 95%). Пусть каждую задачу оценивают несколько (для данного метода требуется не менее 2) экспертов (вспомним, например planning poker в SCRUM). Чтобы получить итоговую оценку, делаем следующее:
1) Для каждой задачи Tk подсчитываем среднее значение:
Ek = (ek1 + ek2 + ... + ekm)/mk
и несмещенную дисперсию:
sk = ((ek1 - Ek)2 + (ek2 - Ek)2 + ... + (ekm - Ek)2)/(mk - 1)
Где ek1, ek2, ... ekm - оценки подзадачи Tk, полученные от разных экспертов, а mk - количество экспертов, оценивших эту подзадачу
2) Для итоговой задачи считаем:
cреднее значение: E = E1 + E2 + ... + En
дисперсию: s = s1 + s2 + ... + sn
и стандартное отклонение: σ = s1/2
3) Согласно центральной предельной теореме распределение времени выполнения задачи при больших n приближается нормальным распределением со средним E и стандартным отклонением σ.
Поэтому в качестве оценки для времени выполнения задачи T с вероятностью α можно взять интервал (E - U(1+α)/2*σ, E + U(1+α)/2*σ), где U(1+α)/2 это (1+α)/2 - квантиль стандартного нормального распределения. В частности для 95% вероятности, т.е α = 0.95: U0.975 ≈ 1.959963985.
Значения квантилей нормального распределения можно опредедить по таблицам, часто прилагающимся к учебникам по теории вероятностей и математической статистике или воспользоваться Excel-функцией NORM.INV, т.е U(1+α)/2 в Excel записывается как =NORM.INV((1+α)/2,0,1)
Пример: Требуется оценить объем работ в человеко-часах сложной задачи, которая состоит из 14 подзадач. Оценить подзадачи дали 4 программистам и получили следующие оценки в часах:
№ подзадачи | Программист 1 | Программист 2 | Программист 3 | Программист 4 |
1 | 2 | 3 | 5 | 2 |
2 | 3 | 4 | 3 | |
3 | 5 | 8 | 4 | 6 |
4 | 5 | 3 | 4 | 6 |
5 | 5 | 3 | 3 | 6 |
6 | 8 | 12 | 16 | |
7 | 4 | 2 | 2 | 3 |
8 | 3 | 4 | 6 | |
9 | 6 | 8 | 6 | 12 |
10 | 5 | 3 | 6 | |
11 | 3 | 6 | 5 | |
12 | 2 | 3 | 5 | 4 |
13 | 6 | 4 | 5 | |
14 | 2 | 3 | 2 | 4 |
Пропуски значений означают отсутствие оценки - вполне обычная ситуация, когда человек слабо знаком с предметной областью и не может сказать, сколько времени займет сделать подзадачу.
Расчеты:
Для первой подзадачи:
среднее: E1 = (2 + 3 + 5 + 2)/4 = 3
дисперсия: s1 = ((2 - 3)2 + (3 - 3)2 + (5 - 3)2 + (2 - 3)2)/(4 - 1) = 2
Для второй подзадачи:
среднее: E2 = (3 + 4 + 3)/3 = 3.333333333
дисперсия: s2 = ((3 - 3.333333333)2 + (4 - 3.333333333)2 + (3 - 3.333333333)2)/(3 - 1) = 0.333333333
Аналогично для последующих подзадач. Итоговая таблица со значениями средних и дисперсий для каждой подзадачи, а также средним и дисперсией для всей задачи:
1 | 2 | 3 | 5 | 2 | 3 | 2 |
2 | 3 | 4 | 3 | 3.333333333 | 0.333333333 | |
3 | 5 | 8 | 4 | 6 | 5.75 | 2.916666667 |
4 | 5 | 3 | 4 | 6 | 4.5 | 1.666666667 |
5 | 5 | 3 | 3 | 6 | 4.25 | 2.25 |
6 | 8 | 12 | 16 | 12 | 16 | |
7 | 4 | 2 | 2 | 3 | 2.75 | 0.916666667 |
8 | 3 | 4 | 6 | 4.333333333 | 2.333333333 | |
9 | 6 | 8 | 6 | 12 | 8 | 8 |
10 | 5 | 3 | 6 | 4.666666667 | 2.333333333 | |
11 | 3 | 6 | 5 | 4.666666667 | 2.333333333 | |
12 | 2 | 3 | 5 | 4 | 3.5 | 1.666666667 |
13 | 6 | 4 | 5 | 5 | 1 | |
14 | 2 | 3 | 2 | 4 | 2.75 | 0.916666667 |
Итого: | 68.5 | 44.66666667 |
Среднеквадратичное отклонение для всей задачи: σ = 44.666666671/2 = 6.683312552
Интервал для объема работ:
от E - U(1+α)/2*σ = 68.5 - 6.683312552*1.959963985 = 55.4009481 до E + U(1+α)/2*σ = 68.5 + 6.683312552*1.959963985 = 81.5990519
Таким образом, можно с 95% вероятностью утверждать, что затраты времени на задачу составляют от 55.4 до 81.6 человеко-часов.
P.S. Для удобства конечно лучше автоматизировать подобные вычисления. Поэтому я создал простой Excel-документ, в котором проводил все эти расчеты. Можно скачать отсюда. Поддерживается до 10 оценок каждой подзадачи (столбцы от F до K, которые я скрыл для удобства демонстрации примера выше) и до 30 подзадач (просто копируем формулы, если нужно больше). Можно изменять степень доверия (столбец Confidence). Границы интервала автоматически пересчитываются при добавлении задач и оценок.