Import Package yang digunakan untuk mengolah data
import numpy as np # untuk mengolah array
import pandas as pd # untuk mengolah dataframe
pd.set_option('display.max_rows', None) # untuk menampilkan baris tanpa batas
pd.set_option('display.max_columns', None) # untuk menampilkan kolom tanpa batas
C:\Users\ThinkPad\AppData\Local\Temp\ipykernel_4832\1149312035.py:2: DeprecationWarning:
Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0),
(to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries)
but was not found to be installed on your system.
If this would cause problems for you,
please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466
import pandas as pd
df_agama = pd.read_csv('data/agama.csv') # membaca data agama.csv
df_agama.head() # menampilkan data agama
| Kecamatan | Tahun | Agama | Jml_penduduk | |
|---|---|---|---|---|
| 0 | Magelang Selatan | 2019 | Islam | 38540 |
| 1 | Magelang Tengah | 2019 | Islam | 33360 |
| 2 | Magelang Utara | 2019 | Islam | 39015 |
| 3 | Kota Magelang | 2019 | Islam | 110915 |
| 4 | Magelang Selatan | 2019 | Protestan | 2961 |
df_iklim = pd.read_csv('data/iklim.csv') # membaca data iklim.csv
df_iklim.head() # menampilkan data agama
| Kecamatan | Bulan | Tahun | Jml_curah_hujan | Jml_hari_hujan | |
|---|---|---|---|---|---|
| 0 | Magelang Tengah | Januari | 2019 | 875.0 | 28.0 |
| 1 | Magelang Tengah | Februari | 2019 | 437.0 | 23.0 |
| 2 | Magelang Tengah | Maret | 2019 | 328.0 | 22.0 |
| 3 | Magelang Tengah | April | 2019 | 318.0 | 17.0 |
| 4 | Magelang Tengah | Mei | 2019 | 42.0 | 5.0 |
df_luas = pd.read_csv('data/luas.csv') # membaca data luas.csv
df_luas.head() # menampilkan data luas
| Kecamatan | Tahun | Luas | Jml_RT | Jml_RW | |
|---|---|---|---|---|---|
| 0 | Magelang Selatan | 2019 | 7.1300 | 326 | 70 |
| 1 | Magelang Utara | 2019 | 6.2900 | 306 | 49 |
| 2 | Magelang Tengah | 2019 | 5.1011 | 398 | 73 |
| 3 | Magelang Selatan | 2020 | 7.1300 | 326 | 70 |
| 4 | Magelang Utara | 2020 | 6.2900 | 306 | 49 |
df_timbangan = pd.read_csv('data/datatimbangan2019_2023.csv') # membaca data timbangan
df_timbangan['supplier'] = df_timbangan['supplier'].str.lower() # membuat semua huruf kecil pada kolom 'supplier' agar menghindari typo case
df_timbangan.head() # menampilkan data timbangan
| No | tanggal | hari | bulan | tahun | nopol | barang | supplier | netto_kg | jam | sopir | admin | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 31/12/2023 | 31 | 12 | 2023 | AA 1975 QH | Sampah | pasar tegalrejo | 830 | 16:43 | supomo | Kurniawan BW |
| 1 | 2 | 31/12/2023 | 31 | 12 | 2023 | AA 1856 QK | Sampah | pasar tegalrejo | 990 | 15:49 | prayit | Kurniawan BW |
| 2 | 3 | 31/12/2023 | 31 | 12 | 2023 | AA 6249 XA | Sampah | dlh kota magelang | 300 | 15:31 | tembel | Kurniawan BW |
| 3 | 4 | 31/12/2023 | 31 | 12 | 2023 | AA 8013 XA | Sampah | pasar rejowinangun | 550 | 15:15 | soleh | Kurniawan BW |
| 4 | 5 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo tidar selatan | 2270 | 13:51 | yusuf | Kurniawan BW |
df_supplier = pd.read_csv('data/supplier_fixed.csv') # membaca data supplier
df_supplier.drop(columns=['notes', 'No'], inplace=True) # menghapus kolom 'notes' dan 'No' karena tidak digunakan
df_supplier['Supplier'] = df_supplier['Supplier'].str.replace('Alun-alun Pecinan (magelang tengah)', 'Alun-alun Pecinan').str.lower() # mengatasi typo pada supplier Alun-alun Pecinan
df_supplier.rename(columns={'Supplier': 'supplier'}, inplace=True) # mengubah nama Supplier menjadi supplier menyesuaikan df_timbangan
df_supplier.head() # menampilkan data supplier
| supplier | Kelurahan | kecamatan | kabkot | |
|---|---|---|---|---|
| 0 | alun-alun pecinan | Kemiri Rejo | Magelang Tengah | Kota Magelang |
| 1 | armada finance magelang | Tidar Selatan | Magelang Selatan | Kota Magelang |
| 2 | catering sari | Jurangombo Selatan | Magelang Selatan | Kota Magelang |
| 3 | cengkeh 55 magelang | Tidar Utara | Magelang Selatan | Kota Magelang |
| 4 | depo cacaban | Cacaban | Magelang Tengah | Kota Magelang |
df_timbangan_supplier = pd.merge(df_timbangan, df_supplier, how='left', on='supplier') # menggabungkan df_timbangan dan df_supplier rata kiri terhadap kolom 'supplier'
df_timbangan_supplier = df_timbangan_supplier[df_timbangan_supplier['kecamatan'].notna()] # menghapus data yang memiliki kecamatan yang kosong
df_timbangan_supplier.head(10) # menampilkan data gabungan timbangan supplier
| No | tanggal | hari | bulan | tahun | nopol | barang | supplier | netto_kg | jam | sopir | admin | Kelurahan | kecamatan | kabkot | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 31/12/2023 | 31 | 12 | 2023 | AA 1975 QH | Sampah | pasar tegalrejo | 830 | 16:43 | supomo | Kurniawan BW | Tegalrejo | Kecamatan Tegalrejo | Kabupaten Magelang |
| 1 | 2 | 31/12/2023 | 31 | 12 | 2023 | AA 1856 QK | Sampah | pasar tegalrejo | 990 | 15:49 | prayit | Kurniawan BW | Tegalrejo | Kecamatan Tegalrejo | Kabupaten Magelang |
| 2 | 3 | 31/12/2023 | 31 | 12 | 2023 | AA 6249 XA | Sampah | dlh kota magelang | 300 | 15:31 | tembel | Kurniawan BW | Kedungsari | Magelang Utara | Kota Magelang |
| 3 | 4 | 31/12/2023 | 31 | 12 | 2023 | AA 8013 XA | Sampah | pasar rejowinangun | 550 | 15:15 | soleh | Kurniawan BW | Rejowinangun Selatan | Magelang Selatan | Kota Magelang |
| 4 | 5 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo tidar selatan | 2270 | 13:51 | yusuf | Kurniawan BW | Tidar Utara | Magelang Selatan | Kota Magelang |
| 5 | 6 | 31/12/2023 | 31 | 12 | 2023 | AA 9574 FA | Sampah | dlh kota magelang | 500 | 11:49 | indra | Eksta Gama Pratama Y | Kedungsari | Magelang Utara | Kota Magelang |
| 6 | 7 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo magersari | 1620 | 11:42 | yusuf | Eksta Gama Pratama Y | Magersari | Magelang Selatan | Kota Magelang |
| 7 | 8 | 31/12/2023 | 31 | 12 | 2023 | AA 8114 XA | Sampah | depo cacaban | 6250 | 11:04 | agus | Eksta Gama Pratama Y | Cacaban | Magelang Tengah | Kota Magelang |
| 8 | 9 | 31/12/2023 | 31 | 12 | 2023 | AA 8013 XA | Sampah | pasar rejowinangun | 2580 | 10:19 | soleh | Eksta Gama Pratama Y | Rejowinangun Selatan | Magelang Selatan | Kota Magelang |
| 9 | 10 | 31/12/2023 | 31 | 12 | 2023 | AA 8113 XA | Sampah | depo taruma negara | 3670 | 9:26 | ahmad | Eksta Gama Pratama Y | Rejowinangun Utara | Magelang Tengah | Kota Magelang |
df_timbangan_supplier.to_csv('data/manipulated/timbangan_supplier.csv', index=False) # menyimpan data gabungan timbangan supplier
df_timbangan_supplier.info() # menampilkan info data gabungan timbangan supplier
<class 'pandas.core.frame.DataFrame'> Index: 73233 entries, 0 to 78178 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 No 73233 non-null int64 1 tanggal 73233 non-null object 2 hari 73233 non-null int64 3 bulan 73233 non-null int64 4 tahun 73233 non-null int64 5 nopol 73233 non-null object 6 barang 73233 non-null object 7 supplier 73233 non-null object 8 netto_kg 73233 non-null object 9 jam 73233 non-null object 10 sopir 72908 non-null object 11 admin 62840 non-null object 12 Kelurahan 73233 non-null object 13 kecamatan 73233 non-null object 14 kabkot 73233 non-null object dtypes: int64(4), object(11) memory usage: 8.9+ MB
df_timbangan_supplier['kecamatan'].value_counts() # menghitung jumlah data berdasarkan 'kecamatan'
kecamatan Magelang Utara 33499 Magelang Selatan 18801 Magelang Tengah 12038 Kecamatan Tegalrejo 8889 - 6 Name: count, dtype: int64
df_ts_cleaned = df_timbangan_supplier.copy() # menduplikat df_timbangan_supplier terlebih dahulu
df_ts_cleaned = df_ts_cleaned[df_ts_cleaned['kecamatan'] != 'Kecamatan Tegalrejo'] # menghapus 'Kecamatan Tegalrejo' karena tidak diketahui
df_ts_cleaned = df_ts_cleaned[df_ts_cleaned['kecamatan'] != '-'] # menghapus kecamatan yang salah '-'
df_ts_cleaned['kecamatan'] = df_ts_cleaned['kecamatan'].str.strip() # menghapus spasi berlebih pada kecamatan ( cth: ' aku' -> 'aku' )
df_ts_cleaned['kecamatan'].value_counts() # menampilkan jumlah data setiap kecamatan
kecamatan Magelang Utara 33499 Magelang Selatan 18801 Magelang Tengah 12038 Name: count, dtype: int64
df_ts_cleaned.head() # menampilkan data
| No | tanggal | hari | bulan | tahun | nopol | barang | supplier | netto_kg | jam | sopir | admin | Kelurahan | kecamatan | kabkot | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 3 | 31/12/2023 | 31 | 12 | 2023 | AA 6249 XA | Sampah | dlh kota magelang | 300 | 15:31 | tembel | Kurniawan BW | Kedungsari | Magelang Utara | Kota Magelang |
| 3 | 4 | 31/12/2023 | 31 | 12 | 2023 | AA 8013 XA | Sampah | pasar rejowinangun | 550 | 15:15 | soleh | Kurniawan BW | Rejowinangun Selatan | Magelang Selatan | Kota Magelang |
| 4 | 5 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo tidar selatan | 2270 | 13:51 | yusuf | Kurniawan BW | Tidar Utara | Magelang Selatan | Kota Magelang |
| 5 | 6 | 31/12/2023 | 31 | 12 | 2023 | AA 9574 FA | Sampah | dlh kota magelang | 500 | 11:49 | indra | Eksta Gama Pratama Y | Kedungsari | Magelang Utara | Kota Magelang |
| 6 | 7 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo magersari | 1620 | 11:42 | yusuf | Eksta Gama Pratama Y | Magersari | Magelang Selatan | Kota Magelang |
bulan_mapping = { # inisialisasi bulan terhadap angka representatifnya
'Januari': 1,
'Februari': 2,
'Maret': 3,
'April': 4,
'Mei': 5,
'Juni': 6,
'Juli': 7,
'Agustus': 8,
'September': 9,
'Oktober': 10,
'November': 11,
'Desember': 12
}
df_iklim_cleaned = df_iklim.copy() # menduplikat df_iklim
df_iklim_cleaned.rename(columns={'Kecamatan':'kecamatan', 'Bulan':'bulan', 'Tahun':'tahun', 'Jml_curah_hujan':'jml_curah_hujan', 'Jml_hari_hujan':'jml_hari_hujan'}, inplace=True) # mengubah nama kolom
df_iklim_cleaned['bulan'] = df_iklim_cleaned['bulan'].map(bulan_mapping) # mengubah data bulan menjadi representatif angka
df_iklim_cleaned.head() # menampilkan data
| kecamatan | bulan | tahun | jml_curah_hujan | jml_hari_hujan | |
|---|---|---|---|---|---|
| 0 | Magelang Tengah | 1 | 2019 | 875.0 | 28.0 |
| 1 | Magelang Tengah | 2 | 2019 | 437.0 | 23.0 |
| 2 | Magelang Tengah | 3 | 2019 | 328.0 | 22.0 |
| 3 | Magelang Tengah | 4 | 2019 | 318.0 | 17.0 |
| 4 | Magelang Tengah | 5 | 2019 | 42.0 | 5.0 |
df_tsi = pd.merge(df_ts_cleaned, df_iklim_cleaned, how='left', on=['kecamatan', 'bulan', 'tahun']) # menggabungkan df_ts_cleaned dengan df_iklim_cleaned
df_tsi.rename(columns={'Kelurahan':'kelurahan', 'jml_curah_hujan':'curah_hujan_kecamatan', 'jml_hari_hujan':'hari_hujan_kecamatan'}, inplace=True) # mengubah nama kolom
df_tsi.head() # menampilkan data
| No | tanggal | hari | bulan | tahun | nopol | barang | supplier | netto_kg | jam | sopir | admin | kelurahan | kecamatan | kabkot | curah_hujan_kecamatan | hari_hujan_kecamatan | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 3 | 31/12/2023 | 31 | 12 | 2023 | AA 6249 XA | Sampah | dlh kota magelang | 300 | 15:31 | tembel | Kurniawan BW | Kedungsari | Magelang Utara | Kota Magelang | NaN | NaN |
| 1 | 4 | 31/12/2023 | 31 | 12 | 2023 | AA 8013 XA | Sampah | pasar rejowinangun | 550 | 15:15 | soleh | Kurniawan BW | Rejowinangun Selatan | Magelang Selatan | Kota Magelang | NaN | NaN |
| 2 | 5 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo tidar selatan | 2270 | 13:51 | yusuf | Kurniawan BW | Tidar Utara | Magelang Selatan | Kota Magelang | NaN | NaN |
| 3 | 6 | 31/12/2023 | 31 | 12 | 2023 | AA 9574 FA | Sampah | dlh kota magelang | 500 | 11:49 | indra | Eksta Gama Pratama Y | Kedungsari | Magelang Utara | Kota Magelang | NaN | NaN |
| 4 | 7 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo magersari | 1620 | 11:42 | yusuf | Eksta Gama Pratama Y | Magersari | Magelang Selatan | Kota Magelang | NaN | NaN |
df_tsi.to_csv('data/manipulated/tsi.csv', index=False) # menyimpan data gabungan tsi.csv
df_populasi = df_agama.copy() # menduplikat df_agama sebagai df_populasi
df_populasi = df_populasi.groupby(['Kecamatan', 'Tahun'], as_index=False).sum().drop(columns='Agama') # menggabungkan jumlah penduduk setiap agama terhadap kecamatan dan tahun
df_populasi # sehingga terbentuk jumlah penduduk (karena menjumlahkan semua populasi agama)
| Kecamatan | Tahun | Jml_penduduk | |
|---|---|---|---|
| 0 | Kota Magelang | 2019 | 130440 |
| 1 | Kota Magelang | 2020 | 128020 |
| 2 | Magelang Selatan | 2019 | 43129 |
| 3 | Magelang Selatan | 2020 | 42224 |
| 4 | Magelang Tengah | 2019 | 37908 |
| 5 | Magelang Tengah | 2020 | 48167 |
| 6 | Magelang Utara | 2019 | 49403 |
| 7 | Magelang Utara | 2020 | 37629 |
df_luas_populasi = pd.merge(df_luas, df_populasi, 'outer', on=['Kecamatan', 'Tahun']) # menggabungkan df_luas dan df_populasi
df_luas_populasi.sort_values(by=['Kecamatan', 'Tahun']) # mengurutkan df_populasi berdasarkan 'kecamatan' dan 'tahun
df_luas_populasi # menampilkan data
| Kecamatan | Tahun | Luas | Jml_RT | Jml_RW | Jml_penduduk | |
|---|---|---|---|---|---|---|
| 0 | Kota Magelang | 2019 | NaN | NaN | NaN | 130440.0 |
| 1 | Kota Magelang | 2020 | NaN | NaN | NaN | 128020.0 |
| 2 | Magelang Selatan | 2019 | 7.1300 | 326.0 | 70.0 | 43129.0 |
| 3 | Magelang Selatan | 2020 | 7.1300 | 326.0 | 70.0 | 42224.0 |
| 4 | Magelang Selatan | 2021 | 7.1300 | 326.0 | 70.0 | NaN |
| 5 | Magelang Tengah | 2019 | 5.1011 | 398.0 | 73.0 | 37908.0 |
| 6 | Magelang Tengah | 2020 | 5.1011 | 398.0 | 73.0 | 48167.0 |
| 7 | Magelang Tengah | 2021 | 5.1011 | 398.0 | 73.0 | NaN |
| 8 | Magelang Utara | 2019 | 6.2900 | 306.0 | 49.0 | 49403.0 |
| 9 | Magelang Utara | 2020 | 6.2900 | 306.0 | 49.0 | 37629.0 |
| 10 | Magelang Utara | 2021 | 6.2900 | 306.0 | 49.0 | NaN |
df_luas_populasi.to_csv('data/manipulated/luas_populasi.csv', index=False) # menyimpan data gabungan luas dan populasi
df_tsilp = pd.merge(df_tsi, df_luas_populasi.rename(columns={'Kecamatan':'kecamatan', 'Tahun':'tahun'}), 'left', on=['kecamatan', 'tahun']) # menggabung df_tsi dengan df_luas_populasi
df_tsilp.head()
| No | tanggal | hari | bulan | tahun | nopol | barang | supplier | netto_kg | jam | sopir | 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 | tembel | Kurniawan BW | Kedungsari | Magelang Utara | Kota Magelang | NaN | NaN | NaN | NaN | NaN | NaN |
| 1 | 4 | 31/12/2023 | 31 | 12 | 2023 | AA 8013 XA | Sampah | pasar rejowinangun | 550 | 15:15 | soleh | Kurniawan BW | Rejowinangun Selatan | Magelang Selatan | Kota Magelang | NaN | NaN | NaN | NaN | NaN | NaN |
| 2 | 5 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo tidar selatan | 2270 | 13:51 | yusuf | Kurniawan BW | Tidar Utara | Magelang Selatan | Kota Magelang | NaN | NaN | NaN | NaN | NaN | NaN |
| 3 | 6 | 31/12/2023 | 31 | 12 | 2023 | AA 9574 FA | Sampah | dlh kota magelang | 500 | 11:49 | indra | Eksta Gama Pratama Y | Kedungsari | Magelang Utara | Kota Magelang | NaN | NaN | NaN | NaN | NaN | NaN |
| 4 | 7 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo magersari | 1620 | 11:42 | yusuf | Eksta Gama Pratama Y | Magersari | Magelang Selatan | Kota Magelang | NaN | NaN | NaN | NaN | NaN | NaN |
df_tsilp.to_csv('data/manipulated/tsilp.csv', index=False) # menyimpan data gabungan semua file
df_tsilp = pd.read_csv('data/manipulated/tsilp.csv') # membaca data gabungan
def remove_outliers_iqr(df, column_name, threshold=1.5): # fungsi untuk menghapus outlier (data di luar batas)
# Calculate the first quartile (Q1) and third quartile (Q3)
Q1 = df[column_name].quantile(0.25) # kuartil 1
Q3 = df[column_name].quantile(0.75) # kuartil 2
# Calculate the interquartile range (IQR)
IQR = Q3 - Q1 # interkuartil
# Define the lower and upper bounds for identifying outliers
lower_bound = Q1 - threshold * IQR # batas bawah
upper_bound = Q3 + threshold * IQR # batas atas
# Filter the DataFrame to exclude outliers
df_filtered = df[(df[column_name] >= lower_bound) & (df[column_name] <= upper_bound)] # filtering
return df_filtered
def fill_null_values(df): # fungsi untuk mengisi nilai kosong dengan modus jika data kategorikal, median jika data numerik
for column in df.columns:
if df[column].dtype == 'object':
# For categorical columns, fill null values with mode
mode_val = df[column].mode()[0]
df.loc[df[column].isnull(), column] = mode_val
elif pd.api.types.is_numeric_dtype(df[column]):
# For numeric columns, fill null values with median
median_val = df[column].median()
df.loc[df[column].isnull(), column] = median_val
return df
df_cleaned = fill_null_values(remove_outliers_iqr(df_tsilp, 'netto_kg')) # menghapus outlier dan mengisi nilai kosong
df_cleaned.loc[:, ['kelurahan', 'kecamatan']] = df_cleaned.loc[:, ['kelurahan', 'kecamatan']].apply(lambda x: x.str.title() if x.dtype == 'object' else x) # mengubah Case kelurahan kecamatan menjadi bentuk judul
df_cleaned.info() # menampilkan info df_cleaned
<class 'pandas.core.frame.DataFrame'> Index: 60962 entries, 0 to 64337 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: 10.2+ MB
df_cleaned.head() # menampilkan data df_cleaned
| No | tanggal | hari | bulan | tahun | nopol | barang | supplier | netto_kg | jam | sopir | 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 | tembel | 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 | soleh | 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 | yusuf | 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 | indra | 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 | yusuf | Eksta Gama Pratama Y | Magersari | Magelang Selatan | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 |
df_cleaned['kelurahan'].value_counts() # melihat jumlah data setiap kelurahan
kelurahan Kedungsari 16818 Potrobangsan 6107 Kramat Utara 4264 Magersari 4145 - 3751 Jurangombo Utara 2943 Kemiri Rejo 2435 Rejowinangun Selatan 2417 Tidar Utara 2398 Tidar Selatan 2359 Wates 2063 Magelang 1984 Kramat Selatan 1979 Jurangombo Selatan 1761 Panjang 1744 Jurangombo 1496 Gelangan 1264 Cacaban 551 Rejowinangun Utara 483 Name: count, dtype: int64
df_cleaned.to_csv('data/manipulated/metadata_cleaned.csv', index=False) # menyimpan data df_cleaned
df_aggregated = df_cleaned.copy() # menduplikat df_cleaned
df_aggregated.loc[:, ['kelurahan', 'kecamatan']] = df_aggregated.loc[:, ['kelurahan', 'kecamatan']].apply(lambda x: x.str.title() if x.dtype == 'object' else x) # membuat Case judul
df_aggregated = df_aggregated.groupby(['tanggal', 'kelurahan', 'kecamatan']).agg( # menggabungkan data berdasarkan:
{
'netto_kg': 'sum', # jumlahan netto_kg
'Luas': 'mean', # rata-rata luas
'curah_hujan_kecamatan': 'mean', # rata-rata curah hujan
'hari_hujan_kecamatan': 'mean', # rata-rata hari hujan
'Jml_RT': 'mean', # rata-rata jumlah RT
'Jml_RW': 'mean', # rata-rata jumlah RW
'Jml_penduduk': 'mean' # rata-rata jumlah penduduk
}
).reset_index() # mengembalikan index seperti semula
df_aggregated.head() # menampilkan data
| tanggal | kelurahan | kecamatan | netto_kg | Luas | curah_hujan_kecamatan | hari_hujan_kecamatan | Jml_RT | Jml_RW | Jml_penduduk | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 01/01/2020 | - | Magelang Selatan | 2280 | 7.1300 | 503.0 | 21.0 | 326.0 | 70.0 | 42224.0 |
| 1 | 01/01/2020 | Jurangombo | Magelang Tengah | 3270 | 5.1011 | 503.0 | 21.0 | 398.0 | 73.0 | 48167.0 |
| 2 | 01/01/2020 | Jurangombo Utara | Magelang Selatan | 6820 | 7.1300 | 503.0 | 21.0 | 326.0 | 70.0 | 42224.0 |
| 3 | 01/01/2020 | Kedungsari | Magelang Utara | 2705 | 6.2900 | 503.0 | 21.0 | 306.0 | 49.0 | 37629.0 |
| 4 | 01/01/2020 | Kemiri Rejo | Magelang Tengah | 2350 | 5.1011 | 503.0 | 21.0 | 398.0 | 73.0 | 48167.0 |
df_aggregated['kelurahan'].value_counts() # menampilkan jumlah data setiap kelurahan
kelurahan - 3142 Kedungsari 1761 Magersari 1672 Kramat Utara 1584 Jurangombo Utara 1569 Rejowinangun Selatan 1563 Wates 1557 Potrobangsan 1537 Panjang 1497 Kemiri Rejo 1444 Jurangombo 1421 Tidar Selatan 1367 Kramat Selatan 1366 Magelang 1318 Tidar Utara 1251 Gelangan 1117 Jurangombo Selatan 1111 Cacaban 484 Rejowinangun Utara 474 Name: count, dtype: int64
df_aggregated.info() # menampilkan info df_aggregated
<class 'pandas.core.frame.DataFrame'> RangeIndex: 27235 entries, 0 to 27234 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 tanggal 27235 non-null object 1 kelurahan 27235 non-null object 2 kecamatan 27235 non-null object 3 netto_kg 27235 non-null int64 4 Luas 27235 non-null float64 5 curah_hujan_kecamatan 27235 non-null float64 6 hari_hujan_kecamatan 27235 non-null float64 7 Jml_RT 27235 non-null float64 8 Jml_RW 27235 non-null float64 9 Jml_penduduk 27235 non-null float64 dtypes: float64(6), int64(1), object(3) memory usage: 2.1+ MB
df_aggregated.to_csv('data/manipulated/metadata_aggregated.csv', index=False) # menyimpan df_aggregated
df_cleaned = pd.read_csv('data/manipulated/metadata_cleaned.csv') # membaca metadata_cleaned.csv
df_cleaned.head() # menampilkan data
| No | tanggal | hari | bulan | tahun | nopol | barang | supplier | netto_kg | jam | sopir | 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 | tembel | 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 | soleh | 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 | yusuf | 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 | indra | 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 | yusuf | Eksta Gama Pratama Y | Magersari | Magelang Selatan | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 |
df_long_lat = pd.read_csv('data/kelurahan_longitude_latitude.csv') # membaca data longitude latitdue setiap kelurahan
df_long_lat.head() # menampilkan data
| kelurahan | latitude | longitude | |
|---|---|---|---|
| 0 | Kedungsari | -7.451982 | 110.225581 |
| 1 | Magersari | -7.492647 | 110.218715 |
| 2 | Kramat Utara | -7.442315 | 110.222145 |
| 3 | Jurangombo Utara | -7.488670 | 110.209837 |
| 4 | Rejowinangun Selatan | -7.488058 | 110.224184 |
df_cleaned_long_lat = pd.merge(df_cleaned, df_long_lat, how='left', on='kelurahan') # menggabung data dengan latitude longitude
df_cleaned_long_lat.dropna(inplace=True) # menghapus nilai kosong
df_cleaned_long_lat.head() # menampilkan data
| No | tanggal | hari | bulan | tahun | nopol | barang | supplier | netto_kg | jam | sopir | admin | kelurahan | kecamatan | kabkot | curah_hujan_kecamatan | hari_hujan_kecamatan | Luas | Jml_RT | Jml_RW | Jml_penduduk | latitude | longitude | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 3 | 31/12/2023 | 31 | 12 | 2023 | AA 6249 XA | Sampah | dlh kota magelang | 300 | 15:31 | tembel | Kurniawan BW | Kedungsari | Magelang Utara | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | -7.451982 | 110.225581 |
| 1 | 4 | 31/12/2023 | 31 | 12 | 2023 | AA 8013 XA | Sampah | pasar rejowinangun | 550 | 15:15 | soleh | Kurniawan BW | Rejowinangun Selatan | Magelang Selatan | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | -7.488058 | 110.224184 |
| 2 | 5 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo tidar selatan | 2270 | 13:51 | yusuf | Kurniawan BW | Tidar Utara | Magelang Selatan | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | -7.490757 | 110.229768 |
| 3 | 6 | 31/12/2023 | 31 | 12 | 2023 | AA 9574 FA | Sampah | dlh kota magelang | 500 | 11:49 | indra | Eksta Gama Pratama Y | Kedungsari | Magelang Utara | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | -7.451982 | 110.225581 |
| 4 | 7 | 31/12/2023 | 31 | 12 | 2023 | AA 8022 XA | Sampah | depo magersari | 1620 | 11:42 | yusuf | Eksta Gama Pratama Y | Magersari | Magelang Selatan | Kota Magelang | 211.0 | 17.0 | 6.29 | 306.0 | 49.0 | 42224.0 | -7.492647 | 110.218715 |
df_cleaned_long_lat.info() # menampilkan info data
<class 'pandas.core.frame.DataFrame'> Index: 57211 entries, 0 to 60961 Data columns (total 23 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 No 57211 non-null int64 1 tanggal 57211 non-null object 2 hari 57211 non-null int64 3 bulan 57211 non-null int64 4 tahun 57211 non-null int64 5 nopol 57211 non-null object 6 barang 57211 non-null object 7 supplier 57211 non-null object 8 netto_kg 57211 non-null int64 9 jam 57211 non-null object 10 sopir 57211 non-null object 11 admin 57211 non-null object 12 kelurahan 57211 non-null object 13 kecamatan 57211 non-null object 14 kabkot 57211 non-null object 15 curah_hujan_kecamatan 57211 non-null float64 16 hari_hujan_kecamatan 57211 non-null float64 17 Luas 57211 non-null float64 18 Jml_RT 57211 non-null float64 19 Jml_RW 57211 non-null float64 20 Jml_penduduk 57211 non-null float64 21 latitude 57211 non-null float64 22 longitude 57211 non-null float64 dtypes: float64(8), int64(5), object(10) memory usage: 10.5+ MB
df_cleaned_long_lat.to_csv('data/manipulated/metadata_with_long_lat.csv', index=False) # menyimpan df_cleaned_long_lat
df_cleaned_long_lat = pd.read_csv('data/manipulated/metadata_with_long_lat.csv') # membaca data long lat
df_cleaned_long_lat = df_cleaned_long_lat[['No', 'tanggal', 'hari', 'bulan', 'tahun', 'barang', 'nopol', 'netto_kg']] # menyisihkan beberapa kolom
df_cleaned_long_lat['nopol'] = df_cleaned_long_lat['nopol'].str.lower() # membuat huruf kecil semua pada kolom 'nopol
df_cleaned_long_lat['nopol'] = df_cleaned_long_lat['nopol'].str.replace('aa1909ja', 'aa 1909 ja') # mengganti data yang typo
df_cleaned_long_lat = df_cleaned_long_lat[df_cleaned_long_lat['nopol'] != '9571'] # menghilangkan data salah
df_cleaned_long_lat.reset_index(drop=True, inplace=True) # mengulang index seperti semula
df_cleaned_long_lat.head() # menampilkan data
| No | tanggal | hari | bulan | tahun | barang | nopol | netto_kg | |
|---|---|---|---|---|---|---|---|---|
| 0 | 3 | 31/12/2023 | 31 | 12 | 2023 | Sampah | aa 6249 xa | 300 |
| 1 | 4 | 31/12/2023 | 31 | 12 | 2023 | Sampah | aa 8013 xa | 550 |
| 2 | 5 | 31/12/2023 | 31 | 12 | 2023 | Sampah | aa 8022 xa | 2270 |
| 3 | 6 | 31/12/2023 | 31 | 12 | 2023 | Sampah | aa 9574 fa | 500 |
| 4 | 7 | 31/12/2023 | 31 | 12 | 2023 | Sampah | aa 8022 xa | 1620 |
array_nopol = df_cleaned_long_lat['nopol'].values # deklarasi array dari nopol
np.unique([array_nopol[i].split()[0] for i in range(len(array_nopol))]) # melihat kode unik bagian pertama pada nopol
array(['aa', 'ab', 'ad', 'b', 'h'], dtype='<U2')
kota_kendaraan = []
jenis_kendaraan = []
for i in range(len(df_cleaned_long_lat)):
# Daerah Kendaraan Supplier
temp_split = df_cleaned_long_lat['nopol'][i].split() # split data nopol menjadi 3 bagian (cth: 'BA 3242 UT' -> ['BA', '3242', 'UT'] )
# aa
if temp_split[0] == 'aa': # pengkondisian kode plat 'aa'
if temp_split[2][0] in ['a', 'h', 's', 'u']:
kota_kendaraan.append('Kota Magelang')
elif temp_split[2][0] in ['b', 'g', 'k', 'o', 't']:
kota_kendaraan.append('Kabupaten Magelang')
elif temp_split[2][0] in ['c', 'l', 'q', 'v']:
kota_kendaraan.append('Kabupaten Purworejo')
elif temp_split[2][0] in ['d', 'j', 'm', 'w']:
kota_kendaraan.append('Kabupaten Kebumen')
elif temp_split[2][0] in ['e', 'n', 'y']:
kota_kendaraan.append('Kabupaten Temanggung')
elif temp_split[2][0] in ['f', 'p', 'z']:
kota_kendaraan.append('Kabupaten Wonosobo')
else:
kota_kendaraan.append(None)
elif temp_split[0] == 'ab': #ab
if temp_split[2][0] in 'afhis':
kota_kendaraan.append('Kota Yogyakarta')
elif temp_split[2][0] in 'bgjkt':
kota_kendaraan.append('Kabupaten Bantul')
elif temp_split[2][0] in 'clpv':
kota_kendaraan.append('Kabupaten Kulon Progo')
elif temp_split[2][0] in 'dmw':
kota_kendaraan.append('Kabupaten Gunungkidul')
elif temp_split[2][0] in 'enquyz':
kota_kendaraan.append('Kabupaten Sleman')
else:
kota_kendaraan.append(None)
elif temp_split[0] == 'ad': #ad
if temp_split[2][0] in 'ahsu':
kota_kendaraan.append('Kota Surakarta')
elif temp_split[2][0] in 'bkot':
kota_kendaraan.append('Kabupaten Sukoharjo')
elif temp_split[2][0] in 'cljqv':
kota_kendaraan.append('Kabupaten Klaten')
elif temp_split[2][0] in 'dmw':
kota_kendaraan.append('Kabupaten Boyolali')
elif temp_split[2][0] in 'eny':
kota_kendaraan.append('Kabupaten Sragen')
elif temp_split[2][0] in 'fpz':
kota_kendaraan.append('Kabupaten Karanganyar')
elif temp_split[2][0] in 'gir':
kota_kendaraan.append('Kabupaten Wonogiri')
else:
kota_kendaraan.append(None)
elif temp_split[0] == 'b': #b
if temp_split[2][0] in 'b':
kota_kendaraan.append('Kota Administrasi Jakarta Barat')
elif temp_split[2][0] in 'cv':
kota_kendaraan.append('Kota Tangerang')
elif temp_split[2][0] in 'ez':
kota_kendaraan.append('Kota Depok')
elif temp_split[2][0] in 'f':
kota_kendaraan.append('Kabupaten Bekasi')
elif temp_split[2][0] in 'gn':
kota_kendaraan.append('Kabupaten Tangerang')
elif temp_split[2][0] in 'k':
kota_kendaraan.append('Kota Bekasi')
elif temp_split[2][0] in 'p':
kota_kendaraan.append('Kota Administrasi Jakarta Pusat')
elif temp_split[2][0] in 's':
kota_kendaraan.append('Kota Administrasi Jakarta Selatan')
elif temp_split[2][0] in 't':
kota_kendaraan.append('Kota Administrasi Jakarta Timur')
elif temp_split[2][0] in 'u':
kota_kendaraan.append('Kota Administrasi Jakarta Utara')
elif temp_split[2][0] in 'w':
kota_kendaraan.append('Kota Tangerang Selatan')
else:
kota_kendaraan.append(None)
elif temp_split[0] == 'h': #h
if temp_split[2][0] in 'afghpqrswxyz':
kota_kendaraan.append('Kota Semarang')
elif temp_split[2][0] in 'bkot':
kota_kendaraan.append('Kota Salatiga')
elif temp_split[2][0] in 'cilv':
kota_kendaraan.append('Kabupaten Semarang')
elif temp_split[2][0] in 'dmu':
kota_kendaraan.append('Kabupaten Kendal')
elif temp_split[2][0] in 'ejn':
kota_kendaraan.append('Kabupaten Demak')
else:
kota_kendaraan.append(None)
else:
kota_kendaraan.append(None)
# jenis kendaraan
try:
temp_no = int(temp_split[1])
if temp_no > 0 and temp_no < 2000:
jenis_kendaraan.append('Mobil Pribadi')
elif temp_no >= 2000 and temp_no < 7000:
jenis_kendaraan.append('Sepeda Motor')
elif temp_no >= 7000 and temp_no < 8000:
jenis_kendaraan.append('Bus')
elif temp_no >= 8000 and temp_no < 9000:
jenis_kendaraan.append('Mobil Barang')
elif temp_no >= 9000 and temp_no < 10000:
jenis_kendaraan.append('Kendaraan Khusus')
else:
jenis_kendaraan.append(None)
except:
jenis_kendaraan.append(None)
print(len(kota_kendaraan))
print(len(jenis_kendaraan))
57210 57210
df_cleaned_long_lat['kabkot_supplier'] = kota_kendaraan # memasukkan kolom baru 'kabkot_supplier' sebagai kota asal supplier
df_cleaned_long_lat['jenis_kendaraan_supplier'] = jenis_kendaraan # memasukkan kolom baru 'jenis_kendaraan_supplier' sebagai jenis kendaraan supplier
df_cleaned_long_lat.dropna(inplace=True) # menghapus nilai kosong
df_cleaned_long_lat.reset_index(drop=True, inplace=True) # mengulang index seperti semula
df_cleaned_long_lat.info() # menampilkan info dari data gabungan long lat
<class 'pandas.core.frame.DataFrame'> RangeIndex: 47631 entries, 0 to 47630 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 No 47631 non-null int64 1 tanggal 47631 non-null object 2 hari 47631 non-null int64 3 bulan 47631 non-null int64 4 tahun 47631 non-null int64 5 barang 47631 non-null object 6 nopol 47631 non-null object 7 netto_kg 47631 non-null int64 8 kabkot_supplier 47631 non-null object 9 jenis_kendaraan_supplier 47631 non-null object dtypes: int64(5), object(5) memory usage: 3.6+ MB
df_cleaned_long_lat.to_csv('data/manipulated/metadata_plat_supplier.csv', index=False) # menyimpan data gabungan long lat