AI NATIVE COMPANY

AX4U 바이브코딩 마스터 과정

숫자에서 결정을 꺼내는 작은 실험실

가상 공공 물품 대여소의 수요·수리 기록으로 질문, 윤리, 기획, 통계와 마이닝을 배우는 독립 과정. 원 링크의 명칭과 달리 공개 목차는 ADsP형 분석 중심이며 자격시험 합격을 보장하지 않는다. AX4U 바이브코딩 마스터 과정의 독자 교재다. 공개 주제와 공식 기술문서를 바탕으로 보완했으며 원강의 영상·비공개 교안·유료교재는 확인하지 않았다. 원 기출 복원이나 기관 제휴·공인 과정이 아니다. 모든 기록은 가상자료다. Python 표준라이브러리 실습은 실행 검수했고 R 코드는 공식 함수문서 검토만 했으며 Rscript 부재로 미실행이다. 단원별 예상 학습시간은 읽기 20~30분, 실습 30~60분이며 미실측 추정이다. 질문 설명·독립 입력변형·오류복구·전이과제를 모두 수행한 단원만 건너뛴다. 객관식이나 읽음 표시만으로 숙련을 인증하지 않는다.

읽음과 숙련은 별개입니다. 자동채점은 선택형에만 적용합니다.

교육자의 독립: 개념을 이해하고 실전 사례를 직접 검증해 현실 문제를 해결하는 시스템을 스스로 개발합니다.

공동체 기여: 결과와 실패·복구 과정을 다른 사람에게 설명하고 함께 개선합니다. 이 과정은 숙련을 보장하지 않습니다.

첫 단원 시작하기 → · 단원 목록 보기

내 기기의 학습 기록

이 기기에만 저장됩니다. 자동 동기화되지 않으며 개인정보·비밀키를 적지 마세요. 읽음·답변·증거는 숙련 인증이 아닙니다.

학습 단원

숫자 장부보다 먼저 결정 한 줄

해결할 문제와 목표

이용 횟수만으로 창구 폐쇄를 결정하면 기록이 끊긴 시간을 수요 감소로 오해한다.

한 행·열·자료형·관측 상태를 정의하고 최소수집 원칙으로 판단을 보류한다.

먼저 알아둘 것

필수 선수지식 없음

핵심 한 문장: 관측된 0과 보지 못한 값을 먼저 구분해야 데이터가 의사결정의 근거가 된다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

장부는 현장에 난 작은 창이다.

비유가 닿지 않는 곳: 창 밖의 잠재 방문과 이용자 불편은 장부만으로 보이지 않는다.

실제로 작동하는 원리

데이터는 관측 기록이고 정보는 질문에 맞게 해석한 기록이다. 한 행은 날짜×품목이다. 날짜는 시간, 품목은 범주, 대여건수는 이산 수치, 관측상태는 범주다. 동일인이 두 번 대여하면 2건이지 2명이 아니다. 정상가동·정지·미확인 상태와 로그 검증 여부를 함께 둔다. 원예제의 월 정상 3, 화 정지 장부0, 수 정상 확인0 중 화는 미관측이다. 정지 2시간의 잠재 수요는 단순 시간비로 복원할 수 없다. 개인정보는 목적에 필요한 최소한만 처리하고, 이 연습에서는 이름·연락처 없이 집계한다. 가명 키도 다른 표와 연결되면 재식별될 수 있고 희소 집계도 익명성을 보장하지 않는다. 운영자에게 정정 책임, 접근 범위, 보관·삭제 시점 승인을 부여한다. 미래 활용은 새 센서를 무작정 모으는 일이 아니라 관측 누락을 줄여 결정 오류를 줄이는 일이다. 정지일이 많은 지점에 불리한 자동평가가 되지 않는지 집단별 관측률을 비교한다. 수치 중간값 추적(위 기본 입력의 실제 계산): observations [('Mon', 3), ('Tue', None), ('Wed', 0)] observed_days 2 unobserved_days 1 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 월 정상·검증 3, 화 정지 0, 수 정상·검증 0.
  3. python3 data-question.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-question.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 관측상태 로그가 없으면 정상0을 확정하지 말고 미확인으로 되돌린다. 외부 문의가 있어도 동일 대여의 중복인지 확인한다.

입력 예제

월 정상·검증 3, 화 정지 0, 수 정상·검증 0.

예상 결과

observations [('Mon', 3), ('Tue', None), ('Wed', 0)]
observed_days 2
unobserved_days 1
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 창 밖의 잠재 방문과 이용자 불편은 장부만으로 보이지 않는다.
  2. 관측상태 로그가 없으면 정상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 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

궁금증을 실험표로 바꾸기

해결할 문제와 목표

고장 신고를 줄이고 싶은데 알림, 직원 증원, 자동예측 중 무엇을 시험해야 할지 모른다.

문제·대안·사전 지표·자원·중단조건이 있는 작은 분석계획을 만든다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 지표는 결과를 본 뒤 고르는 상이 아니라 실험 전에 정하는 판정 규칙이다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

항해 전에 목적지와 연료를 적는다.

비유가 닿지 않는 곳: 일정표만으로 효과나 인과가 증명되지는 않는다.

실제로 작동하는 원리

업무 이해→자료 이해→정제→기준선→분석→평가→운영 점검을 반복한다. 데이터 사이언스는 계산·업무지식·불확실성 설명을 연결하며 복잡한 모델 자체가 목적이 아니다. 대기일 [1,2,2,9]에서 평균과 중앙값이 다르므로 긴 대기와 전형적 대기를 함께 보고한다. 수입-기록된 비용은 기여액일 뿐 임대료·감가상각·노동비를 빼지 않았다면 순이익이 아니다. 알림안의 기존도구 추가비용0은 가정이며 도달률 3/4도 측정해야 한다. 직원안 4시간의 단가가 미정이면 비용은 0이 아니라 미정이다. 사전에 동일 기간·대상·중위 대기일과 미처리 비율을 고정한다. 요일별로 균형 잡힌 무작위 시범 배정이 가능해야 인과 해석이 강해지며 단순 전후 비교는 날씨·업무량 교란에 취약하다. 프로젝트 관리: 분석 담당은 주간 품질검사, 운영 책임자는 배정 승인, 보안 담당은 접근·삭제 확인. 로그 누락 또는 미처리 증가 시 중단한다. 수치 중간값 추적(위 기본 입력의 실제 계산): mean=3.500 median=2.000 reach=0.750 staff_cost=None checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 대기일 [1,2,2,9], 알림 도달 3/4, 추가근무4시간·단가 미정.
  3. python3 data-plan.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-plan.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 도달률 분모가0이거나 단가가 미정이면0으로 채우지 않는다. 분모·단가를 확보한 뒤 사전 지표를 유지해 재계산한다.

입력 예제

대기일 [1,2,2,9], 알림 도달 3/4, 추가근무4시간·단가 미정.

예상 결과

mean=3.500 median=2.000 reach=0.750 staff_cost=None
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 일정표만으로 효과나 인과가 증명되지는 않는다.
  2. 도달률 분모가0이거나 단가가 미정이면0으로 채우지 않는다. 분모·단가를 확보한 뒤 사전 지표를 유지해 재계산한다.
  3. 도달률은 total>0이고0<=reached<=total일 때만 계산한다. total=0이면 계산 중단 후 도달 기회 로그를 확보한다.

확인 문제

시행 후 좋아 보이는 지표만 골라 성공이라고 보고하면 왜 문제가 되는가?

자기평가 · 자동채점 아님

평가 기준: 3점: 선택적 보고 식별, 사전 지표·기간·대상 고정, 불리한 지표도 보고를 각1점.

해설 보기

여러 결과 중 우연히 유리한 것만 고르는 선택적 보고다. 지표·대상·기간을 사전에 정하고 불리한 결과도 함께 보고해야 한다.

독립 실습

대기일 [2,2,4,12], 알림 도달3/5, 추가근무4시간·시간당15000원으로 바꿔 요약·비용을 계산하고 알림/직원안을 비교하라. 효과를 확정하지 않는 사전평가 계획을 쓰라. 원래 단가 미정과0원이라는 값의 차이도 비교하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 평균·중앙값의 중간 합계, 도달률 분모5, 직원비용과 미정/0 구별, 효과 미확정 및 사전 지표·배정·중단조건

완전 실행파일 — 가상자료·Python 표준라이브러리

import statistics as s, sys

def evaluate(wait, reached, total, hours, rate):
    if total<=0 or not 0<=reached<=total:raise ValueError('positive total and 0<=reached<=total required')
    return s.mean(wait),s.median(wait),reached/total,None if rate is None else hours*rate

def main(variant=False):
    args=([1,2,2,9],3,4,4,None)
    if variant: args=([2,2,4,12],3,5,4,15000)
    avg,med,reach,cost=evaluate(*args)
    print(f'mean={avg:.3f} median={med:.3f} reach={reach:.3f} staff_cost={cost}')
    assert evaluate([1,1],1,2,4,None)[3] is None
    assert evaluate([1,1],1,2,4,100)[3] == 400
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

mean=3.500 median=2.000 reach=0.750 staff_cost=None
checks OK

독립 변형 정답 stdout — 실습 후 확인

mean=5.000 median=3.000 reach=0.600 staff_cost=60000
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')
실습 해설 보기

실행된 variant 결과의 평균·중앙값·도달률·비용을 사용한다. 알림은 도달 실패 확인, 직원은 60000원 비용·배치 승인 필요. 어느 안의 효과도 이 입력에서 관측되지 않았다. 사전 지표/기간/대상/중단조건을 정하고 시범 배정 후 비교한다. 반례·복구 해설: 도달률 분모가0이거나 단가가 미정이면0으로 채우지 않는다. 분모·단가를 확보한 뒤 사전 지표를 유지해 재계산한다. 변형 입력의 실제 검산 stdout: mean=5.000 median=3.000 reach=0.600 staff_cost=60000 checks OK

평가 기준: 평균·중앙값의 중간 합계, 도달률 분모5, 직원비용과 미정/0 구별, 효과 미확정 및 사전 지표·배정·중단조건 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

무료 급식소 대기 개선을 위한 1쪽 계획서를 작성한다. 평가: 존엄·개인정보 보호, 측정 단위, 기준선, 개입 배정, 자원·책임·중단조건.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “지표는 결과를 본 뒤 고르는 상이 아니라 실험 전에 정하는 판정 규칙이다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://docs.python.org/3/library/statistics.html — 2026-10-05 KST: web_extract 본문과 저장된 본문의 variance/pvariance, covariance, linear_regression 절을 실제 열람. 분모 n-1/n, 최소 관측 수, OLS 기울기·절편과 상수 x 오류를 확인.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

먼저 고칠 일과 멈출 조건 정하기

해결할 문제와 목표

큰 예측 프로젝트를 먼저 시작하면 정작 기록 누락 문제를 뒤로 미룰 수 있다.

가설 점수와 승인 관문을 구분해 우선순위·로드맵·거버넌스를 설계한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 점수는 토론의 출발점이고 자료·권한·비용이 미정인 과제는 착수 승인을 대신할 수 없다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

여행 짐을 중요도순으로 놓되 여권이 없으면 출발하지 못한다.

비유가 닿지 않는 곳: 숫자로 매긴 영향도는 실제 효과 추정치나 객관적 사실이 아니다.

실제로 작동하는 원리

독자 비교 규칙 S=영향(1~5)×실행가능성(1~5)-위험(1~5)을 사용한다. 가중치와 척도는 합의한 가설이다. 알림 (3,4,2), 감사 (2,5,1), 직원 (5,2,4·비용미정)을 비교한다. 직원은 점수를 숨기고 비용 확인 관문에서 보류한다. 로드맵은 1주 키·누락 감사→2주 승인된 소규모 시범→3주 같은 지표 평가→확대/중단으로 연결한다. 거버넌스는 원천 소유자의 접근 승인, 분석자의 코드/정의 버전, 운영 책임자의 행동 승인, 삭제 담당자와 이의신청 창구를 명시하는 일이다. 사후 성과가 없으면 사전 점수를 성공률로 부르지 않는다. 자체 진단문제는 기출유형의 계산·해석 연습이며 원 기출 복원이나 합격기준 재현이 아니다. 수치 중간값 추적(위 기본 입력의 실제 계산): priority [('alert', 10), ('audit', 9), ('staff', None)] checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 알림 영향3·가능4·위험2; 감사2·5·1; 직원5·2·4이나 비용 미정.
  3. python3 data-roadmap.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-roadmap.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 영향 점수는 실측 효과가 아니다. 점수가 높은 안도 자료권리/예산 미승인이면 보류하고, 척도·가중치 변경은 사유와 순위 변화를 함께 기록한다.

입력 예제

알림 영향3·가능4·위험2; 감사2·5·1; 직원5·2·4이나 비용 미정.

예상 결과

priority [('alert', 10), ('audit', 9), ('staff', None)]
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 숫자로 매긴 영향도는 실제 효과 추정치나 객관적 사실이 아니다.
  2. 영향 점수는 실측 효과가 아니다. 점수가 높은 안도 자료권리/예산 미승인이면 보류하고, 척도·가중치 변경은 사유와 순위 변화를 함께 기록한다.

확인 문제

직원안의 비용 미정을 0원으로 입력하면 우선순위 비교가 왜 왜곡되는가?

자기평가 · 자동채점 아님

평가 기준: 2점: 미정과0의 의미 구분, 견적·승인 관문 제안 각1점.

해설 보기

정보가 없다는 상태를 가장 싼 비용으로 바꿔 실행가능성을 과대평가한다. 견적·승인 전에는 미정으로 남겨 착수를 보류한다.

독립 실습

알림 도달 문제가 생겨 가능성2·위험5로 바뀌고 직원 비용은 승인되었다. 새 순서를 계산하고 첫 3주의 담당자·승인·중단조건을 다시 작성하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 세 점수 재계산, 원래 비용미정의 착수 보류, 새 순서의 근거, 주별 담당·승인·중단조건

완전 실행파일 — 가상자료·Python 표준라이브러리

import sys

def rank(tasks):
    scored=[]
    for name,impact,feasible,risk,known in tasks:
        scored.append((name,impact*feasible-risk if known else None))
    return sorted(scored,key=lambda r:(r[1] is None,-(r[1] or 0),r[0]))
def main(variant=False):
    tasks=[('alert',3,4,2,True),('staff',5,2,4,False),('audit',2,5,1,True)]
    if variant: tasks=[('alert',3,2,5,True),('staff',5,2,4,True),('audit',2,5,1,True)]
    print('priority',rank(tasks))
    assert rank([('unknown',5,5,0,False),('known',1,1,0,True)])[0][0]=='known'
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

priority [('alert', 10), ('audit', 9), ('staff', None)]
checks OK

독립 변형 정답 stdout — 실습 후 확인

priority [('audit', 9), ('staff', 6), ('alert', 1)]
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')
실습 해설 보기

새 점수는 audit, staff, alert 순이다(variant stdout 참조). 감사부터 기록 완전성을 확보하고 직원 시범을 승인 범위 안에서 검토한다. 낮아진 알림 점수만으로 효과가 없다고 단정하지 않는다. 누락률 악화·예산 초과 시 중단한다. 반례·복구 해설: 영향 점수는 실측 효과가 아니다. 점수가 높은 안도 자료권리/예산 미승인이면 보류하고, 척도·가중치 변경은 사유와 순위 변화를 함께 기록한다. 변형 입력의 실제 검산 stdout: priority [('audit', 9), ('staff', 6), ('alert', 1)] checks OK

평가 기준: 세 점수 재계산, 원래 비용미정의 착수 보류, 새 순서의 근거, 주별 담당·승인·중단조건 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

도서관 예약 개선 과제 3개에 이 규칙을 적용하고 가중치를 바꿔 민감도를 확인한다. 평가: 가설 표시, 순위변화, 비용/권리 관문, 승인 책임자.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “점수는 토론의 출발점이고 자료·권한·비용이 미정인 과제는 착수 승인을 대신할 수 없다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

R의 벡터와 표를 구별하기

해결할 문제와 목표

CSV의 NA를 없앴더니 합계가 나왔다는 이유로 데이터가 완전하다고 착각한다.

R 객체·벡터·data.frame·자료형·결측·중복·그룹 집계를 읽고 재현 스크립트의 실행 상태를 구분한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: na.rm=TRUE는 모르는 값을 알아내는 명령이 아니라 계산에서 빼는 선택이다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

벡터는 같은 재료를 담은 줄, 데이터프레임은 종류가 다른 줄들을 나란히 놓은 표다.

비유가 닿지 않는 곳: R의 원자 벡터는 공통 자료형으로 강제 변환될 수 있고 데이터프레임 열은 서로 다른 자료형을 가질 수 있다.

실제로 작동하는 원리

R에서 x <- c(3, NA, 2)는 객체 x에 수치 벡터를 할당한다. sum(x)는 NA, sum(x,na.rm=TRUE)는 관측값 합5다. d$value는 데이터프레임 d의 수치 열이다. 문자 "0"을 수치로 바꾸기 전에 관측상태를 확인한다. records.csv는 원4행 중 id3이 같은 내용으로 중복되어 고유3행이며 값 하나가 결측이다. colClasses로 id integer·item character·value numeric·status character를 지정하고 sapply(d,class)로 확인한다. duplicated(id)는 중복 위치를 찾을 뿐 어떤 기록이 맞는지 판단하지 않는다. 같은 키의 상충값은 중단하고 원천 확인한다. aggregate formula의 기본 NA 제외가 누락을 숨길 수 있어 na.action=na.pass를 지정하고 결측 수도 따로 계산한다. Python 검산은 입력·산술 대조이며 R 런타임 실행을 대체하지 않는다. 수치 중간값 추적(위 기본 입력의 실제 계산): raw_rows 4 unique_rows 3 missing 1 sum_all None sum_observed 5.0 checks OK (Python mirror; R not executed)

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. records.csv의 id1 A 3 정상, id2 A NA 정지, id3 B 2 정상 두 행.
  3. python3 data-r.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 이미 승인되어 설치된 R 환경에서 records.csv와 r-basics.R을 함께 저장한 위치를 터미널로 열고 Rscript r-basics.R 및 Rscript r-basics.R --variant를 실행한다. 이번 검수 환경에는 Rscript가 없어 실행하지 않았다. 설치 금지 조건에서는 새 설치를 시도하지 않는다. 파일 없음 오류는 파일명/getwd()를 확인하고 숫자 변환 오류는 CSV의 NA·구분자·colClasses를 점검한다.
  5. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-r.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  6. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  7. 주제별 오류복구: CSV의 NA 문자열·구분자·열 자료형을 먼저 확인한다. 같은id에 다른 값이면 임의 dedup 대신 원천 정정을 요청한다. na.rm은 관측되지 않은 값을 복구하지 않는다.

입력 예제

records.csv의 id1 A 3 정상, id2 A NA 정지, id3 B 2 정상 두 행.

예상 결과

raw_rows 4 unique_rows 3 missing 1
sum_all None sum_observed 5.0
checks OK (Python mirror; R not executed)

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. R의 원자 벡터는 공통 자료형으로 강제 변환될 수 있고 데이터프레임 열은 서로 다른 자료형을 가질 수 있다.
  2. CSV의 NA 문자열·구분자·열 자료형을 먼저 확인한다. 같은id에 다른 값이면 임의 dedup 대신 원천 정정을 요청한다. na.rm은 관측되지 않은 값을 복구하지 않는다.

확인 문제

R에서 sum(c(3,NA,2),na.rm=TRUE)가 5이면 누락된 값이 0이라는 뜻인가?

자기평가 · 자동채점 아님

평가 기준: 2점: NA 제외 의미1점, 결측수·이유 별도 보고1점. R 실행을 했다고 꾸미면 재실습.

해설 보기

아니다. NA를 제외한 관측 합이5라는 뜻이다. 결측 이유와 수를 별도로 보고해야 한다.

독립 실습

중복 id3 한 행을 제거한 뒤 id2의 복구 로그가 확보되어 값4·정상으로 정정되었다. 고유행 수·결측 수·합계를 계산하고 R/Python의 결과를 비교하는 절차를 설명하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 고유3행 확인, NA/제외합 차이 설명, 변형 합계와 정정 근거, R 미실행/Python 검산 구별

완전 실행파일 — 가상자료·Python 표준라이브러리

import csv, io, sys
from pathlib import Path
BASE=(Path(__file__).resolve().parent/'records.csv').read_text(encoding='utf-8')
def main(variant=False):
    rows=list(csv.DictReader(io.StringIO(BASE)))
    if variant: rows[1]['value']='4';rows[1]['status']='ok'
    clean={}
    for row in rows:
        value=None if row['value']=='NA' else float(row['value'])
        if row['id'] in clean:
            assert clean[row['id']]==(row['item'],value,row['status'])
        clean[row['id']]=(row['item'],value,row['status'])
    vals=[v for _,v,_ in clean.values()]
    print('raw_rows',len(rows),'unique_rows',len(vals),'missing',sum(v is None for v in vals))
    print('sum_all',None if None in vals else sum(vals),'sum_observed',sum(v for v in vals if v is not None))
    assert len(clean)==len({row['id'] for row in rows})
    print('checks OK (Python mirror; R not executed)')
if __name__=='__main__':main('--variant' in sys.argv)

R 완전 입력 CSV

id,item,value,status
1,A,3,ok
2,A,NA,offline
3,B,2,ok
3,B,2,ok

공식문서 검토 완료·R 미실행

# R 미실행: base/utils/stats만 사용. 파일은 이 단원 제공본이다.
args <- commandArgs(trailingOnly=TRUE)
d <- read.csv("records.csv", na.strings="NA", stringsAsFactors=FALSE,
              colClasses=c("integer","character","numeric","character"))
if ("--variant" %in% args) { d$value[d$id==2] <- 4; d$status[d$id==2] <- "ok" }
# ID가 같지만 내용이 다른 행은 중복 삭제하지 않고 오류로 중단한다.
for (key in unique(d$id)) stopifnot(nrow(unique(d[d$id==key,])) == 1)
dup <- duplicated(d$id)
cat(sprintf("raw_rows %d unique_rows %d missing %d\n", nrow(d),sum(!dup),sum(is.na(d$value[!dup]))))
d <- d[!dup,]
cat(sprintf("sum_all %s sum_observed %.1f\n", as.character(sum(d$value)),sum(d$value,na.rm=TRUE)))
v <- c(3, NA, 2)
stopifnot(is.na(sum(v)),sum(v,na.rm=TRUE)==5)
print(v)
print(sapply(d,class))
# 관측값 합계와 결측 수는 별도로 집계한다. aggregate formula의 기본 결측 제외를 피한다.
print(aggregate(value ~ item, d, sum, na.action=na.pass, na.rm=TRUE))
print(aggregate(is.na(d$value), by=list(item=d$item), FUN=sum))

r-expected-not-run.txt

문서 기반 예상(실행 stdout 아님): 기본 고유3행·결측1·sum_all NA·관측합5; A합3·결측1, B합2·결측0. 변형 고유3행·결측0·합9; A합7·결측0, B합2·결측0. R 객체 출력의 [1]·행이름·간격은 환경에 따라 달라질 수 있다.

기본 입력 예상 stdout — 실제 Python 실행으로 확인

raw_rows 4 unique_rows 3 missing 1
sum_all None sum_observed 5.0
checks OK (Python mirror; R not executed)

독립 변형 정답 stdout — 실습 후 확인

raw_rows 4 unique_rows 3 missing 0
sum_all 9.0 sum_observed 9.0
checks OK (Python mirror; R not executed)

환경 준비·설치 전제·저장·실행·복구 전체 안내

처음 실행하는 학습자를 위한 준비 안내

권리·안전
  모든 입력은 독자 합성 자료다. 실명·연락처·실제 명부·비밀키를 추가하지 않는다.
  원기출 복원·원강의 복제·공인/제휴·합격 보장이 아니다. 유료 서비스나 로그인은 필요 없다.
  제작자는 새 프로그램·패키지를 설치하지 않았다. 아래 설치 설명은 학습자에게 필요한 전제 안내이며 설치 수행을 뜻하지 않는다.

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')
실습 해설 보기

고유3행, 결측0, 관측합과 전체합9. 원본 누락의 0 치환이 아니라 복구 로그 기반 정정이라는 점이 다르다. R 출력은 실행했을 때만 실행값이라고 표시한다. 제공 R 예상: 기본 첫 줄 raw_rows 4 unique_rows 3 missing 1; 둘째 sum_all NA sum_observed 5.0. 변형은 missing0 및 sum_all 9 sum_observed 9.0. 반례·복구 해설: CSV의 NA 문자열·구분자·열 자료형을 먼저 확인한다. 같은id에 다른 값이면 임의 dedup 대신 원천 정정을 요청한다. na.rm은 관측되지 않은 값을 복구하지 않는다. 변형 입력의 실제 검산 stdout: raw_rows 4 unique_rows 3 missing 0 sum_all 9.0 sum_observed 9.0 checks OK (Python mirror; R not executed)

평가 기준: 고유3행 확인, NA/제외합 차이 설명, 변형 합계와 정정 근거, R 미실행/Python 검산 구별 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

새 가상 품목 C의 관측값과 NA를 섞은 CSV를 직접 작성한다. 평가: 열 자료형, 충돌 키 검사, 관측합·결측수 동시 보고, 실행/미실행 표시.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “na.rm=TRUE는 모르는 값을 알아내는 명령이 아니라 계산에서 빼는 선택이다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

학습 단원

흩어진 기록을 한 칸씩 맞추기

해결할 문제와 목표

대여와 수리표를 바로 합치면 신고가 많은 날의 대여가 중복 계산된다.

