데이터 분석/Python - pandas

[이론] 데이터 집계 (그룹화)

toraa 2025. 1. 9. 17:15

pandas를 사용하는 이유

  • 쉽고 직관적인 데이터 처리: 복잡한 데이터 작업을 간단한 명령으로 처리가능
  • 데이터 변환과 분석: 데이터 필터링이나, 새로운 열 추가, 통계 계산 등의 작업을 효율적으로 수행
  • 결측치 처리: 데이터셋에 포함된 결측치를 쉽게 제거하거나 채울 수 있음
  • 다양한 데이터 소스 지원: CSV, Excel, SQL 등 다양한 형식의 데이터를 읽고 쓸 수 있음
  • 시각화 라이브러리와 연계: matplotlib나 seaborn 같은 라이브러리와 결합해서 데이터를 시각화하기 좋음

 

pandas 집계 함수
size : 관측치 개수
count : 결측치를 제외한 관측치 개수
max: 최댓값
min: 최솟값
mean : 평균
median : 중앙값
sum : 총합
std : 표준편차
var : 분산
quantile: 샘플 분위수(% 값)
nunique: 고유항목수
idxmax: 최댓값 인덱스
agg: 여러개의 집계
 

1. 수치형 집계값 계산

수치형 타입 컬럼에서 간단한 함수를 통해 통계적 집계
무조건 컬럼을 기준으로 집계 진행된다고 생각하기

import pandas as pd
df_gp=pd.read_csv('data/lck_2024.csv')
div = df_gp[['리그승률', '서머승률']] / 100
df_gp[['리그승률', '서머승률']] = div.astype('int64')
df_gp

 
mean() 함수를 활용하여 특정 컬럼의 평균 계산

df_gm['데뷔년도'].mean()  #평균을 변수로 만약 두게되면, 나중에 다른 연산할때 활용가능

np.float64(2018.56)

 
sum()으로 합계 계산

df_gm[['월즈우승','리그우승']].sum()

월즈우승     22
lck우승    58
dtype: int64

 
idxmax()로 가장큰 값의 인덱스 출력

df_gm['월즈우승'].idxmax()

'Faker'

 
agg()로 여러개의 집계함수를 적용

df_gp['lck우승'].agg(['max','mean'])

max     10.00
mean     2.32
Name: lck우승, dtype: float64

▷ 각각의 집계함수에 대한 결과가 나옴
 
describe()함수 : 각 컬럼의 통계 표 생성
- 통계표 : 각컬럼의 count, mean,std, min, 25%, 50%, 75%, max
- 수치형 컬럼만 존재하는 데이터프레임이어야 함

df_gm[['월즈우승','lck우승']].describe()


2. groupby() 함수를 활용한 그룹별 집계

수치형과 범주형 데이터를 함께, 즉 특정 카테고리에서의 수치적 차이를 통해 특성과 관계 파악 가능
 
DataFramegroupby(범주형 컬럼)   [집계컬럼]   .mean()
 
- 그룹화 (Splitting) : 범주형으로 그룹화
- 적용 (Applying) : 집계 함수등 적용
- 결합 (Combining) : 적용 결과를 하나의 데이터프레임으로 반환
 
groupby(by='그룹화컬럼')['집계컬럼'].통계함수()

그룹화 : 그룹별 평균 게산

group = df_gm.groupby(by='팀')['lck우승'].sum()
group

팀
DK        3
Gen.G    14
HLE      16
KT        7
T1       18
Name: lck우승, dtype: int64

▷ 기본적으로 데이터프레임이 아닌, 시리즈로 나옴
▷ by인자에 입력된 그룹 컬럼은 그룹화 후에 인덱스로 설정
 
 
as_index 활용

group = df_gm.groupby('팀', as_index=False)['월즈우승'].sum()
group

as_index=False로 설정하면, 컬럼으로 설정되어 시리즈가 아닌 데이터프레임으로 반환
 
 
복수의 컬럼으로 집계

df_gm.groupby(by='팀')[['월즈우승', 'lck우승']].sum()

[ ] 연산에 리스트를 넣으면, 데이터프레임이 반환됨 ( by는 인덱스로 감)
 
 
여러 컬럼을 그룹화하여 평균 계산

df_gm.groupby(['팀', '포지션'])[['월즈우승','lck우승']].sum()


▷ 똑같이 리스트 형식으로 묶어서 넣어줌
▷ 집계가 두개로 이루어졌으니까, 데이터프레임으로 결과 반환
▷ multiindex : 인덱스가 두개인 형태
 
 
agg()를 활용하여 여러 집계를 한번에 보기

df_gm.groupby('팀', as_index=False)['lck우승'].agg(['min','max','mean'])


집계컬럼을 여러개로 설정 안하는 것이 좋음
→ 컬럼이 중첩되어 데이터프레임으로 활용하기 좋지 않음


3. pivot_table()을 활용하여 피벗테이블 생성

groupby는 그룹화된 결과가 관측치가 됨
pivot_table()는 컬럼까지 같이 그룹화를 시켜서 양축이 그룹화의 그룹으로서 표현되는 방식
범주형 컬럼이 기본적으로 두개 있어야함
 
그룹화시킬 컬럼이 두개 설정됨
그룹화 진행되면, 인덱스로 결과가 나열됨
두번째로 그룹화할 데이터는 컬럼축으로 나열됨 
집계할 컬럼을 하나를 선정해서, 그 집계값이 포인트에 들어가게끔 연산 진행됨
결과가 무조건 테이블형식으로 나타남


pivot_table() 활용

pivot = pd.pivot_table(
    df_gm,
    index='팀',  # index와 columns을 명확하게 설정
    columns='포지션',
    values='lck우승',  # 집계가 이루어질 columns 설정
    aggfunc='sum'  # 집계함수의 이름이나 함수이름 설정
)
pivot

pd.pivot_table : pandas모듈의 함수를 활용함
 
 
외부 통계함수 사용 가능
- 외부함수는 기본적으로 1차원짜리 배열이 들어감

import numpy as np

pivot = pd.pivot_table(df_gm, index='팀', 
                       columns='포지션',
                       values='lck우승', 
                       aggfunc=np.mean)  
                       #함수이름까지만 넣어줌(변수아님). 함수실행시킨것x (np.mean()이라고 쓰지 않기)
pivot


 
groupby의 다중 그룹화 : 값은 동일하게 생성됨

group = df_gm.groupby(['팀', '포지션'])[['월즈우승','lck우승']].sum()
group


4. corr()를 활용하여 컬럼간의 상관관계 파악

변수간의 유사율(관계) 파악 : 피어슨 상관계수로 표현
 
1에 가까울수록 비슷한 경향
-1에 가까울수록 반대 경향
0에 가까울수록 변수간 상관관계 적음

df_gm[['나이','월즈우승','lck우승','리그KDA','서머KDA']].corr()