데이터 과학 및 머신 러닝 영역에서 웹 애플리케이션을 생성하기 위한 Python 플랫폼인 Streamlit은 특히 프런트엔드 프로그래밍에 대한 광범위한 숙련도가 부족한 개인을 대상으로 합니다. 사용자 친화적인 디자인으로 최소한의 코딩 작업으로 고도의 인터랙티브 웹 인터페이스를 구축할 수 있습니다.

Streamlit의 디자인 철학은 데이터 분석의 복잡한 기술에 대한 액세스를 단순화하는 직관적인 인터페이스를 만드는 데 중점을 둡니다. 그 결과, 개인이 실시간으로 결과를 검토하고 보여주는 데 집중할 수 있어 인사이트를 신속하게 전파할 수 있습니다.

스트림릿 라이브러리 설치

새 가상 환경을 만듭니다. 이렇게 하면 Streamlit 설치 후 패키지 버전 충돌이 없는지 확인할 수 있습니다. 그런 다음 pip를 사용하여 다음 명령을 실행하여 Streamlit을 설치합니다:

 pip install streamlit

설치가 제대로 되었는지 확인하려면 먼저 올바르게 설치되었는지 확인하는 것이 중요합니다. 필요한 모든 구성 요소가 있고 예상대로 작동하는지 확인하면 됩니다. 또한 시스템 성능을 테스트하여 요구 사항을 충족하는지 확인하는 것도 도움이 될 수 있습니다.

 streamlit --version

스트림릿 설치에 성공하면 해당 버전의 스트림릿이 표시됩니다.

간단한 데이터 정제 및 분석 앱 구축

Streamlit의 기능을 활용하여 사용자가 정제를 위해 데이터 세트를 업로드하고, 포괄적인 분석을 수행하고, 궁극적으로 시각적으로 매력적인 그래픽 표현을 통해 결과를 표시할 수 있는 사용자 친화적인 웹 애플리케이션을 개발할 수 있습니다.

전체 코드베이스는 개발자와 사용자 모두에게 개방형 액세스를 제공하는 GitHub 리포지토리를 통해 액세스할 수 있습니다.

필요한 라이브러리 설치 및 가져오기

Streamlit을 설치한 가상 환경과 동일한 가상 환경 내에 Pandas, Matplotlib, Seaborn을 설치하려면 다음 명령을 실행합니다:

 pip install pandas matplotlib seaborn

 import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

코드 내에서 이러한 기능을 활용하면 기능성과 유연성을 높일 수 있습니다.

데이터 세트 업로드 및 내용 표시

다음은 Python과 Flask를 사용하여 요청된 기능을 구현할 수 있는 예입니다: ”’python 플라스크에서 플라스크, 렌더_템플릿, 요청, 플래시를 가져옵니다. 팬더를 pd로 임포트 app = Flask(__name__) app.route(‘/’) def index(): return render_template(‘index.html’) app.route(‘/upload’, methods=[‘POST’]) def upload(): […] file = request.files[‘file’] try: df = pd.read_csv(file) flash […] ValueError 제외: […]

 def load_data(uploaded_file):
   try:
       df = pd.read_csv(uploaded_file)
       return df
   except Exception as e:
       st.sidebar.error('Error occurred while loading the file.'
                        ' Please make sure it is a valid CSV file.')
       return None

