4-1. 결측치 처리

Source: 이기복(2025), "진짜 업무에 쓴느 챗GPT 노코드 데이터 분석", 디지털북스

4-1-1.결측치 확인/시각화

각 컬럼별로 결측치를 '흑백 히트맵'으로 시각화해줘. 데이터가 존재하면 검은색, 결측치는 흰색.
흑백 히트맵
데이터 내 각 행과 열(레코드·칼럼)의 결측치 분포를 시각적으로 한눈에 살펴보는 그림임.
데이터를 가진 부분은 검은색
결측된(값이 없는) 부분은 흰색
전체 데이터 중 결측치가 많은 컬럼, 혹은 특정 행이 쉽게 구분됨
분석자가 빠르게 결측 패턴을 판단하고, 정제·보완이 필요한 칼럼과 레코드를 직관적으로 선택할 수 있음.
대규모 데이터 정제·탐색 단계에서 많이 활용되는 유용한 시각화 방법임.
결측치가 있는 컬럼별 정보 및 그에 대한 판단은 아래와 같습니다.
컬럼
결측 개수
비율
처리
Age
177
약 19.9%
승객 나이 ⇒ 중요 데이터 (나이에 따른 생존율 분석 등)
Cabin
687
약 77.1%
승객이 머물렀던 객실 번호 ⇒ 통계적으로 처리 어렵고, 상대적으로 중요 데이터 X
Embarked
2
약 0.2%
출발 항구 ⇒ 1% 미만으로 무시 가능

4-1-2. 결측치 처리 방법

1. 표본 제거 (Deletion)
방법: 결측값이 포함된 행(sample) 전체를 삭제하는 가장 단순하고 빠른 기법임.
적용: 주로 데이터 손실을 감수할 수 있거나, 결측치 비율이 10% 미만으로 매우 낮을 때 사용함.
2. 평균 대치법 (Mean Imputation)
방법: 결측값을 해당 변수(열)의 전체 평균값으로 대체하는 방식임.
장점: 적용이 간단하고 빠름.
단점: 데이터의 본래 분포를 왜곡시켜 변수 간의 관계를 약화시킬 위험이 있음.
3. 회귀 대치법 (Regression Imputation)
방법: 다른 변수와의 관계를 이용하여 회귀 모델을 수립하고, 그 모델로 결측값을 예측하여 채우는 기법임.
장점: 변수 간의 상관관계를 반영하므로 논리적이고 정확도가 높음.
단점: 회귀 모델의 가정에 따라 결과가 달라지며, 실제 분포와 다소 차이가 발생할 수 있음.
4. 다중 대치법 (Multiple Imputation)
방법: 통계적 방법을 통해 결측값을 여러 번 예측하여, 각기 다른 값을 가진 여러 개의 완성된 데이터셋을 생성하고, 그 결과를 적용하는 고급 기법임.
과정: 생성된 여러 데이터셋을 각각 분석한 후, 그 결과들을 통계적으로 통합하여 최종 결론을 도출함.
장점: 결측값의 불확실성을 결과에 반영하여 단일 대치법보다 훨씬 신뢰도 높은 분석이 가능함.
추가적인 방법들
방법
핵심 아이디어
언제 사용하면 좋은가?
중앙값/최빈값 대치
평균 대신 중앙값/최빈값으로 채우기
이상치가 많거나 범주형 데이터일 때
K-최근접 이웃(KNN)
가장 비슷한 이웃들의 값으로 채우기
변수 간 복잡한 관계가 있을 때 (머신러닝)
시계열 보간법
앞뒤 데이터의 추세로 채우기
주식, 기온 등 시간 순서가 중요할 때
딥러닝 모델
데이터의 복잡한 패턴을 학습하여 예측
매우 복잡하고 큰 데이터셋일 때 (전문가용)

4-1-3. 결측치 처리 전략