분석 단위를 보존하는 마트를 만들고 결측·중복·이상치 처리 근거를 남긴다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 일대다 자료는 목적 단위로 먼저 집계한 뒤 합쳐야 원천 합계가 보존된다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

서랍마다 같은 물건에 같은 꼬리표를 붙인다.

비유가 닿지 않는 곳: 꼬리표가 같아도 일대다 관계에서는 조인 행수가 늘어난다.

실제로 작동하는 원리

대여표의 키는 날짜×품목, 신고표의 키는 신고id다. 하루 A 대여3과 신고2행을 그대로 결합하면 대여3이 두 번 나온다. 이틀 대여합5가 잘못된 좌결합에서는8이 될 수 있다. 신고를 날짜×품목별 건수로 집계한 뒤 대여표와 결합한다. 신고0은 그날 접수 로그 완전성이 확인된 경우에만 사용하며 정지일은 None이다. 마트는 특정 분석 목적에 맞춘 자료로, 원천값·정정 이유·버전을 추적해야 한다. 큰 값은 이상 후보이지 자동 삭제 대상이 아니다. 대여200이 단위 오류인지 실제 행사인지 원천과 확인하고 수정 전후 합계를 보고한다. 결측을 평균으로 채워야 할 모델에서는 학습구간만으로 대체값을 적합하고 결측 표시도 남긴다. 수치 중간값 추적(위 기본 입력의 실제 계산): mart [(1, 'A', 3, 2), (2, 'A', 2, None)] rent_total 5 mart_total 5 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 대여(1,A,3),(2,A,2), 신고(1,A,r1),(1,A,r2); 2일 접수 정지.
  3. python3 data-mart.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-mart.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 합계가 늘어나면 일대다 결합 전에 신고를 집계했는지 확인한다. 중복 키/신고id ValueError는 원천 중복 또는 상충 내용을 점검한 뒤 해결한다.

입력 예제

대여(1,A,3),(2,A,2), 신고(1,A,r1),(1,A,r2); 2일 접수 정지.

예상 결과

mart [(1, 'A', 3, 2), (2, 'A', 2, None)]
rent_total 5 mart_total 5
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 원천 대여합=마트 대여합을 입력 변형 후에도 검사한다.
  2. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 중복 제거를 합계 오류의 만능 해결로 쓰지 않는다. 같은 키에 다른 값은 원천 확인 후 정정한다.
  2. 합계가 늘어나면 일대다 결합 전에 신고를 집계했는지 확인한다. 중복 키/신고id ValueError는 원천 중복 또는 상충 내용을 점검한 뒤 해결한다.

확인 문제

대여3인 한 행과 같은 날 신고 두 행을 바로 결합하면 그날 대여 합은 왜 6이 되는가?

자기평가 · 자동채점 아님

평가 기준: 3점: 복제 원인, 당일 잘못된 합6, 사전집계 해결을 각1점. 다른 날을 포함한 합8과 구분한다.

해설 보기

대여 행이 신고마다 복제되어 3이 두 번 합산되기 때문이다. 신고를 같은 분석 단위로 집계해 한 행으로 만든 뒤 합친다.

독립 실습

3일 B 대여4·정상접수와 신고r3 한 건을 추가하라. 마트 행과 대여합을 계산하고 2일 수리수를 0으로 둘 수 없는 이유를 설명하라. 동일 대여 키를 한 행 더 넣었을 때 오류를 거부하는 이유도 설명하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 신고 사전집계, 세 마트 행·대여합9, 2일 결측 유지, 중복 키를 오류로 거부

완전 실행파일 — 가상자료·Python 표준라이브러리

from collections import Counter
import sys

def build(rent,reports,status):
    keys=[(d,k) for d,k,v in rent]
    if len(keys)!=len(set(keys)):raise ValueError('duplicate rent key')
    ids=[r[2] for r in reports]
    if len(ids)!=len(set(ids)):raise ValueError('duplicate report id')
    n=Counter((d,k) for d,k,_ in reports)
    return [(d,k,v,n[d,k] if status.get((d,k))=='ok' else None) for d,k,v in rent]
def main(variant=False):
    rent=[(1,'A',3),(2,'A',2)];reports=[(1,'A','r1'),(1,'A','r2')]
    status={(1,'A'):'ok',(2,'A'):'offline'}
    if variant: rent.append((3,'B',4));reports.append((3,'B','r3'));status[3,'B']='ok'
    result=build(rent,reports,status)
    print('mart',result)
    print('rent_total',sum(v for _,_,v in rent),'mart_total',sum(r[2] for r in result))
    assert sum(r[2] for r in result)==sum(r[2] for r in rent)
    assert result[1][3] is None
    try:build(rent+[rent[0]],reports,status)
    except ValueError:pass
    else:raise AssertionError('duplicate not rejected')
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

mart [(1, 'A', 3, 2), (2, 'A', 2, None)]
rent_total 5 mart_total 5
checks OK

독립 변형 정답 stdout — 실습 후 확인

mart [(1, 'A', 3, 2), (2, 'A', 2, None), (3, 'B', 4, 1)]
rent_total 9 mart_total 9
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')
실습 해설 보기

3일 B의 행은 (3,B,4,1), 총 대여9다. 2일 A는 None 유지. 대여합과 신고합은 서로 다른 사건 수이며 신고/대여 건수비는 개인별 고장 확률이 아니다. 반례·복구 해설: 합계가 늘어나면 일대다 결합 전에 신고를 집계했는지 확인한다. 중복 키/신고id ValueError는 원천 중복 또는 상충 내용을 점검한 뒤 해결한다. 변형 입력의 실제 검산 stdout: mart [(1, 'A', 3, 2), (2, 'A', 2, None), (3, 'B', 4, 1)] rent_total 9 mart_total 9 checks OK

평가 기준: 신고 사전집계, 세 마트 행·대여합9, 2일 결측 유지, 중복 키를 오류로 거부 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

분실물 접수와 장비 대여 마트의 키·결합 방향·완전성 상태·합계 검사를 설계한다. 평가: 일대다 증폭 반례와 정지일 None을 새 자료로 재현.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “일대다 자료는 목적 단위로 먼저 집계한 뒤 합쳐야 원천 합계가 보존된다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

학습 단원

한 숟갈이 냄비를 대표하려면

해결할 문제와 목표

쉬운 시간대의 기록만 뽑고 전체 대여소를 대표한다고 보고한다.

모집단·표본·확률표집·선택편향과 표본변동을 수치로 구별한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 표본이 많아도 뽑히지 않는 집단이 있으면 그 집단을 자동으로 대표하지 못한다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

국을 저은 뒤 한 숟갈을 뜨면 전체 맛을 짐작하기 낫다.

비유가 닿지 않는 곳: 사람과 시간대는 완전히 섞이지 않으며 비응답·정지 때문에 선택확률이 달라진다.

실제로 작동하는 원리

관심 모집단은 이번 달 모든 정상 운영일의 대기시간이라고 먼저 정의한다. 가상 유한모집단 [1,1,3,7]의 서로 다른 두 위치를 단순무작위 비복원으로 뽑는 모든 조합을 열거한다. 값이 같은 두 1도 다른 개체다. 각 표본평균은 다르지만 동일 확률로 모든 조합을 평균하면 모집단평균과 맞는다. 첫 두 개만 편의추출하면 작은 값 쪽으로 치우친다. 이 열거는 무작위 표집에서의 불편성을 보여줄 뿐 실제 기록이 그 조건을 충족한다는 증거는 아니다. 독립 동일분포·유한 분산이면 표본평균의 변동은 대체로 n이 커질수록 줄지만 큰 표본도 선택편향을 없애지 못한다. 층화표집은 요일·지점별 빠진 층이 없도록 하되 전체 집계에는 모집단 비중을 고려한다. 수치 중간값 추적(위 기본 입력의 실제 계산): population_mean 3.0 all_size2_sample_means [1, 2, 4, 2, 4, 5] mean_of_sample_means 3.0 first_two_mean 1.0 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 가상 모집단 [1,1,3,7], 두 개체씩 모든 비복원 표본.
  3. python3 data-sample.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-sample.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 모든 조합을 값으로 중복제거하면 같은값을 가진 서로 다른 개체의 선택확률이 바뀐다. 위치가 다른 개체는 유지하고, 표집틀에서 빠진 시간대는 추론범위 밖으로 표시한다.

입력 예제

가상 모집단 [1,1,3,7], 두 개체씩 모든 비복원 표본.

예상 결과

population_mean 3.0
all_size2_sample_means [1, 2, 4, 2, 4, 5]
mean_of_sample_means 3.0 first_two_mean 1.0
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 사람과 시간대는 완전히 섞이지 않으며 비응답·정지 때문에 선택확률이 달라진다.
  2. 모든 조합을 값으로 중복제거하면 같은값을 가진 서로 다른 개체의 선택확률이 바뀐다. 위치가 다른 개체는 유지하고, 표집틀에서 빠진 시간대는 추론범위 밖으로 표시한다.

확인 문제

낮 기록만 백만 건이면 밤 이용자를 포함한 모집단 평균이 자동으로 정확해지는가?

자기평가 · 자동채점 아님

평가 기준: 2점: 선택편향과 표본변동 구별, 밤 자료 수집 또는 추론범위 제한 제안 각1점.

해설 보기

아니다. 낮 자료를 늘리는 것은 낮 자료 내부의 변동을 줄일 뿐 밤에 대한 선택편향을 제거하지 않는다.

독립 실습

모집단 [0,2,4,10]의 두 개체 표본평균을 모두 구하라. 앞 두 개만 뽑은 평균과 전체 평균을 비교하고 야간 기록이 없는 자료의 편향을 설명하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 중복값이 아닌 개체 조합 열거, 여섯 평균·평균의 평균, 편의표본 비교, 야간 미포함 반례

완전 실행파일 — 가상자료·Python 표준라이브러리

import itertools, statistics as s, sys

def main(variant=False):
    population=[1,1,3,7] if not variant else [0,2,4,10]
    means=[s.mean(c) for c in itertools.combinations(population,2)]
    biased=s.mean(population[:2])
    print('population_mean',float(s.mean(population)))
    print('all_size2_sample_means',[round(m,3) for m in means])
    print('mean_of_sample_means',float(s.mean(means)),'first_two_mean',float(biased))
    assert math_close(s.mean(means),s.mean(population))
    print('checks OK')
def math_close(a,b):return abs(a-b)<1e-12
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

population_mean 3.0
all_size2_sample_means [1, 2, 4, 2, 4, 5]
mean_of_sample_means 3.0 first_two_mean 1.0
checks OK

독립 변형 정답 stdout — 실습 후 확인

population_mean 4.0
all_size2_sample_means [1, 2, 5, 3, 6, 7]
mean_of_sample_means 4.0 first_two_mean 1.0
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')
실습 해설 보기

variant stdout의 여섯 표본평균을 같은 가중치로 평균하면 모집단평균과 같다. 앞 두 값의 평균은 모집단과 다르다. 야간 관측이 전혀 없으면 낮 기록을 늘려도 야간 대표성이 생기지 않는다. 반례·복구 해설: 모든 조합을 값으로 중복제거하면 같은값을 가진 서로 다른 개체의 선택확률이 바뀐다. 위치가 다른 개체는 유지하고, 표집틀에서 빠진 시간대는 추론범위 밖으로 표시한다. 변형 입력의 실제 검산 stdout: population_mean 4.0 all_size2_sample_means [1, 2, 5, 3, 6, 7] mean_of_sample_means 4.0 first_two_mean 1.0 checks OK

평가 기준: 중복값이 아닌 개체 조합 열거, 여섯 평균·평균의 평균, 편의표본 비교, 야간 미포함 반례 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

주말 방문이 누락된 도서관 자료의 모집단·표집틀·층을 다시 정의한다. 평가: 표집확률 또는 불포함 집단, 비응답, 결론 범위를 명시.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “표본이 많아도 뽑히지 않는 집단이 있으면 그 집단을 자동으로 대표하지 못한다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://docs.python.org/3/library/statistics.html — 2026-10-05 KST: web_extract 본문과 저장된 본문의 variance/pvariance, covariance, linear_regression 절을 실제 열람. 분모 n-1/n, 최소 관측 수, OLS 기울기·절편과 상수 x 오류를 확인.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

평균 하나로 속지 않기

해결할 문제와 목표

평균만 제시하면 오래 기다린 사례가 사라지고 분산의 분모를 잘못 고르면 불확실성도 틀린다.

평균·중앙값·편차제곱합·모분산·표본분산·표준오차를 계산하고 구분한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 평균은 중심, 분산은 퍼짐, 표준오차는 평균 추정의 흔들림을 요약한다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

평균은 모두가 나누어 갖는 가상의 몫이다.

비유가 닿지 않는 곳: 실제 어느 관측도 평균과 같지 않을 수 있으며 평균은 원인을 말하지 않는다.

실제로 작동하는 원리

[1,2,2,9]의 합14·평균3.5에서 편차를 제곱하면 부호가 상쇄되지 않는다. 제곱편차합41을 전체 모집단 요약이면 n으로, 모집단 분산 추정용 표본이면 n-1로 나눈다. 평균을 표본에서 하나 추정해 편차들의 합이0이라는 제약이 생기므로 자유도 하나를 쓴다. iid 조건에서 n-1 보정은 모집단 분산의 불편추정을 제공하지만 편향표본을 고치는 것은 아니다. 표준편차는 분산의 제곱근이라 원래 단위(일), 분산은 일²이다. 평균의 추정 표준오차 s/√n는 iid 가정에 의존한다. 9일을 이상 후보로 조사하되 불리하다고 삭제하지 않는다. [1,1,3,7] 변형은 입력과 결과를 따로 표시해 예제 숫자를 섞지 않는다. 수치 중간값 추적(위 기본 입력의 실제 계산): n=4 sum=14 mean=3.500000 median=2.000000 SS=41.000000 population_variance=10.250000 sample_variance=13.666667 sample_sd=3.696846 estimated_mean_SE=1.848423 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 가상 대기일 [1,2,2,9].
  3. python3 data-stats.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-stats.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: n<2에서 표본분산은 정의되지 않는다. 표본을 더 관측하거나 산출불가로 보고한다. pvariance/variance 분모를 구분하며 NA 제거 이유·개수도 보고한다.

입력 예제

가상 대기일 [1,2,2,9].

예상 결과

n=4 sum=14 mean=3.500000 median=2.000000
SS=41.000000 population_variance=10.250000 sample_variance=13.666667
sample_sd=3.696846 estimated_mean_SE=1.848423
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 실제 어느 관측도 평균과 같지 않을 수 있으며 평균은 원인을 말하지 않는다.
  2. n<2에서 표본분산은 정의되지 않는다. 표본을 더 관측하거나 산출불가로 보고한다. pvariance/variance 분모를 구분하며 NA 제거 이유·개수도 보고한다.

확인 문제

표본분산과 모분산을 같은 SS에서 구하면 왜 값이 다른가?

자기평가 · 자동채점 아님

평가 기준: 3점: 두 분모, 요약/추정 목적, 자유도 이유를 각1점.

해설 보기

모집단 요약은 n, 표본에서 미지 모집단 분산을 추정하는 보정은 n-1을 쓴다. 표본평균 추정으로 자유도 하나가 줄어든다.

독립 실습

[1,1,3,7]로 바꾸어 합·평균·중앙값·제곱편차합·두 분산을 계산하라. 모든 값에10을 더할 때와 2를 곱할 때 표본분산이 어떻게 바뀌는지도 설명하라. 표본 표준편차와 평균의 추정 표준오차도 계산하고 어떤 가정에서 다른 목적에 쓰는지 설명하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 합·중앙값, SS와 두 분모, 이동/배율 불변식, 표준편차와 표준오차 및 이상치 조사 구별

완전 실행파일 — 가상자료·Python 표준라이브러리

import statistics as s, math, sys

def describe(x):
    if len(x)<2:raise ValueError('sample variance needs n>=2')
    avg=sum(x)/len(x)
    ss=sum((v-avg)**2 for v in x)
    return avg,s.median(x),ss,ss/len(x),ss/(len(x)-1)
def main(variant=False):
    x=[1,2,2,9] if not variant else [1,1,3,7]
    avg,med,ss,pop,sample=describe(x)
    print(f'n={len(x)} sum={sum(x)} mean={avg:.6f} median={med:.6f}')
    print(f'SS={ss:.6f} population_variance={pop:.6f} sample_variance={sample:.6f}')
    print(f'sample_sd={math.sqrt(sample):.6f} estimated_mean_SE={math.sqrt(sample/len(x)):.6f}')
    assert math.isclose(pop,s.pvariance(x)) and math.isclose(sample,s.variance(x))
    assert math.isclose(describe([v+10 for v in x])[4],sample)
    assert math.isclose(describe([2*v for v in x])[4],4*sample)
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

n=4 sum=14 mean=3.500000 median=2.000000
SS=41.000000 population_variance=10.250000 sample_variance=13.666667
sample_sd=3.696846 estimated_mean_SE=1.848423
checks OK

독립 변형 정답 stdout — 실습 후 확인

n=4 sum=12 mean=3.000000 median=2.000000
SS=24.000000 population_variance=6.000000 sample_variance=8.000000
sample_sd=2.828427 estimated_mean_SE=1.414214
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')
실습 해설 보기

합12, 평균3, 중앙값2, 제곱편차합24, 모분산6, 표본분산8. 평행이동은 편차를 유지하고 2배 변환은 편차제곱을4배로 만든다. 7일의 사유를 조사하며 자동 삭제하지 않는다. 반례·복구 해설: n<2에서 표본분산은 정의되지 않는다. 표본을 더 관측하거나 산출불가로 보고한다. pvariance/variance 분모를 구분하며 NA 제거 이유·개수도 보고한다. 변형의 표본sd는 sqrt(8), 평균의 추정 SE는 sqrt(8)/sqrt(4)다. 전자는 관측값의 퍼짐, 후자는 iid 가정 아래 평균 추정의 불확실성이다. 변형 입력의 실제 검산 stdout: n=4 sum=12 mean=3.000000 median=2.000000 SS=24.000000 population_variance=6.000000 sample_variance=8.000000 sample_sd=2.828427 estimated_mean_SE=1.414214 checks OK

평가 기준: 합·중앙값, SS와 두 분모, 이동/배율 불변식, 표준편차와 표준오차 및 이상치 조사 구별 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

배차 대기시간 자료에서 단위·표본설계·극단값을 함께 보고한다. 평가: 평균/중앙값, 분산 분모, 극단값 삭제 대신 원천 확인, iid 한계.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “평균은 중심, 분산은 퍼짐, 표준오차는 평균 추정의 흔들림을 요약한다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://docs.python.org/3/library/statistics.html — 2026-10-05 KST: web_extract 본문과 저장된 본문의 variance/pvariance, covariance, linear_regression 절을 실제 열람. 분모 n-1/n, 최소 관측 수, OLS 기울기·절편과 상수 x 오류를 확인.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

우연으로도 나올 숫자인가

해결할 문제와 목표

가상 알림이10건 중8건 성공하자 효과가 증명되었다고 주장한다.

Bernoulli·이항확률·귀무가설·단측 p값·오류 위험을 정확히 계산하고 해석한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: p값은 귀무가설 아래 이런 극단적인 자료가 나올 확률이지 귀무가설이 참일 확률이 아니다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

공정한 동전을 던졌는데 앞면이 너무 자주 나오는지 묻는다.

비유가 닿지 않는 곳: 업무 성공은 동전처럼 독립이 아닐 수 있으며 같은 직원·같은 날의 관측은 묶여 있다.

실제로 작동하는 원리

각 시행의 성공을1·실패를0으로 두고 독립이며 동일 성공확률 p라면 X~Binomial(n,p)다. P(X=j)=조합(n,j)p^j(1-p)^(n-j). H0:p=0.5, 사전 대립가설 H1:p>0.5, alpha=0.05로 정한다. n10·성공8이면 j8,9,10의 확률을 합한다. 8/10은 점추정치이며 꼬리확률은 별개다. 기각 못함은 H0의 증명이 아니다. 제1종 오류는 참인 H0를 기각, 제2종 오류는 실제 차이가 있어도 기각하지 못함이다. 유의성은 효과 크기·비용·현장 중요성과 다르다. 여러 지표를 시도한 뒤 작은 p만 고르면 오류가 커지므로 사전 지표와 다중검정 계획이 필요하다. 신뢰구간은 반복표집 절차의 포함률에 관한 말이며 고정된 모수에 사후 확률95%를 붙이는 뜻이 아니다. R binom.test는 정확구간을 제공하지만 여기 Python 코드는 단측 p값만 구현한다. 수치 중간값 추적(위 기본 입력의 실제 계산): n 10 k 8 estimate 0.8 H0_p 0.5 tail_terms ['45/1024', '5/512', '1/1024'] one_sided_p 7/128 0.05468750 reject_at_0.05 False checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. n=10, 성공8, 귀무 성공확률0.5, 대립 p>0.5, alpha0.05.
  3. python3 data-inference.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-inference.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 성공 수가 시행 수를 넘으면 원천 집계를 고친다. 반복 측정의 의존성은 이항 가정을 깨므로 독립 단위를 다시 정하고 사전에 정한 대립가설 방향을 유지한다.
  7. R 선택 대조(이번 환경 미실행): 이 단원에 제공된 R 파일을 저장하고 이미 승인된 R 환경에서 Rscript binomial.R 를 실행한다. 추가 패키지는 필요하지 않다. 이번 제작 환경에서는 R이 없어 미실행이며 학습자 환경 준비는 START-HERE.txt를 따른다. CSV 없음 오류는 현재 작업 위치·파일명을, NA/상수열 오류는 원천 자료를 점검한다. R 문서와 Python 계산의 일치는 R 런타임 검증이 아니다.

입력 예제

n=10, 성공8, 귀무 성공확률0.5, 대립 p>0.5, alpha0.05.

예상 결과

n 10 k 8 estimate 0.8 H0_p 0.5
tail_terms ['45/1024', '5/512', '1/1024']
one_sided_p 7/128 0.05468750 reject_at_0.05 False
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 업무 성공은 동전처럼 독립이 아닐 수 있으며 같은 직원·같은 날의 관측은 묶여 있다.
  2. 성공 수가 시행 수를 넘으면 원천 집계를 고친다. 반복 측정의 의존성은 이항 가정을 깨므로 독립 단위를 다시 정하고 사전에 정한 대립가설 방향을 유지한다.

확인 문제

성공8/10의 단측 p값이0.05보다 조금 크면 알림 효과가 없다고 증명한 것인가? 이 p값이 무엇을 조건으로 한 확률인지도 설명하라.

자기평가 · 자동채점 아님

평가 기준: 3점: 기각 실패와 무효 증명 구별, H0 하의 꼬리확률 정의, 표본/검정력 한계 각1점.

해설 보기

아니다. 그 기준에서 H0를 기각할 증거가 충분하지 않다는 뜻이다. 작은 표본의 낮은 검정력과 효과 크기를 검토해야 한다.

독립 실습

성공 수만9로 바꾸어 꼬리확률과 기각 여부를 구하라. 직원 한 명이 열 건을 모두 처리했다면 어떤 가정이 위험한가? 효과 확인을 위해 무엇을 추가해야 하는가? 이 p값을 H0의 사후확률이라고 해석하면 왜 틀린지도 쓰라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 이항 조합식과 꼬리 두 항, 정확 p값·사전 기각 판단, p값의 비사후확률 해석, 독립성·비용/효과 한계

완전 실행파일 — 가상자료·Python 표준라이브러리

from math import comb,isclose
from fractions import Fraction
import sys

def tail(k,n,p):
    if not 0<=k<=n or not 0<=p<=1:raise ValueError('bad binomial input')
    return sum(comb(n,j)*p**j*(1-p)**(n-j) for j in range(k,n+1))
def main(variant=False):
    n,k=10,8
    if variant:k=9
    p0=Fraction(1,2)
    p=tail(k,n,p0)
    print('n',n,'k',k,'estimate',k/n,'H0_p',float(p0))
    print('tail_terms',[str(Fraction(comb(n,j),2**n)) for j in range(k,n+1)])
    print('one_sided_p',str(p),f'{float(p):.8f}','reject_at_0.05',p<Fraction(5,100))
    assert tail(0,n,p0)==1
    assert tail(9,n,p0)<tail(8,n,p0)
    assert tail(8,10,p0)==Fraction(56,1024)
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

R 공식문서 검토·미실행 교차대조

cat(sprintf("base_p=%.8f\n",binom.test(8,10,p=0.5,alternative="greater")$p.value))
cat(sprintf("variant_p=%.8f\n",binom.test(9,10,p=0.5,alternative="greater")$p.value))

R 문서·수학 대조 예상 — 미실행

Rscript binomial.R의 예상: base_p=0.05468750, variant_p=0.01074219. R에서 실제 실행하지 않았다. binom.test 단측 greater와 정확 이항합의 수치 대조다.

기본 입력 예상 stdout — 실제 Python 실행으로 확인

n 10 k 8 estimate 0.8 H0_p 0.5
tail_terms ['45/1024', '5/512', '1/1024']
one_sided_p 7/128 0.05468750 reject_at_0.05 False
checks OK

독립 변형 정답 stdout — 실습 후 확인

n 10 k 9 estimate 0.9 H0_p 0.5
tail_terms ['5/512', '1/1024']
one_sided_p 11/1024 0.01074219 reject_at_0.05 True
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')
실습 해설 보기

