Skip to content

판다스 크로스탭(Crosstab): 파이썬에서 간단한 교차표 만들기

크로스탭은 데이터 분석에서 강력한 도구로서 두 개 이상의 범주형 변수 또는 이산형 변수 간의 관계를 조사할 수 있게 해줍니다. 본 글에서는 파이썬의 판다스 라이브러리 내부 함수인 크로스탭(crosstab)에 대해 알아보고, 크로스탭 함수가 어떤 것인지, 피봇 테이블 함수와 어떻게 비교되며 데이터 조작에 효과적으로 사용하는 방법에 대해 알아보겠습니다.

판다스는 파이썬에서 널리 사용되는 데이터 조작 도구로서, 데이터 분석을 위한 다양한 함수를 제공합니다. 이 중 하나인 크로스탑(crosstab) 함수는 데이터의 관계를 이해하는 데에 간단하면서도 효과적인 방법을 제공하므로, 경험 있는 데이터 분석가나 분야 초보자든 상관 없이 판다스 크로스탑을 사용하는 방법을 이해하는 것은 데이터 조작 기술을 크게 향상시킬 수 있습니다.

파이썬 판다스 데이터프레임으로 코드 없이 데이터 시각화를 빠르게 작성하고 싶으신가요?

PyGWalker는 시각적 탐색적 데이터 분석을 위한 파이썬 라이브러리입니다. PyGWalker (opens in a new tab)를 사용하면 판다스 데이터프레임과 다른 데이터프레임(Polars 데이터프레임)을 Tableau 스타일의 사용자 인터페이스로 변경하여 Jupyter Notebook에서 데이터 분석 및 데이터 시각화 작업을 간편화할 수 있습니다.

데이터 시각화를 위한 PyGWalker (opens in a new tab)

판다스 크로스탭(crosstab)이란?

판다스 크로스탭(crosstab)은 두 개 이상의 요인(factors)에 대한 교차표를 간단하게 만드는 함수입니다. 기본적으로 두 개 이상의 데이터 배열에 대한 단순 교차표를 계산합니다. 기본적으로 요인(factor)의 빈도표를 제공하지만, 값 배열과 집계 함수를 전달할 경우 값을 집계한 교차표를 제공합니다.

다음은 판다스 크로스탭을 사용하는 기본적인 예제입니다:

import pandas as pd
 
## 샘플 데이터
data = {'A': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'],
        'B': ['one', 'one', 'two', 'two', 'one', 'one'],
        'C': ['small', 'large', 'large', 'small', 'small', 'large'],
        'D': [1, 2, 2, 3, 3, 4]}
df = pd.DataFrame(data)
 
## 크로스탭 사용
table = pd.crosstab(df['A'], df['B'])
print(table)

이 예제에서는 딕셔너리로부터 데이터프레임을 생성한 다음 판다스 크로스탭을 사용하여 'A' 카테고리에 대한 'B' 카테고리의 빈도를 보여주는 교차표를 만듭니다.

판다스에서 피봇 테이블(pivot table)과 크로스탭(crosstab) 중 어떤 것을 사용해야 할까요?

판다스의 피봇 테이블(pivot table)과 크로스탭(crosstab)은 비슷한 목적으로 사용되지만, 약간 다른 시나리오에서 사용됩니다. 피봇 테이블은 주어진 테이블에서 파생된 새로운 테이블을 만드는 데에 사용되는 일반적인 솔루션입니다. 반면 크로스탭은 주로 그룹 빈도를 계산하는 데에 특화되어 있습니다.

피봇 테이블은 다양한 유형의 입력 데이터와 여러개의 인덱스와 열 이름을 다룰 수 있지만, 크로스탭은 주로 빈도표를 생성하는 데에 사용됩니다. 따라서, 빈도표를 생성하려면 판다스 크로스탭을 사용하는 것이 좋습니다. 그러나 더 복잡한 데이터 조작 작업을 다루는 경우에는 피봇 테이블이 더 적합한 선택일 수 있습니다.

파이썬에서 크로스탭(crosstab)을 정의하는 방법은?

판다스를 사용하여 파이썬에서 크로스탭을 정의하는 것은 간단합니다. 크로스탭을 생성하는 기본 구문은 다음과 같습니다:

pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name: str = 'All', dropna: bool = True, normalize=False)

각 매개변수의 의미는 다음과 같습니다:

  • index: 배열 형태, 행으로 그룹화할 값들입니다.
  • columns: 배열 형태, 열로 그룹화할 값들입니다.
  • values: 배열 형태, 선택적 매개변수로, 요인(factor)에 따라 집계할 값들의 배열입니다.
  • rownames: 시퀀스, 기본값 None, 전달할 경우 행 배열 수와 일치해야 합니다.
  • colnames: 시퀀스, 기본값 None, 전달할 경우 열 배열 수와 일치해야 합니다.
  • aggfunc: 함수, 선택적 매개변수로, values가 지정되는 경우 필요합니다.
  • margins: 불린, 기본값 False, 행/열의 합계를 추가합니다.
  • margins_name: 문자열, 기본값 'All', 합계가 포함될 행/열의 이름입니다.
  • dropna: 불린, 기본값 True, 모든 값이 NaN인 열을 포함하지 않습니다.
  • normalize: 불린, columns, 또는 1, 기본값 False. 값의 합으로 모든 값을 나누어 정규화합니다.

파이썬에서 백분율의 크로스탭(crosstab)을 만드는 방법은?

