Search

그룹핑하기(GROUP BY)

groupby

가장 기본적인 분석에 사용되는 함수다. 자유자재로 활용할 줄 알아야 나중에 복잡한 분석도 용이해진다.

기본 사용

apply 함수
apply 함수를 이용해서 그룹별 다양한 연산을 수행할 수 있다.
grouped.apply(사용자정의함수)
Python
복사
1) 범주형 변수를 기준으로 어떤 수치형 변수의 통계값을 확인해보고 싶을 경우
agg([’함수1 ’ , ’함수2’, …]) : 하나 이상의 통계값을 내고 싶을 경우, agg()로 사용할 함수들을 감싸준다.
# ex1) # 수입(연속형)과 대출(0,1) 사이의 관계 집계하기 -> 즉, 대출여부에 따른 평균 수입 확인해보기 df1 = bk1.groupby('loan')['income'].agg([np.mean,'count'])
Python
복사
loan
Income Mean
Number of People
0
66.23738938053097
4520
1
144.74583333333334
480
2) 범주형 변수와 범주형 변수의 집계 확인해보기
# ex2) # 가족 인원수(범주형)와 대출(범주형) 사이의 관계 집계하기 df3 = bk1.('fam')['loan'].agg([np.mean,'count']) # 가족 구성원 수에 따른 대출 여부의 평균값 확인해보기 df3.rename(columns={'mean': 'Personal Loan Mean','count':'Number of People'}) # 와 가족 구성원 수에 따른 사용자수
Python
복사
3) unstack(0)
unstack() 함수를 사용하면 결과를 보기 편하게 펼쳐서 보여준다.
# 지역별로 나눈 뒤, 방의 타입별 개수를 세준다. # unstack() 을 첫번째 인덱스 neighbour_group 에 적용해서 펼쳐준다. df.groupby(['neighbourhood_group'])['room_type'].value_counts().unstack(0)
Python
복사
4) sort_values(by=’기준 컬럼’)
sort_values() 함수를 이용해서 정렬을 수행할 수 있다.
size() 와 count() 의 차이
겉으로 보기에는 비슷해보이지만, count()는 NaN 값을 무시하여 계산하고, size() 는 NaN을 포함하여 계산한다.
size() 를 좀 더 정확하게 해석하면, 호출된 객체의 크기나 길이를 반환한다고 보면 된다.
한가지 더! count() 는 함수지만, size() 는 데이터프레임의 속성이다.
더 나아가서 호출할 때 생성되는 출력 구조에도 차이가 있다.
df.groupby().size() 는 기본적으로 Series 타입으로 반환되고, df.groupby().count() 는 dataframe 타입으로 반환된다.
그 이유는, size() 는 기준 컬럼의 데이터에 따른 크기 또는 길이를 출력하기 때문에, 각 열마다 집계될 개수가 같아서 굳이 데이터프레임으로 출력될 필요가 없기 때문이다.
반대로, count() 는 각 컬럼에 따라 NaN의 개수가 다르면 집계될 개수도 달라지기 때문에 데이터프레임으로 반환되는 것이다.

pivot, pivot_table

데이터프레임에서 두 개의 열을 이용하여 행/열 인덱스 reshape 된 테이블을 의미한다.
새로운 테이블에서 새로운 기준으로 집계한다.
다음의 두 가지 방식으로 피벗테이블을 형성할 수 있다.
1.
pivot(index, columns, values) : groupby 가 필요하다
2.
pd.pivot_table(data, values, index, columns, aggfunc = ‘mean(함수)’) : groupby 없이 가능
or
df.pivot_table(values(칼럼), index, columns, aggfunc = ‘mean(함수)’)

concat

두개이상의 범주형 변수를 비교 분석할 때 쓰이는 교차 분석표다.
pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)
Python
복사
필수 input
index : 행으로 그룹할 값(array, series, list)
columns : 열로 그룹할 값(array, series, list)
선택 input
rownames : 행 이름
colnames : 열 이름
values : 두 행/열에 따라 집계할 값. 반드시 aggfunc 와 함께 사용
aggfunc : 집계함수
margins : True 로 지정 시 행/열의 소계값이 함께 산출
margins_name : margins=True 인 경우, 행/열의 소계를 뽑을 행/열을 지정(default=’all’)
dropna : NaN을 포함하지 않고 반환 (default=True)
normalize : 개수가 아닌 비율로 표시. 옵션은 총 3가지
index : 행을 기준으로 비율 표시(각 행의 합 = 100%)
columns : 열을 기준으로 비율 표시(각 열의 합 = 100%)
all : 전체 기준으로 비율 표시(각 데이터들의 합 = 100%)