15.Python Streamlit으로 데이터 대시보드 만들기 — 코드 몇 줄로 웹앱 완성
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 대시보드 구축 체크리스트
- 설치:
pip install streamlit plotly - 실행:
streamlit run app.py(일반 python 명령어 사용 불가) - 레이아웃:
st.sidebar,st.columns()으로 구조를 잡습니다 - 데이터 표시:
st.dataframe(),st.metric()으로 수치를 보여줍니다 - 차트: 빠른 시각화는 기본
st.line_chart(), 인터랙티브는plotly연동 - 성능 최적화: 데이터 로드 함수에
@st.cache_data데코레이터를 붙입니다 - 공유:
streamlit run으로 로컬 실행, 외부 공유는 Streamlit Community Cloud 활용
다음으로 알아두면 좋은 것
로컬에서 대시보드를 완성했다면, 다음 단계는 외부에 배포해서 링크로 공유하는 것입니다. Streamlit Community Cloud(share.streamlit.io)는 GitHub 저장소와 연동해 무료로 배포할 수 있습니다. 코드를 GitHub에 올리고 사이트에서 연결만 하면 몇 분 안에 누구나 접속 가능한 웹 앱이 완성됩니다. Flask나 Django 같은 백엔드 지식이 전혀 없어도 됩니다.
댓글
댓글 쓰기