데이터 분석 ① 수집·정제
화려한 그래프보다 깨끗한 데이터가 먼저예요. 오늘은 진짜 데이터를 코드로 불러와, 빠진 값과 이상한 값을 청소하고 탐색합니다.
오늘 배우는 것
데이터 분석은 수집 → 정제 → 탐색 3단계로 진행돼요. 오늘은 진짜 데이터를 불러와 깨끗하게 다듬고, 그 안에서 의미 있는 사실을 찾는 것까지 해봅니다.
pandas (판다스)란?
엑셀 표 같은 데이터를 코드로 다루게 해주는 도구예요. import pandas as pd로 불러와서, 표를 불러오고·고치고·계산하는 일을 코드 몇 줄로 합니다.
CSV 파일과 데이터 보물창고
분석을 하려면 먼저 데이터 파일이 필요해요. 가장 흔한 형태가 CSV이고, 그 파일을 무료로 받을 수 있는 곳이 데이터 보물창고예요.
분석은 수집 → 정제 → 탐색
진짜 데이터에는 빈칸, 오타, 말도 안 되는 값(나이 999살)이 섞여 있어요. 이대로 분석하면 결과를 믿을 수 없어요. 그래서 분석가는 시간의 대부분을 청소(정제)에 씁니다.
pd.read_csv()로 불러와요.화려한 그래프보다, 깨끗한 데이터가 먼저예요. 오늘은 그 '청소'의 힘을 직접 경험합니다.
CSV 데이터를 표로 띄우기
① pandas 설치하기
먼저 도구를 설치합니다. 터미널에 (venv) 표시가 있는지 확인하고 입력하세요. (설치는 한 번만 하면 돼요.)
# (venv) 표시 확인 후 설치
pip install pandas② 데이터 받아서 코드 옆에 두기
공공데이터포털이나 Kaggle에서 관심 주제 CSV를 받으세요. 받은 파일은 코드와 같은 폴더에 두는 게 가장 쉬워요.
③ 불러오는 코드 만들기
AI 도구에 아래 프롬프트를 입력해 기본 코드를 받아 보세요. 파일 이름은 내가 받은 파일로 바꿔 적습니다.
④ 핵심 구조 이해하기
코드에는 보통 이런 핵심 줄이 들어 있어요. 이 세 가지로 데이터를 처음 살펴봅니다.
import pandas as pd
df = pd.read_csv("movies.csv") # ① 불러오기
print(df.head()) # ② 맨 위 5줄
print(df.shape) # ③ (행 개수, 열 개수)
print(df.info()) # 열 이름·빈 값 여부실행하면 이런 식으로 나와요. info()의 non-null 숫자를 잘 보세요.
(1000, 6)
# Column Non-Null Count
0 title 1000 non-null
1 genre 1000 non-null
2 rating 950 non-null ← 50개가 비어 있다!- FileNotFoundError: 파일 위치·철자 확인. CSV를 코드와 같은 폴더에 두세요.
- 한글 깨짐: AI에게 "
encoding을 설정해줘"라고 요청하세요. - NameError: 맨 위에
import pandas as pd가 빠졌어요.
🔒 힌트 — 파일을 못 불러와요 (참고 코드)
파일이 코드와 같은 폴더에 있는지 먼저 확인하세요. 한글이 깨지면 encoding을 더해 봅니다.
import pandas as pd
# 한글이 깨질 때만 encoding을 더해요
df = pd.read_csv("movies.csv", encoding="utf-8")
print(df.head())데이터 깨끗하게 청소하기
데이터를 불러왔다면, 이제 청소할 차례예요. 그런데 바로 코드를 받지 말고, 어디가 더러운지 먼저 살펴보는 것부터 시작해요.
info() 결과에서 빈 값이 가장 많은 열을 찾아보세요. 그 열을 ① 채울지 ② 버릴지 먼저 정하고, 그 이유를 한 줄로 적어 보세요. 떠올랐다면, 바로 코드를 받지 말고 내가 AI에게 보낼 요청을 한 문장으로 적어 봅니다.
① 빈 값 위치부터 확인
어느 열에 빈 값이 몇 개인지 숫자로 확인합니다.
print(df.isnull().sum()) # 열마다 빈 값 개수
print(df.describe()) # 숫자 열의 범위·평균② 청소 방법 고르기
빈 값과 이상치를 처리하는 방법은 크게 세 가지예요. 데이터에 맞는 하나를 골라 AI에게 요청하세요.
df = df.fillna(0)df = df.dropna()df = df[df["age"] < 120]청소 전 행 개수: 1000
빈 값 처리(dropna) 후: 950
→ 빈 값이 있던 50줄이 정리됐어요- 처리 결과를 다시 안 담음 →
df = df.dropna()처럼 df에 다시 저장해야 해요. dropna()로 너무 많이 지워 데이터가 사라짐 → 먼저 어느 열을 지울지 정하기.- 이상치 기준을 못 정함 →
describe()로 값의 범위부터 확인.
🔒 힌트 — 청소했는데 그대로예요 (참고 코드)
처리 결과를 같은 변수에 다시 담아야 반영돼요.
print("청소 전:", df.shape)
df = df.dropna() # 결과를 df에 다시 저장!
print("청소 후:", df.shape)흥미로운 사실 3가지 발견하기
이제 깨끗한 데이터를 탐색할 차례예요. 정렬·세기·평균으로 데이터를 살펴보며 흥미로운 점을 찾습니다.
df.sort_values("rating", ascending=False).head() # 최고 기록
df["genre"].value_counts() # 가장 많은 것
df["rating"].mean() # 평균장르별 개수: Drama 220, Comedy 180, Action 150
평점 평균: 6.8
최고 평점 영화: "The Masterpiece" (9.4)🃏 선택지 카드 — 무엇을 파헤쳐 볼까?
하나를 골라 AI에게 요청해 보세요. 찾은 사실은 다음 주에 그래프로 그릴 후보가 됩니다.
- 무엇이 흥미로운지 못 정함 → "사람들이 놀랄 만한 점이 뭐야?"로 후보를 받아 내가 고르기.
- 열 이름 오타 →
df.columns로 정확한 열 이름을 먼저 확인.
🔒 힌트 — 어떻게 묻지? (참고 코드)
그룹별 비교는 groupby로 묶어 평균을 냅니다.
# 장르별 평균 평점 비교
print(df.groupby("genre")["rating"].mean())더 해보고 싶다면
미션 3까지 끝내고 시간이 남는다면 도전해 보세요. 끝내지 못해도 괜찮습니다.
보너스 ① 두 데이터 합치기 — merge
비슷한 데이터 2개를 공통 열을 기준으로 연결하면 더 풍부한 분석이 돼요. 예: 영화 데이터 + 감독 데이터.
m = pd.merge(movies, directors, on="movie_id")
print(m.head()) # 새 열이 합쳐져 보여요보너스 ② 분석 아이디어 5개 받기
다음 주 시각화를 위해 분석거리를 미리 모아 둡니다.
오늘의 핵심 정리
오늘 찾은 사실 1가지를 골라 오세요. 다음 주에는 그 사실을 matplotlib·seaborn 그래프로 그려 '데이터 이야기'로 발표합니다.
🔧 막혔을 때 — 자가 디버깅 4단계
에러가 떠도 당황하지 마세요. 선생님께 묻기 전에 이 순서대로 스스로 해결해 봅니다.