15.Python Streamlit으로 데이터 대시보드 만들기 — 코드 몇 줄로 웹앱 완성

기존에는 데이터 분석 프로세스가 끝나면 결과를 공유하기 위해 static한 보고서나 엑셀 파일을 매번 수동으로 배포해야 했습니다. 데이터가 업데이트될 때마다 보고서를 재작성해야 하는 비효율을 개선하고자, 파이썬 기반의 웹 대시보드 툴인 Streamlit을 도입했습니다. 복잡한 프론트엔드 지식 없이도 분석 결과물을 직관적인 웹 대시보드로 시각화할 수 있었고, 결과적으로 팀원들에게 단 하나의 URL 링크만으로 실시간 데이터를 공유하는 파이프라인을 구축해 협업 효율을 극대화할 수 있었습니다.
이 글에서는 Streamlit이 무엇인지, 설치와 기본 구조, 핵심 UI 컴포넌트 사용법, pandas·plotly와 연동한 데이터 시각화, 그리고 실전 대시보드 예제까지 — VS Code 환경에서 단계별로 안내해 드리겠습니다.

Streamlit이란 무엇인가 — 파워포인트 대신 살아있는 웹앱

데이터 분석 결과를 보여주는 방법은 크게 세 가지입니다. 엑셀 파일로 공유하거나, 파워포인트로 정리하거나, 아니면 실시간으로 업데이트되는 웹 대시보드를 만드는 것입니다.

세 번째 방법이 가장 이상적이지만, 웹 개발 지식 없이는 엄두를 내기 어렵습니다. HTML, CSS, JavaScript, 백엔드 서버까지 만들어야 하기 때문입니다. Streamlit은 이 진입 장벽을 완전히 없애줍니다.

Python 코드만으로 버튼, 슬라이더, 차트, 표가 포함된 인터랙티브 웹 앱을 만들 수 있습니다. 마치 파워포인트 슬라이드를 만들듯 st.title(), st.chart() 같은 함수를 순서대로 쌓아 올리면, 그것이 곧 완성된 웹 페이지가 됩니다.

Streamlit이 특히 강력한 이유

  • 웹 지식이 전혀 없어도 됩니다 — HTML, CSS, JavaScript 불필요
  • 코드가 곧 UI입니다 — 위에서 아래로 쌓는 구조로 직관적입니다
  • 실시간 반응형입니다 — 슬라이더나 선택 박스를 조작하면 차트가 즉시 업데이트됩니다
  • 공유가 간단합니다 — Streamlit Community Cloud에 올리면 링크 하나로 누구나 접속 가능합니다
  • pandas, plotly와 궁합이 완벽합니다 — 이전 시리즈에서 배운 내용을 그대로 활용할 수 있습니다

Streamlit 설치 및 첫 실행

설치하기

가상환경이 활성화된 상태에서 설치합니다.

pip install streamlit

설치 확인 및 데모 실행

streamlit hello

이 명령어를 실행하면 브라우저가 자동으로 열리면서 Streamlit 공식 데모 앱이 실행됩니다. 설치가 정상적으로 완료된 것을 확인할 수 있습니다.



앱 실행 방법

Streamlit 앱은 일반 Python 파일처럼 python app.py로 실행하지 않습니다. 반드시 아래 명령어를 사용합니다.

streamlit run app.py

