Home [오픈 소스 기반 데이터 분석] 7강 - 데이터 전처리
Post
Cancel

[오픈 소스 기반 데이터 분석] 7강 - 데이터 전처리

💡해당 게시글은 방송통신대학교 정재화 교수님의 '오픈 소스 기반 데이터 분석' 강의를 개인 공부 목적으로 메모하였습니다.



학습 개요


  • 데이터 분석 과정에서는 분석 대상 데이터의 품질과 구조가 분석 결과의 신뢰도에 결정적인 영향을 미침
  • 특히 결측치나 이상치와 같은 데이터 오류가 존재할 경우, 분석 모델의 성능 저하뿐만 아니라 왜곡된 인사이트 도출로 이어질 수 있음
  • 따라서 전처리 단계에서의 체계적인 문제 진단과 해결 전략은 필수적임
  • Pandas 라이브러리를 활용하여 결측치, 이상치, 오류 값 등의 데이터를 탐지하고 처리하는 데이터 정제 기법을 학습함
  • 시각화 도구를 통해 결측치와 이상치의 분포를 파악하고, 통계 기반 기법을 활용하여 이상치를 판별하는 방법을 실습함
  • 데이터 문제 해결 전략으로서 제거, 대치, 보간 등의 다양한 기법을 비교하고, Pandas의 다양한 메소드를 이용한 데이터 전치리 기법에 대해 학습함



학습 목표


  • 결측치와 이상치를 탐지하고 적절한 방법으로 처리할 수 있음
  • 날짜 데이터 특성에 대해 이해할 수 있음
  • 여러 출처의 데이터를 통합하여 분석에 활용할 수 있는 형태로 만들 수 있음



강의록


pandas를 이용한 데이터 정제

데이터 정제

  • 데이터 정제(data cleansing)의 정의
    • 결측치, 이상치, 중복 값, 오류 값 등 데이터 분석에 방해가 되는 불완전하거나 부정확한 데이터를 탐지하고 수정 · 제거하는 과정
    • 대표적으로 데이터 전처리 과정에서 수행
  • 주로 결측치, 이상치를 식별하고 적절하게 처리하는 과정으로 구성
    • 결측치
      • 결측치는 데이터에 값이 존재하지 않는 상태
    • 이상치
      • 일반적인 범위를 벗어난 특이한 값

결측치 찾기

  • Pandas에서는 결측치는 NaN(Not a Number)로 표현
    • NumPy에 포함
  • Pandas의 isnull(), isna() 메소드
    • 각 요소가 결측치인지 여부를 나타내는 불리언 값을 반환
    • sum() 메소드와 결합, DataFrame 내 결측치 개수 파악
    • any() 메소드와 결합
      • DataFrame내 결측치 포함 여부 파악
      • 결측치의 완전한 처리 여부 파악
  • notnull() 메소드
    • isnull()의 반대 결과를 제공

시각화를 통한 결측치 찾기

  • 히트맵
    • seaborn 라이브러리의 heatmap() 함수 사용
    • 변수 간의 결측치 관계를 한눈에 확인

    image.png

  • 매트릭스
    • missingno 라이브러리의 matrix() 함수 사용
    • 데이터의 누락 여부를 행렬 형태로 표현

    image.png

이상치 찾기

  • 통계적 방법
    • IQR(사분위범위), Z-Score 등의 통계 값 사용
  • 시각적 방법
    • 박스플롯, 산점도 등의 그래프 사용

    image.png

IQR(Interquartile Range)를 이용한 이상치 찾기

  • 사분위수를 기준으로 하여 데이터 분포의 중심 50% 범위를 계산하고, 이 범위를 벗어나는 데이터를 이상치로 간주하는 방식
  • 비정규 또는 이상치가 많은 데이터에 적합

image.png

IQR을 통한 이상치 탐색 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
점수_데이터 = [72, 68, 75, 282, 64, 31, 78, 69, 88, 92, 22, 84, 61,-90, 130, 66]
학번_데이터 = list(range(1001, 1001 + len(점수_데이터)))
df = pd.DataFrame({ '학번': 학번_데이터, '점수': 점수_데이터})

q1 = df['점수'].quantile(0.25)
q3 = df['점수'].quantile(0.75)
iqr = q3 - q1 # IQR 계산
하한값 = q1 - 1.5 * iqr # 하한 경계값
상한값 = q3 + 1.5 * iqr # 상한 경계값

