데이터 결측치 비율 산출을 위한 파이썬 함수

이번 포스팅에서는 데이터를 구성하는 변수 중에서 결측치를 포함하는 변수를 확인하고, 변수에서 결측치가 얼마나 많은 비율을 차지하고 있는 지 확인하는 파이썬 함수를 작성해 보겠습니다. 인사이트 도출, 통계적 모델링 등을 수행하는 데 있어, 결측치가 존재하는 변수의 존재 유무를 확인하고, 어떻게 처리할 것인지 결정하는 것은 매우 중요한 일입니다. 생성한 함수가 여러분들이 데이터 분석 작업을 하는 데 있어 많은 도움이 되었으면 좋겠습니다.

예시 데이터 생성

결측치 비율을 산출하기 위한 예시 데이터를 생성하겠습니다.

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

지금까지 데이터 분석 시, 변수들이 결측치를 얼마나 가지고 있는지 비율을 산출하는 파이썬 함수를 작성해 보았습니다.

감사합니다!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다