[Python] 파이썬_데이터 분석 과정의 결측치 처리

2025. 4. 22. 11:10·Python/데이터 분석을 위한 Python

 

 


 

 

데이터 분석을 위한 Python

 

✔️ 데이터분석

✔️ 데이터전처리

✔️ 결측치 처리

 

 


 

 

✔️ 데이터분석

 

 

 

 

KDD 분석 방법론

KDD 분석 방법론
1. 데이터셋 선택 : CSV, EXCEL, DB에서 데이터를 읽어옴
2. 데이터 전처리 : 데이터타입, 결측치처리, 이상치탐지, 데이터분포분석, 상관관계
3. 데이터 변환(특성추출) : 원본 데이터에서 새로운 데이터 생성, 삭제, 스케일링, 구간화 등
4. 데이터 마이닝(모델 만들기, 분석) : 분석에 적합한 알고리즘 선택, 모델 생성/튜닝
5. 결과 평가(인사이트 도출) : 테스트 데이터를 이용해 데이터 마이닝으로 만든 모델의 성능 평가
 

titanic_train.csv

 

www.kaggle.com

 

 

 

 

데이터셋 선택 및 로딩

import pandas as pd
import numpy as np

# 위에서 다운로드 받은 titanic_train.csv파일 활용
# .head()를 활용하여 데이터셋 확인(.tail() 활용 가능)
data = pd.read_csv('./data/taitanic_train.csv')
data.head()

 

 

 

 

컬럼명, 결측치, 데이터 타입 파악

# 데이터가 너무 커서 Non-Null이 표시되지 않는 경우 : show_counts=True

# 데이터셋의 각 컬럼 값 확인
# 데이터 전체 수를 파악하고 전체 수를 불러오지 못하는 경우 확인(결측치 존재 컬럼)
# 각 컬럼에 따른 데이터 타입 확인
data.info()

 

 

 

 

기초통계량 파악(이상치 파악에 활용)

# 기초 통계량 파악 가능(숫자형(Numeric) 자료만 확인 가능)
# 기초 통계량을 보며 평균과 중앙값의 차이가 많이 나는지 확인
# 최소, 최대값을 보며 평균에 영향을 주는 요인이 있는지 확인
# 이상치 여부를 확인하기 전에 어떤 컬럼이 이상치를 가지는지 대략적으로 파악 가능
data.describe()

 

 


 

 

✔️ 데이터전처리

 

 

 

 

데이터전처리 과정

데이터 전처리
데이터 타입 변환
결측치 탐지 및 보간
이상치 탐지 및 처리
데이터 특성 파악(치우침, 분포 특성)
변수들 간의 상관관계 분석

 

 

 

 

결측치 확인 및 결측치 차지하는 비율 확인

# 컬럼별 결측치 확인
# data.isna().sum()

# 컬럼별 결측치가 차지하는 비율 확인
data.isna().sum() / len(data) * 100

 

 

 

 

결측치 처리

결측치가 차지하는 비율을 기준으로 판단
5% 미만 : 행 단위 제거(분석에 큰 영향을 주지 않으므로 단순 제거)
5% 이상 30% 미만 : 결측치 대체
수치형 데이터 : 평균, 중앙값, 최빈값(.mode)으로 대체 가능 / 문자형 데이터 : 최빈값으로 대체 가능
30% 이상 50% 미만 : 컬럼의 중요도 판단 후 대체 또는 제거 진행(KNN Imputer,  회귀모델 기반 예측 등으로 판단)
50% 이상 : 해당 컬럼 삭제(데이터 손실이 크기 때문에 유의미한 결과를 나타낼 수 없음)
# Embarked : 5% 미만이므로 결측치 대체나 행을 제거
# Age : 결측치 대체
# Cabin : 해당 컬럼 삭제

# 컬럼별 결측치가 차지하는 비율 확인
data.isna().sum() / len(data) * 100

 

 


 

 

✔️ 결측치 처리

 

 

 

 

결측 데이터 종류

MCAR(완전 무작위 결측)
다른 변수와는 아무런 상관 관계 없이 무작위로 발생한 결측치
결측 자체가 데이터 분포를 왜곡하지 않음
예) 설문 조사 중 참가자가 임의로 문항을 건너뛴 경우

MAR(무작위 결측)
결측치가 다른 변수와는 연관 있지만 본인의 결측 변수 값과는 무관
데이터 일부(나이, 성별 등)와 연관된 결측 패턴(다른 변수 정보 이용해 결측값 예측/대치 가능)
예) 직업에 따라 학력란에 응답하지 않은 경우(가정환경, 소득 등)

NMAR(비무작위 결측)
결측 자체가 해당 변수 값과 직접적으로 연관되어 발생하는 결측치
결측 패턴이 복잡하고, 외부 정보만으로 예측 어려움(모델링 단계에서 특정 보정 기법 필요)
예) 만족도가 낮은 고객이 만족도 조사에 응하지 않은 경우

 

 

 

 

결측치 처리 방법

단순대치법(simple imputation)

1. 완전 분석(자주 사용하지 X)
결측치가 있는 모든 행 삭제, 결측이 없는 완전한 자료만으로 분석
결측치를 삭제해도 모델 만드는데 문제가 없는 충분히 많은 데이터 존재하는 경우 사용
결측치를 삭제한 후 데이터에 편향이 없다는 전제가 있는 경우 사용

2. 평균 대치법
결측값이 있는 컬럼을 평균(mean)으로 대체
데이터 분포에 심각한 이상치가 없는 경우 사용(평균에 영향을 줄 수 있기 때문)
데이터 분포에 이상치가 있는 경우는 중앙값이나 최빈값 대체 고려
빠르고 간편하게 결측을 대체하고 싶은 경우 사용

 

 

 

 

