Skip to content

14주차 · 통합 미니 프로젝트

  1. W2–W13에서 배운 개념을 하나의 파이프라인으로 연결한다
  2. NumPy로 센서 시뮬레이션 데이터를 생성하고 통계 처리한다
  3. 함수로 처리 단계를 분리하고 예외 처리로 불량 데이터를 걸러낸다
  4. f-string 테이블과 요약 리포트를 출력한다
  5. 그래프 설계안(plot_spec)으로 시각화 명세를 완성한다
  6. 파이프라인 각 단계를 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)

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 # 오류 데이터 (극단값)

데이터를 처리하는 함수를 각 역할에 맞게 분리합니다. 함수를 나누면 테스트하기 쉽고 재사용이 가능합니다.

# 참고: 처리 함수 패턴
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"

불량 데이터를 거를 때는 예외 처리로 안전하게 처리합니다. 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 None

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.30
std 1.40
min 19.80
max 24.70

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-check
print("labels_ready:", all([plot_spec["title"], plot_spec["x_label"], plot_spec["y_label"]]))

5단계까지 완성하면, 센서 데이터 분석 결과를 실제 그래프로 확인할 수 있습니다.

센서 데이터 분석 파이프라인 결과

차트를 불러오는 중...


안내 예제 · 전체 파이프라인 미리보기

Section titled “안내 예제 · 전체 파이프라인 미리보기”
안내 예제 · 5단계 파이프라인 미리보기 Runs in-browser with Pyodide
Ready

실습 문제 · 파이프라인 단계별 직접 완성

Section titled “실습 문제 · 파이프라인 단계별 직접 완성”

[Step 1] 데이터 생성: NumPy로 센서 시뮬레이션 데이터를 만들고 기본 정보를 출력하세요.

실습 1 · 센서 데이터 생성 Runs in-browser with Pyodide
Ready

이번 주 미니 프로젝트에서 사용한 개념을 확인해 보세요.

주차핵심 개념이번 프로젝트에서 쓴 곳
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, 검증
W11NumPynp.array, rng.normal, 불리언 인덱싱
W12시각화plot_spec 딕셔너리, self-check
W13알고리즘label_counts 카운팅, classify_temp 분류