BesottenJenny's picture
Update src/EDA.py
f313894 verified
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()