14주차 · 통합 미니 프로젝트
14장. 통합 미니 프로젝트
Section titled “14장. 통합 미니 프로젝트”- W2–W13에서 배운 개념을 하나의 파이프라인으로 연결한다
- NumPy로 센서 시뮬레이션 데이터를 생성하고 통계 처리한다
- 함수로 처리 단계를 분리하고 예외 처리로 불량 데이터를 걸러낸다
- f-string 테이블과 요약 리포트를 출력한다
- 그래프 설계안(
plot_spec)으로 시각화 명세를 완성한다 - 파이프라인 각 단계를
assert로 검증하는 습관을 기른다
프로젝트 개요: 센서 데이터 분석 파이프라인
Section titled “프로젝트 개요: 센서 데이터 분석 파이프라인”시나리오: 건물 내부에 설치된 온도·습도 센서 5개가 1분 간격으로 24회 측정 데이터를 기록했습니다. 일부 센서는 불량 데이터(음수값, 극단값)를 포함할 수 있습니다. 이 데이터를 정제하고, 통계를 계산하고, 요약 리포트를 출력한 뒤 시각화 설계안을 작성합니다.
파이프라인 5단계:
| 단계 | 작업 | 핵심 개념 |
|---|---|---|
| Step 1 | 데이터 생성 | NumPy 배열, np.random (W11) |
| Step 2 | 처리 함수 | 필터링, 통계, 분류 함수 (W5, W9, W11) |
| Step 3 | 검증 | 예외 처리, 불량 데이터 감지 (W10) |
| Step 4 | 출력 | f-string 테이블, 요약 리포트 (W5, W7) |
| Step 5 | 시각화 설계안 | plot_spec 딕셔너리 (W12) |
Step 1 · 데이터 생성
Section titled “Step 1 · 데이터 생성”NumPy의 np.random.default_rng로 재현 가능한 센서 데이터를 시뮬레이션합니다. 실제 센서처럼 기저 신호에 노이즈를 추가하고, 의도적으로 불량값(음수, 극단값)을 심어둡니다.
# 참고: 데이터 생성 패턴import numpy as np
rng = np.random.default_rng(42) # 재현 가능한 난수 생성기n = 24 # 측정 횟수base_temp = 22.0 # 기저 온도 (°C)temp = base_temp + rng.normal(scale=1.5, size=n) # 노이즈 추가불량 데이터 주입: 실제 센서 오류를 모사하려면 몇 개의 값을 의도적으로 음수나 극단값으로 바꿉니다.
temp[3] = -5.0 # 오류 데이터 (음수)temp[17] = 80.0 # 오류 데이터 (극단값)Step 2 · 처리 함수
Section titled “Step 2 · 처리 함수”데이터를 처리하는 함수를 각 역할에 맞게 분리합니다. 함수를 나누면 테스트하기 쉽고 재사용이 가능합니다.
# 참고: 처리 함수 패턴import numpy as np
def filter_valid(data, low, high): """유효 범위 [low, high] 안의 값만 남깁니다.""" return data[(data >= low) & (data <= high)]
def compute_stats(data): """mean, std, min, max 를 딕셔너리로 반환합니다.""" return { "mean": round(float(data.mean()), 2), "std": round(float(data.std()), 2), "min": round(float(data.min()), 2), "max": round(float(data.max()), 2), }
def classify_temp(temp_c): """온도를 3단계로 분류합니다.""" if temp_c < 18: return "cold" elif temp_c <= 26: return "normal" else: return "hot"Step 3 · 검증
Section titled “Step 3 · 검증”불량 데이터를 거를 때는 예외 처리로 안전하게 처리합니다. try/except를 함수 안에 넣으면 호출자가 신경 쓰지 않아도 됩니다.
# 참고: 검증 패턴def safe_mean(data): """데이터가 비어 있으면 None 을 반환합니다.""" try: if len(data) == 0: raise ValueError("빈 배열입니다") return float(data.mean()) except ValueError as e: print(f"경고: {e}") return NoneStep 4 · 출력
Section titled “Step 4 · 출력”f-string으로 정렬된 테이블과 요약 리포트를 만듭니다. W5(f-string)와 W7(문자열)에서 배운 포맷 지정자를 활용합니다.
# 참고: 출력 패턴stats = {"mean": 22.3, "std": 1.4, "min": 19.8, "max": 24.7}
print(f"{'항목':<8} {'값':>8}")print("-" * 18)for key, val in stats.items(): print(f"{key:<8} {val:>8.2f}")출력 예시:
항목 값------------------mean 22.30std 1.40min 19.80max 24.70Step 5 · 시각화 설계안
Section titled “Step 5 · 시각화 설계안”W12에서 배운 plot_spec 딕셔너리로 시각화 명세를 완성합니다. 실제 그래프 렌더링은 로컬 Python에서 수행하고, 브라우저에서는 설계안 작성과 self-check를 연습합니다.
# 참고: 시각화 설계안 패턴import numpy as np
t = list(range(24)) # 측정 인덱스 (0~23)
plot_spec = { "title": "Sensor Temperature over 24 Readings", "x_label": "Measurement Index (-)", "y_label": "Temperature (°C)", "chart_type": "line+markers", "x": t, "y": [], # 처리된 데이터로 채움}
# self-checkprint("labels_ready:", all([plot_spec["title"], plot_spec["x_label"], plot_spec["y_label"]]))파이프라인 최종 출력 예시
Section titled “파이프라인 최종 출력 예시”5단계까지 완성하면, 센서 데이터 분석 결과를 실제 그래프로 확인할 수 있습니다.
차트를 불러오는 중...
안내 예제 · 전체 파이프라인 미리보기
Section titled “안내 예제 · 전체 파이프라인 미리보기” 실습 문제 · 파이프라인 단계별 직접 완성
Section titled “실습 문제 · 파이프라인 단계별 직접 완성”[Step 1] 데이터 생성: NumPy로 센서 시뮬레이션 데이터를 만들고 기본 정보를 출력하세요.
[Step 2] 처리 함수: 필터링·통계·분류 함수를 완성하고 실습 1의 데이터에 적용하세요.
[Step 3] 검증: safe_mean 함수를 완성하고 빈 배열과 정상 배열 두 가지 케이스를 테스트하세요.
[Step 4] 출력 포맷: 통계 딕셔너리를 f-string 테이블로 출력하고 분류 결과와 해석 문장을 완성하세요.
[Step 5] 시각화 설계안: 처리된 데이터로 plot_spec을 완성하고 self-check를 수행하세요.
누적 복습 체크리스트
Section titled “누적 복습 체크리스트”이번 주 미니 프로젝트에서 사용한 개념을 확인해 보세요.
| 주차 | 핵심 개념 | 이번 프로젝트에서 쓴 곳 |
|---|---|---|
| W2 | 변수·단위 | base_temp = 22.0 (°C), threshold = 5.0 (V) |
| W4 | 반복문 | for v in clean_temp: |
| W5 | 함수 | filter_valid, compute_stats, classify_temp |
| W6 | 자료구조 | stats dict, label_counts dict |
| W7 | 문자열 파싱 | split, strip, 데이터 전처리 |
| W9 | 리팩토링 | 함수 분해, assert 검증 |
| W10 | 예외 처리 | safe_mean 함수의 try/except, 검증 |
| W11 | NumPy | np.array, rng.normal, 불리언 인덱싱 |
| W12 | 시각화 | plot_spec 딕셔너리, self-check |
| W13 | 알고리즘 | label_counts 카운팅, classify_temp 분류 |