AI 파이썬 Lab · 심화 · 2주차
심화 · 데이터 분석 ①

데이터 분석 ① 수집·정제

화려한 그래프보다 깨끗한 데이터가 먼저예요. 오늘은 진짜 데이터를 코드로 불러와, 빠진 값과 이상한 값을 청소하고 탐색합니다.

오늘의 목표

오늘 배우는 것

데이터 분석은 수집 → 정제 → 탐색 3단계로 진행돼요. 오늘은 진짜 데이터를 불러와 깨끗하게 다듬고, 그 안에서 의미 있는 사실을 찾는 것까지 해봅니다.

📥
GOAL 1
pandas로 진짜 CSV 데이터를 불러와 표로 살펴본다
🧹
GOAL 2
빠진 값·이상한 값을 찾아 깨끗하게 청소한다
🔍
GOAL 3
깨끗한 데이터에서 흥미로운 사실 3가지를 찾는다
새 도구 ①

pandas (판다스)란?

엑셀 표 같은 데이터를 코드로 다루게 해주는 도구예요. import pandas as pd로 불러와서, 표를 불러오고·고치고·계산하는 일을 코드 몇 줄로 합니다.

📊 데이터프레임 = 엑셀 표
pandas가 다루는 표를 데이터프레임(DataFrame)이라고 불러요. 가로줄(행)은 하나하나의 기록, 세로줄(열)은 항목이에요. 엑셀을 코드로 다룬다고 생각하면 됩니다.
새 개념 ②③

CSV 파일과 데이터 보물창고

분석을 하려면 먼저 데이터 파일이 필요해요. 가장 흔한 형태가 CSV이고, 그 파일을 무료로 받을 수 있는 곳이 데이터 보물창고예요.

📄
CSV 파일
값들을 쉼표(,)로 구분해 저장한 표 데이터 파일이에요. 엑셀로도 열리고, 코드로도 쉽게 읽혀요.
왜 CSV? 가장 단순하고 어디서나 열리는 표 데이터라, 데이터 세상의 공용 봉투처럼 쓰여요.
🏪
공공데이터포털 · Kaggle
누구나 무료로 진짜 데이터를 받을 수 있는 곳이에요. 영화·게임·동물·날씨 등 주제가 다양해요.
비유: 재료를 받아오는 시장이에요. 좋은 재료(데이터)를 골라와야 좋은 요리(분석)가 나와요.
개념

분석은 수집 → 정제 → 탐색

진짜 데이터에는 빈칸, 오타, 말도 안 되는 값(나이 999살)이 섞여 있어요. 이대로 분석하면 결과를 믿을 수 없어요. 그래서 분석가는 시간의 대부분을 청소(정제)에 씁니다.

1
수집 (Collect)
데이터 창고에서 관심 주제의 CSV를 받아 pd.read_csv()로 불러와요.
2
정제 (Clean)
빠진 값·이상한 값을 찾아 채우거나 버려요. 분석에서 가장 오래 걸리는 단계예요.
3
탐색 (Explore)
깨끗한 데이터를 정렬·세기·평균으로 살펴보며 흥미로운 사실을 찾아요.
🍳 비유: 요리 전 재료 손질
정제는 요리 전 재료 손질과 같아요. 흙 묻은 채소를 씻지 않고 요리할 순 없죠. 데이터도 청소를 해야 믿을 수 있는 분석이 나와요.
💡 핵심 메시지

화려한 그래프보다, 깨끗한 데이터가 먼저예요. 오늘은 그 '청소'의 힘을 직접 경험합니다.

미션 1

CSV 데이터를 표로 띄우기

🎯 목표: 관심 주제의 CSV 파일을 pandas로 불러와, 맨 위 5줄과 전체 정보를 확인한다.

① pandas 설치하기

📥 실습 데이터 다운로드 (movies.csv)이 파일을 코드와 같은 폴더에 저장하세요

먼저 도구를 설치합니다. 터미널에 (venv) 표시가 있는지 확인하고 입력하세요. (설치는 한 번만 하면 돼요.)

터미널
# (venv) 표시 확인 후 설치
pip install pandas

② 데이터 받아서 코드 옆에 두기

