# 4-1. 결측치 처리

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

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

```
각 컬럼별로 결측치를 '흑백 히트맵'으로 시각화해줘.
데이터가 존재하면 검은색, 결측치는 흰색.
```

![Image](https://upload.cafenono.com/image/slashpageHome/20251008/081144_UmtaXRGkMhaJ2MYfHm?q=80&s=1280x180&t=outside&f=webp)

- 흑백 히트맵

    - 데이터 내 각 행과 열(레코드·칼럼)의 결측치 분포를 시각적으로 한눈에 살펴보는 그림임.

        - 데이터를 가진 부분은 검은색

        - 결측된(값이 없는) 부분은 흰색

        - 전체 데이터 중 결측치가 많은 컬럼, 혹은 특정 행이 쉽게 구분됨

        - 분석자가 빠르게 결측 패턴을 판단하고, 정제·보완이 필요한 칼럼과 레코드를 직관적으로 선택할 수 있음.

        - 대규모 데이터 정제·탐색 단계에서 많이 활용되는 유용한 시각화 방법임.

        - 결측치가 있는 컬럼별 정보 및 그에 대한 판단은 아래와 같습니다.

| 컬럼 | 결측 개수 | 비율 | 처리 |
| --- | --- | --- | --- |
| `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.csv

---

### 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`)

For the site tree, see the [root Markdown](https://slashpage.com/lion.md).
