이번 포스팅에서는 데이터를 구성하는 변수 중에서 결측치를 포함하는 변수를 확인하고, 변수에서 결측치가 얼마나 많은 비율을 차지하고 있는 지 확인하는 파이썬 함수를 작성해 보겠습니다. 인사이트 도출, 통계적 모델링 등을 수행하는 데 있어, 결측치가 존재하는 변수의 존재 유무를 확인하고, 어떻게 처리할 것인지 결정하는 것은 매우 중요한 일입니다. 생성한 함수가 여러분들이 데이터 분석 작업을 하는 데 있어 많은 도움이 되었으면 좋겠습니다.
예시 데이터 생성
결측치 비율을 산출하기 위한 예시 데이터를 생성하겠습니다.
import pandas as pd
# 예시 데이터 프레임 생성
data = {'var1': [1, 2, None, 4, 5],
'var2': [None, 2, 3, 4, None],
'var3': [1, 2, 3, 4, 5],
'var4': ['one', 'two', 'three', None, None]}
tempData = pd.DataFrame(data)
- import pandas as pd : pandas 패키지를 활용하기 위한 패키지 로딩
- data = {…} : 4개의 변수(var1, var2, var3, var4)와 각 변수에 5개의 관측치를 가지는 data를 딕셔너리 형태로 생성
- tempData = pd.DataFrame(data) : 딕셔너리 형태의 data를 데이터프레임으로 변환
생성된 tempData는 아래와 같은 구조를 가집니다(데이터프레임에 대한 개념 및 상세한 설명은 판다스(Pandas) 데이터프레임(DataFrame) 이해하기를 참고하시면 됩니다).
tempData
----------------------------------------
var1 var2 var3 var4
0 1.0 NaN 1 one
1 2.0 2.0 2 two
2 NaN 3.0 3 three
3 4.0 4.0 4 None
4 5.0 NaN 5 None
생성된 tempData를 활용해서 결측치 비율을 산출하는 함수를 작성해 보겠습니다.
데이터의 변수 및 관측치 갯수 확인
결측치 비율을 산출하기에 앞서 데이터의 변수 및 관측치 갯수를 먼저 확인합니다. 해당 작업을 수행하기 위해서는 shape함수를 사용합니다.
shape 함수
shap함수는 데이터프레임의 차원을 튜플 형태로 반환하는 함수입니다.
tempData.shape
------------------
(5, 4)
앞의 숫자가 행(관측치)의 갯수를 의미하고, 뒤에 숫자는 열(변수)의 갯수를 의미합니다.
두 개의 숫자에 대해서 각각 접근하려면 대괄호[]를 사용합니다.
tempData.shape[0]
-------------------
5
tempData.shape[1]
-------------------
4
데이터 변수 및 관측치 갯수 출력
print(f"데이터에 포함된 변수의 갯수 : {tempData.shape[1]}개")
print(f"데이터에 포함된 관측치의 갯수 : {tempData.shape[0]}개")
---------------------------------------------------------------
데이터에 포함된 변수의 갯수 : 4개
데이터에 포함된 관측치의 갯수 : 5개
- print(f”데이터에 포함된 변수의 갯수 {tempData.shape[1]}개”) : f-문자열을 활용하여 데이터 변수의 갯수를 출력합니다.
- print(f”데이터에 포함된 변수의 갯수 : {tempData.shape[0]}개”) : f-문자열을 활용하여 데이터 관측치의 갯수를 출력합니다.
- f-문자열을 활용하면, 중괄호{} 안에 있는 객체는 저장되어 있는 값으로 출력합니다. tempData.shape[1] 에는 4의 값이 저장되어 있고, tempData.shape[0] 에는 5의 값이 저장되어 있기 때문에 위의 코드는 각각 “데이터에 포함된 변수의 갯수 : 4개”와 “데이터에 포함된 관측치의 갯수 : 5개”를 출력하게 됩니다.
변수의 결측치 비율 산출
isna 함수와 mean 함수를 사용하여 변수의 결측치 비율을 산출합니다.
varNanRatios = tempData.isna().mean()
varNanRatios
---------------------------------------
var1 0.2
var2 0.4
var3 0.0
var4 0.4
dtype: float64
- isna 함수 : 값이 결측치이면 True, 결측치가 아니면 False를 반환하는 함수입니다.
- mean 함수 : 평균값을 계산하는 함수입니다.
- tempData.isna().mean() : tempData 데이터프레임에 있는 모든 변수들에 대해서 결측치 여부를 확인한 후, 그 결과값에 대한 평균을 계산하여 최종 결측치 비율을 산출하게 됩니다.
구문별로 산출되는 결과를 확인해 보겠습니다.
tempData.isna()
----------------------------------
var1 var2 var3 var4
0 False True False False
1 False False False False
2 True False False False
3 False False False True
4 False True False True
tempData.isna()의 실행 결과 모든 변수에 대해서 관측치가 결측치이면 True, 결측치가 아니면 False를 반환하였습니다. 파이썬 프로그램 뿐만 아니라 거의 모든 프로그램에서 True = 1, False = 0 이므로, 위의 결과는 아래와 같다고 볼 수 있습니다.
tempData.isna()
-----------------------------------
var1 var2 var3 var4
0 0 1 0 0
1 0 0 0 0
2 1 0 0 0
3 0 0 0 1
4 0 1 0 1
tempData.isna().mean() 은 위의 결과를 기반으로 각 변수별 평균을 산출하므로 계산된 결과값이 최종적으로 결측치의 비율을 의미하게 됩니다.
산출 결과에 대한 출력 포맷 지정
for idx, value in zip(varNanRatios.index, varNanRatios.values) :
print(idx, ' : ' , f"{value:>4.1%}")
------------------------------------------------------------------
var1 : 20.0%
var2 : 40.0%
var3 : 0.0%
var4 : 40.0%
for문과 zip 함수를 사용하여 각각의 변수 및 변수의 결측치 비율을 하나씩 반복하여 출력 포맷을 적용한 결과입니다.
zip 함수는 여러 개의 반복 가능한 객체들을 받아 각 반복하는 과정에서 같은 인덱스의 요소들을 순서대로 묶어 튜플로 만들어주는 함수입니다.
- varNanRatios.index : varNanRatio에 저장된 변수에 접근하기 위해 index 함수를 사용합니다.
- varNanRatios.values : varNanRatio에 저장된 변수의 값에 접근하기 위해 values 함수를 사용합니다.
결측치가 존재하는 변수만 출력하기
위의 코드에서 조건문 한 줄을 추가하여 결측치가 존재하는 변수와 그에 해당하는 결측치 비율을 출력할 수 있습니다.
for idx, value in zip(varNanRatios.index, varNanRatios.values) :
if value > 0 :
print(idx, ' : ' , f"{value:>4.1%}")
------------------------------------------------------------------
var1 : 20.0%
var2 : 40.0%
var4 : 40.0%
반복문을 수행하는 과정에서 varNanRatios의 values 값이 0보다 큰 경우에만 출력합니다.
결측치 비율이 특정 기준 초과 시 출력하기
# 결측치 비율이 30%를 초과하는 변수 및 결측치 비율 출력
# 결측치 비율 조건 입력
nanCriteria = 0.3
for idx, value in zip(varNanRatios.index, varNanRatios.values) :
if value > nanCriteria :
print(idx, ' : ' , f"{value:>4.1%}")
------------------------------------------------------------------
var2 : 40.0%
var4 : 40.0%
데이터 결측치 비율 산출을 위한 파이썬 함수 생성
지금까지 작성한 코드를 활용하여 데이터 결측치 비율 산출을 위한 파이썬 함수를 생성해 보겠습니다.
import pandas as pd
# data: 분석하고자 하는 데이터 프레임
# nanCriteria : 결측치 비율 (0 ~ 1)
def nan_ratios(data, nanCriteria = 0) :
totVarCount = data.shape[1]
totObsCount = data.shape[0]
print("")
print(f"데이터에 포함된 변수의 갯수 : {totVarCount}개")
print(f"데이터에 포함된 관측치의 갯수 : {totObsCount}개")
print("")
print("-"*100)
varNanRatios = data.isna().mean()
nanVarCount = len(varNanRatios[varNanRatios.values > 0])
nanVarCountCriteria = len(varNanRatios[varNanRatios.values > nanCriteria])
print("")
print(f"* 데이터에 결측치가 포함된 변수의 갯수 : {len(varNanRatios[varNanRatios.values > 0])}개")
print(f"* 총 변수의 갯수 대비 데이터에 결측치가 포함된 변수의 비율 : {nanVarCount/totVarCount:3.1%}")
print("")
print(f"* 각 변수별 결측치의 비율")
print("")
for idx, value in zip(varNanRatios.index, varNanRatios.values) :
print(idx, ' : ' , f"{value:>4.1%}")
print("-"*100)
print("")
print(f"* 결측치의 비율이 {nanCriteria: 3.1%}를 초과하는 변수의 갯수 : {nanVarCountCriteria}개")
print(f"* 총 변수의 갯수 대비 결측치의 비율이 {nanCriteria: 3.1%}를 초과하는 변수의 비율 : {nanVarCountCriteria / totVarCount:3.1%}")
print("")
print(f"* 결측치의 비율이 {nanCriteria: 3.1%}를 초과하는 변수 리스트 및 결측치 비율")
print("")
for idx, value in zip(varNanRatios.index, varNanRatios.values) :
if value > nanCriteria :
print(idx, ' : ' , f"{value:>4.1%}")
print("")
print("-"*100)
return varNanRatios
# 생성한 함수 사용 예시
nanRatios = nan_ratios(tempData, 0.3)
nanRatios
### 아래의 내용이 함수 사용 결과입니다.
# 함수 사용 결과는 아래와 같음
데이터에 포함된 변수의 갯수 : 4개
데이터에 포함된 관측치의 갯수 : 5개
----------------------------------------------------------------------------------------------------
* 데이터에 결측치가 포함된 변수의 갯수 : 3개
* 총 변수의 갯수 대비 데이터에 결측치가 포함된 변수의 비율 : 75.0%
* 각 변수별 결측치의 비율
var1 : 20.0%
var2 : 40.0%
var3 : 0.0%
var4 : 40.0%
----------------------------------------------------------------------------------------------------
* 결측치의 비율이 30.0%를 초과하는 변수의 갯수 : 2개
* 총 변수의 갯수 대비 결측치의 비율이 30.0%를 초과하는 변수의 비율 : 50.0%
* 결측치의 비율이 30.0%를 초과하는 변수 리스트 및 결측치 비율
var2 : 40.0%
var4 : 40.0%
----------------------------------------------------------------------------------------------------
var1 0.2
var2 0.4
var3 0.0
var4 0.4
dtype: float64
지금까지 데이터 분석 시, 변수들이 결측치를 얼마나 가지고 있는지 비율을 산출하는 파이썬 함수를 작성해 보았습니다.
감사합니다!