공공데이터포털이나 Kaggle에서 관심 주제 CSV를 받으세요. 받은 파일은 코드와 같은 폴더에 두는 게 가장 쉬워요.

📸 스크린샷 자리
Kaggle / 공공데이터포털에서 CSV를 내려받는 화면 (Download 버튼·열 이름 미리보기)
📝 어떤 주제·열로 이뤄진 데이터인지 미리보기가 보이도록 캡처

③ 불러오는 코드 만들기

AI 도구에 아래 프롬프트를 입력해 기본 코드를 받아 보세요. 파일 이름은 내가 받은 파일로 바꿔 적습니다.

💬 이렇게 입력해 보세요
pandas로 movies.csv 파일을 불러와서 맨 위 5줄과 전체 정보(행 개수, 열 이름)를 보여주는 코드를 만들어줘.

④ 핵심 구조 이해하기

코드에는 보통 이런 핵심 줄이 들어 있어요. 이 세 가지로 데이터를 처음 살펴봅니다.

analyze.py
import pandas as pd

df = pd.read_csv("movies.csv")   # ① 불러오기

print(df.head())     # ② 맨 위 5줄
print(df.shape)      # ③ (행 개수, 열 개수)
print(df.info())      # 열 이름·빈 값 여부
df.head()맨 위 5줄 미리보기
df.shape(행 개수, 열 개수) 확인
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을 더해 봅니다.

analyze.py (참고)
import pandas as pd
# 한글이 깨질 때만 encoding을 더해요
df = pd.read_csv("movies.csv", encoding="utf-8")
print(df.head())
미션 2

데이터 깨끗하게 청소하기

🎯 목표: 결측치(빈 값)와 이상치(말이 안 되는 값)를 찾아 한 가지 방법으로 처리한다.

데이터를 불러왔다면, 이제 청소할 차례예요. 그런데 바로 코드를 받지 말고, 어디가 더러운지 먼저 살펴보는 것부터 시작해요.

✏️ 먼저 스스로 해보기
빈 값이 가장 많은 열은 어디일까?
info() 결과에서 빈 값이 가장 많은 열을 찾아보세요. 그 열을 ① 채울지버릴지 먼저 정하고, 그 이유를 한 줄로 적어 보세요.
떠올랐다면, 바로 코드를 받지 말고 내가 AI에게 보낼 요청을 한 문장으로 적어 봅니다.

① 빈 값 위치부터 확인

어느 열에 빈 값이 몇 개인지 숫자로 확인합니다.

analyze.py
print(df.isnull().sum())   # 열마다 빈 값 개수
print(df.describe())       # 숫자 열의 범위·평균

② 청소 방법 고르기

빈 값과 이상치를 처리하는 방법은 크게 세 가지예요. 데이터에 맞는 하나를 골라 AI에게 요청하세요.

A
채우기 — fillna
빈 값을 평균이나 0 같은 값으로 채워요. df = df.fillna(0)
B
버리기 — dropna
빈 값이 있는 줄을 통째로 지워요. df = df.dropna()
C
이상치 거르기 — 조건 필터
말이 안 되는 값을 조건으로 걸러요. df = df[df["age"] < 120]
▸ 터미널 출력 (청소 전후)
청소 전 행 개수: 1000
빈 값 처리(dropna) 후: 950
→ 빈 값이 있던 50줄이 정리됐어요
⚠️ 자주 하는 실수
  • 처리 결과를 다시 안 담음 → df = df.dropna()처럼 df에 다시 저장해야 해요.
  • dropna()로 너무 많이 지워 데이터가 사라짐 → 먼저 어느 열을 지울지 정하기.
  • 이상치 기준을 못 정함 → describe()로 값의 범위부터 확인.
🔒 힌트 — 청소했는데 그대로예요 (참고 코드)

처리 결과를 같은 변수에 다시 담아야 반영돼요.

analyze.py (참고)
print("청소 전:", df.shape)
df = df.dropna()          # 결과를 df에 다시 저장!
print("청소 후:", df.shape)
미션 3

흥미로운 사실 3가지 발견하기

🎯 목표: 깨끗해진 데이터에서 '오, 그렇구나!' 싶은 사실 3가지를 찾는다.

