데이터 집계
1. 집계 함수 (그룹화 집계 메소드)
- 그룹화된 데이터에서 다양한 통계량을 계산할 때 사용됨.
- 대표적인 집계 함수들은 아래와 같음.
| 메소드 | 설명 |
|---|
.sum() | 그룹별 합계 |
.mean() | 그룹별 평균 |
.median() | 그룹별 중앙값 |
.min() | 그룹별 최소값 |
.max() | 그룹별 최대값 |
.count() | 그룹별 개수 |
.std() | 그룹별 표준편차 |
.var() | 그룹별 분산 |
.first() | 그룹별 첫 번째 값 |
.last() | 그룹별 마지막 값 |
import pandas as pd
df = pd.DataFrame({'A': ['foo', 'foo', 'bar', 'bar'],
'B': [1, 2, 3, 4]})
grouped = df.groupby('A').sum()
print(grouped)
2. 사용자 정의 집계 함수
- 기본 제공 집계 함수 외에도 사용자가 직접 함수를 정의하여 적용 가능함.
agg() 또는 apply()를 활용하여 특정 연산 수행 가능함.
def custom_function(x):
return x.max() - x.min()
grouped = df.groupby('A')['B'].agg(custom_function)
print(grouped)
3. 비집계 함수
- 데이터 변환에 사용되는 함수로, 그룹별 특정 연산을 수행하지만 전체를 하나의 값으로 줄이지 않음.
.transform()을 사용하면 원래 데이터의 형태를 유지하면서 그룹별 연산을 적용 가능함.
df['B_normalized'] = df.groupby('A')['B'].transform(lambda x: (x - x.mean()) / x.std())
print(df)
4. 열별로 여러 함수 적용하기
- 여러 개의 집계 함수를 한 번에 적용할 수 있음.
df.groupby('A').agg({'B': ['sum', 'mean', 'std']})
5. apply() - 다목적 데이터 집계
- 그룹화 후 특정 연산을 수행하여 데이터 변환이 가능함.
df.groupby('A').apply(lambda x: x.sort_values('B', ascending=False))
6. 그룹키 제거
group_keys=False 옵션을 주면 그룹화된 데이터에서 키를 제거하고 원래 형태를 유지할 수 있음.
df.groupby('A', group_keys=False).apply(lambda x: x.head(1))
7. 분위와 구간 분석
qcut()을 사용하여 데이터를 분위수 기준으로 나눌 수 있음.
df['quantile'] = pd.qcut(df['B'], q=4)
print(df)
8. 그룹별 결측치 채우기
df.groupby('A').apply(lambda x: x.fillna(x.mean()))
9. 무작위 샘플링
sample()을 사용하여 그룹별 샘플을 선택할 수 있음.
df.groupby('A').apply(lambda x: x.sample(n=1))
10. 그룹별 가중치 합
- 특정 열을 가중치로 사용하여 그룹별 합계를 계산할 수 있음.
df.groupby('A').apply(lambda x: (x['B'] * x['B']).sum())
11. 그룹 단위 선형회귀
from sklearn.linear_model import LinearRegression
def lin_reg(df):
model = LinearRegression()
X = df[['B']]
y = df['B']
model.fit(X, y)
return model.coef_[0]
df.groupby('A').apply(lin_reg)
12. 그룹 변환
- 그룹별 연산을 수행하면서 결과의 크기를 원래 데이터와 동일하게 유지할 수 있음.
df.groupby('A')['B'].transform(lambda x: x - x.mean())
13. 피벗 테이블
- 피벗 테이블을 사용하여 특정 그룹별 통계를 계산할 수 있음.
pd.pivot_table(df, values='B', index='A', aggfunc='mean')
14. Cross-Tabulations: crosstab
- 교차 테이블을 사용하여 범주형 변수 간의 관계를 분석할 수 있음.
pd.crosstab(df['A'], df['B'])