학습 단원
숫자 장부보다 먼저 결정 한 줄
해결할 문제와 목표
이용 횟수만으로 창구 폐쇄를 결정하면 기록이 끊긴 시간을 수요 감소로 오해한다.
한 행·열·자료형·관측 상태를 정의하고 최소수집 원칙으로 판단을 보류한다.
먼저 알아둘 것
필수 선수지식 없음
핵심 한 문장: 관측된 0과 보지 못한 값을 먼저 구분해야 데이터가 의사결정의 근거가 된다.
큰 그림: 비유와 경계
장부는 현장에 난 작은 창이다.
비유가 닿지 않는 곳: 창 밖의 잠재 방문과 이용자 불편은 장부만으로 보이지 않는다.
실제로 작동하는 원리
데이터는 관측 기록이고 정보는 질문에 맞게 해석한 기록이다. 한 행은 날짜×품목이다. 날짜는 시간, 품목은 범주, 대여건수는 이산 수치, 관측상태는 범주다. 동일인이 두 번 대여하면 2건이지 2명이 아니다. 정상가동·정지·미확인 상태와 로그 검증 여부를 함께 둔다. 원예제의 월 정상 3, 화 정지 장부0, 수 정상 확인0 중 화는 미관측이다. 정지 2시간의 잠재 수요는 단순 시간비로 복원할 수 없다. 개인정보는 목적에 필요한 최소한만 처리하고, 이 연습에서는 이름·연락처 없이 집계한다. 가명 키도 다른 표와 연결되면 재식별될 수 있고 희소 집계도 익명성을 보장하지 않는다. 운영자에게 정정 책임, 접근 범위, 보관·삭제 시점 승인을 부여한다. 미래 활용은 새 센서를 무작정 모으는 일이 아니라 관측 누락을 줄여 결정 오류를 줄이는 일이다. 정지일이 많은 지점에 불리한 자동평가가 되지 않는지 집단별 관측률을 비교한다. 수치 중간값 추적(위 기본 입력의 실제 계산): observations [('Mon', 3), ('Tue', None), ('Wed', 0)] observed_days 2 unobserved_days 1 checks OK
따라 하기
- START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
- 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 월 정상·검증 3, 화 정지 0, 수 정상·검증 0.
- python3 data-question.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
- 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-question.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
- 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
- 주제별 오류복구: 관측상태 로그가 없으면 정상0을 확정하지 말고 미확인으로 되돌린다. 외부 문의가 있어도 동일 대여의 중복인지 확인한다.
입력 예제
월 정상·검증 3, 화 정지 0, 수 정상·검증 0.예상 결과
observations [('Mon', 3), ('Tue', None), ('Wed', 0)]
observed_days 2
unobserved_days 1
checks OK
이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.검증 방법
- 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.
흔한 오해와 실패 복구
- 창 밖의 잠재 방문과 이용자 불편은 장부만으로 보이지 않는다.
- 관측상태 로그가 없으면 정상0을 확정하지 말고 미확인으로 되돌린다. 외부 문의가 있어도 동일 대여의 중복인지 확인한다.
확인 문제
시스템 정지일의 0을 수요 감소로 단정할 수 있는가? 확인된 정상일 0과 무엇이 다른가?
자기평가 · 자동채점 아님
평가 기준: 2점: 미관측과 관측0을 구분 1점, 정상운영·집계 로그 확인 조건 1점. 두 조건 모두 필요.
해설 보기
정지일은 측정 기회가 없어서 수요를 모른다. 정상 운용과 집계 완료가 확인된 날만 관측된 0이다.
독립 실습
새 기록 목 4 정상·검증, 금 0 수리중, 토 0 정상이나 로그 미확인에서 관측값과 관측일 수를 구하라. 폐쇄를 보류할 이유 두 가지와 수집하지 않을 개인정보 두 열을 쓰라. 식별 열을 제외해도 희소 집계에 남는 재식별 한계를 한 가지 쓰라.
남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 금·토 결측 판정, 관측 1일 산출, 서로 다른 보류 사유 2개, 이름·연락처 제외와 재식별 한계 설명
완전 실행파일 — 가상자료·Python 표준라이브러리
import sys
def observe(rows):
return [(day, value if status == 'ok' and verified else None)
for day, value, status, verified in rows]
def main(variant=False):
rows = [('Mon',3,'ok',True),('Tue',0,'offline',True),('Wed',0,'ok',True)]
if variant:
rows = [('Thu',4,'ok',True),('Fri',0,'repair',True),('Sat',0,'ok',False)]
result = observe(rows)
print('observations',result)
print('observed_days',sum(v is not None for _,v in result))
print('unobserved_days',sum(v is None for _,v in result))
assert observe([('X',0,'ok',True)]) == [('X',0)]
assert observe([('X',0,'ok',False)]) == [('X',None)]
print('checks OK')
if __name__ == '__main__': main('--variant' in sys.argv)
기본 입력 예상 stdout — 실제 Python 실행으로 확인
observations [('Mon', 3), ('Tue', None), ('Wed', 0)]
observed_days 2
unobserved_days 1
checks OK
독립 변형 정답 stdout — 실습 후 확인
observations [('Thu', 4), ('Fri', None), ('Sat', None)]
observed_days 1
unobserved_days 2
checks OK
환경 준비·설치 전제·저장·실행·복구 전체 안내
처음 실행하는 학습자를 위한 준비 안내
권리·안전
모든 입력은 독자 합성 자료다. 실명·연락처·실제 명부·비밀키를 추가하지 않는다.
원기출 복원·원강의 복제·공인/제휴·합격 보장이 아니다. 유료 서비스나 로그인은 필요 없다.
제작자는 새 프로그램·패키지를 설치하지 않았다. 아래 설치 설명은 학습자에게 필요한 전제 안내이며 설치 수행을 뜻하지 않는다.
1. 기존 환경을 먼저 확인한다.
Windows 터미널: python --version
macOS/Linux 터미널: python3 --version
Python 3.10 이상이 필요하다. SQL 과정은 함께 제공되는 sqlite3 엔진 3.39 이상도 필요하다.
이미 승인된 교육용 컴퓨터가 있으면 그 환경을 우선 사용한다. pip, numpy, pandas, scikit-learn, Oracle 서버 설치는 필요 없다.
2. Python이 없다면, 본인 소유 컴퓨터 또는 관리자 승인이 있는 환경에서만 준비한다.
Windows: https://www.python.org/downloads/ 의 Python Install Manager 공식 설치 파일을 연다.
설치 안내를 확인하고 Install을 선택한 뒤 새 터미널에서 python --version을 확인한다.
기존 Python/PATH를 임의 삭제하지 말고 관리자와 충돌을 확인한다.
macOS: https://www.python.org/downloads/macos/ 의 운영체제 호환 .pkg를 받아 서명·지원OS를 확인한다.
.pkg를 열어 안내·라이선스를 읽고 승인 범위에서 설치한 뒤 새 터미널에서 python3 --version을 확인한다.
Linux: 배포판에 이미 있는 python3를 우선 사용한다. 없다면 관리자에게 배포판 공식 Python3와 sqlite3 지원 모듈을 요청한다.
이 교재는 sudo·소스빌드·대규모 패키지 묶음·새 유료 구독을 요구하지 않는다. 설치 권한이 없으면 중단하고 승인된 환경으로 이동한다.
공식 확인: https://docs.python.org/3/using/windows.html , https://docs.python.org/3/using/mac.html
3. 파일을 저장한다.
이 단원의 materials에 표시된 파일을 전부 같은 새 폴더에 저장한다. 다른 단원과 폴더를 섞지 않는다.
파일 내용만 복사한다. 코드 울타리 기호나 화면 설명은 파일에 넣지 않는다.
일반 텍스트 편집기로 UTF-8 저장하며 파일명.py.txt처럼 확장자가 중복되지 않게 한다.
CSV의 첫 줄은 열 이름이며 NA 표기는 제공 파일 그대로 둔다. SQL과 R 파일을 Python 파일로 저장하지 않는다.
Windows는 해당 폴더에서 터미널 열기, macOS/Linux는 터미널에서 cd 다음 공백을 넣고 폴더를 끌어 넣은 뒤 Enter로 이동한다.
4. 환경과 실행 위치를 검사한다.
Windows: python environment-check.py
macOS/Linux: python3 environment-check.py
마지막에 ENVIRONMENT OK가 나와야 한다. 버전 번호 자체는 컴퓨터마다 달라도 최소 조건을 만족하면 된다.
이후 본문 steps의 명령을 사용한다. Windows에서 python3가 없으면 python으로 바꾼다.
python3 -O는 쓰지 않는다. -O는 교재의 assert 검산을 끈다.
기본 실행의 stdout을 expected.txt와 비교하고, 변형은 variant-expected.txt 또는 SQL의 variant case와 대조한다.
같은 값의 -0.0/0.0이나 부동소수 마지막 자리는 동치일 수 있다. 숫자 허용오차는 본문 검산식으로 판단한다.
5. 오류를 복구한다.
command not found: 기존 Python 경로·공식 설치 상태를 확인한다. 새 유료 도구로 바꾸지 않는다.
can't open file / FileNotFoundError: 현재 폴더와 파일명·확장자를 확인하고 해당 단원의 모든 자료를 다시 저장한다.
No module named sqlite3: pip로 sqlite3를 설치하지 않는다. 배포판 제공 Python의 sqlite 지원을 관리자에게 확인한다.
SQLite 버전이 낮으면 RIGHT/FULL 구문을 임의 삭제하지 말고 승인된 최신 Python 환경으로 옮긴다.
no such table: SQL만 따로 붙여넣지 말고 전체 자료와 run.py를 사용한다. 각 case마다 setup을 새로 적용한다.
no such function py_match: Python UDF를 등록하는 run.py를 사용한다. SQLite 내장/Oracle 함수라고 착각하지 않는다.
IntegrityError가 의도된 사례는 ERROR 유형과 다음 SELECT 상태까지 맞아야 PASS다. 다른 오류는 무시하지 않는다.
AssertionError: 검산을 지우지 말고 입력·중간값·정렬·NULL·정답을 비교한다. 운영DB에 재시도하지 않는다.
6. R 파일이 포함된 단원
Rscript --version으로 기존 R을 확인한다. 제작 환경에는 Rscript가 없어 모든 R 코드는 미실행이다.
실제 R 환경이 없으면 문서 기반 결과검토와 Python 수치대조까지 수행하고 R 실행 칸은 미실행으로 둔다.
R 환경 준비가 허가된 학습자만 https://cran.r-project.org/bin/windows/base/ (Windows) 또는
https://cran.r-project.org/bin/macosx/ (macOS)에서 OS/CPU와 맞는 공식 기본 배포본을 사용한다.
설치 안내를 읽고 승인 범위에서만 설치한다. 추가 패키지·RStudio·대규모 설치는 이 교재의 요구사항이 아니다.
Rscript가 PATH에 없다면 기존 R 콘솔에서 getwd()와 setwd(학습자료폴더)를 확인한 뒤 source("본문에서 지정한 파일.R")로 기본 예제를 읽을 수 있다.
변형 실행은 본문 Rscript 명령을 사용한다. R 콘솔의 source는 --variant 명령행 인수를 자동 전달하지 않는다.
CSV와 .R을 같은 현재 폴더에 놓고 Rscript 파일.R을 실행한다. r-expected-not-run.txt는 문서에서 예상한 값이지 실제 캡처가 아니다.
PCA/MDS의 축 부호·방향은 달라도 된다. 고유값·거리·재구성 결과를 대조한다.
7. Oracle 파일이 포함된 단원
comparison.oracle.sql은 Oracle19c 공식문법 학습·정적 대조용이고 실제 Oracle 미실행이다.
SQLite run.py는 이 파일을 실행하지 않는다. 새 계정·서버·유료접속·실권한을 만들지 않는다.
별도로 이미 승인된 폐기용 Oracle 환경이 있는 경우에도 파일의 빈 스키마 전제·DDL 암묵커밋·가상 역할 이름을 검토해야 한다.
운영DB에는 붙여넣지 않는다. 예제 이름 충돌은 DROP으로 무작정 해결하지 않는다.
성취 확인
PASS 출력은 예제 코드 검산이다. 질문의 이유·독립 입력변형·실패복구·전이과제를 직접 수행해야 단원 성취를 판단할 수 있다.
파일은 본 단원에 모두 포함되어 있고 제작자의 개인 폴더나 비공개 파일을 찾아갈 필요가 없다.
표준라이브러리 환경 확인
import sys
from pathlib import Path
if sys.version_info < (3,10):
raise SystemExit('Python 3.10+ required')
print('Python',sys.version.split()[0])
print('working_folder',Path.cwd().name)
if False:
try:import sqlite3
except ImportError:raise SystemExit('sqlite3 module missing: use an approved Python distribution with SQLite support')
print('SQLite',sqlite3.sqlite_version)
if sqlite3.sqlite_version_info < (3,39):raise SystemExit('SQLite 3.39+ required')
print('ENVIRONMENT OK')
실습 해설 보기
목만 4로 유지하고 금·토는 None이다. 수리 중 잠재수요 미관측과 토요일 로그 미검증 때문에 폐쇄 보류. 이름·연락처는 이 집계 목적에 불필요하다. 정상이라는 표지만으로 검증되지 않은 0을 확정하지 않는다. 반례·복구 해설: 관측상태 로그가 없으면 정상0을 확정하지 말고 미확인으로 되돌린다. 외부 문의가 있어도 동일 대여의 중복인지 확인한다. 희소한 날짜×품목 집계가 다른 출입기록과 연결되면 특정인을 추정할 수 있으므로 집계 자체도 공유 범위를 검토한다. 변형 입력의 실제 검산 stdout: observations [('Thu', 4), ('Fri', None), ('Sat', None)] observed_days 1 unobserved_days 2 checks OK
평가 기준: 금·토 결측 판정, 관측 1일 산출, 서로 다른 보류 사유 2개, 이름·연락처 제외와 재식별 한계 설명 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.
새 맥락에 적용하기
우산 대여소의 한 행과 계절별 관측 기회 차이, 최소수집·삭제 정책을 작성한다. 평가: 날짜×품목, 계절 교란, 책임자·보관기한·접근권한을 각각 명시한다.
내 말로 설명하고 가르치기
학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “관측된 0과 보지 못한 값을 먼저 구분해야 데이터가 의사결정의 근거가 된다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.
실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.
읽음과 숙련은 별개입니다.
참고 출처와 확인 범위
- https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.