9와10 성공의 두 확률을 합한다. variant stdout의 정확분수와 p값은0.05보다 작아 사전 단측검정에서 기각한다. 같은 직원의 연관된 시행은 독립 가정을 위협한다. 대조군·배정 설계와 효과크기·비용을 함께 확인한다. 반례·복구 해설: 성공 수가 시행 수를 넘으면 원천 집계를 고친다. 반복 측정의 의존성은 이항 가정을 깨므로 독립 단위를 다시 정하고 사전에 정한 대립가설 방향을 유지한다. 변형 입력의 실제 검산 stdout: n 10 k 9 estimate 0.9 H0_p 0.5 tail_terms ['5/512', '1/1024'] one_sided_p 11/1024 0.01074219 reject_at_0.05 True checks OK

평가 기준: 이항 조합식과 꼬리 두 항, 정확 p값·사전 기각 판단, p값의 비사후확률 해석, 독립성·비용/효과 한계 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

가상 반납 알림 실험의 성공 정의·대조군·독립 단위·사전 단측/양측 선택을 작성한다. 평가: 결과를 보기 전 가설 고정, 비용지표, 다중검정과 비응답 기록.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “p값은 귀무가설 아래 이런 극단적인 자료가 나올 확률이지 귀무가설이 참일 확률이 아니다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

학습 단원

점들을 보고 직선을 실제로 맞추기

해결할 문제와 목표

기울기2라는 답을 출력하기만 한 코드는 데이터에서 관계를 학습한 것이 아니다.

OLS를 실제 적합하고 잔차·미관측 예측오차·인과 한계를 설명한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 회귀는 주어진 자료의 제곱오차를 줄이는 선을 맞추는 일이지 원인을 증명하는 일이 아니다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

곧은 자를 점들의 가운데에 놓아 세로로 빗나간 거리의 제곱합을 줄인다.

비유가 닿지 않는 곳: 모든 관계가 직선은 아니고 관측 범위 밖에서 자를 늘리면 잘못 예측할 수 있다.

실제로 작동하는 원리

절편이 있는 최소제곱 회귀는 Sxx=Σ(x-x평균)², Sxy=Σ(x-x평균)(y-y평균), 기울기 b=Sxy/Sxx, 절편 a=y평균-bx평균이다. x=[1,2,3], y=[2,3,5]를 실제 fit에 전달하며 완전 직선이 아니므로 잔차가 남는다. 잔차는 실제-예측, SSE는 잔차제곱합이다. 절편이 있는 OLS에서는 잔차합과 x·잔차합이0에 가깝다. 미관측 x4의 실제6은 적합 뒤 평가에만 쓴다. 오차·비선형·이분산·영향점은 잔차와 도메인 점검으로 찾는다. OLS 계산 자체에 정규성이 필요하지 않지만 통상 작은 표본의 검정·구간에는 추가 오차 가정이 있다. 휴일·날씨·운영시간이 행사와 함께 바뀌면 회귀계수만으로 행사 효과를 말할 수 없다. 수치 중간값 추적(위 기본 입력의 실제 계산): Sxx=2.000000 Sxy=3.000000 intercept=0.333333 slope=1.500000 residuals [0.166667, -0.333333, 0.166667] SSE=0.166667 unseen_x=4 prediction=6.333333 actual=6 absolute_error=0.333333 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 학습 x=[1,2,3], y=[2,3,5]; 평가 x4의 실제값6.
  3. python3 data-regression.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-regression.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: constant x 오류에서는 기울기를0으로 억지 지정하지 않는다. 다양한 x 자료를 추가하거나 상수 예측만 보고한다. 큰 잔차는 원천 오류·비선형·교란을 조사한다.
  7. R 선택 대조(이번 환경 미실행): 제공 CSV와 R 파일을 함께 저장하고 이미 승인된 R 환경에서 Rscript regression.R 를 실행한다. 추가 패키지는 필요하지 않다. 이번 제작 환경에서는 R이 없어 미실행이며 학습자 환경 준비는 START-HERE.txt를 따른다. CSV 없음 오류는 현재 작업 위치·파일명을, NA/상수열 오류는 원천 자료를 점검한다. R 문서와 Python 계산의 일치는 R 런타임 검증이 아니다.

입력 예제

학습 x=[1,2,3], y=[2,3,5]; 평가 x4의 실제값6.

예상 결과

Sxx=2.000000 Sxy=3.000000 intercept=0.333333 slope=1.500000
residuals [0.166667, -0.333333, 0.166667] SSE=0.166667
unseen_x=4 prediction=6.333333 actual=6 absolute_error=0.333333
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 모든 관계가 직선은 아니고 관측 범위 밖에서 자를 늘리면 잘못 예측할 수 있다.
  2. constant x 오류에서는 기울기를0으로 억지 지정하지 않는다. 다양한 x 자료를 추가하거나 상수 예측만 보고한다. 큰 잔차는 원천 오류·비선형·교란을 조사한다.

확인 문제

기울기가 양수면 행사 개최가 수요를 증가시킨 원인이라고 단정할 수 있는가?

자기평가 · 자동채점 아님

평가 기준: 3점: 예측/인과 구별, 구체 교란 하나, 대조·배정 또는 추론 제한 제안 각1점.

해설 보기

아니다. 이 자료의 예측 관계일 뿐 휴일·날씨·운영시간 같은 교란이나 역인과가 남을 수 있다. 배정·설계 근거가 추가로 필요하다.

독립 실습

y를 [3,3,6]으로 바꾸어 Sxx·Sxy·계수·잔차·SSE를 다시 구하라. 미관측 x4의 실제7과 비교하고 상관과 인과가 다른 반례를 쓰라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. Sxx/Sxy에서 계수 도출, 잔차·SSE 검산, 미관측 절대오차와 학습 제외, 구체 교란 반례

완전 실행파일 — 가상자료·Python 표준라이브러리

import statistics as s, math, sys

def fit(x,y):
    if len(x)!=len(y) or len(x)<2:raise ValueError('paired n>=2 required')
    xm,ym=s.mean(x),s.mean(y)
    xx=sum((v-xm)**2 for v in x);xy=sum((a-xm)*(b-ym) for a,b in zip(x,y))
    if xx==0:raise ValueError('constant x')
    slope=xy/xx;intercept=ym-slope*xm
    return intercept,slope,xx,xy

def main(variant=False):
    x=[1,2,3];y=[2,3,5] if not variant else [3,3,6]
    a,b,xx,xy=fit(x,y);res=[v-(a+b*t) for t,v in zip(x,y)]
    print(f'Sxx={xx:.6f} Sxy={xy:.6f} intercept={a:.6f} slope={b:.6f}')
    print('residuals',[round(v,6) for v in res],f'SSE={sum(v*v for v in res):.6f}')
    actual=6 if not variant else 7
    print(f'unseen_x=4 prediction={a+4*b:.6f} actual={actual} absolute_error={abs(actual-a-4*b):.6f}')
    check=s.linear_regression(x,y)
    assert math.isclose(b,check.slope) and math.isclose(a,check.intercept,abs_tol=1e-12)
    assert abs(sum(res))<1e-10 and abs(sum(t*r for t,r in zip(x,res)))<1e-10
    try:fit([1,1],[1,2])
    except ValueError:pass
    else:raise AssertionError('constant x accepted')
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

regression.csv

x,y
1,2
2,3
3,5

공식 lm 인수 검토·R 미실행

d <- read.csv("regression.csv")
f <- lm(y ~ x,data=d,na.action=na.fail)
print(coef(f)); print(residuals(f)); print(sum(residuals(f)^2))
print(predict(f,newdata=data.frame(x=4)))

R 문서·수학 대조 예상 — 미실행

Rscript regression.R의 수학적 예상: (Intercept)=1/3, x=1.5, residuals=[1/6,-1/3,1/6], SSE=1/6, x4 prediction=19/3. 출력의 이름/공백/표시자릿수는 R 환경에서 확인해야 한다. R 미실행.

기본 입력 예상 stdout — 실제 Python 실행으로 확인

Sxx=2.000000 Sxy=3.000000 intercept=0.333333 slope=1.500000
residuals [0.166667, -0.333333, 0.166667] SSE=0.166667
unseen_x=4 prediction=6.333333 actual=6 absolute_error=0.333333
checks OK

독립 변형 정답 stdout — 실습 후 확인

Sxx=2.000000 Sxy=3.000000 intercept=1.000000 slope=1.500000
residuals [0.5, -1.0, 0.5] SSE=1.500000
unseen_x=4 prediction=7.000000 actual=7 absolute_error=0.000000
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')
실습 해설 보기

variant stdout을 Sxx와 Sxy의 비로 검산한다. 직선이 달라져 미관측 예측오차도 변한다. 예컨대 행사일에 휴일이 겹치면 휴일이 수요와 행사 편성의 공통 원인일 수 있다. x4 실제7을 fit에 넣으면 평가 독립성을 잃는다. 반례·복구 해설: constant x 오류에서는 기울기를0으로 억지 지정하지 않는다. 다양한 x 자료를 추가하거나 상수 예측만 보고한다. 큰 잔차는 원천 오류·비선형·교란을 조사한다. 변형 입력의 실제 검산 stdout: Sxx=2.000000 Sxy=3.000000 intercept=1.000000 slope=1.500000 residuals [0.5, -1.0, 0.5] SSE=1.500000 unseen_x=4 prediction=7.000000 actual=7 absolute_error=0.000000 checks OK

평가 기준: Sxx/Sxy에서 계수 도출, 잔차·SSE 검산, 미관측 절대오차와 학습 제외, 구체 교란 반례 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

도서관 예약 건수와 운영시간의 회귀를 설계한다. 평가: 학습/평가 구분, 단위·관측범위, 잔차 확인, 운영시간 효과의 교란.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “회귀는 주어진 자료의 제곱오차를 줄이는 선을 맞추는 일이지 원인을 증명하는 일이 아니다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://docs.python.org/3/library/statistics.html — 2026-10-05 KST: web_extract 본문과 저장된 본문의 variance/pvariance, covariance, linear_regression 절을 실제 열람. 분모 n-1/n, 최소 관측 수, OLS 기울기·절편과 상수 x 오류를 확인.
  • https://stat.ethz.ch/R-manual/R-devel/library/stats/html/lm.html — 2026-10-05 KST: web_extract가 반환한 Description/Usage/Arguments 범위에서 lm(formula,data), QR 방식, weights가 없을 때 OLS, na.action을 확인. 잘린 Details 이후 전체를 확인했다고 주장하지 않음. R 미실행.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

내일의 답을 몰래 보지 않는 예측

해결할 문제와 목표

후행 평균을 계산한 것만으로 미래 예측 성능까지 검증했다고 보고한다.

과거만 사용하는 한 시점 앞 예측과 walk-forward MAE를 계산한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 예측 시점에 알 수 있었던 값으로 예측을 저장한 뒤 실제값과 비교한다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

영화 결말을 읽지 않고 다음 장면을 맞힌다.

비유가 닿지 않는 곳: 과거를 지켰어도 계절 변화·폐쇄·정책 변경 때문에 미래 분포가 달라질 수 있다.

실제로 작동하는 원리

시계열은 순서가 있는 관측이다. 추세는 장기 변화, 계절성은 일정 주기의 반복, 잡음은 그 외 변동이다. 후행2기간 평균 (y[t-2]+y[t-1])/2로 t를 예측한다. 예제는 1~4월을 초기 관측, 5·6월을 평가한다. 5월을 예측한 뒤 실제5월이 관측되면 이를6월 예측에 쓸 수 있는 한 단계 walk-forward 설정이다. 4월 시점에5·6월을 동시에 예측하는 다단계 설정과 다르다. MAE=평가 절대오차합/평가건수이며 최근값 예측도 같은 평가월에서 비교한다. 창 크기 선택은 평가 이전 기간에서 고정했다. 평가값을 본 뒤 창을 바꾸려면 별도 최종 시험구간이 필요하다. 중심이동평균·전체기간 표준화는 미래 누수가 될 수 있다. 정상관측이 빠진 달을0으로 채우면 시간 간격과 의미가 바뀐다. 6개월만으로 계절모형을 입증하지 않는다. 수치 중간값 추적(위 기본 입력의 실제 계산): month source_months prediction actual abs_error 5 [3, 4] 9.0 12 3 6 [4, 5] 11.0 14 3 MA2_MAE=3.000000 last_value_MAE=2.000000 future_target_mutation_does_not_change_predictions OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 월1~6 [2,4,8,10,12,14]; 초기4개월·평가2개월, 창2.
  3. python3 data-time.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-time.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: insufficient past이면 최초 학습구간을 늘리거나 평가 시작 시점을 늦춘다. 미래 실제값을 끌어와 창을 채우지 않는다. 관측월 간격이 다르면 동일 월별 데이터로 먼저 정의한다.

입력 예제

월1~6 [2,4,8,10,12,14]; 초기4개월·평가2개월, 창2.

예상 결과

month source_months prediction actual abs_error
5 [3, 4] 9.0 12 3
6 [4, 5] 11.0 14 3
MA2_MAE=3.000000 last_value_MAE=2.000000
future_target_mutation_does_not_change_predictions OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 과거를 지켰어도 계절 변화·폐쇄·정책 변경 때문에 미래 분포가 달라질 수 있다.
  2. insufficient past이면 최초 학습구간을 늘리거나 평가 시작 시점을 늦춘다. 미래 실제값을 끌어와 창을 채우지 않는다. 관측월 간격이 다르면 동일 월별 데이터로 먼저 정의한다.

확인 문제

월을 무작위로 섞은 평가와 전체기간으로 맞춘 표준화가 미래 예측 시험에서 왜 위험한가?

자기평가 · 자동채점 아님

평가 기준: 3점: 미래 정보 경로, 시간순 분리, 전처리 학습범위 제한 각1점.

해설 보기

학습·전처리에 예측 시점 이후 정보가 들어갈 수 있다. 시간순 학습/검증/시험과 학습구간에서만 적합한 변환을 사용한다.

독립 실습

5·6월이6·4로 급감한 [2,4,8,10,6,4]에서 예측값·절대오차·MAE를 다시 계산하고 최근값 기준선과 비교하라. 마지막 실제값만100 늘려도 두 평가 예측이 바뀌지 않는 이유를 쓰라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 두 평가월의 과거 인덱스, 예측·오차·MAE, 동일기간 최근값 기준선 비교, 미래 타깃 변형 불변식 설명

완전 실행파일 — 가상자료·Python 표준라이브러리

import statistics as s, sys

def forecast(history,window):
    if window<1 or len(history)<window:raise ValueError('insufficient past')
    return s.mean(history[-window:])
def evaluate(values,start,window):
    records=[]
    for t in range(start,len(values)):
        history=values[:t]
        p=forecast(history,window)
        records.append((t+1,list(range(t-window+1,t+1)),float(p),values[t],abs(p-values[t])))
    return records,s.mean(r[-1] for r in records)
