Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Pandas로 배우는 절대 빈도와 상대 빈도 계산 방법

통계학에서 '빈도(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) 단계에서 범주형 데이터의 분포를 파악할 때 이 두 가지 빈도 개념은 기본이자 핵심적인 도구이므로 꼭 익혀두시기 바랍니다.