품질관리(QAQC) 데이터 부트캠프(본캠프)

본캠프_11주차(화)_TIL(Tableau, 시계열)

Wat_zy 2025. 11. 25. 08:57

✅ 오늘 한 것

시계열, Streamlit 라이브세션, Tableau 개인 과제


✏️ 오늘 배운 점

Tableau

Ctrl을 통하여 원하는 목록을 하나의 그룹으로 묶을 수 있다.

위와 같은 방식으로도 그룹화를 진행할 수 있다.

 

행 수준 계산 vs 집계 수준 계산

구분 행 수준 계산 집계 수준 계산
계산 시점 집계 전 집계 후
기준 데이터 개별 행(Row) 집계된 결과
용도 행별 파생 변수 생성 비율, 평균 비교, KPI 계산
예시 [매출] * 0.1 SUM([매출]) / SUM([전체매출])

 

행 수준 계산: 각 행마다 수익/매출을 계산하고 수익률을 합계한 상태로 값 표시

집계 수준 계산: 매출의 합과 수익의 합을 구하고, 수익률을 계산하여 집계된 값 표


시계열

잔차 분석: 회귀 분석에서 관측값과 회귀 모형의 예측값 사이의 차이인 '잔차(residual)'를 분석하여 회귀 모형의 가정이 잘 만족되는지 확인하는 절차

잔차가 백색소음인지 확인하는 방법

  1. ACF (자기상관함수)
    • 잔차의 자기상관이 없는지 확인하기 위한 도구 ACF 그래프에서 모든 시차에서 유의미한 상관관계가 없을 때, 잔차가 백색소음임을 의미
  2.  Ljung-Box Q 통계량:
    Ljung-Box 검정은 잔차들이 서로 상관되어 있는지 여부를 테스트
    • H0: 잔차들이 상관되지 않는다
    • H1: 잔차들이 상관이 있다.
from statsmodels.stats.diagnostic import acorr_ljungbox

# Ljung-Box test for white noise
lb_test = acorr_ljungbox(model_fit.resid, lags=[10], return_df=True)
print(lb_test)

 

모델 평가:

1. AIC: 모델의 복잡성(k)과 적합도(L)와 사이의 균형을 중시하며, 적합도가 더 높은 모델을 선호

2. BIC: 모델의 복잡성을 더 많이 고려하여 단순한 모델을 선호하며, 샘플 수가 클수록 더 엄격한 페널티를 부여

 

AIC와 BIC는 가장 낮은 값을 가진 모델을 선택하는 것이 원칙

 

Auto-ARIMA: ARIMA와 SARIMA 모델에서 사용되는 최적 차수(p, d, q, P, D, Q, s)를 자동으로 탐색해주는 도구

Auto-ARIMA는 pmdarima 패키지에서 제공하는 강력한 자동화 도구로, 최소 AIC(아카이케 정보 기준) 또는 BIC(베이즈 정보 기준) 값을 찾는 방식으로 최적 차수를 결정

  • Auto-ARIMA의 주요 기능
    1. p, d, q (비계절성 차수) 및 P, D, Q, s (계절성 차수)를 자동으로 선택
    2. AIC/BIC 기준으로 최적 모델 탐색
    3. 비계절적계절적 데이터를 모두 지원
    4. 수작업으로 차수 선택하는 번거로움을 줄여 시간 절약!
from pmdarima import auto_arima

# Auto-ARIMA 모형 적합
model = auto_arima(data, seasonal=True, m=12)  #월간 데이터(계절 주기)를 고려.
model.fit(data)
model.summary()

Streamlit

columns: 한 페이지 안에서 여러 개의 수직 열(Column)을 만들어 레이아웃을 구성

import streamlit as st

st.title("컬럼(Column) 예시")

# 페이지를 세 개의 세로 열로 나눕니다.
col1, col2, col3 = st.columns(3)

with col1:
   st.header("A cat")
   st.image("https://static.streamlit.io/examples/cat.jpg")

with col2:
   st.header("A dog")
   st.image("https://static.streamlit.io/examples/dog.jpg")

with col3:
   st.header("An owl")
   st.image("https://static.streamlit.io/examples/owl.jpg")

 

