데이터 정제: 타입 변환, 결측치 처리, 중복 제거
8강. 데이터 정제: 타입 변환, 결측치 처리, 중복 제거
1. 이번 강의에서 해결할 문제
결측을 임의로 0으로 채우거나 중복을 모두 지우면 실제 패배·낮은 점수와 품질 문제를 섞게 됩니다. 각 처리의 근거와 순서를 코드로 남겨야 합니다.
2. 학습 목표
3. 핵심 개념
정제는 값 변경이므로 규칙과 손실량을 기록해야 합니다. 이 예제는 session_id 첫 행을 보존하고, 1~180분 밖 기록은 분석 범위에서 제외하며, score 결측은 같은 game_mode의 중앙값으로 채웁니다. 이는 학습용 가정이며 실제 서비스에서는 원천 시스템 재수집이 우선입니다.
4. 단계별 실습
1. 예제 파일 작성
실행 환경: 코드 편집기
실행 위치: C:\dev\game-data-lab
실행 전 확인: 기존 파일이 있으면 내용을 덮어쓰지 말고 Git diff로 이번 강의 변경 범위를 확인합니다. 실제 개인정보·API Key·토큰은 사용하지 않습니다.
대상 파일: src/clean_sessions.py
from pathlib import Path
import pandas as pd
source = pd.read_csv("data/raw/game_sessions.csv")
df = source.copy()
df["match_date"] = pd.to_datetime(df["match_date"], errors="coerce")
for column in ["play_minutes", "score", "win"]:
df[column] = pd.to_numeric(df[column], errors="coerce")
df = df.drop_duplicates(subset="session_id", keep="first")
df = df[df["play_minutes"].between(1, 180)].copy()
mode_median = df.groupby("game_mode")["score"].transform("median")
df["score"] = df["score"].fillna(mode_median)
df = df.dropna(subset=["session_id", "player_id", "match_date", "score"])
Path("data/processed").mkdir(parents=True, exist_ok=True)
df.to_csv("data/processed/game_sessions_clean.csv", index=False, date_format="%Y-%m-%d")
print({"before": len(source), "after": len(df), "missing": int(df.isna().sum().sum())})
2. 실행과 결과 확인
실행 환경: Windows PowerShell
실행 위치: C:\dev\game-data-lab
실행 전 확인: Python 코드는 프로젝트의 .venv 인터프리터를 사용하고 입력 파일 경로가 존재하는지 확인합니다.
대상: src/clean_sessions.py과 이 강의가 만드는 출력
Set-Location C:\dev\game-data-lab
.\.venv\Scripts\python.exe .\src\clean_sessions.py
Import-Csv .\data\processed\game_sessions_clean.csv | Measure-Object
예상 결과: 원본 12행에서 중복과 범위 위반이 제외된 10행의 정제 CSV가 생성되고 결측 합계가 0입니다.
5. 분석 또는 모델이 동작하는 이유
errors="coerce"는 변환 실패를 결측으로 드러내 숨은 문자열 오류를 찾게 합니다. 중앙값은 극단값의 영향을 평균보다 덜 받지만, 모드별 표본이 충분한지 확인해야 합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
데이터 정제: 타입 변환, 결측치 처리, 중복 제거 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.