[데이터분석] 부트캠프 TIL

20260406 TIL

myun0506 2026. 4. 6. 21:15

📝 TIL | 2026.04.06 (월)

오늘 학습한 내용

과목 3개 | Streamlit 심화, LLM 텍스트분석, 시스템환경


1. Streamlit 심화 — 레이아웃 & 멀티페이지 앱

핵심 개념

  • Session State — Streamlit은 위젯 동작마다 코드를 처음부터 끝까지 재실행하므로, 일반 변수는 매번 초기화된다. st.session_state를 사용하면 재실행에도 값이 유지되는 개별 사용자 독립 저장소를 활용할 수 있다.
  • Session State vs Cache Data — Session State는 개별 사용자 독립 데이터(새로고침 시 소멸), Cache Data(@st.cache_data)는 모든 사용자가 공유하는 데이터(새로고침에도 유지).
  • Form — 입력 위젯마다 코드가 재실행되는 문제를 해결. st.form() + st.form_submit_button()으로 Submit 버튼 클릭 시에만 1번 재실행하여 성능 최적화.

레이아웃 컴포넌트 정리

컴포넌트 용도

st.columns() 화면 가로 분할, 비율 지정 가능
st.tabs() 같은 자리에 다른 정보 표시(탭 전환)
st.container() 요소 논리적 그룹화, 높이 초과 시 스크롤
st.expander() 펼치기/접기, 덜 중요한 정보 숨김
st.empty() 자리 확보 후 동적 교체
st.space() 요소 사이 수직 간격 제어
st.dialog() 모달 팝업창

사이드바 & 필터링

  • label_visibility 파라미터로 위젯 레이블 표시 방식 제어 — "visible"(기본), "hidden"(공간 유지), "collapsed"(공간 제거)
  • 위젯에 key 설정 시 Streamlit이 자동으로 st.session_state에 값 저장. del st.session_state["key"] + st.rerun()으로 필터 초기화 구현.

멀티페이지 앱 핵심

  • st.Page() + st.navigation() 조합으로 멀티페이지 앱 구성
  • 페이지 간 상태 유지 규칙: 직접 선언한 Session State(st.session_state.xxx = 값)는 영구 유지 ✅ / 위젯 key로 생성된 Session State는 페이지 이동 시 자동 삭제 ❌
  • 해결: 임시 키(_ 접두사) + on_change 콜백으로 영구 키에 복사하는 3단계 패턴

성능 최적화

  • @st.cache_data — DataFrame, API 응답 캐싱 (복사본 반환, 안전)
  • @st.cache_resource — DB 연결, ML 모델 캐싱 (원본 공유, 메모리 효율)
  • @st.fragment — 전체 스크립트가 아닌 특정 영역만 부분 재실행하여 성능 향상

2. LLM 텍스트분석 — 구조화된 출력 실전 & 이미지(VLM) 처리

구조화된 출력(Structured Output) 복습

  • Pydantic BaseModel을 상속받아 응답 형식 스키마를 설계하는 방법
  • 중첩 구조(Nested Structure) — 메인 스키마 안에 하위 스키마를 list[]로 포함. 하나의 입력에서 여러 항목을 추출할 때 필수.
  • 범주형 데이터는 반드시 Literal로 지정 — str로 하면 응답이 부정확해질 수 있음
  • Output Validator — 여러 필드 간 논리적 관계 검증이 필요할 때 @agent.output_validator 설계

실습 내용

  1. 개인정보 마스킹 — 텍스트에서 이름, 전화번호, 이메일 등을 자동 탐지 + 규칙 기반 마스킹. 중첩 구조(PIIResult → list[PIIItem]) 활용.
  2. 설문조사 데이터 표준화 — 비정형 응답에서 인구통계정보 자동 추출 + 표준 범주 변환 + 품질 평가. Optional 필드와 나이 추정 처리 포함.
  3. 패션 이미지 분류 — VLM으로 상품 이미지에서 성별, 아이템 상세(카테고리/색상/패턴/소재), 전체 스타일, 계절 적합성 자동 추출.
  4. 영수증 OCR — 영수증 이미지에서 상점명, 상품 목록, 금액, 결제수단 등 정형화 추출.
  5. 쿠팡 선크림 리뷰 분석 — 층화 샘플링(StratifiedShuffleSplit)으로 비용 절감 + 측면별 감성 분석(ABSA)으로 품질/배송/가성비 등 각 측면 분리 평가.

VLM(Vision Language Model) 핵심

  • VLM = 텍스트 + 이미지를 함께 입력받아 처리하는 모델. 별도 OCR 모델 없이 하나의 모델에서 종합적 이해 가능.
  • Gemini가 이미지 처리에 강점 — Google의 풍부한 이미지/영상 데이터 기반
  • 공식 문서 권장: 이미지 먼저 → 텍스트 뒤에 순서로 입력, 선명한 이미지 사용, 올바른 회전

층화 샘플링 & ABSA

  • 층화 샘플링 — 원래 비율을 유지하면서 표본 추출 → 편향 방지 + 비용 절감
  • ABSA(Aspect-Based Sentiment Analysis) — 하나의 리뷰에서 측면별 다른 감정을 분리 분석. 기존 ML 감성분석의 한계("품질은 좋은데 배송이 느렸어요" → 긍정? 부정?)를 해결.

3. 시스템환경 — 대용량 데이터 다운로드

문제 상황

  • 구글 드라이브 폴더에서 대량 CSV 파일을 Python으로 다운로드해야 하는 상황

해결 과정 (단계별 진화)

  1. gdown 기초 — gdown.download_folder()로 폴더 전체 다운로드. download()와 반드시 구분!
  2. 에러 해결 — InvalidSchema(URL 오타), FileURLRetrievalError(Rate Limit) 대처. Traceback은 Bottom-up으로 읽기.
  3. 분할 정복 — 딕셔너리 + 반복문으로 설정과 로직 분리. try-except + time.sleep() + random.uniform()으로 에러 핸들링.
  4. Retry + 이어받기 — os.path.exists() 체크포인트 + 최대 3회 재시도 + error_log.txt 기록. "부분 성공" 함정 주의(하위 폴더 단위로 쪼개기).
  5. Google Drive API — 공식 API로 안정적 다운로드. 재귀 함수로 하위 폴더 자동 탐색. service.files().list(q=query) 쿼리 활용.
  6. OAuth 2.0 대안 — 조직 정책으로 서비스 계정 키 생성이 차단될 경우, pydrive2의 OAuth 인증으로 우회.

핵심 교훈

  • credentials.json, client_secrets.json 등 인증 파일은 절대 GitHub에 올리지 말 것 (.gitignore 필수)
  • 코드가 안 돌아갈 때 type(변수명) 찍어보기 — 리스트인지 딕셔너리인지 확인만으로 오류의 80%는 해결

오늘의 핵심 한 줄 요약

Streamlit 멀티페이지 앱의 상태 관리 패턴(임시 키 + on_change 콜백), LLM 구조화된 출력의 중첩 스키마 설계 + VLM 이미지 처리, 대용량 데이터 다운로드의 단계별 진화(gdown → API → OAuth) — 세 가지 축으로 실전 역량을 확장한 하루.

'[데이터분석] 부트캠프 TIL' 카테고리의 다른 글

20260403 TIL  (0) 2026.04.03
20260402 TIL  (0) 2026.04.02
20260401 TIL  (0) 2026.04.01
20260331 TIL  (0) 2026.03.31
20260330 TIL  (0) 2026.03.30