Pandas 시리즈 객체의 원소 또는 데이터프레임 객체의 특정 변수의 원소의 개수를 세거나 원소 구성비를 알아보기 위해 .value_counts() 메서드를 사용할 수 있었다. ※ 관련 포스팅: Pandas(원소/조합 세기)
이제 2개 이상의 변수를 대상으로 .value_counts() 메서드와 같은 작업을 실시하고자 할 때 사용할 수 있는 Pandas 라이브러리의 함수는 crosstab() 이다. 이 함수는 (기본적으로) 두 변수의 각 원소가 같이 속해있는 행(row) 개수가 몇 개인지 반환해주며 .groupby() 또는 .pivot_table() 메서드와 같은 결과를 반환할 수도 있다.
“index”나 “columns” 인자에는 두 개 이상의 변수를 할당할 수 있는데 이 때 “df”객체의 각 변수(좀 더 정확하게 말하자면 시리즈 객체)를 리스트로 감싸서 할당해야 한다. 다음은 명목형 변수를 만들기 위해서 세션 시작 시각(timeStamp) 변수를 사용하여 “hour”변수를 새로 생성 후 crosstab() 함수를 사용한 결과는 다음과 같다.
이제 반환되는 객체의 원소를 정규화하는 방법에 대해 알아보자. 정규화를 위해서는 “normalize” 인자를 사용해야 하며 해당 인자에는 여러 종류의 값을 입력할 수 있는데 이에 대한 설명은 crosstab() 함수의 (도움말) 문서에서 찾을 수 있다.
normalize : bool, {‘all’, ‘index’, ‘columns’}, or {0,1}, default False Normalize by dividing all values by the sum of values.
- If passed 'all' or `True`, will normalize over all values.
- If passed 'index' will normalize over each row.
- If passed 'columns' will normalize over each column.
- If margins is `True`, will also normalize margin values.
해당 문서의 내용을 해석하자면 “normalize” 인자에 할당할 수 있는 원소는 True, False, “all”, “index”, “columns”, 0, 1 으로 총 7개 이며 기본값은 False로 되어있다는 것이다.
참고로 “all”과 True를 할당한 결과는 같고 “index”와 0, “columns”와 1의 쌍도 그 결과가 같다.
이렇게 행(row)방향으로 정규화가 실시된 것을 확인할 수 있으며 각 행에 있는 원소의 합은 1이다. 추가로 해석을 덧붙이자면 상기 결과는 성별(gender)에 따른 예약 비율(is_booking)을 산출한 것이며 여성(F)의 경우 약 33.3%, 남성(M)의 경우 40%가 예약을 한 것을 확인할 수 있다.
상기 내용 또한 해석을 덧붙이자면 예약을 하지 않은 사람의 경우 여성(F)이 40%, 남성(M)이 60%이며 예약을 한 사람의 경우 여성(F)이 약 33.3%, 남성(M)이 약 66.7% 인 것을 확인할 수 있다.
요약 연산
.crosstab() 함수를 사용하여 요약연산을 실시하고자 할 경우 3개의 변수(또는 시리즈 객체)가 필요하며 이 경우 “values” 인자에 변수 할당이 필요하다. 그리고 “values”에 할당되는 변수를 어떻게 요약할 것인지 명시해야 하는데 이 때 “aggfunc” 인자에 함수명 또는 함수를 할당해야 한다. “aggfunc” 인자에 함수명을 지정하는 경우는 Pandas 시리즈 객체에서 지원하는 메서드명과 같으며 직접 별도의 연산규칙을 적용하고자 할 때에는 사용자 정의 함수 또는 lambda 함수를 “aggfunc” 인자에 할당해야 한다. ※ aggfunc는 aggregate function의 약어이다.