판다스에서 백분율의 크로스탭(crosstab)을 만드는 것은 매우 간단합니다. 정규화(normalize) 매개변수를 True로 설정하거나 정규화할 축(인덱스 또는 열)을 지정하기만 하면 됩니다. 다음은 예제 코드입니다:

import pandas as pd
 
## 샘플 데이터
data = {'A': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'],
        'B': ['one', 'one', 'two', 'two', 'one', 'one'],
        'C': ['small', 'large', 'large', 'small', 'small', 'large'],
        'D': [1, 2, 2, 3, 3, 4]}
df = pd.DataFrame(data)
 
## 정규화된 크로스탭 사용
table = pd.crosstab(df['A'], df['B'], normalize=True)
print(table)

이 예제에서는 크로스탭이 빈도수 대신 각 카테고리의 비율을 보여주므로, 카테고리 분포를 더 명확하게 확인할 수 있습니다.

판다스에서 크로스탭(crosstab)을 만드는 몇 가지 간단한 방법은 무엇인가요?

판다스에서 크로스탭을 만드는 여러 가지 방법이 있으며, 가장 적합한 방법은 특정 요구에 따라 다릅니다. 다음은 크로스탭을 만드는 세 가지 간단한 방법입니다:

  1. 기본 크로스탭: 가장 간단한 크로스탭을 만드는 방법은 두 개의 시리즈를 판다스 크로스탭 함수에 전달하는 것입니다. 이렇게 하면 빈도표가 제공됩니다.

  2. Aggregation을 사용한 크로스탭: 세 번째 값 시리즈가 있는 경우, 평균, 합계 등의 집계 함수와 함께 크로스탭 함수에 전달하여 보다 복잡한 크로스탭을 얻을 수 있습니다.

  3. Normalize을 사용한 크로스탭: normalize 매개변수를 True로 설정하여 각 카테고리의 비율을 보여주는 크로스탭을 작성할 수 있으며, 카테고리의 분포를 이해하는 데 유용할 수 있습니다.

판다스 크로스탭 예제

판다스 크로스탭을 사용하는 실제 예제에 대해 알아보겠습니다. 상품의 종류, 판매를 한 판매원, 판매된 단위 수를 포함한 상점의 판매 데이터셋이 있다고 가정해보겠습니다. 각 판매원별로 각 상품 종류의 총 판매 단위 수를 보여주는 크로스탭을 만들고 싶습니다.

import pandas as pd
 
# 샘플 데이터
data = {'Product': ['사과', '오렌지', '바나나', '사과', '바나나', '바나나'],
        '판매원': ['존', '존', '클레어', '클레어', '존', '클레어'],
        '단위': [5, 3, 8, 7, 2, 4]}
df = pd.DataFrame(data)
 
# 집계 함수를 사용하여 크로스탭 생성
table = pd.crosstab(df['판매원'], df['Product'], values=df['단위'], aggfunc='sum')
print(table)

이 예제에서 크로스탭은 각 판매원별로 각 상품 종류의 총 단위 수를 보여줍니다. 이는 데이터를 요약하고 시각화하는 강력한 방법입니다.

판다스에서 크로스탭 정렬하는 방법

판다스에서 크로스탭을 정렬하는 것은 sort_values 함수를 사용하는 것만으로 간단합니다. 특정 열 또는 인덱스로 정렬할 수 있습니다. 다음은 예제입니다.

# 이전 예제를 이어서
# '사과'로 정렬
table = table.sort_values('사과', ascending=False)
print(table)

이 예제에서 크로스탭은 '사과' 열을 내림차순으로 정렬됩니다. 다른 열 또는 오름차순으로 정렬하려면 쉽게 변경할 수 있습니다.

판다스 크로스탭 계수 및 백분율

가끔 크로스탭에서 계수와 백분율을 모두 가져오고 싶을 수 있습니다. 이는 두 개의 크로스탭을 만들고 이를 연결하여 달성할 수 있습니다. 다음은 방법입니다.

# 첫 번째 예제를 이어서
# 계수 크로스탭 생성
count_table = pd.crosstab(df['판매원'], df['Product'])
 
# 백분율 크로스탭 생성
perc_table = pd.crosstab(df['판매원'], df['Product'], normalize='index')
 
# 두 테이블을 연결
final_table = pd.concat([count_table, perc_table], keys=['Count', 'Percentage'])
print(final_table)

이 예제에서 최종 크로스탭은 각 카테고리의 계수와 백분율을 모두 보여줍니다. 이는 데이터의 종합적인 시각을 얻는 데 매우 유용할 수 있습니다.

FAQs

판다스 크로스탭이란 무엇인가요?

판다스 크로스탭은 파이썬의 판다스 라이브러리에서 제공하는 함수로, 두 개 이상의 요소를 크로스탭(교차표)로 만들 수 있습니다. 데이터의 관계를 이해하는 간단하고 효과적인 방법을 제공합니다.

파이썬에서 크로스탭을 어떻게 정의하나요?

판다스를 사용하여 파이썬에서 크로스탭을 정의하는 것은 간단합니다. 크로스탭을 생성하는 기본 문법은 pd.crosstab(index, columns)입니다. 여기서 indexcolumns는 각각 행과 열로 그룹화할 값입니다.

판다스에서 백분율을 포함한 크로스탭을 어떻게 만드나요?

판다스에서 백분율을 포함한 크로스탭을 생성하려면, normalize 매개변수를 True로 설정하거나 정규화할 축 (인덱스 또는 열)을 지정해야 합니다. 이렇게 하면 각 카테고리의 비율을 보여주는 크로스탭이 생성되어 카테고리의 분포를 더욱 명확하게 파악할 수 있습니다.