완전 분석

# 결측치를 모두 제거
data2 = data.copy()
data2.dropna()

# 제거되고 남은 행 : 183
# 전체 데이터셋의 수 중에서 남은 데이터셋이 차지하는 비율 확인
# 20% 정도는 너무 적기 때문에 해당 데이터셋에는 적합하지 않음
183 / len(data2) * 100

 

 

 

 

평균 대치법

import matplotlib.pyplot as plt

# 이상치가 없는 경우와 있는 경우를 생성
a = pd.Series([24, 5, 10, 34, 20, 18, 28, 23]) # 이상치가 없는 경우
b = pd.Series([24, 5, 10, 34, 20, 18, 28, 2000]) # 이상치가 있는 경우

# 각 평균을 확인(이상치가 존재하는 경우 평균에 영향을 준다는 사실 확인)
print('a의 평균값 = ',a.mean())
print('b의 평균값 = ',b.mean())

# 이상치가 존재하는지 확인하기 위해 박스수염 그래프로 확인
# 너무 크거나 작은 이상치는 평균에 영향을 줌
plt.subplots(figsize = (5, 2.7))
plt.boxplot(b)

 

 

# 이상치가 존재하는 경우는 평균 대치 어려움
# 각 데이터 오름차순 정렬
print(sorted(b))
print(sorted(a))
print()

# 중앙값으로 대체해도 괜찮다고 판단
# 중앙값 확인
print('a의 중앙값 = ', np.median(a))
print('b의 중앙값 = ', np.median(b))

 

 

 

 

타이타닉의 Age 컬럼을 평균 대치법으로 대치

# Age 컬럼의 결측치 확인
print(data['Age'].isna().sum())
print()

# Age 컬럼의 통계량 확인
print(data['Age'].describe())

 

 

# Age 컬럼에서 결측치가 존재하는 행의 인덱스만 추출하여 저장
age_na_idx = data[data['Age'].isna()].index

# 평균값으로 대체 및 결측치 존재 행만 추출하여 확인(평균값으로 대체되었음을 확인)
data['Age'] = data['Age'].fillna(data['Age'].mean())
data.loc[age_na_idx, ['Age']]

 

 


 

 

이번 내용에서는 데이터 분석 과정의 결측치 처리에 대해 알아보았습니다.

데이터 분석을 하기 위해서는 가장 꾸준히 공부해야 하는 언어는 파이썬(Python)이라고 생각합니다.

앞으로 꾸준히 파이썬(Python) 내용을 공부하고 정리할테니 파이썬 코딩에 도움이 되었으면 좋겠습니다.

 

 

데이터 분석과 관련된 다양한 정보들이 확인하고 싶다면

관심 있는 분들은 방문해서 좋은 정보 얻어가시길 바랍니다.

 

ECODATALIST

데이터 분석 공부 열심히 하는 중😁

everyonelove.tistory.com

 

반응형

'Python > 데이터 분석을 위한 Python' 카테고리의 다른 글

[Python] 파이썬_파이썬의 데이터의 종류와 이상치(outlier) 탐지 및 처리  (5) 2025.04.30
[Python] 파이썬_중앙값과 최빈값을 활용한 결측치 대체 및 scikit-learn 활용 결측치 대체  (0) 2025.04.24
[Python] 파이썬_파이썬 Matplotlib를 활용한 라인/산점도/히스토그램/막대 그래프 생성  (0) 2025.04.21
[Python] 파이썬_파이썬 Matplotlib를 활용한 그래프 생성  (0) 2025.04.21
[Python] 파이썬_파이썬의 데이터프레임 합치기와 중복된 행 제거  (0) 2025.04.21
'Python/데이터 분석을 위한 Python' 카테고리의 다른 글
  • [Python] 파이썬_파이썬의 데이터의 종류와 이상치(outlier) 탐지 및 처리
  • [Python] 파이썬_중앙값과 최빈값을 활용한 결측치 대체 및 scikit-learn 활용 결측치 대체
  • [Python] 파이썬_파이썬 Matplotlib를 활용한 라인/산점도/히스토그램/막대 그래프 생성
  • [Python] 파이썬_파이썬 Matplotlib를 활용한 그래프 생성
DAILYSEEKER
DAILYSEEKER
데이터 분석 공부 열심히 하는 중😁
  • DAILYSEEKER
    ECODATALIST
    DAILYSEEKER
  • 전체
    오늘
    어제
  • 글쓰기 관리자
    • DATA (224)
      • SQL (18)
        • SQLD (3)
        • 데이터 분석을 위한 MySQL (5)
        • 혼자 공부하는 SQL (10)
      • Python (39)
        • 데이터 분석을 위한 Python (32)
        • 데이터 분석을 위한 데이터 스크래핑 (4)
        • 데이터 분석 프로젝트 (3)
      • 기획 (3)
        • 서비스 기획 (1)
        • 기업 분석 (2)
      • Frontend(프론트엔드) (22)
        • 데이터 분석을 위한 웹 개발 언어 (9)
        • 자바스크립트 (13)
        • 타입스크립트 (0)
      • 코딩 테스트 (86)
        • 프로그래머스_MySQL (86)
      • Data Driven (12)
        • 코드 없이 배우는 데이터 분석 (6)
        • Excel (5)
      • UI & UX (24)
        • 피그마(Figma) (24)
      • BDA 학회 (20)
        • BDA학회_8기 (4)
        • BDA학회_9기 (16)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
DAILYSEEKER
[Python] 파이썬_데이터 분석 과정의 결측치 처리
상단으로

티스토리툴바