데이터 분석/데이터 시각화
streamlit
fullfish
2025. 10. 29. 17:10
Python 코드만으로 웹 대시보드나 웹앱을 간단하게 제작 할 수 있는 프레임워크
import streamlit as st
st.title("Streamlit 입문")
st.header("Streamlit의 기본 구조")
st.write("Streamlit은 스크립트 전체 재실행 기반의 웹앱 프레임워크 입니다.")
스크립트 구조: 위에서 아래로 한 번 실행
사용자 이벤트 발생 시: 전체 스크립트 재실행
웹서버 실행
▪ streamlit run app.py

st.title() 페이지 제목
st.header() / st.subheader() 섹션 제목
st.write() 텍스트, 수치, 데이터, Markdown 자동 인식
st.markdown() Markdown 직접 렌더링
st.code() 코드 블록 표시
st.caption() 설명 문구 (작은 글씨)
st.latex() 수식 출력
st.line_chart(df) 선형 그래프
st.bar_chart(df) 막대 그래프
st.area_chart(df) 영역 그래프
import streamlit as st
import pandas as pd
st.title("Streamlit 기본 출력 예제")
st.header("텍스트 출력")
st.write("`st.write()`는 다양한 자료형을 자동으로 인식합니다.")
st.text("이건 단순 텍스트")
st.subheader("Markdown 예시")
st.markdown("""
- **굵게**
- _기울임_
- [공식문서](https://docs.streamlit.io)
""")

import streamlit as st
import pandas as pd
st.header("데이터 출력")
df = pd.DataFrame({"이름": ["철수", "영희", "민수"], "점수": [80, 95, 88]})
st.dataframe(df)
st.table(df)
st.caption("출처: 예시 데이터셋")
import streamlit as st
import pandas as pd
st.title("기본 시각화 함수")
month = ["3월", "4월", "5월", "6월"]
df = pd.DataFrame({"영어": [80, 90, 100, 95], "수학": [60, 70, 85, 100]}, index=month)
st.line_chart(df)
st.bar_chart(df)
st.area_chart(df)


import streamlit as st
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
st.title("Matplotlib & Seaborn 예제")
df = sns.load_dataset("tips")
fig, ax = plt.subplots()
sns.scatterplot(x="total_bill", y="tip", hue="sex", data=df, ax=ax)
st.pyplot(fig)
import streamlit as st
import pandas as pd
import numpy as np
st.title("지도 시각화 예제")
df = pd.DataFrame(
{
"lat": np.random.uniform(37.4, 37.6, 100),
"lon": np.random.uniform(126.8, 127.1, 100),
}
)
st.map(df)


입력 위젯
st.button("버튼") bool 클릭 시 True
st.checkbox("체크") bool 체크 여부
st.radio() str 단일 선택
st.selectbox() str 드롭다운 선택
st.slider() int/float 값 선택
st.text_input() str 텍스트 입력
st.number_input() int/float 수치 입력
st.file_uploader() BytesIO 파일 업로드
import streamlit as st
st.title(" 입력 위젯 예제")
name = st.text_input("이름을 입력하세요")
age = st.number_input("나이 입력", min_value=1,
max_value=100)
color = st.color_picker("좋아하는 색상 선택")
agree = st.checkbox("개인정보 제공에 동의합니다")
if st.button("제출"):
if agree:
st.success(f"{name}님({age}세)의 좋아하는 색상은 {color}입니
다.")
else:
st.warning("동의하지 않으면 제출할 수 없습니다.")
import streamlit as st
st.title("Form 활용 예제")
with st.form("survey_form"):
name = st.text_input("이름")
gender = st.radio("성별", ["남성", "여성"])
score = st.slider("만족도", 0, 10, 5)
submitted = st.form_submit_button("제출")
if submitted:
st.success(f"{name}({gender})님의 만족도: {score}/10")


import streamlit as st
st.sidebar.title("설정 메뉴")
option = st.sidebar.selectbox("과목 선택", ["영어", "수학", "과학"])
level = st.sidebar.slider("난이도", 1, 10, 5)
st.title("사이드바 실습")
st.write(f"선택한 과목: {option}")
st.write(f"난이도: {level}")
st.title(" Layout 예제")
col1, col2 = st.columns(2)
with col1:
st.subheader("왼쪽")
st.write("왼쪽 컬럼 내용")
with col2:
st.subheader("오른쪽")
st.write("오른쪽 컬럼 내용")
tab1, tab2 = st.tabs(["차트", "표"])
with tab1:
st.line_chart({"A": [1,2,3], "B": [3,2,1]})
with tab2:
st.table({"이름": ["철수", "영희"], "점수": [80, 90]})


csv파일 보는 예제
# 더미 csv 파일 생성
from altair.utils.core import P
import pandas as pd
import numpy as np
name = [
"홍창기",
"신민재",
"오스틴",
"김현수",
"문보경",
"오지환",
"박동원",
"박해민",
"구본혁",
]
subjects = ["C++", "Java", "Python", "JavaScript"]
scores = [np.random.randint(90, 100, 4).tolist() for _ in range(len(name))]
print(scores)
df = pd.DataFrame(scores, columns=subjects)
# df=['stu_nmae']=name
print(df)
df.insert(0, "stu_name", name)
print(df)
df.to_csv("score.csv", index=False)
'''
stu_name,C++,Java,Python,JavaScript
홍창기,90,97,98,94
신민재,97,99,92,90
오스틴,93,95,93,98
김현수,94,90,96,98
문보경,95,97,93,95
오지환,91,97,95,90
박동원,97,98,96,99
박해민,90,93,96,93
구본혁,90,90,95,98
'''
import streamlit as st
import pandas as pd
st.title("학생 점수 분석 대시보드")
uploaded = st.file_uploader("CSV 파일 업로드", type=["csv"])
if uploaded:
df = pd.read_csv(uploaded)
st.subheader(" 데이터 미리보기")
st.dataframe(df.head())
subjects = df.columns[1:]
subject = st.selectbox("과목 선택", subjects)
st.line_chart(df[subject])
min_score = st.slider("최소 점수", 0, 100, 50)
filtered = df[df[subject] >= min_score]
st.write(f"{subject} {min_score}점 이상 학생:")
st.table(filtered)
with st.form("feedback_form"):
name = st.text_input("이름")
feedback = st.text_area("피드백")
submit = st.form_submit_button("저장")
if submit:
st.success(f"{name}님의 피드백이 저장되었습니다.")
else:
st.info("CSV 파일을 업로드해주세요 (예: name, english, math, science)")
