[{"data":1,"prerenderedAt":270},["ShallowReactive",2],{"post-document:\u002Fdeep_learning\u002Fbasic\u002F2026\u002F08\u002F06\u002FML_Pipeline2\u002F":3},{"id":4,"title":5,"body":6,"categories":251,"date":254,"description":255,"extension":256,"image":257,"key_concepts":257,"last_modified_at":257,"legacyPath":258,"meta":259,"navigation":261,"part":257,"path":262,"published":261,"robots":257,"seo":263,"series":257,"stem":264,"strengths":257,"summary":265,"tags":266,"tradeoffs":257,"__hash__":269},"posts\u002Fposts\u002FDeep_Learning\u002FBasic\u002F2026-08-06-ML_Pipeline2.md","분석 자동화와 파이프라인 설계",{"type":7,"value":8,"toc":231},"minimark",[9,22,26,30,39,43,54,59,63,67,70,80,87,93,100,104,110,113,146,156,161,165,169,179,183,190,193,199,204,208,227],[10,11,12,17],"blockquote",{},[13,14,16],"h2",{"id":15},"기술-중심이-아닌-문제-해결-중심","기술 중심이 아닌 문제 해결 중심",[18,19,21],"h3",{"id":20},"좋은-분석은-올바른-문제-정의에서-시작","좋은 분석은 올바른 문제 정의에서 시작",[13,23,25],{"id":24},"_1-왜","1) 왜",[18,27,29],{"id":28},"반복-작업을-사람이-계속할-필요는-없다","반복 작업을 사람이 계속할 필요는 없다",[31,32,33,34,38],"p",{},"매주 같은 데이터를 받아 같은 전처리, 통계, 차트를 반복한다면 자동화 대상이다. 수작업 복붙을 줄이면 실수도 줄고, 같은 입력에 같은 코드를 실행하는 ",[35,36,37],"strong",{},"재현 가능한 분석","으로 바꿀 수 있다.",[18,40,42],{"id":41},"분석은-최신성이-중요하다","분석은 최신성이 중요하다",[31,44,45,46,50,51,53],{},"어제의 시황, 뉴스, 산업 데이터를 오늘 아침 다시 사람이 정리하기 시작한다면 이미 늦다. 반복 작업은 ",[47,48,49],"code",{},"schedule",", cron 같은 스케줄러로 실행 시점을 정할 수 있다. Python ",[47,52,49],{},"도 일·시간 단위 작업 등록을 지원한다.",[31,55,56],{},[35,57,58],{},"핵심: 자동화의 목적은 편하게 일하는 것이 아니라, 반복 분석을 빠르고 동일하게 재생산하는 것이다.",[13,60,62],{"id":61},"_2-어떻게","2) 어떻게",[18,64,66],{"id":65},"분석-단계를-파이프라인으로-나눈다","분석 단계를 파이프라인으로 나눈다",[31,68,69],{},"좋은 구조는 간단하다.",[71,72,78],"pre",{"className":73,"code":75,"language":76,"meta":77},[74],"language-text","수집 → 전처리 → 분석 → 시각화 → 리포트 → 저장\n","text","",[47,79,75],{"__ignoreMap":77},[31,81,82,83,86],{},"각 단계를 함수로 분리하고 오류를 기록한다. 분석이 반복되기 시작하면 Notebook에 있던 검증된 함수를 ",[47,84,85],{},"src\u002F","로 이동한다.",[71,88,91],{"className":89,"code":90,"language":76,"meta":77},[74],"data-project\u002F\n├── data\u002F\n├── notebooks\u002F\n├── src\u002F\n├── tests\u002F\n└── README.md\n",[47,92,90],{"__ignoreMap":77},[31,94,95,96,99],{},"Notebook은 EDA·실험, ",[47,97,98],{},".py","는 반복 실행·테스트·CI 대상으로 역할을 나누는 것이 핵심이다.",[18,101,103],{"id":102},"실행과-리포트까지-자동화한다","실행과 리포트까지 자동화한다",[31,105,106,109],{},[47,107,108],{},"Jinja2","는 데이터와 템플릿을 결합해 HTML 같은 최종 문서를 생성할 수 있는 템플릿 엔진이다. 분석 결과와 차트를 템플릿에 넣으면 매번 보고서를 다시 작성할 필요가 없다.",[31,111,112],{},"Notebook 결과는 원문에서 사용한 명령 그대로 HTML로 변환할 수 있다.",[71,114,118],{"className":115,"code":116,"language":117,"meta":77,"style":77},"language-bash shiki shiki-themes github-light github-dark","$ jupyter nbconvert --to html notebooks\u002F01_eda.ipynb\n","bash",[47,119,120],{"__ignoreMap":77},[121,122,125,129,133,136,140,143],"span",{"class":123,"line":124},"line",1,[121,126,128],{"class":127},"sScJk","$",[121,130,132],{"class":131},"sZZnC"," jupyter",[121,134,135],{"class":131}," nbconvert",[121,137,139],{"class":138},"sj4cs"," --to",[121,141,142],{"class":131}," html",[121,144,145],{"class":131}," notebooks\u002F01_eda.ipynb\n",[31,147,148,151,152,155],{},[47,149,150],{},"nbconvert","는 ",[47,153,154],{},".ipynb","를 HTML 등 정적 형식으로 변환한다.",[31,157,158],{},[35,159,160],{},"핵심: 자동화는 하나의 거대한 코드가 아니라, 독립된 단계를 순서대로 연결하는 것이다.",[13,162,164],{"id":163},"_3-효과","3) 효과",[18,166,168],{"id":167},"재현성과-협업성이-올라간다","재현성과 협업성이 올라간다",[31,170,171,174,175,178],{},[47,172,173],{},"requirements.txt + .env 예시 + README","가 있으면 다른 사람이 실행 환경과 실행 방법을 파악하기 쉬워진다. 원본 데이터는 ",[47,176,177],{},"data\u002Fraw\u002F","에 두고 직접 수정하지 않으며, Git에는 데이터 대신 출처와 생성 방법을 기록한다.",[18,180,182],{"id":181},"검증까지-자동화할-수-있다","검증까지 자동화할 수 있다",[31,184,185,186,189],{},"분석 코드를 GitHub에 올렸다면 ",[47,187,188],{},"pytest","를 GitHub Actions와 연결해 Push나 Pull Request 시 자동 검증할 수 있다. GitHub 공식 문서에서도 Python 프로젝트의 의존성 설치와 pytest 실행을 CI workflow로 구성하는 방법을 제공한다.",[31,191,192],{},"결국 흐름은 다음과 같다.",[71,194,197],{"className":195,"code":196,"language":76,"meta":77},[74],"Notebook에서 탐색\n      ↓\n함수화\n      ↓\nsrc\u002F 모듈화\n      ↓\n자동 실행\n      ↓\n리포트 생성\n      ↓\n테스트 \u002F CI\n",[47,198,196],{"__ignoreMap":77},[31,200,201],{},[35,202,203],{},"핵심: 재현 가능한 분석이 쌓이면 개인 스크립트가 팀이 신뢰할 수 있는 분석 파이프라인이 된다.",[13,205,207],{"id":206},"추가로-해볼-수-있는-것","추가로 해볼 수 있는 것",[209,210,211,217,220],"ul",{},[212,213,214,216],"li",{},[47,215,49],{},"로 매일 같은 시간에 분석 스크립트 자동 실행",[212,218,219],{},"Jinja2에 Plotly 차트를 넣어 HTML 리포트 자동 생성",[212,221,222,223,226],{},"GitHub Actions에 ",[47,224,225],{},"pytest + Ruff","를 연결해 분석 코드 자동 검증",[228,229,230],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":77,"searchDepth":232,"depth":232,"links":233},2,[234,238,242,246,250],{"id":15,"depth":232,"text":16,"children":235},[236],{"id":20,"depth":237,"text":21},3,{"id":24,"depth":232,"text":25,"children":239},[240,241],{"id":28,"depth":237,"text":29},{"id":41,"depth":237,"text":42},{"id":61,"depth":232,"text":62,"children":243},[244,245],{"id":65,"depth":237,"text":66},{"id":102,"depth":237,"text":103},{"id":163,"depth":232,"text":164,"children":247},[248,249],{"id":167,"depth":237,"text":168},{"id":181,"depth":237,"text":182},{"id":206,"depth":232,"text":207},[252,253],"Deep_Learning","Basic","2026-08-06 00:00:00 +0900","개추","md",null,"\u002Fdeep_learning\u002Fbasic\u002F2026\u002F08\u002F06\u002FML_Pipeline2\u002F",{"layout":260},"post",true,"\u002Fposts\u002Fdeep_learning\u002Fbasic\u002F2026-08-06-ml_pipeline2",{"title":5,"description":255},"posts\u002FDeep_Learning\u002FBasic\u002F2026-08-06-ML_Pipeline2","개추.",[267,268],"Deep Learning","PipeLine","6Gw_nWfA9vcQmB3IY1KjqLZQA3Ucj0KDZu2n2k7y9-8",1788744788605]