나이
성별·사회적 지위와 강하게 연관 → 그룹 평균 대체가 예측에 유리
Cabin (결측률 약 77%, 범주형 변수)
좌석 등급과 강한 상관 (부자일수록 생존률 높음)
하지만 결측률이 높아 직접 활용은 어렵다.
Embarked (결측률 약 0.2%, 범주형 변수)
탑승 항구는 사회경제적 배경을 반영 (예: C항은 상류층 비중 높음)
하지만 결측률이 낮아, 삭제 처리

4-1-4. 결측치 처리

다음의 결측치 전처리를 수행하고, **처리 전과 후의 각 칼럼별 결측치 개수**를 비교해서 보여줘. - `Cabin`: 'Unknown'으로 채우기 - `Age`: 전체 평균값으로 채우기 - `Embarked`: 결측치가 포함된 행 삭제
💬
gpt

🧩 전처리 요약

Cabin'Unknown'으로 결측치 모두 대체
Age → 전체 평균(약 29.7세)으로 결측치 대체
Embarked → 결측 2행 제거 (전체 행수: 891 → 889)
즉, 현재 데이터에는 결측치가 완전히 제거된 상태입니다.
PassengerId
Name
Age
Cabin
Embarked
1
Braund, Mr. Owen Harris
22.0
Unknown
S
3
Heikkinen, Miss. Laina
26.0
Unknown
S
5
Allen, Mr. William Henry
35.0
Unknown
S
6
Moran, Mr. James
29.699118 (→ 평균으로 대체)
Unknown
Q
8
Palsson, Master. Gosta Leonard
2.0
Unknown
S

4-1-4-1. 결측치 처리 - 다중 대치법

다중 대치법(Multiple Imputation)의 작동 원리
결측값이 있는 데이터를 여러 번(보통 5번 이상) 복사해 '결측 대체용 데이터 세트'를 여러 개 만듦
각 데이터 세트에서 결측값을 회귀모델 등 예측모델을 활용해 독립적으로 임의로 채움
이렇게 완성된 여러 데이터 세트에서 각각 분석을 수행하고, 이 분석 결과를 종합(평균 또는 통계적 통합)하여 최종 결론을 도출함
이 방식은 단건 단일값으로 대체할 때 생기는 불확실성과 편향을 크게 줄여줌
타이타닉 데이터의 나이(Age) 컬럼에 다중 대치법을 적용하면,
나이 결측 샘플마다 동일한 환경에서 여러 개의 예측값이 생성됨
예를 들어, 한 결측 샘플의 나이가 28.2, 26.7, 29.4, 27.1, 28.9 등으로 샘플별로 약간씩 다르게 예측되어 각 데이터세트에 채워짐
이 예측값들은 전체 데이터의 다른 변수(예: 직업, 성별, 동승 가족 수 등)값으로 회귀분석 등을 통해 결정됨
마지막엔 각 샘플별 대체값을 평균내거나 통계적으로 결합해, 보다 신뢰성 있는 결측치 보간 결과를 제공함
즉, 다중 대치법은 결측 데이터를 하나의 고정치로 채우지 않고, 여러 번 반복적이고 임의적(simulation)으로 예측·대체한 뒤 결과를 통합해 불확실성을 줄이고 데이터의 분포와 구조를 최대한 보존함.
타이타닉 데이터에서 'Age' 칼럼의 비어있는 값들을 **다중 대치법**으로 채워줘. 작업이 끝나면, 원래 나이가 비어있던 승객들만 골라서 새롭게 채워진 나이 값을 확인하고 싶어.
💬
gpt
다중 대치법(MICE 기반)을 이용해 Age 결측치를 보정한 결과,
원래 나이가 비어 있던 승객들의 일부는 다음과 같이 채워졌습니다 👇
PassengerId
Pclass
Sex
새로 채워진 Age
6
3
male
27.62
18
2
male
34.11
20
3
female
27.64
27
3
male
27.64
29
3
female
27.63
30
3
male
27.63
32
1
female
34.49
33
3
female
27.63
37
3
male
27.64
43
3
male
27.63
파일 다운로드 하기
4-1.titanic_train_processing.csv68.14KB

4-1-3-1. 결측치 처리 전략

