File size: 5,953 Bytes
5399a00
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import streamlit as st
import pandas as pd
from pomegranate import DiscreteDistribution, HiddenMarkovModel
import matplotlib.pyplot as plt
import hmmlearn.hmm as hmm
import numpy as np

kolom = None
# Membuat form input untuk file csv tahun sebelumnya
file_sebelumnya = st.file_uploader("Upload file csv tahun sebelumnya", type="csv")
# Membuat tombol untuk menampilkan data awal 10 dari file csv tahun sebelumnya
if file_sebelumnya:
    df_sebelumnya = pd.read_csv(file_sebelumnya)
    if st.button("Tampilkan data awal 10 dari file csv tahun sebelumnya"):
        st.write("Data awal 10 dari file csv tahun sebelumnya:")
        st.write(df_sebelumnya.head(10))
# Membuat form input untuk file csv tahun sekarang
file_sekarang = st.file_uploader("Upload file csv tahun sekarang", type="csv")
# Membuat tombol untuk menampilkan data awal 10 dari file csv tahun sekarang
if file_sekarang:
    df_sekarang = pd.read_csv(file_sekarang)
    if st.button("Tampilkan data awal 10 dari file csv tahun sekarang"):
        st.write("Data awal 10 dari file csv tahun sekarang:")
        st.write(df_sekarang.head(10))
# Membuat form input untuk memilih kolom yang akan dicari kata kunci
if file_sebelumnya and file_sekarang:
    kolom = st.selectbox("Pilih kolom yang akan dicari kata kunci", df_sebelumnya.columns)

# Membuat form input untuk memasukkan kata kunci
if kolom!= None:
    keyword = st.text_input("Masukkan kata kunci")

# Membuat tombol untuk menampilkan jumlah keyword yang cocok
if file_sebelumnya and file_sekarang and kolom and keyword:
    if st.button("Tampilkan jumlah keyword"):
        # Menghitung jumlah kemunculan kata kunci pada file csv tahun sebelumnya
        jumlah_sebelumnya = df_sebelumnya[kolom].str.contains(keyword, case=False).sum()

        # Menghitung jumlah kemunculan kata kunci pada file csv tahun sekarang
        jumlah_sekarang = df_sekarang[kolom].str.contains(keyword, case=False).sum()

        # Menampilkan hasil
        st.write(f"Jumlah keyword '{keyword}' pada file csv tahun sebelumnya: {jumlah_sebelumnya}")
        st.write(f"Jumlah keyword '{keyword}' pada file csv tahun sekarang: {jumlah_sekarang}")

if file_sebelumnya and file_sekarang and kolom and keyword:
    if st.button("Prediksi data untuk tahun berikutnya"):
        # Membaca data tahun sebelumnya dan tahun sekarang
        data = pd.concat([df_sebelumnya[kolom], df_sekarang[kolom]], ignore_index=True)
        #data_bersih = pd.concat([df_sebelumnya, df_sekarang],ignore_index=True)
        #st.write(data_bersih.head(10))
        # Menghitung frekuensi kemunculan setiap kata pada data
        freq = {}
        for d in data:
            d_str = str(d)
            for w in d_str.split():
                freq[w] = freq.get(w, 0) + 1

        # Membuat model HMM
        states = list(freq.keys())
        
        # Menghitung total jumlah baris pada tabel yang cocok dengan keyword
        total_data_sebelumnya = df_sebelumnya[kolom].str.contains(keyword, case=False).sum()
        total_data_sekarang = df_sekarang[kolom].str.contains(keyword, case=False).sum()

        # Membuat tabel dengan no, keyword, total judul yang cocok, dan total data yang cocok
        no = []
        keyword_list = []
        tb_data_sebelumnya = []
        tb_data_sekarang = []
        total_data = []

        for i, s in enumerate(states):
            if keyword in s:
                no.append(i+1)
                keyword_list.append(s)
                tb_data_sebelumnya.append(sum(df_sebelumnya[kolom].str.contains(s, case=False).dropna()))
                tb_data_sekarang.append( sum(df_sekarang[kolom].str.contains(s, case=False).dropna()))
                #total_data.append(total_data_sebelumnya + total_data_sekarang)
                total_data.append(sum(df_sebelumnya[kolom].str.contains(s, case=False).dropna()) + sum(df_sekarang[kolom].str.contains(s, case=False).dropna()))

        df = pd.DataFrame({"no": range(1, len(keyword_list)+1), "keyword": keyword_list, "data tahun sebelumnya": tb_data_sebelumnya, "data tahun sekarang": tb_data_sekarang, "total data": total_data})
        # tambahkan kolom total data
        df.loc[len(df)] = ['', 'Total', sum(df['data tahun sebelumnya']), sum(df['data tahun sekarang']),sum(df['total data'])]
        st.write(df)    
        X = df[['data tahun sebelumnya', 'data tahun sekarang', 'total data']].to_numpy()

        # Inisialisasi Model HMM
        n_components = min(1, len(df))
        st.write(n_components)
        model = hmm.GaussianHMM(n_components=n_components, covariance_type="diag", n_iter=160)

        # Mengatur nilai awal transisi antar-states
        model.transmat_ = np.ones((n_components, n_components)) / n_components

        # Melatih Model HMM
        model.fit(X)

        # Normalisasi matriks transisi
        model.transmat_ = model.transmat_ / model.transmat_.sum(axis=1)[:, np.newaxis]

        # Prediksi Peminjaman Buku Tahun Berikutnya
        next_year_data = np.array([[200, 300, 500]])

        predicted_data = []
        for i in range(next_year_data.shape[1]):
            next_month_data = next_year_data[:, i].reshape(-1, 1)
            predicted_state = model.predict(next_month_data)
            predicted_data.append(model.means_[predicted_state][0][0])

        #st.write(predicted_data)

        # Membuat grafik prediksi menggunakan HMM
        plt.figure(figsize=(12, 6))
        plt.title("Grafik prediksi menggunakan HMM")
        plt.xlabel("Tahun")
        plt.ylabel("Jumlah data yang cocok")
        plt.xticks([0, 1, 2], ["Tahun Sebelumnya", "Tahun Sekarang", "Tahun Berikutnya"])
        plt.bar([0, 1, 2], [total_data_sebelumnya, total_data_sekarang, predicted_data[2]])
        plt.show()
        st.set_option('deprecation.showPyplotGlobalUse', False)
        # Menampilkan grafik
        st.pyplot()
        st.write(f"Pinjaman buku untuk tahun berikutnya dari keyword: '{keyword}' adalah '{predicted_data[2]}'")