본문 바로가기
Project/p1. Streamlit application

모바일어플리케이션 사용여부 예측 - 스트림릿 웹페이지 구현 ②

by 하니__ 2024. 12. 5.

 

 

 

 

모바일어플리케이션 사용여부 예측 - 스트림릿 웹페이지 구현 ①

모바일어플리케이션 사용여부 예측 - 데이터 전 처리 & 머신러닝 모델 학습    이전 글을 참고하여 다음으로 넘어가자    일단 여러가지 하기에 앞서 각 어플리케이션의 사용인원과 사용률

hani08.tistory.com

 

이번엔 다음

 

 

학습된 머신러닝 모델을 사용하는 시간이다

 

 

우선 데이터를 입력 받아야 한다

 

 

GENDER = st.radio('성별 선택', ['남자','여자'])
AGE = st.number_input('나이', min_value=10, max_value=120,value= 30, step=1)
MARRIAGE = st.radio('결혼 여부', ['미혼 / 비혼','기혼','기타(이혼, 사별 등)'])
INCOME = st.number_input('월 소득을 입력해주세요, 단위는 만원', min_value=100, max_value=50000, value= 250, step=50)
AREA = st.radio('주거지역을 선택하세요', ['서울', '경기', '인천', '충남', '경남',
                                            '부산', '대구', '울산', '광주', '경북', '전북', 
                                            '세종', '제주', '강원', '대전', '충북', '전남'])

 

 

각각 성별은 라디오버튼으로 남자와 여자를

 

나이는 최소값은 10 최대값은 120으로 기본값은 30으로 설정하고

+ - 버튼을 눌렀을때 1씩 가감이 가능하도록 설정

 

그리고 결혼여부는 라디오버튼으로 미혼, 기혼, 기타 등을 선택하게끔

 

그리고 월소득은 최소값은 100만원 최대값은 50억원 그리고 기본값은 250만원

+ - 버튼으로는 50만원씩 가감이 가능하도록 설정

 

그리고 거주지역은 각각의 특별, 광역, 자치도등을 라디오버튼으로 클릭 가능하게끔 설정하여

 

 

 

 

이런 화면을 만들어 준다

 

 

그리고 이제 선택된 값들을 내가 만들어둔 모델에 알맞게 적용하도록

 

 

if GENDER == '남자':
    GENDER = 'M'
elif GENDER == '여자':
    GENDER = 'F'
    
X_label_encoder = joblib.load('./model/X_label_encoder.pkl')
GENDER = X_label_encoder.transform([GENDER])[0]

 

성별을 M과 F로 원래의 데이터 형식과 같기 바꿔준뒤

학습된 레이블인코더를 불러와 적용시켜준다

 

 

new_data = pd.DataFrame({'성별': [GENDER], '나이': [AGE], '결혼': [MARRIAGE], '월_소득': [INCOME], '거주지역': [AREA] })

 

그런 뒤에 새로운 데이터로서 데이터프레임을 만들어주자

 

 

if st.button('예측하기') :
    ct = joblib.load('./model/ct.pkl')
    encoded_features = ct.transform(new_data)

    X_new = encoded_features.toarray()


    file = zipfile.ZipFile('./model/model.zip')
    file.extractall('./model')
    model = joblib.load('./model/model.pkl')

    y_pred = model.predict_proba(X_new)

    df = pd.read_csv('./data/Changed_Mobile.csv')
    df.drop('Unnamed: 0',axis=1,inplace=True)

    probabilities = []

    for i, pred in enumerate(y_pred):
        prob = round(pred[0][0] * 100, 2)
        col_name = df.columns[i]
        probabilities.append((col_name, prob))

 

예측하기 라는 버튼을 만들어 다음 행동을 지시하자

 

우선 학습된 원핫인코더 를 가져와서 변환한다음 어레이로 만들어주자

 

 

그리고 이번엔 학습된 머신러닝 모델을 가져와서

 

predict함수로 예측을 진행하자

 

그리고 각 컬럼과 예측확률을 저장할 리스트를 만들어주고

 

 

 

 

이번엔 각 확률을 bar차트와 pie차트로 만들어보자

 

 

 

    probabilities.sort(key=lambda x: x[1], reverse=False)
    fig_bar = px.bar(x=[p[1] for p in probabilities], y=[p[0] for p in probabilities], orientation='h',
                    labels={'x': '확률 (%)', 'y': '어플'}, title='각 어플 사용 확률')
    st.plotly_chart(fig_bar)

    n_rows = 6
    n_cols = 3

    fig, axs = plt.subplots(nrows= 6, ncols=3, figsize=(9, 15))

    probabilities.sort(key=lambda x: x[1], reverse=True)

    for i, (col_name, prob) in enumerate(probabilities):
        row = i // n_cols
        col = i % n_cols
        if row < n_rows and col < n_cols:
            axs[row, col].pie([prob, 100 - prob], labels=[f'사용확률: {prob}%',  '사용안함'], autopct='%1.2f%%', startangle=90)
            axs[row, col].set_title(f'{col_name} 어플 사용 확률')


    plt.tight_layout()
    st.pyplot(fig)


    # 각 어플의 예측 확률 정보 출력
    for col_name, prob in probabilities:
        st.info(f"당신이 '{col_name}' 관련 어플을 사용할 확률은 {prob}% 입니다.")

 

우선 bar차트에서는 확률이 큰 순서로 내림차순하여 가로보기로 설정해주고

 

pie차트에서는 각각의 확률을 보기엔 너무 크고 많기에 6행 3열로 설정해주자

 

 

 

 

그렇게 설정 후 예측하기 버튼을 누르면

 

 

우측 상단에 이런 문구가 뜨고

 

작업시간이 좀 길다

 

 

기다려주면 아래와 같이 높은 확률부터 차례차례 나오게 된다