개요
통계 분석에서는 두 개의 서로 다른 데이터 집합(시리즈)을 하나로 합쳤을 때의 평균과 분산을 구해야 하는 경우가 자주 발생합니다. 이 글에서는 Python을 사용하여 크기가 서로 다른 두 시리즈 A1과 A2가 주어졌을 때, 결합된 전체 시리즈의 평균과 분산을 계산하는 방법을 단계별로 살펴보겠습니다.
예를 들어 입력이 다음과 같다고 가정해 보겠습니다.
- A1 = [24, 46, 35, 79, 13, 77, 35] (크기 7)
- A2 = [66, 68, 35, 24, 46] (크기 5)
이때 기대되는 결과는 다음과 같습니다.
- 평균(mean): 44.1429, 47.8
- 분산(variance): 548.694, 294.56
- 결합 평균(combined mean): 45.6667
- d1² = 2.322, d2² = 4.5511
- 결합 분산(combined variance): 446.056
결합 분산 공식의 원리
두 시리즈를 하나로 합친 데이터의 분산은 단순히 각 분산의 산술 평균이 아닙니다. 각 그룹의 평균이 전체 평균에서 얼마나 떨어져 있는지, 즉 그룹 간 변동까지 함께 고려해야 정확한 값을 얻을 수 있습니다. 이를 반영한 결합 분산 공식은 다음과 같습니다.
comb_var = (n × (sd1 + d1²) + m × (sd2 + d2²)) / (n + m)
여기서 d1²과 d2²는 각 시리즈의 평균과 결합 평균 사이 차이의 제곱을 의미합니다.
문제 해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- mean() 함수 정의: 배열 arr을 인자로 받아 요소들의 평균값을 반환합니다.
- sd() 함수 정의: 배열 arr과 크기 n을 인자로 받습니다.
- sum을 0으로 초기화합니다.
- i가 0부터 n−1까지 반복하면서 sum에 (arr[i] − mean(arr))² 값을 누적합니다.
- sdd = sum / n을 계산하여 반환합니다.
- 메인 로직 수행:
- n := A1의 크기, m := A2의 크기를 구합니다.
- mean1 := mean(A1), mean2 := mean(A2)를 계산하고 출력합니다.
- sd1 := sd(A1, n), sd2 := sd(A2, m)를 계산하고 출력합니다.
- combinedMean := (n × mean1 + m × mean2) / (n + m)을 계산하고 출력합니다.
- d1_square := (mean1 − combinedMean)², d2_square := (mean2 − combinedMean)²를 계산하고 출력합니다.
- comb_var := (n × (sd1 + d1_square) + m × (sd2 + d2_square)) / (n + m)을 계산하고 출력합니다.
Python 구현 예제
아래 코드를 통해 실제 구현 과정을 더 잘 이해해 보겠습니다.
def mean(arr):
return sum(arr) / len(arr)
def sd(arr, n):
total = 0
for i in range(n):
total = total + ((arr[i] - mean(arr)) * (arr[i] - mean(arr)))
sdd = total / n
return sdd
def combinedVariance(A1, A2):
n = len(A1)
m = len(A2)
mean1 = mean(A1)
mean2 = mean(A2)
print("mean_1: ", round(mean1, 2), " mean_2: ", round(mean2, 2))
sd1 = sd(A1, n)
sd2 = sd(A2, m)
print("sd_1: ", round(sd1, 2), " sd_2: ", round(sd2, 2))
combinedMean = (n * mean1 + m * mean2) / (n + m)
print("Combined Mean: ", round(combinedMean, 2))
d1_square = ((mean1 - combinedMean) * (mean1 - combinedMean))
d2_square = ((mean2 - combinedMean) * (mean2 - combinedMean))
print("d1_square: ", round(d1_square, 2), " d2_square: ", round(d2_square, 2))
comb_var = (n * (sd1 + d1_square) + m * (sd2 + d2_square)) / (n + m)
print("Combined Variance: ", round(comb_var, 2))
A1 = [24, 46, 35, 79, 13, 77, 35]
A2 = [66, 68, 35, 24, 46]
combinedVariance(A1, A2)입력
[24, 46, 35, 79, 13, 77, 35], [66, 68, 35, 24, 46]
출력
mean_1: 44.14 mean_2: 47.8 sd_1: 548.69 sd_2: 294.56 Combined Mean: 45.67 d1_square: 2.32 d2_square: 4.55 Combined Variance: 446.06
정리
이처럼 각 시리즈의 평균과 분산을 먼저 구한 뒤, 결합 평균과 각 평균 간 차이의 제곱을 활용하면 두 데이터 집합이 합쳐졌을 때의 전체 분산을 정확하게 계산할 수 있습니다. 참고로 위의 sd() 함수는 편차 제곱을 n으로 나누는 모분산(population variance) 방식을 사용하며, 표본 분산을 원한다면 n 대신 n−1로 나누면 됩니다. 또한 NumPy의 np.mean(), np.var() 함수를 활용하면 동일한 결과를 더 간결하게 얻을 수 있으니, 실무에서는 상황에 맞게 선택하여 사용하시기 바랍니다.