누락된 값 처리에 대한 종단 간 소개

소스 노드 : 1121996

이 기사는 데이터 과학 Blogathon

살펴보기

데이터는 우리에게 미래의 사건을 분석하고 예측할 수 있는 힘을 제공합니다. 매일 점점 더 많은 회사가 예측 예측, 클러스터링 등과 같은 데이터 과학 기술을 채택하고 있습니다. 복잡한 ML 및 DL 알고리즘에 대해 계속 학습하는 것은 매우 흥미롭지만, 필수 사항을 숙지하는 것을 잊지 말아야 합니다. 데이터 전처리. 데이터 전처리의 중요한 부분 중 하나는 누락된 값을 처리하는 것입니다. 이는 다양한 유형의 누락된 데이터를 처리하는 방법에 대한 완전한 가이드입니다.

내용

  1. 결측값을 처리하는 것이 왜 중요한가요?
  2. 누락된 값의 이유
  3. 결측값 유형
  4. 데이터세트에서 누락된 값을 확인하세요.
  5. 결측값 시각화
  6. 누락된 값이 있는 행 삭제
  7. 누락된 값이 있는 열 삭제
  8. 연속형 변수에 대한 대치
    1. 평균을 사용한 대치
    2. 중앙값으로 대치
  9. 회귀를 사용하여 결측값 예측
  10. 범주형 데이터의 누락된 값
  11. 시계열 데이터의 누락된 값
    1. 정방향 채우기 결측값
    2. 역방향 채우기 결측값
    3. 선형 보간
  12. 누락된 값에 강력한 알고리즘
  13. 결론

누락된 데이터를 처리하는 것이 왜 중요한가요?

현실 세계의 데이터에는 대부분 누락된 데이터가 많이 있습니다. 각 값이 누락되는 이유는 다양할 수 있습니다. 데이터가 손실되거나 손상되었을 수도 있고, 특정한 이유가 있을 수도 있습니다. 누락된 데이터는 모델의 예측력을 감소시킵니다. 누락된 데이터가 있는 알고리즘을 적용하면 매개변수 추정에 편향이 발생합니다. 누락된 데이터를 처리하지 않으면 결과에 대해 확신을 가질 수 없습니다.

누락된 값의 이유

데이터 세트에서 데이터가 누락된 이유가 궁금하신가요?

데이터가 누락된 이유 중 일부는 다음과 같습니다.

  • 사람들은 데이터 수집 설문조사에서 특정 질문에 관한 정보를 제공하지 않습니다. 예를 들어, 일부 사람들은 자신의 급여, 음주, 흡연 습관에 관한 정보를 공유하는 것을 꺼려할 수 있습니다. 이들은 인구에 의해 의도적으로 제외되었습니다.
  • 어떤 경우에는 데이터가 직접적으로 축적되지 않고 이용 가능한 다양한 과거 기록으로부터 축적됩니다. 이 경우 데이터 손상이 주요 문제입니다. 낮은 유지 관리로 인해 데이터의 일부가 손상되어 데이터 누락이 발생합니다.
  • 데이터 수집 프로세스 중 부정확성도 데이터 누락의 원인이 됩니다. 예를 들어, 수동 데이터 입력에서는 인적 오류를 완전히 피하기가 어렵습니다.
  • 장비 불일치로 인해 측정 오류가 발생하여 결과적으로 사용할 수 없게 됩니다.

결측값 유형

누락된 데이터는 다양한 이유로 발생할 수 있습니다. 무작위로 완전히 누락된 항목, 무작위로 누락된 항목, 무작위로 누락되지 않은 항목의 세 가지 주요 그룹으로 분류할 수 있습니다.

1. 무작위로 완전히 누락됨(MCAR)

누락된 데이터는 특정 패턴을 따르지 않으며 단순히 무작위입니다. 이러한 데이터의 누락은 나머지 변수와 관련이 없거나 독립적입니다. 나머지 변수 데이터로는 이러한 값을 예측하는 것이 불가능합니다. 예를 들어, 데이터 수집 중에 부주의로 인해 특정 샘플이 손실되는 경우가 있습니다. 이는 통계적으로 분석이 편향되지 않는 이상적인 경우입니다. 그러나 드문 상황이므로 매우 확실하지 않은 한 MCAR의 존재를 가정해서는 안 됩니다.

2. 무작위 누락(MAR)

여기서는 MCAR과 달리 특정 하위 집합에 데이터가 없습니다. 다른 기능을 통해 데이터의 존재 여부를 예측할 수 있습니다. 하지만 누락된 데이터 자체를 예측할 수는 없습니다.

