이번 글은 코드잇 강의를 수강하면서 배운 내용을 주로 하여 정리되어 있습니다. (코드잇 스프린트 데이터 애널리스트 트랙 1기 훈련생)
데이터 전처리
결측값 찾기
Pandas의 DataFrame에서 결측값을 찾는 방법은 여러 가지가 있으며, 이에 대한 방법을 밑에서 설명하도록 하겠습니다.
- 결측값 : 데이터셋에서 값이 누락되었거나 정의되지 않은 값 (NA, NaN, None)
info() 메소드 사용
info() 메서드는 DataFrame의 각 컬럼에 대한 요약 정보를 제공하기 때문에 요약 정보에 포함된 비결측값(non-null) 개수를 통해 결측값의 유무를 확인할 수 있습니다.
df.info()
isnull() 또는 isna() 메소드 사용
isnull() 메서드는 DataFrame이나 Series 내의 결측값을 True로, 결측값이 아닌 값을 False로 표시하는 동일한 형태의 DataFrame이나 Series를 반환합니다.
isna() 메서드는 isnull()의 별칭으로, 동일한 기능을 합니다.
# 결측값 확인하기
df.isnull()
df.isna()
결측값의 개수 확인하기
결측값의 개수를 세기 위해서는 sum() 메서드를 사용할 수 있습니다. sum() 메서드는 True 값을 1로 간주하여 결측값의 개수를 세는 데 유용합니다.
# 컬럼별 결측값의 개수를 확인하기
df.isnull().sum()
df.isna().sum()
결측값이 포함된 행 또는 열 찾기
결측값이 포함된 행이나 열을 찾기 위해 any() 메서드를 사용할 수 있습니다.
# 결측값이 포함된 행 찾기
df[df.isnull().any(axis=1)]
# 결측값이 포함된 열 찾기
df.loc[:, df.isnull().any(axis=0)]
결측값 확인하기 | df.isnull() |
컬럼별 결측값의 개수를 확인하기 | df.isnull().sum() |
결측값이 포함된 행 찾기 | df[df.isnull().any(axis=1)] |
결측값이 포함된 열 찾기 | df.loc[:, df.isnull().any(axis=0)] |
결측값 처리하기
결측값을 찾고나면 결측값을 처리해야 하며, 크게 결측값을 처리하는 방법에는 결측값을 삭제하거나 대체하는 2가지 방법이 있습니다.
우선 일반적으로 결측값 개수가 적어서 삭제해도 큰 영향을 주지 않는 경우나 컬럼이나 로우에 있는 값들이 거의 다 결측값인 경우에 결측값을 삭제하는 방법을 이용합니다.(삭제를 하는 방법은 분석할 수 있는 데이터의 양이 줄어든다는 단점을 가진다.)
그리고 결측값이 오류나 누락등으로 발생한 경우, 결측값을 데이터의 경향을 반영할 수 있는 값으로 채워주는 방법인 결측값 대체 방법을 이용하기도 합니다.
결측값 대체 방법을 사용할 때, 연속형 숫자 데이터를 대체하는 경우애는 평균이나 중간값을 많이 활용하며, 범주형 데이터는 최빈값을 주로 활용합니다.
# 결측값이 존재하는 행을 모두 제거하기
df = df.dropna()
# 컬럼이 숫자형 데이터인 경우, 평균으로 결측값을 채우기
df['column_name'] = df['column_name(numeric)'].fillna(df['column_name'].mean())
# 컬럼이 숫자형 데이터인 경우, 중간값으로 결측값을 채우기
df['column_name'] = df['column_name(numeric)'].fillna(df['column_name'].median())
# 컬럼이 범주형 데이터인 경우, 최빈값으로 결측값을 채우기
df['column_name'] = df['column_name(categoric)'].fillna(df['column_name'].mode())
결측값이 존재하는 행 제거하기 | df.dropna() |
결측값을 다른 값으로 채우기 | df.fillna() |
중복값 찾기
Pandas를 사용하여 DataFrame이나 Series에서 중복값을 찾기 위해서는 주로 duplicated() 메서드를 활용합니다.
- 중복값 : 데이터셋에서 동일한 값이 두 번 이상 나타나는 경우를 의미합니다.
duplicated() 메소드 사용
duplicated() 메서드는 각 행이 중복인지 아닌지를 나타내는 Boolean Series를 반환합니다.
이 메서드는 첫 번째로 나타나는 중복값은 False로, 그 이후로 나타나는 중복값은 True로 표시합니다.
# 각 행이 중복인지 아닌지를 나타내기
df.duplicated()
# 중복되는 행의 개수를 확인하기
df.duplicated().sum()
# 중복되는 행을 인덱싱으로 확인하기
df[df.duplicated()]
특정 열에서 중복값 찾기
특정 열에서 중복값을 찾고자 할 때는 subset 매개변수를 사용합니다.
# 특정 열 'A'에서 중복값이 있는지 아닌지를 나타내기
df.duplicated(subset='A')
# 특정 열 'A'에서 중복값이 있는 행을 인덱싱으로 출력하기
df[df.duplicated(subset='A')]
중복값을 처리할 때 어떤 항목을 유지할지 지정하기
keep 매개변수를 사용하여 어떤 항목을 유지할지 지정하는 경우에는 매개변수에 'first', 'last', False 와 같은 세 가지 값을 지정할 수 있습니다.
# keep='first'는 기본값으로, 첫 번째로 나타나는 중복값을 유지하고 이후에 나타나는 중복값들을 True로 표시하거나 제거합니다.
df[df.drop_duplicates(keep='first')]
# keep='last'는 마지막으로 나타나는 중복값을 유지하고 그 이전에 나타난 중복값들을 True로 표시하거나 제거합니다.
df[df.drop_duplicates(keep='last')]
# keep=False는 모든 중복값을 True로 표시하거나 제거합니다. 즉, 중복된 모든 항목을 제거합니다.
df[df.drop_duplicates(keep=False)]
각 행의 중복 여부를 확인하기 | df.duplicated() |
중복되는 행의 개수를 확인하기 | df.duplicated().sum() |
중복되는 행을 인덱싱으로 확인하기 | df[df.duplicated()] |
특정 열의 중복 여부를 나타내기 | df.duplicated(subset=’A') |
특정 열에서 중복값이 있는 행을 인덱싱으로 확인하기 | df[df.duplicated(subset='A')] |
중복값 처리하기
중복값을 찾아냈다면 중복값을 처리하는 과정 또한 필요하며, drop_duplicates() 메서드를 사용하면 중복값을 제거할 수 있습니다.
기본적으로 첫 번째로 나타나는 중복값은 유지되고, 그 이후의 중복값들이 제거됩니다.
# 중복값 제거하기
df = df.drop_duplicates()
# 특정 열 'A'에서 중복값을 제거하기
df = df.drop_duplicates(subset='A')
중복값 제거하기 | df.drop_duplicates() |
특정 열에서 중복값을 찾아 제거하기 | df.drop_duplicates(subset='A') |
이상점 찾기
데이터를 탐색하다보면 데이터의 값이 유독 크거나 작으며, 동떨어져 있는 값을 가끔 확인할 수 있는데 이를 이상점(Outlier)이라고 합니다.
- 이상점 : 데이터셋에서 다른 데이터 포인트들과 크게 다르거나 일관되지 않은 극단적인 값
데이터에 이상점이 포함되어 있는 경우, 데이터셋의 분석 결과가 왜곡될 수 있기 때문에 이상점을 탐지하고 처리하는 과정이 필수적으로 요구됩니다.
이러한 이상점을 찾는 방법은 여러 가지가 있으며, 이는 데이터의 분포와 특성에 따라 달라질 수 있습니다.
첫번째로, 시각화를 사용하여 이상점을 찾아낼 수 있습니다.
import matplotlib.pyplot as plt
# 박스플롯 생성
plt.boxplot(df['values'])
plt.show()
두번째로, 사분위수 범위(IQR)를 사용하여 이상점을 찾아낼 수 있으며, 이 방법이 보편적으로 사용됩니다.
(사분위수와 IQR에 대한 설명은 예전 글 2024.06.20 - [스프린트/위클리페이퍼] - [1주차]스프린트 DA 트랙 위클리 페이퍼(사분위수, 기술통계 및 추론통계) 에 자세히 설명되어 있습니다.)
# 데이터 예시
data = {'values': [10, 12, 14, 15, 18, 20, 21, 22, 23, 30, 35, 100]}
df = pd.DataFrame(data)
# IQR 계산
Q1 = df['values'].quantile(0.25)
Q3 = df['values'].quantile(0.75)
IQR = Q3 - Q1
# 이상점 정의
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상점 찾기
outliers = df[(df['values'] < lower_bound) | (df['values'] > upper_bound)]
print(outliers)
이상점 처리하기
탐지한 이상점을 처리하는 방법에는 크게 3가지가 있습니다.
첫번째로, 이상점이 오류로 발생한 것이 아니라 실제로 값이 크거나 작은 경우에는 제거하면 오히려 분석 결과에 큰 왜곡이 발생하기 때문에 이런 경우에는 이상점을 그대로 두는 경우가 있습니다.
두번째는 이상점을 평균, 중간값, 또는 다른 대체 값으로 바꾸는 방법입니다. 이는 데이터 손실을 최소화하고 분석을 계속할 수 있도록 하는 효과가 있습니다.
# 중간값 계산
median = df['values'].median()
# 이상점을 중간값으로 대체
values = df['values'].values
for i in range(len(values)):
if values[i] < lower_bound or values[i] > upper_bound:
values[i] = median
df['values'] = values
print(df)
마지막으로, 이상점이 분석에 부정적인 영향을 미치는 경우에 유용한 방법으로 이는 이상점을 완전히 제거하는 방법입니다.
# IQR을 사용한 이상점 제거
Q1 = df['values'].quantile(0.25)
Q3 = df['values'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상점 제거
df_no_outliers = df[(df['values'] >= lower_bound) & (df['values'] <= upper_bound)]
print(df_no_outliers)
Pandas에서 데이터 전처리를 위한 코드 리스트
결측값 확인하기 | df.isnull() |
컬럼별 결측값의 개수를 확인하기 | df.isnull().sum() |
결측값이 포함된 행 찾기 | df[df.isnull().any(axis=1)] |
결측값이 포함된 열 찾기 | df.loc[:, df.isnull().any(axis=0)] |
결측값이 존재하는 행 제거하기 | df.dropna() |
결측값을 다른 값으로 채우기 | df.fillna() |
각 행의 중복 여부를 확인하기 | df.duplicated() |
중복되는 행의 개수를 확인하기 | df.duplicated().sum() |
중복되는 행을 인덱싱으로 확인하기 | df[df.duplicated()] |
특정 열의 중복 여부를 나타내기 | df.duplicated(subset=’A') |
특정 열에서 중복값이 있는 행을 인덱싱으로 확인하기 | df[df.duplicated(subset='A')] |
중복값 제거하기 | df.drop_duplicates() |
특정 열에서 중복값을 찾아 제거하기 | df.drop_duplicates(subset='A') |
이상점 찾기 | 위 내용 참고 |
이상점 처리하기 | 위 내용 참고 |
이번 글에서는 Dataframe에서의 데이터 전처리 / 결측값 찾기 / 결측값 처리하기 / 중복값 찾기 / 중복값 처리하기 / 이상점 찾기 / 이상점 처리하기가 포함된 내용을 정리했으며, 파이썬에서 데이터 분석을 하거나 프로그래밍을 하는 사람들에게 알아두면 유용한 개념들로 이번 기회를 통해 다른 분들도 정리하면 좋을 것 같습니다.
글 읽어주셔서 감사합니다.
출처 및 참고자료 : 코드잇 사이트 강의 'DataFrame 마스터하기' https://www.codeit.kr/topics/mastering-dataframe
'프로그래밍 언어 > Python' 카테고리의 다른 글
[파이썬 개념 정리 14] Pandas의 DataFrame 마스터하기 4️⃣ (날짜와 시간 데이터 다루기) (0) | 2024.07.31 |
---|---|
[파이썬 개념 정리 13] Pandas의 DataFrame 마스터하기 3️⃣ (문자 데이터 가공하기, 숫자 데이터 가공하기) (0) | 2024.07.29 |
[파이썬 개념 정리 11] Pandas의 DataFrame 마스터하기 1️⃣ (DataFrame의 기본) (0) | 2024.07.28 |
[파이썬 개념 정리 10] 객체와 클래스 개념 정리 (0) | 2024.07.18 |
[파이썬 개념 정리 9] 맥 운영체제에서 파이썬 환경 구축 내용 정리 (0) | 2024.07.15 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!