개발/대시보드

웹 대시보드 - 웹 대시보드 개발 순서, Jupyter to Streamlit

웅'jk 2022. 12. 13. 18:02

웹 대시보드 개발 방법

 

1. 분석할 데이터를 준비한다.

df = pd.read_csv('data/Car_Purchasing_Data.csv',encoding='ISO-8859-1')

2. 주피터 노트북으로 데이터를 분석한다.

df.head()
df.describe()
df.columns[4:]
df[df['Annual Salary']==df['Annual Salary'].min() ]
df[df['Annual Salary']==df['Annual Salary'].max() ]

# 등등 데이터들을 확인한다.

3. 필요에 의해서 머신러닝을 수행할 수도 있다.

# 자동차 구매 금액을 예측하는 인공지능을 만들어보고 싶다.

df.isna().sum()
y = df['Car Purchase Amount']
X = df.loc[:,'Gender':'Net Worth']
X = X.values

# training , test
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2 , random_state = 50 )

# 트레이닝
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit( X_train , y_train )
y_pred = regressor.predict(X_test)

# mse 값
error = y_test - y_pred
(error **2).mean()

# 파일로 저장
import joblib 
joblib.dump(regressor,'regressor.pkl')

4.분석이 완료되면, 웹 대시보드로 개발한다.

5.웹 대시보드는 비주얼 스튜디오 코드로 개발한다.

6.주피터 노트북에서 분석한 코드를, 비주얼 스튜디오로 옮긴다.

7.인터랙티브한 대시보드를 위해서, 유저에게 데이터를 입력받도록 개발한다.

app.py

import streamlit as st
from app_home import run_home_app
from app_eda import run_eda_app
from app_ml import run_ml_app
def main() :
    st.title('자동차 가격 예측 앱')
    
    menu = ['Home','EDA','ML']
    choice = st.sidebar.selectbox('메뉴',menu)

    if choice == 'Home' :
        run_home_app()
    elif choice =='EDA' :
        run_eda_app()
    elif choice == 'ML' :
        run_ml_app()

if __name__ =='__main__' :
    main()

 

app_home

import streamlit as st

def run_home_app() :
    st.text('이 앱은 고객 데이터와 자동차 구매 데이터에 대한 내용입니다.\n 데이터분석 및 고객정보를 넣으면, 얼마정도의 차를 구매할지를 예측해줍니다.')

    st.image('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQoFNZk2WAuKp7W56OmJBbNrc8RzPa3ubcrQbaYXGWr2kbPpBbWiGk7YVm5gBcnKyU9ARg&usqp=CAU')

 

app_eda

import streamlit as st

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb

def run_eda_app() :
    df = pd.read_csv('data/Car_Purchasing_Data.csv',encoding='ISO-8859-1')
    st.subheader('데이터 프레임 확인')
    st.dataframe(df.head(3))

    st.subheader('기본 통계 데이터')
    st.dataframe(df.describe())

    # 컬럼을 선택할 수 있게 한다.
    st.subheader('최대 / 최소 데이터 확인하기')
    column_list = df.columns[4:]
    selected_column=st.selectbox('컬럼을 선택하세요',column_list)
    min = df[df[selected_column]==df[selected_column].min() ]
    max = df[df[selected_column]==df[selected_column].max() ]
    st.text('최소 데이터')
    st.dataframe(min)
    st.text('최대 데이터')
    st.dataframe(max)

    st.subheader('컬럼 별 히스토그램')
    histogram_column = st.selectbox('히스토그램 확인할 컬럼을 선택하세요',column_list)
    my_bins = st.number_input('빈의 갯수를 입력하세요.',10,value = 10,step=1)
    
    fig1 = plt.figure()
    plt.hist(data = df, x= histogram_column , bins = my_bins , rwidth = 0.8)
    plt.title(histogram_column+ ' Histogram')
    plt.xlabel(histogram_column)
    plt.ylabel('Count')
    st.pyplot(fig1)

    st.subheader('상관 관계 분석')
    selected_list = st.multiselect('상관분석을 하고 싶은 컬럼을 선택하세요',column_list)
    
    if len(selected_list) >= 2 :
        fig2=plt.figure()
        sb.heatmap(data = df[selected_list].corr(), annot = True, fmt = '.2f',cmap = 'coolwarm',
        vmin = -1, vmax = 1, linewidths=0.5)
        st.pyplot(fig2)

 

app_ml

import streamlit as st
import numpy as np
import joblib
def run_ml_app() :
    st.subheader('자동차 금액 예측')
    regressor = joblib.load('regressor.pkl')

     #성별은 여자이고,나이는 50이며, 연봉은 40000 카드빚 50000, 자산 200000
    
    # 성별 , 나이 , 연봉, 카드빚 , 자산을 유저한테 모두 입력받아서
    # 자동차 구매 금액을 예측하세요.
    
    gender = st.radio('성별을 선택해주세요. ',['여자','남자'])
    if gender == '남자' : 
        gender = 1
    else :
        gender = 0
    age = st.number_input('나이를 입력해주세요.',min_value=1,max_value=120)
    annual = st.number_input('연봉을 입력해주세요 (단위 $)',min_value=0.0)
    card_debt = st.number_input('카드빚을 입력해주세요. (단위 $)',min_value=0.0)
    net_worth = st.number_input('자산을 입력해주세요. (단위 $)',min_value=0.0)

    user_list = [gender,age,annual,card_debt,net_worth]  
    new_data = np.array(user_list).reshape(1,5)
    y_pred = regressor.predict(new_data)

    if y_pred > 0 :
        st.info('예측한 자동차 금액은 {} 달러 입니다.'.format(y_pred))
    else :
        st.info('예측이 어렵습니다.')