예를 들어, Netflix, Amazon Prime과 같은 플랫폼에서 보낸 시간에 대한 섹션이 있는 인터넷에서 보낸 시간에 대한 설문조사를 생각해 보겠습니다. 노인(45세 이상)이 젊은 사람보다 채울 가능성이 적은 것으로 관찰되었습니다. MAR의 예입니다. 여기서 'Age' 매개변수는 데이터가 누락되는지 여부를 결정합니다. MAR은 MCAR보다 매우 일반적으로 발생합니다.

3. 무작위로 누락되지 않음(NMAR)

이것은 심각하고 까다로운 상황입니다. 설문조사의 목적이 소셜 미디어의 남용/중독을 측정하는 것이라고 가정해 보겠습니다. 소셜 미디어를 과도하게 사용하는 사람들이 의도적으로 설문 조사를 작성하지 않으면 NMAR 사례가 발생합니다. 이는 결과에 편향을 가져올 가능성이 높습니다. 행/열 삭제, 대치 등의 일반적인 방법은 작동하지 않습니다. 이를 해결하기 위해서는 해당 영역에 대한 깊은 지식이 필요합니다.

이제 다양한 유형의 누락 데이터를 살펴보았으므로 이를 처리하는 다양한 방법을 살펴보겠습니다.

누락된 값 확인

데이터 세트가 있는 경우 첫 번째 단계는 누락된 데이터가 있는 열과 그 수를 확인하는 것입니다. 데이터 사이언스 중 가장 유명한 데이터 세트를 활용해 타이타닉 생존자는 물론 학습해 보세요! 아래와 같이 pandas read_csv 함수를 사용하여 데이터 세트를 읽습니다.

train=pd.read_csv('../input/titanic/train.csv') test=pd.read_csv('../input/titanic/test.csv') print('훈련 데이터 형태: ', train.shape ) print('테스트 데이터 모양: ', test.shape) train.head()

누락된 값 데이터

출처: 작성자의 Kaggle 노트북 이미지

이제 우리는 타이타닉 데이터의 훈련 및 테스트 데이터 프레임을 갖게 되었습니다.

누락된 데이터가 있는 열과 개수를 확인하는 방법은 무엇입니까?

이를 위해 "isnull()" 함수가 사용됩니다. isnull과 함께 sum 함수를 호출하면 각 열에서 누락된 데이터의 총 합계가 출력됩니다.

누락_값=train.isnull().sum() 인쇄(누락_값)
PassengerId 0 생존 0 Pclass 0 이름 0 성별 0 나이 177 SibSp 0 Parch 0 티켓 0 요금 0 객실 687 승선 2 dtype: int64

Age, Cabin, Embarked 등 3개의 열에 누락된 값이 있습니다.

각 열에 누락된 값 수를 알고 있지만 전체 값에 대한 해당 값의 비율을 아는 것이 중요합니다. 그럼 한 줄의 코드로 계산해 보겠습니다.

mis_value_percent = 100 * train.isnull().sum() / len(train) print(mis_value_percent)
PassengerId 0.000000 생존 0.000000 Pclass 0.000000 이름 0.000000 성별 0.000000 나이 19.865320 SibSp 0.000000 Parch 0.000000 티켓 0.000000 요금 0.000000 객실 77.104377 0.224467 착수 64 dtype: floatXNUMX

'캐빈' 기둥의 77%가 누락된 것이 분명하며 이는 매우 중요한 비율입니다. Age에는 약 19%의 데이터가 누락되어 있고 Embarked에는 0.2%만 누락되어 있습니다. 이것이 우리가 가지고 있는 누락된 데이터에 대한 정량적 분석입니다. 질적인 것은 어떻습니까? 계속 읽으세요!

Missingno를 사용하여 결측값 시각화

뭔지 맞춰봐? 우리는 특히 데이터세트의 누락된 데이터를 시각화하고 탐색하기 위한 Python 패키지를 보유하고 있습니다. "Missingno" 파이썬 패키지. 빨리 가서 설치해 보세요

pip 설치 누락아니오

이를 사용하여 히트맵, 막대 차트, 행렬 형태로 시각화할 수 있습니다. 분포 방식을 분석하여 MCAR, MAR 또는 NMAR에 속하는 범주를 결론지을 수 있습니다. 누락된 항목이 포함된 열과 대상 열의 상관 관계도 찾을 수 있습니다.

Missingno 라이브러리의 'bar()' 함수를 사용하여 null이 아닌 값에 대한 막대 차트를 만드는 것부터 시작하세요. 이 함수에 pandas 데이터프레임을 전달했습니다.

msno msno.bar(train)로 Missingno 가져오기

