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

Python으로 데이터프레임 그룹별 공분산 계산하기 – groupby와 cov 활용법

데이터프레임이 주어졌을 때, 특정 열을 기준으로 데이터를 그룹화한 뒤 각 그룹의 공분산 행렬을 구하고, 나아가 두 개의 열 사이의 공분산만 따로 계산해야 하는 경우가 자주 있습니다. 이 글에서는 pandas의 groupbycov 함수를 활용해 이를 손쉽게 처리하는 방법을 알아보겠습니다.

예를 들어 다음과 같은 결과를 얻는 것이 목표입니다.

그룹별 공분산 행렬:
                     mark1        mark2
subjects
maths    mark1       25.0     12.500000
         mark2       12.5    108.333333
science  mark1       28.0     50.000000
         mark2       50.0    233.333333

두 열(mark1, mark2) 사이의 그룹별 공분산:
subjects
maths      12.5
science    50.0
dtype: float64

해결 방법

다음 단계를 순서대로 따라가면 문제를 해결할 수 있습니다.

  • 먼저 데이터프레임을 정의합니다.

  • subjects 열을 기준으로 groupby 함수를 적용합니다.

df.groupby('subjects')
  • 그룹화된 데이터에 공분산 함수를 적용한 뒤, 결과를 변수에 저장합니다.

group_data = df.groupby('subjects').cov()
  • lambda 함수를 사용해 mark1mark2 두 열 사이의 공분산만 추출합니다.

df.groupby('subjects').apply(lambda x: x['mark1'].cov(x['mark2']))

전체 예제 코드

아래 코드를 실행하면 전체 과정을 한눈에 확인할 수 있습니다.

import pandas as pd

df = pd.DataFrame({'subjects':['maths','maths','maths','science','science','science'],
                   'mark1':[80,90,85,95,93,85],
                   'mark2':[85,90,70,75,95,65]})
print("DataFrame is:\n", df)

# subjects 열 기준으로 그룹화한 뒤 공분산 행렬 계산
group_data = df.groupby('subjects').cov()
print("Grouped data covariance is:\n", group_data)

# mark1과 mark2 두 열 사이의 공분산만 계산
result = df.groupby('subjects').apply(lambda x: x['mark1'].cov(x['mark2']))
print("Grouped data covariance between two columns:\n", result)

실행 결과

DataFrame is:
    subjects  mark1  mark2
0     maths     80     85
1     maths     90     90
2     maths     85     70
3   science     95     75
4   science     93     95
5   science     85     65

Grouped data covariance is:
                mark1        mark2
subjects
maths    mark1   25.0     12.500000
         mark2   12.5    108.333333
science  mark1   28.0     50.000000
         mark2   50.0    233.333333

Grouped data covariance between two columns:
subjects
maths      12.5
science    50.0
dtype: float64

정리

df.groupby('열이름').cov()를 호출하면 그룹별로 모든 수치형 열 조합의 공분산 행렬이 한 번에 계산됩니다. 반면 두 특정 열 사이의 공분산만 필요하다면 applylambda를 조합해 원하는 값만 깔끔하게 추출할 수 있습니다. 이 패턴은 시험 점수, 매출 데이터 등 그룹 단위로 변수 간 관계를 분석할 때 매우 유용하게 활용됩니다.