실행하면 터미널에 로컬 주소(http://localhost:8501)가 표시되고, 브라우저에서 자동으로 열립니다. 코드를 저장할 때마다 브라우저가 자동으로 새로고침됩니다.


핵심 UI 컴포넌트 — 자주 쓰는 기능 모음

텍스트 출력

import streamlit as st

st.title("월별 매출 대시보드")           # 가장 큰 제목
st.header("2024년 상반기 현황")          # 섹션 제목
st.subheader("팀별 실적 비교")           # 소제목
st.text("일반 텍스트입니다.")            # 고정폭 텍스트
st.markdown("**굵게**, *기울여*, `코드`") # 마크다운 지원
st.write("가장 범용적인 출력 함수입니다. 텍스트, 표, 차트 모두 처리합니다.")

입력 위젯 — 사용자와 상호작용하기

# 텍스트 입력
name = st.text_input("이름을 입력하세요")

# 숫자 슬라이더
year = st.slider("연도 선택", min_value=2020, max_value=2024, value=2024)

# 드롭다운 선택
department = st.selectbox("부서 선택", ["전체", "개발팀", "디자인팀", "기획팀"])

# 멀티 선택
metrics = st.multiselect("지표 선택", ["매출", "비용", "이익", "고객수"])

# 버튼
if st.button("조회"):
    st.success(f"{year}년 {department} 데이터를 불러옵니다.")

# 체크박스
show_raw = st.checkbox("원본 데이터 표시")



레이아웃 — 컬럼과 사이드바

# 사이드바에 필터 배치
with st.sidebar:
    st.header("필터 설정")
    selected_year = st.selectbox("연도", [2022, 2023, 2024])
    selected_dept = st.multiselect("부서", ["개발", "디자인", "기획"])

# 메인 영역을 2개 컬럼으로 분할
col1, col2 = st.columns(2)

with col1:
    st.metric("총 매출", "₩ 45,200,000", "+12.3%")

with col2:
    st.metric("목표 달성률", "87%", "-3%")

pandas 데이터를 Streamlit으로 시각화하기

이전 CSV/엑셀 편에서 배운 pandas와 Streamlit을 결합하면 강력한 데이터 대시보드를 만들 수 있습니다.

데이터프레임 표시하기

import streamlit as st
import pandas as pd

st.title("매출 현황 대시보드")

# 데이터 로드
df = pd.read_csv("sales.csv", encoding="utf-8-sig")

# 표 형태로 출력
st.dataframe(df, use_container_width=True)

# 정적 테이블 (정렬 불가, 간단한 표시용)
st.table(df.head(5))

기본 차트 그리기

Streamlit에는 별도 라이브러리 없이 쓸 수 있는 기본 차트 함수들이 있습니다.

import streamlit as st
import pandas as pd
import numpy as np

# 샘플 데이터 생성
df = pd.DataFrame({
    "월": ["1월", "2월", "3월", "4월", "5월", "6월"],
    "매출": [12500000, 13200000, 11800000, 14500000, 15200000, 16100000],
    "비용": [8200000, 8700000, 7900000, 9100000, 9500000, 9800000],
})

st.line_chart(df.set_index("월")[["매출", "비용"]])  # 선 그래프
st.bar_chart(df.set_index("월")["매출"])              # 막대 그래프




plotly 연동 — 인터랙티브 차트 만들기

기본 차트보다 더 화려하고 인터랙티브한 시각화가 필요하다면 plotly를 함께 사용합니다.

pip install plotly
import streamlit as st
import pandas as pd
import plotly.express as px

df = pd.DataFrame({
    "담당자": ["김현욱", "이하늘", "박지수", "최민준"],
    "매출": [45200000, 38700000, 52100000, 41300000],
    "부서": ["개발팀", "디자인팀", "개발팀", "기획팀"],
})

# 막대 차트
fig_bar = px.bar(
    df,
    x="담당자",
    y="매출",
    color="부서",
    title="담당자별 매출 현황",
    text_auto=True
)
st.plotly_chart(fig_bar, use_container_width=True)

# 파이 차트
fig_pie = px.pie(
    df,
    names="부서",
    values="매출",
    title="부서별 매출 비중"
)
st.plotly_chart(fig_pie, use_container_width=True)




실전 예제 — 매출 분석 대시보드 완성본

지금까지 배운 내용을 모두 조합해 실제로 쓸 수 있는 대시보드를 만들어 보겠습니다.

import streamlit as st
import pandas as pd
import plotly.express as px

# 페이지 기본 설정
st.set_page_config(
    page_title="매출 분석 대시보드",
    page_icon="📊",
    layout="wide"
)

# 데이터 로드 (캐싱으로 성능 최적화)
@st.cache_data
def load_data():
    return pd.DataFrame({
        "월": ["1월", "2월", "3월", "4월", "5월", "6월"] * 3,
        "부서": ["개발팀"] * 6 + ["디자인팀"] * 6 + ["기획팀"] * 6,
        "매출": [
            12500000, 13200000, 11800000, 14500000, 15200000, 16100000,
            8200000,  8700000,  7900000,  9100000,  9500000,  9800000,
            6100000,  6800000,  5900000,  7200000,  7500000,  8000000,
        ]
    })

df = load_data()

# 사이드바 필터
st.sidebar.title("🔍 필터")
selected_dept = st.sidebar.multiselect(
    "부서 선택",
    options=df["부서"].unique(),
    default=df["부서"].unique()
)

# 필터 적용
filtered_df = df[df["부서"].isin(selected_dept)]

# 헤더
st.title("📊 상반기 매출 분석 대시보드")
st.markdown("---")

# KPI 카드
total = filtered_df["매출"].sum()
avg = filtered_df["매출"].mean()
max_val = filtered_df["매출"].max()

col1, col2, col3 = st.columns(3)
col1.metric("총 매출", f"₩{total:,.0f}")
col2.metric("월평균 매출", f"₩{avg:,.0f}")
col3.metric("최고 월 매출", f"₩{max_val:,.0f}")

st.markdown("---")

# 차트 영역
col_left, col_right = st.columns(2)

with col_left:
    fig = px.line(
        filtered_df,
        x="월", y="매출",
        color="부서",
        title="월별 매출 추이",
        markers=True
    )
    st.plotly_chart(fig, use_container_width=True)

with col_right:
    dept_sum = filtered_df.groupby("부서")["매출"].sum().reset_index()
    fig2 = px.pie(dept_sum, names="부서", values="매출", title="부서별 매출 비중")
    st.plotly_chart(fig2, use_container_width=True)

# 원본 데이터 토글
if st.checkbox("원본 데이터 보기"):
    st.dataframe(filtered_df, use_container_width=True)



💡 @st.cache_data: 데이터 로드 함수에 이 데코레이터를 붙이면 처음 한 번만 실행되고 결과를 캐싱합니다. 사용자가 슬라이더를 움직일 때마다 데이터를 새로 읽지 않아 앱 속도가 크게 향상됩니다.


자주 발생하는 오류와 해결법

오류 1 — streamlit 명령어가 인식되지 않는 경우

원인: 가상환경이 활성화되지 않은 상태에서 실행
해결: 가상환경 활성화 후 재실행. 또는 python -m streamlit run app.py 형식으로 실행

오류 2 — 차트가 업데이트되지 않고 전체 페이지가 깜빡이는 경우

원인: Streamlit의 기본 동작으로, 위젯 조작 시 전체 스크립트를 재실행
해결: @st.cache_data로 데이터 로딩을 캐싱하고, st.session_state로 상태 관리

오류 3 — 한글 폰트가 깨져서 plotly 차트에 표시되는 경우

원인: plotly 기본 폰트가 한글을 지원하지 않음
해결: 폰트 직접 지정

fig.update_layout(font=dict(family="Malgun Gothic"))  # Windows
fig.update_layout(font=dict(family="AppleGothic"))    # macOS

마무리 — 핵심 요약

✅ Streamlit 대시보드 구축 체크리스트

  1. 설치: pip install streamlit plotly
  2. 실행: streamlit run app.py (일반 python 명령어 사용 불가)
  3. 레이아웃: st.sidebar, st.columns()으로 구조를 잡습니다
  4. 데이터 표시: st.dataframe(), st.metric()으로 수치를 보여줍니다
  5. 차트: 빠른 시각화는 기본 st.line_chart(), 인터랙티브는 plotly 연동
  6. 성능 최적화: 데이터 로드 함수에 @st.cache_data 데코레이터를 붙입니다
  7. 공유: streamlit run으로 로컬 실행, 외부 공유는 Streamlit Community Cloud 활용

다음으로 알아두면 좋은 것

로컬에서 대시보드를 완성했다면, 다음 단계는 외부에 배포해서 링크로 공유하는 것입니다. Streamlit Community Cloud(share.streamlit.io)는 GitHub 저장소와 연동해 무료로 배포할 수 있습니다. 코드를 GitHub에 올리고 사이트에서 연결만 하면 몇 분 안에 누구나 접속 가능한 웹 앱이 완성됩니다. Flask나 Django 같은 백엔드 지식이 전혀 없어도 됩니다.




댓글

이 블로그의 인기 게시물

1.Python 설치부터 실행까지 10분 만에 끝내기 — 초보자도 바로 따라 하는 완벽 가이드

30.Python pyautogui로 마우스와 키보드 자동화하기: VSCode 실전 가이드

29.Python subprocess로 외부 명령어 실행하기: VSCode 실전 활용법