Expander: 접을 수 있는 UI 컴포넌트를 제공하여, 사용자에게는 핵심 내용만 보이게 하고 자세한 내용은 펼쳐볼 수 있도록 할 수 있습니다.

st.title("Expander 예시")

with st.expander("📺 요즘 OTT 플랫폼에서 뜨는 작품들"):
    st.write("""
    - **더 글로리**: 화제의 드라마, 역대급 복수극!
    - **피지컬: 100**: 서바이벌 예능 열풍!
    - **오징어 게임**: 전 세계를 휩쓴 한국형 데스게임!
    """)
    st.write("더 자세한 줄거리는 스포일러 방지를 위해 생략!")

with st.expander("⏰ 오늘의 소셜 미디어 소식"):
    st.write("""
    - 틱톡에서 난리 난 '#쿠쿠다스챌린지'
    - 인스타그램 릴스, 짧은 영상 편집 팁 공유하기
    - 재테크/절약 관련 '챌린지'도 인기 상승 중!
    """)

 

Taps: 페이지 내에서 탭을 생성하여 콘텐츠를 구분

# 세 개의 탭을 생성합니다.
tab1, tab2, tab3 = st.tabs(["Cat", "Dog", "Owl"])

with tab1:
   st.header("A cat")
   st.image("https://static.streamlit.io/examples/cat.jpg", width=200)

with tab2:
   st.header("A dog")
   st.image("https://static.streamlit.io/examples/dog.jpg", width=200)

with tab3:
   st.header("An owl")
   st.image("https://static.streamlit.io/examples/owl.jpg", width=200)

 

Sidebar: 페이지의 사이드바를 생성

# 사이드바를 생성하고, 라디오 버튼을 추가합니다.
with st.sidebar:
    add_radio = st.radio(
        "Choose a shipping method",
        ("Standard (5-15 days)", "Express (2-5 days)")
    )

 

Page: 한 페이지의 정보를 담는 객체

import streamlit as st

# home.py 파일을 페이지로 등록하고, 제목과 아이콘을 지정
st.Page(
    page="home.py",
    title="홈 화면",
    icon="🏠",
    default=True
)

 

navigation: 여러 st.Page를 리스트(목록)로 받아, 사이드바 메뉴(또는 상단 메뉴)를 자동으로 생성

import streamlit as st

# 1) 페이지 목록 만들기
pages = [
    st.Page("home.py", title="홈", icon="🏠", default=True),
    st.Page("production.py", title="생산 데이터", icon="🏭"),
    st.Page("quality.py", title="품질 관리", icon="🔍"),
    st.Page("maintenance.py", title="예지 보전", icon="🛠️"),
]

# 2) 사용자 선택
selected_page = st.navigation(pages)

# 3) 선택된 페이지 실행
selected_page.run()

 

session_state: 브라우저(사용자)마다 서로 다른 상태를 유지할 수 있게 해주는 ‘저장 공간’

import streamlit as st

st.title("버튼 클릭 횟수 (session_state 사용)")

# session_state에 count 키가 없으면 0으로 초기화
if "count" not in st.session_state:
    st.session_state.count = 0

if st.button("버튼을 눌러보세요!"):
    st.session_state.count += 1

st.write(f"버튼 클릭 횟수: {st.session_state.count}")

 

cache_data(or cache): 연산 결과(예: CSV 불러오기, 무거운 계산)를 저장해두었다가,같은 입력으로 다시 함수를 부르면 이미 계산해 둔 결과바로 가져오는 기능

import streamlit as st
import time

st.title("캐싱 사용 예제")

@st.cache_data
def expensive_computation(n):
    st.write(f"실제 계산 수행... (n={n})")
    time.sleep(3)  # 3초 대기 (연산 비용 시뮬레이션)
    return sum(i*i for i in range(n))

options = [1000, 3000, 5000]
n = st.selectbox("숫자를 선택하세요", options)

if st.button("Compute"):
    start = time.time()
    result = expensive_computation(n)
    elapsed = time.time() - start
    st.write(f"결과: {result}")
    st.write(f"소요 시간: {elapsed:.2f} 초")

st.info("같은 n을 다시 선택해 Compute를 누르면, 이미 계산한 결과를 캐시에서 즉시 반환합니다!")

📌추가로 해야 할 점

Tableau 개인 과제