Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import seaborn as sns | |
| import matplotlib.pyplot as plt | |
| df = pd.read_csv('src/addiction_population_data.csv') | |
| def eda1(): | |
| """ | |
| Visualisasi distribusi target (has_health_issues) dan menampilkan proporsi | |
| """ | |
| # Buat figure | |
| fig, ax = plt.subplots(figsize=(6, 4)) | |
| # Buat countplot | |
| sns.countplot( | |
| x='has_health_issues', | |
| data=df, | |
| palette='husl', | |
| ax=ax | |
| ) | |
| # Atur judul dan label | |
| ax.set_title('Distribusi Status Kesehatan', fontsize=14, pad=15) | |
| ax.set_xlabel('Status Kesehatan (0=Tidak, 1=Ya)', fontsize=12) | |
| ax.set_ylabel('Jumlah Sampel', fontsize=12) | |
| # Hitung dan simpan proporsi | |
| proporsi = df['has_health_issues'].value_counts(normalize=True) | |
| # Tambahkan anotasi jumlah di atas setiap bar | |
| for p in ax.patches: | |
| ax.annotate( | |
| f'{p.get_height()}', | |
| (p.get_x() + p.get_width()/2., p.get_height()), | |
| ha='center', | |
| va='center', | |
| xytext=(0, 10), | |
| textcoords='offset points', | |
| fontsize=11 | |
| ) | |
| # Tambahkan grid | |
| ax.grid(axis='y', linestyle='--', alpha=0.3) | |
| # Optimalkan layout | |
| plt.tight_layout() | |
| # Tampilkan figure dan proporsi | |
| plt.show() | |
| print("Proporsi:\n", proporsi) | |
| return fig | |
| def eda2(): | |
| """ | |
| Visualisasi distribusi usia berdasarkan status kesehatan | |
| """ | |
| # Buat figure | |
| fig, ax = plt.subplots(figsize=(8, 5)) | |
| # Buat boxplot | |
| sns.boxplot( | |
| x='has_health_issues', | |
| y='age', | |
| data=df, | |
| palette='husl', | |
| ax=ax, | |
| showmeans=True, | |
| meanprops={"marker":"o", "markerfacecolor":"white", "markeredgecolor":"black"} | |
| ) | |
| # Atur judul dan label | |
| ax.set_title('Distribusi Usia berdasarkan Status Kesehatan', fontsize=14, pad=15) | |
| ax.set_xlabel('Memiliki Masalah Kesehatan', fontsize=12) | |
| ax.set_ylabel('Usia', fontsize=12) | |
| # Format x-axis labels | |
| ax.set_xticklabels(['Tidak', 'Ya']) | |
| # Tambahkan grid | |
| ax.grid(axis='y', linestyle='--', alpha=0.3) | |
| # Optimalkan layout | |
| plt.tight_layout() | |
| return fig | |
| def eda3(): | |
| # def eda3(df, figsize=(10, 6), palette='husl', title=None): | |
| # Buat figure | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| # Buat KDE plot | |
| sns.kdeplot( | |
| data=df, | |
| x='annual_income_usd', | |
| hue='has_health_issues', | |
| fill=True, | |
| common_norm=False, | |
| alpha=0.5, | |
| palette='husl', | |
| ax=ax | |
| ) | |
| # Atur judul dan label | |
| plot_title = 'Distribusi Pendapatan Tahunan berdasarkan Status Kesehatan' | |
| ax.set_title(plot_title, fontsize=14, pad=15) | |
| ax.set_xlabel('Pendapatan Tahunan (USD)', fontsize=12) | |
| ax.set_ylabel('Density', fontsize=12) | |
| # Format legenda | |
| ax.legend( | |
| title='Memiliki Masalah Kesehatan', | |
| labels=['Tidak', 'Ya'], | |
| frameon=True, | |
| framealpha=0.8 | |
| ) | |
| # Tambahkan grid | |
| ax.grid(axis='both', linestyle='--', alpha=0.3) | |
| # Optimalkan layout | |
| plt.tight_layout() | |
| return fig | |
| def eda4(): | |
| # Buat figure dengan 2 subplot | |
| fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6)) | |
| # Plot 1: Merokok per hari | |
| sns.boxplot( | |
| x='has_health_issues', | |
| y='smokes_per_day', | |
| data=df, | |
| palette='husl', | |
| ax=ax1, | |
| showmeans=True, | |
| meanprops={"marker":"o", "markerfacecolor":"white", "markeredgecolor":"black"} | |
| ) | |
| ax1.set_title('Konsumsi Rokok per Hari berdasarkan Status Kesehatan', fontsize=14, pad=15) | |
| ax1.set_xlabel('Memiliki Masalah Kesehatan', fontsize=12) | |
| ax1.set_ylabel('Jumlah Rokok per Hari', fontsize=12) | |
| ax1.set_xticklabels(['Tidak', 'Ya']) | |
| ax1.grid(axis='y', linestyle='--', alpha=0.3) | |
| # Plot 2: Minum per minggu | |
| sns.boxplot( | |
| x='has_health_issues', | |
| y='drinks_per_week', | |
| data=df, | |
| palette='husl', | |
| ax=ax2, | |
| showmeans=True, | |
| meanprops={"marker":"o", "markerfacecolor":"white", "markeredgecolor":"black"} | |
| ) | |
| ax2.set_title('Konsumsi Alkohol per Minggu berdasarkan Status Kesehatan', fontsize=14, pad=15) | |
| ax2.set_xlabel('Memiliki Masalah Kesehatan', fontsize=12) | |
| ax2.set_ylabel('Jumlah Minuman per Minggu', fontsize=12) | |
| ax2.set_xticklabels(['Tidak', 'Ya']) | |
| ax2.grid(axis='y', linestyle='--', alpha=0.3) | |
| # Optimalkan layout | |
| plt.tight_layout() | |
| return fig | |
| def eda5(): | |
| # Pilih fitur numerik | |
| num_features = [ | |
| 'age', 'annual_income_usd', 'smokes_per_day', 'drinks_per_week', | |
| 'age_started_smoking', 'age_started_drinking', | |
| 'attempts_to_quit_smoking', 'attempts_to_quit_drinking', | |
| 'sleep_hours', 'bmi' | |
| ] | |
| # Hitung korelasi | |
| corr = df[num_features + ['has_health_issues']].corr() | |
| # Buat figure dan axes | |
| fig, ax = plt.subplots(figsize=(10, 8)) | |
| # Buat heatmap dengan berbagai pengaturan visual | |
| heatmap = sns.heatmap( | |
| corr, | |
| annot=True, | |
| cmap='coolwarm', | |
| center=0, | |
| fmt=".2f", # Format 2 digit desimal | |
| linewidths=0.5, | |
| linecolor='white', | |
| square=True, | |
| cbar_kws={"shrink": 0.8}, | |
| ax=ax | |
| ) | |
| # Atur judul dan font | |
| ax.set_title( | |
| 'Korelasi Fitur Numerik dengan Health Issues', | |
| fontsize=14, | |
| pad=20 | |
| ) | |
| # Rotasi label x-axis | |
| plt.xticks(rotation=45, ha='right') | |
| # Optimalkan layout | |
| plt.tight_layout() | |
| return fig | |
| def eda6(): | |
| # Hitung proporsi | |
| gender_rate = df.groupby('gender')['has_health_issues'].mean().reset_index() | |
| # Buat figure | |
| fig, ax = plt.subplots(figsize=(8, 5)) | |
| # Buat barplot | |
| barplot = sns.barplot( | |
| x='gender', | |
| y='has_health_issues', | |
| data=gender_rate, | |
| ax=ax, | |
| palette='pastel', # Warna yang lebih soft | |
| edgecolor='black' # Garis tepi untuk kontras | |
| ) | |
| # Atur judul dan label | |
| ax.set_title('Proporsi Health Issues Berdasarkan Gender', fontsize=14, pad=20) | |
| ax.set_xlabel('Gender', fontsize=12) | |
| ax.set_ylabel('Proporsi Health Issues', fontsize=12) | |
| # Atur y-axis limit | |
| ax.set_ylim(0, 1) | |
| # Tambahkan nilai persentase di atas setiap bar | |
| for p in ax.patches: | |
| height = p.get_height() | |
| ax.text( | |
| p.get_x() + p.get_width()/2., | |
| height + 0.02, | |
| f'{height:.1%}', | |
| ha='center', | |
| va='bottom', | |
| fontsize=12 | |
| ) | |
| # Tambahkan grid untuk kemudahan membaca | |
| ax.grid(axis='y', linestyle='--', alpha=0.7) | |
| # Optimalkan layout | |
| plt.tight_layout() | |
| return fig | |
| def eda7(): | |
| # Create figure with two subplots | |
| fig, axes = plt.subplots(2, 1, figsize=(10, 12)) | |
| # Plot 1: Countplot | |
| sns.countplot( | |
| x='social_support', | |
| hue='has_health_issues', | |
| data=df, | |
| ax=axes[0], | |
| order=['Weak', 'Moderate', 'Strong'] # Ensure consistent order | |
| ) | |
| axes[0].set_title('Distribusi Health Issues Berdasarkan Social Support', fontsize=14) | |
| axes[0].set_xlabel('Tingkat Social Support', fontsize=12) | |
| axes[0].set_ylabel('Jumlah Sampel', fontsize=12) | |
| axes[0].legend(title='Health Issues', loc='best') | |
| axes[0].grid(axis='y', linestyle='--', alpha=0.7) | |
| # Plot 2: Proportion plot | |
| prop = df.groupby('social_support')['has_health_issues'].mean().reset_index() | |
| sns.barplot( | |
| x='social_support', | |
| y='has_health_issues', | |
| data=prop, | |
| order=['Weak', 'Moderate', 'Strong'], | |
| ax=axes[1], | |
| palette='viridis' | |
| ) | |
| axes[1].set_title('Proporsi Health Issues per Tingkat Social Support', fontsize=14) | |
| axes[1].set_xlabel('Tingkat Social Support', fontsize=12) | |
| axes[1].set_ylabel('Proporsi Health Issues', fontsize=12) | |
| axes[1].set_ylim(0, 1) | |
| # Menambahkan label persentase di atas setiap bar | |
| for p in axes[1].patches: | |
| axes[1].annotate( | |
| f'{p.get_height():.2%}', | |
| (p.get_x() + p.get_width() / 2., p.get_height()), | |
| ha='center', va='center', | |
| xytext=(0, 10), | |
| textcoords='offset points', | |
| fontsize=10 | |
| ) | |
| axes[1].grid(axis='y', linestyle='--', alpha=0.7) | |
| # Adjust layout | |
| plt.tight_layout(pad=3.0) | |
| return fig |