분할표(Contingency Table)는 하나의 변수를 행에, 다른 변수를 열에 배치하여 두 변수의 분포를 한눈에 보여주는 표입니다. 주로 두 변수 간의 상관관계를 분석하는 데 활용되며, 여러 범주형 변수에 대해 각 관측값이 어느 범주에 속하는지를 설명하는 다차원 표이기도 합니다.
쉽게 말해, 분할표는 두 개 이상의 범주형 변수 사이의 빈도수를 집계한 것이라고 할 수 있습니다. 통계학에서는 교차표(crosstab) 또는 이원표(two-way table)라고도 부르며, 여러 범주형 변수 간의 관계를 요약하는 데 널리 사용됩니다.
분할 계수(Contingency Coefficient)
분할 계수는 두 변수 또는 두 데이터셋이 서로 독립인지 종속인지를 판단해 주는 연관성 계수입니다. 피어슨 계수(Pearson's Coefficient)라고도 불리며, 값이 클수록 두 변수 간의 연관성이 강하다는 의미로 해석됩니다.
실습 예제: 붓꽃(Iris) 데이터셋
이번 글에서는 분석 예제로 유명한 붓꽃(Iris) 데이터셋을 사용합니다. 이 데이터셋은 세 가지 붓꽃 품종(Setosa, Virginica, Versicolor)에서 각각 50개씩 총 150개의 샘플로 구성되어 있으며, 각 샘플마다 꽃받침(sepal)과 꽃잎(petal)의 길이와 너비를 센티미터 단위로 측정한 4개의 특성이 포함되어 있습니다.
이 특성들을 바탕으로 분할표를 작성하고, 이를 통해 품종을 서로 구별하는 데 활용해 보겠습니다.
데이터셋 불러오기
pandas의 read_csv() 함수를 사용해 CSV 파일을 읽어온 뒤, head()로 상위 5개 행을 확인합니다.
import numpy as np
import pandas as pd
datainput = pd.read_csv("iris.csv")
print(datainput.head(5))위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species 0 5.1 3.5 1.4 0.2 Iris-setosa 1 4.9 3.0 1.4 0.2 Iris-setosa 2 4.7 3.2 1.3 0.2 Iris-setosa 3 4.6 3.1 1.5 0.2 Iris-setosa 4 5.0 3.6 1.4 0.2 Iris-setosa
데이터의 기초 통계량 확인
다음으로 describe() 메서드를 사용해 데이터의 전반적인 통계 정보를 살펴봅니다. 평균(mean), 표준편차(std), 최솟값·최댓값, 그리고 사분위수(quartiles)를 통해 데이터가 어떻게 분포되어 있는지 파악할 수 있습니다.
import numpy as np
import pandas as pd
datainput = pd.read_csv("iris.csv")
print(datainput.describe())실행 결과는 다음과 같습니다.
SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm count 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.054000 3.758667 1.198667 std 0.828066 0.433594 1.764420 0.763161 min 4.300000 2.000000 1.000000 0.100000 25% 5.100000 2.800000 1.600000 0.300000 50% 5.800000 3.000000 4.350000 1.300000 75% 6.400000 3.300000 5.100000 1.800000 max 7.900000 4.400000 6.900000 2.500000
데이터 타입 확인
이어서 dtypes 속성을 사용해 데이터프레임의 각 컬럼이 어떤 데이터 타입을 가지고 있는지 확인합니다.
import numpy as np
import pandas as pd
datainput = pd.read_csv("iris.csv")
print(datainput.dtypes)실행 결과는 다음과 같습니다.
SepalLengthCm float64 SepalWidthCm float64 PetalLengthCm float64 PetalWidthCm float64 Species object dtype: object
분할표 생성하기
이제 품종(Species)별 꽃잎 너비(PetalWidthCm)의 분포를 보여주는 분할표를 만들어 보겠습니다. pandas에서 제공하는 crosstab() 함수를 사용하며, 두 컬럼의 이름을 인자로 전달하면 됩니다.
import numpy as np
import pandas as pd
datainput = pd.read_csv("iris.csv")
width_species = pd.crosstab(datainput['PetalWidthCm'], datainput['Species'], margins=False)
print(width_species)실행 결과는 다음과 같습니다.
Species Iris-setosa Iris-versicolor Iris-virginica PetalWidthCm 0.1 6 0 0 0.2 28 0 0 0.3 7 0 0 1.0 0 7 0 1.1 0 3 0 1.2 0 5 0 1.8 0 1 11 1.9 0 0 5 2.0 0 0 6 2.1 0 0 6 2.5 0 0 3
결과를 보면 Setosa 품종은 꽃잎 너비가 0.1~0.3cm로 좁고, Virginica 품종은 1.8~2.5cm로 넓은 것을 확인할 수 있습니다. 이처럼 분할표는 품종 구분에 유용한 패턴을 직관적으로 보여줍니다.
다변량 분할표(Multi-variate Contingency Table)
두 개보다 많은 컬럼을 활용해 분할표를 만들 수도 있습니다. 아래 예제에서는 꽃잎 길이(PetalLengthCm)와 꽃잎 너비(PetalWidthCm)를 동시에 행으로 사용하여 품종별 분포를 살펴봅니다.
import numpy as np
import pandas as pd
datainput = pd.read_csv("iris.csv")
length_width_species = pd.crosstab([datainput.PetalLengthCm, datainput.PetalWidthCm], datainput.Species, margins=False)
print(length_width_species)실행 결과는 다음과 같습니다.
Species Iris-setosa Iris-versicolor Iris-virginica PetalLengthCm PetalWidthCm 1.0 0.2 1 0 0 1.1 0.1 1 0 0 1.2 0.2 2 0 0 1.3 0.2 4 0 0 0.3 2 0 0 ... ... ... ... 6.4 2.0 0 0 1 6.6 2.1 0 0 1 6.7 2.0 0 0 1 2.2 0 0 1 6.9 2.3 0 0 1
이처럼 crosstab() 함수에 리스트 형태로 여러 컬럼을 전달하면, 복합 조건에 따른 빈도 분포를 손쉽게 분석할 수 있습니다. 분할표는 범주형 데이터 탐색 및 변수 간 관계 파악에 필수적인 도구이므로, 데이터 분석 실무에서 적극적으로 활용해 보시기 바랍니다.