최빈값(Mode)은 데이터 집합에서 가장 자주 나타나는 값을 의미합니다. 데이터 분석에서 결측치(NaN)를 처리할 때 평균이나 중앙값 대신 최빈값을 사용하면, 특히 범주형 데이터나 이상치의 영향을 받고 싶지 않은 경우에 유용합니다.
Pandas에서는 fillna() 메서드와 mode() 함수를 조합하여 누락된 열 값을 해당 열의 최빈값으로 손쉽게 채울 수 있습니다.
1. 필요한 라이브러리 임포트
먼저 pandas와 numpy를 각각 별칭(alias)과 함께 가져옵니다.
import pandas as pd import numpy as np
2. 결측치가 포함된 DataFrame 생성
두 개의 열('Car', 'Units')을 가진 DataFrame을 만들어 보겠습니다. NumPy의 np.NaN을 사용하여 의도적으로 결측치를 포함시켰습니다.
dataFrame = pd.DataFrame(
{
"Car": ['BMW', 'Lexus', 'Lexus', 'Mustang', 'Bentley', 'Mustang'],
"Units": [100, 150, np.NaN, 80, np.NaN, np.NaN]
}
)위 DataFrame의 'Units' 열에는 총 3개의 NaN 값이 존재합니다.
3. 최빈값으로 결측치 채우기
'Units' 열에 mode() 함수를 적용하여 최빈값을 구한 뒤, fillna() 메서드로 NaN 값을 대체합니다.
dataFrame.fillna(dataFrame['Units'].mode()[0], inplace=True)
여기서 주목할 점은 두 가지입니다.
- mode()[0]: mode() 함수는 Series를 반환하기 때문에, 인덱스 [0]으로 첫 번째 최빈값을 추출해야 합니다.
- inplace=True: 원본 DataFrame을 직접 수정하여 결과를 저장합니다.
전체 예제 코드
다음은 위 과정을 모두 포함한 완성된 코드입니다.
import pandas as pd
import numpy as np
# DataFrame 생성
dataFrame = pd.DataFrame(
{
"Car": ['BMW', 'Lexus', 'Lexus', 'Mustang', 'Bentley', 'Mustang'],
"Units": [100, 150, np.NaN, 80, np.NaN, np.NaN]
}
)
print("DataFrame ...\n", dataFrame)
# 'Units' 열의 최빈값을 구하여 NaN 값 대체
dataFrame.fillna(dataFrame['Units'].mode()[0], inplace=True)
print("\n최빈값으로 NaN을 채운 후의 DataFrame...\n", dataFrame)실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
DataFrame ...
Car Units
0 BMW 100.0
1 Lexus 150.0
2 Lexus NaN
3 Mustang 80.0
4 Bentley NaN
5 Mustang NaN
Updated Dataframe after filling NaN values with mode...
Car Units
0 BMW 100.0
1 Lexus 150.0
2 Lexus 80.0
3 Mustang 80.0
4 Bentley 80.0
5 Mustang 80.0정리
'Units' 열의 값 중 가장 많이 등장하는 값은 80입니다. 따라서 fillna() 메서드를 통해 기존의 NaN 값들이 모두 80으로 채워진 것을 확인할 수 있습니다.
참고로, 최빈값 외에도 mean()(평균), median()(중앙값)을 활용하여 같은 방식으로 결측치를 처리할 수 있으며, 데이터의 특성에 맞는 방법을 선택하는 것이 중요합니다.