import streamlit as st
import seaborn as sns
import plotly.express as px
import matplotlib.pyplot as plt
import pandas as pd
import plotly.graph_objects as go
def run():
# title dan deskripsi pendek
st.title('EDA Analysis Used Car Price')
st.write('EDA ini terfokus pada eksplorasi untuk memahami data lebih dalam dengan melihat distribusi data, korelasi atau hubungan antar kolom dan eksplorasi berdasarkan business domain.')
st.markdown('---')
#load dataset dan tampilkan dataset
dataset = pd.read_csv('dataset.csv')
st.markdown("
Dataset Preview
", unsafe_allow_html=True)
st.dataframe(dataset,hide_index=True, height=200, width=1000)
# Tulis deskripsi kolom
st.write("Deskripsi Kolom: ")
st.write('`model` = Tipe atau model mobil (categorical - nominal)')
st.write('`year` = Tahun pembuatan mobil (categorical - ordinal)')
st.write('`price` = Harga (dalam Pound Sterling - numerical)')
st.write('`transmission` = Tipe transmisi mobil (categorical - nominal)')
st.write('`mileage` = Jumlah jarak tempuh dalam miles (numerical)')
st.write('`fuelType` = Jenis bahan bakar (cateogrical - nominal)')
st.write('`tax` = Jumlah pajak dalam Pound Sterling')
st.write('`mpg`= Miles per Gallon (1 gallon = 3.78541 liter - numerical) ')
st.write('`engineSize` = Ukuran mesin (Numerical)')
st.write('`company` = Brand atau nama perusahaan pembuat mobil (categorical - nominal)')
st.markdown('---')
# numeric data untuk chart 1
numeric_data = dataset[['mileage','tax','engineSize','mpg']]
# title chart 1
st.markdown("Perkembangan Harga Pertahun
", unsafe_allow_html=True)
# group dataset berdasarkan tahun dan brand
year = dataset[['year', 'price']].groupby('year').mean()
audi = dataset[['year', 'price']][dataset['company'] == "Audi"].groupby('year').mean()
toyota = dataset[['year', 'price']][dataset['company'] == "Toyota"].groupby('year').mean()
hyundai = dataset[['year', 'price']][dataset['company'] == "Hyundai"].groupby('year').mean()
bmw = dataset[['year', 'price']][dataset['company'] == "BMW"].groupby('year').mean()
# Reindex dataset dengan value tahun
audi = audi.reindex(year.index, fill_value=0)
toyota = toyota.reindex(year.index, fill_value=0)
hyundai = hyundai.reindex(year.index, fill_value=0)
bmw = bmw.reindex(year.index, fill_value=0)
# membuat figure plotly
fig = go.Figure()
# Plot harga rata-rata berdasarkan tahun
fig.add_trace(go.Scatter(x=year.index, y=year['price'], mode='lines', name='All Cars', line=dict(color='cyan')))
# Plot harga rata-rata berdasarkan brand
fig.add_trace(go.Scatter(x=audi.index, y=audi['price'], mode='lines', name='Audi', line=dict(color='red', dash='dash')))
fig.add_trace(go.Scatter(x=toyota.index, y=toyota['price'], mode='lines', name='Toyota', line=dict(color='blue', dash='dash')))
fig.add_trace(go.Scatter(x=hyundai.index, y=hyundai['price'], mode='lines', name='Hyundai', line=dict(color='yellow', dash='dash')))
fig.add_trace(go.Scatter(x=bmw.index, y=bmw['price'], mode='lines', name='BMW', line=dict(color='white', dash='dash')))
# Customisasi plot
fig.update_layout(
title='Average Price by Year',
xaxis_title='Year',
yaxis_title='Average Price',
xaxis=dict(tickvals=year.index, ticktext=year.index, tickangle=45),
legend=dict(x=0, y=1)
)
# Munculkan plot dan keterangan
st.plotly_chart(fig)
st.write('Dari chart di atas, kita bisa melihat bahwa:\n- Setiap perusahaan memiliki rata-rata yang berbeda dari tahun ke tahun.\n- Rata-rata harga pada semua perusahaan mengalami kenaikan yang mirip sebagaimana bertambahnya tahun. Ini menandakan semakin muda sebuah mobil, maka harga nya semakin tinggi.')
st.markdown('---')
# title chart 2
st.markdown("Average Price berdasarkan Brand
", unsafe_allow_html=True)
# figure
fig=plt.figure(figsize=(7,5))
#barplot
ax=sns.barplot(dataset, x='company', y='price', estimator='mean', hue='company', palette='viridis')
plt.bar_label(ax.containers[0], label_type='center', color='white') # bar label
st.pyplot(fig) # tampilkan plot
st.write('Terlihat bahwa company yang ada terbagi seperti terbagi menjadi 2 kelas. Kelas dengan rata-rata harga yang tinggi yaitu Audi dan BMW, lalu kelas dengan harga rata-rata yang rendah yaitu Toyota dan Hyundai.')
st.markdown('---')
# judul plot 3
st.markdown("Average Price Model berdasarkan Brand
", unsafe_allow_html=True)
# mendapatkan list nama brand atau company
company = dataset['company'].unique().tolist()
# figure
fig=plt.figure(figsize=(20,30))
#looping subplot
for i, comp in enumerate(company):
plt.subplot(3,2,i+1)
data = dataset[['model','price']][dataset['company']==comp].groupby('model').mean().sort_values("price", ascending=False) # filter dataset
ax=sns.barplot(data, x='price', y=data.index, palette='viridis') # bar plot
plt.bar_label(ax.containers[0]) #bar label
plt.title(f"Rata-Rata Harga {comp}") #title per chart
# tampilkan chart dan keterangan
st.pyplot(fig)
st.write('Kita bisa melihat bahwa setiap model dari setiap company memiliki harga rata-rata yang berbeda satu sama lain namun terdapat kemiripan antar model, hal ini akan digunakan sebagai tolak ukur pada proses pengurangan cardinality di feature engineering. ')
st.markdown('---')
# judl chart 4
st.markdown("Average Price berdasarkan Tipe Transmisi
", unsafe_allow_html=True)
#figure
fig=plt.figure(figsize=(12,8))
ax=sns.barplot(dataset, x='transmission', y='price', estimator='mean', hue='transmission') # label
plt.bar_label(ax.containers[0], label_type='center', fontsize=14) # bar label
# tampilkan chart dan keterangan
st.pyplot(fig)
st.write('Ketika melihat rata-rata harga setiap transmission, kita bisa lihat bahwa yang paling mahal justru adalah semi-auto, disusul automatic, lalu other, dan Manual. Ini bisa disebabkan oleh adanya outliers. Pada dunia nyata jika diurutkan dari yang termurah yaitu manual, semi-auto, automatic.')
st.markdown('---')
# judul chart 5
st.markdown("Rata-Rata Efisiensi Bahan Bakar berdasarkan Brand
", unsafe_allow_html=True)
fig = plt.figure(figsize=(10, 8)) #figure
ax=sns.barplot(dataset, x='company', y='mpg', estimator='mean', hue='company', palette='viridis') # bar plot
plt.bar_label(ax.containers[0], label_type='center')
# tampilkan chart dan keterangan
st.pyplot(fig)
st.write('Dari sini kita melihat bahwa Brand dengan efisiensi bahan bakar terbaik adalah Audi, disusul dengan Hyundai, BMW dan Toyota. Semakin kecil rata-rata efisiensi bahan bakar, semakin irit atau hemat konsumsi bahan bakar sebuah mobil.')
st.markdown('---')
# judul chart 6
st.markdown("Efisiensi Berdasarkan Transmission
", unsafe_allow_html=True)
fig=plt.figure(figsize=(10,6))
ax = sns.barplot(data=dataset, x='transmission', y='mpg', estimator='mean', hue='transmission', palette='viridis') # barplot
plt.bar_label(ax.containers[0], label_type='center') # bar label
# tampilkan chart dan keterangan
st.pyplot(fig)
st.write('Disini kita bisa melihat bahwa Semi-Auto memiliki efisiensi yang paling baik di antara tipe transmissi lain.')
st.markdown('---')
# Judul chart 7
st.markdown("Data Distribution
", unsafe_allow_html=True)
# list nama kolom
cols = dataset[['price', 'mileage', 'tax', 'mpg', 'engineSize']]
# figur size
fig=plt.figure(figsize=(30,13))
# iterasi untuk membuat chart
for i, col in enumerate(cols):
plt.subplot(2,3, i+1) # subplot
sns.histplot(dataset[col], kde=True, bins=30) #histogram plot
plt.title(f' Distribusi {col} \nskewness: {dataset[col].skew():.4f}') # judul plot beserta skewness
plt.xticks(rotation=20)
st.pyplot(fig)
st.write('Terlihat hanya kolom tax yang memiliki skewness mendekati normal.')
st.markdown('---')
#judul chart 8
st.markdown("Korelasi antara numerik Variables
", unsafe_allow_html=True)
fig=plt.figure(figsize=(7,7))
sns.heatmap(numeric_data.corr("spearman"), annot=True, cmap='Blues')
st.pyplot(fig)
st.write('- Nilai korelasi terkuat terhadap price ada pada variable year dan engine Size.\n- Sedangkan variable yang paling lemah ada pada kolom Tax')
st.markdown('---')
#Judul chart 9
st.markdown("Linearitas antara price dengan variable lain
", unsafe_allow_html=True)
# list pair untuk scatter
pair = ['mileage', 'year','engineSize', 'mpg']
fig=plt.figure(figsize=(15,10)) # figure
for i, col in enumerate(pair):
plt.subplot(2,2,i+1)
sns.scatterplot(dataset, y='price', x=col)
plt.title(f'Korelasi antara price dan {col}')
st.pyplot(fig)
st.write("Dari chart di atas dapat dikatakan:\n- Semakin tinggi jarak tempuh (mileage) sebuah mobil, maka semakin murah harganya. Mobil dengan jarak tempuh yang sedikit, cenderung memiliki harga yang tinggi.\n- Semakin muda usia mobil, harga nya pun semakin mahal. \n- Untuk engineSize, tidak terlalu terlihat pola pada scatter. Namun, kita bisa sedikitnya melihat bahwa ada kecenderungan ketika engineSize semakin besar, maka harga cenderung lebih mahal.\n- Hubungan antara price dan mpg menunjukan bahwa semakin efisien konsumsi bahan bakar mobil, maka harga cenderung bisa lebih mahal")
st.markdown('---')
if __name__ == '__main__':
run()