← 파이썬 강의 목록으로
🚀
고급 (Advanced)
ndarray · DataFrame · groupby · CSV

8주차 — NumPy / Pandas 입문

NumPy 배열 연산과 인덱싱, Pandas DataFrame 의 필터·정렬·groupby, 그리고 CSV 읽고 분석하기까지 — 데이터 처리의 두 거인을 만납니다.

numpypandasDataFramegroupby
소요 시간
2시간
난이도
📊 고급
선수 조건
🎯 고급 7주차
결과물
DataFrame 으로 CSV 데이터 분석

이 강의에서 배우는 것

  • 1NumPy 배열 생성·연산·인덱싱을 한다
  • 2Pandas DataFrame 의 기본 조작을 익힌다
  • 3CSV 를 읽고 필터·집계한다
  • 4groupby 와 피벗 테이블을 사용한다

0. 설치

bash
pip install numpy pandas matplotlib

1. NumPy 기본

python
import numpy as np

a = np.array([1, 2, 3, 4, 5])
print(a.mean(), a.std(), a.sum())

# 벡터 연산 (Python list보다 훨씬 빠름)
print(a * 2)        # [2 4 6 8 10]
print(a + a)
print(a > 2)        # 불리언 배열

# 2D
m = np.arange(12).reshape(3, 4)
print(m)
print(m.shape)
print(m.sum(axis=0))   # 컬럼 합
print(m.sum(axis=1))   # 행 합

2. NumPy 인덱싱

python
a = np.arange(10)
print(a[3])
print(a[2:6])
print(a[a > 5])      # 불리언 인덱싱

m = np.arange(12).reshape(3, 4)
print(m[1, 2])       # 행 1, 열 2
print(m[:, 1])       # 모든 행, 열 1
print(m[1, :])       # 행 1

3. Pandas DataFrame

python
import pandas as pd

df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie", "Dave"],
    "score": [92, 78, 85, 67],
    "dept": ["A", "B", "A", "B"],
})

print(df)
print(df.describe())
print(df.shape, df.columns.tolist())

4. 필터·정렬·집계

python
# 필터
print(df[df.score >= 80])

# 정렬
print(df.sort_values("score", ascending=False))

# 그룹 집계
print(df.groupby("dept")["score"].mean())
print(df.groupby("dept").agg({"score": ["mean", "max", "count"]}))

5. CSV 읽기

python
df = pd.read_csv("sales.csv")
df["date"] = pd.to_datetime(df["date"])
monthly = df.groupby(df["date"].dt.to_period("M"))["amount"].sum()
print(monthly)

6. 시각화 (matplotlib)

python
import matplotlib.pyplot as plt

monthly.plot(kind="bar")
plt.title("월별 매출")
plt.tight_layout()
plt.savefig("monthly.png")

자주 하는 실수

  1. for 루프로 NumPy 배열 처리 — 벡터 연산 사용해야 빠름
  2. SettingWithCopyWarning — df[df.x > 0]['y'] = 5 대신 .loc[]
  3. 인덱스 vs 컬럼 혼동 — df['a'] 는 컬럼, df.loc[a] 는 인덱스
  4. NaN 무시 — dropna(), fillna() 로 명시적 처리

FAQ

Q1. NumPy vs list? — NumPy는 동일 타입, 메모리 연속, 벡터 연산. 수치 계산에서 100배 이상 빠름.

Q2. Pandas vs SQL? — Pandas는 메모리 내. SQL은 영구 저장 + 큰 데이터.

Q3. polars 가 더 빠르다는데? — 맞음. 큰 데이터에서 좋음. 다만 생태계는 pandas 압도적.

💻 예제 (examples)

실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.

01_numpy_basic.py배열, 연산
CODE
import numpy as np

a = np.array([1, 2, 3, 4, 5])
print("평균:", a.mean())
print("표준편차:", round(a.std(), 4))
print("합계:", a.sum())
print("배수:", a * 2)
print("불리언:", a > 2)
▶ 실행 결과
평균: 3.0
표준편차: 1.4142
합계: 15
배수: [ 2  4  6  8 10]
불리언: [False False False  True  True]
02_numpy_indexing.py인덱싱·슬라이싱
CODE
import numpy as np

