Data Science

데이터 과학에서의 데이터 정리

Read this post in other languages:

지금까지 이 데이터 과학 블로그 시리즈에서는 데이터를 어디에서 얻고, pandas로 데이터를 어떻게 탐색하는지 논의했습니다. 하지만, 그러한 데이터는 학습하기에는 좋지만 실제 데이터와는 차이가 있습니다. 학습용 데이터는 빠르게 학습할 수 있도록 이미 정리되고 선별된 경우가 많아 데이터 정리가 필요 없는 경우가 많지만, 실제 데이터에는 여러 문제가 있으며 정리가 잘 되어 있지 않습니다. 실제 데이터에서는 유용한 인사이트를 얻기 전에 정리가 필요합니다. 이 블로그 글에서는 바로 그 주제를 다뤄보겠습니다. 

데이터 문제는 데이터 자체의 특성, 데이터 수집 방식, 심지어 데이터 입력 방식에서 비롯될 수 있습니다. 실수와 간과는 여정의 모든 단계에서 발생할 수 있습니다. 

여기서는 특히 데이터 변환이 아닌 데이터 정리에 대해 이야기해 보고자 합니다. 데이터 정리는 데이터로부터 도출한 결론이 정의된 모집단으로 일반화될 수 있도록 하는 것입니다. 반면 데이터 변환은 데이터 형식 변환, 데이터 정규화 및 데이터 집계와 같은 작업을 포함합니다. 

데이터 정리가 중요한 이유

데이터세트에서 가장 먼저 이해해야 할 것은 그것이 나타내는 바가 무엇인지입니다. 대부분의 데이터세트는 더 넓은 모집단을 대표하는 표본으로, 이 표본으로 작업하면서 모집단에 대한 결과를 추론(또는 일반화)할 수 있습니다. 예를 들어, 이전 두 개의 블로그 게시물에서 사용한 데이터세트는 주택 매매 전반에 관한 것이지만, 지리적으로 매우 제한된 지역과 짧은 기간만을 다루며, 해당 지역과 기간 내의 모든 주택(더 큰 모집단에 대한 표본)이 포함되지 않았을 수 있습니다. 

데이터는 특정 기간 동안 해당 지역의 모든 주택 매매와 같이 더 넓은 모집단을 대표하는 표본이어야 합니다. 데이터가 더 넓은 모집단을 대표하는 표본이 되도록 하려면 먼저 모집단의 경계를 정의해야 합니다. 

인구조사 데이터를 제외하면, 전체 인구로 작업하는 것이 비현실적인 경우가 많으므로 경계를 어디로 설정할지 정할 필요가 있습니다. 이러한 경계는 지리적, 인구통계학적, 시간 기반, 행동 기반(예: 거래 관련) 또는 산업별 기준일 수 있습니다. 모집단을 정의하는 방법은 여러 가지가 있지만, 데이터를 안정적으로 일반화하려면 데이터를 정리하기 전에 반드시 이 작업을 수행해야 합니다.

요약하면, 분석이나 머신러닝에 데이터를 사용할 계획이라면 데이터를 정리하는 데 시간을 투자해야 인사이트를 신뢰하고 이를 현실에 맞게 일반화할 수 있습니다. 데이터를 정리하면 더 정확한 분석이 가능하며, 머신러닝의 경우 성능도 향상됩니다.

데이터를 정리하지 않으면 알게 된 바를 더 넓은 모집단에 안정적으로 일반화할 수 없고, 요약 통계 및 시각화가 부정확해지는 문제 등이 발생할 수 있습니다. 데이터를 사용해 머신러닝 모델을 트레이닝하는 경우, 오류와 부정확한 예측이 발생할 수도 있습니다.

PyCharm Professional 무료로 사용해 보기

데이터 정리의 예

데이터 정리에 사용할 수 있는 5가지 작업을 살펴보겠습니다. 완벽한 목록은 아니지만 실제 데이터를 다룰 때 시작점으로 삼기에 좋습니다.

