이 페이지의 목차
데이터 정제와 관리
코드 예제: Python · 예상 50분
학습 목표
- 수집한 데이터에서 필요한 부분을 골라 정제하고 저장할 수 있다.
관련 성취기준
- [12소생03-02]
데이터 유형에 따라 적합한 방법으로 데이터를 수집하고, 목적에 맞게 처리하고 관리한다.
생각 열기 — 4월 평균 대여는 몇 건일까
새솔시 담당자가 4월 기록 파일을 받아 평균 대여 건수를 냈더니 5,030건이 나왔다. 그런데 4월에 가장 많이 빌린 날도 3,293건이었다. 무슨 일일까?
bike_raw.csv 새솔시 공유 자전거 4월 기록 — 막 모은 상태
정제란
데이터 정제(data cleaning) — 모은 데이터에서 빠진 값·틀린 값·겹친 값·필요 없는 부분을 찾아 고치거나 지워 분석할 수 있게 다듬는 일는 분석하기 전에 데이터를 다듬는 일이다. 있어야 할 자리에 값이 빠진 것을 결측치(missing value) — 있어야 할 자리에 값이 빠진 것. 빈칸, 다른 값들과 동떨어진 값을 이상치(outlier) — 다른 값들과 동떨어진 값. 기계 오류일 수도, 진짜 특별한 날일 수도 있다라고 한다. 실제 데이터 분석에서 가장 많은 시간을 쓰는 일이 바로 정제라는 말이 있을 만큼 중요하다.
| 문제 | 예 | 어떻게 처리하나 |
|---|---|---|
| 필요 없는 부분 | 「기록한사람」·「메모」 열 | 분석 목적에 쓰지 않는 열은 뺀다. 사람 이름이 든 열은 개인 정보이기도 하다 |
| 중복 | 4월 9일이 두 줄 | 하나만 남긴다 — 그대로 두면 그날이 두 번 세어진다 |
| 형식이 틀린 값 | 평균기온 칸의 「12.4도」 | «도»를 떼어 숫자로 바꾼다 — 고칠 수 있으면 고친다 |
| 결측치(빈칸) | 기온 센서가 꺼진 날의 빈칸 | 그 줄을 지우거나, 평균 같은 값으로 채운다 — 무엇을 골랐는지 기록한다 |
| 이상치(튀는 값) | 대여 건수 99999 | 오류인지 확인하고, 오류면 거른다 — 진짜 특별한 날(축제 날)이면 지우지 않는다 |
직접 정제해 보기
아래 실험실에서 단계 단추를 눌러 4월 기록을 다듬어 보자. 표의 문제 칸이 색으로 보이고, 위쪽 숫자가 모두 초록이 되면 정제가 끝난 것이다. 누른 단계는 판다스 코드가 되어 아래에 쌓인다.
① 필요 없는 열 빼기
분석 목적(날씨와 대여의 관계)에 쓰지 않는 열은 뺀다. 쓰지 않는 열이 많으면 헷갈리고, 사람 이름이 든 열은 개인 정보다.
② 중복 행 지우기
같은 날이 두 번 들어가면 그날이 두 번 세어진다.
③ 단위가 섞인 값 고치기
「12.4도」는 사람 눈에는 숫자지만 컴퓨터에게는 글자다. 「도」를 떼면 숫자로 읽힌다.
④ 빈칸(결측치) 처리
빈칸이 있는 날을 지울까, 그 열의 평균으로 채울까? 숫자로 못 읽는 칸도 여기서 빈칸으로 본다.
⑤ 이상한 값(이상치) 거르기
하루 대여가 99999건? 기계 오류다. 말이 되는 범위를 정해 그 밖의 줄을 거른다.
내 정제 과정을 판다스 코드로 보기
차례를 바꾸면 결과도 바뀔까
약 10분- [처음으로] 를 누르고, 이번에는 ③(「도」 떼기)을 건너뛰고 ④ 빈칸 있는 줄 지우기부터 눌러 보자. 몇 줄이 남는가? 왜 그런가?
- 다시 [처음으로] 를 누르고, 빈칸을 지우지 말고 평균으로 채우기를 골라 보자. 몇 줄이 남는가? 지우는 것과 채우는 것은 각각 무엇을 얻고 무엇을 잃는가?
- ⑤의 기준을 10000 대신 2000 으로 바꿔 보자. 무슨 일이 생기는가?
파이썬으로 정제하기
실험실에서 한 일을 판다스 코드로 쓰면 이렇다. 단계마다 줄 끝의 설명과 실험실 단추를 견주어 보자.
import pandas as pd
df = pd.read_csv('bike_raw.csv')
print('처음:', df.shape)
df = df.drop(columns=['기록한사람', '메모']) # ① 필요 없는 열 빼기
print('중복 행:', df.duplicated().sum())
df = df.drop_duplicates() # ② 중복 지우기
df['평균기온'] = df['평균기온'].astype(str).str.replace('도', '') # ③ 단위 떼기
df['평균기온'] = pd.to_numeric(df['평균기온'], errors='coerce')
print('빈칸:', df.isna().sum().sum())
df = df.dropna() # ④ 빈칸 있는 줄 지우기
df = df[df['대여건수'] < 10000] # ⑤ 이상한 값 거르기
print('마지막:', df.shape)
df.to_csv('bike_clean.csv', index=False) # 저장처음: (32, 7) 중복 행: 2 빈칸: 3 마지막: (26, 5)
32줄 7열이 26줄 5열이 되었다. 중복 2줄, 빈칸이 있던 3줄, 이상한 값 1줄이 빠졌고, 열 2개를 뺐다. pd.to_numeric(…, errors='coerce') 는 «숫자로 바꾸되, 못 바꾸는 칸은 빈칸으로 두라»는 뜻이다. 그래서 「도」를 먼저 떼지 않으면 그 칸까지 빈칸이 되어 지워진다 — 실험실 1번 실험에서 본 그대로다.
정제한 데이터 관리하기
정제는 한 번 하고 끝나는 일이 아니다. 다음 달 기록이 오면 또 해야 하고, 친구나 선생님이 «어떻게 다듬었는지» 물어볼 수 있다.
- 원본
원본은 그대로 둔다
정제한 결과는 새 이름(bike_clean.csv)으로 저장한다. 원본을 덮어쓰면 실수했을 때 되돌릴 수 없다.
- 기록
무엇을 했는지 적는다
어떤 열을 뺐고, 빈칸을 지웠는지 채웠는지, 이상치 기준은 얼마였는지. 위의 판다스 코드가 그대로 기록이 된다.
- 이름
파일 이름에 규칙을
「bike_2025_04_clean.csv」처럼 무엇·언제·어떤 상태인지 이름만 보고 알 수 있게.
- 보관
안전한 곳에
개인 정보가 남아 있다면 아무나 볼 수 있는 곳에 두지 않는다. 필요 없어진 개인 정보는 지운다.
정제 기록표
실험실에서 정제한 과정을 기록한다. 다른 사람이 이 기록만 보고 같은 결과를 만들 수 있어야 한다.
- 처음과 마지막 줄 수를 적었다
- 단계를 차례대로 적었다
- 고른 까닭을 적었다
- 저장한 파일 이름을 적었다
글자 규칙으로 살펴보는 점검표다. 다 켜졌다고 좋은 답이 되는 것은 아니다 — 마지막 판단은 내가 한다.
적은 내용은 이 브라우저에만 저장된다. 다른 컴퓨터로 옮기거나 제출하려면 내려받는다.
확인 문제
개념 확인 문제
보기를 누르면 바로 채점된다. 틀려도 해설을 읽으면 된다.
평균기온 칸에 「12.4도」처럼 글자가 섞여 있다. 가장 알맞은 처리는?12소생03-02
하루 대여 건수가 99999건으로 기록되어 있다. 무엇부터 해야 할까?12소생03-02
판다스에서 같은 줄이 두 번 들어간 것을 지우는 코드는?12소생03-02
정제한 데이터를 관리하는 방법으로 가장 알맞은 것은?12소생03-02
교과서에서 찾기
이 차시에 대응하는 교과서 위치가 아직 정리되지 않았다. [확인필요]