실종아니오 | 누락된 값출처: 작성자의 Kaggle 노트북 이미지

다음으로 행렬 시각화를 그릴 수 있습니다. 이는 누락된 데이터가 데이터를 통해 어떻게 분포되어 있는지, 즉 국지화되어 있는지 또는 균일하게 퍼져 있는지, 또는 어떤 패턴이 있는지, 그러한 질문이 많은지를 아는 데 도움이 됩니다.

msno.matrix(기차)
패턴바

산점도 행렬에서는 누락된 각 데이터에 대해 빈 선이 표시됩니다. 'Embarked' 열에는 패턴을 따르지 않는 무작위 누락 데이터가 두 개만 있습니다. 아마도 데이터 수집 중에 손실되었을 수 있습니다. 따라서 이는 무작위로 완전히 누락된 것으로 분류될 수 있습니다.

age 및 Cabin 열은 MAR일 수 있습니다. 그러나 우리는 그들 사이에 상관관계가 없음을 확인하고 싶습니다.

어떻게 할까?

다행히도 Missingno 패키지는 '히트맵' 기능도 제공합니다. 이를 사용하면 서로 다른 열의 누락된 데이터 간에 상관 관계가 있는지 확인할 수 있습니다.

msno.heatmap(기차)

출력이 표시됩니다!

히트맵 | 누락된 값

히트맵은 Age 열과 Cabin 열의 누락된 데이터 사이에 그렇게 강한 상관관계가 없음을 보여줍니다. 따라서 이러한 열의 누락된 데이터는 MAR 또는 Missing at Random으로 분류될 수 있습니다.

누락된 값을 분석하는 방법을 명확하게 이해하시기 바랍니다. 다음으로 이러한 누락된 데이터를 처리하는 다양한 방법에 대해 논의하겠습니다.

누락된 값이 있는 행 삭제

이는 특정 열에 속하는 누락된 값이 있는 모든 행을 삭제하는 간단한 방법입니다. 이것이 쉬운 만큼 큰 단점이 따릅니다. 결국 엄청난 양의 데이터가 손실될 수 있습니다. 이렇게 하면 데이터 세트의 크기가 줄어들고 모델 예측이 편향됩니다. 결측값이 매우 적은 경우에만 이 기능을 사용해야 합니다.

예를 들어 'Embarked' 열에는 누락된 값이 2개만 있습니다. 따라서 이 열이 누락된 행을 삭제할 수 있습니다. 아래 코드 조각을 따르십시오.

print('다음 데이터 세트:', len(train)) train.dropna(subset=['Embarked'],how='any',inplace=True) print('다음 데이터 세트:', len(train)) print( '누락된 값:',train['Embarked'].isnull().sum())
이전 데이터세트: 891 이후 데이터세트: 889 누락된 값: 0

'Age' 열에 대해 동일한 작업을 수행했다고 상상해 보세요. 데이터의 77% 정도가 손실될 것입니다!

열 삭제

열에 큰 결측값이 있는 경우 사용 가능한 실제 데이터가 가장 적은 값으로 값을 대치하는 것은 의미가 없습니다. 따라서 열에 80% 이상의 값이 누락된 경우 분석에서 해당 열을 삭제하면 됩니다. 우리의 경우 'Cabin'에는 77%의 데이터가 누락되어 있으므로 이 열을 삭제하도록 선택할 수 있습니다.

삭제된 열이 분석에 중요한 것이 아닌지 확인하세요. 그렇다면 더 많은 데이터를 얻은 다음 누락된 값을 대치해야 합니다.

연속변수에 대한 대치

기차['나이'][:10]
0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 5 NaN 6 54.0 7 2.0 8 27.0 9 14.0 이름: 나이, dtype: float64
기차['Age']=train['Age'].replace(np.NaN,train['Age'].mean()) 기차['Age'][:10]
0 22.000000 1 38.000000 2 26.000000 3 35.000000 4 35.000000 5 29.699118 6 54.000000 7 2.000000 8 27.000000 9 14.000000 이름: 나이 , dtype: float64

'NaN'이 29.699(계산된 평균)로 대체된 것을 볼 수 있습니다.

평균 대치에는 몇 가지 단점이 있습니다. 데이터의 분포가 매우 고르지 않고 이상값이 많은 경우 평균은 데이터의 실제 분포를 반영하지 않습니다. 평균은 극단적인 값이나 특이치에 의해 크게 영향을 받습니다. 따라서 데이터에 이상값이 많지 않고 거의 정규 분포를 따르는 경우 평균 대체를 사용하세요.

중앙값으로 대치