데이터 중복 제거

중복은 데이터를 왜곡할 수 있기 때문에 문제가 됩니다. 판매 가격의 빈도를 사용하는 히스토그램을 그린다고 가정해 보겠습니다. 동일한 값이 중복되는 경우 중복된 가격을 기준으로 부정확한 패턴을 가진 히스토그램을 만들게 됩니다. 

부연 설명하자면, 데이터세트에서 중복이 문제된다고 할 때, 이는 단일 관측값으로 구성된 각 행이 모두 중복되었음을 의미합니다. 열에도 중복된 값이 있을 수 있지만, 이는 예상할 수 있는 현상입니다. 지금 논의하고 있는 것은 중복된 관측값입니다. 

다행히도, 데이터에서 중복된 항목이 있는지 탐지하는 데 사용할 수 있는 pandas 메서드가 있습니다. 다음과 같은 프롬프트로 알림이 필요한 경우 JetBrains AI 채팅을 사용할 수 있습니다.

중복 행을 식별하는 코드

다음은 결과 코드입니다.

duplicate_rows = df[df.duplicated()]
duplicate_rows

이 코드에서는 DataFrame의 이름이 df라고 가정하므로, DataFrame의 이름이 다르다면 해당 이름으로 변경해야 합니다. 

여기서 사용되는 Ames Housing 데이터세트에는 중복된 데이터가 없지만, 시도해 보고 싶다면 CITES Wildlife Trade 데이터베이스의 데이터세트를 살펴보고 위의 pandas 메소드를 사용하여 중복 항목을 찾을 수 있는지 확인해 보세요.

데이터세트에서 중복된 항목을 찾았다면 결과가 왜곡되지 않도록 이를 제거해야 합니다. JetBrains AI에 다음과 같은 프롬프트를 입력하여 해당 코드를 다시 가져올 수 있습니다.

내 DataFrame에서 중복을 삭제하는 코드 

결과 코드에서는 중복을 삭제하고 DataFrame의 색인을 초기화한 다음 df_cleaned라는 새 DataFrame으로 표시합니다.

df_cleaned = df.drop_duplicates()
df_cleaned.reset_index(drop=True, inplace=True)
df_cleaned

더 정확한 고급 중복 관리를 위해 사용할 수 있는 다른 pandas 함수도 있지만, 이 정도면 데이터세트 중복 제거를 시작하는 데 충분합니다.

타당해 보이지 않는 값 처리하기

데이터가 잘못 입력되었거나 데이터 수집 과정에서 문제가 발생한 경우 타당해 보이지 않는 값이 나올 수 있습니다. Ames Housing 데이터세트의 경우, 타당해 보이지 않는 값은 음수인 SalePrice 값이나 숫자인 Roof Style 값일 수 있습니다.

데이터세트에서 타당해 보이지 않는 값을 찾아내려면 다각적인 접근 방법이 필요합니다. 여기에는 요약 통계를 확인하거나, 각 열에 대해 수집기가 정의한 유효성 검사 규칙을 확인하고 이를 벗어나는 데이터 포인트를 식별하거나, 시각화를 활용하여 패턴을 분석하고 이상치로 보이는 데이터를 탐지하는 것이 포함됩니다. 

타당해 보이지 않는 값은 분석에 노이즈를 추가하고 문제를 일으킬 수 있으므로 반드시 처리해야 합니다. 그러나 이러한 값을 어떻게 처리할지는 다소 주관적인 판단에 따라 달라질 수 있습니다. 데이터세트의 크기에 비해 타당해 보이지 않는 값이 많지 않다면, 해당 값을 포함하는 기록을 제거하는 것이 좋은 방법일 수 있습니다. 예를 들어, 데이터세트의 214번째 행에서 타당해 보이지 않는 값을 발견했다면, pandas의 drop 함수를 사용하여 데이터세트에서 해당 행을 제거하면 됩니다. 

