LLM 엔지니어링1장 · 머신러닝 프로세스와 기본 개념15 / 23← 이전목차다음 →MetaContents

1장. 머신러닝 프로세스와 기본 개념

실습 1 — 배송 데이터 읽고 흠 찾기

온라인 쇼핑몰의 배송 기록 delivery.csv 를 읽어서, 고치기 전에 어떤 흠(빈칸, 두 번 들어간 행, 튀는 값)이 있는지 찾기만 합니다. 고치는 것은 실습 2에서 합니다. 연습용으로 만든 가상 데이터이고, 택배사 이름도 지어낸 것입니다. 파일이 작업 폴더에 있어야 합니다.

1단계. 표의 모양 보기

Python
import pandas as pd

# 배송 기록 파일을 표(DataFrame)로 읽는다
df = pd.read_csv("delivery.csv")

# 결과: (행 수, 열 수)
print(df.shape)
# 앞의 세 줄만 보며 어떤 열이 있는지 눈으로 확인한다
print(df.head(3))
출력
(1215, 10)
   주문번호         주문일  주문시각  지역   거리km  무게kg  상품분류  날씨    택배사  지연
0  3001  2026-03-19     2  서울    7.3   2.4  생활용품  맑음   한결택배   0
1  3002  2026-04-27    22  지방  197.6   4.6    도서   눈  빠른별택배   1
2  3003  2026-04-12     7  경기   35.5   0.7  생활용품  맑음   한결택배   1

2단계. 빈칸 세기

Python
# isna() 는 칸마다 빈칸이면 True 로 바꾼 표를 만든다
# 거기에 sum() 을 붙이면 True 를 1 로 세어 열마다 빈칸 수가 나온다
print(df.isna().sum())
출력
주문번호     0
주문일      0
주문시각     0
지역       0
거리km     0
무게kg    40
상품분류     0
날씨      25
택배사      0
지연       0
dtype: int64

3단계. 두 번 들어간 행 세기

Python
# duplicated() 는 앞에 똑같은 행이 이미 있으면 True 를 돌려준다
# 모든 열의 값이 같아야 같은 행으로 본다
print("두 번 들어간 행:", df.duplicated().sum())
출력
두 번 들어간 행: 15

4단계. 튀는 값 찾기

Python
# describe() 는 숫자 열의 개수, 평균, 최솟값, 사분위수, 최댓값을 한 번에 보여 준다
# max(최댓값)가 다른 값들과 동떨어져 있으면 입력 실수를 의심한다
print(df["거리km"].describe().round(1))

# 의심 가는 값이 몇 행인지 센다
print("9999km 행:", (df["거리km"] >= 9999).sum())
출력
count    1215.0
mean      112.7
std       702.4
min         2.4
25%        10.1
50%        22.4
75%        72.9
max      9999.0
Name: 거리km, dtype: float64
9999km 행: 6

이 실습이 뜻하는 것

이 실습은 택배 창고에 쌓인 송장 더미를 정리하기 전에 한 번 훑어보는 일과 같습니다. 송장이 몇 장이고 칸이 몇 개인지 보고(1단계), 빈칸으로 남은 송장을 세고(2단계), 같은 송장이 두 번 꽂힌 것을 세고(3단계), 말이 안 되는 숫자가 적힌 송장을 찾습니다(4단계). 여기서 송장 더미가 delivery.csv, 송장 한 장이 행 하나, 송장의 칸이 열입니다. 비유와 다른 점은, 이 데이터의 흠은 정제 연습을 위해 일부러 넣어 둔 것이라는 점입니다.

단계출력뜻
1. 표의 모양(1215, 10)주문 1,215건, 항목 10개짜리 표입니다. 앞 세 줄로 주문번호부터 지연까지 어떤 칸이 있는지 확인했습니다
2. 빈칸 세기무게kg 40, 날씨 25무게 40칸, 날씨 25칸이 비어 있습니다. 나머지 여덟 열에는 빈칸이 없습니다
3. 두 번 들어간 행15똑같은 기록이 한 번 더 들어간 행이 15개입니다. 실습 2에서 지울 행 수입니다
4. 거리 요약50% 22.4, max 9999.0주문의 절반은 22.4km 안쪽인데, 가장 먼 값이 9999km 입니다. 나올 수 없는 거리라 입력 실수로 봅니다
4. 거리 요약mean 112.7평균이 중앙값(22.4)의 다섯 배쯤으로 부풀었습니다. 9999 몇 개가 평균을 끌어올린 것입니다
4. 9999km 행6입력 실수로 보는 행은 6개입니다

한 줄로 줄이면, 빈칸·중복·튀는 값이라는 세 가지 흠이 각각 몇 개인지 숫자로 확인한 실습입니다. 이 숫자가 실습 2에서 고칠 목록이 됩니다. 이 실습은 찾기만 했으므로 표는 아직 그대로이고, 숫자는 흠의 개수를 알려 줄 뿐 흠이 왜 생겼는지는 알려 주지 않습니다.

코드 설명

  • df.isna().sum() 의 결과에서 무게kg 과 날씨에만 0 이 아닌 숫자가 있습니다. 무게kg 은 40칸, 날씨는 25칸이 비어 있습니다.
  • df.duplicated() 는 두 번째로 나온 같은 행부터 True 입니다. 그래서 15 는 "지워야 할 행 수"입니다.
  • describe() 에서 중앙값(50%)은 22.4km 인데 max 가 9999.0 입니다. 서울에서 지방까지의 거리로도 나올 수 없는 값이라 입력 실수로 봅니다. 무엇을 실수로 볼지는 업무를 아는 사람이 정합니다.
  • 평균(mean)이 112.7 로 중앙값보다 훨씬 큰 것도 9999 몇 개가 평균을 끌어올렸기 때문입니다. 튀는 값이 있으면 평균부터 흔들립니다.
← 이전 절1장 · 실습 지도다음 절 →1장 · 실습 2 — 빈칸·실수·중복 고치고 저장하기