print("IQR 통계량:")
print(f"Q1 (25% 지점): {q1:.2f}")
print(f"Q3 (75% 지점): {q3:.2f}")
print(f"IQR(Q3 - Q1): {iqr:.2f}")
print(f"하한 경계값 (Q1 - 1.5 * IQR): {하한값:.2f}")
print(f"상한 경계값 (Q3 + 1.5 * IQR): {상한값:.2f}")

Z-Score(Z-점수)를 이용한 이상치 찾기

  • 정규분포를 가정하고 각 데이터가 평균으로부터 얼마나 떨어져 있는지를 표준편차 단위로 측정하는 방식
  • 정규분포에서 강력하나 평균/표준편차에 민감
    • Z-Score = (데이터 값 - 평균) / 표준편차

    image.png

Z-score를 통한 이상치 탐색 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
점수_평균 = df['점수'].mean()
점수_표준편차 = df['점수'].std()
df['점수_Z'] = (df['점수'] - 점수_평균)/ 점수_표준편차

	threshold = 2
df['이상치여부'] = df['점수_Z'].abs() > threshold

print("학생 성적 Z-score 분석 결과:")
print("=" * 50)
print(df)
print("\n이상치로 판별된 데이터:")
print("=" * 50)
print(df[df['이상치여부'] == True])
이상치_비율 = df['이상치여부'].mean() * 100
print(f"\n이상치 비율: {이상치_비율:.2f}%")

pandas를 이용한 데이터 문제 해결

데이터 문제 해결 전략

  • 데이터의 특성, 문제의 유형, 분석 목적, 그리고 데이터의 크기 등 여러 요소를 고려하여 선택
  • 주요 문제 해결 전략
    • 제거: 결측치나 이상치를 포함하는 행/열을 삭제
      • dropna() 메소드를 사용하여 행이나 열을 제거
      • 정보의 손실 가능성으로, 데이터셋의 규모가 작거나 결측치가 특정 패턴을 가지고 있는 경우 사용에 신중
    • 대치: 결측치나 이상치를 적절한 값으로 대체
      • 데이터 손실을 최소화하면서 데이터의 활용도 향상
    • 보간
      • 주변 데이터 포인트의 관계를 이용하여 결측치를 추정

대치 전략

대체 방법 설명 적용 대상
평균 값 대치 결측치를 해당 열의 평균 값으로 대체 연속형 변수
중앙 값 대치 결측치를 해당 열의 중앙 값으로 대체 연속형 변수
최빈 값 대치 결측치를 해당 열에서 가장 빈번하게 나타나는 값으로 대체 범주형 변수
특정 값 대치 결측치를 사용자가 지정한 특정 값으로 대체 모든 유형
전방/후방 채우기 이전/이후 관측 값으로 결측치를 대체 시계열 데이터
k-최근접 이웃 대치 유사한 샘플을 기반으로 결측치를 추정 다변량 관계가 있는 데이터

보간 전략

보간 방법 설명 특징 및 장단점
선형 보간 결측치 전후의 두 데이터 포인트를 직선으로 연결하여 추정 기본 보간 방법으로 간단하고 계산이 빠름, 그러나 급격한 변화가 있는 데이터에서는 부정확
다항식 보간 주변 데이터 포인트를 다항식으로 근사하여 추정 더 부드러운 추정이 가능하나, 과적합 위험이 있음
스플라인 보간 여러 개의 다항식을 연결하여 결측치를 추정 복잡한 패턴을 더 잘 포착할 수 있으나 계산 비용이 높음
시간 기반 보간 시계열 데이터에서 시간 간격을 고려하여 보간 시간 간격을 반영할 수 있어 시계열 데이터에 적합하지만, 일정한 간격이 아닌 경우 부정확

pandas 데이터 값 변경 메소드

  • replace()
    • 특정 값을 다른 값으로 바꿀 때 사용
  • map()
    • 각 요소에 함수나 딕셔너리를 적용하여 값을 변경
  • apply()
    • 데이터의 각 요소에 함수를 적용할 때 사용
  • loc 인덱서
    • 특정 조건을 만족하는 행이나 열을 선택하고, 값을 변경
  • where()
    • 특정 조건을 만족하는 값만 유지하거나, 다른 값으로 변경

pandas 데이터 값 변경의 예

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd

data = {'age': [25, 30, None, 22, 35],
        'score': [90, 85, None, 80, 92],
        'city': ['Seoul', None, 'Incheon', 'Seoul', 'Daejeon']}
df = pd.DataFrame(data)

df['city'] = df['city'].replace('Seoul', '서울')
df['age_str'] = df['age'].map(lambda x: f" {x}" if pd.notna(x) else "알수없음")

print("\nmap함수를 이용한 age 변경:\n",df['age_str'])
df.loc[df['score'] < 90, 'score'] = 90
df['age_where'] = df['age'].where(df['age']>=30, other=0)

날짜 데이터 다루기

  • 데이터 분석을 시작 전, 모든 날짜 데이터를 일관된 형식으로 변환
    • 국가, 조직, 문화별로 다른 날짜 표현 식 및 패턴을 사용
    • 윤년이나 월별 일수 차이와 같은 복잡한 특성
    1
    2
    3
    4
    5
    6
    7
    8
    
      date_str = ['2025-07-01', '2025-08-01', '2025-09-01']
      df_date = pd.DataFrame({'date_str':date_str})
        
      df_date['date'] = pd.to_datetime(df_date['date_str'])
      df_date['month'] = df_date['date'].dt.month
      df_date['weekday'] = df_date['date'].dt.day_name()
      df_date['date_ymd'] = df_date['date'].dt.strftime('%Y년 %월 %d일')
      df_date['date_weekday'] = df_date['date'].dt.strftime('%A, %Y-%m-%d')
    

개념 정리 실습

  • Kaggle의 “Store Sales - Time Series Forecasting” 데이터셋을 활용하여 데이터 전처리 과정 수행
  • Kaggle은 데이터 과학 플랫폼으로, 데이터 과학자들이 경쟁하고 지식을 공유하는 생태계

    | 단계 | 주요 내용 | 사용 도구 / 방법 | | — | — | — | | 1. 데이터 로드 및 측정 | - kaggle 가입 및 API 키 발급

    • 데이터셋 다운로드
    • 데이터 구조 파악 - pandas 라이브러리
    • describe(), info() 메서드      
        2. 결측치 처리 - 결측치 탐지 및 보간법 적용 - isnull(), isna() 함수
    • interpolate() 메서드      
        3. 이상치 처리 - 이상치 탐지 및 처리 - IQR 방법
        4. 날짜 데이터 처리 - 날짜 형식 변환  
    • 날짜 특성 추출 - to_datetime() 함수
    • dt 접근자      
        5. 데이터 통합 - 다양한 데이터셋 병합 - merge() 함수
  • 데이터 통합
    • 서로 다른 DataFrame을 결합
    • merge() 메소드는 SQL의 JOIN과 유사한 방식으로 두 DataFrame을 특정 키를 기준으로 결합

    image.png



연습 문제


  1. 결측치가 분석에 미치는 영향에 대한 설명으로 가장 적절한 것은?

    a. 결측치가 많을수록 예측 모델의 정확도는 일반적으로 낮아질 수 있다

  2. 다음 중 결측 값이 발생하는 일반적인 원인으로 보기 어려운 것은?

    a. 데이터 수집 방식이 통계적 모델 기반일 경우

    • 결측 값이 발생하는 일반적인 원인
      • 사용자의 입력 누락
      • 시스템 장애나 오류
      • 질문이 대상자에게 적용되지 않을 때
  3. merge() 메소드를 사용하는 주요 목적은?

    a. 서로 다른 DataFrame을 기준 열을 바탕으로 병합



정리 하기


  • 데이터 문제 해결 방법은 다양하며, 상황에 맞는 적절한 방법을 선택해야 함
  • 데이터 전처리는 많은 시간과 노력이 소모되므로 효율적인 전략이 중요함
  • describe(), info() 함수를 통해 데이터의 기술 통계량과 구조를 파악함
  • isnull(), isna() 함수를 사용하여 결측치를 탐지함
  • interpolate(), fillna() 함수를 사용하여 결측치를 처리함
  • IQR 방식이나 Z-점수를 활용하여 이상치를 탐지하고 처리함
  • to_datetime() 함수와 dt 접근자를 사용하여 날짜 데이터를 변환하고 속성을 추출함
  • merge() 함수를 사용하여 데이터셋을 통합함
Contents

[클라우드 컴퓨팅] 6강 - 클라우드 컴퓨팅 기술

[클라우드 컴퓨팅] 7강 - 클라우드 컴퓨팅 기술