터미널 창을 벗어나자, 클릭하는 웹 프로그램 만들기
지금까지 배운 Pandas, SQL, AI 기술을 하나로 모을 시간입니다.
HTML, CSS, 자바스크립트를 전혀 몰라도 Streamlit(스트림릿)을 사용하면 단 몇 줄의 파이썬 코드만으로 엑셀 업로드와 시각화 대시보드가 갖춰진 멋진 웹 애플리케이션을 완성할 수 있습니다.
왜 Streamlit(스트림릿)을 사용하는가?
파이썬으로 웹사이트를 만들려면 보통 Django나 Flask를 씁니다. 하지만 이 방식들은 백엔드와 프론트엔드(HTML/CSS)를 모두 배워야 하는 높은 진입장벽이 있습니다.
Streamlit은 오직 "데이터 분석가"를 위해 탄생한 프레임워크입니다. 파이썬 코드만으로 버튼, 표, 그래프를 순식간에 찍어냅니다.
회계자료(transactions.xlsx)를 드래그하거나 클릭하여 업로드하세요.
기본 화면 구성 및 사이드바 (app.py)
가장 먼저 pip install streamlit 으로 모듈을 설치한 뒤, app.py를 작성합니다.
import streamlit as st # 1. 페이지 타이틀 st.title("AI 회계자료 분석 시스템") # 2. 좌측 메뉴 (사이드바) st.sidebar.title("메뉴") menu = st.sidebar.selectbox( "분석 메뉴를 선택하세요", ["대시보드", "이상거래 검출", "AI 분석 챗봇"] ) st.write(f"현재 선택된 메뉴: {menu}")
터미널에서 streamlit run app.py 라고 입력하면 즉시 브라우저가 열리며 웹사이트가 나타납니다. 코드 수정 후 저장하면 화면이 바로바로 새로고침 됩니다.
엑셀 파일 업로드 기능 구현
회계업무 자동화 웹의 심장입니다. 사용자가 엑셀 파일을 업로드하면 곧바로 pandas DataFrame으로 변환합니다.
import pandas as pd # 파일 업로드 위젯 uploaded_file = st.file_uploader("회계자료 Excel 파일을 업로드하세요", type=["xlsx", "csv"]) if uploaded_file is not None: # 업로드된 파일을 Pandas로 읽기 df = pd.read_excel(uploaded_file) # 성공 알림 및 데이터 미리보기 표출 st.success("파일이 성공적으로 로드되었습니다!") st.dataframe(df, use_container_width=True)
핵심 지표(KPI) 패널과 그래프 표시
st.columns() 를 활용하면 화면을 여러 칸으로 분할할 수 있습니다. st.metric() 은 숫자를 아주 크고 예쁘게 보여주는 기능입니다.
if uploaded_file is not None: # 화면을 3열로 쪼개기 col1, col2, col3 = st.columns(3) col1.metric("총 거래건수", f"{len(df):,}건") col2.metric("총 거래처 수", f"{df['거래처'].nunique():,}곳") col3.metric("총 거래금액", f"{df['금액'].sum():,.0f}원") # 매출 상위 10개 거래처 차트 st.subheader("📈 거래처별 매출 현황") top10 = df.groupby("거래처")["금액"].sum().sort_values(ascending=False).head(10) st.bar_chart(top10)
실무를 위한 프로그램 구조화(모듈 분리)
1~16단계까지 배운 Z-score, AI 챗봇 등의 코드를 모두 app.py 파일 하나에 다 때려 넣으면 코드가 천 줄이 넘어가 관리가 불가능해집니다.
역할별로 파일을 쪼개고(Import) 조립하는 것이 프로그래밍의 정석입니다.
app.py : 웹 화면(버튼, 레이아웃)만 담당
analysis.py : Z-score, Pandas 데이터프레임 계산만 담당
ai_bot.py : Ollama 프롬프트 및 API 호출만 담당
database.py : SQL 쿼리 및 DB 연동만 담당
17단계 최종: 대시보드 마스터 코드
업로드부터 Z-score 검출 결과물 다운로드까지 원스톱으로 처리하는 웹 프로그램입니다.
import streamlit as st import pandas as pd import io # from analysis import calc_zscore # 실무에선 함수를 분리하여 불러옴 st.set_page_config(page_title="회계 비서 AI", layout="wide") st.title("🤖 AI 회계자료 분석 시스템") # 사이드바 menu = st.sidebar.selectbox("메뉴", ["1. 자료 업로드 및 대시보드", "2. 통계 기반 이상거래"]) # [공통] 파일 업로더 file = st.sidebar.file_uploader("엑셀 파일 첨부", type=["xlsx"]) if file: df = pd.read_excel(file) if menu == "1. 자료 업로드 및 대시보드": st.subheader("📊 종합 대시보드") c1, c2, c3 = st.columns(3) c1.metric("거래건수", f"{len(df):,}건") c2.metric("거래처수", f"{df['거래처'].nunique():,}곳") c3.metric("총금액", f"{df['금액'].sum():,.0f}원") st.dataframe(df.head(100), use_container_width=True) elif menu == "2. 통계 기반 이상거래": st.subheader("🚨 Z-score 기반 이상거래 검출") # 로직 계산 (14단계) mean_v = df["금액"].mean() std_v = df["금액"].std() df["Z_score"] = (df["금액"] - mean_v) / std_v outliers = df[df["Z_score"].abs() >= 3].sort_values("Z_score", ascending=False) st.warning(f"Z-score 절대값 3을 초과하는 이상거래가 {len(outliers)}건 발견되었습니다.") st.dataframe(outliers, use_container_width=True) # 엑셀 다운로드 버튼 제공 buffer = io.BytesIO() with pd.ExcelWriter(buffer, engine="openpyxl") as writer: outliers.to_excel(writer, index=False) st.download_button( label="📥 이상거래 리포트 다운로드", data=buffer.getvalue(), file_name="AI_이상거래보고서.xlsx", mime="application/vnd.ms-excel" ) else: st.info("좌측 메뉴에서 엑셀 파일을 업로드 해주세요.")
이번 17단계까지는 우리가 "정해진 완벽한 엑셀(날짜, 거래처, 금액 포맷이 예쁘게 맞춰진)"을 올린다는 전제하에 작동했습니다.
하지만 실무에서는 거래처마다 엑셀 양식이 다릅니다. 어떤 파일은 "공급가액", 어떤 파일은 "금액", 어떤 건 숫자에 콤마(,)가 들어있어 에러를 냅니다.
다음 18단계에서는 서로 다른 양식의 엑셀 파일을 업로드해도, 파이썬이 스스로 분석하여 하나의 완벽한 표준 데이터 구조로 자동 매핑 및 변환해주는 실무 최적화 모듈을 구현해 봅니다!