import streamlit as st import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import plotly.express as px from PIL import Image # ============================================= # Cache dataset agar tidak reload setiap kali # ============================================= def load_data(): df = pd.read_csv('./src/singapore_airlines_reviews.csv') return df # Load dataset df = load_data() # ============================================= # Main app # ============================================= def run(): # Judul dan Subjudul # st.title("ACRE - Automated Customer Review Analysis") st.subheader("Exploratory Data Analysis (EDA)") st.markdown( """ This section provides an exploratory data analysis (EDA) of Singapore Airlines (SQ) customer reviews. We aim to understand the distribution of ratings, textual review characteristics, and topic modeling results. These insights serve as the foundation for building automated models that classify sentiment and uncover key themes in customer feedback. """ ) # =============================== # Dataset Preview # =============================== st.write("### Dataset Preview") st.dataframe(df.head()) # =============================== # Distribusi Rating # =============================== st.write("### Distribution of Ratings") fig, ax = plt.subplots(figsize=(8, 5)) sns.countplot(x='rating', data=df, palette='viridis', ax=ax, order=sorted(df['rating'].unique())) for p in ax.patches: height = p.get_height() ax.annotate(f'{height:,}', (p.get_x() + p.get_width()/2, height), ha='center', va='bottom', fontsize=10, fontweight='bold') st.pyplot(fig) st.markdown( """ **Note:** Ratings are explored here only as descriptive information about passenger experiences. In the inference page, actual sentiment will be predicted automatically from the review text using NLP techniques. """ ) # =============================== # Analisis Panjang Teks # =============================== st.write("### Distribution of Review Length") df['text_length'] = df['text'].apply(lambda x: len(str(x).split())) fig = px.histogram(df, x='text_length', nbins=50, title='Review Length Distribution') st.plotly_chart(fig, use_container_width=True) # Wordcloud col1, col2 = st.columns(2) with col1: st.image("./src/Negative - Wordcloud.png", caption="Negative - Wordcloud") with col2: st.image("./src/Positive - Wordcloud.png", caption="Positive - Wordcloud") # st.write("Lorem ipsum explanation for Topics Hierarchy.") # =============================== # Topic Modeling Results (Images) # =============================== st.write("## Topic Modeling Results") # 1. Top Words Distributions col1, col2 = st.columns(2) with col1: st.image("./src/Negative - Top Words Distributions.png", caption="Negative - Top Words Distributions") with col2: st.image("./src/Positive - Top Words Distributions.png", caption="Positive - Top Words Distributions") # st.write("Lorem ipsum explanation for Top Words Distributions.") # 2. Topic Activities Over Time col1, col2 = st.columns(2) with col1: st.image("./src/Negative - Topic Activities Over Time.png", caption="Negative - Topic Activities Over Time") with col2: st.image("./src/Positive - Topic Activities Over Time.png", caption="Positive - Topic Activities Over Time") # st.write("Lorem ipsum explanation for Topic Activities Over Time.") # 3. Topics Weights col1, col2 = st.columns(2) with col1: st.image("./src/Negative - Topics Weights.png", caption="Negative - Topics Weights") with col2: st.image("./src/Positive - Topics Weights.png", caption="Positive - Topics Weights") # st.write("Lorem ipsum explanation for Topics Weights.") # ============================================= # Run Script # ============================================= if __name__ == '__main__': run()