연속형 특성의 결측값은 null이 아닌 나머지 값의 중앙값으로 채워질 수 있습니다. 중앙값의 장점은 평균과 달리 이상치의 영향을 받지 않는다는 것입니다. 여기에 구현해 보겠습니다.

기차['Age']=train['Age'].replace(np.NaN,train['Age'].median()) 기차['Age'][:10]

평균으로 대치

NaN 값 대신 중앙값(28.0)이 채워져 있는 것을 확인할 수 있습니다.

마찬가지로 모드 대치도 수행할 수 있습니다. 일반적으로 모드를 사용한 대체는 범주형 결측값에 널리 사용됩니다. 이에 대해서는 이후 섹션에서 자세히 다루겠습니다.

회귀를 사용하여 결측값 예측

모든 위치에서 단일 평균 또는 중앙값을 채우는 대신, 우리가 가지고 있는 다른 변수의 도움을 받아 이를 예측할 수 있다면 어떨까요?

예! null이 아닌 값이 있는 기능을 사용하여 누락된 값을 예측할 수 있습니다. 결측값 예측을 위해 회귀 또는 분류 모델을 구축할 수 있습니다. 타이타닉 데이터세트의 'Age' 열에 대해 이를 구현해 보겠습니다.

모델 구축을 위해 데이터를 처리할 수 있습니다. "Age" 특성이 목표 변수가 됩니다.

x_트레인: "Age" 값이 있는 데이터 세트의 행이 필터링됩니다. '나이'가 타겟이다 x_테스트: Null이 아닌 값이 있는 "Age" 열입니다.

XNUMXD덴탈의 y_train 예측해야 하는 Age 값이 누락된 데이터가 있습니다(y_pred)

pd data=pd.read_csv('../input/titanic/train.csv') data = data[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare로 팬더 가져오기 ", "Age"]] data["Sex"] = [1 if x=="male" else 0 for x in data["Sex"]] test_data = data[data["Age"].isnull()] data.dropna(inplace=True) x_train = data.drop("Age", axis=1) x_test = test_data.drop("Age", axis=1) y_train = data["Age"]

이 데이터에 선형 회귀 모델을 적용해 보겠습니다. 여기서는 sklearn 라이브러리를 사용하겠습니다.

sklearn.linear_model import LinearRegression 모델 = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test)

이제 y_pred에서 예측된 Age 열의 null 값이 있습니다.

여러분의 이해를 돕기 위해 테스트 입력과 예측 출력의 몇 가지 예를 인쇄하겠습니다.

인쇄(x_test[:10])
살아남은 Pclass 성별 SibSp 파치 요금 5 0 3 1 0 0 8.4583 17 1 2 1 0 0 13.0000 19 1 3 0 0 0 7.2250 26 0 3 1 0 0 7.2250 28 1 3 0 0 0 7.8792 29 0 3 1 0 0 7.8958 31 1 1 0 1 0 146.5208 32 1 3 0 0 0 7.7500 36 1 3 1 0 0 7.2292 42 0 3 1 0 0 7.8958

이것이 입력이 회귀 모델에 전달되는 방식입니다. 예상 연령 값을 살펴보겠습니다.