이제 깨끗한 데이터를 탐색할 차례예요. 정렬·세기·평균으로 데이터를 살펴보며 흥미로운 점을 찾습니다.

💬 이렇게 입력해 보세요
이 데이터에서 흥미로운 사실 3가지를 찾아줘. 가장 많은 것, 가장 큰 값, 평균 같은 걸 알려줘.
analyze.py — 탐색 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에게 요청해 보세요. 찾은 사실은 다음 주에 그래프로 그릴 후보가 됩니다.

A
최고 기록 찾기
값이 가장 큰 상위 5개를 뽑아보기
난이도 ★☆☆
→ "평점이 가장 높은 영화 5개를 찾아줘"
B
그룹별 비교
종류별로 묶어 평균을 비교하기
난이도 ★★☆
→ "장르별 평균 평점을 비교해줘"
C
조건 검색
조건에 맞는 것만 골라내기
난이도 ★★☆
→ "2020년 이후 개봉, 평점 8 이상만 보여줘"
D
상관관계 찾기
두 값 사이에 관계가 있는지 보기
난이도 ★★★
→ "예산과 흥행 수익 사이 관계를 알려줘"
E
나만의 아이디어!
데이터에서 직접 궁금한 점을 AI에게 물어보기
⚠️ 자주 하는 실수
  • 무엇이 흥미로운지 못 정함 → "사람들이 놀랄 만한 점이 뭐야?"로 후보를 받아 내가 고르기.
  • 열 이름 오타 → df.columns로 정확한 열 이름을 먼저 확인.
🔒 힌트 — 어떻게 묻지? (참고 코드)

그룹별 비교는 groupby로 묶어 평균을 냅니다.

analyze.py (참고)
# 장르별 평균 평점 비교
print(df.groupby("genre")["rating"].mean())
보너스 미션

더 해보고 싶다면

미션 3까지 끝내고 시간이 남는다면 도전해 보세요. 끝내지 못해도 괜찮습니다.

보너스 ① 두 데이터 합치기 — merge

비슷한 데이터 2개를 공통 열을 기준으로 연결하면 더 풍부한 분석이 돼요. 예: 영화 데이터 + 감독 데이터.

💬 이렇게 입력해 보세요
movies.csv와 directors.csv를 공통 열(movie_id)을 기준으로 하나로 합쳐줘.
analyze.py (merge 예시)
m = pd.merge(movies, directors, on="movie_id")
print(m.head())   # 새 열이 합쳐져 보여요

보너스 ② 분석 아이디어 5개 받기

다음 주 시각화를 위해 분석거리를 미리 모아 둡니다.

💬 이렇게 입력해 보세요
이 데이터로 할 수 있는 재미있는 분석 5가지를 초등학생도 이해할 수 있게 추천해줘.
🎯 성공 기준
두 데이터가 하나로 합쳐져 새 열이 보이거나, 다음 주에 그릴 분석 아이디어를 3개 이상 메모하면 성공이에요.
정리

오늘의 핵심 정리

1️⃣
수집
공공데이터·Kaggle에서 진짜 CSV를 코드로 불러왔다
2️⃣
정제
빈 값과 이상치를 찾아 데이터를 깨끗하게 청소했다
3️⃣
탐색
깨끗한 데이터에서 흥미로운 사실 3가지를 발견했다
📌 다음 주 예고

오늘 찾은 사실 1가지를 골라 오세요. 다음 주에는 그 사실을 matplotlib·seaborn 그래프로 그려 '데이터 이야기'로 발표합니다.

🔧 막혔을 때 — 자가 디버깅 4단계

에러가 떠도 당황하지 마세요. 선생님께 묻기 전에 이 순서대로 스스로 해결해 봅니다.

1
에러 메시지 읽기
빨간 글자에서 '몇 번째 줄'과 '무슨 에러'인지 찾아본다.
2
AI에게 보여주기
에러 메시지를 복사해서 "이 에러를 수정해줘"라고 AI에게 요청한다.
3
고쳐서 다시 실행
AI가 준 수정 코드를 적용하고 다시 실행해 본다.
4
선생님께 질문
그래도 안 되면 '에러 메시지 + 내가 시도한 것'을 함께 설명한다.