데이터프레임이 주어졌을 때, 특정 열을 기준으로 데이터를 그룹화한 뒤 각 그룹의 공분산 행렬을 구하고, 나아가 두 개의 열 사이의 공분산만 따로 계산해야 하는 경우가 자주 있습니다. 이 글에서는 pandas의 groupby와 cov 함수를 활용해 이를 손쉽게 처리하는 방법을 알아보겠습니다.
예를 들어 다음과 같은 결과를 얻는 것이 목표입니다.
그룹별 공분산 행렬:
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함수를 사용해mark1과mark2두 열 사이의 공분산만 추출합니다.
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()를 호출하면 그룹별로 모든 수치형 열 조합의 공분산 행렬이 한 번에 계산됩니다. 반면 두 특정 열 사이의 공분산만 필요하다면 apply와 lambda를 조합해 원하는 값만 깔끔하게 추출할 수 있습니다. 이 패턴은 시험 점수, 매출 데이터 등 그룹 단위로 변수 간 관계를 분석할 때 매우 유용하게 활용됩니다.