다시 한 번, 다음과 같은 프롬프트를 사용하여 JetBrains AI가 필요한 코드를 생성하도록 할 수 있습니다. 

#df_cleaned에서 색인 214를 삭제하는 코드

PyCharm의 Jupyter Notebook에서는 단어 앞에 # 기호를 붙이면 JetBrains AI Assistant에 추가 컨텍스트를 제공한다는 의미가 되며, 이 경우 DataFrame의 이름은 df_cleaned입니다.

결과 코드는 DataFrame에서 다음과 같이 해당 관측값을 제거하고 색인을 초기화하여 표시합니다.

df_cleaned = df_cleaned.drop(index=214)
df_cleaned.reset_index(drop=True, inplace=True)
df_cleaned

타당해 보이지 않는 값을 처리하기 위해 많이 쓰는 전략은 전치입니다. 즉, 정의된 전략에 따라 해당 값을 다른 적절한 값으로 대체하는 것입니다. 가장 일반적인 전략 중 하나는 타당해 보이지 않는 값 대신 중앙값을 사용하는 것입니다. 중앙값은 이상치의 영향을 받지 않기 때문에 데이터 과학자가 이런 목적에서 선택하는 경우가 많지만, 마찬가지로 데이터의 평균 또는 최빈값이 상황에 따라 더 적절할 수도 있습니다. 

또는 데이터세트 및 데이터 수집 방법에 대한 도메인 지식이 있는 경우, 타당해 보이지 않는 값을 더 의미 있는 값으로 대체할 수도 있습니다. 데이터 수집 프로세스에 관여했거나 알고 있는 경우 이 옵션이 적합할 수 있습니다. 

타당해 보이지 않는 값을 처리하는 방법은 데이터세트에서 해당 값의 빈도, 데이터 수집 방법, 모집단을 정의하는 방법 및 도메인 지식과 같은 기타 요인에 따라 달라집니다. 

데이터 서식 지정

데이터의 형태를 파악하기 위해 수행하는 요약 통계 또는 초기 시각화에서 서식 지정 문제가 종종 발생합니다. 일관되지 않은 서식 지정의 몇 가지 예로, 숫자 값이 모두 동일한 소수점 자리로 정의되어 있지 않거나 철자가 ‘first’나 ‘1st’처럼 달라지는 경우를 들 수 있습니다. 잘못된 데이터 서식 지정은 데이터의 메모리 사용량에도 영향을 미칠 수 있습니다.

데이터세트에서 서식 지정 문제를 확인하면 값을 표준화해야 합니다. 직면한 문제에 따라, 일반적으로 자체 표준을 정의하고 변경 사항을 적용해야 합니다. 여기서도 pandas 라이브러리에는 round와 같은 몇 가지 유용한 함수가 있습니다. SalePrice 열을 소수점 둘째 자리까지 반올림하려는 경우 JetBrains AI에 코드를 다음과 같이 요청할 수 있습니다.

SalePrice를 소수점 둘째 자리까지 반올림하는 코드

결과 코드는 다음과 같이 반올림을 수행한 후 처음 10개의 행을 출력하므로 유효성 확인이 가능합니다.