다음은 Streamlit의 기능을 사용하여 ‘원시 데이터 표시’ 체크박스의 체크 여부에 따라 데이터 프레임을 표 형식으로 표시하는 ‘display_raw_data’라는 함수를 정의하는 예시입니다: “`파이썬 def display_raw_data(df): if st.checkbox(“원시 데이터 표시”): […] […] writer = pd.ExcelWriter(filename=’output.xlsx’, engine=’xlsx’) # 인덱스 행이 있는 Excel 파일에 데이터프레임 쓰기 df.to_excel(writer, index_row=True) # 저장

 def explore_raw_data(df):
   st.subheader('Raw Data')
   if st.checkbox('Show Raw Data'):
       st.dataframe(df)

데이터 프레임이 생성되고 원시 데이터가 표시되면, 다음 단계는 데이터의 정확성과 무결성을 보장하기 위해 데이터를 철저히 정리하는 것입니다. 여기에는 데이터 세트 내에 존재하는 모든 오류나 불일치를 식별하고 수정하는 작업이 포함됩니다. 이 과정을 거친 후에는 다양한 통계 기법을 사용하여 데이터를 분석하여 제시된 정보에서 의미 있는 인사이트를 추출합니다. 마지막으로 분석 결과는 사용자가 쉽게 해석할 수 있도록 차트와 그래프를 사용하여 시각적으로 표현됩니다.

이 글도 확인해 보세요:  JES를 활용한 흥미로운 사운드 처리 기법 3가지

데이터 정리 수행

주어진 데이터 프레임에서 데이터 정리 작업을 수행하기 위한 목적으로 함수를 정의할 수 있으며, 데이터 프레임 내에서 누락된 값 인스턴스를 처리하고 반복적으로 중복된 행 패턴을 제거하는 등의 작업을 포함합니다. 그 후 이러한 프로세스가 효과적으로 실행되면 소프트웨어 인터페이스에 통합된 토글 스위치 또는 체크박스 기능을 통해 ‘정리된 데이터’를 표시하는 옵션이 활성화된 경우 `st.dataframe` 기능을 사용하는 등 적절한 시각화 기법을 통해 최종 사용자에게 정리된 데이터프레임을 표시할 수 있습니다.

 def data_cleaning(df):
   st.header('Data Cleaning')

   # Remove Missing Values
   st.subheader('Handling Missing Values')
   df.dropna(inplace=True)
   st.write("Missing values removed from the dataset.")

   # Remove Duplicate Rows
   st.subheader('Removing Duplicate Rows')
   initial_rows = len(df)
   df.drop_duplicates(inplace=True)
   final_rows = len(df)
   st.write(f"Removed {initial_rows - final_rows} duplicate rows.")

   if st.checkbox('Show Cleaned Data'):
       st.dataframe(df)

이 기능은 제거된 중복 행의 개수도 표시합니다.

데이터 분석 수행

설명 통계를 표시하여 데이터프레임에 포함된 데이터의 개요를 제공하는 통계 함수가 정의되었습니다. 또한 데이터 세트 내의 여러 변수 간의 관계를 시각적으로 표현하기 위해 `st.pyplot` 라이브러리를 사용하여 상관관계 히트 맵을 생성합니다.

 def data_analysis(df):
   st.header('Data Analysis')

   # Descriptive Statistics
   st.subheader('Descriptive Statistics')
   st.write(df.describe())

   # Correlation Matrix
   st.subheader('Correlation Matrix')
   corr_matrix = df.corr()
   fig, ax = plt.subplots(figsize=(10, 8))
   sns.heatmap(corr_matrix, annot=True, cmap='coolwarm',
               center=0, ax=ax)
   st.pyplot(fig)

앞서 언급한 함수는 고급 데이터 분석 목적에 맞게 사용자 정의할 수 있으며, 이를 통해 당면한 정보에서 보다 심층적인 인사이트를 쉽게 추출할 수 있습니다.

데이터 시각화 수행

데이터 시각화는 사용자에게 직관적이고 사용자 친화적인 그래픽 표현을 통해 복잡한 정보를 이해하고 해석할 수 있는 기능을 제공하는 애플리케이션의 핵심적인 요소입니다. 따라서 이 기능은 사용자가 선호도 또는 특정 요구 사항에 따라 플롯의 모양을 사용자 지정할 수 있는 유연성을 제공해야 합니다.

이 기능을 구현하기 위해 사용자가 데이터 집합에서 특정 열을 선택하고, 히스토그램의 원하는 구간차원 분할 수를 결정하고, 히스토그램을 시각화하기 위해 고유한 색상을 지정할 수 있는 함수를 개발할 수 있습니다. 이 함수는 히스토그램과 박스 플롯을 모두 생성하고 st.pyplot 라이브러리를 사용하여 이를 표시합니다.

 def data_visualization(df):
   st.header('Data Visualization')

   # Histogram
   st.subheader('Histogram')
   selected_column = st.selectbox("Select a column to visualize:",
                                  df.columns)
   num_bins = st.slider("Select number of bins:",
                        min_value=5, max_value=50, value=20)
   plot_color = st.color_picker("Select histogram color", "#1f77b4")
   plt.figure(figsize=(8, 6))
   plt.hist(df[selected_column], bins=num_bins, edgecolor='black',
            color=plot_color, alpha=0.7)
   plt.xlabel(selected_column)
   plt.ylabel('Frequency')
   st.pyplot(plt)

   # Box Plot
   st.subheader('Box Plot')
   selected_column = st.selectbox("Select a column for box plot:",
                                  df.columns)
   plot_color = st.color_picker("Select box plot color", "#1f77b4")
   plt.figure(figsize=(8, 6))
   sns.boxplot(x=df[selected_column], color=plot_color)
   plt.xlabel(selected_column)
   plt.ylabel('Value')
   st.pyplot(plt)

이 시점에서는 애플리케이션의 기본 기능을 보유하고 있을 가능성이 높습니다.

이 글도 확인해 보세요:  Rust에서 기본 HTTP 웹 서버를 빌드하는 방법

사용자 및 €™ 피드백 수집

이 애플리케이션의 특정 기능이 부적절하게 작동하는 경우가 있습니다. 이러한 경우 사용자가 피드백을 제공할 수 있도록 하는 것이 필수적입니다. 일반적인 접근 방식은 사용자가 이메일을 통해 당사와 소통하는 것입니다. 스트림릿은 사용자 피드백을 수집할 수 있는 플랫폼을 제공하지만, 애플리케이션 내에서 이메일을 보낼 수 있는 기본 메커니즘은 포함되어 있지 않습니다. 그럼에도 불구하고 외부 라이브러리 또는 타사 서비스를 통합하여 프로그램 내에서 이메일 커뮤니케이션을 용이하게 할 수 있습니다.

최종 사용자의 의견을 구하고 특정 제품이나 서비스에 대한 의견이나 감정을 쉽게 표현할 수 있도록 하려면 애플리케이션의 지정된 공간에서 구조화된 설문지나 설문조사를 작성할 수 있는 인터페이스를 설계하는 것이 필수적입니다. 이는 양식을 렌더링하는 데 필요한 HTML 요소를 생성하고 서버 측 스크립팅 또는 클라이언트 측 이벤트 처리 메커니즘을 통해 제출된 데이터를 캡처하는 특수 함수를 코드베이스에 생성함으로써 달성할 수 있습니다. 수집된 피드백은 고객의 요구와 기대를 더 잘 충족시키기 위한 반복적인 개선 및 향상을 위한 귀중한 입력 자료로 사용됩니다.

 def feedback_form():
   st.header('Feedback')
   with st.form('Feedback Form'):
       email = st.text_input("Your Email")
       feedback = st.text_area("Feedback")
       submitted = st.form_submit_button("Submit Feedback")
       if submitted:
           # Here, you can send the feedback to the developer's
           # email using external services/APIs
           st.success("Thank you for your feedback!")

프로그램 흐름 제어 및 앱 실행

프로그램 내의 다양한 하위 루틴을 효율적으로 조정하고 오케스트레이션하려면 중요한 메인 기능을 통합하는 것이 필요합니다. 또한, 제출된 데이터 세트를 처리하기 전에 데이터 개인정보 보호정책에 대한 명시적인 사용자 동의를 얻는 것이 필수적입니다.

 def main():
   st.title('Data Cleaning, Analysis, and Visualization App')

   st.sidebar.header('Upload Dataset')
   uploaded_file = st.sidebar.file_uploader('Upload a CSV file', type=['csv'])

   agree_terms = st.sidebar.checkbox("I agree to the terms")

   if uploaded_file is not None and agree_terms:
       df = load_data(uploaded_file)

       if df is not None:
           explore_raw_data(df)
           data_cleaning(df)
           data_analysis(df)
           data_visualization(df)

           feedback_form()

`if __name__ == ‘__main__’` 구문을 사용하여 프로그램을 독립적으로 실행하거나 다른 스크립트 내에서 모듈로 임포트할 수 있습니다.

 if __name__ == '__main__':
   main()

지정된 터미널 위치로 이동하여 프로젝트가 저장된 디렉토리로 이동하세요. 해당 지점에 도착하면 다음 명령어를 실행하여 애플리케이션을 시작하세요:

 streamlit run main.py

Streamlit 애플리케이션에 액세스하려면 관련 스크립트 파일에서 지정된 명령을 실행하여 생성된 로컬 또는 네트워크 URL을 사용할 수 있습니다. 이러한 옵션은 애플리케이션과의 상호 작용을 위한 대체 방법을 제공합니다.

이 글도 확인해 보세요:  내부에서 REST API 호출을 수행하는 방법 VS 코드

프로그램의 결과 출력은 다음과 같습니다:

브라우저가 동영상 태그를 지원하지 않습니다.

데이터 과학을 위한 대화형 웹 애플리케이션 개발 프로세스가 점점 간소화되면서 프로젝트에 직관적인 사용자 인터페이스를 구축하기 위해 더 이상 전문적인 웹 개발 숙련도가 필요하지 않게 되었습니다.

아직도 웹 개발을 배워야 할까요?

웹 개발 기술을 배우는 것이 도움이 되는 정도는 목표에 따라 달라질 수 있습니다. 예를 들어, 정교한 사용자 인터페이스와 혁신적인 기능을 갖춘 복잡한 웹 애플리케이션을 만들 계획이라면 이러한 기술에 대한 지식을 습득하면 애플리케이션의 모양과 기능을 사용자 지정하는 데 더 많은 유연성을 제공하므로 유리할 수 있습니다. 그러나 시각적 표현이나 성능 측면에서 높은 수준의 정밀도를 요구하지 않고 간단한 앱을 개발하는 것이 목표라면 Streamlit을 사용하는 것으로 충분할 수 있습니다.

By 박준영

업계에서 7년간 경력을 쌓은 숙련된 iOS 개발자인 박준영님은 원활하고 매끄러운 사용자 경험을 만드는 데 전념하고 있습니다. 애플(Apple) 생태계에 능숙한 준영님은 획기적인 솔루션을 통해 지속적으로 기술 혁신의 한계를 뛰어넘고 있습니다. 소프트웨어 엔지니어링에 대한 탄탄한 지식과 세심한 접근 방식은 독자에게 실용적이면서도 세련된 콘텐츠를 제공하는 데 기여합니다.