def main(variant=False):
    y=[2,4,8,10,12,14] if not variant else [2,4,8,10,6,4]
    rows,mae=evaluate(y,4,2)
    print('month source_months prediction actual abs_error')
    for row in rows:print(*row)
    naive,naive_mae=evaluate(y,4,1)
    print(f'MA2_MAE={mae:.6f} last_value_MAE={naive_mae:.6f}')
    changed=y[:];changed[-1]+=100
    altered,_=evaluate(changed,4,2)
    assert [r[2] for r in altered]==[r[2] for r in rows]
    assert all(max(r[1])<r[0] for r in rows)
    print('future_target_mutation_does_not_change_predictions OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

month source_months prediction actual abs_error
5 [3, 4] 9.0 12 3
6 [4, 5] 11.0 14 3
MA2_MAE=3.000000 last_value_MAE=2.000000
future_target_mutation_does_not_change_predictions OK

독립 변형 정답 stdout — 실습 후 확인

month source_months prediction actual abs_error
5 [3, 4] 9.0 6 3
6 [4, 5] 8.0 4 4
MA2_MAE=3.500000 last_value_MAE=3.000000
future_target_mutation_does_not_change_predictions 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')
실습 해설 보기

5월 예측에는3·4월만, 6월 예측에는4·5월만 들어간다. variant stdout의 예측·오차를 비교한다. 마지막6월 실제는 이후 예측이 없으므로 두 예측에 들어가지 않는다. 급감에서 뒤따르는 평균의 지연이 생긴다. 반례·복구 해설: insufficient past이면 최초 학습구간을 늘리거나 평가 시작 시점을 늦춘다. 미래 실제값을 끌어와 창을 채우지 않는다. 관측월 간격이 다르면 동일 월별 데이터로 먼저 정의한다. 변형 입력의 실제 검산 stdout: month source_months prediction actual abs_error 5 [3, 4] 9.0 6 3 6 [4, 5] 8.0 4 4 MA2_MAE=3.500000 last_value_MAE=3.000000 future_target_mutation_does_not_change_predictions OK

평가 기준: 두 평가월의 과거 인덱스, 예측·오차·MAE, 동일기간 최근값 기준선 비교, 미래 타깃 변형 불변식 설명 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

계절 수요가 있는 우산 대여소에 평가기간·예측지평·요일 기준선을 설계한다. 평가: 시점별 정보집합, 결측 달 처리, 창 선택용 검증과 최종시험 분리.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “예측 시점에 알 수 있었던 값으로 예측을 저장한 뒤 실제값과 비교한다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

학습 단원

서로 다른 자를 맞춘 뒤 큰 움직임 찾기

해결할 문제와 목표

가격의 숫자가 크다는 이유로 가장 중요한 특성으로 선택하거나 PCA축은 반드시 무의미하다고 설명한다.

학습 표준화→2x2 공분산→고유분해→점수→재구성 손실을 실제 계산한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: PCA는 분산이 큰 직교 방향을 찾으며 축의 의미는 원래 변수와 적재량을 보고 신중히 해석한다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

점들의 그림자가 가장 길게 펼쳐지는 방향으로 손전등을 돌린다.

비유가 닿지 않는 곳: 그림자가 길다고 업무에 중요한 방향은 아니며 서로 다른 단위의 길이는 먼저 비교 기준을 정해야 한다.

실제로 작동하는 원리

두 변수는 가상 크기와 가상 유지비다. 각 열의 학습 평균을 빼고 표본 표준편차(n-1)로 나눈 z를 만든다. 공분산 C=ZᵀZ/(n-1)의 대각은1, 비대각은 상관에 해당한다. [[a,b],[b,d]]의 고유값은 (a+d±sqrt((a-d)²+4b²))/2, 고유벡터는 Cv=λv를 만족한다. 큰 고유값 방향 v1에 투영한 z·v1이 PC1 점수이고 설명분산비는 λ1/(λ1+λ2)다. 두 번째 축을 버리면 표준화 공간 재구성 제곱오차합=(n-1)λ2다. 원단위 오차는 열별 sd를 되돌려야 한다. 양의 적재량 둘은 함께 커지는 경향으로 해석 가능하지만 원인·중요도를 증명하지 않는다. 축 부호는 뒤집어도 같고 고유값 동률이면 첫 축이 유일하지 않다. scale=False인 공분산 PCA도 가능하며 그 경우 단위 변경에 민감하다. 예측 파이프라인에서는 평균·sd·축 모두 학습자료로만 맞추고 시험자료에는 고정 변환을 적용한다. 수치 중간값 추적(위 기본 입력의 실제 계산): means [2.5, 25] sample_sd [1.290994, 12.909944] covariance_a_b_d [1.0, 0.8, 1.0] eigenvalues [1.8, 0.2] PC1_loading [0.707107, 0.707107] explained_ratio [0.9, 0.1] scores [[-1.643168, -0.0], [-0.0, 0.547723], [0.0, -0.547723], [1.643168, 0.0]] one_component_SSE=0.600000 checks OK R prcomp는 실제 구현에서 중심화·필요시 표준화한 행렬의 SVD를 사용한다. 여기의2변수 공분산 고유분해는 교육용 동치 원리를 보여주며 R의 수치알고리즘을 그대로 복제한 것이 아니다.

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 크기/유지비 [(1,10),(2,30),(3,20),(4,40)], 표본 표준화 사용.
  3. python3 data-pca.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-pca.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 상수열은 표준화 불가다. 의미를 검토해 제외한 뒤 다시 적합하거나 중심화만 하는 목적을 명시한다. 고유값 동률/축부호 차이는 버그가 아니므로 잔차·투영공간으로 비교한다.
  7. R 선택 대조(이번 환경 미실행): 제공 CSV와 R 파일을 함께 저장하고 이미 승인된 R 환경에서 Rscript pca.R 를 실행한다. 추가 패키지는 필요하지 않다. 이번 제작 환경에서는 R이 없어 미실행이며 학습자 환경 준비는 START-HERE.txt를 따른다. CSV 없음 오류는 현재 작업 위치·파일명을, NA/상수열 오류는 원천 자료를 점검한다. R 문서와 Python 계산의 일치는 R 런타임 검증이 아니다.

입력 예제

크기/유지비 [(1,10),(2,30),(3,20),(4,40)], 표본 표준화 사용.

예상 결과

means [2.5, 25] sample_sd [1.290994, 12.909944]
covariance_a_b_d [1.0, 0.8, 1.0] eigenvalues [1.8, 0.2]
PC1_loading [0.707107, 0.707107] explained_ratio [0.9, 0.1]
scores [[-1.643168, -0.0], [-0.0, 0.547723], [0.0, -0.547723], [1.643168, 0.0]] one_component_SSE=0.600000
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 고정 답을 출력하지 않고 실제 데이터에서 평균·sd·공분산·고유값·좌표를 산출한다.
  2. Cv=λv와 1축 재구성 SSE=(n-1)λ2를 계산값끼리 비교한다.
  3. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 그림자가 길다고 업무에 중요한 방향은 아니며 서로 다른 단위의 길이는 먼저 비교 기준을 정해야 한다.
  2. 상수열은 표준화 불가다. 의미를 검토해 제외한 뒤 다시 적합하거나 중심화만 하는 목적을 명시한다. 고유값 동률/축부호 차이는 버그가 아니므로 잔차·투영공간으로 비교한다.

확인 문제

PC1의 두 적재량이 같은 부호라면 해석은 전혀 불가능한가? 그 축을 중요한 원인으로 단정해도 되는가? 축 부호가 반대로 나오는 경우도 설명하라.

자기평가 · 자동채점 아님

평가 기준: 3점: 원변수와 적재량을 바탕으로 해석 가능하다는 설명1점, 분산 요약과 원인/중요도 구별1점, 축과 점수의 부호를 함께 뒤집어도 같은 재구성이라는 설명1점. 세 항목 모두 필요하다.

해설 보기

원변수 정의와 적재량에 따라 공동 증가 방향으로 해석할 수 있다. 그러나 분산 요약은 업무 중요도나 인과를 보장하지 않는다. 축과 점수의 부호를 함께 뒤집어도 투영/재구성은 같으므로 부호 자체를 의미의 반전으로 오해하지 않는다.

독립 실습

[(1,40),(2,20),(3,30),(4,10)]으로 변형해 공분산의 부호·PC1 적재량·설명분산비·1축 손실을 구하라. 유지비 단위를100배 바꿔도 표준화 PCA의 고유값이 유지되는지 확인하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 학습 평균·sd, 2x2 고유분해 잔차, 변형 축의 상대부호, 설명비·손실 및 단위변환 불변식

완전 실행파일 — 가상자료·Python 표준라이브러리

import math,statistics as st,sys

def eigen2(a,b,d):
    # 대칭 [[a,b],[b,d]]의 고유값 및 단위 고유벡터를 계산한다.
    theta=0.5*math.atan2(2*b,a-d)
    v=(math.cos(theta),math.sin(theta));w=(-v[1],v[0])
    gap=math.hypot(a-d,2*b)
    return [(a+d+gap)/2,(a+d-gap)/2],[v,w]
def pca(rows,scale=True):
    n=len(rows)
    if n<2 or any(len(r)!=2 for r in rows):raise ValueError('n>=2, two columns required')
    means=[st.mean(r[j] for r in rows) for j in range(2)]
    sd=[st.stdev(r[j] for r in rows) if scale else 1.0 for j in range(2)]
    if min(sd)<=0:raise ValueError('constant column cannot be standardized')
    z=[[(r[j]-means[j])/sd[j] for j in range(2)] for r in rows]
    a=sum(r[0]**2 for r in z)/(n-1)
    b=sum(r[0]*r[1] for r in z)/(n-1)
    d=sum(r[1]**2 for r in z)/(n-1)
    values,vectors=eigen2(a,b,d)
    scores=[[sum(r[j]*v[j] for j in range(2)) for v in vectors] for r in z]
    error=sum(sum((r[j]-score[0]*vectors[0][j])**2 for j in range(2)) for r,score in zip(z,scores))
    for lam,v in zip(values,vectors):
        assert abs(a*v[0]+b*v[1]-lam*v[0])<1e-9
        assert abs(b*v[0]+d*v[1]-lam*v[1])<1e-9
    assert abs(error-(n-1)*values[1])<1e-9
    return means,sd,(a,b,d),values,vectors,scores,error

def fmt(values):return [round(v,6) for v in values]
def main(variant=False):
    rows=[(1,10),(2,30),(3,20),(4,40)]
    if variant:rows=[(1,40),(2,20),(3,30),(4,10)]
    means,sd,cov,values,vectors,scores,error=pca(rows)
    print('means',fmt(means),'sample_sd',fmt(sd))
    print('covariance_a_b_d',fmt(cov),'eigenvalues',fmt(values))
    print('PC1_loading',fmt(vectors[0]),'explained_ratio',fmt([v/sum(values) for v in values]))
    print('scores',[fmt(r) for r in scores],f'one_component_SSE={error:.6f}')
    # 양의 단위변환 후 표준화한 결과는 같아야 한다.
    scaled=pca([(a,100*b) for a,b in rows])
    assert all(abs(a-b)<1e-9 for a,b in zip(values,scaled[3]))
    # 비대각 일반행렬, 동률고유값, 상수열 실패를 별도 확인한다.
    val,vec=eigen2(4,1,2)
    assert math.isclose(sum(val),6) and math.isclose(val[0]*val[1],7)
    assert eigen2(1,0,1)[0]==[1,1]
    try:pca([(1,2),(1,3)])
    except ValueError:pass
    else:raise AssertionError('constant column accepted')
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

pca.csv

size,cost
1,10
2,30
3,20
4,40

공식 인수 검토·R 미실행; 축 부호 차이 허용

d <- read.csv("pca.csv")
f <- prcomp(d,center=TRUE,scale.=TRUE)
print(f$sdev^2); print(f$rotation); print(f$x)
cat("explained",f$sdev^2/sum(f$sdev^2),"\n")

R 문서·수학 대조 예상 — 미실행

Rscript pca.R의 예상 고유값 f$sdev^2=[1.8,0.2], 설명비[0.9,0.1]. PC1 적재량의 절댓값은 둘 다1/sqrt(2)이고 상대부호는 같다. 점수는 Python expected.txt와 축별 반전 동치까지 비교한다. R 미실행, 문자열 완전일치를 요구하지 않는다.

기본 입력 예상 stdout — 실제 Python 실행으로 확인

means [2.5, 25] sample_sd [1.290994, 12.909944]
covariance_a_b_d [1.0, 0.8, 1.0] eigenvalues [1.8, 0.2]
PC1_loading [0.707107, 0.707107] explained_ratio [0.9, 0.1]
scores [[-1.643168, -0.0], [-0.0, 0.547723], [0.0, -0.547723], [1.643168, 0.0]] one_component_SSE=0.600000
checks OK

독립 변형 정답 stdout — 실습 후 확인

means [2.5, 25] sample_sd [1.290994, 12.909944]
covariance_a_b_d [1.0, -0.8, 1.0] eigenvalues [1.8, 0.2]
PC1_loading [0.707107, -0.707107] explained_ratio [0.9, 0.1]
scores [[-1.643168, 0.0], [-0.0, -0.547723], [0.0, 0.547723], [1.643168, -0.0]] one_component_SSE=0.600000
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')
실습 해설 보기

변형에서는 비대각 공분산 부호와 두 적재량의 상대 부호가 바뀐다. 고유값·설명분산비·손실은 기본 예제와 같다. 절대 부호는 임의이므로 벡터 문자열이 아니라 Cv=λv, 단위길이, 설명분산 및 재구성 오차로 검사한다. 반례·복구 해설: 상수열은 표준화 불가다. 의미를 검토해 제외한 뒤 다시 적합하거나 중심화만 하는 목적을 명시한다. 고유값 동률/축부호 차이는 버그가 아니므로 잔차·투영공간으로 비교한다. 변형 입력의 실제 검산 stdout: means [2.5, 25] sample_sd [1.290994, 12.909944] covariance_a_b_d [1.0, -0.8, 1.0] eigenvalues [1.8, 0.2] PC1_loading [0.707107, -0.707107] explained_ratio [0.9, 0.1] scores [[-1.643168, 0.0], [-0.0, -0.547723], [0.0, 0.547723], [1.643168, -0.0]] one_component_SSE=0.600000 checks OK

평가 기준: 학습 평균·sd, 2x2 고유분해 잔차, 변형 축의 상대부호, 설명비·손실 및 단위변환 불변식 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

장비 무게·가격을 요약할 때 표준화 목적과 버린 분산의 손실을 설명한다. 평가: 단위, 학습 전처리, 적재량 해석, 원인 주장 배제.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “PCA는 분산이 큰 직교 방향을 찾으며 축의 의미는 원래 변수와 적재량을 보고 신중히 해석한다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://stat.ethz.ch/R-manual/R-devel/library/stats/html/prcomp.html — 2026-10-05 KST: web_extract 반환 Usage/Arguments에서 center=TRUE, scale.=FALSE 기본값과 단위분산 표준화 선택을 확인. 반환 본문은 newdata 항목에서 잘려 전체 문서 열람은 아님. 독자 2x2 고유분해 코드는 R prcomp 구현과 동일하다고 주장하지 않음.
  • https://stat.ethz.ch/R-manual/R-devel/library/stats/html/prcomp.html — 부모 통합검수에서 공식 Details/Value/Note를 추가 실제 조회. prcomp는 공분산 eigen이 아닌 중심화 행렬 SVD, 분산 분모N-1, rotation 적재량, 축별 임의 부호와 상수열 scale 오류를 확인. R 런타임 미실행.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

거리표만 보고 작은 지도 그리기

해결할 문제와 목표

정답 좌표0,1,2를 적어 놓고 거리표를 좌표로 변환했다고 주장한다.

거리제곱 이중중심화·Jacobi 고유분해로 좌표를 산출하고 거리 왜곡을 검산한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: MDS는 대상 간 거리에서 출발해 그 거리를 닮은 좌표를 찾는다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

도시 이름과 도시 사이 거리만 받아 지도를 되그린다.

비유가 닿지 않는 곳: 모든 비유사도가 평면의 직선거리로 표현되지는 않고 방향·회전·반전은 유일하지 않다.

실제로 작동하는 원리

고전적 MDS는 D²의 각 행평균 r_i와 전체평균 g를 구하고 B_ij=-0.5(D²_ij-r_i-r_j+g)로 내적 행렬을 만든다. B의 대칭 고유분해 B=VΛVᵀ에서 큰 양의 고유값 k개를 택해 좌표 X=V_k sqrt(Λ_k)를 계산한다. 제공 Jacobi는 가장 큰 비대각 원소를 회전으로0에 가깝게 만들고 고유벡터를 누적한다. 기본 AB1·BC1·AC2는 한 직선에서 정확 재현된다. 변형 AB3·AC4·BC5는2차원에서 재현되지만1차원에서는 손실이 생긴다. normalized_distance_error는 sqrt(Σ(복원거리-입력거리)²/Σ입력거리²)이며 고전적 MDS가 직접 최소화하는 목적과 이 보고지표를 혼동하지 않는다. 음의 고유값은 비유클리드 비유사도 또는 수치오차를 시사한다. 큰 음수는 숨기지 않고 보고하며 양수만 사용하면 거리손실을 검토한다. PCA는 원래 변수의 분산에서, MDS는 대상 간 거리에서 출발한다. 수치 중간값 추적(위 기본 입력의 실제 계산): double_centered_B [[1.0, 0.0, -1.0], [0.0, -0.0, 0.0], [-1.0, 0.0, 1.0]] eigenvalues [2.0, 0.0, -0.0] coordinates [[1.0], [0.0], [-1.0]] reconstructed_distances [[0.0, 1.0, 2.0], [1.0, 0.0, 1.0], [2.0, 1.0, 0.0]] normalized_distance_error=0.000000 non_euclidean_negative_eigenvalue -0.833333 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 거리행렬 [[0,1,2],[1,0,1],[2,1,0]], k1.
  3. python3 data-mds.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-mds.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 비대칭/음수/비영 대각은 원천 거리정의를 수정한다. 큰 음의 고유값을 절댓값으로 바꾸지 않는다. 차원손실을 보고하거나 거리정의·차원 수를 재검토한다. Jacobi 반복한도 오류는 수렴오차·입력규모를 확인한다.
  7. R 선택 대조(이번 환경 미실행): 제공 CSV와 R 파일을 함께 저장하고 이미 승인된 R 환경에서 Rscript mds.R 를 실행한다. 추가 패키지는 필요하지 않다. 이번 제작 환경에서는 R이 없어 미실행이며 학습자 환경 준비는 START-HERE.txt를 따른다. CSV 없음 오류는 현재 작업 위치·파일명을, NA/상수열 오류는 원천 자료를 점검한다. R 문서와 Python 계산의 일치는 R 런타임 검증이 아니다.

입력 예제

거리행렬 [[0,1,2],[1,0,1],[2,1,0]], k1.

예상 결과

double_centered_B [[1.0, 0.0, -1.0], [0.0, -0.0, 0.0], [-1.0, 0.0, 1.0]]
eigenvalues [2.0, 0.0, -0.0]
coordinates [[1.0], [0.0], [-1.0]] reconstructed_distances [[0.0, 1.0, 2.0], [1.0, 0.0, 1.0], [2.0, 1.0, 0.0]]
normalized_distance_error=0.000000
non_euclidean_negative_eigenvalue -0.833333
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 입력 거리에서 좌표를 실제 산출하고 다시 거리를 계산한다.
  2. Jacobi의 Bv=λv 잔차와 비유클리드 반례의 음의 고유값·손실을 검사한다.
  3. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 모든 비유사도가 평면의 직선거리로 표현되지는 않고 방향·회전·반전은 유일하지 않다.
  2. 비대칭/음수/비영 대각은 원천 거리정의를 수정한다. 큰 음의 고유값을 절댓값으로 바꾸지 않는다. 차원손실을 보고하거나 거리정의·차원 수를 재검토한다. Jacobi 반복한도 오류는 수렴오차·입력규모를 확인한다.

확인 문제

MDS 지도를 뒤집었더니 A의 좌표 부호가 바뀌었다. 틀린 결과인가? 무엇을 비교해야 하는가? 차원을 줄이거나 비유클리드 거리를 쓰면 어떤 한계가 있는가?

자기평가 · 자동채점 아님

평가 기준: 4점: 반전해도 거리가 같다는 설명1점, 입력/복원거리 대조1점, 차원축소 시 손실 가능성1점, 비유클리드 거리의 큰 음의 고유값/정확재현 한계1점. 네 항목 모두 필요하다.

해설 보기

반전은 대상 간 거리를 유지하므로 그 자체는 오류가 아니다. 입력거리와 복원거리 및 왜곡을 비교한다. 차원을 줄이면 거리손실이 생길 수 있고, 비유클리드 비유사도는 큰 음의 고유값과 정확 재현 불가를 보일 수 있다.

독립 실습

거리행렬 [[0,3,4],[3,0,5],[4,5,0]]에 k2와 k1을 적용해 거리복원오차를 비교하라. 모든 거리를2배로 만들면 고유값·좌표 규모는 어떻게 달라지는가?

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. D²와 행/전체평균, B 고유분해 잔차, k2/k1 복원거리오차, 거리2배의 제곱/좌표 배율

완전 실행파일 — 가상자료·Python 표준라이브러리

import math,sys

def jacobi(matrix,tol=1e-12):
    a=[list(map(float,r)) for r in matrix];n=len(a)
    v=[[float(i==j) for j in range(n)] for i in range(n)]
    for iteration in range(100*n*n):
        p,q=max(((i,j) for i in range(n) for j in range(i+1,n)),key=lambda ij:abs(a[ij[0]][ij[1]]))
        if abs(a[p][q])<tol:break
        apq=a[p][q];tau=(a[q][q]-a[p][p])/(2*apq)
        t=(1 if tau>=0 else -1)/(abs(tau)+math.sqrt(1+tau*tau))
        c=1/math.sqrt(1+t*t);s=t*c
        a[p][p]-=t*apq;a[q][q]+=t*apq;a[p][q]=a[q][p]=0.0
        for k in range(n):
            if k not in (p,q):
                kp,kq=a[k][p],a[k][q]
                a[k][p]=a[p][k]=c*kp-s*kq
                a[k][q]=a[q][k]=s*kp+c*kq
            kp,kq=v[k][p],v[k][q]
            v[k][p]=c*kp-s*kq;v[k][q]=s*kp+c*kq
    else:raise ValueError('Jacobi did not converge')
    order=sorted(range(n),key=lambda j:-a[j][j])
    values=[a[j][j] for j in order]
    vectors=[]
    for j in order:
        col=[v[i][j] for i in range(n)]
        if col[max(range(n),key=lambda i:abs(col[i]))]<0:col=[-x for x in col]
        vectors.append(col)
    return values,vectors

def mds(dist,k):
    n=len(dist)
    if n<2 or not 1<=k<n or any(len(r)!=n for r in dist):raise ValueError('bad shape or k')
    if any(dist[i][j]<0 or not math.isfinite(dist[i][j]) or abs(dist[i][j]-dist[j][i])>1e-10 for i in range(n) for j in range(n)):raise ValueError('symmetric finite nonnegative distances required')
    if any(abs(dist[i][i])>1e-10 for i in range(n)):raise ValueError('diagonal must be zero')
    dsq=[[d*d for d in r] for r in dist]
    means=[sum(r)/n for r in dsq];grand=sum(means)/n
    b=[[-0.5*(dsq[i][j]-means[i]-means[j]+grand) for j in range(n)] for i in range(n)]
    values,vectors=jacobi(b)
    for lam,v in zip(values,vectors):
        assert max(abs(sum(b[i][j]*v[j] for j in range(n))-lam*v[i]) for i in range(n))<1e-8
    # 고전적 MDS: 상위 양의 고유값만 사용. 음의 고유값은 숨기지 않고 반환한다.
    use=[i for i,val in enumerate(values) if val>1e-10][:k]
    coords=[[math.sqrt(values[j])*vectors[j][i] for j in use] for i in range(n)]
    recovered=[[math.dist(a,c) for c in coords] for a in coords]
    denom=sum(dist[i][j]**2 for i in range(n) for j in range(i))
    stress=math.sqrt(sum((recovered[i][j]-dist[i][j])**2 for i in range(n) for j in range(i))/denom) if denom else 0
    return b,values,coords,recovered,stress

def fmt(rows):return [[round(v,6) for v in r] for r in rows]
def main(variant=False):
    d=[[0,1,2],[1,0,1],[2,1,0]];k=1
    if variant:d=[[0,3,4],[3,0,5],[4,5,0]];k=2
    b,e,x,rec,stress=mds(d,k)
    print('double_centered_B',fmt(b))
    print('eigenvalues',[round(v,6) for v in e])
    print('coordinates',fmt(x),'reconstructed_distances',fmt(rec))
    print(f'normalized_distance_error={stress:.6f}')
    assert stress<1e-8
    assert mds([[2*v for v in row] for row in d],k)[4]<1e-8
    if variant:print(f'one_dimension_error={mds(d,1)[4]:.6f}')
    non_euclidean=mds([[0,1,3],[1,0,1],[3,1,0]],2)
    assert min(non_euclidean[1])<0 and non_euclidean[4]>0
    print('non_euclidean_negative_eigenvalue',round(min(non_euclidean[1]),6))
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

mds.csv

A,B,C
0,1,2
1,0,1
2,1,0

R 미실행·좌표 부호/회전 아닌 거리 대조

d <- as.matrix(read.csv("mds.csv"))
f <- cmdscale(as.dist(d),k=1,eig=TRUE,x.ret=TRUE)
print(f$eig); print(f$points); print(as.matrix(dist(f$points)))

R 문서·수학 대조 예상 — 미실행

Rscript mds.R의 예상 고유값[2,0,0](수치오차 허용), 중심화 좌표[-1,0,1] 또는 그 반전, 복원거리[[0,1,2],[1,0,1],[2,1,0]]. R 미실행. 코드/문서의 수학 대조이며 R stdout 캡처가 아니다.

기본 입력 예상 stdout — 실제 Python 실행으로 확인

double_centered_B [[1.0, 0.0, -1.0], [0.0, -0.0, 0.0], [-1.0, 0.0, 1.0]]
eigenvalues [2.0, 0.0, -0.0]
coordinates [[1.0], [0.0], [-1.0]] reconstructed_distances [[0.0, 1.0, 2.0], [1.0, 0.0, 1.0], [2.0, 1.0, 0.0]]
normalized_distance_error=0.000000
non_euclidean_negative_eigenvalue -0.833333
checks OK

독립 변형 정답 stdout — 실습 후 확인

double_centered_B [[2.777778, -0.222222, -2.555556], [-0.222222, 5.777778, -5.555556], [-2.555556, -5.555556, 8.111111]]
eigenvalues [12.964148, 3.702519, -0.0]
coordinates [[-0.658129, 1.531223], [-2.152311, -1.070203], [2.81044, -0.46102]] reconstructed_distances [[0.0, 3.0, 4.0], [3.0, 0.0, 5.0], [4.0, 5.0, 0.0]]
normalized_distance_error=0.000000
one_dimension_error=0.225889
non_euclidean_negative_eigenvalue -0.833333
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')
실습 해설 보기

2차원에서는 복원거리3,4,5로 오차가 수치허용범위0에 가깝고1차원에서는 양의 오차가 남는다. D를2배 하면 B와 고유값은4배, 좌표는 회전/반전 동치 아래2배다. 좌표의 절대 부호·방향을 정답으로 채점하지 않는다. 반례·복구 해설: 비대칭/음수/비영 대각은 원천 거리정의를 수정한다. 큰 음의 고유값을 절댓값으로 바꾸지 않는다. 차원손실을 보고하거나 거리정의·차원 수를 재검토한다. Jacobi 반복한도 오류는 수렴오차·입력규모를 확인한다. 변형 입력의 실제 검산 stdout: double_centered_B [[2.777778, -0.222222, -2.555556], [-0.222222, 5.777778, -5.555556], [-2.555556, -5.555556, 8.111111]] eigenvalues [12.964148, 3.702519, -0.0] coordinates [[-0.658129, 1.531223], [-2.152311, -1.070203], [2.81044, -0.46102]] reconstructed_distances [[0.0, 3.0, 4.0], [3.0, 0.0, 5.0], [4.0, 5.0, 0.0]] normalized_distance_error=0.000000 one_dimension_error=0.225889 non_euclidean_negative_eigenvalue -0.833333 checks OK

평가 기준: D²와 행/전체평균, B 고유분해 잔차, k2/k1 복원거리오차, 거리2배의 제곱/좌표 배율 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

가상 물품의 비유사도 표에 MDS를 적용할 계획을 작성한다. 평가: 거리 정의, 대칭/대각 검사, 음의 고유값, 좌표가 아니라 거리오차 비교.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “MDS는 대상 간 거리에서 출발해 그 거리를 닮은 좌표를 찾는다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://stat.ethz.ch/R-manual/R-devel/library/stats/html/cmdscale.html — 2026-10-05 KST: web_extract 반환 Description/Usage/Details에서 대칭 비유사도 입력, k차원 근사, 이동·회전·반전 비유일성, 비유클리드 거리의 보정과 고유값 주의를 확인. Value 후반은 잘림. R 미실행.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

질문 하나를 자료에서 골라 놓침 세기

해결할 문제와 목표

정확도가 높다는 이유로 고장 경고를 신뢰하지만 모두 정상이라고 해도 높은 수치가 나올 수 있다.

분류 라벨을 정의하고 후보 threshold의 Gini를 비교해 깊이1 나무를 실제 적합한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 나무는 정답을 보고 좋은 분기를 찾되 시험 정답은 분기를 고르는 데 쓰지 않는다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

나무는 예/아니오 질문으로 갈라지는 점검표다.

비유가 닿지 않는 곳: 과거 자료의 편향을 배우며 깊은 점검표는 예외를 외워 새 사례에 약해질 수 있다.

실제로 작동하는 원리

정형 마이닝은 표에서 패턴을 찾아 예측/설명을 돕는 과정이다. 분류는 고장0/1 같은 범주 라벨, 회귀는 대기일 같은 수치, 군집은 라벨 없는 묶음이다. 이 실습의 양성1은 다음주 고장이다. 사용횟수 x와 라벨 y의 학습6건에서 서로 다른 x 사이 중점을 전부 후보로 두고 가중 Gini=Σ(잎건수/n)(1-Σ클래스비율²)를 최소화한다. 동점 후보는 작은 threshold, 잎 라벨 동점은0으로 고정한다. 깊이1 stump는 실제 학습한 의사결정나무의 제한형이다. 테스트 x는 학습 x와 겹치지 않는다. TP/FP/FN/TN으로 precision=TP/(TP+FP), recall=TP/(TP+FN), accuracy=(TP+TN)/n을 계산하고 분모0은 None으로 표시한다. 사후 수리완료일은 예측 시점에 없어 누출이다. 반복 개체가 있으면 개체별 분리, 시간 예측이면 시간순 분리가 필요하며 모델 복잡도는 검증셋에서만 고른다. 수치 중간값 추적(위 기본 입력의 실제 계산): parent_gini 0.5 weighted_gini_threshold_left_right (0.0, 3.5, 0, 1) gini_decrease 0.5 unseen_predictions [0, 0, 1, 1] TP FP FN TN accuracy precision recall (2, 0, 0, 2, 1.0, 1.0, 1.0) majority_baseline (0, 0, 2, 2, 0.5, None, 0.0) checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 학습 x1~6, y000111; 미관측 x[1.5,2.5,4.5,5.5] 실제[0,0,1,1].
  3. python3 data-classify.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-classify.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 예측 양성0이면 정밀도 분모0을 None으로 표시한다. 상수 입력은 분할할 수 없어 다수라벨로 돌아간다. 사후열을 발견하면 제거 후 데이터분리부터 다시 실행한다.

입력 예제

학습 x1~6, y000111; 미관측 x[1.5,2.5,4.5,5.5] 실제[0,0,1,1].

예상 결과

parent_gini 0.5 weighted_gini_threshold_left_right (0.0, 3.5, 0, 1)
gini_decrease 0.5
unseen_predictions [0, 0, 1, 1]
TP FP FN TN accuracy precision recall (2, 0, 0, 2, 1.0, 1.0, 1.0)
majority_baseline (0, 0, 2, 2, 0.5, None, 0.0)
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 과거 자료의 편향을 배우며 깊은 점검표는 예외를 외워 새 사례에 약해질 수 있다.
  2. 예측 양성0이면 정밀도 분모0을 None으로 표시한다. 상수 입력은 분할할 수 없어 다수라벨로 돌아간다. 사후열을 발견하면 제거 후 데이터분리부터 다시 실행한다.

확인 문제

고장 발생 뒤 기록된 수리완료일을 다음주 고장 예측 입력에 넣으면 왜 안 되는가?

자기평가 · 자동채점 아님

평가 기준: 3점: 사후 정보 식별, 예측시점 가용성 설명, 제거 후 재평가 각1점.

해설 보기

예측하는 시점에는 알 수 없는 정답 이후 정보가 들어가 성능을 과장한다. 해당 열을 제거하고 원래 예측 시점 기준으로 다시 분할·학습·평가한다.

독립 실습

학습 y를001111로 바꾸어 최적분기·Gini 감소와 같은 미관측 평가를 다시 구하라. 별도 정답[1,0,1,0,0]/예측[1,1,0,0,0]의 혼동행렬을 직접 계산하라. 모든 예측이0이라면 정밀도를 어떻게 표시할지도 쓰라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 모든 후보에서 최소 Gini 분기, 학습/시험 라벨 분리, 변형 threshold 및 경계 처리, 별도 혼동행렬과 분모0 처리

완전 실행파일 — 가상자료·Python 표준라이브러리

import math,sys

def gini(y):
    if not y:return 0.0
    p=sum(y)/len(y)
    return 2*p*(1-p)
def majority(y):return int(sum(y)>len(y)/2)  # 동률은 0

def fit_stump(x,y):
    if len(x)!=len(y) or not x or any(v not in (0,1) for v in y):raise ValueError('paired binary data required')
    values=sorted(set(x));best=None
    for lo,hi in zip(values,values[1:]):
        t=(lo+hi)/2
        left=[b for a,b in zip(x,y) if a<=t];right=[b for a,b in zip(x,y) if a>t]
        score=(len(left)*gini(left)+len(right)*gini(right))/len(y)
        candidate=(score,t,majority(left),majority(right))
        if best is None or candidate<best:best=candidate
    if best is None:return (gini(y),None,majority(y),majority(y))
    return best

def predict(model,x):
    _,t,left,right=model
    return left if t is None or x<=t else right

def metrics(truth,pred):
    if len(truth)!=len(pred) or not truth:raise ValueError('nonempty paired labels required')
    tp=sum(a==b==1 for a,b in zip(truth,pred));fp=sum(a==0 and b==1 for a,b in zip(truth,pred))
    fn=sum(a==1 and b==0 for a,b in zip(truth,pred));tn=sum(a==b==0 for a,b in zip(truth,pred))
    return (tp,fp,fn,tn,(tp+tn)/len(truth),tp/(tp+fp) if tp+fp else None,tp/(tp+fn) if tp+fn else None)

def main(variant=False):
    x=[1,2,3,4,5,6];y=[0,0,0,1,1,1]
    if variant:y=[0,0,1,1,1,1]
    model=fit_stump(x,y)
    test_x=[1.5,2.5,4.5,5.5];test_y=[0,0,1,1]
    print('parent_gini',round(gini(y),6),'weighted_gini_threshold_left_right',model)
    print('gini_decrease',round(gini(y)-model[0],6))
    pred=[predict(model,a) for a in test_x]
    print('unseen_predictions',pred)
    print('TP FP FN TN accuracy precision recall',metrics(test_y,pred))
    print('majority_baseline',metrics(test_y,[majority(y)]*len(test_y)))
    assert model[0]<=gini(y)+1e-12
    assert fit_stump(x,[0]*6)[2:]==(0,0)
    assert fit_stump([1,1],[0,1])[1] is None
    assert metrics([1,0,1,0,0],[1,1,0,0,0])[:4]==(1,1,1,2)
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

parent_gini 0.5 weighted_gini_threshold_left_right (0.0, 3.5, 0, 1)
gini_decrease 0.5
unseen_predictions [0, 0, 1, 1]
TP FP FN TN accuracy precision recall (2, 0, 0, 2, 1.0, 1.0, 1.0)
majority_baseline (0, 0, 2, 2, 0.5, None, 0.0)
checks OK

독립 변형 정답 stdout — 실습 후 확인

parent_gini 0.444444 weighted_gini_threshold_left_right (0.0, 2.5, 0, 1)
gini_decrease 0.444444
unseen_predictions [0, 0, 1, 1]
TP FP FN TN accuracy precision recall (2, 0, 0, 2, 1.0, 1.0, 1.0)
majority_baseline (2, 2, 0, 0, 0.5, 0.5, 1.0)
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')
실습 해설 보기

학습 분기가3.5에서2.5로 바뀌며 잎의 라벨은0/1이다. 테스트2.5는 <= 규칙에 따라 왼쪽이다. 별도 혼동행렬은 TP1 FP1 FN1 TN2, 정밀도·재현율 각각1/2다. 실제 모델 분기와 주어진 예측의 지표 계산은 구별한다. 반례·복구 해설: 예측 양성0이면 정밀도 분모0을 None으로 표시한다. 상수 입력은 분할할 수 없어 다수라벨로 돌아간다. 사후열을 발견하면 제거 후 데이터분리부터 다시 실행한다. 변형 입력의 실제 검산 stdout: parent_gini 0.444444 weighted_gini_threshold_left_right (0.0, 2.5, 0, 1) gini_decrease 0.444444 unseen_predictions [0, 0, 1, 1] TP FP FN TN accuracy precision recall (2, 0, 0, 2, 1.0, 1.0, 1.0) majority_baseline (2, 2, 0, 0, 0.5, 0.5, 1.0) checks OK

평가 기준: 모든 후보에서 최소 Gini 분기, 학습/시험 라벨 분리, 변형 threshold 및 경계 처리, 별도 혼동행렬과 분모0 처리 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

안전장비 점검의 FN과 FP 비용표를 작성한다. 평가: 양성 정의, 사후 열 제외, 미관측 시험, 사람 재점검과 경고 임계값 선택용 검증셋.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “나무는 정답을 보고 좋은 분기를 찾되 시험 정답은 분기를 고르는 데 쓰지 않는다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://scikit-learn.org/stable/modules/tree.html — 2026-10-05 KST: web_extract 반환 분류·회귀 설명과 장단점에서 데이터로 분기 학습, 과적합·깊이 제한·불안정성을 확인. scikit-learn 설치·실행은 하지 않음. 독자 stump는 라이브러리 전체 구현이 아님.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

여러 나무도 처음 보는 표에서 비교하기

해결할 문제와 목표

미리 정한 예측[1,0,1]을 투표한 것만으로 앙상블을 학습했다고 말한다.

학습자료만 복원추출해 나무9개를 적합하고 단일나무·다수라벨 기준선과 미관측 성능을 비교한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 여럿의 답을 합쳐도 같은 오류를 공유하면 틀리므로 개선은 시험 결과로 판단한다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

같은 사건을 조금씩 다른 자료 묶음으로 공부한 여러 점검자의 회의다.

비유가 닿지 않는 곳: 서로 독립인 전문가라는 보장은 없고 모두 같은 누출열을 보면 같은 잘못을 배운다.

실제로 작동하는 원리

bagging은 학습행 n개를 복원추출해 각각 모델을 맞추고 결합한다. 본 코드는 seed17로9개 부트스트랩을 만들고 매번 Gini 최소 stump를 새로 fit한다. 출력은 첫 추출 인덱스·학습된 threshold·시험별 양성표 수다. 경성 다수결이며 scikit-learn의 기본 확률평균과는 구분한다. 단일나무와 다수라벨 기준선도 같은 학습자료에서 만들어 같은 미관측4건에 평가한다. 분산 감소를 기대할 수 있지만 약한 학습기·상관된 오류·작은 표본이면 성능 개선을 보장하지 않는다. 부스팅은 틀린 부분을 순차 보완하는 계열로 병렬 복원추출과 다르고, 랜덤포레스트는 보통 분기별 특성 무작위화까지 추가한다. 이 코드는 둘을 구현했다고 주장하지 않는다. 모델 수·seed를 시험 결과에 맞춰 바꾸면 새 시험이 필요하다. 수치 중간값 추적(위 기본 입력의 실제 계산): first_bootstrap_indices [4, 3, 2, 2, 2, 1] learned_thresholds [3.5, 4.0, 3.5, 3.5, 3.5, 4.0, 4.0, 2.5, 3.5] positive_votes [0, 0, 9, 9] single [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0) ensemble [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0) majority (0, 0, 2, 2, 0.5, None, 0.0) checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 기본 나무 학습6건 y000111, 복원추출9회·seed17, 미관측4건.
  3. python3 data-ensemble.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-ensemble.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 모든 나무의 같은 누출을 다수결로 고칠 수 없다. 원천특성·분리부터 고친다. 시험을 보고 seed나 모델 수를 골랐다면 그 자료를 검증으로 재분류하고 새 시험자료를 확보한다.

입력 예제

기본 나무 학습6건 y000111, 복원추출9회·seed17, 미관측4건.

예상 결과

first_bootstrap_indices [4, 3, 2, 2, 2, 1]
learned_thresholds [3.5, 4.0, 3.5, 3.5, 3.5, 4.0, 4.0, 2.5, 3.5]
positive_votes [0, 0, 9, 9]
single [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0)
ensemble [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0)
majority (0, 0, 2, 2, 0.5, None, 0.0)
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 서로 독립인 전문가라는 보장은 없고 모두 같은 누출열을 보면 같은 잘못을 배운다.
  2. 모든 나무의 같은 누출을 다수결로 고칠 수 없다. 원천특성·분리부터 고친다. 시험을 보고 seed나 모델 수를 골랐다면 그 자료를 검증으로 재분류하고 새 시험자료를 확보한다.

확인 문제

학습자료에서 앙상블 정확도가 더 높으면 새 자료에서도 개선됐다고 말해도 되는가?

자기평가 · 자동채점 아님

평가 기준: 3점: 학습 성능 한계, 동일 미관측 비교, 개선 비보장과 표본한계 각1점.

해설 보기

안 된다. 학습자료는 모델 선택에 사용되어 낙관적이다. 고정된 미관측 자료에서 단일모델과 같은 지표로 비교하고 표본 불확실성도 보고한다.

독립 실습

학습 y를001101로 바꾸고 고정 seed·나무수로 재학습하라. 개별 threshold·투표·단일/앙상블/기준선 성능을 비교해 개선 또는 악화를 수치로 보고하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 복원추출 중복 인덱스 확인, 매 모델 실제 fit·시험 제외, 동일 미관측 비교표, 악화/동률도 숨기지 않는 제한 결론

완전 실행파일 — 가상자료·Python 표준라이브러리

import math,sys

def gini(y):
    if not y:return 0.0
    p=sum(y)/len(y)
    return 2*p*(1-p)
def majority(y):return int(sum(y)>len(y)/2)  # 동률은 0

def fit_stump(x,y):
    if len(x)!=len(y) or not x or any(v not in (0,1) for v in y):raise ValueError('paired binary data required')
    values=sorted(set(x));best=None
    for lo,hi in zip(values,values[1:]):
        t=(lo+hi)/2
        left=[b for a,b in zip(x,y) if a<=t];right=[b for a,b in zip(x,y) if a>t]
        score=(len(left)*gini(left)+len(right)*gini(right))/len(y)
        candidate=(score,t,majority(left),majority(right))
        if best is None or candidate<best:best=candidate
    if best is None:return (gini(y),None,majority(y),majority(y))
    return best

def predict(model,x):
    _,t,left,right=model
    return left if t is None or x<=t else right

def metrics(truth,pred):
    if len(truth)!=len(pred) or not truth:raise ValueError('nonempty paired labels required')
    tp=sum(a==b==1 for a,b in zip(truth,pred));fp=sum(a==0 and b==1 for a,b in zip(truth,pred))
    fn=sum(a==1 and b==0 for a,b in zip(truth,pred));tn=sum(a==b==0 for a,b in zip(truth,pred))
    return (tp,fp,fn,tn,(tp+tn)/len(truth),tp/(tp+fp) if tp+fp else None,tp/(tp+fn) if tp+fn else None)

import random

def bag_fit(x,y,n_models=9,seed=17):
    rng=random.Random(seed);models=[];samples=[]
    for _ in range(n_models):
        idx=[rng.randrange(len(x)) for _ in x]
        samples.append(idx)
        models.append(fit_stump([x[i] for i in idx],[y[i] for i in idx]))
    return models,samples

def bag_predict(models,x):return int(sum(predict(m,x) for m in models)>len(models)/2)
def main(variant=False):
    x=[1,2,3,4,5,6];y=[0,0,0,1,1,1]
    if variant:y=[0,0,1,1,0,1]
    models,samples=bag_fit(x,y)
    test_x=[1.5,2.5,4.5,5.5];test_y=[0,0,1,1]
    single=fit_stump(x,y)
    p_single=[predict(single,t) for t in test_x];p_bag=[bag_predict(models,t) for t in test_x]
    print('first_bootstrap_indices',samples[0])
    print('learned_thresholds',[m[1] for m in models])
    print('positive_votes',[sum(predict(m,t) for m in models) for t in test_x])
    print('single',p_single,metrics(test_y,p_single))
    print('ensemble',p_bag,metrics(test_y,p_bag))
    print('majority',metrics(test_y,[majority(y)]*len(test_y)))
    assert bag_fit(x,y)[0]==models
    zero,_=bag_fit(x,[0]*len(x))
    assert all(bag_predict(zero,t)==0 for t in test_x)
    assert all(all(0<=i<len(x) for i in ids) for ids in samples)
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

first_bootstrap_indices [4, 3, 2, 2, 2, 1]
learned_thresholds [3.5, 4.0, 3.5, 3.5, 3.5, 4.0, 4.0, 2.5, 3.5]
positive_votes [0, 0, 9, 9]
single [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0)
ensemble [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0)
majority (0, 0, 2, 2, 0.5, None, 0.0)
checks OK

독립 변형 정답 stdout — 실습 후 확인

first_bootstrap_indices [4, 3, 2, 2, 2, 1]
learned_thresholds [2.5, 5.5, 2.5, 5.5, 1.5, 5.5, 2.0, 2.5, 2.5]
positive_votes [1, 2, 6, 6]
single [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0)
ensemble [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0)
majority (0, 0, 2, 2, 0.5, None, 0.0)
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')
실습 해설 보기

variant stdout에서 직접 학습한 threshold와 투표를 대조한다. 앙상블이 단일모델보다 항상 낫다는 결론은 금지다. 동일 시험4건의 차이일 뿐 모집단 성능이나 유의한 개선의 증거는 부족하다. 반례·복구 해설: 모든 나무의 같은 누출을 다수결로 고칠 수 없다. 원천특성·분리부터 고친다. 시험을 보고 seed나 모델 수를 골랐다면 그 자료를 검증으로 재분류하고 새 시험자료를 확보한다. 변형 입력의 실제 검산 stdout: first_bootstrap_indices [4, 3, 2, 2, 2, 1] learned_thresholds [2.5, 5.5, 2.5, 5.5, 1.5, 5.5, 2.0, 2.5, 2.5] positive_votes [1, 2, 6, 6] single [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0) ensemble [0, 0, 1, 1] (2, 0, 0, 2, 1.0, 1.0, 1.0) majority (0, 0, 2, 2, 0.5, None, 0.0) checks OK

평가 기준: 복원추출 중복 인덱스 확인, 매 모델 실제 fit·시험 제외, 동일 미관측 비교표, 악화/동률도 숨기지 않는 제한 결론 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

장비 고장 경고의 bagging 도입 보고서를 작성한다. 평가: 동일 데이터 분리, 누출 검사, FN/FP 비용과 불확실성, 단순모델 유지 조건.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “여럿의 답을 합쳐도 같은 오류를 공유하면 틀리므로 개선은 시험 결과로 판단한다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html — 2026-10-05 KST: web_extract 앙상블 문서 429 후 curl로 공식 API 페이지 조회. predict/proba의 평균확률 및 predict_proba가 없는 기본학습기에서 투표로 결합하는 설명 확인. 본 교재는 경성 투표를 쓰는 독자 bagging stump이며 scikit-learn 실행 아님.
  • https://scikit-learn.org/stable/modules/tree.html — 2026-10-05 KST: web_extract 반환 분류·회귀 설명과 장단점에서 데이터로 분기 학습, 과적합·깊이 제한·불안정성을 확인. scikit-learn 설치·실행은 하지 않음. 독자 stump는 라이브러리 전체 구현이 아님.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

오차를 거꾸로 따라 가중치 고치기

해결할 문제와 목표

ReLU 한 번 계산한 결과를 신경망 학습과 일반화 검증이라고 부른다.

은닉층 tanh 신경망의 forward·BCE·backprop·gradient update를 구현하고 미관측 비교를 한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 신경망 학습은 출력오차의 미분을 앞층까지 전달해 실제 가중치를 바꾸는 반복이다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

여러 수도꼭지를 조금씩 조절해 원하는 물의 양에 가까워지게 한다.

비유가 닿지 않는 곳: 꼭지 조절이 전역 최적점이나 처음 보는 입력의 정확도를 보장하지 않는다.

실제로 작동하는 원리

입력1개→은닉 tanh2개→sigmoid 출력1개의7개 매개변수를 사용한다. h_j=tanh(w_j x+b_j), z=Σv_j h_j+c, p=sigmoid(z), BCE=-(y log p+(1-y)log(1-p)). 로그 계산은 안정적 softplus 식으로 구현한다. 출력 미분 δ=p-y에서 ∂L/∂v_j=δh_j, ∂L/∂w_j=δv_j(1-h_j²)x, ∂L/∂b_j=δv_j(1-h_j²), ∂L/∂c=δ를 구하고 전체 학습행 평균 기울기로 θ←θ-0.1∇L을800번 적용한다. 초기 gradient·첫 갱신·마지막 파라미터·손실을 모두 출력한다. 각 파라미터를 ±epsilon 움직인 중앙차분과 역전파를 대조한다. 미관측4개는 기울기에 들어가지 않는다. 값은 이미 작은 범위의 가상 표준화 점수이며 현장 변환은 학습자료만으로 맞춰야 한다. 이 간단한 이진 문제에서 학습손실 감소와 성능 향상은 대규모 신경망이나 실제 고장예측을 보증하지 않는다. 학습률이 크면 발산할 수 있고 임계값/에폭 선택은 검증자료에서만 한다. 수치 중간값 추적(위 기본 입력의 실제 계산): initial_gradient [-0.130058, 0.10204, 0.011147, -0.007158, -0.225612, 0.178414, 0.009232] after_one_step [0.413006, -0.310204, 0.098885, -0.099284, 0.322561, -0.217841, -0.000923] train_loss_initial=0.582054 final=0.006799 finite_difference_max_error=5.211e-11 learned_parameters [1.560489, -1.476762, 0.016893, -0.019129, 2.761317, -2.505201, -0.019893] unseen_probabilities [0.005637, 0.034228, 0.968066, 0.994181] predictions [0, 0, 1, 1] unseen_accuracy=1.000000 majority_accuracy=0.500000 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 학습 x[-2,-1,1,2], y[0,0,1,1]; 시험 x[-1.5,-0.5,0.5,1.5].
  3. python3 data-neural.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-neural.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: NaN/비유한 값·잘못된 라벨은 중단한다. 큰 학습률에서 발산하면 학습구간에서만 스케일·기울기를 점검하고 학습률을 줄인다. 설정 선택에 시험 결과를 쓰지 않는다. 유한차분 오차가 크면 갱신 전 파라미터로 미분했는지 검사한다.

입력 예제

학습 x[-2,-1,1,2], y[0,0,1,1]; 시험 x[-1.5,-0.5,0.5,1.5].

예상 결과

initial_gradient [-0.130058, 0.10204, 0.011147, -0.007158, -0.225612, 0.178414, 0.009232]
after_one_step [0.413006, -0.310204, 0.098885, -0.099284, 0.322561, -0.217841, -0.000923]
train_loss_initial=0.582054 final=0.006799 finite_difference_max_error=5.211e-11
learned_parameters [1.560489, -1.476762, 0.016893, -0.019129, 2.761317, -2.505201, -0.019893]
unseen_probabilities [0.005637, 0.034228, 0.968066, 0.994181] predictions [0, 0, 1, 1]
unseen_accuracy=1.000000 majority_accuracy=0.500000
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 꼭지 조절이 전역 최적점이나 처음 보는 입력의 정확도를 보장하지 않는다.
  2. NaN/비유한 값·잘못된 라벨은 중단한다. 큰 학습률에서 발산하면 학습구간에서만 스케일·기울기를 점검하고 학습률을 줄인다. 설정 선택에 시험 결과를 쓰지 않는다. 유한차분 오차가 크면 갱신 전 파라미터로 미분했는지 검사한다.

확인 문제

순전파 확률만 출력하고 가중치를 한 번도 바꾸지 않았다면 학습했다고 할 수 있는가?

자기평가 · 자동채점 아님

평가 기준: 3점: 추론/학습 구별, gradient·갱신 증거, 일반화 별도 평가 각1점.

해설 보기

추론만 수행한 것이다. 손실의 gradient를 계산하고 파라미터를 갱신한 기록이 있어야 이 실습의 학습이다. 학습됐어도 미관측 성능은 별도 평가한다.

독립 실습

학습 라벨을[1,1,0,0]으로 뒤집고 시험의 대응 라벨도[1,1,0,0]으로 바꾼 새 문제를 학습하라. 첫 gradient·한 번 갱신·최종손실·미관측 정확도를 비교하라. 시험 라벨만 바꿔 학습 파라미터가 변하면 어떤 오류인가? δ=p-y와 tanh 미분이 첫 층 기울기로 연결되는 식을 쓰고 유한차분과 비교하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. chain rule의 δ·tanh 미분, 유한차분 오차 대조, 실제7개 파라미터 갱신·손실, 미관측/기준선 비교와 누출 반례

완전 실행파일 — 가상자료·Python 표준라이브러리

import math,sys
# parameter order: w1,w2,b1,b2,v1,v2,c

def forward(p,x):
    h=[math.tanh(p[j]*x+p[2+j]) for j in range(2)]
    z=p[6]+sum(p[4+j]*h[j] for j in range(2))
    prob=1/(1+math.exp(-z)) if z>=0 else math.exp(z)/(1+math.exp(z))
    return h,z,prob

def loss_grad(p,xs,ys):
    if len(xs)!=len(ys) or not xs or any(y not in (0,1) for y in ys):raise ValueError('nonempty paired binary data required')
    if len(p)!=7 or not all(math.isfinite(v) for v in p+list(xs)):raise ValueError('finite parameters and inputs required')
    g=[0.0]*7;loss=0.0
    for x,y in zip(xs,ys):
        h,z,prob=forward(p,x)
        loss+=max(z,0)-z*y+math.log1p(math.exp(-abs(z)))
        delta=prob-y
        g[6]+=delta
        for j in range(2):
            g[4+j]+=delta*h[j]
            dh=delta*p[4+j]*(1-h[j]*h[j])
            g[j]+=dh*x;g[2+j]+=dh
    n=len(xs)
    return loss/n,[v/n for v in g]

def fit(xs,ys,steps=800,rate=0.1):
    p=[0.4,-0.3,0.1,-0.1,0.3,-0.2,0.0]
    first,g0=loss_grad(p,xs,ys)
    # 각 가중치·편향의 해석적 역전파와 중앙 유한차분 비교
    maxerr=0.0
    for j in range(len(p)):
        plus=p[:];minus=p[:];plus[j]+=1e-6;minus[j]-=1e-6
        numerical=(loss_grad(plus,xs,ys)[0]-loss_grad(minus,xs,ys)[0])/2e-6
        maxerr=max(maxerr,abs(numerical-g0[j]))
    assert maxerr<1e-7
    after_one=[a-rate*g for a,g in zip(p,g0)]
    for _ in range(steps):
        _,g=loss_grad(p,xs,ys)
        p=[a-rate*b for a,b in zip(p,g)]
    final,_=loss_grad(p,xs,ys)
    return p,first,final,g0,after_one,maxerr

def main(variant=False):
    xs=[-2,-1,1,2];ys=[0,0,1,1]
    if variant:ys=[1,1,0,0]
    test_x=[-1.5,-0.5,0.5,1.5];test_y=([0,0,1,1] if not variant else [1,1,0,0])
    p,first,last,g0,one,err=fit(xs,ys)
    probs=[forward(p,x)[2] for x in test_x];pred=[int(v>=0.5) for v in probs]
    correct=sum(a==b for a,b in zip(pred,test_y));majority=int(sum(ys)>len(ys)/2)
    baseline=sum(majority==y for y in test_y)
    print('initial_gradient',[round(g,6) for g in g0])
    print('after_one_step',[round(v,6) for v in one])
    print(f'train_loss_initial={first:.6f} final={last:.6f} finite_difference_max_error={err:.3e}')
    print('learned_parameters',[round(v,6) for v in p])
    print('unseen_probabilities',[round(v,6) for v in probs],'predictions',pred)
    print(f'unseen_accuracy={correct/len(test_y):.6f} majority_accuracy={baseline/len(test_y):.6f}')
    assert last<first and p!=one
    assert set(xs).isdisjoint(test_x)
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

initial_gradient [-0.130058, 0.10204, 0.011147, -0.007158, -0.225612, 0.178414, 0.009232]
after_one_step [0.413006, -0.310204, 0.098885, -0.099284, 0.322561, -0.217841, -0.000923]
train_loss_initial=0.582054 final=0.006799 finite_difference_max_error=5.211e-11
learned_parameters [1.560489, -1.476762, 0.016893, -0.019129, 2.761317, -2.505201, -0.019893]
unseen_probabilities [0.005637, 0.034228, 0.968066, 0.994181] predictions [0, 0, 1, 1]
unseen_accuracy=1.000000 majority_accuracy=0.500000
checks OK

독립 변형 정답 stdout — 실습 후 확인

initial_gradient [0.16581, -0.130912, -0.009591, 0.005698, 0.292912, -0.232538, 0.009232]
after_one_step [0.383419, -0.286909, 0.100959, -0.10057, 0.270709, -0.176746, -0.000923]
train_loss_initial=0.819801 final=0.007027 finite_difference_max_error=8.860e-11
learned_parameters [1.520299, -1.507908, 0.018513, -0.017628, -2.633445, 2.601111, 0.020102]
unseen_probabilities [0.994178, 0.964777, 0.032867, 0.006012] predictions [1, 1, 0, 0]
unseen_accuracy=1.000000 majority_accuracy=0.500000
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')
실습 해설 보기

라벨을 뒤집은 별도 문제는 독립 fit으로 풀며 variant stdout에서 기울기와 파라미터가 달라진다. 학습입력을 그대로 둔 채 시험라벨만 바꿨을 때 파라미터가 바뀌면 평가정보가 학습으로 샌 것이다. 손실 감소와 다수라벨 대비 결과를 함께 보고한다. 반례·복구 해설: NaN/비유한 값·잘못된 라벨은 중단한다. 큰 학습률에서 발산하면 학습구간에서만 스케일·기울기를 점검하고 학습률을 줄인다. 설정 선택에 시험 결과를 쓰지 않는다. 유한차분 오차가 크면 갱신 전 파라미터로 미분했는지 검사한다. 변형 입력의 실제 검산 stdout: initial_gradient [0.16581, -0.130912, -0.009591, 0.005698, 0.292912, -0.232538, 0.009232] after_one_step [0.383419, -0.286909, 0.100959, -0.10057, 0.270709, -0.176746, -0.000923] train_loss_initial=0.819801 final=0.007027 finite_difference_max_error=8.860e-11 learned_parameters [1.520299, -1.507908, 0.018513, -0.017628, -2.633445, 2.601111, 0.020102] unseen_probabilities [0.994178, 0.964777, 0.032867, 0.006012] predictions [1, 1, 0, 0] unseen_accuracy=1.000000 majority_accuracy=0.500000 checks OK

평가 기준: chain rule의 δ·tanh 미분, 유한차분 오차 대조, 실제7개 파라미터 갱신·손실, 미관측/기준선 비교와 누출 반례 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

새 가상 수리 우선도 문제에서 신경망과 다수라벨 기준선을 비교한다. 평가: 입력스케일 적합범위, 사전 고정 학습조건, 미관측 혼동행렬, 작은 표본 한계.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “신경망 학습은 출력오차의 미분을 앞층까지 전달해 실제 가중치를 바꾸는 반복이다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

학습 단원

비슷한 점을 모으고 중심 다시 잡기

해결할 문제와 목표

한 번 가까운 중심에 배정한 결과를 최종 군집이라 하거나 동률인 점을 두 군집에 중복 배정한다.

Lloyd 배정·중심갱신을 수렴까지 반복하고 SSE·초기화·빈 군집을 검사한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 군집은 미리 정해진 정답이 아니라 선택한 거리와 초기화로 만든 묶음이다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

가까운 모임에 앉은 사람들이 다시 가운데 의자를 옮긴다.

비유가 닿지 않는 곳: 사람의 실제 유형이 자연스럽게 두 종류라는 뜻은 아니며 단위·k에 따라 묶음이 달라진다.

실제로 작동하는 원리

k-means의 목적은 Σ||x_i-c_배정(i)||² 최소화다. Lloyd는 가장 가까운 중심으로 한 번씩만 배정하고 각 묶음 평균으로 중심을 갱신한다. [0,1,9,10]에 중심0·10이면 첫 갱신0.5·9.5, 다음 반복에서 변하지 않으면 종료한다. 평균은 고정된 배정의 제곱오차를 최소화해 SSE가 증가하지 않는다. 전역최적 보장은 없어 다른 초기화·k와 비교한다. 본 구현의 동률은 작은 군집번호 하나, 빈 군집은 이전 중심 유지로 명시한다. 무한 반복을 피하려고100회 제한을 둔다. 다변량에서는 단위가 큰 변수가 거리를 지배할 수 있어 표준화를 검토한다. 라벨1/2는 순위나 정답 클래스가 아니며 새 점을 가까운 군집에 넣었다고 분류 정확도를 계산할 정답이 생기지 않는다. 수치 중간값 추적(위 기본 입력의 실제 계산): iteration 1 centers [0.5, 9.5] labels [0, 0, 1, 1] SSE=1.000000 iteration 2 centers [0.5, 9.5] labels [0, 0, 1, 1] SSE=1.000000 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. x=[0,1,9,10], k2, 초기중심[0,10].
  3. python3 data-cluster.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-cluster.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 동률을 두 군집에 중복 배정하지 않는다. 빈 군집은 이 구현의 명시된 기존중심 유지 규칙을 적용한다. 반복한도에 도달하면 초기화/k와 데이터를 검토하며 수렴했다고 출력하지 않는다.

입력 예제

x=[0,1,9,10], k2, 초기중심[0,10].

예상 결과

iteration 1 centers [0.5, 9.5] labels [0, 0, 1, 1] SSE=1.000000
iteration 2 centers [0.5, 9.5] labels [0, 0, 1, 1] SSE=1.000000
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 사람의 실제 유형이 자연스럽게 두 종류라는 뜻은 아니며 단위·k에 따라 묶음이 달라진다.
  2. 동률을 두 군집에 중복 배정하지 않는다. 빈 군집은 이 구현의 명시된 기존중심 유지 규칙을 적용한다. 반복한도에 도달하면 초기화/k와 데이터를 검토하며 수렴했다고 출력하지 않는다.

확인 문제

군집 번호0과1이 바뀌면 군집 분석이 틀린 것인가?

자기평가 · 자동채점 아님

평가 기준: 2점: 번호 비순서성, 공동배정 또는 SSE 비교 각1점.

해설 보기

번호는 이름일 뿐이다. 같은 점들이 함께 묶이는지와 중심·SSE를 비교한다. 군집은 정답 라벨이 아니다.

독립 실습

x=[0,2,3,9,10]으로 바꾸어 매 반복의 배정·중심·SSE를 구하라. 초기중심0·10에서 점5가 들어오면 어느 군집으로 한 번만 배정되는지 설명하라. 초기중심을[0,10,100]으로 설정해 빈 군집이 생길 때 이 코드의 복구 규칙을 설명하라. k, 초기화, 변수 단위를 바꾸면 결과가 달라질 수 있는 이유도 설명하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 반복 배정표와 평균, 수렴 조건·SSE 비증가, 동률 단일배정·빈 군집 처리, k/스케일/초기화 한계

완전 실행파일 — 가상자료·Python 표준라이브러리

import sys

def lloyd(x,initial,max_iter=100):
    if not x or not initial or len(set(initial))!=len(initial):raise ValueError('nonempty distinct initial centers required')
    centers=list(map(float,initial));history=[]
    for _ in range(max_iter):
        labels=[min(range(len(centers)),key=lambda j:((v-centers[j])**2,j)) for v in x]
        groups=[[v for v,g in zip(x,labels) if g==j] for j in range(len(centers))]
        # 빈 군집은 기존 중심을 유지한다. 다른 복구 규칙이면 결과도 달라질 수 있다.
        new=[sum(g)/len(g) if g else centers[j] for j,g in enumerate(groups)]
        sse=sum((v-new[g])**2 for v,g in zip(x,labels))
        history.append((new[:],labels[:],sse))
        if max(abs(a-b) for a,b in zip(new,centers))<1e-12:
            return new,labels,history
        centers=new
    raise ValueError('iteration limit')
def main(variant=False):
    x=[0,1,9,10] if not variant else [0,2,3,9,10]
    centers,labels,hist=lloyd(x,[0,10])
    for i,(c,g,ss) in enumerate(hist):print('iteration',i+1,'centers',[round(v,6) for v in c],'labels',g,f'SSE={ss:.6f}')
    assert all(hist[i][2]<=hist[i-1][2]+1e-10 for i in range(1,len(hist)))
    assert len(labels)==len(x)
    assert lloyd([5],[0,10])[1]==[0]  # 동률 한 군집에만 배정
    assert len(lloyd([0,1],[0,1,100])[0])==3  # 빈 중심 유지
    shifted=lloyd([v+7 for v in x],[7,17])
    assert shifted[1]==labels
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

iteration 1 centers [0.5, 9.5] labels [0, 0, 1, 1] SSE=1.000000
iteration 2 centers [0.5, 9.5] labels [0, 0, 1, 1] SSE=1.000000
checks OK

독립 변형 정답 stdout — 실습 후 확인

iteration 1 centers [1.666667, 9.5] labels [0, 0, 0, 1, 1] SSE=5.166667
iteration 2 centers [1.666667, 9.5] labels [0, 0, 0, 1, 1] SSE=5.166667
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')
실습 해설 보기

첫 세 값의 평균과 마지막 두 값의 평균으로 중심을 갱신한다. variant stdout에서 다음 반복의 안정성과 SSE를 검산한다. 초기 동률인5는 규칙에 따라 번호0에 한 번만 들어간다. 중심을 갱신한 뒤에는 이전 동률 판정을 고정하지 않고 거리를 다시 계산한다. 반례·복구 해설: 동률을 두 군집에 중복 배정하지 않는다. 빈 군집은 이 구현의 명시된 기존중심 유지 규칙을 적용한다. 반복한도에 도달하면 초기화/k와 데이터를 검토하며 수렴했다고 출력하지 않는다. 변형 입력의 실제 검산 stdout: iteration 1 centers [1.666667, 9.5] labels [0, 0, 0, 1, 1] SSE=5.166667 iteration 2 centers [1.666667, 9.5] labels [0, 0, 0, 1, 1] SSE=5.166667 checks OK

평가 기준: 반복 배정표와 평균, 수렴 조건·SSE 비증가, 동률 단일배정·빈 군집 처리, k/스케일/초기화 한계 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

대여 품목의 무게·사용빈도를 군집화할 계획을 작성한다. 평가: 단위표준화 이유, k 후보, 여러 초기화, 작은 군집과 업무적 해석의 한계.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “군집은 미리 정해진 정답이 아니라 선택한 거리와 초기화로 만든 묶음이다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html — 2026-10-05 KST: web_extract 429 후 curl로 공식 함수 본문 조회. 제곱거리합 목적, centers, algorithm=Lloyd, 기본 Hartigan-Wong과 구별, 초기화 및 군집 번호 비순서성을 확인. R 미실행.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

같이 담겼다는 사실과 추천 효과 구별하기

해결할 문제와 목표

신뢰도가 높다는 이유만으로 동시대여를 인과적 추천 효과로 해석한다.

거래에서 A·B·공동 건수를 실제 세고 support·confidence·lift와 역방향을 계산한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 향상도는 B가 원래 자주 나오는 정도를 보정하지만 원인을 증명하지 않는다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

장바구니를 모아 두 물건이 같이 보이는 빈도를 센다.

비유가 닿지 않는 곳: 같은 날씨 때문에 같이 필요했을 수 있으며 추천 때문에 같이 담았다는 뜻은 아니다.

실제로 작동하는 원리

한 거래는 한 대여 사건의 품목 집합이며 한 거래 안 A 수량이2여도 포함 여부는 한 번 센다. A→B의 지지도=count(A∩B)/N, 신뢰도=count(A∩B)/count(A), 향상도=신뢰도/[count(B)/N]다. 원예제 네 거래 {A,B},{A},{B},{A,B}의 N,A,B,AB를 먼저 센다. 높은 신뢰도도 B 자체가 더 흔하면 lift<1이 될 수 있다. lift1은 이 집계표에서 독립의 기준이며 표본오차·다중탐색으로 우연한 규칙이 나올 수 있다. A가 없으면 신뢰도, B가 없으면 lift가 정의되지 않아 None으로 표시한다. A→B와 B→A는 지지도는 같아도 신뢰도 분모가 다르다. 향상도는 대칭이다. 최소 지지도·건수 기준을 사전에 정하고 추천 효과는 무작위 노출 실험 등 별도 설계로 평가한다. 수치 중간값 추적(위 기본 입력의 실제 계산): N A B AB 4 3 3 2 support 1/2 confidence 2/3 lift 8/9 reverse_confidence 2/3 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 거래4개 {A,B},{A},{B},{A,B}; A→B.
  3. python3 data-patterns.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-patterns.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: A 또는B가0건이면 정의되지 않은 신뢰도/lift를0으로 숨기지 않는다. 거래ID 중복을 점검하고 같은 거래의 수량을 거래건수로 세지 않는다.

입력 예제

거래4개 {A,B},{A},{B},{A,B}; A→B.

예상 결과

N A B AB 4 3 3 2
support 1/2 confidence 2/3 lift 8/9
reverse_confidence 2/3
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 같은 날씨 때문에 같이 필요했을 수 있으며 추천 때문에 같이 담았다는 뜻은 아니다.
  2. A 또는B가0건이면 정의되지 않은 신뢰도/lift를0으로 숨기지 않는다. 거래ID 중복을 점검하고 같은 거래의 수량을 거래건수로 세지 않는다.

확인 문제

우산→장갑의 신뢰도가 높으면 우산 추천이 장갑 대여를 일으켰다고 할 수 있는가?

자기평가 · 자동채점 아님

평가 기준: 3점: 인과 단정 거부, 구체 공통원인, 별도 비교설계 각1점.

해설 보기

아니다. 비나 추위 같은 공통원인, 원래 높은 장갑 빈도, 추천 노출의 선택편향이 있을 수 있다. 효과는 별도 대조 실험으로 확인한다.

독립 실습

{A,C} 거래를 추가한 다섯 거래에서 N,A,B,AB와 세 지표·B→A 신뢰도를 구하라. 신뢰도가0.5인데 lift가1보다 작은 이유를 설명하라. A가0건 또는 B가0건인 반례의 지표와 한 거래의 중복 품목 처리도 설명하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 실제 네 count, 지표별 정확 분모, 역방향과 lift 해석, 0분모·거래 중복·인과 한계

완전 실행파일 — 가상자료·Python 표준라이브러리

from fractions import Fraction
import sys

def rule(transactions,a,b):
    if not transactions:raise ValueError('empty transactions')
    n=len(transactions);na=sum(a in t for t in transactions);nb=sum(b in t for t in transactions)
    both=sum(a in t and b in t for t in transactions)
    support=Fraction(both,n)
    confidence=Fraction(both,na) if na else None
    lift=confidence/Fraction(nb,n) if na and nb else None
    return n,na,nb,both,support,confidence,lift

def main(variant=False):
    t=[{'A','B'},{'A'},{'B'},{'A','B'}]
    if variant:t=[{'A','B'},{'A'},{'B'},{'A','B'},{'A','C'}]
    n,a,b,ab,s,c,l=rule(t,'A','B')
    print('N A B AB',n,a,b,ab)
    print('support',str(s),'confidence',str(c),'lift',str(l))
    rev=rule(t,'B','A');print('reverse_confidence',str(rev[5]))
    assert rule(t,'missing','B')[5:] == (None,None)
    independent=[{'A','B'},{'A'},{'B'},set()]
    assert rule(independent,'A','B')[-1]==1
    assert rule(t,'A','missing')[-1] is None
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

N A B AB 4 3 3 2
support 1/2 confidence 2/3 lift 8/9
reverse_confidence 2/3
checks OK

독립 변형 정답 stdout — 실습 후 확인

N A B AB 5 4 3 2
support 2/5 confidence 1/2 lift 5/6
reverse_confidence 2/3
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')
실습 해설 보기

N5,A4,B3,AB2. support2/5, confidence2/4, lift(1/2)/(3/5)=5/6. B→A confidence2/3. B는 전체에서3/5인데 A가 있을 때는1/2이므로 lift<1이다. 우산/장갑의 계절 공통원인을 배제하지 못한다. 반례·복구 해설: A 또는B가0건이면 정의되지 않은 신뢰도/lift를0으로 숨기지 않는다. 거래ID 중복을 점검하고 같은 거래의 수량을 거래건수로 세지 않는다. A가0건이면 confidence와lift는 None, A>0이나B가0건이면 confidence는0이고lift는 None이다. 한 거래는 set으로 처리해 같은 품목을 한 번만 센다. 변형 입력의 실제 검산 stdout: N A B AB 5 4 3 2 support 2/5 confidence 1/2 lift 5/6 reverse_confidence 2/3 checks OK

평가 기준: 실제 네 count, 지표별 정확 분모, 역방향과 lift 해석, 0분모·거래 중복·인과 한계 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

자전거·헬멧 묶음 추천을 개인정보 없이 평가하는 계획을 작성한다. 평가: 거래단위, 최소건수, 노출 배정, 실제 추가 대여효과·안전 한계.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “향상도는 B가 원래 자주 나오는 정도를 보정하지만 원인을 증명하지 않는다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://mhahsler.github.io/arules/docs/measures — 2026-10-05 KST: CRAN arules 공식 참조문서의 interestMeasure 설명에서 연결된 저자 문서를 web_extract로 실제 조회하고 저장 본문의 Confidence/Lift 절을 추가 열람. 거래별 count, support, confidence, lift의 식·대칭성·희소빈도 잡음 주의를 확인. 패키지 설치/실행이나 원문 사례 복제 없음.
  • https://cran.r-project.org/web/packages/arules/refman/arules.html — 2026-10-05 KST: web_extract가 반환한 workflow·거래 객체·interestMeasure의 수식 문서 링크를 확인. 전체 패키지 매뉴얼이나 API 실행을 검증했다고 주장하지 않음.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

자체 모의 1회 — 장부와 기획을 다시 묻기

해결할 문제와 목표

용어를 읽은 것과 새 자료에서 설명·계산·판단할 수 있는지는 다르다.

독자 서술·계산 문제를 먼저 풀고 오류 원인을 분류한 뒤 새 입력에서 재시험한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 각 답의 입력·계산·가정·반례를 함께 제출해야 독립 수행으로 인정한다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

새 운동장에서 같은 기술을 다시 해 보는 연습경기다.

비유가 닿지 않는 곳: 자체 모의는 원 기출·출제예측·공인 합격기준·원강의 평가를 재현하지 않는다.

실제로 작동하는 원리

이 회차는 아래 자체 문제 각각을 독립 채점한다. 먼저 문제만 보고 답안을 작성한 뒤 실행파일과 해설을 연다. 자동 검산은 숫자만 확인하며 윤리·누출·해석은 동료가 rubric에 따라 채점한다. 오답은 정의 오류/계산 오류/가정 누락/누출/과장 결론으로 분류하고, 무엇을 바꿨는지 기록한다. 한 항목이라도 부족하면 관련 단원 원리로 돌아가 입력을 바꿔 재검증한다. 새 가상 장부: d1 대여5 정상·신고2, d2 장부0 정지, d3 대여7 정상·신고1. 대기일[2,4,4,10]. 수치 중간값 추적(위 기본 입력의 실제 계산): mart [('d1', 5, 2), ('d2', 0, None), ('d3', 7, 1)] observed_rent_total 12 observed_days 2 wait_mean=5.000000 median=4.000000 SS=36.000000 sample_variance=12.000000 observed_report_rent_ratio 0.25 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 새 가상 장부: d1 대여5 정상·신고2, d2 장부0 정지, d3 대여7 정상·신고1. 대기일[2,4,4,10].
  3. python3 data-mock-one.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-mock-one.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.

입력 예제

새 가상 장부: d1 대여5 정상·신고2, d2 장부0 정지, d3 대여7 정상·신고1. 대기일[2,4,4,10].

예상 결과

mart [('d1', 5, 2), ('d2', 0, None), ('d3', 7, 1)] observed_rent_total 12 observed_days 2
wait_mean=5.000000 median=4.000000 SS=36.000000 sample_variance=12.000000
observed_report_rent_ratio 0.25
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 자체 모의는 원 기출·출제예측·공인 합격기준·원강의 평가를 재현하지 않는다.

확인 문제

가상 장부 d1 대여5·정상, d2 장부0·정지, d3 대여7·정상이다. 개인정보 이름·전화·날짜·건수 중 최소수집 열을 고르고 d2의0을 해석하라. 식별 열을 지워도 남는 재식별 위험을 한 가지 쓰라.

자기평가 · 자동채점 아님

평가 기준: 4점: 이름·전화 제외1, 날짜·건수 선택1, 정지=미관측1, 재식별 한계1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

날짜·건수를 목적에 맞게 유지하고 이름·전화는 수집하지 않는다. d2는 실제 수요0이 아닌 미관측이며 집계도 희소하면 재식별될 수 있다.

d1의 신고r1·r2와 d3의r3를 합쳐 날짜별 마트를 만들라. 원천 대여합과 직접조인의 증폭 위험을 설명하라.

자기평가 · 자동채점 아님

평가 기준: 4점: 집계키1, 세 행1, 원천 장부값과 관측수요 구별1, 직접조인 증폭1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

신고를 날짜별2·1로 집계한 뒤 결합해 d1(5,2), d2(0,None), d3(7,1)로 둔다. d2의 장부0은 수요 통계에서 제외한다. 신고 두 행에 대여5를 복제해 합산하면 증폭된다. 검산: 원천 장부합5+0+7=12. 정상 관측수요합도12이지만 정지일 수요를0으로 안다는 뜻은 아니다. 직접 좌결합의 잘못된 장부합5+5+0+7=17.

대기일[2,4,4,10]의 평균·중앙값·SS·표본분산을 구하고10을 지울지 결정하라.

자기평가 · 자동채점 아님

평가 기준: 4점: 평균·중앙값1, SS1, n-1 분모1, 자동삭제 거부1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

평균은 합/4, 중앙값은 가운데 두 값 평균, SS는 편차제곱합, 표본분산은 SS/3이다. expected.txt 수치와 대조한다.10은 원천 사유를 조사하며 불리하다고 삭제하지 않는다. 수치: 평균5, 중앙값4, SS36, 표본분산12. 편차[-3,-1,-1,5]의 제곱합9+1+1+25를 계산한다.

수리 대기 감소 시범에서 시행 후 유리한 지표만 고르지 않으려면 어떤 분석계획과 승인체계가 필요한가?

자기평가 · 자동채점 아님

평가 기준: 4점: 대상·기간1, 사전 지표1, 배정/책임 승인1, 품질 중단조건1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

사전에 대상·기간·중위 대기와 미처리율을 고정하고 운영 책임자가 시범배정을 승인한다. 분석 담당은 품질검사, 접근/삭제 담당은 보관정책을 관리한다. 누락률 악화 시 중단한다.

관측된 두 날 신고3/대여12를 개인별 고장확률이라고 해도 되는가? 이 자료로 창구를 폐쇄할 수 있는가?

자기평가 · 자동채점 아님

평가 기준: 4점: 건수비1, 다중신고1, 미관측/심각도 한계1, 보수적 시범 권고1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

신고와 대여는 다른 사건이며 동일 대여의 다중 신고가 가능하므로 건수비다. 미관측일과 고장심각도·접근성·교란을 추가 확인해야 하므로 즉시 폐쇄를 정당화하지 못한다.

독립 실습

먼저 다섯 문제를 독립 풀이하라. 재시험에서는 d3 대여를9로, 대기일을[1,3,3,9]로 바꿔 관측합·건수비·평균·분산을 다시 계산하고 기존 폐쇄 권고를 검토하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 문항별 rubric 충족, 도움 없이 작성한 중간식, variant 새 입력 재풀이, 오답 원인·수정·재검증 기록

완전 실행파일 — 가상자료·Python 표준라이브러리

import statistics as s,sys
from collections import Counter

def main(variant=False):
    rents=[('d1',5),('d2',0),('d3',7)]
    status={'d1':'ok','d2':'offline','d3':'ok'}
    waits=[2,4,4,10]
    if variant:waits=[1,3,3,9];rents[2]=('d3',9)
    reports=[('d1','r1'),('d1','r2'),('d3','r3')]
    count=Counter(day for day,_ in reports)
    mart=[(day,n,count[day] if status[day]=='ok' else None) for day,n in rents]
    observed=[n for day,n in rents if status[day]=='ok']
    print('mart',mart,'observed_rent_total',sum(observed),'observed_days',len(observed))
    mean=s.mean(waits);ss=sum((x-mean)**2 for x in waits)
    print(f'wait_mean={mean:.6f} median={s.median(waits):.6f} SS={ss:.6f} sample_variance={s.variance(waits):.6f}')
    print('observed_report_rent_ratio',sum(r[2] for r in mart if r[2] is not None)/sum(observed))
    assert ss/(len(waits)-1)==s.variance(waits)
    assert mart[1][-1] is None
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

exam.txt

독자 모의문제 — 기출 복원 아님.

1. 가상 장부 d1 대여5·정상, d2 장부0·정지, d3 대여7·정상이다. 개인정보 이름·전화·날짜·건수 중 최소수집 열을 고르고 d2의0을 해석하라. 식별 열을 지워도 남는 재식별 위험을 한 가지 쓰라.

2. d1의 신고r1·r2와 d3의r3를 합쳐 날짜별 마트를 만들라. 원천 대여합과 직접조인의 증폭 위험을 설명하라.

3. 대기일[2,4,4,10]의 평균·중앙값·SS·표본분산을 구하고10을 지울지 결정하라.

4. 수리 대기 감소 시범에서 시행 후 유리한 지표만 고르지 않으려면 어떤 분석계획과 승인체계가 필요한가?

5. 관측된 두 날 신고3/대여12를 개인별 고장확률이라고 해도 되는가? 이 자료로 창구를 폐쇄할 수 있는가?

answers.txt

1. 날짜·건수를 목적에 맞게 유지하고 이름·전화는 수집하지 않는다. d2는 실제 수요0이 아닌 미관측이며 집계도 희소하면 재식별될 수 있다.
채점: 4점: 이름·전화 제외1, 날짜·건수 선택1, 정지=미관측1, 재식별 한계1. 해당 문항의 모든 기준을 충족해야 통과한다.

2. 신고를 날짜별2·1로 집계한 뒤 결합해 d1(5,2), d2(0,None), d3(7,1)로 둔다. d2의 장부0은 수요 통계에서 제외한다. 신고 두 행에 대여5를 복제해 합산하면 증폭된다. 검산: 원천 장부합5+0+7=12. 정상 관측수요합도12이지만 정지일 수요를0으로 안다는 뜻은 아니다. 직접 좌결합의 잘못된 장부합5+5+0+7=17.
채점: 4점: 집계키1, 세 행1, 원천 장부값과 관측수요 구별1, 직접조인 증폭1. 해당 문항의 모든 기준을 충족해야 통과한다.

3. 평균은 합/4, 중앙값은 가운데 두 값 평균, SS는 편차제곱합, 표본분산은 SS/3이다. expected.txt 수치와 대조한다.10은 원천 사유를 조사하며 불리하다고 삭제하지 않는다. 수치: 평균5, 중앙값4, SS36, 표본분산12. 편차[-3,-1,-1,5]의 제곱합9+1+1+25를 계산한다.
채점: 4점: 평균·중앙값1, SS1, n-1 분모1, 자동삭제 거부1. 해당 문항의 모든 기준을 충족해야 통과한다.

4. 사전에 대상·기간·중위 대기와 미처리율을 고정하고 운영 책임자가 시범배정을 승인한다. 분석 담당은 품질검사, 접근/삭제 담당은 보관정책을 관리한다. 누락률 악화 시 중단한다.
채점: 4점: 대상·기간1, 사전 지표1, 배정/책임 승인1, 품질 중단조건1. 해당 문항의 모든 기준을 충족해야 통과한다.

5. 신고와 대여는 다른 사건이며 동일 대여의 다중 신고가 가능하므로 건수비다. 미관측일과 고장심각도·접근성·교란을 추가 확인해야 하므로 즉시 폐쇄를 정당화하지 못한다.
채점: 4점: 건수비1, 다중신고1, 미관측/심각도 한계1, 보수적 시범 권고1. 해당 문항의 모든 기준을 충족해야 통과한다.

error-note.txt

문항 번호:
내 최초 답:
오류 유형(정의/계산/가정/누출/과장):
잘못된 중간 단계:
수정 근거:
새 입력과 독립 계산:
재실행 stdout:
동료 설명 확인:

기본 입력 예상 stdout — 실제 Python 실행으로 확인

mart [('d1', 5, 2), ('d2', 0, None), ('d3', 7, 1)] observed_rent_total 12 observed_days 2
wait_mean=5.000000 median=4.000000 SS=36.000000 sample_variance=12.000000
observed_report_rent_ratio 0.25
checks OK

독립 변형 정답 stdout — 실습 후 확인

mart [('d1', 5, 2), ('d2', 0, None), ('d3', 9, 1)] observed_rent_total 14 observed_days 2
wait_mean=4.000000 median=3.000000 SS=36.000000 sample_variance=12.000000
observed_report_rent_ratio 0.21428571428571427
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')
실습 해설 보기

새 관측합14, 신고3의 건수비3/14다. 변형 대기일은 평균4, 중앙값3이고 SS와 표본분산은 기본 대기자료와 같다(전체값을1만큼 이동). 정지일 누락은 해결되지 않아 폐쇄를 확정하지 않는다. 변형 입력의 실제 검산 stdout: mart [('d1', 5, 2), ('d2', 0, None), ('d3', 9, 1)] observed_rent_total 14 observed_days 2 wait_mean=4.000000 median=3.000000 SS=36.000000 sample_variance=12.000000 observed_report_rent_ratio 0.21428571428571427 checks OK

평가 기준: 문항별 rubric 충족, 도움 없이 작성한 중간식, variant 새 입력 재풀이, 오답 원인·수정·재검증 기록 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

이 회차와 다른 가상 대여 품목으로 문제 하나를 출제하고 정답·반례·4점 rubric을 교환 채점한다. 평가: 조건 완결성, 직접 검산, 질문에 맞는 rubric.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “각 답의 입력·계산·가정·반례를 함께 제출해야 독립 수행으로 인정한다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

학습 단원

자체 모의 2회 — 추정과 예측의 경계

해결할 문제와 목표

용어를 읽은 것과 새 자료에서 설명·계산·판단할 수 있는지는 다르다.

독자 서술·계산 문제를 먼저 풀고 오류 원인을 분류한 뒤 새 입력에서 재시험한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 각 답의 입력·계산·가정·반례를 함께 제출해야 독립 수행으로 인정한다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

새 운동장에서 같은 기술을 다시 해 보는 연습경기다.

비유가 닿지 않는 곳: 자체 모의는 원 기출·출제예측·공인 합격기준·원강의 평가를 재현하지 않는다.

실제로 작동하는 원리

이 회차는 아래 자체 문제 각각을 독립 채점한다. 먼저 문제만 보고 답안을 작성한 뒤 실행파일과 해설을 연다. 자동 검산은 숫자만 확인하며 윤리·누출·해석은 동료가 rubric에 따라 채점한다. 오답은 정의 오류/계산 오류/가정 누락/누출/과장 결론으로 분류하고, 무엇을 바꿨는지 기록한다. 한 항목이라도 부족하면 관련 단원 원리로 돌아가 입력을 바꿔 재검증한다. 새 x[0,1,2]/y[1,2,4], 시계열[3,5,7,9,7], PCA 네 점[(0,0),(1,2),(2,1),(3,3)], 성공5/6. 수치 중간값 추적(위 기본 입력의 실제 계산): regression Sxx=2.000000 Sxy=3.000000 a=0.833333 b=1.500000 unseen_x3=5.333333 time [(4, [2, 3], 6.0, 9, 3), (5, [3, 4], 8.0, 7, 1)] MAE=2.000000 pca_cov [1.0, 0.8, 1.0] eigenvalues [1.8, 0.2] binomial_successes 5 n 6 one_sided_p 7/64 reject False checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 새 x[0,1,2]/y[1,2,4], 시계열[3,5,7,9,7], PCA 네 점[(0,0),(1,2),(2,1),(3,3)], 성공5/6.
  3. python3 data-mock-two.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-mock-two.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.

입력 예제

새 x[0,1,2]/y[1,2,4], 시계열[3,5,7,9,7], PCA 네 점[(0,0),(1,2),(2,1),(3,3)], 성공5/6.

예상 결과

regression Sxx=2.000000 Sxy=3.000000 a=0.833333 b=1.500000 unseen_x3=5.333333
time [(4, [2, 3], 6.0, 9, 3), (5, [3, 4], 8.0, 7, 1)] MAE=2.000000
pca_cov [1.0, 0.8, 1.0] eigenvalues [1.8, 0.2]
binomial_successes 5 n 6 one_sided_p 7/64 reject False
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 자체 모의는 원 기출·출제예측·공인 합격기준·원강의 평가를 재현하지 않는다.

확인 문제

x[0,1,2],y[1,2,4]에서 절편 포함 OLS 계수와 미관측 x3 예측을 구하라. 시험값을 적합에 추가하지 않는 이유는?

자기평가 · 자동채점 아님

평가 기준: 4점: Sxx/Sxy1, b/a1, x3 예측1, 시험 제외 이유1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

Sxx·Sxy를 계산하고 b=Sxy/Sxx, a=y평균-bx평균을 사용한다. 미관측 예측은 a+3b다. 출력과 대조하되 시험값을 fit에 넣으면 더 이상 독립 시험이 아니다. 수치: x평균1, y평균7/3, Sxx2, Sxy3, b1.5, a5/6, x3 예측16/3≈5.333333.

시계열[3,5,7,9,7]에서 첫3개 이후 두 시점의 후행2개 평균 예측과 MAE를 구하라. 한 단계 갱신인지 동시2단계 예측인지 표시하라.

자기평가 · 자동채점 아님

평가 기준: 4점: 과거 인덱스1, 두 예측1, MAE1, 예측지평 구별1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

4번째 예측은2·3번째 값, 5번째 예측은3·4번째 값의 평균이다. 실제4번째가 관측된 뒤5번째를 예측하는 한 단계 walk-forward다. 절대오차 두 개를 평균한다. 수치: 예측6과8, 실제9와7, 절대오차3과1, MAE2.

[(0,0),(1,2),(2,1),(3,3)]을 표본 표준화한 PCA에서 공분산·고유값을 구하라. PC1을 원인이라고 해도 되는가?

자기평가 · 자동채점 아님

평가 기준: 4점: 표본표준화1, 공분산1, 고유값1, 인과 제한1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

열 평균을 빼고 표본sd로 나눈 뒤 ZᵀZ/(n-1)을 계산한다. 대칭2x2 고유값은 trace와 판별식으로 구한다. 분산 요약은 원인이나 업무 중요도의 증거가 아니다. 수치: 열평균은 둘 다1.5, 표본분산은 둘 다5/3, 표준화 공분산[[1,0.8],[0.8,1]], 고유값1.8·0.2.

6번의 독립 시행 중5번 성공이다. H0 p0.5, H1 p>0.5, alpha0.05의 정확 p값과 기각 판단을 구하라.

자기평가 · 자동채점 아님

평가 기준: 4점: 꼬리 범위1, 조합확률·합1, 기각 판단1, 비기각 해석1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

P(X>=5)=조합(6,5)/2^6+조합(6,6)/2^6를 합한다. stdout 정확분수와 비교한다.0.05보다 크면 기각하지 않지만 H0를 증명한 것은 아니다. 수치: (6+1)/64=7/64=0.109375이므로 기각하지 않는다.

전체기간 평균으로 표준화한 뒤 월을 무작위 분할했다. 오류 경로와 수정·재검증 절차를 써라.

자기평가 · 자동채점 아님

평가 기준: 4점: 전처리 누출1, 시간 분리 문제1, 학습범위 적합1, 재평가1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

미래 기간이 평균·sd에 들어가고 미래로 학습해 과거를 시험할 수 있다. 시간순 분리 후 각 학습구간에서 변환을 적합하고 이후 평가기간에 고정 적용한다.

독립 실습

다섯 문제를 먼저 풀고 변형 y[2,4,5], 마지막 시계열값13, PCA[(0,3),(1,1),(2,2),(3,0)], 성공6/6을 독립 재계산하라. 바뀐 값과 바뀌면 안 되는 학습값을 구분하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 문항별 rubric 충족, 도움 없이 작성한 중간식, variant 새 입력 재풀이, 오답 원인·수정·재검증 기록

완전 실행파일 — 가상자료·Python 표준라이브러리

import statistics as s, math, sys

def fit(x,y):
    if len(x)!=len(y) or len(x)<2:raise ValueError('paired n>=2 required')
    xm,ym=s.mean(x),s.mean(y)
    xx=sum((v-xm)**2 for v in x);xy=sum((a-xm)*(b-ym) for a,b in zip(x,y))
    if xx==0:raise ValueError('constant x')
    slope=xy/xx;intercept=ym-slope*xm
    return intercept,slope,xx,xy

def forecast(history,window):
    if window<1 or len(history)<window:raise ValueError('insufficient past')
    return s.mean(history[-window:])
def evaluate(values,start,window):
    records=[]
    for t in range(start,len(values)):
        history=values[:t]
        p=forecast(history,window)
        records.append((t+1,list(range(t-window+1,t+1)),float(p),values[t],abs(p-values[t])))
    return records,s.mean(r[-1] for r in records)
import math,statistics as st,sys

def eigen2(a,b,d):
    # 대칭 [[a,b],[b,d]]의 고유값 및 단위 고유벡터를 계산한다.
    theta=0.5*math.atan2(2*b,a-d)
    v=(math.cos(theta),math.sin(theta));w=(-v[1],v[0])
    gap=math.hypot(a-d,2*b)
    return [(a+d+gap)/2,(a+d-gap)/2],[v,w]
def pca(rows,scale=True):
    n=len(rows)
    if n<2 or any(len(r)!=2 for r in rows):raise ValueError('n>=2, two columns required')
    means=[st.mean(r[j] for r in rows) for j in range(2)]
    sd=[st.stdev(r[j] for r in rows) if scale else 1.0 for j in range(2)]
    if min(sd)<=0:raise ValueError('constant column cannot be standardized')
    z=[[(r[j]-means[j])/sd[j] for j in range(2)] for r in rows]
    a=sum(r[0]**2 for r in z)/(n-1)
    b=sum(r[0]*r[1] for r in z)/(n-1)
    d=sum(r[1]**2 for r in z)/(n-1)
    values,vectors=eigen2(a,b,d)
    scores=[[sum(r[j]*v[j] for j in range(2)) for v in vectors] for r in z]
    error=sum(sum((r[j]-score[0]*vectors[0][j])**2 for j in range(2)) for r,score in zip(z,scores))
    for lam,v in zip(values,vectors):
        assert abs(a*v[0]+b*v[1]-lam*v[0])<1e-9
        assert abs(b*v[0]+d*v[1]-lam*v[1])<1e-9
    assert abs(error-(n-1)*values[1])<1e-9
    return means,sd,(a,b,d),values,vectors,scores,error

from math import comb,isclose
from fractions import Fraction
import sys

def tail(k,n,p):
    if not 0<=k<=n or not 0<=p<=1:raise ValueError('bad binomial input')
    return sum(comb(n,j)*p**j*(1-p)**(n-j) for j in range(k,n+1))
def main(variant=False):
    x=[0,1,2];y=[1,2,4] if not variant else [2,4,5]
    a,b,xx,xy=fit(x,y)
    print(f'regression Sxx={xx:.6f} Sxy={xy:.6f} a={a:.6f} b={b:.6f} unseen_x3={a+3*b:.6f}')
    seq=[3,5,7,9,7] if not variant else [3,5,7,9,13]
    rec,mae=evaluate(seq,3,2)
    print('time',rec,f'MAE={mae:.6f}')
    rows=[(0,0),(1,2),(2,1),(3,3)] if not variant else [(0,3),(1,1),(2,2),(3,0)]
    result=pca(rows)
    print('pca_cov',[round(v,6) for v in result[2]],'eigenvalues',[round(v,6) for v in result[3]])
    k=5 if not variant else 6
    p=tail(k,6,Fraction(1,2))
    print('binomial_successes',k,'n',6,'one_sided_p',str(p),'reject',p<Fraction(5,100))
    assert abs(sum(result[3])-2)<1e-10
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

exam.txt

독자 모의문제 — 기출 복원 아님.

1. x[0,1,2],y[1,2,4]에서 절편 포함 OLS 계수와 미관측 x3 예측을 구하라. 시험값을 적합에 추가하지 않는 이유는?

2. 시계열[3,5,7,9,7]에서 첫3개 이후 두 시점의 후행2개 평균 예측과 MAE를 구하라. 한 단계 갱신인지 동시2단계 예측인지 표시하라.

3. [(0,0),(1,2),(2,1),(3,3)]을 표본 표준화한 PCA에서 공분산·고유값을 구하라. PC1을 원인이라고 해도 되는가?

4. 6번의 독립 시행 중5번 성공이다. H0 p0.5, H1 p>0.5, alpha0.05의 정확 p값과 기각 판단을 구하라.

5. 전체기간 평균으로 표준화한 뒤 월을 무작위 분할했다. 오류 경로와 수정·재검증 절차를 써라.

answers.txt

1. Sxx·Sxy를 계산하고 b=Sxy/Sxx, a=y평균-bx평균을 사용한다. 미관측 예측은 a+3b다. 출력과 대조하되 시험값을 fit에 넣으면 더 이상 독립 시험이 아니다. 수치: x평균1, y평균7/3, Sxx2, Sxy3, b1.5, a5/6, x3 예측16/3≈5.333333.
채점: 4점: Sxx/Sxy1, b/a1, x3 예측1, 시험 제외 이유1. 해당 문항의 모든 기준을 충족해야 통과한다.

2. 4번째 예측은2·3번째 값, 5번째 예측은3·4번째 값의 평균이다. 실제4번째가 관측된 뒤5번째를 예측하는 한 단계 walk-forward다. 절대오차 두 개를 평균한다. 수치: 예측6과8, 실제9와7, 절대오차3과1, MAE2.
채점: 4점: 과거 인덱스1, 두 예측1, MAE1, 예측지평 구별1. 해당 문항의 모든 기준을 충족해야 통과한다.

3. 열 평균을 빼고 표본sd로 나눈 뒤 ZᵀZ/(n-1)을 계산한다. 대칭2x2 고유값은 trace와 판별식으로 구한다. 분산 요약은 원인이나 업무 중요도의 증거가 아니다. 수치: 열평균은 둘 다1.5, 표본분산은 둘 다5/3, 표준화 공분산[[1,0.8],[0.8,1]], 고유값1.8·0.2.
채점: 4점: 표본표준화1, 공분산1, 고유값1, 인과 제한1. 해당 문항의 모든 기준을 충족해야 통과한다.

4. P(X>=5)=조합(6,5)/2^6+조합(6,6)/2^6를 합한다. stdout 정확분수와 비교한다.0.05보다 크면 기각하지 않지만 H0를 증명한 것은 아니다. 수치: (6+1)/64=7/64=0.109375이므로 기각하지 않는다.
채점: 4점: 꼬리 범위1, 조합확률·합1, 기각 판단1, 비기각 해석1. 해당 문항의 모든 기준을 충족해야 통과한다.

5. 미래 기간이 평균·sd에 들어가고 미래로 학습해 과거를 시험할 수 있다. 시간순 분리 후 각 학습구간에서 변환을 적합하고 이후 평가기간에 고정 적용한다.
채점: 4점: 전처리 누출1, 시간 분리 문제1, 학습범위 적합1, 재평가1. 해당 문항의 모든 기준을 충족해야 통과한다.

error-note.txt

문항 번호:
내 최초 답:
오류 유형(정의/계산/가정/누출/과장):
잘못된 중간 단계:
수정 근거:
새 입력과 독립 계산:
재실행 stdout:
동료 설명 확인:

기본 입력 예상 stdout — 실제 Python 실행으로 확인

regression Sxx=2.000000 Sxy=3.000000 a=0.833333 b=1.500000 unseen_x3=5.333333
time [(4, [2, 3], 6.0, 9, 3), (5, [3, 4], 8.0, 7, 1)] MAE=2.000000
pca_cov [1.0, 0.8, 1.0] eigenvalues [1.8, 0.2]
binomial_successes 5 n 6 one_sided_p 7/64 reject False
checks OK

독립 변형 정답 stdout — 실습 후 확인

regression Sxx=2.000000 Sxy=3.000000 a=2.166667 b=1.500000 unseen_x3=6.666667
time [(4, [2, 3], 6.0, 9, 3), (5, [3, 4], 8.0, 13, 5)] MAE=4.000000
pca_cov [1.0, -0.8, 1.0] eigenvalues [1.8, 0.2]
binomial_successes 6 n 6 one_sided_p 1/64 reject True
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')
실습 해설 보기

회귀 계수는 새 y로 다시 적합한다. 마지막 시계열 실제값만 바뀌면 두 예측은 그대로고 마지막 오차만 바뀐다. PCA 공분산의 상대부호가 바뀌지만 고유값은 유지된다. 성공6/6의 꼬리는 마지막 한 항만 포함한다. variant-expected.txt와 각 식을 대조한다. 변형 입력의 실제 검산 stdout: regression Sxx=2.000000 Sxy=3.000000 a=2.166667 b=1.500000 unseen_x3=6.666667 time [(4, [2, 3], 6.0, 9, 3), (5, [3, 4], 8.0, 13, 5)] MAE=4.000000 pca_cov [1.0, -0.8, 1.0] eigenvalues [1.8, 0.2] binomial_successes 6 n 6 one_sided_p 1/64 reject True checks OK

평가 기준: 문항별 rubric 충족, 도움 없이 작성한 중간식, variant 새 입력 재풀이, 오답 원인·수정·재검증 기록 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

이 회차와 다른 가상 대여 품목으로 문제 하나를 출제하고 정답·반례·4점 rubric을 교환 채점한다. 평가: 조건 완결성, 직접 검산, 질문에 맞는 rubric.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “각 답의 입력·계산·가정·반례를 함께 제출해야 독립 수행으로 인정한다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

학습 단원

자체 모의 3회 — 모델 이름 대신 실행 증거

해결할 문제와 목표

용어를 읽은 것과 새 자료에서 설명·계산·판단할 수 있는지는 다르다.

독자 서술·계산 문제를 먼저 풀고 오류 원인을 분류한 뒤 새 입력에서 재시험한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 각 답의 입력·계산·가정·반례를 함께 제출해야 독립 수행으로 인정한다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

새 운동장에서 같은 기술을 다시 해 보는 연습경기다.

비유가 닿지 않는 곳: 자체 모의는 원 기출·출제예측·공인 합격기준·원강의 평가를 재현하지 않는다.

실제로 작동하는 원리

이 회차는 아래 자체 문제 각각을 독립 채점한다. 먼저 문제만 보고 답안을 작성한 뒤 실행파일과 해설을 연다. 자동 검산은 숫자만 확인하며 윤리·누출·해석은 동료가 rubric에 따라 채점한다. 오답은 정의 오류/계산 오류/가정 누락/누출/과장 결론으로 분류하고, 무엇을 바꿨는지 기록한다. 한 항목이라도 부족하면 관련 단원 원리로 돌아가 입력을 바꿔 재검증한다. 새 학습x[0,2,4,6]/y0011과 시험x[1,3,5], 군집[1,2,8,9], 거래5장, 신경망x[-3,-1,1,3]. 수치 중간값 추적(위 기본 입력의 실제 계산): tree (0.0, 3.0, 0, 1) predictions [0, 0, 1] metrics (1, 0, 0, 2, 1.0, 1.0, 1.0) ensemble_thresholds [5.0, 3.0, 3.0, 3.0, None, 2.0, 4.0, 2.0, 2.0] predictions [0, 0, 1] metrics (1, 0, 0, 2, 1.0, 1.0, 1.0) cluster [1.5, 8.5] [0, 0, 1, 1] SSE 1.0 association_counts_and_metrics ['5', '3', '3', '2', '2/5', '2/3', '10/9'] NN_loss 0.563985 0.006834 unseen [0, 0, 1, 1] accuracy 1.0 majority_accuracy 0.5 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 새 학습x[0,2,4,6]/y0011과 시험x[1,3,5], 군집[1,2,8,9], 거래5장, 신경망x[-3,-1,1,3].
  3. python3 data-mock-three.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-mock-three.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.

입력 예제

새 학습x[0,2,4,6]/y0011과 시험x[1,3,5], 군집[1,2,8,9], 거래5장, 신경망x[-3,-1,1,3].

예상 결과

tree (0.0, 3.0, 0, 1) predictions [0, 0, 1] metrics (1, 0, 0, 2, 1.0, 1.0, 1.0)
ensemble_thresholds [5.0, 3.0, 3.0, 3.0, None, 2.0, 4.0, 2.0, 2.0] predictions [0, 0, 1] metrics (1, 0, 0, 2, 1.0, 1.0, 1.0)
cluster [1.5, 8.5] [0, 0, 1, 1] SSE 1.0
association_counts_and_metrics ['5', '3', '3', '2', '2/5', '2/3', '10/9']
NN_loss 0.563985 0.006834 unseen [0, 0, 1, 1] accuracy 1.0 majority_accuracy 0.5
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 자체 모의는 원 기출·출제예측·공인 합격기준·원강의 평가를 재현하지 않는다.

확인 문제

학습 x[0,2,4,6],y[0,0,1,1]로 stump를 적합하고 시험x[1,3,5],실제[0,0,1]의 혼동행렬을 구하라. 경계3은 왼쪽이다.

자기평가 · 자동채점 아님

평가 기준: 4점: 후보/분기1, Gini1, 경계 예측1, 혼동행렬1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

서로 다른 x의 중점을 후보로 계산하면 분기3에서 잎이 순수해진다. <=3은0, >3은1로 예측한 뒤 TP/FP/FN/TN을 실제와 비교한다. 수치: 부모 Gini0.5, 최적 가중 Gini0, 예측[0,0,1], TP1 FP0 FN0 TN2, 정확도1.

같은 학습4행의 seed17·9개 bootstrap stump와 단일 stump를 같은 미관측3건에 비교하라. 동률 성능이면 무엇을 권고하는가?

자기평가 · 자동채점 아님

평가 기준: 4점: bootstrap fit1, 같은 시험1, 비교 결과1, 작은 표본·복잡도 권고1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

각 bootstrap에서 실제로 분기를 학습한 후 투표한다. 양쪽 지표를 나란히 보고 동률이면 복잡도·비용을 고려해 단순모델 유지도 타당하다. 세 시험건으로 일반적 우월성을 단정하지 않는다. 고정 seed 실행에서는 단일/앙상블 모두[0,0,1]로 정확도1이다. 복원추출 일부 모델이 상수 예측이어도 합의가 같은 것은 이 시험자료의 결과다.

점[1,2,8,9]를 초기중심1·9로 Lloyd 군집화하라. 중심·배정·SSE와 군집번호 의미를 설명하라.

자기평가 · 자동채점 아님

평가 기준: 4점: 배정1, 평균 중심1, SSE1, 번호 한계1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

가까운 중심에 배정하고 각각 평균을 구해 반복한다. 첫 묶음1·2, 둘째8·9이며 중심과 SSE는 실행으로 검산한다. 군집 번호는 정답/등급이 아니다. 수치: 중심1.5·8.5, SSE1.0, 다음 반복에서도 중심이 같아 종료한다.

거래 {A,B},{A,B},{A},{},{B}에서 A→B 지지도·신뢰도·lift를 구하라. 추천 효과와 같은가?

자기평가 · 자동채점 아님

평가 기준: 4점: count1, 세 지표2, 인과 한계1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

N5,A3,B3,AB2로 지지도2/5, 신뢰도2/3, lift=(2/3)/(3/5)다. 계절과 이용목적의 공통원인이 남아 추천 인과효과와 같지 않다. 수치: lift10/9≈1.111111. B가 원래 등장할 확률3/5를 분모로 쓴다.

신경망 학습x[-3,-1,1,3]/y[0,0,1,1]와 시험x[-2,-0.5,0.5,2]에서 손실·미관측 성능을 비교하라. gradient 유한차분 검사의 목적은?

자기평가 · 자동채점 아님

평가 기준: 4점: 실제 파라미터 학습1, 손실 전후1, 미관측 비교1, 유한차분 검사의 범위1. 해당 문항의 모든 기준을 충족해야 통과한다.

해설 보기

같은7개 매개변수 모델을 실제 역전파로 fit한다. 학습손실 전후와 미관측 정확도·다수라벨 기준선을 함께 보고한다. 유한차분은 미분 구현의 오류를 찾지 일반화 성능을 증명하지 않는다. 고정 조건 실행: 학습 BCE0.563985→0.006834, 미관측 정확도1.0, 다수라벨 기준선0.5. 작은 가상 표본의 결과다.

독립 실습

다섯 문제를 먼저 풀고 변형: 나무 학습라벨0111, 군집에3 추가, 거래에{B} 추가, 신경망 학습/시험 라벨 반전. 각 결과의 차이를 독립 계산하고 오답 분류표를 완성하라.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 문항별 rubric 충족, 도움 없이 작성한 중간식, variant 새 입력 재풀이, 오답 원인·수정·재검증 기록

완전 실행파일 — 가상자료·Python 표준라이브러리

import math,sys

def gini(y):
    if not y:return 0.0
    p=sum(y)/len(y)
    return 2*p*(1-p)
def majority(y):return int(sum(y)>len(y)/2)  # 동률은 0

def fit_stump(x,y):
    if len(x)!=len(y) or not x or any(v not in (0,1) for v in y):raise ValueError('paired binary data required')
    values=sorted(set(x));best=None
    for lo,hi in zip(values,values[1:]):
        t=(lo+hi)/2
        left=[b for a,b in zip(x,y) if a<=t];right=[b for a,b in zip(x,y) if a>t]
        score=(len(left)*gini(left)+len(right)*gini(right))/len(y)
        candidate=(score,t,majority(left),majority(right))
        if best is None or candidate<best:best=candidate
    if best is None:return (gini(y),None,majority(y),majority(y))
    return best

def predict(model,x):
    _,t,left,right=model
    return left if t is None or x<=t else right

def metrics(truth,pred):
    if len(truth)!=len(pred) or not truth:raise ValueError('nonempty paired labels required')
    tp=sum(a==b==1 for a,b in zip(truth,pred));fp=sum(a==0 and b==1 for a,b in zip(truth,pred))
    fn=sum(a==1 and b==0 for a,b in zip(truth,pred));tn=sum(a==b==0 for a,b in zip(truth,pred))
    return (tp,fp,fn,tn,(tp+tn)/len(truth),tp/(tp+fp) if tp+fp else None,tp/(tp+fn) if tp+fn else None)

import random

def bag_fit(x,y,n_models=9,seed=17):
    rng=random.Random(seed);models=[];samples=[]
    for _ in range(n_models):
        idx=[rng.randrange(len(x)) for _ in x]
        samples.append(idx)
        models.append(fit_stump([x[i] for i in idx],[y[i] for i in idx]))
    return models,samples

def bag_predict(models,x):return int(sum(predict(m,x) for m in models)>len(models)/2)
import sys

def lloyd(x,initial,max_iter=100):
    if not x or not initial or len(set(initial))!=len(initial):raise ValueError('nonempty distinct initial centers required')
    centers=list(map(float,initial));history=[]
    for _ in range(max_iter):
        labels=[min(range(len(centers)),key=lambda j:((v-centers[j])**2,j)) for v in x]
        groups=[[v for v,g in zip(x,labels) if g==j] for j in range(len(centers))]
        # 빈 군집은 기존 중심을 유지한다. 다른 복구 규칙이면 결과도 달라질 수 있다.
        new=[sum(g)/len(g) if g else centers[j] for j,g in enumerate(groups)]
        sse=sum((v-new[g])**2 for v,g in zip(x,labels))
        history.append((new[:],labels[:],sse))
        if max(abs(a-b) for a,b in zip(new,centers))<1e-12:
            return new,labels,history
        centers=new
    raise ValueError('iteration limit')
from fractions import Fraction
import sys

def rule(transactions,a,b):
    if not transactions:raise ValueError('empty transactions')
    n=len(transactions);na=sum(a in t for t in transactions);nb=sum(b in t for t in transactions)
    both=sum(a in t and b in t for t in transactions)
    support=Fraction(both,n)
    confidence=Fraction(both,na) if na else None
    lift=confidence/Fraction(nb,n) if na and nb else None
    return n,na,nb,both,support,confidence,lift

import math,sys
# parameter order: w1,w2,b1,b2,v1,v2,c

def forward(p,x):
    h=[math.tanh(p[j]*x+p[2+j]) for j in range(2)]
    z=p[6]+sum(p[4+j]*h[j] for j in range(2))
    prob=1/(1+math.exp(-z)) if z>=0 else math.exp(z)/(1+math.exp(z))
    return h,z,prob

def loss_grad(p,xs,ys):
    if len(xs)!=len(ys) or not xs or any(y not in (0,1) for y in ys):raise ValueError('nonempty paired binary data required')
    if len(p)!=7 or not all(math.isfinite(v) for v in p+list(xs)):raise ValueError('finite parameters and inputs required')
    g=[0.0]*7;loss=0.0
    for x,y in zip(xs,ys):
        h,z,prob=forward(p,x)
        loss+=max(z,0)-z*y+math.log1p(math.exp(-abs(z)))
        delta=prob-y
        g[6]+=delta
        for j in range(2):
            g[4+j]+=delta*h[j]
            dh=delta*p[4+j]*(1-h[j]*h[j])
            g[j]+=dh*x;g[2+j]+=dh
    n=len(xs)
    return loss/n,[v/n for v in g]

def fit(xs,ys,steps=800,rate=0.1):
    p=[0.4,-0.3,0.1,-0.1,0.3,-0.2,0.0]
    first,g0=loss_grad(p,xs,ys)
    # 각 가중치·편향의 해석적 역전파와 중앙 유한차분 비교
    maxerr=0.0
    for j in range(len(p)):
        plus=p[:];minus=p[:];plus[j]+=1e-6;minus[j]-=1e-6
        numerical=(loss_grad(plus,xs,ys)[0]-loss_grad(minus,xs,ys)[0])/2e-6
        maxerr=max(maxerr,abs(numerical-g0[j]))
    assert maxerr<1e-7
    after_one=[a-rate*g for a,g in zip(p,g0)]
    for _ in range(steps):
        _,g=loss_grad(p,xs,ys)
        p=[a-rate*b for a,b in zip(p,g)]
    final,_=loss_grad(p,xs,ys)
    return p,first,final,g0,after_one,maxerr

def main(variant=False):
    train_x=[0,2,4,6];train_y=[0,0,1,1] if not variant else [0,1,1,1]
    test_x=[1,3,5];test_y=[0,0,1]
    stump=fit_stump(train_x,train_y);models,idx=bag_fit(train_x,train_y)
    p=[predict(stump,t) for t in test_x];pb=[bag_predict(models,t) for t in test_x]
    print('tree',stump,'predictions',p,'metrics',metrics(test_y,p))
    print('ensemble_thresholds',[m[1] for m in models],'predictions',pb,'metrics',metrics(test_y,pb))
    points=[1,2,8,9] if not variant else [1,2,3,8,9]
    c,g,h=lloyd(points,[1,9]);print('cluster',c,g,'SSE',round(h[-1][2],6))
    transactions=[{'A','B'},{'A','B'},{'A'},set(),{'B'}]
    if variant:transactions.append({'B'})
    print('association_counts_and_metrics',[str(v) for v in rule(transactions,'A','B')])
    nx=[-3,-1,1,3];ny=[0,0,1,1] if not variant else [1,1,0,0]
    params,l0,l1,grad,one,err=fit(nx,ny)
    nt=[-2,-0.5,0.5,2];truth=[0,0,1,1] if not variant else [1,1,0,0]
    np=[int(forward(params,t)[2]>=0.5) for t in nt]
    print('NN_loss',round(l0,6),round(l1,6),'unseen',np,'accuracy',sum(a==b for a,b in zip(np,truth))/4,'majority_accuracy',0.5)
    assert all(i in range(4) for sample in idx for i in sample)
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

exam.txt

독자 모의문제 — 기출 복원 아님.

1. 학습 x[0,2,4,6],y[0,0,1,1]로 stump를 적합하고 시험x[1,3,5],실제[0,0,1]의 혼동행렬을 구하라. 경계3은 왼쪽이다.

2. 같은 학습4행의 seed17·9개 bootstrap stump와 단일 stump를 같은 미관측3건에 비교하라. 동률 성능이면 무엇을 권고하는가?

3. 점[1,2,8,9]를 초기중심1·9로 Lloyd 군집화하라. 중심·배정·SSE와 군집번호 의미를 설명하라.

4. 거래 {A,B},{A,B},{A},{},{B}에서 A→B 지지도·신뢰도·lift를 구하라. 추천 효과와 같은가?

5. 신경망 학습x[-3,-1,1,3]/y[0,0,1,1]와 시험x[-2,-0.5,0.5,2]에서 손실·미관측 성능을 비교하라. gradient 유한차분 검사의 목적은?

answers.txt

1. 서로 다른 x의 중점을 후보로 계산하면 분기3에서 잎이 순수해진다. <=3은0, >3은1로 예측한 뒤 TP/FP/FN/TN을 실제와 비교한다. 수치: 부모 Gini0.5, 최적 가중 Gini0, 예측[0,0,1], TP1 FP0 FN0 TN2, 정확도1.
채점: 4점: 후보/분기1, Gini1, 경계 예측1, 혼동행렬1. 해당 문항의 모든 기준을 충족해야 통과한다.

2. 각 bootstrap에서 실제로 분기를 학습한 후 투표한다. 양쪽 지표를 나란히 보고 동률이면 복잡도·비용을 고려해 단순모델 유지도 타당하다. 세 시험건으로 일반적 우월성을 단정하지 않는다. 고정 seed 실행에서는 단일/앙상블 모두[0,0,1]로 정확도1이다. 복원추출 일부 모델이 상수 예측이어도 합의가 같은 것은 이 시험자료의 결과다.
채점: 4점: bootstrap fit1, 같은 시험1, 비교 결과1, 작은 표본·복잡도 권고1. 해당 문항의 모든 기준을 충족해야 통과한다.

3. 가까운 중심에 배정하고 각각 평균을 구해 반복한다. 첫 묶음1·2, 둘째8·9이며 중심과 SSE는 실행으로 검산한다. 군집 번호는 정답/등급이 아니다. 수치: 중심1.5·8.5, SSE1.0, 다음 반복에서도 중심이 같아 종료한다.
채점: 4점: 배정1, 평균 중심1, SSE1, 번호 한계1. 해당 문항의 모든 기준을 충족해야 통과한다.

4. N5,A3,B3,AB2로 지지도2/5, 신뢰도2/3, lift=(2/3)/(3/5)다. 계절과 이용목적의 공통원인이 남아 추천 인과효과와 같지 않다. 수치: lift10/9≈1.111111. B가 원래 등장할 확률3/5를 분모로 쓴다.
채점: 4점: count1, 세 지표2, 인과 한계1. 해당 문항의 모든 기준을 충족해야 통과한다.

5. 같은7개 매개변수 모델을 실제 역전파로 fit한다. 학습손실 전후와 미관측 정확도·다수라벨 기준선을 함께 보고한다. 유한차분은 미분 구현의 오류를 찾지 일반화 성능을 증명하지 않는다. 고정 조건 실행: 학습 BCE0.563985→0.006834, 미관측 정확도1.0, 다수라벨 기준선0.5. 작은 가상 표본의 결과다.
채점: 4점: 실제 파라미터 학습1, 손실 전후1, 미관측 비교1, 유한차분 검사의 범위1. 해당 문항의 모든 기준을 충족해야 통과한다.

error-note.txt

문항 번호:
내 최초 답:
오류 유형(정의/계산/가정/누출/과장):
잘못된 중간 단계:
수정 근거:
새 입력과 독립 계산:
재실행 stdout:
동료 설명 확인:

기본 입력 예상 stdout — 실제 Python 실행으로 확인

tree (0.0, 3.0, 0, 1) predictions [0, 0, 1] metrics (1, 0, 0, 2, 1.0, 1.0, 1.0)
ensemble_thresholds [5.0, 3.0, 3.0, 3.0, None, 2.0, 4.0, 2.0, 2.0] predictions [0, 0, 1] metrics (1, 0, 0, 2, 1.0, 1.0, 1.0)
cluster [1.5, 8.5] [0, 0, 1, 1] SSE 1.0
association_counts_and_metrics ['5', '3', '3', '2', '2/5', '2/3', '10/9']
NN_loss 0.563985 0.006834 unseen [0, 0, 1, 1] accuracy 1.0 majority_accuracy 0.5
checks OK

독립 변형 정답 stdout — 실습 후 확인

tree (0.0, 1.0, 0, 1) predictions [0, 1, 1] metrics (1, 1, 0, 1, 0.6666666666666666, 0.5, 1.0)
ensemble_thresholds [5.0, 1.0, 3.0, 1.0, None, 2.0, 1.0, 2.0, 2.0] predictions [0, 1, 1] metrics (1, 1, 0, 1, 0.6666666666666666, 0.5, 1.0)
cluster [2.0, 8.5] [0, 0, 0, 1, 1] SSE 2.5
association_counts_and_metrics ['6', '3', '4', '2', '1/3', '2/3', '1']
NN_loss 0.845307 0.007015 unseen [1, 1, 0, 0] accuracy 1.0 majority_accuracy 0.5
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')
실습 해설 보기

나무는 학습라벨 변경으로 분기를 재탐색한다. 군집 첫 묶음에3이 들어가 중심과 SSE가 달라진다. B만 추가한 거래에서는 A·AB 건수는 같고 N·B가 변해 지지도와lift가 달라진다. 신경망은 뒤집힌 과제에 다시 학습한다. variant-expected.txt와 비교하고 이전 답을 재사용하지 않는다. 변형 입력의 실제 검산 stdout: tree (0.0, 1.0, 0, 1) predictions [0, 1, 1] metrics (1, 1, 0, 1, 0.6666666666666666, 0.5, 1.0) ensemble_thresholds [5.0, 1.0, 3.0, 1.0, None, 2.0, 1.0, 2.0, 2.0] predictions [0, 1, 1] metrics (1, 1, 0, 1, 0.6666666666666666, 0.5, 1.0) cluster [2.0, 8.5] [0, 0, 0, 1, 1] SSE 2.5 association_counts_and_metrics ['6', '3', '4', '2', '1/3', '2/3', '1'] NN_loss 0.845307 0.007015 unseen [1, 1, 0, 0] accuracy 1.0 majority_accuracy 0.5 checks OK

평가 기준: 문항별 rubric 충족, 도움 없이 작성한 중간식, variant 새 입력 재풀이, 오답 원인·수정·재검증 기록 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

이 회차와 다른 가상 대여 품목으로 문제 하나를 출제하고 정답·반례·4점 rubric을 교환 채점한다. 평가: 조건 완결성, 직접 검산, 질문에 맞는 rubric.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “각 답의 입력·계산·가정·반례를 함께 제출해야 독립 수행으로 인정한다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://scikit-learn.org/stable/modules/tree.html — 2026-10-05 KST: web_extract 반환 분류·회귀 설명과 장단점에서 데이터로 분기 학습, 과적합·깊이 제한·불안정성을 확인. scikit-learn 설치·실행은 하지 않음. 독자 stump는 라이브러리 전체 구현이 아님.
  • https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html — 2026-10-05 KST: web_extract 앙상블 문서 429 후 curl로 공식 API 페이지 조회. predict/proba의 평균확률 및 predict_proba가 없는 기본학습기에서 투표로 결합하는 설명 확인. 본 교재는 경성 투표를 쓰는 독자 bagging stump이며 scikit-learn 실행 아님.
  • https://scikit-learn.org/stable/modules/neural_networks_supervised.html — 2026-10-05 KST: web_extract 429 후 curl 본문의 backpropagation, 분류 cross-entropy, gradient descent 갱신, 학습자료로만 scaling 절을 확인. 라이브러리 실행 없이 독자 작은 tanh 신경망을 구현.
  • https://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html — 2026-10-05 KST: web_extract 429 후 curl로 공식 함수 본문 조회. 제곱거리합 목적, centers, algorithm=Lloyd, 기본 Hartigan-Wong과 구별, 초기화 및 군집 번호 비순서성을 확인. R 미실행.
  • https://mhahsler.github.io/arules/docs/measures — 2026-10-05 KST: CRAN arules 공식 참조문서의 interestMeasure 설명에서 연결된 저자 문서를 web_extract로 실제 조회하고 저장 본문의 Confidence/Lift 절을 추가 열람. 거래별 count, support, confidence, lift의 식·대칭성·희소빈도 잡음 주의를 확인. 패키지 설치/실행이나 원문 사례 복제 없음.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

학습 단원

새 장부로 내 판단 검산하기

해결할 문제와 목표

운영팀이 변동하는 주별 수리 지표만 보고 개선안을 즉시 확대하려 한다.

새 장부의 결측·사건 단위·가중 집계를 검산하고 보수적인 의사결정 보고서를 독립 작성한다.

먼저 알아둘 것

  1. 앞 단원의 예제와 독립 변형을 실행하고 입력·중간값·판정의 차이를 설명할 수 있다.

핵심 한 문장: 분모와 분자의 사건이 다르면 비율을 확률이라고 부르지 말고 건수비로 보고한다.

지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여

큰 그림: 비유와 경계

진단서는 숫자 하나가 아니라 기록·검사·판단의 연결이다.

비유가 닿지 않는 곳: 가상 종합평가는 실제 현장 인과평가나 자격시험 채점이 아니다.

실제로 작동하는 원리

1주 대여4·수리신고2, 2주6·1, 3주 시스템정지·미관측, 4주8·3을 사용한다. 신고가 대여와1대1로 연결되지 않아 같은 대여에 여러 신고가 가능하면 수리/대여는 건수비이며1을 넘을 수도 있다. 주3 미관측은0/0=0으로 바꿀 수 없고 정상일의 실제0/0도 정의되지 않는다. 관측주 합계 건수비는 Σ신고/Σ대여로 분모 가중된 요약이며 주별 단순평균과 다르다. 가동시간만으로 미관측 잠재수요를 복원하지 않는다. 분석계획→키/완전성 감사→요약→시간분리→필요한 경우에만 예측→오류·윤리 점검→제한적 권고로 이어 간다. 개인정보 없는 가상자료·원천 정의·코드·결측 이유·승인 책임을 함께 전달한다. 수치 중간값 추적(위 기본 입력의 실제 계산): weekly_report_rent_count_ratios [(1, '1/2'), (2, '1/6'), (3, None), (4, '3/8')] pooled_observed_count_ratio 1/3 checks OK

따라 하기

  1. START-HERE.txt의 환경 준비와 파일 저장 절차부터 따른다. 이 단원의 모든 자료를 같은 새 폴더에 UTF-8로 저장하고 python3 environment-check.py를 실행해 ENVIRONMENT OK를 확인한다. Windows에서는 python 명령을 사용할 수 있다. 별도 Python 패키지·인증·유료 API는 필요 없다.
  2. 입력 예제를 읽고 결과를 먼저 손으로 예측한다. 주1(4,2), 주2(6,1), 주3 미관측, 주4(8,3); (대여,수리신고).
  3. python3 data-capstone.py 를 실행한다. Windows에서는 준비된 Python의 python 명령으로 바꿀 수 있다. 중간값과 expected.txt를 대조한다.
  4. 정답을 가리고 독립 실습을 작성한다. 그 뒤 python3 data-capstone.py --variant 로 새 입력의 해설 계산을 확인한다. variant-expected.txt는 실습 후 연다.
  5. 오류복구: 파일을 찾지 못하면 현재 터미널에서 파일명과 저장 위치를 확인한다. SyntaxError는 스마트 따옴표·들여쓰기를 원문과 대조한다. AssertionError는 지우지 말고 입력과 검산식의 차이를 찾는다. 숫자 출력의 마지막 자리 차이는 표시 정밀도 안에서 비교하고, 분기·라벨·누출 차이는 허용하지 않는다.
  6. 주제별 오류복구: 정상 관측주에 대여0·수리신고2가 있으면 주별 건수비는 미정의지만 전체기간 신고 합에서 그2건을 지우지 않는다. 다른 정상주 대여4·신고1과 합하면3/4다. 기간 전체 대여합도0이면 전체 건수비 역시 미정의다.

입력 예제

주1(4,2), 주2(6,1), 주3 미관측, 주4(8,3); (대여,수리신고).

예상 결과

weekly_report_rent_count_ratios [(1, '1/2'), (2, '1/6'), (3, None), (4, '3/8')]
pooled_observed_count_ratio 1/3
checks OK

이 출력은 가상 입력의 실제 Python 실행 결과이며 현장 성능·R 실행·학습자 성취를 뜻하지 않는다.

검증 방법

  1. 자동 검산은 아래 실행파일 내부 계산·불변식과 expected.txt 대조이며, 해석·윤리·전이의 타당성은 자기/동료 평가다. 출력만 복사하면 통과가 아니다.

흔한 오해와 실패 복구

  1. 가상 종합평가는 실제 현장 인과평가나 자격시험 채점이 아니다.
  2. 정상 관측주에 대여0·수리신고2가 있으면 주별 건수비는 미정의지만 전체기간 신고 합에서 그2건을 지우지 않는다. 다른 정상주 대여4·신고1과 합하면3/4다. 기간 전체 대여합도0이면 전체 건수비 역시 미정의다.

확인 문제

시스템 정지주를0/0=0으로 기록하면 왜 잘못인가?

자기평가 · 자동채점 아님

평가 기준: 3점: 0/0 미정의, 정지주 미관측, 결측 표시·결론범위 제한 각1점.

해설 보기

0/0은 정의되지 않고 정지주의 관측값도 없다.0으로 넣으면 측정불능을 성과 개선처럼 보이게 하므로 결측 이유를 남기고 관측구간 범위로 제한한다.

독립 실습

주5(10,1), 주6(2,1)을 추가해 주별 건수비와 관측주 전체 건수비를 계산하라. 1쪽 보고서에 결론·근거·반례·다음 실험·삭제정책을 쓰고, 어느 분석기법을 채택/보류할지 이유를 설명하라. 교육자 재사용 과제: 강사용 변형: 4주 대여를 0으로 바꾸고 합계 분모 4/분자5임을 예측하게 한다. 분모 0인 전체 구간도 따로 제시해 미정의 보류를 판정한다. 보고서에 결정권자와 수기 원장 복귀, 분석 불가능한 인과 질문을 적는다.

남길 증거: 수정한 입력, 직접 계산한 중간식, 실행 stdout, 결과 차이의 이유, 반례 처리 기록을 제출한다. 주별 분수와 결측, 합계 건수비의 분모 가중, 확률/건수비 구별, 근거·반례·시범·책임/삭제·기법 선택 보강 증거: 예측→관측→수정 후 출력과 타인 인계/미실시 기록을 구분한다.

완전 실행파일 — 가상자료·Python 표준라이브러리

from fractions import Fraction
import sys

def ratios(rows):
    result=[]
    for week,rent,repair,status in rows:
        value=Fraction(repair,rent) if status=='ok' and rent is not None and rent>0 and repair is not None else None
        result.append((week,value))
    valid=[r for r in rows if r[3]=='ok' and r[1] is not None and r[1]>=0 and r[2] is not None]
    denom=sum(r[1] for r in valid)
    pooled=Fraction(sum(r[2] for r in valid),denom) if denom>0 else None
    return result,pooled

def main(variant=False):
    rows=[(1,4,2,'ok'),(2,6,1,'ok'),(3,None,None,'offline'),(4,8,3,'ok')]
    if variant:rows += [(5,10,1,'ok'),(6,2,1,'ok')]
    rates,pooled=ratios(rows)
    print('weekly_report_rent_count_ratios',[(w,str(v) if v is not None else None) for w,v in rates])
    print('pooled_observed_count_ratio',str(pooled))
    assert ratios([(1,0,0,'ok')])[0][0][1] is None
    assert ratios([(1,0,2,'ok'),(2,4,1,'ok')])[1]==Fraction(3,4)
    assert rates[2][1] is None
    print('checks OK')
if __name__=='__main__':main('--variant' in sys.argv)

기본 입력 예상 stdout — 실제 Python 실행으로 확인

weekly_report_rent_count_ratios [(1, '1/2'), (2, '1/6'), (3, None), (4, '3/8')]
pooled_observed_count_ratio 1/3
checks OK

독립 변형 정답 stdout — 실습 후 확인

weekly_report_rent_count_ratios [(1, '1/2'), (2, '1/6'), (3, None), (4, '3/8'), (5, '1/10'), (6, '1/2')]
pooled_observed_count_ratio 4/15
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')
실습 해설 보기

주5 1/10, 주6 1/2로 변동한다. 관측 합계는 모든 유효 주의 분모를 합쳐 계산하며 variant stdout과 대조한다. 주3 결측·작은 표본·신고 심각도와 중복 때문에 곧바로 성공·폐쇄·확대를 주장하지 않는다. 먼저 정의·완전성을 감사하고 사전 지표가 있는 제한적 시범을 제안한다. 예측이 꼭 필요하지 않으면 신경망을 도입하지 않아도 된다. 반례·복구 해설: 정상 관측주에 대여0·수리신고2가 있으면 주별 건수비는 미정의지만 전체기간 신고 합에서 그2건을 지우지 않는다. 다른 정상주 대여4·신고1과 합하면3/4다. 기간 전체 대여합도0이면 전체 건수비 역시 미정의다. 변형 입력의 실제 검산 stdout: weekly_report_rent_count_ratios [(1, '1/2'), (2, '1/6'), (3, None), (4, '3/8'), (5, '1/10'), (6, '1/2')] pooled_observed_count_ratio 4/15 checks OK

평가 기준: 주별 분수와 결측, 합계 건수비의 분모 가중, 확률/건수비 구별, 근거·반례·시범·책임/삭제·기법 선택 각 항목 1점, 모든 항목을 충족해야 통과한다. 출력만 맞고 이유를 설명하지 못하면 재실습한다.

새 맥락에 적용하기

도서관 예약·취소 장부로 새 보고서를 만든다. 평가: 행/사건 정의, 재예약 중복, 관측구간, 비용·접근성, 사전 평가와 사람 승인. 독립 전이·실패주입: 새 입력: 도서관 가상 대여 장부에서 1주 4대여/신고2, 2주 0대여/신고2, 3주 미관측, 4주 4대여/신고1. 실행 전 관측주 전체 건수비 5/8, 2주 단독은 미정의를 예상한다. 2주를 삭제하는 잘못된 계산을 일부러 수행하고 전체 분자 누락을 고친다. 신고가 별건일 수 있어 대여자의 수리 확률이라 부르지 않는다.

내 말로 설명하고 가르치기

학습자는 다음 핵심 문장을 쉬운 말로 풀어 설명하고, 이 단원 예제의 중간값 하나를 다시 계산한다. “분모와 분자의 사건이 다르면 비율을 확률이라고 부르지 말고 건수비로 보고한다.” 강사는 이 단원의 질문과 변형 입력을 가리고 제시한다. 학습자가 결과가 달라지는 이유, 비유의 한계, 오류 복구 방법을 설명하는지 확인한다. 용어를 외워 말하거나 정답 출력만 복사하면 해당 실습을 다시 수행한다. 독립 설명·인수 판정: 판정: 결측과 0의 차이·주별 미정의·합계 5/8의 포함 범위를 자신의 식으로 설명한다. 원 코드의 가정과 다른 새 자료이므로 수정 없이 기존 stdout을 새 결과로 제출하면 불합격. 동료는 독립 입력과 집계식을 검산하고 삭제/접근 권한 미확인 항목을 표시한다. AI 없이 분모를 재계산한다.

실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.

읽음과 숙련은 별개입니다.

참고 출처와 확인 범위

  • https://docs.python.org/3/library/statistics.html — 2026-10-05 KST: web_extract 본문과 저장된 본문의 variance/pvariance, covariance, linear_regression 절을 실제 열람. 분모 n-1/n, 최소 관측 수, OLS 기울기·절편과 상수 x 오류를 확인.
  • https://docs.python.org/3/using/index.html — 환경 준비 안내의 공식 플랫폼별 설치/인터프리터 실행 문서 실제 조회. Windows Install Manager와 macOS .pkg 경로를 추가 확인했다. 이 제작 중 신규 설치는 하지 않았다.

← 전체 과정