df_cleaned['SalePrice'] = df_cleaned['SalePrice].round(2)
df_cleaned.head()

또 다른 예로 철자가 일관되지 않을 수 있습니다. 예를 들어 HouseStyle 열에 ‘1Story’와 ‘OneStory’가 모두 있지만 이 둘의 의미가 같다는 것을 알 수 있습니다. 다음 프롬프트를 사용하여 해당 코드를 얻을 수 있습니다.

#HouseStyle에서 모든 #OneStory 인스턴스를 #1Story로 변경하는 코드

결과 코드는 정확히 이 작업을 수행하며 다음과 같이 OneStory의 모든 인스턴스를 1Story로 대체합니다.

df_cleaned[HouseStyle'] = df_cleaned['HouseStyle'].replace('OneStory', '1Story')

이상치 처리

이상치는 데이터세트에서 매우 흔하지만, 이상치를 처리할지 여부와 처리 방법은 맥락에 크게 좌우됩니다. 이상치를 발견하는 가장 쉬운 방법 중 하나는 seabornmatplotlib 라이브러리를 사용하는 박스 플롯을 적용하는 것입니다. 이전에 작성한 pandas를 활용한 데이터 탐색 블로그 게시물에서 박스 플롯에 대해 설명했으니 빠르게 복습이 필요하다면 참고하시기 바랍니다. 

이 박스 플롯을 위해 Ames 주택 데이터세트의 SalePrice를 살펴보겠습니다. 다시 한 번, 다음과 같은 프롬프트에 따라 JetBrains AI를 사용하여 코드를 생성해 보겠습니다.

#SalePrice의 박스 플롯을 생성하는 코드

다음은 실행해야 할 결과 코드입니다.

import seaborn as sns
import matplotlib.pyplot as plt

# Create a box plot for SalePrice
plt.figure(figsize=(10, 6))
sns.boxplot(x=df_cleaned['SalePrice'])
plt.title('Box Plot of SalePrice')
plt.xlabel('SalePrice')
plt.show()

박스 플롯을 보면, 파란색 박스 안의 세로 중앙선이 중심보다 왼쪽에 위치해 있기 때문에 양의 왜도를 가지고 있음을 알 수 있습니다. 양의 왜도를 가진다는 것은 저렴한 가격대에 더 많은 주택 가격이 분포하고 있음을 의미하며, 이는 그다지 놀라운 일은 아닙니다. 박스 플롯은 또한 오른편에 이상치가 많다는 것을 시각적으로 보여주고 있습니다. 이는 중간 가격대보다 훨씬 더 높은 주택 수는 적다는 것을 의미합니다.

소수의 주택이 대부분의 주택보다 더 높은 가격대를 형성하는 것이 일반적이므로 이러한 이상치도 수긍할 만합니다. 그러나 이는 모두 일반화하고자 하는 모집단과 데이터에서 도출하고자 하는 결론에 따라 달라집니다. 모집단에 포함되는 것과 포함되지 않는 것에 대해 명확히 경계를 설정하면 데이터의 이상치가 문제가 될지 여부에 있어 정보에 입각한 결정을 내릴 수 있습니다. 

예를 들어, 모집단이 고가의 저택을 구매하지 않는 이들로 구성되어 있다면 이러한 이상치를 삭제해도 됩니다. 반면, 모집단의 인구 통계가 이러한 고가 주택을 구매할 가능성이 있는 사람들을 포함한다면, 해당 데이터를 유지하는 것이 적절할 수 있습니다. 이는 해당 데이터가 모집단과 관련성이 있기 때문입니다.

이상치를 파악하는 방법으로 박스 플롯에 대해 이야기했지만, 분산형 차트 및 히스토그램과 같은 다른 옵션을 통해서도 데이터 이상치 여부를 빠르게 파악할 수 있으며, 이를 기반으로 조치가 필요한지 신중한 결정을 내릴 수 있습니다.

이상치를 처리하는 방법은 일반적으로 두 가지 카테고리 즉, 이상치를 삭제하거나 이상치에 영향을 덜 받는 요약 통계를 사용하는 방법으로 나뉩니다. 첫 번째 경우에는 이상치가 어느 행인지 정확히 알아야 합니다. 

지금까지는 이상치를 시각적으로 식별하는 방법에 대해서만 논의했습니다. 어떤 관측값이 이상치인지 아닌지 판단하는 방법에는 여러 가지가 있습니다. 한 가지 일반적인 접근 방식은 수정된 Z 점수라는 방법을 사용하는 것입니다. Z 점수가 수정되는 방식과 그 이유를 살펴보기 앞서, 다음을 통해 정의를 살펴보겠습니다.

Z 점수 = (데이터 포인트 값평균) / 표준 편차

이상치 감지를 목적으로 Z 점수를 수정하는 이유는 평균과 표준 편차가 계산 방식의 특성상 이상치의 영향을 받기가 쉽기 때문입니다. 수정된 Z 점수는 다음과 같이 정의됩니다.

수정된 Z 점수 = (데이터 포인트 값중앙값) / 중앙 절대 편차

요약 통계를 논의할 때 확인한 바와 같이, 중앙값은 이상치의 영향을 받지 않습니다. 중앙 절대 편차는 데이터세트의 각 값이 중앙값과 얼마나 차이가 나는지를 절대값으로 변환한 후, 이들의 중앙값을 구한 값입니다. 예를 들어, 데이터세트가 다음과 같다고 가정해 보겠습니다.

1, 2, 2, 2, 3, 3, 3, 5,9

그렇다면 중앙값은 데이터세트의 중앙에 위치한 값인 3이 됩니다. 중앙값 3으로부터의 편차는 주어진 순서대로 다음과 같습니다.

2, 1, 1, 1, 0, 0, 0, 2, 5

이 값을 오름차순으로 정렬하면 다음과 같습니다.

0, 0, 0, 1, 1, 1, 2, 2, 5

즉, 이 예시에서의 중앙 절대 편차는 1이 됩니다.

그렇다면 SalePrice 데이터세트에 대해 수정된 Z 점수를 어떻게 계산할 수 있을까요? JetBrains AI에 다음과 같은 프롬프트를 제공해 보겠습니다.

입력 내용:

수정된 Z 점수 = (데이터 포인트 값 – 중앙값) / 중앙 절대 편차

#SalePrice의 수정된 Z 점수를 계산해 줘

그러면 다음과 같은 코드가 생성됩니다.

import pandas as pd
from scipy.stats import median_abs_deviation


# Assuming 'data' is your DataFrame and it contains the 'SalePrice' column


# Calculate the median for the SalePrice column
median_sale_price = data['SalePrice'].median()


# Calculate the Median Absolute Deviation (MAD) for the SalePrice column
mad_sale_price = median_abs_deviation(data['SalePrice'], scale='normal')


# Calculate the Modified Z-scores for the SalePrice column
data['Modified_Z_Score'] = (data['SalePrice'] - median_sale_price) / mad_sale_price


# Display the first few rows with the Modified Z-scores
print(data[['SalePrice', 'Modified_Z_Score']].head())

필요한 패키지를 설치하고 이 코드를 실행하면 절반 정도 진행되었음을 알 수 있지만, 이제 수정된 Z 점수를 기반으로 SalePrice의 이상치를 결정해야 합니다. 여기서 일반 상식으로는 이상치가 3 이상이거나 -3 이하지만, 대부분의 통계적 결정에서와 마찬가지로 데이터세트에 맞춰 조정할 수 있으며 그렇게 해야 한다는 점에 유념하세요. <=-3 however, it’s worth noting that like most statistical decisions, it can and should be tailored to your dataset. 

JetBrains AI에 또 다른 프롬프트를 전달하여 출력을 더 조정해 보겠습니다.

#Modified_Z_Score가 3 이상이거나 -3 이하인 값들만 나열해 줘

이제 코드 스니펫을 가져와서 위의 해당하는 행으로 대체하겠습니다.

# Filter the rows where the Modified Z-score is 3 or above, or -3 or below
outliers = data[(data['Modified_Z_Score'] >= 3) | (data['Modified_Z_Score'] <= -3)]


# Print all the filtered rows, showing their index and SalePrice
outliers = (outliers[['SalePrice', 'Modified_Z_Score']])
outliers

이 코드를 수정하여, 이상치를 outliers라고 하는 새 DataFrame에 저장하고 출력하여 확인해 보겠습니다. 

다음 단계는 이상치를 DataFrame에서 제거하는 것입니다. JetBrains AI에 다음과 같은 프롬프트를 사용하여 코드를 생성할 수 있습니다.

이상치를 제외한 새 DataFrame을 생성합니다. 

data_without_outliers = data.drop(index=outliers.index)


# Display the new DataFrame without outliers
print(data_without_outliers)

새 DataFrame인 data_without_outliers에는 SalePrice 변수에서 이상치로 간주된 값이 제외되어 있습니다. 

이제 박스 플롯 코드를 업데이트하면 새 DataFrame을 확인할 수 있습니다. 예상한 바와 같이, 여전히 양의 왜도를 보여주지만 이상치로 간주되는 값은 제거되었습니다.

import seaborn as sns
import matplotlib.pyplot as plt


# Create a box plot for SalePrice
plt.figure(figsize=(10, 6))
sns.boxplot(x=data_without_outliers['SalePrice'])
plt.title('Box Plot of SalePrice')
plt.xlabel('SalePrice')
plt.show()

마치기 앞서, SalePrice를 기준으로 이상치로 간주되어 DataFrame에서 제거된 관측값이 전체에서 차지하는 비중을 확인해 보겠습니다.

다음과 같은 프롬프트를 사용할 수 있습니다.

#data와 #data_without_outliers 간에 제거된 관측값의 비율을 계산해 줘

# Calculate the number of observations in the original and filtered DataFrames
original_count = len(data)
filtered_count = len(data_without_outliers)

# Calculate the number of removed observations
removed_count = original_count - filtered_count

# Calculate the percentage of observations removed
percentage_removed = (removed_count / original_count) * 100

# Display the percentage
print(f"Percentage of observations removed: {percentage_removed:.2f}%")

PyCharm에서는 5.67%의 관측값이 제거되었다고 표시합니다.

앞서 언급한 것처럼, 이상치를 유지하는 경우, 이상치에 영향을 덜 받는 중앙값사분위 범위 등의 요약 통계 값을 사용하는 것이 좋습니다. 정의한 모집단 및 도출하려는 결론과 관련이 있어 제거하지 않은 이상치가 포함된 데이터세트로 작업하는 경우, 이러한 측정값을 사용하여 결론을 도출하는 것을 고려할 수 있습니다.

결측치

데이터세트에서 결측치를 빠르게 찾는 방법은 요약 통계를 활용하는 것입니다. 다시 말하자면, DataFrame에서 오른쪽의 Show Column Statistics(열 통계 표시)를 클릭한 다음 Compact(콤팩트)를 선택합니다. Ames Housing 데이터세트의 Lot Frontage 열에서 결측치가 빨간색으로 표시된 것을 확인할 수 있습니다.

현재 데이터에서 고려해야 할 결측치 유형에는 세 가지가 있습니다.

  • 완전 무작위 결측
  • 무작위 결측
  • 비무작위 결측

완전 무작위 결측

완전 무작위 결측이란 데이터가 순전히 우연한 이유로 누락되었으며, 결측이 발생한 사실이 데이터세트의 다른 변수와 관련이 없는 경우를 의미합니다. 설문조사에서 응답자가 단순히 실수로 특정 질문에 답하지 않은 경우 등이 이에 해당합니다. 

완전 무작위 결측 데이터는 드물게 일어나지만, 가장 처리하기 쉬운 데이터이기도 합니다. 비교적 적은 수의 관측값이 완전 무작위 결측치인 경우, 가장 일반적인 접근 방식은 해당 관측값을 삭제하는 것입니다. 이렇게 해도 데이터세트의 무결성과 도출하려는 결론에 영향을 미치지 않으므로 삭제하는 것이 좋습니다. 

무작위 결측

무작위 결측에는 패턴이 있지만, 측정한 다른 변수를 통해 그 패턴을 설명할 수 있습니다. 예를 들어, 데이터 수집 방식 때문에 누군가가 설문조사 질문에 응답하지 않은 경우가 있습니다.

Ames 주택 데이터세트를 다시 생각해 보면, Lot Frontage 변수의 결측 데이터가 특정 부동산 중개업체를 통해 판매된 주택에서 더 자주 발생할 수 있습니다. 그런 경우, 이러한 결측치는 일부 중개업체의 일관되지 않은 데이터 입력 방식 때문일 수 있습니다. 그렇다고 한다면, Lot Frontage 데이터가 누락된 이유는 해당 부동산 중개업체의 데이터 수집 방식 즉, 관측할 수 있는 특성과 관련이 있는 것이지, Lot Frontage 자체와 관련 있는 것이 아닙니다. 

무작위 결측 데이터를 다룰 때는 데이터가 누락된 원인을 아는 것이 중요하며, 여기에는 종종 데이터 수집 방식을 조사하는 과정도 포함됩니다. 일단 결측이 발생한 이유를 알았다면, 이후 처리 방법을 결정할 수 있습니다. 무작위 결측치를 해결하는 가장 일반적인 방법 중 하나는 해당 값을 보간하는 것입니다. 이미 타당해 보이지 않는 값에 대해 이 방법을 다루었지만, 이는 결측 데이터에 대해서도 유효한 전략입니다. 정의된 모집단과 도출하려는 결론에 따라 다양한 옵션을 선택할 수 있습니다. 예를 들어 주택 크기, 건축 연도 및 판매 가격과 같은 상관 변수를 사용할 수 있습니다. 결측 데이터의 패턴을 이해하면, 맥락적 정보를 활용해 데이터를 보간할 수 있으며, 이는 데이터세트 내 변수 간의 관계를 유지하는 데 도움이 됩니다.  

비무작위 결측

비무작위 결측은 결측 데이터가 관측되지 않은 데이터와 관련이 있는 경우를 의미합니다. 즉, 결측의 발생 확률이 관측되지 않은 데이터에 의존하는 경우입니다. 

마지막으로 Ames 주택 데이터세트로 돌아가 Lot Frontage의 결측 데이터를 살펴보겠습니다. 비무작위 결측의 한 가지 예는, 판매자가 Lot Frontage 면적이 작다고 판단하여 이를 의도적으로 보고하지 않는 경우입니다. 해당 사실을 공개하면 주택의 판매 가격이 낮아질 수 있기 때문입니다. Lot Frontage 데이터의 결측 가능성이 대지 접면의 면적 자체(관측되지 않은 값)에 의존한다면,
즉, 대지 접면 면적이 작을수록 해당 정보가 보고될 가능성이 낮다면, 이는 결측 발생이 결측된 값 자체와 직접적으로 관련이 있다는 의미입니다.

결측치 시각화

데이터 결측이 발생할 때마다 패턴이 있는지 확인해야 합니다. 패턴이 있다면 데이터를 일반화하기 전에 해결해야 할 문제가 있을 수 있습니다. 

결측 패턴을 찾는 가장 쉬운 방법 중 하나는 히트맵 시각화입니다. 코드를 살펴보기 전에 결측치가 없는 변수를 제외해 보겠습니다. 이 코드를 요청하기 위해 JetBrains AI에 다음 프롬프트를 입력할 수 있습니다.

결측치가 있는 열만 포함하는 새 DataFrame을 생성하는 코드 

다음은 해당 코드입니다.

# Identify columns with any missing values
columns_with_missing = data.columns[data.isnull().any()]

# Create a new DataFrame with only columns that have missing values
data_with_missingness = data[columns_with_missing]

# Display the new DataFrame
print(data_with_missingness)

이 코드를 실행하기 전에, PyCharm의 깔끔한 DataFrame 레이아웃을 활용할 수 있도록 마지막 줄을 변경하세요.

data_with_missingness

이제 히트맵을 생성할 차례입니다. 다시 한 번, JetBrains AI에 다음과 같은 프롬프트를 사용할 수 있습니다.

전치된 #data_with_missingness의 히트맵을 생성해 줘

다음은 결과 코드입니다.

import seaborn as sns
import matplotlib.pyplot as plt


# Transpose the data_with_missingness DataFrame
transposed_data = data_with_missingness.T


# Create a heatmap to visualize missingness
plt.figure(figsize=(12, 8))
sns.heatmap(transposed_data.isnull(), cbar=False, yticklabels=True)
plt.title('Missing Data Heatmap (Transposed)')
plt.xlabel('Instances')
plt.ylabel('Features')
plt.tight_layout()
plt.show()

가시성이 떨어져, 히트맵 인수에서 cmap=’viridis’를 제거했습니다. 

이 히트맵을 통해 동일한 변수가 여러 행에 걸쳐 누락되어 결측 패턴이 있을 수 있음을 알 수 있습니다. 한 그룹에서는 Bsmt Qual, Bsmt Cond, Bsmt Exposure, BsmtFin Type 1 및 Bsmt Fin Type 2가 모두 동일한 관측치에서 누락된 것을 볼 수 있습니다. 다른 그룹에서는 동일한 관측치에서 Garage Type, Garage Yr Bit, Garage Finish, Garage Qual 및 Garage Cond가 모두 누락된 것을 볼 수 있습니다.

이러한 변수는 모두 지하실 및 차고와 관련이 있지만, 결측치가 없는 다른 지하실 또는 차고 관련 변수도 있습니다. 한 가지 가능한 설명은, 데이터를 수집할 때 부동산 중개업체마다 차고와 지하실에 대한 질문이 달랐고, 모든 중개업체가 데이터세트에 있는 수준으로 상세하게 기록하지 않았기 때문일 수 있습니다. 이러한 시나리오는 직접 수집하지 않은 데이터에서 흔히 발생합니다. 데이터세트의 결측에 대해 자세히 알고 싶은 경우 데이터 수집 방법을 탐색할 수 있습니다.

데이터 정리를 위한 모범 사례

앞서 언급했듯이, 데이터 정리를 위한 모범 사례 목록에서 모집단을 정의하는 것은 매우 중요합니다. 데이터 정리를 시작하기 전에 달성하려는 목표와 데이터를 일반화할 방법을 파악해야 합니다. 

모든 방법이 재현 가능하도록 해야 합니다. 재현 가능성은 데이터 정리에도 직결되기 때문입니다. 재현할 수 없는 상황은 이후에 큰 영향을 미칠 수 있습니다. 그렇기 때문에 특히 정리를 할 때는 마크다운 기능을 활용해 모든 단계의 의사 결정을 문서화하면서 Jupyter Notebook을 깔끔하고 순차적으로 유지하는 것이 좋습니다. 

데이터를 정리할 때는 점진적으로 작업하고, 원본 CSV 파일이나 데이터베이스가 아닌 DataFrame을 수정하며, 재현 가능하고 잘 문서화된 코드로 모든 작업을 수행해야 합니다.

요약

데이터 정리는 큰 주제이며, 다양한 문제가 있을 수 있습니다. 데이터세트가 클수록 정리 과정 역시 까다로워집니다. 결측치를 제거하거나 보간하는 과정에서 절충점을 고려하고, 데이터가 처음부터 왜 누락되었는지 파악하는 동시에, 결론을 더 광범위하게 일반화할 수 있도록 모집단을 염두에 두어야 합니다. 

자기 자신을 데이터의 목소리라고 생각해도 좋습니다. 데이터의 여정과 모든 단계에서 데이터 무결성을 어떻게 유지해 왔는지 여러분이 잘 알기 때문입니다. 여러분이야말로 그 여정을 문서화하고 다른 사람들과 공유할 수 있는 최적의 적임자입니다. 

PyCharm Professional 무료로 사용해 보기

게시물 원문 작성자

Helen Scott

Helen Scott

image description

Discover more