통계학에서 '빈도(frequency)'란 주어진 데이터 샘플에서 특정 값이 나타난 횟수를 의미합니다. 수학 및 과학 분석을 위해 만들어진 소프트웨어인 Pandas는 데이터 샘플에서 빈도를 손쉽게 계산할 수 있는 다양한 내장 메서드를 제공합니다.
절대 빈도(Absolute Frequency)
절대 빈도는 일반적인 빈도와 같은 개념으로, 데이터 요소가 나타난 횟수를 그대로 세는 것입니다. 아래 예제에서는 DataFrame에 도시 이름이 몇 번 등장하는지 단순히 세어 그 결과를 빈도로 출력합니다.
방법 1: .value_counts() 사용
Pandas에서 제공하는 .value_counts() 메서드를 활용하는 가장 간단한 방법입니다.
import pandas as pd # 데이터 프레임 생성 data = ["Chandigarh","Hyderabad","Pune","Pune","Chandigarh","Pune"] # .value_counts() 메서드 사용 df = pd.Series(data).value_counts() print(df)
실행 결과
Pune 3 Chandigarh 2 Hyderabad 1 dtype: int64
위 코드를 실행하면 각 도시별 출현 횟수가 내림차순으로 정렬되어 출력됩니다. Pune이 3번, Chandigarh가 2번, Hyderabad가 1번 나타났음을 한눈에 확인할 수 있습니다.
방법 2: .crosstab() 사용
교차표(cross tabulation)를 생성하는 .crosstab() 메서드를 이용해도 동일한 빈도표를 얻을 수 있습니다.
import pandas as pd data = ["Chandigarh","Hyderabad","Pune","Pune","Chandigarh","Pune"] df = pd.DataFrame(data,columns=["City"]) tab_result = pd.crosstab(index=df["City"],columns=["count"]) print(tab_result)
실행 결과
col_0 count City Chandigarh 2 Hyderabad 1 Pune 3
crosstab 방식은 인덱스와 컬럼 구조를 갖춘 교차표 형태로 결과를 반환하기 때문에, 여러 변수 간의 관계를 함께 분석해야 할 때 특히 유용합니다.
상대 빈도(Relative Frequency)
상대 빈도는 특정 값의 빈도를 전체 관측치 수로 나눈 비율입니다. 따라서 그 값은 부동소수점 숫자가 되며, 백분율(%)로 표현할 수도 있습니다. 상대 빈도를 구하려면 먼저 앞서 살펴본 첫 번째 방법으로 빈도를 계산한 뒤, len() 함수로 구한 전체 관측치 수로 나누면 됩니다.
예제
import pandas as pd # 데이터 프레임 생성 data = ["Chandigarh","Hyderabad","Pune","Pune","Chandigarh","Pune"] # .value_counts() 메서드 사용 df = pd.Series(data).value_counts() print(df/len(data))
실행 결과
Pune 0.500000 Chandigarh 0.333333 Hyderabad 0.166667 dtype: float64
결과를 보면 Pune이 전체의 50%, Chandigarh가 약 33.3%, Hyderabad가 약 16.7%를 차지합니다. 세 값을 모두 더하면 1이 되는데, 이는 상대 빈도의 합이 항상 전체 비율인 1과 일치한다는 통계적 성질을 보여줍니다.
정리
Pandas에서는 .value_counts()나 .crosstab() 메서드만으로 절대 빈도를 쉽게 구할 수 있으며, 여기에 전체 관측치 수를 나누기만 하면 상대 빈도까지 간단히 계산할 수 있습니다. 데이터 탐색(EDA) 단계에서 범주형 데이터의 분포를 파악할 때 이 두 가지 빈도 개념은 기본이자 핵심적인 도구이므로 꼭 익혀두시기 바랍니다.