m = np.arange(12).reshape(3, 4)
print(m)
print("m[1, 2] =", m[1, 2])
print("m[:, 1] =", m[:, 1])
print("m[1, :] =", m[1, :])
print("axis=0 합:", m.sum(axis=0))
print("axis=1 합:", m.sum(axis=1))
▶ 실행 결과
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
m[1, 2] = 6
m[:, 1] = [1 5 9]
m[1, :] = [4 5 6 7]
axis=0 합: [12 15 18 21]
axis=1 합: [ 6 22 38]
03_pandas_basic.pyDataFrame 생성·조회
CODE
import pandas as pd

df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie"],
    "score": [92, 78, 85],
})
print(df)
print("---")
print("평균:", df["score"].mean())
print("최대:", df["score"].max())
▶ 실행 결과
      name  score
0    Alice     92
1      Bob     78
2  Charlie     85
---
평균: 85.0
최대: 92
04_pandas_groupby.py필터·groupby
CODE
import pandas as pd

df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie", "Dave"],
    "score": [92, 78, 85, 67],
    "dept": ["A", "B", "A", "B"],
})

print(df[df.score >= 80])
print("---")
print(df.groupby("dept")["score"].mean())
▶ 실행 결과
      name  score dept
0    Alice     92    A
2  Charlie     85    A
---
dept
A    88.5
B    72.5
Name: score, dtype: float64

📝 과제 (exercises)

직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.

과제 1

NumPy 배열 통계

목표: 1~100 배열의 평균/최대/짝수 합을 구한다.

요구사항
  • np.arange 사용
  • 평균, 최대, 짝수 합 출력
💡 힌트

a[a % 2 == 0].sum()

입출력 예시
평균: 50.5
최대: 100
짝수 합: 2550
채점
  • · 불리언 인덱싱 사용
정답 코드 펼치기 / 접기
SOLUTION
import numpy as np

a = np.arange(1, 101)
print(f"평균: {a.mean()}")
print(f"최대: {a.max()}")
print(f"짝수 합: {a[a % 2 == 0].sum()}")
▶ 실행 결과
평균: 50.5
최대: 100
짝수 합: 2550
과제 2

DataFrame 학과별 평균

목표: 학생 점수 DataFrame 에서 학과별 평균을 구한다.

요구사항
  • pandas.DataFrame 직접 작성
  • groupby + mean
💡 힌트

df.groupby('dept')['score'].mean()

입출력 예시
dept
A    88.5
B    72.5
Name: score, dtype: float64
채점
  • · DataFrame 사용
  • · groupby 결과 일치
정답 코드 펼치기 / 접기
SOLUTION
import pandas as pd

df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie", "Dave"],
    "score": [92, 78, 85, 67],
    "dept": ["A", "B", "A", "B"],
})
print(df.groupby("dept")["score"].mean())
▶ 실행 결과
dept
A    88.5
B    72.5
Name: score, dtype: float64
과제 3

BMI 시뮬레이션

목표: 키/몸무게 분포에서 BMI 통계를 구한다.

요구사항
  • np.random.normal 로 키 1.7m, 몸무게 65kg 분포 100개
  • BMI = 몸무게 / 키^2
  • 평균 BMI 출력
💡 힌트

seed 고정으로 재현 가능

입출력 예시
평균 BMI: 22.x
채점
  • · 벡터 연산
  • · 통계 출력
정답 코드 펼치기 / 접기
SOLUTION
import numpy as np

rng = np.random.default_rng(42)
heights = rng.normal(1.7, 0.05, 100)
weights = rng.normal(65, 5, 100)
bmi = weights / heights ** 2
print(f"평균 BMI: {bmi.mean():.2f}")
print(f"최저 BMI: {bmi.min():.2f}")
print(f"최고 BMI: {bmi.max():.2f}")
▶ 실행 결과
평균 BMI: 22.66
최저 BMI: 17.95
최고 BMI: 28.14
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