Tujuan:
from google.colab import files
import pandas as pd
import numpy as np
import seaborn as sns #visualisation
import matplotlib.pyplot as plt #visualisation
import pickle
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.metrics import accuracy_score
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.model_selection import GridSearchCV
import time
%matplotlib inline
sns.set(color_codes=True)
from google.colab import drive
drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
df = pd.read_csv('/content/drive/MyDrive/B/Freelance/Project Waste Management - Braincore/metadata_cleaned.csv')
df.head()
| No | tanggal | hari | bulan | tahun | nopol | barang | supplier | netto_kg | jam | ... | admin | kelurahan | kecamatan | kabkot | curah_hujan_kecamatan | hari_hujan_kecamatan | Luas | Jml_RT | Jml_RW | Jml_penduduk | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 3 | 31/12/2023 | 31 | 12 | 2023 | AA 6249 XA | Sampah | dlh kota magelang | 300 | 15:31 | ... | Kurniawan BW | Kedungsari | Magelang Utara | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 |
| 1 | 4 | 31/12/2023 | 31 | 12 | 2023 | AA 8013 XA | Sampah | pasar rejowinangun | 550 | 15:15 | ... | Kurniawan BW | Rejowinangun Selatan | Magelang Selatan | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 |
| 2 | 5 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo tidar selatan | 2270 | 13:51 | ... | Kurniawan BW | Tidar Utara | Magelang Selatan | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 |
| 3 | 6 | 31/12/2023 | 31 | 12 | 2023 | AA 9574 FA | Sampah | dlh kota magelang | 500 | 11:49 | ... | Eksta Gama Pratama Y | Kedungsari | Magelang Utara | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 |
| 4 | 7 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo magersari | 1620 | 11:42 | ... | Eksta Gama Pratama Y | Magersari | Magelang Selatan | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 |
5 rows × 21 columns
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 60962 entries, 0 to 60961 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 No 60962 non-null int64 1 tanggal 60962 non-null object 2 hari 60962 non-null int64 3 bulan 60962 non-null int64 4 tahun 60962 non-null int64 5 nopol 60962 non-null object 6 barang 60962 non-null object 7 supplier 60962 non-null object 8 netto_kg 60962 non-null int64 9 jam 60962 non-null object 10 sopir 60962 non-null object 11 admin 60962 non-null object 12 kelurahan 60962 non-null object 13 kecamatan 60962 non-null object 14 kabkot 60962 non-null object 15 curah_hujan_kecamatan 60962 non-null float64 16 hari_hujan_kecamatan 60962 non-null float64 17 Luas 60962 non-null float64 18 Jml_RT 60962 non-null float64 19 Jml_RW 60962 non-null float64 20 Jml_penduduk 60962 non-null float64 dtypes: float64(6), int64(5), object(10) memory usage: 9.8+ MB
Tahapan df.info() bertujuan untuk memberikan informasi tentang DataFrame, seperti jumlah baris dan kolom, serta tipe data yang terdapat dalam setiap kolom. Hasilnya akan memberikan gambaran singkat tentang struktur data yang sedang Anda kerjakan.
Dari hasil diatas, terdapat 21 kolom dengan 60962 entri. Informasi seperti ini sangat berguna untuk memahami data yang sedang diolah.
df.isnull().sum()
No 0 tanggal 0 hari 0 bulan 0 tahun 0 nopol 0 barang 0 supplier 0 netto_kg 0 jam 0 sopir 0 admin 0 kelurahan 0 kecamatan 0 kabkot 0 curah_hujan_kecamatan 0 hari_hujan_kecamatan 0 Luas 0 Jml_RT 0 Jml_RW 0 Jml_penduduk 0 dtype: int64
Tahapan tersebut adalah untuk memeriksa apakah terdapat nilai-nilai null (kosong) dalam setiap kolom dari DataFrame df. Dengan menggunakan metode .isnull() pada DataFrame, kita dapat mengidentifikasi di mana saja nilai-nilai tersebut kosong, kemudian dengan metode .sum() kita menghitung jumlah nilai null di setiap kolom.
Hasilnya adalah bahwa tidak ada nilai null dalam setiap kolom DataFrame df, karena hasilnya adalah 0 untuk setiap kolom. Hal ini menunjukkan bahwa data yang dimiliki tidak mengandung nilai kosong, yang artinya data tersebut lengkap (tidak ada yang hilang) dan siap untuk dianalisis atau diproses lebih lanjut.
df_cleaned = df.drop(columns=["No", "tanggal","jam","nopol", "sopir","admin","kabkot"])
Tahapan di atas bertujuan untuk membersihkan DataFrame (df) dengan menghapus kolom-kolom yang tidak digunakan atau tidak diperlukan untuk analisis lebih lanjut. Kolom yang dihapus adalah "No", "tanggal", "jam", "nopol", "sopir", "admin", dan "kabkot".
Hasilnya adalah DataFrame baru yang disebut df_cleaned, yang berisi data yang lebih ringkas dan relevan, tanpa kolom-kolom yang telah dihapus. Ini membantu mempercepat analisis data dan mengurangi kompleksitas yang tidak perlu.
df_cleaned = df_cleaned.dropna()
Tahapan di atas bertujuan untuk menghapus baris dari DataFrame df_cleaned yang mengandung nilai-nilai yang hilang (NaN). Hasilnya adalah DataFrame baru yang telah dibersihkan dari baris-baris yang memiliki nilai yang hilang.
df_cleaned.isnull().sum()
hari 0 bulan 0 tahun 0 barang 0 supplier 0 netto_kg 0 kelurahan 0 kecamatan 0 curah_hujan_kecamatan 0 hari_hujan_kecamatan 0 Luas 0 Jml_RT 0 Jml_RW 0 Jml_penduduk 0 dtype: int64
df_cleaned.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 60962 entries, 0 to 60961 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 hari 60962 non-null int64 1 bulan 60962 non-null int64 2 tahun 60962 non-null int64 3 barang 60962 non-null object 4 supplier 60962 non-null object 5 netto_kg 60962 non-null int64 6 kelurahan 60962 non-null object 7 kecamatan 60962 non-null object 8 curah_hujan_kecamatan 60962 non-null float64 9 hari_hujan_kecamatan 60962 non-null float64 10 Luas 60962 non-null float64 11 Jml_RT 60962 non-null float64 12 Jml_RW 60962 non-null float64 13 Jml_penduduk 60962 non-null float64 dtypes: float64(6), int64(4), object(4) memory usage: 6.5+ MB
df_cleaned.groupby('kelurahan').size().sort_values(ascending = False).head(20)
kelurahan Kedungsari 16818 Potrobangsan 6107 Kramat Utara 4264 Magersari 4145 - 3751 Kemiri Rejo 2435 Rejowinangun Selatan 2417 Tidar Utara 2398 Tidar Selatan 2359 Wates 2063 Jurangombo Utara 1999 Magelang 1984 Kramat Selatan 1979 Jurangombo Selatan 1761 Panjang 1744 Jurangombo 1496 Gelangan 1264 Jurangombo UTara 944 Cacaban 551 Rejowinangun Utara 483 dtype: int64
Tahapan di atas merupakan proses pengelompokkan data berdasarkan kelurahan pada DataFrame df_cleaned, kemudian menghitung jumlah entri data yang memiliki kelurahan yang sama, dan akhirnya diurutkan dari yang terbanyak ke yang terendah.
Tujuan dari tahapan ini adalah untuk mengetahui distribusi data berdasarkan kelurahan dan mengidentifikasi kelurahan-kelurahan dengan jumlah entri data terbanyak.
Dari hasil analisis singkat di atas, dapat dilihat bahwa:
df_cleaned.groupby('kecamatan').size().sort_values(ascending = False).head(20)
kecamatan Magelang Utara 32844 Magelang Selatan 17738 Magelang Tengah 10380 dtype: int64
df_cleaned.groupby('barang').size().sort_values(ascending = False).head(60)
barang Sampah 59487 Sampah Terpilah 1468 0 7 dtype: int64
df_cleaned['kelurahan'] = df_cleaned['kelurahan'].replace('-', 'daerah lainnya')
df_filtered = df_cleaned.copy()
EDA atau Exploratory Data Analysis adalah sebuah proses investigasi awal pada data untuk menemukan pola, kecenderungan, anomali, atau insight-insight awal yang mungkin tersembunyi di dalamnya. Tujuannya adalah untuk memahami struktur dan karakteristik data sebelum melakukan analisis yang lebih mendalam atau membangun model.
statistics_data = []
for column in df_filtered.columns:
if df_filtered[column].dtype in ['int64', 'float64']:
column_stats = {
"Nama Kolom": column,
"Mean": df_filtered[column].mean(),
"Median": df_filtered[column].median(),
"Skewness": df_filtered[column].skew()
}
statistics_data.append(column_stats)
# Dataframe yang menampung Statitics Data
statistics_df = pd.DataFrame(statistics_data)
Tahapan di atas bertujuan untuk melakukan distribusi data pada DataFrame df_filtered. Proses ini dilakukan dengan mengiterasi setiap kolom dalam DataFrame, dan jika tipe data kolom adalah numerik (int64 atau float64), maka statistik seperti mean (rata-rata), median, dan skewness (skewness) dihitung untuk kolom tersebut. Hasil statistik kemudian disimpan dalam bentuk dictionary dan ditambahkan ke dalam list statistics_data.
Selanjutnya, list statistics_data digunakan untuk membuat DataFrame statistics_df, yang akan menampung semua statistik yang telah dihitung untuk setiap kolom numerik dalam DataFrame df_filtered.
Analisis singkat dari hasil ini dapat memberikan wawasan tentang distribusi data secara umum. Mean menunjukkan pusat massa data, median merepresentasikan nilai tengah dari data, dan skewness mengindikasikan seberapa condong distribusi data dari distribusi normal. Dengan menganalisis statistik ini, kita dapat memahami apakah data memiliki kecondongan (skewness) atau adanya pencilan (outliers), serta mendapatkan gambaran umum tentang bagaimana data tersebar.
statistics_df
| Nama Kolom | Mean | Median | Skewness | |
|---|---|---|---|---|
| 0 | hari | 15.882730 | 16.00 | -0.007126 |
| 1 | bulan | 6.494767 | 7.00 | -0.038623 |
| 2 | tahun | 2020.960287 | 2021.00 | 0.055451 |
| 3 | netto_kg | 1314.508087 | 1000.00 | 1.132437 |
| 4 | curah_hujan_kecamatan | 238.502897 | 211.00 | 1.052124 |
| 5 | hari_hujan_kecamatan | 15.264017 | 17.00 | -0.756171 |
| 6 | Luas | 6.314622 | 6.29 | -0.637359 |
| 7 | Jml_RT | 319.291493 | 306.00 | 2.251425 |
| 8 | Jml_RW | 55.289016 | 49.00 | 0.976135 |
| 9 | Jml_penduduk | 42579.514353 | 42224.00 | 0.726480 |
statistics_df['Nama Kolom'].unique() # Untuk melihat kolom apa saja yang ada
array(['hari', 'bulan', 'tahun', 'netto_kg', 'curah_hujan_kecamatan',
'hari_hujan_kecamatan', 'Luas', 'Jml_RT', 'Jml_RW', 'Jml_penduduk'],
dtype=object)
# Membuat histogram dari kolom 'netto_kg'
plt.hist(df_filtered['netto_kg'], bins=30, color='skyblue', edgecolor='black')
plt.title('Histogram dari Kolom netto_kg')
plt.xlabel('Nilai netto_kg')
plt.ylabel('Frekuensi')
plt.grid(True)
plt.show()
Tahapan di atas bertujuan untuk membuat histogram dari kolom 'netto_kg' dalam dataset 'df_filtered'. Histogram ini membantu dalam visualisasi distribusi data dari kolom tersebut.
Analisis singkat hasilnya menunjukkan bahwa distribusi data 'netto_kg' cenderung tidak normal atau memiliki skewness. Hal ini terlihat dari bentuk histogram yang tidak simetris, mungkin cenderung miring ke salah satu sisi. Skewness ini bisa memberikan petunjuk tentang asimetri dalam data, yang penting untuk dipertimbangkan dalam analisis statistik lebih lanjut.
Catatan :
Distribusi data mengacu pada cara nilai-nilai dalam dataset didistribusikan atau tersebar. Tujuannya adalah untuk memahami pola dan karakteristik fundamental dari data tersebut. Distribusi data memberikan informasi tentang seberapa sering nilai-nilai tertentu muncul, sebaran relatif antara nilai-nilai, serta kecenderungan keseluruhan dari data tersebut.
import pandas as pd
# Assuming df is your DataFrame
outliers_data = []
for column in df_filtered.columns:
if df[column].dtype in ['int64', 'float64']:
Q1 = df_filtered[column].quantile(0.25)
Q3 = df_filtered[column].quantile(0.75)
IQR = Q3 - Q1
lower_fence = Q1 - 1.5 * IQR
upper_fence = Q3 + 1.5 * IQR
column_outliers = df_filtered[(df_filtered[column] < lower_fence) | (df_filtered[column] > upper_fence)]
outliers_data.append({
"Nama Kolom": column,
"Outliers Count": len(column_outliers),
})
# Create a new DataFrame for the outliers
outliers_df = pd.DataFrame(outliers_data)
outliers_df
| Nama Kolom | Outliers Count | |
|---|---|---|
| 0 | hari | 0 |
| 1 | bulan | 0 |
| 2 | tahun | 0 |
| 3 | netto_kg | 2663 |
| 4 | curah_hujan_kecamatan | 2871 |
| 5 | hari_hujan_kecamatan | 0 |
| 6 | Luas | 17337 |
| 7 | Jml_RT | 6438 |
| 8 | Jml_RW | 0 |
| 9 | Jml_penduduk | 21941 |
Tahapan di atas bertujuan untuk menemukan outlier dalam set data Anda. Outlier adalah nilai yang secara signifikan berbeda dari sebagian besar data dalam sebuah dataset. Metode yang digunakan dalam tahapan ini adalah menggunakan metode IQR (Interquartile Range) untuk mengidentifikasi outlier dalam kolom-kolom numerik dari DataFrame Anda.
Hasil analisis menunjukkan jumlah outlier dalam setiap kolom numerik. Dari hasil tersebut, dapat disimpulkan bahwa:
Dengan mengetahui outlier dalam dataset, Anda dapat memutuskan apakah Anda ingin menghapusnya atau mengambil tindakan lain, seperti melakukan transformasi data, untuk menangani dampak outlier tersebut pada analisis Anda.
df_filtered.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 60962 entries, 0 to 60961 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 hari 60962 non-null int64 1 bulan 60962 non-null int64 2 tahun 60962 non-null int64 3 barang 60962 non-null object 4 supplier 60962 non-null object 5 netto_kg 60962 non-null int64 6 kelurahan 60962 non-null object 7 kecamatan 60962 non-null object 8 curah_hujan_kecamatan 60962 non-null float64 9 hari_hujan_kecamatan 60962 non-null float64 10 Luas 60962 non-null float64 11 Jml_RT 60962 non-null float64 12 Jml_RW 60962 non-null float64 13 Jml_penduduk 60962 non-null float64 dtypes: float64(6), int64(4), object(4) memory usage: 6.5+ MB
df_encoded = pd.get_dummies(df_filtered)
Langkah yang Anda lakukan di atas adalah melakukan one-hot encoding menggunakan fungsi pd.get_dummies() dari library pandas di Python. Tujuan dari tahapan ini adalah untuk mengubah variabel kategori menjadi representasi numerik yang dapat digunakan oleh model machine learning, terutama jika model tersebut membutuhkan input dalam bentuk numerik.
Misalnya, jika Anda memiliki kolom "warna" dengan nilai seperti "merah", "biru", dan "hijau", dengan one-hot encoding, kolom ini akan dipecah menjadi tiga kolom terpisah: "warna_merah", "warna_biru", dan "warna_hijau". Setiap baris akan memiliki nilai 1 di kolom yang sesuai dengan warna yang ada, dan nilai 0 di kolom lainnya.
Analisis hasilnya mencakup peningkatan jumlah kolom dari 14 menjadi 91. Hal ini menunjukkan bahwa terdapat banyak variabel kategori yang berbeda dalam dataset yang Anda proses. Namun, perlu diingat bahwa peningkatan jumlah kolom ini dapat memperkenalkan masalah yang dikenal sebagai "curse of dimensionality" jika jumlah kolom menjadi terlalu besar dibandingkan dengan jumlah sampel yang tersedia. Oleh karena itu, penting untuk mempertimbangkan trade-off antara representasi yang lebih kaya dan kompleksitas yang lebih tinggi dalam model.
df_encoded.head()
| hari | bulan | tahun | netto_kg | curah_hujan_kecamatan | hari_hujan_kecamatan | Luas | Jml_RT | Jml_RW | Jml_penduduk | ... | kelurahan_Potrobangsan | kelurahan_Rejowinangun Selatan | kelurahan_Rejowinangun Utara | kelurahan_Tidar Selatan | kelurahan_Tidar Utara | kelurahan_Wates | kelurahan_daerah lainnya | kecamatan_Magelang Selatan | kecamatan_Magelang Tengah | kecamatan_Magelang Utara | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 31 | 12 | 2023 | 300 | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 31 | 12 | 2023 | 550 | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | ... | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 2 | 31 | 12 | 2023 | 2270 | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | ... | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 3 | 31 | 12 | 2023 | 500 | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 4 | 31 | 12 | 2023 | 1620 | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
5 rows × 91 columns
Standarisasi adalah proses dalam statistika dan analisis data yang mengubah distribusi data sehingga memiliki mean (rata-rata) 0 dan standar deviasi (varians) 1. Tujuan utamanya adalah untuk membuat data lebih mudah diinterpretasikan dan diolah oleh berbagai algoritma pembelajaran mesin.
scaler = StandardScaler() #Object Scaler
cols = df_encoded.columns
X_scaled_data_std = scaler.fit_transform(df_encoded)
X_scaled_data_std = pd.DataFrame(X_scaled_data_std, columns = [cols])
# original_data = scaler.inverse_transform(scaled_data)
X_scaled_data_std.head()
| hari | bulan | tahun | netto_kg | curah_hujan_kecamatan | hari_hujan_kecamatan | Luas | Jml_RT | Jml_RW | Jml_penduduk | ... | kelurahan_Potrobangsan | kelurahan_Rejowinangun Selatan | kelurahan_Rejowinangun Utara | kelurahan_Tidar Selatan | kelurahan_Tidar Utara | kelurahan_Wates | kelurahan_daerah lainnya | kecamatan_Magelang Selatan | kecamatan_Magelang Tengah | kecamatan_Magelang Utara | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1.737241 | 1.619788 | 1.430385 | -1.000922 | -0.164377 | 0.232457 | -0.046968 | -0.473278 | -0.628521 | -0.112817 | ... | -0.333661 | -0.203186 | -0.089366 | -0.200634 | -0.202353 | -0.187153 | -0.256055 | -0.640604 | -0.453003 | 0.925261 |
| 1 | 1.737241 | 1.619788 | 1.430385 | -0.754270 | -0.164377 | 0.232457 | -0.046968 | -0.473278 | -0.628521 | -0.112817 | ... | -0.333661 | 4.921603 | -0.089366 | -0.200634 | -0.202353 | -0.187153 | -0.256055 | 1.561026 | -0.453003 | -1.080776 |
| 2 | 1.737241 | 1.619788 | 1.430385 | 0.942696 | -0.164377 | 0.232457 | -0.046968 | -0.473278 | -0.628521 | -0.112817 | ... | -0.333661 | -0.203186 | -0.089366 | -0.200634 | 4.941864 | -0.187153 | -0.256055 | 1.561026 | -0.453003 | -1.080776 |
| 3 | 1.737241 | 1.619788 | 1.430385 | -0.803601 | -0.164377 | 0.232457 | -0.046968 | -0.473278 | -0.628521 | -0.112817 | ... | -0.333661 | -0.203186 | -0.089366 | -0.200634 | -0.202353 | -0.187153 | -0.256055 | -0.640604 | -0.453003 | 0.925261 |
| 4 | 1.737241 | 1.619788 | 1.430385 | 0.301401 | -0.164377 | 0.232457 | -0.046968 | -0.473278 | -0.628521 | -0.112817 | ... | -0.333661 | -0.203186 | -0.089366 | -0.200634 | -0.202353 | -0.187153 | -0.256055 | 1.561026 | -0.453003 | -1.080776 |
5 rows × 91 columns
Tahapan di atas adalah proses standarisasi atau normalisasi data menggunakan StandardScaler dari library scikit-learn di Python. Tujuannya adalah untuk membuat semua fitur dalam dataset memiliki mean (rata-rata) 0 dan varians (standar deviasi) 1, dengan asumsi bahwa data terdistribusi secara normal.
Analisis hasilnya adalah sebagai berikut:
scaler = StandardScaler(): Membuat objek StandardScaler yang akan digunakan untuk proses standarisasi.
cols = df_encoded.columns: Mengambil nama kolom dari dataframe yang akan di-standarisasi.
X_scaled_data_std = scaler.fit_transform(df_encoded): Melakukan proses standarisasi terhadap dataframe df_encoded menggunakan objek scaler yang telah dibuat sebelumnya.
X_scaled_data_std = pd.DataFrame(X_scaled_data_std, columns = [cols]): Mengonversi hasil standarisasi ke dalam dataframe baru dengan nama kolom yang sama seperti dataframe asli.
Hasil analisisnya adalah data sekarang sudah terstandarisasi, dengan mean mendekati 0 dan standar deviasi mendekati 1 untuk setiap fitur. Standarisasi ini mempermudah proses pemodelan karena memastikan semua fitur memiliki skala yang serupa, yang dapat meningkatkan kinerja algoritma pembelajaran mesin yang sensitif terhadap skala, seperti regresi logistik dan support vector machines.
import pandas as pd
# Assuming df is your DataFrame
outliers_data = []
for column in X_scaled_data_std.columns:
if X_scaled_data_std[column].dtype in ['int64', 'float64']:
Q1 = X_scaled_data_std[column].quantile(0.25)
Q3 = X_scaled_data_std[column].quantile(0.75)
IQR = Q3 - Q1
lower_fence = Q1 - 1.5 * IQR
upper_fence = Q3 + 1.5 * IQR
column_outliers = X_scaled_data_std[(X_scaled_data_std[column] < lower_fence) | (X_scaled_data_std[column] > upper_fence)]
outliers_data.append({
"Nama Kolom": column,
"Outliers Count": len(column_outliers),
})
# Create a new DataFrame for the outliers
outliers_df = pd.DataFrame(outliers_data)
outliers_df = outliers_df.sort_values(by = 'Outliers Count', ascending = False)
outliers_df.head(5)
| Nama Kolom | Outliers Count | |
|---|---|---|
| 9 | (Jml_penduduk,) | 21941 |
| 6 | (Luas,) | 17337 |
| 89 | (kecamatan_Magelang Tengah,) | 10380 |
| 7 | (Jml_RT,) | 6438 |
| 81 | (kelurahan_Potrobangsan,) | 6107 |
Hasil analisis menunjukkan bahwa kolom dengan jumlah outlier tertinggi adalah "(Jml_penduduk)" dengan 21941 outlier, diikuti oleh "(Luas)" dengan 17337 outlier. Hal ini mengindikasikan bahwa ada variasi yang signifikan dalam data populasi dan luas wilayah.
Selanjutnya, kolom "(kecamatan_Magelang Tengah)" dan "(kelurahan_Potrobangsan)" juga memiliki jumlah outlier yang cukup tinggi, masing-masing 10380 dan 6107. Ini menunjukkan bahwa ada kecenderungan terhadap kecamatan dan kelurahan tertentu dalam hal distribusi outlier.
PCA (Principal Component Analysis) adalah salah satu teknik reduksi dimensi yang umum digunakan dalam analisis data dan machine learning. Tujuan utamanya adalah untuk mengurangi jumlah dimensi dalam dataset yang kompleks, sementara mempertahankan sebagian besar informasi yang relevan. Hal ini dilakukan dengan mentransformasikan data asli ke dalam ruang dimensi yang lebih rendah yang disebut sebagai "komponen utama" atau "principal components".
Proses PCA mengidentifikasi sumbu (komponen) yang paling menjelaskan variasi dalam data. Komponen utama pertama mencakup sebagian besar variasi dalam data, diikuti oleh komponen kedua, dan seterusnya. Setiap komponen utama bersifat ortogonal satu sama lain, yang berarti bahwa mereka saling independen.
from sklearn.decomposition import PCA
# Initialize the PCA model with the desired number of components
pca = PCA(n_components=0.95)
# Fit and transform the data
transformed_data = pca.fit_transform(X_scaled_data_std)
# Buat DataFrame dengan kolom PCA-1, PCA-2, dst.
column_names = [f'PCA-{i}' for i in range(1, transformed_data.shape[1] + 1)]
hasil_pca_sklearn = pd.DataFrame(data=transformed_data, columns=column_names)
hasil_pca_sklearn.head()
| PCA-1 | PCA-2 | PCA-3 | PCA-4 | PCA-5 | PCA-6 | PCA-7 | PCA-8 | PCA-9 | PCA-10 | ... | PCA-47 | PCA-48 | PCA-49 | PCA-50 | PCA-51 | PCA-52 | PCA-53 | PCA-54 | PCA-55 | PCA-56 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | -2.286949 | 0.736926 | -1.310911 | -0.884290 | -0.443379 | 1.169718 | 0.022408 | 0.040643 | -0.075161 | -0.008854 | ... | 0.006965 | -0.020001 | 0.048608 | -0.072611 | -0.026989 | 0.002383 | 0.014766 | 0.016623 | 0.056513 | -0.181177 |
| 1 | 0.575569 | -2.496381 | 0.084899 | -0.711203 | 0.992983 | 0.266497 | -2.070677 | 3.894944 | 4.875441 | -0.167587 | ... | 0.033313 | -0.014045 | 0.033633 | -0.037469 | -0.013603 | 0.015330 | 0.018388 | 0.016054 | 0.107348 | -0.188435 |
| 2 | 0.623831 | -2.343033 | -0.175585 | 0.675305 | 3.924035 | 1.765501 | -0.800081 | -0.901694 | -1.703283 | -0.073674 | ... | -0.114073 | -0.273931 | 0.099795 | -0.084702 | -0.014535 | 0.039679 | -0.062378 | -0.076110 | 0.179647 | 0.010074 |
| 3 | -2.251747 | 0.723166 | -1.314789 | -0.794007 | -0.457082 | 1.188886 | 0.022294 | 0.041565 | -0.075121 | -0.009827 | ... | 0.006887 | -0.019975 | 0.048628 | -0.072716 | -0.027084 | 0.002209 | 0.014742 | 0.016588 | 0.055460 | -0.180175 |
| 4 | 0.905775 | -2.704136 | 0.106623 | 0.465027 | -0.321516 | 0.415130 | 3.979735 | -1.768592 | 1.328323 | -0.144586 | ... | -0.034783 | -0.118073 | 0.090274 | 0.023513 | 0.008436 | 0.027890 | 0.069029 | -0.011557 | -0.428312 | -0.441646 |
5 rows × 56 columns
Tahapan di atas adalah proses reduksi dimensi menggunakan analisis komponen utama (PCA) dengan menggunakan pustaka scikit-learn di Python.
Inisialisasi Model PCA: PCA diinisialisasi dengan parameter n_components=0.95, yang berarti PCA akan mempertahankan jumlah komponen yang cukup untuk menjelaskan minimal 95% variansi dalam data asli.
Fit and Transform: Data yang telah di-preprocessed (X_scaled_data_std) kemudian difit dan ditransformasikan menggunakan model PCA yang telah diinisialisasi. Proses ini akan menghasilkan data baru yang merupakan proyeksi dari data asli ke ruang fitur yang lebih rendah dimensi.
Membuat DataFrame: Data hasil transformasi PCA disimpan dalam DataFrame dengan kolom yang diberi nama 'PCA-1', 'PCA-2', dst. Ini memungkinkan untuk menganalisis data yang sudah direduksi dimensinya.
Hasil dari tahapan ini adalah data yang telah direduksi dimensinya dan diproyeksikan ke dalam ruang fitur yang lebih rendah. Dengan mengambil hanya 95% variansi dari data asli, kita dapat mengurangi kompleksitas data sambil mempertahankan informasi yang signifikan. Hal ini dapat memudahkan analisis dan mempercepat proses pembelajaran mesin atau pemodelan statistik berikutnya.
K-Means Clustering adalah algoritma unsupervised learning yang digunakan untuk mengelompokkan data menjadi beberapa kelompok berdasarkan kesamaan karakteristiknya. Tujuan utama dari K-Means Clustering adalah untuk membagi data menjadi kelompok yang homogen, di mana setiap titik data dalam kelompok memiliki kesamaan tertentu dan titik data di antara kelompok memiliki perbedaan yang signifikan.
Dalam proyek Analisis Klaster dalam Pengelolaan Sampah di Kota Magelang, K-Means Clustering dapat digunakan untuk mengidentifikasi penyumbang sampah terpilah dan non-terpilah terbanyak. Beberapa langkah yang mungkin dilakukan dalam proyek ini adalah:
Pemilihan Fitur: Fitur-fitur yang relevan seperti jenis sampah, jumlah sampah, lokasi penghasil sampah, dan lain-lain dapat dipilih sebagai masukan untuk algoritma K-Means.
Preprocessing Data: Data yang dikumpulkan dari berbagai sumber perlu dipreprocessing terlebih dahulu, termasuk menghapus data yang tidak relevan, menangani nilai yang hilang, dan melakukan scaling jika diperlukan.
Penerapan K-Means: Algoritma K-Means akan diterapkan pada data yang telah dipreprocessing untuk mengelompokkan penghasil sampah ke dalam kelompok-kelompok berdasarkan kesamaan karakteristiknya.
Analisis Hasil: Setelah pengelompokan dilakukan, analisis dilakukan untuk memahami karakteristik masing-masing kelompok. Hal ini dapat membantu dalam mengidentifikasi penyumbang sampah terpilah dan non-terpilah terbanyak di Kota Magelang.
Dengan menggunakan K-Means Clustering, dapat diharapkan bahwa proyek Analisis Klaster dalam Pengelolaan Sampah dapat memberikan wawasan yang berharga bagi pihak yang terlibat dalam pengelolaan sampah di kota tersebut, seperti pemerintah daerah, lembaga lingkungan, dan masyarakat umum.
from sklearn.cluster import KMeans
inersia_values = []
for i in range(1, 16):
kmeans_std = KMeans(n_clusters = i, init = 'k-means++', n_init = 'auto', max_iter = 500, tol = 0.0001)
kmeans_std.fit(transformed_data)
inersia_values.append(kmeans_std.inertia_)
inersia_values
[5271270.035740352, 5131165.894359691, 5031317.03969268, 4838981.128236856, 4644537.79546481, 4619557.649490674, 4438874.476294214, 4299005.693560923, 4188074.5779152345, 4051333.644232177, 3894325.5683385585, 3752001.685744552, 3508539.249921481, 3443415.571620225, 3430408.868824492]
Inertia adalah salah satu metrik evaluasi yang digunakan dalam k-means clustering untuk mengukur seberapa baik klaster yang dihasilkan oleh model secara internal. Ini mengukur seberapa dekat setiap titik data dalam sebuah klaster dengan pusat klasternya. Semakin rendah nilai inertia, semakin baik klaster yang dihasilkan oleh model.
Dalam kode yang Anda berikan, kita menghitung inertia untuk setiap jumlah klaster dari 1 hingga 15. Ini dilakukan dengan menginisialisasi model k-means untuk setiap jumlah klaster, melatih model pada data yang telah diproses menggunakan PCA (Principal Component Analysis), dan kemudian mengukur inertia dari klaster yang dihasilkan.
Hasilnya menunjukkan bahwa semakin banyak klaster yang digunakan, semakin rendah nilai inertia-nya. Ini adalah hasil yang diharapkan, karena dengan menambah jumlah klaster, model k-means memiliki lebih banyak fleksibilitas untuk menyesuaikan diri dengan pola yang kompleks dalam data. Namun, perlu diingat bahwa penurunan inertia tidak selalu menandakan peningkatan yang signifikan dalam kualitas klaster. Penting untuk mempertimbangkan trade-off antara kompleksitas model dan interpretasi hasil klaster.
# Plot Elbow Method with Labels
plt.figure(figsize=(10, 6))
plt.plot(range(1, 16), inersia_values, marker='o', linestyle='-', color='b')
# Menambahkan label untuk setiap titik data
for i, inertia in enumerate(inersia_values):
plt.text(i + 1.2, inertia, f'{inertia:.2f}', ha='left', va='bottom', fontsize=10)
plt.title('Elbow Method for Optimal Clusters', fontsize=16)
plt.xlabel('Number of Clusters', fontsize=14)
plt.ylabel('Inertia Value', fontsize=14)
plt.xticks(range(1, 16))
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()
Kode diatas digunakan untuk membuat visualisasi yang disebut "Elbow Method" untuk menemukan jumlah cluster yang optimal dalam algoritma KMeans. Berikut adalah penjelasan singkat dan tujuannya:
Visualisasi Elbow Method: Grafik menunjukkan jumlah cluster (sumbu x) terhadap nilai inersia (sumbu y). Inersia adalah ukuran seberapa jauh titik-titik data dalam sebuah cluster dari pusatnya. Semakin rendah nilai inersia, semakin "padat" atau "bersatu" cluster tersebut.
Tujuan: Elbow Method membantu kita menemukan jumlah cluster yang optimal untuk algoritma KMeans dengan melihat di mana ada "siku" pada grafik. Siku ini menunjukkan di mana penurunan nilai inersia mulai melambat secara signifikan. Jumlah cluster di sekitar siku ini seringkali dipilih sebagai jumlah cluster yang optimal, karena menambahkan lebih banyak cluster mungkin tidak memberikan manfaat yang signifikan dalam memahami struktur data.
Grafik juga menampilkan label yang menunjukkan nilai inersia pada setiap titik data, sehingga kita bisa melihat dengan tepat di mana penurunan inersia mulai melambat. Dengan menggunakan informasi ini, kita bisa membuat keputusan yang lebih baik tentang jumlah cluster yang akan digunakan dalam analisis clustering kita.
data = transformed_data.copy()
# Apply K-means clustering
km_2_pca = KMeans(n_clusters = 5,random_state=42, init = 'k-means++', n_init = 'auto', max_iter = 500, tol = 0.0001)
km_2_pca.fit(hasil_pca_sklearn)
predicted_labels = km_2_pca.labels_
predicted_labels
array([1, 2, 2, ..., 1, 1, 1], dtype=int32)
km_2_pca.cluster_centers_[:, 0], km_2_pca.cluster_centers_[:, 1]
(array([ 2.15667261, -0.71425583, 1.35234738, 3.33890378, 1.17086794]), array([-3.41945694, 1.10286539, -2.86655097, 2.94056511, -2.82957173]))
Kode diatas melakukan KMeans clustering pada data yang sudah diproses menggunakan PCA (Principal Component Analysis). Mari kita jelaskan setiap langkahnya:
Pemilihan Jumlah Cluster: Pada kode yang Anda berikan, jumlah cluster yang dipilih adalah 5 (n_clusters = 5). Ini berarti algoritma KMeans akan mengelompokkan data menjadi lima kelompok berbeda.
Inisialisasi KMeans: Objek KMeans didefinisikan dengan parameter yang diberikan, seperti jumlah cluster, metode inisialisasi centroid (init), jumlah iterasi maksimum (max_iter), dan toleransi untuk konvergensi (tol).
Pelatihan Model: KMeans dilatih pada data yang telah diproses menggunakan PCA. Ini berarti KMeans akan mencoba menemukan lima kelompok data yang memiliki variabilitas terkecil dalam setiap kelompok dan jarak yang maksimum antara kelompok-kelompok tersebut.
Prediksi Labels: Setelah pelatihan, KMeans akan mengembalikan label untuk setiap titik data, menandakan keanggotaannya dalam salah satu dari lima kelompok yang telah ditentukan.
Pusat Cluster: Anda juga mencetak pusat-pusat dari kelima cluster yang ditemukan oleh KMeans. Ini memberikan Anda pemahaman tentang di mana pusat-pusat cluster tersebut berada dalam ruang fitur yang telah direduksi oleh PCA.
Tujuan utama dari KMeans clustering adalah untuk mengelompokkan data ke dalam beberapa kelompok yang homogen berdasarkan pola yang ada dalam data. Dalam konteks yang lebih luas, KMeans clustering dapat membantu dalam pemahaman pola yang tersembunyi dalam data, segmentasi pelanggan, pemrosesan gambar, analisis teks, dan banyak aplikasi lainnya. Dalam kasus ini, mungkin tujuannya adalah untuk mengelompokkan data menjadi lima kelompok yang berbeda berdasarkan pola yang ada dalam data yang telah diproses dengan PCA.
# Create a larger figure
plt.figure(figsize=(15, 12))
# Plot the K-means clustered data points
plt.scatter(data[:, 0], data[:, 1], c=predicted_labels, cmap='viridis', edgecolor='k', s=50, alpha=0.8, label='Original Data')
# Plot the cluster centers
plt.scatter(km_2_pca.cluster_centers_[:, 0], km_2_pca.cluster_centers_[:, 1], c='red', marker='X', s=200, label='Cluster Centers')
# Add labels and title
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('K-means Clustering with PCA')
# Show the legend
plt.legend()
# Show the plot
plt.show()
Kode tersebut adalah untuk membuat sebuah plot yang menampilkan hasil dari algoritma K-means clustering yang diterapkan pada data yang telah direduksi dimensinya menggunakan metode Principal Component Analysis (PCA).
Penjelasan komponen-komponen utama dari plot ini adalah sebagai berikut:
Scatter Plot Data Asli: Data asli direpresentasikan dalam scatter plot, di mana setiap titik mewakili satu sampel data. Warna titik-titik ini ditentukan oleh label yang diberikan oleh algoritma K-means clustering.
Cluster Centers: Titik-titik merah dengan simbol 'X' menunjukkan pusat dari masing-masing cluster yang diidentifikasi oleh algoritma K-means.
Axis Label dan Title: Label sumbu x dan y menunjukkan bahwa sumbu tersebut mewakili komponen utama 1 dan 2 dari hasil PCA. Judul plot memberikan informasi tentang jenis clustering yang dilakukan dan teknik reduksi dimensi yang digunakan.
Legend: Legend (keterangan) menunjukkan label yang diberikan kepada masing-masing kategori data, yaitu data asli dan pusat-pusat klaster.
Tujuan dari plot ini adalah untuk memberikan visualisasi yang jelas tentang bagaimana algoritma K-means clustering berhasil mengelompokkan data ke dalam cluster-cluster yang terpisah, sambil mempertahankan struktur dasar dari data yang asli melalui penggunaan reduksi dimensi dengan PCA. Visualisasi ini membantu dalam pemahaman tentang pola dan struktur data yang ada, serta efektivitas clustering.
# Tambahkan kolom 'cluster' ke DataFrame 'data'
df_filtered['cluster'] = km_2_pca.labels_
Kode ini menambahkan kolom baru bernama 'cluster' ke dalam DataFrame 'df_filtered', yang berisi label klaster yang ditugaskan oleh algoritma K-means dengan menggunakan model yang telah ditransformasi menggunakan PCA.
df_filtered.groupby('cluster').count()
| hari | bulan | tahun | barang | supplier | netto_kg | kelurahan | kecamatan | curah_hujan_kecamatan | hari_hujan_kecamatan | Luas | Jml_RT | Jml_RW | Jml_penduduk | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cluster | ||||||||||||||
| 0 | 169 | 169 | 169 | 169 | 169 | 169 | 169 | 169 | 169 | 169 | 169 | 169 | 169 | 169 |
| 1 | 41480 | 41480 | 41480 | 41480 | 41480 | 41480 | 41480 | 41480 | 41480 | 41480 | 41480 | 41480 | 41480 | 41480 |
| 2 | 15808 | 15808 | 15808 | 15808 | 15808 | 15808 | 15808 | 15808 | 15808 | 15808 | 15808 | 15808 | 15808 | 15808 |
| 3 | 1744 | 1744 | 1744 | 1744 | 1744 | 1744 | 1744 | 1744 | 1744 | 1744 | 1744 | 1744 | 1744 | 1744 |
| 4 | 1761 | 1761 | 1761 | 1761 | 1761 | 1761 | 1761 | 1761 | 1761 | 1761 | 1761 | 1761 | 1761 | 1761 |
Setelah itu, kode tersebut melakukan pengelompokan data berdasarkan label klaster yang baru ditambahkan, dan menghitung jumlah sampel data dalam setiap klaster.
cluster_stats = df_filtered.groupby('cluster').mean()
cluster_stats
<ipython-input-155-6609616e7b9f>:1: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
cluster_stats = df_filtered.groupby('cluster').mean()
| hari | bulan | tahun | netto_kg | curah_hujan_kecamatan | hari_hujan_kecamatan | Luas | Jml_RT | Jml_RW | Jml_penduduk | |
|---|---|---|---|---|---|---|---|---|---|---|
| cluster | ||||||||||
| 0 | 16.183432 | 6.710059 | 2019.372781 | 2537.041420 | 176.700000 | 10.165680 | 7.120059 | 325.763314 | 69.751479 | 42866.603550 |
| 1 | 15.853737 | 6.466683 | 2020.975434 | 1198.096625 | 240.070576 | 15.329436 | 6.135397 | 317.963549 | 52.120926 | 42649.235029 |
| 2 | 15.923267 | 6.562184 | 2020.957174 | 1666.867535 | 234.852790 | 15.155807 | 6.801450 | 318.177379 | 61.786247 | 42408.057123 |
| 3 | 15.872706 | 6.400803 | 2020.864106 | 1188.281537 | 242.307454 | 15.317661 | 5.578296 | 361.073394 | 63.366972 | 42596.372133 |
| 4 | 16.182851 | 6.623509 | 2020.879046 | 901.208972 | 236.505792 | 15.130608 | 6.818041 | 318.572402 | 62.201022 | 42432.134583 |
Selanjutnya, kode menghitung statistik rata-rata untuk setiap fitur dalam setiap klaster menggunakan metode 'groupby' dan 'mean'. Hasilnya adalah DataFrame baru bernama 'cluster_stats', yang berisi nilai rata-rata dari setiap fitur untuk setiap klaster.
Tujuannya adalah untuk menganalisis perbedaan karakteristik antara klaster yang berbeda. Dengan kata lain, kita ingin melihat bagaimana nilai rata-rata dari fitur-fitur tertentu bervariasi di antara klaster-klaster tersebut. Informasi ini dapat memberikan wawasan yang berharga tentang pola-pola yang mungkin tersembunyi dalam data dan memungkinkan untuk pengambilan keputusan yang lebih baik dalam konteks analisis klaster.
# Simpan DataFrame ke dalam file Excel
df_filtered.to_excel("data_hasil_clustering.xlsx", index=False)
Cluster 1
Cluster 2
Cluster 3
Cluster 4
Cluster 5
Berdasarkan karakteristik yang Anda berikan, berikut adalah nama dan deskripsi untuk setiap klaster:
Cluster 1: Wilayah Produktif dengan Volume Sampah Tinggi
Cluster 2: Wilayah dengan Variabilitas Hujan Tinggi
Cluster 3: Perbedaan Musiman dalam Pengelolaan Sampah
Cluster 4: Wilayah Terpengaruh Cuaca dengan Volume Sampah Rendah
Cluster 5: Pertumbuhan Populasi dan Peningkatan Volume Sampah
Ini adalah interpretasi berdasarkan karakteristik yang Anda berikan. Jika ada informasi tambahan tentang klaster ketiga, saya dapat menyusun deskripsi yang lebih lengkap.
df_filtered.groupby('barang').size().sort_values(ascending = False).head(60)
barang Sampah 59487 Sampah Terpilah 1468 0 7 dtype: int64
df_tdk_terpilah = df_filtered.loc[df_filtered["barang"] == "Sampah"]
df_tdk_terpilah.groupby('barang').size().sort_values(ascending = False).head(60)
barang Sampah 59487 dtype: int64
df_tdk_terpilah.groupby('cluster').mean()
<ipython-input-159-ae725d11cdea>:1: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
df_tdk_terpilah.groupby('cluster').mean()
| hari | bulan | tahun | netto_kg | curah_hujan_kecamatan | hari_hujan_kecamatan | Luas | Jml_RT | Jml_RW | Jml_penduduk | |
|---|---|---|---|---|---|---|---|---|---|---|
| cluster | ||||||||||
| 0 | 16.183432 | 6.710059 | 2019.372781 | 2537.041420 | 176.700000 | 10.165680 | 7.120059 | 325.763314 | 69.751479 | 42866.603550 |
| 1 | 15.849869 | 6.456611 | 2020.992683 | 1214.321338 | 239.728558 | 15.352778 | 6.130005 | 318.380772 | 52.229767 | 42615.352903 |
| 2 | 15.915034 | 6.555133 | 2020.957454 | 1667.846807 | 234.888086 | 15.153193 | 6.800892 | 318.164099 | 61.772304 | 42408.259400 |
| 3 | 15.853532 | 6.395750 | 2020.863871 | 1188.281447 | 242.414245 | 15.324526 | 5.577753 | 361.115451 | 63.377944 | 42599.492820 |
| 4 | 16.182851 | 6.623509 | 2020.879046 | 901.208972 | 236.505792 | 15.130608 | 6.818041 | 318.572402 | 62.201022 | 42432.134583 |
Pengklusteran untuk sampah yang tidak terpilah
Cluster 1
Cluster 2
Cluster 3
Cluster 4
Cluster 5
Karakteristik:
Karakteristik:
Karakteristik:
Karakteristik:
Karakteristik:
Dengan memberikan label seperti ini, kita dapat lebih memahami ciri-ciri utama dari masing-masing klaster dan dapat merumuskan strategi pengelolaan sampah yang lebih efektif berdasarkan karakteristik klaster.
df_tdk_terpilah.groupby('kecamatan').size().sort_values(ascending = False).head(60)
kecamatan Magelang Utara 31421 Magelang Selatan 17701 Magelang Tengah 10365 dtype: int64
df_tdk_terpilah.groupby('kelurahan').size().sort_values(ascending = False).head(60)
kelurahan Kedungsari 16805 Potrobangsan 4708 Kramat Utara 4259 Magersari 4138 daerah lainnya 3746 Kemiri Rejo 2429 Rejowinangun Selatan 2414 Tidar Utara 2396 Tidar Selatan 2355 Wates 2059 Jurangombo Utara 1997 Magelang 1982 Kramat Selatan 1979 Jurangombo Selatan 1761 Panjang 1741 Jurangombo 1495 Gelangan 1263 Jurangombo UTara 927 Cacaban 551 Rejowinangun Utara 482 dtype: int64
df_terpilah = df_filtered.loc[df_filtered["barang"] == "Sampah Terpilah"]
df_terpilah.groupby('barang').size().sort_values(ascending = False).head(60)
barang Sampah Terpilah 1468 dtype: int64
df_terpilah.groupby('cluster').mean()
<ipython-input-163-2d41d87171a3>:1: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
df_terpilah.groupby('cluster').mean()
| hari | bulan | tahun | netto_kg | curah_hujan_kecamatan | hari_hujan_kecamatan | Luas | Jml_RT | Jml_RW | Jml_penduduk | |
|---|---|---|---|---|---|---|---|---|---|---|
| cluster | ||||||||||
| 1 | 15.951782 | 6.748428 | 2020.491964 | 743.567435 | 249.762334 | 14.677848 | 6.285846 | 306.321454 | 49.083857 | 43598.578616 |
| 2 | 19.647059 | 9.588235 | 2020.823529 | 1154.117647 | 220.585294 | 16.205882 | 7.031176 | 323.647059 | 67.529412 | 42330.470588 |
| 3 | 27.000000 | 9.333333 | 2021.000000 | 1188.333333 | 180.333333 | 11.333333 | 5.893700 | 336.666667 | 57.000000 | 40785.333333 |
Pengklusteran untuk sampah yang terpilah
Cluster 2
Cluster 3
Cluster 4
Berikut adalah nama dan karakteristik untuk setiap klaster :
Cluster 2: "Penduduk Padat dengan Curah Hujan Tinggi"
Cluster 3: "Musim Hujan yang Mempengaruhi Wilayah Luas"
Cluster 4: "Wilayah dengan Pertumbuhan Populasi dan Jumlah Rumah Tangga"
Setiap klaster memberikan wawasan tentang karakteristik unik dari wilayah-wilayah tertentu terkait dengan atribut-atribut yang diberikan.
df_terpilah.groupby('kecamatan').size().sort_values(ascending = False).head(60)
kecamatan Magelang Utara 1419 Magelang Selatan 34 Magelang Tengah 15 dtype: int64
df_terpilah.groupby('kelurahan').size().sort_values(ascending = False).head(60)
kelurahan Potrobangsan 1399 Jurangombo UTara 17 Kedungsari 10 Magersari 6 Kemiri Rejo 6 Wates 4 Tidar Selatan 4 daerah lainnya 4 Kramat Utara 4 Panjang 3 Rejowinangun Selatan 3 Magelang 2 Tidar Utara 2 Jurangombo 1 Rejowinangun Utara 1 Jurangombo Utara 1 Gelangan 1 dtype: int64