Rookies 12일차: Python 데이터(numpy, pandas etc) 5
☀️공지 사항☀️ 해당 게시글은 SK 쉴더스 루키즈, 생성형AI 활용 사이버보안 전문인력 양성과정 을 수업을 듣고 정리한 글입니다. 자세한 교육 정보는 SK 쉴더스 홈페이지 를 확인해주세요.
# 학습 내용 요약 (25/11/07)
본 자료는 Streamlit을 활용하여 관리자 대시보드를 구축하는 과정과, 이를 위한 파이썬 웹 시각화 환경 설정 및 주요 기능을 요약한 것입니다.
1. Streamlit 환경 설정 및 기본 구조
1.1. 서버 기동 및 실행 (보충)
Streamlit으로 구축된 웹 애플리케이션은 일반 파이썬 파일처럼 실행되지 않고, 전용 명령어를 사용하여 서버를 기동해야 합니다.
- 서버 기동 명령어:
streamlit run app.py # app.py 파일 실행 예시 - 팁: 코드 수정 후 저장(Ctrl+S)하고 웹 브라우저에서 새로고침(F5)하면 변경 사항이 즉시 반영됩니다.
- 서버 종료: 터미널에서
Ctrl+C를 눌러 서버를 종료합니다.
1.2. 라이브러리 임포트
관리자 대시보드 구축을 위해 Streamlit과 데이터 처리 및 시각화 관련 라이브러리를 임포트합니다.
예시 코드 (라이브러리 임포트):
import streamlit as st
import numpy as np
import pandas as pd
import plotly.express as px
# 지도 시각화를 위해 pydeck 설치도 권장됨
| 라이브러리 | 설명 |
|---|---|
| streamlit (st) | 웹 애플리케이션을 쉽고 빠르게 구축하는 도구입니다. |
| pandas (pd) | 데이터 분석 및 조작을 위한 라이브러리입니다. |
| plotly.express (px) | 대화형 시각화 도구를 제공합니다. |
| numpy (np) | 수치 계산을 위한 라이브러리입니다. |
1.3. Streamlit 출력 함수 및 위젯 (보충)
Streamlit은 데이터뿐만 아니라 다양한 웹 요소를 출력하고 사용자 인터랙션을 제공하는 함수를 지원합니다.
| 기능 | 함수 | 설명 |
|---|---|---|
| 제목/헤더 | st.title(), st.header(), st.subheader() |
페이지 제목, 헤더, 서브헤더를 정의합니다. |
| DataFrame 출력 | st.dataframe(data) |
동적이고 인터랙티브한 DataFrame을 출력합니다. |
| 정적 테이블 | st.table(data) (보충) |
정적인 프레임 형태로 데이터를 출력합니다. |
| 텍스트 출력 | st.write(body) |
텍스트나 정적인 요소를 출력합니다. |
| 마크다운 지원 | st.markdown(body) (보충) |
마크다운 구문을 사용하여 텍스트를 포맷팅합니다. |
| 성공 메시지 | st.success(body) |
성공 메시지를 표시합니다. |
| JSON 출력 | st.json(data) (보충) |
Key-Value 형태의 JSON 데이터를 시각화하여 출력합니다. |
| 미디어 출력 | st.video(path) (보충) |
비디오, 이미지, 오디오 등 미디어 파일을 출력합니다. |
| 사용자 입력 | st.slider(label, min, max, default) (보충) |
슬라이더 위젯 등 다양한 입력 위젯을 사용하여 실시간 사용자 입력을 처리합니다. |
2. 관리자 대시보드 구축 과정 (Streamlit)
2.1. 대시보드 제목 및 파일 업로드
대시보드의 제목을 설정하고, 사용자로부터 CSV 파일을 업로드 받습니다.
예시 코드 (제목 및 파일 업로드):
st.title('관리자 대시보드') # 대시보드 제목 설정
file = st.file_uploader('CSV 파일 업로드: ', type=['csv'])
if file is not None:
rawData = pd.read_csv(file)
st.success(f'{file.name} 업로드 성공')
2.2. 사이드바 필터 설정
사용자가 데이터를 선택적으로 분석할 수 있도록 사이드바에 필터 위젯을 배치합니다.
st.sidebar: 사이드바 영역을 지정합니다.st.sidebar.multiselect(label, options): 다중 선택 옵션을 제공합니다. 옵션으로는 데이터프레임 컬럼의 고유값(unique())을 사용합니다.
예시 코드 (사이드바 필터):
st.sidebar.header('필터 설정')
countryFilter = st.sidebar.multiselect('국가 선택 : ', rawData['country'].unique())
attackFilter = st.sidebar.multiselect('공격 타입 : ', rawData['attack_type'].unique())
2.3. 데이터 프레임 출력
업로드된 데이터의 형태를 확인하기 위해 DataFrame의 일부를 화면에 표시합니다.
예시 코드 (DataFrame 출력):
st.write("프레임 데이터출력을 도와주는 : dataframe() ")
st.dataframe(rawData.head())
2.4. 데이터 필터링 및 추출
사이드바에서 선택된 값(countryFilter, attackFilter)을 기준으로 원본 데이터(rawData)를 필터링하여 시각화에 사용할 데이터(filterData)를 생성합니다.
- 핵심 원리: Pandas의
.isin()함수를 사용하여 해당 컬럼 값이 필터 리스트에 포함되는지 확인합니다. 여러 필터 조건은 AND 조건(&)으로 결합됩니다.
예시 코드 (필터링된 데이터 생성):
# isin()과 & (AND) 연산자를 사용하여 복합 조건 필터링
filterData = rawData[ (rawData['country'].isin(countryFilter)) & (rawData['attack_type'].isin(attackFilter)) ]
3. 데이터 시각화 (Plotly)
Plotly Express로 생성된 figure 객체는 st.plotly_chart(fig) 함수를 통해 Streamlit 웹 페이지에 대화형 차트 형태로 표시됩니다.
3.1. 시간대별 공격 발생 추이 (Line Chart)
예시 코드 (Line Chart):
st.subheader('시간대별 공격 발생 추이 - line chart')
fig01 = px.line(filterData, x='time', color='attack_type')
st.plotly_chart(fig01)
3.2. 국가별 공격 비율 (Pie Chart)
예시 코드 (Pie Chart):
st.subheader('국가별 공격 비율 - pie chart')
fig02 = px.pie(filterData, names='country')
st.plotly_chart(fig02)
3.3. 공격 타입별 성공/실패 비율 (Bar Chart)
barmode='group' 옵션은 막대 그래프를 그룹화하여 표시합니다.
예시 코드 (Bar Chart):
st.subheader('공격 타입별 성공/실패 비율 - bar chart')
fig03 = px.bar(filterData, x='attack_type', title="공격 유형별 상태", color='status', barmode='group')
st.plotly_chart(fig03)
4. 기타 시각화 및 분석 도구 (보충)
4.1. Plotly 상세 기능 및 레이아웃 설정
Plotly는 대화형 시각화를 위해 다양한 레이아웃 및 스타일 설정을 지원합니다.
px.bar()주요 매개변수:data_frame,x,y: 시각화할 데이터프레임과 축 지정.color: 데이터의 색상을 나타내는 열 지정.barmode: 막대 그래프 표시 방식 설정 ('group'또는'relative'(누적)).
- 색상 설정 (Color Scale):
colorscale: 값의 변화에 따른 색상 스케일을 정의합니다.colorway: 그래프에 사용될 색상 순서(팔레트)를 정의합니다.
4.2. 지도 시각화: Folium (보충)
Folium 라이브러리는 Python 환경에서 Leaflet.js를 기반으로 하는 대화형 지도 시각화를 지원합니다.
- 기본 지도 생성:
g.Map(location=[위도, 경도], zoom_start=확대레벨) - 마커 추가:
g.Marker([위도, 경도], popup='이름').add_to(map) - Leaflet.js 기반 동작: Folium 코드는 내부적으로 Leaflet JavaScript 코드를 생성하며,
L.marker,L.popup,bindPopup()등의 개념을 사용하여 마커를 지도에 추가하고 팝업을 연결합니다.
공부 후기
본 학습을 통해 Streamlit을 사용하여 웹 기반의 관리자 대시보드를 파이썬 코드만으로 신속하게 구축하는 방법을 익혔습니다. 특히, Streamlit의 st.file_uploader, st.sidebar.multiselect와 Pandas의 효율적인 필터링(특히 .isin()과 & 연산)` 기법을 결합하여 동적인 데이터 분석 환경을 마련하는 것이 중요하다고 생각합니다.
또한, Plotly Express를 활용하여 라인, 파이, 막대 차트 등 다양한 형태의 대화형 시각화 결과를 웹에 쉽게 임베드할 수 있음을 확인했습니다. 웹 시각화 구현 시 streamlit run 명령어를 통한 서버 기동이 필수적임을 인지하고, 코드 수정 후 브라우저 새로고침만으로 즉시 반영되는 점이 개발 효율을 높여줄 것이라고 판단됩니다. 단순한 시각화를 넘어, 데이터를 효율적으로 분석하고 인사이트를 도출하는 역량을 키우는 데 집중해야겠습니다.
댓글 남기기