인쇄(y_pred[:10])
[29.07080066 30.10833306 22.44685065 29.08927347 22.43705181 29.07922599 32.43692984 22.43898701

만세! 우리는 가치를 얻었습니다.

범주형 데이터의 누락된 값

지금까지 누락된 숫자 데이터를 처리하는 방법을 살펴보았습니다. 범주형 특성의 경우 데이터가 누락되면 어떻게 되나요? 예를 들어 Titanic 데이터세트의 'Cabin' 기능은 범주형입니다. 여기서는 평균과 중앙값을 계산할 수 없습니다. 따라서 누락된 값을 모드 또는 가장 자주 발생하는 클래스/범주로 채울 수 있습니다.

train['Cabin']=train['Cabin'].fillna(train['Cabin'].value_counts().index[0])

결측값의 비율이 낮을 경우 이 방법이 선호됩니다. 이는 막대한 데이터 손실을 초래하지 않으며 통계적으로 관련이 있습니다.

그러나 결측값이 많으면 가장 빈번한 클래스로 대치하는 것이 의미가 없습니다. 대신 "알 수 없음" 또는 "사용할 수 없음"과 같은 누락된 값에 대한 별도의 범주를 만들어 보겠습니다. 수업 수가 XNUMX개 늘어납니다.

누락된 값이 범주형 열(문자열 또는 숫자)에서 나온 경우 누락된 값은 가장 빈번한 범주로 대체될 수 있습니다. 결측값의 수가 매우 많으면 새 범주로 대체할 수 있습니다.

기차['캐빈']=기차['캐빈'].fillna('알 수 없음') 기차['캐빈'][:10]

캐빈 로우 | 나 채우기

작은 데이터 세트에서 잘 작동합니다. 또한 고유한 범주를 추가하여 데이터 손실을 무효화합니다.

시계열 데이터의 누락된 값을 처리하는 방법은 무엇입니까?

정보가 타임스탬프와 함께 순서대로 수집된 데이터세트를 시계열 데이터라고 합니다. 시계열 데이터에 누락된 값이 있는 경우 위에서 설명한 방법 중 하나를 시도해 볼 수 있습니다. 그러나 여기서 사용할 수 있는 몇 가지 구체적인 방법도 있습니다.

아이디어를 얻기 위해 간단한 더미 데이터세트를 만들어 보겠습니다.

시간= pd.date_range("1/01/2021", 기간=10, freq="W") df = pd.DataFrame(index=time); df["판매된 수량"] = [5.0,4.0,np.nan,np.nan,1.0,np.nan,3.0,6.0,np.nan,2.0]; 인쇄(df)

판매 단위

방법으로 넘어 갑시다

정방향 채우기 결측값

다음 행의 값은 누락된 값을 채우는 데 사용됩니다. 'ffill'은 'forward fill'을 의미합니다. 구현하기가 매우 쉽습니다. fillna() 함수에서 "method" 매개변수를 "ffill"로 전달하기만 하면 됩니다.

forward_filled=df.fillna(method='ffill') 인쇄(forward_filled)

앞으로 채워짐

역방향 채우기 결측값

여기서는 이전 행의 값을 사용하여 누락된 값을 채웁니다. 'bfill'은 역방향 채우기를 의미합니다. 여기서는 메소드 매개변수로 'bfill'을 전달해야 합니다.

backward_filled=df.fillna(method='bfill') 인쇄(backward_filled)

뒷마당 가득

위 이미지를 통해 두 경우의 차이점을 발견하실 수 있기를 바랍니다.

선형 보간

시계열 데이터에는 다양한 변형이 있습니다. 채우기 및 전달 채우기를 사용하여 위의 대치 방법은 가능한 최상의 솔루션이 아닙니다. 구원을 위한 선형 보간!

여기서 값은 증가하거나 감소하는 값으로 채워집니다. 이는 데이터 포인트 간의 선형 관계를 플롯하려는 일종의 대체 기술입니다. 누락된 포인트를 계산하는 데 사용할 수 있는 null이 아닌 값을 사용합니다.

interpolated=df.interpolate(limit_direction="both") 인쇄(보간됨)

결측값의 선형 보간

이 값을 앞뒤 채우기와 비교하고 어느 것이 좋은지 직접 확인하십시오!

시계열 데이터에서 누락된 값을 처리하는 몇 가지 기본 방법은 다음과 같습니다.

누락된 값에 강력한 알고리즘

위의 어느 것도 제대로 작동하지 않는 경우가 있습니다. 그러나 분석을 수행해야 합니다. 그런 다음 결측값을 지원하는 알고리즘을 선택해야 합니다. KNN(K 최근접 이웃)은 그러한 알고리즘 중 하나입니다. 가장 가까운 K개 값의 대부분을 취하여 누락된 값을 고려합니다. Random Forest는 결측값이 있는 범주형 데이터에도 강력합니다. XGBoost, Catboost와 같은 많은 의사결정 트리 기반 알고리즘은 누락된 값이 있는 데이터를 지원합니다.

결론

요약하자면, 첫 번째 단계는 데이터를 탐색하고 어떤 변수에 누락된 데이터가 있는지, 백분율은 얼마인지, 어떤 범주에 속하는지 알아내는 것입니다. 그 후에는 어떤 방법을 시도할 수 있는지에 대한 전략적 아이디어를 갖게 될 것입니다. 유용한 팁은 선형 회귀 모델과 별도로 K개의 가장 가까운 이웃 알고리즘을 사용하여 대치를 시도하는 것입니다. 위의 방법이 작동하지 않는 경우 Datawig 또는 Hot-Deck Imputation 방법을 사용하는 것과 같이 찾아볼 수 있는 몇 가지 최신 방법이 있습니다.

당신이 읽었기를 바랍니다.

다음 주소로 저에게 연락하실 수 있습니다: [이메일 보호]

링크드 : 데이터 전처리

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

출처: https://www.analyticsvidhya.com/blog/2021/10/end-to-end-introduction-to-handling-missing-values/

타임 스탬프 :

더보기 분석 Vidhya