문제
오름차순으로 정렬된 숫자 배열을 인수로 받아, 해당 배열의 분산(variance)을 계산하는 JavaScript 함수를 작성해야 합니다.
분산은 숫자 집합이 평균으로부터 얼마나 흩어져 있는지를 나타내는 통계적 척도입니다. 각 데이터 값과 평균 사이의 차이(편차)를 제곱한 뒤, 그 값들을 모두 더하고 데이터 개수로 나누어 구합니다.
먼저 평균(M)은 다음과 같이 계산합니다.
$Mean (M) = ( \sum_{i=0}^{n-1} arr[i])$ / n
그리고 분산(V)은 다음 공식으로 구합니다.
$Variance (V) = $(\sum_{i=0}^{n-1} (arr[i] - M)^2)$ / n
예시 코드
다음은 위 공식을 JavaScript로 구현한 코드입니다.
const arr = [4, 6, 7, 8, 9, 10, 10];
const findVariance = (arr = []) => {
if(!arr.length){
return 0;
};
const sum = arr.reduce((acc, val) => acc + val);
const { length: num } = arr;
const median = sum / num;
let variance = 0;
arr.forEach(num => {
variance += ((num - median) * (num - median));
});
variance /= num;
return variance;
};
console.log(findVariance(arr))
출력 결과
4.204081632653061
코드 동작 원리
위 코드의 실행 과정을 단계별로 살펴보면 다음과 같습니다.
1단계 — 빈 배열 처리: 배열이 비어 있으면 분산을 계산할 수 없으므로 0을 반환하여 오류를 방지합니다.
2단계 — 합계 및 평균 계산: reduce() 메서드로 배열 요소의 총합을 구한 뒤, 요소 개수로 나누어 평균(median 변수)을 계산합니다.
3단계 — 편차 제곱의 합: forEach()로 각 요소를 순회하면서 (요소값 − 평균)² 을 누적합니다.
4단계 — 분산 산출: 누적된 편차 제곱의 합을 요소 개수로 나누어 최종 분산 값을 반환합니다.
참고: 모분산과 표본분산
위 코드는 전체 데이터를 대상으로 하는 모분산(population variance) 방식으로, 편차 제곱의 합을 n으로 나눕니다. 반면 표본 데이터의 분산(표본분산, sample variance)을 구하려면 불편 보정을 위해 n이 아닌 (n - 1)로 나누어야 합니다. 필요에 따라 마지막 줄을 variance /= num - 1;로 수정하면 됩니다.