2025.11.18 TIL (본캠프, 22일차)
SQL 코드카타가 점점 어려워지고 있다는걸 느끼고 있다. 그리고 오늘은 Python의 데이터 전처리의 핵심인 데이터 결측치, 이상치 처리하는것을 학습하였다. 지금까지의 학습이 얼마나 깊이 있는지를 체감하는 날이기도 했다.
Level 5부터는 문제 난이도가 확실히 올라갔다. 어제까지는 1시간에 10문제를 풀 수 있었지만, 오늘은 겨우 5문제만 풀 수 있었다.단순히 "시간이 부족해서"가 아니라 "각 문제가 더 복잡해졌기 때문"이다.
아침에 풀지 못한 2문제는 점심 시간을 활용해서 풀었다.
이 과정에서 느낀 것은:
- 생각을 하고 풀어도 틀릴 수 있다
- 수정과 실행을 반복하면서 배운다
- 시간이 오래 걸리지만, 그 시간이 실력이 된다
결과적으로 오늘의 목표(5문제 해결)는 달성했다. 비록 예상 시간보다 오래 걸렸지만, 목표를 달성한 것 자체가 중요하다. (나와의 약속이기 때문에...)
수정 실행을 반복하다 보니 시간이 훨씬 오래 걸렸지만, 문제 해결 능력이 향상되고 있다고 생각한다.
단순히 "정답을 맞히는 것"과 "왜 틀렸는지 이해하고 수정하는 것"은 완전히 다르다. 후자가 진정한 학습이다.
오늘 수업은 어려웠다. 수업 내용의 완전히 이해되지 않았다. (나만 그런것일까....)
데이터 분석에서 가장 시간이 오래 걸리는 부분은 "분석"이 아니라 "전처리"다.
- 원본 데이터는 절대 완벽하지 않다
- 이상치(Outliers)가 있을 수 있다
- 결측치(Missing Values)가 있을 수 있다
- 형식이 맞지 않을 수 있다
- 중복된 데이터가 있을 수 있다
이런 모든 문제를 해결하는 과정이 전처리다. 데이터 분석가의 시간 중 70~80%가 전처리에 보낸다는 이야기도 있었다.
01. 이상치, 결측치란?
- 결측치(Missing Values): 데이터가 없는 경우 (NaN, NULL, 공백)
- 이상치(Outliers): 정상 범위를 벗어난 극단적인 값
나이: [25, 30, 28, 32, 999, 26] # 999는 이상치
나이: [25, 30, NaN, 32, 28, 26] # NaN은 결측치
02. 결측치
결측치를 다루는 방법:
- 제거하기: 결측치가 있는 행/열을 삭제
- df.dropna() # 결측치가 있는 모든 행 삭제 df.dropna(subset=['Age']) # Age 컬럼의 결측치만 확인해서 삭제
- 채우기: 결측치를 특정 값으로 대체
- df.fillna(0) # 0으로 채우기 df.fillna(df.mean()) # 평균값으로 채우기 df.fillna(method='ffill') # 이전 값으로 채우기
- 보간: 통계적 방법으로 추정
- df.interpolate() # 선형 보간
03. 이상치
이상치를 탐지하고 처리하는 방법:
- 통계적 방법: IQR(사분위수) 이용
- Q1 = df['Age'].quantile(0.25) Q3 = df['Age'].quantile(0.75) IQR = Q3 - Q1 # 이상치 범위: Q1 - 1.5*IQR ~ Q3 + 1.5*IQR lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR
- Z-score 방법: 표준편차를 이용한 탐지
- from scipy import stats z_scores = np.abs(stats.zscore(df['Age'])) outliers = z_scores > 3 # 3 표준편차 이상
- 시각화: 이상치를 눈으로 확인
- df.boxplot() # 박스플롯으로 이상치 시각화
오늘 배운 내용을 조금이라도 이해하기 위해 늦은 밤까지 복습을 해야겠다.....
오늘의 목표:
- SQL: Level 5 진입, 아침 1시간 + 점심 시간의 노력으로 5문제 해결
- Python: 이상치와 결측치 전처리 학습, 절반의 이해
결측치와 이상치는 복습이후 다시 TIL정리를 해야겠다..