Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 두 시리즈의 결합 평균과 분산 계산하기

개요

통계 분석에서는 두 개의 서로 다른 데이터 집합(시리즈)을 하나로 합쳤을 때의 평균과 분산을 구해야 하는 경우가 자주 발생합니다. 이 글에서는 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²는 각 시리즈의 평균과 결합 평균 사이 차이의 제곱을 의미합니다.

문제 해결 접근 방법

이 문제는 다음 단계를 따라 해결할 수 있습니다.

  1. mean() 함수 정의: 배열 arr을 인자로 받아 요소들의 평균값을 반환합니다.
  2. sd() 함수 정의: 배열 arr과 크기 n을 인자로 받습니다.
    • sum을 0으로 초기화합니다.
    • i가 0부터 n−1까지 반복하면서 sum에 (arr[i] − mean(arr))² 값을 누적합니다.
    • sdd = sum / n을 계산하여 반환합니다.
  3. 메인 로직 수행:
    • 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() 함수를 활용하면 동일한 결과를 더 간결하게 얻을 수 있으니, 실무에서는 상황에 맞게 선택하여 사용하시기 바랍니다.