군침이 싹 도는 코딩

Data Dashboard App 개발 순서 (2) 웹 대시보드 만들기 본문

Python/Streamlit

Data Dashboard App 개발 순서 (2) 웹 대시보드 만들기

mugoori 2022. 12. 14. 11:28
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()

# 먼저 기본 뼈대를 작성해준다 이때 이 파일에 모두 코딩하기에는 너무 지저분해지므로

파일을 나눠 코딩하는 방식을 사용한다 

변수를 사용하기 위해 미리 임폴트 작업을 해둔다

그리고 해당 데이터들을 보여주기위해 사이드바를 만들어주었다

 

 

 

 

 

import streamlit as st

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

    img_url = 'https://img.hankyung.com/photo/202203/0ad0cd5a2df34e36cd91fd08dcbb46c2.jpg'
    st.image(img_url)

# 홈 화면부터 작업을 시작했다

홈 화면에는 간단하게 텍스트와 자동차 이미지 1개를 넣어보았다

사이드바도 잘 들어가 있는 모습이다

 

 

 

 

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())

# 다음은 EDA 쪽을 작업한다

판다스에서 데이터 분석을 했기때문에 그것을 긁어와 보여줄 부분만 스트림릿으로 수정해 보여주면 된다

사용된 데이터 프레임과 기본 통계 데이터를 우선 보여주었다

 

 

 

 

 

    st.subheader('최대 / 최소 데이터 확인하기')

    column_list = df.columns[4:]
    selected_column = st.selectbox('컬럼을 선택하세요.',column_list)
    
    df_max = df.loc[df[selected_column] == df[selected_column].max(),]
    df_min = df.loc[df[selected_column] == df[selected_column].min(),]
    st.text('최대 데이터')
    st.dataframe(df_max)
    st.text('최소 데이터')
    st.dataframe(df_min)

# 판다스에서는 한 컬럼만을 최대 최소를 볼수 있게 했지만

웹 대시보드에는 사용자가 원하는 컬럼의 최대 최소를 보여줄수 있게 작업했다

 

 

 

 

    st.subheader('컬럼 별 히스토그램')

    histogram_column = st.selectbox('히스토그램 확인할 컬럼을 선택하세요.',column_list)
    my_bins = st.number_input('빈의 갯수를 입력하세요', 10, 30, value=10, step=1)

    fig1 = plt.figure()
    plt.hist(data=df , x= histogram_column, rwidth=0.8, bins=my_bins)
    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 :

        df_corr = df[selected_list].corr()

        fig2 = plt.figure()
        sb.heatmap(data=df_corr,annot=True, fmt='.2f',cmap='coolwarm',vmin=-1,vmax=1,linewidths=0.5)
        st.pyplot(fig2)

# 마지막으로 두개 이상의 컬럼을 선택하면 상관 관계를 히트맵으로 그려주도록 하였다

이때 조건문을 사용해 두개 이상의 컬럼을 선택하지 않으면 아무것도 나오지 않게 하였다

 

 

 

 

 

import streamlit as st
import numpy as np
import joblib

def run_ml_app() :
    st.subheader('자동차 금액 예측')


    # 성별, 나이, 연봉, 카드빛, 자산을 유저한테 모두 입력받아서
    # 자동차 구매 금액 예측하세요.

    gender = st.radio('성별 선택',['여자','남자'])

    if gender == '여자' :
        gender = 0
    else :
        gender = 1

    age = st.number_input('나이 입력',18,100)

    salary = st.number_input('연봉 입력',10000,1000000)

    debt = st.number_input('카드빛 입력',0,1000000)

    worth = st.number_input('자산 입력',1000,10000000)

    new_data = np.array([gender,age,salary,debt,worth])

    new_data = new_data.reshape(1, 5)

    regressor = joblib.load('regressor.pkl')

    y_pred = regressor.predict(new_data)

    y_pred = round(y_pred[0])

    if y_pred < 0 :
        st.info('입력한 데이터로는 금액을 예측하기 어렵습니다.')
    else :
        st.info('예측한 자동차 금액은 {} 달러 입니다.'.format(y_pred))

# 마지막으로 판다스에서 모델링한 리니어 리그레이션을 가져오기 위해 필요한 임폴트 문을 써주고

예측을 위해 유저에게 입력받을수 있게 스트림릿으로 코딩을 해준다

성별 부분은 라디오로 받아주고 조건문을 사용해 0, 1 을 구분할 수 있게 해주었다

나머지 데이터는 모두 넘버 인풋으로 처리하였다

그 후 변수 new_data 에 이것을 넣고 뉴 데이터가 1차원이기때문에 2차원으로 리쉐이브 해준다

마지막으로 이 뉴 데이터를 리그레이션에게 예측하게 한다

그리고 결과값을 출력하게 한다

상기 인공지능은 약간의 문제점이 있다 학습시킨 데이터의 범위 밖을 벗어나면 -로 표기되는 문제점이 있다

이를 고치기 위해 0보다 작은값은 사용하지 못하게 코딩하였다