결측치 처리 전략을 위해 아래와 같이 GPT에 문의해 볼 수 있음
BuT, ChatGPT와 논의하여 처리 전략을 수립하면서 결국 분석자가 도메인 지식을 활용하여 결정해야 하는 부분이 존재
승객 생존율을 예측하는 모델을 만들어보려고 해. 그런 관점에서 3개 컬럼의 결측치 처리 전략 제안해줘.
💬
아래는 Age, Cabin, Embarked 3개 컬럼을 **모델 학습 목적(생존 예측)**에 맞게 다루는 최적 전략입니다.

🚢 [1] Age (결측률 약 20%, 연속형 변수)

💡 생존 확률과 강한 상관 관계를 가짐
(어린이/여성 우선 탑승 정책 등)

🎯 모델 관점 제안

1.
Title(호칭) 추출 후 그룹별 평균 대체
Name에서 Mr, Mrs, Miss, Master 등 추출
나이 분포는 성별·사회적 지위와 강하게 연관 → 그룹 평균 대체가 예측에 유리
2.
Age를 구간화(Binning)하여 범주형 변수 추가
예: Child(≤12), Teen(13–19), Adult(20–59), Senior(≥60)
트리 기반 모델(Random Forest, XGBoost 등)에 유리

✅ 적용 예시 (Pandas)

df['Title'] = df['Name'].str.extract(' ([A-Za-z]+)\.', expand=False) df['Age'] = df.groupby(['Sex', 'Pclass', 'Title'])['Age'].transform(lambda x: x.fillna(x.median())) df['AgeGroup'] = pd.cut(df['Age'], bins=[0, 12, 19, 59, 80], labels=['Child', 'Teen', 'Adult', 'Senior'])

🛏️ [2] Cabin (결측률 약 77%, 범주형 변수)

💡 좌석 등급과 강한 상관 (부자일수록 생존률 높음)
하지만 결측률이 높아 직접 활용은 어렵다.

🎯 모델 관점 제안

1.
Cabin 존재 여부만 반영 (이진화)
"선실 정보를 가질 정도로 VIP였는가?" → 생존과 유의미한 연관성
Cabin_flag = 1 (선실 정보 있음), 0 (없음)
2.
선실 알파벳 추출 (가능하면 추가 변수로)
A, B, C 등은 모두 상류층 → Pclass보다 세분화된 사회적 계층 정보로 사용 가능
단, 결측이 많은 만큼 feature importance를 사후에 검증 필요

✅ 적용 예시

df['Cabin_flag'] = df['Cabin'].notnull().astype(int) df['Cabin_initial'] = df['Cabin'].str[0].fillna('U') # U = Unknown

⚓ [3] Embarked (결측률 약 0.2%, 범주형 변수)

💡 탑승 항구는 사회경제적 배경을 반영 (예: C항은 상류층 비중 높음)

🎯 모델 관점 제안

1.
최빈값 대체 (S항)
결측이 2건뿐이라 영향 미미
그대로 최빈값으로 채운 후 One-Hot Encoding 적용

✅ 적용 예시

df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)

📊 종합 요약: "생존율 예측 모델" 관점 최적 전략

컬럼
결측률
처리 전략
생성 파생 변수
모델 활용 포인트
Age
19.9%
성별·계층별 중앙값 대체
AgeGroup, Title
연령대별 생존률 반영
Cabin
77.1%
존재 여부 이진화 + 선실 알파벳 추출
Cabin_flag, Cabin_initial
상류층 여부 지표
Embarked
0.2%
최빈값(S) 대체
출항지별 사회계층 반영
📈 이렇게 전처리한 데이터는 RandomForest, XGBoost, LightGBM등의 모델에서
생존 여부(Survived) 예측 시 매우 좋은 feature set을 제공합니다.
원하신다면,
→ 이 전략을 코드로 실제 적용하고
모델 학습용 데이터셋(train-ready version)으로 정리해드릴까요?
(예: titanic_train_preprocessed.csv)
Contact : azureguy@empal.com / azureguy@cau.ac.kr