Anda di halaman 1dari 17

1

MODUL PERKULIAHAN

W542100001 –
Analisis Data
Pembersihan Data

Abstrak Sub-CPMK

Beragam teknik Sub-CPMK 5.


membersihkan data dengan Mampu melakukan pembersihan data
pustaka numpy dan pandas. dari informasi yang tidak layak proses

12.1. Pendahuluan
Ketika kita berbicara tentang dunia nyata, sebagian besar data yang kita
temukan untuk analisis adalah data mentah. Data mentah ini adalah kombinasi dari
baris yang berulang, hilang, dan banyak yang tidak relevan. Oleh karena itu, jika
diteruskan ke model, itu menghasilkan ketidakakuratan atau prediksi yang salah, yang
pada akhirnya membawa kita untuk memahami pentingnya Pembersihan Data.
Pembersihan Data dengan Python, juga dikenal sebagai Pembersihan Data adalah
teknik penting dalam pembuatan model yang muncul setelah Anda mengumpulkan
data. Ini dapat dilakukan secara manual di excel atau dengan menjalankan program.
Oleh karena itu, dalam artikel ini, kita akan membahas pembersihan data yang
diperlukan dan bagaimana Anda dapat membersihkan suara-suara (kotoran) langkah
demi langkah dengan menggunakan Python .

Apa itu Pembersihan Data?


Menurut Wikipedia, adalah proses mendeteksi dan memperbaiki catatan yang
rusak atau tidak akurat dari kumpulan catatan, tabel, atau basis data dan mengacu
pada pengidentifikasian bagian data yang tidak lengkap, tidak benar, tidak akurat, atau
tidak relevan, dan kemudian mengganti, memodifikasi, atau menghapus data kotor
atau kasar.
Definisi ini terlalu besar dan tentunya tidak mudah untuk dipahami. Untuk lebih
mudahnya kita bisa melihat contohnya. Pertimbangkan skenario di mana pemilik
pabrik Produk Susu tertarik untuk mengetahui pembeli botol susu yang sering untuk
meningkatkan basis pelanggan. Tetapi jika datanya rusak atau memiliki noise, maka
keputusannya akan salah arah. Dalam data di bawah ini, kami telah menunjukkan
sebuah contoh.

Dari gambar tersebut, kita dapat menggambarkan bahwa Pembersihan Data


adalah teknik yang membantu mengubah data yang tidak benar menjadi data yang
bermakna. Singkatnya, Machine Learning didorong oleh data. Dengan pembersihan
data, model Machine Learning Anda akan berperforma lebih baik. Jadi, penting untuk

2021 Analisis Data


2 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
mengolah data sebelum digunakan. Tanpa data yang berkualitas, adalah bodoh untuk
mengharapkan hasil yang benar.

Bagaimana cara melakukan Pembersihan Data dengan Python?


Untuk memahami, mari kita ambil contoh survei di mana staf SDM perusahaan
harus menemukan semua karyawan areanya, dan memastikan mereka aman di
rumah. Sebelum itu, mari kita pahami bahwa tidak ada Teknik Pembersihan Data
Standar. Tidak mungkin mengomentari mana yang terbaik. Satu-satunya aspek yang
perlu dipertimbangkan pada metode pembersihan tergantung pada sifat Data. Ini
membantu kita memilih teknik mana yang harus digunakan.

Perhatikan tabel dengan seksama. Anda akan melihat bahwa bidang tertentu
kosong atau memiliki nilai yang tidak relevan. Jika kita mengolah data seperti itu,
maka prediksi kita akan bermasalah.
Jadi, kami akan melakukan langkah-langkah di bawah ini untuk Pembersihan
Data.
1. Hapus Baris Berulang
2. Perawatan nilai yang hilang
3. Penghapusan Data yang Tidak Relevan

2021 Analisis Data


3 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
4. Kesalahan manual saat mengetik
5. Mengganti Nama Kolom
Untuk memproses data, langkah pertama kita adalah membaca data dengan Python.

Amati tabel output dengan hati-hati, ini adalah tabel yang sama dengan yang kita
miliki di tempat pertama. Dua pustaka penting yang kami impor adalah Panda dan
Numpy. Ini diperlukan untuk menjalankan kode Python. Hal penting berikutnya adalah
akronim yang kami adopsi sebagai praktik yang baik. variabel karyawan yang
digunakan untuk menyimpan data yang dibaca dari file DataCleaning.csv yang
disimpan di lokasi yang disebutkan. Perintah yang digunakan untuk membaca data
adalah read_csv dan ditampilkan di layar dengan menggunakan print. Untuk kolom
yang memiliki nilai yang hilang, sistem telah mengisinya dengan NaN(Bukan angka).

2021 Analisis Data


4 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Hapus Nilai Berulang
Kami tahu bahwa ada duplikat dalam kumpulan data dan itu perlu dihapus. Baris
5 dan 7 memiliki data karyawan yang sama.

Kita bisa menghapus baris terakhir, dan menyimpan baris pertama.

Fungsi drop_duplicates mengembalikan output dengan menghapus baris


berulang. Di bawah ini adalah parameter yang digunakan dalam perintah.
subset: Kami telah menetapkan nama kolom ke parameter subset untuk memeriksa
nilai berulang. Secara default, dibutuhkan semua kolom.
keep: untuk menjaga baris pertama (5)
inplace: Boolean case, default salah. Dengan menetapkan true kami meminta
perintah untuk menjatuhkan nilai terakhir.
Data tanpa nilai berulang.

Perlakuan Nilai yang Hilang


Di panda, data yang hilang direpresentasikan dalam dua cara. Tidak ada atau NaN.
Dalam kumpulan data kami, nilai yang hilang dikenali sebagai NaN. Untuk memeriksa
nilai yang hilang, kami telah menggunakan fungsi is.null() .

2021 Analisis Data


5 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Output dari perintah adalah boolean yang True untuk nilai NaN.

Seperti yang ditunjukkan pada gambar keluaran, kolom No. Ponsel, Proyek, dan
email memiliki nilai yang hilang. Nilai yang hilang dapat diisi atau dibuang. Dalam
contoh kami, kami sedang mengerjakan data karyawan sehingga mengisinya dengan
nilai apa pun tidak akan pantas. Oleh karena itu, kami telah menghilangkan nilai-nilai
yang hilang.

Perintah dropna menjatuhkan baris/kolom yang memiliki setidaknya nilai nol dalam file
CSV.

2021 Analisis Data


6 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Seperti yang ditunjukkan pada tabel output, nilai yang hilang akan dihapus dari
dataset.
Penghapusan data yang tidak relevan
Terkadang, kategori/kolom tertentu dalam kumpulan data tidak berguna. Dalam kasus
kami, nama kolom, no serial tidak penting. Mempertahankannya akan memakan
ruang yang tidak perlu dan menghabiskan waktu.
Panda menyediakan perintah del yang mudah untuk menghapus kolom yang tidak
diinginkan.

Jika kami memeriksa data, kami akan melihat bahwa kolom berhasil dihapus.

Kesalahan Manual Saat Mengetik


Pada langkah ini, kita perlu memastikan data memiliki nilai yang benar setiap kali ada
kategori yang disebutkan. Dalam kasus kami, kolom Project memiliki dua
kemungkinan nilai Client atau Internal . Tetapi pengamatan yang cermat dari tabel
keluaran dapat membantu kita untuk menunjukkan baris 8 di mana nilainya tidak
mengikuti kemungkinan kasus. (yaitu, internal harus dikoreksi ke Internal).
Di python, kita bisa mengganti kolom dengan nilai yang dikoreksi.

2021 Analisis Data


7 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Mengganti Nama Kolom
Dataset yang sedang kita kerjakan memiliki nama kolom yang tidak berbicara tentang
pentingnya data yang disimpannya. Jadi, kami akan menambahkan beberapa label
yang masuk akal dengan mengganti nama kolom.
Output menunjukkan perubahan nama kolom.

2021 Analisis Data


8 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
12.2. Panduan Pembersihan Data
Untuk menggunakan data secara efektif untuk segala jenis analisis, ilmuwan
data harus dapat membersihkan dan mempersiapkannya terlebih dahulu.
Untungnya, Python membuatnya mudah. Pembersihan dan persiapan data
merupakan bagian integral dari ilmu data. Seringkali, data mentah datang dalam bentuk
yang tidak siap untuk dianalisis atau dimodelkan karena karakteristik struktural atau
bahkan kualitas data. Misalnya, data konsumen mungkin berisi nilai yang tidak masuk
akal, seperti angka yang mencantumkan nama atau kata yang mencantumkan angka.
Akhirnya, data mentah mungkin mengandung nilai yang hilang atau tidak diketahui, yang
membuat analisis menjadi sulit.
Salah satu langkah pertama untuk menilai kebersihan data adalah analisis kualitas,
yang melibatkan tugas-tugas seperti menghitung jumlah nilai yang hilang di setiap kolom
dan mendeteksi nilai outlier dalam data. Nilai outlier hanyalah nilai ekstrim yang
menyimpang secara signifikan dari sebagian besar data lainnya. Misalnya, jika Anda
memiliki kumpulan data yang berisi gaji orang-orang di lingkungan tertentu yang sebagian
besar turun sekitar $70.000, gaji $1 juta akan menjadi contoh outlier.
Setelah kami memeriksa kualitas data, kami perlu menyelesaikan nilai yang hilang,
outlier, atau buruk dalam data. Pertimbangkan data konsumen dengan kolom yang berisi
nilai integer untuk usia. Sebuah string di kolom ini akan menjadi contoh nilai yang buruk
karena Anda tidak bisa langsung melakukan perhitungan, seperti mengambil rata-rata
atau standar deviasi, dengan string. Jadi, kita perlu cara untuk mengubah nilai buruk
menjadi angka atau menghapus nilainya sama sekali.
Menangani nilai yang hilang adalah bagian penting lain dari pembersihan data. Ada
banyak cara untuk menangani nilai yang hilang dalam data, hanya beberapa yang akan
kita bahas di sini. Cara paling dasar adalah dengan menghapusnya, tetapi ini tidak selalu
ideal karena dapat mengakibatkan hilangnya data yang signifikan. Metode umum lainnya,
imputasi data, melibatkan penggantian nilai yang hilang dengan statistik. Untuk angka,
kita dapat mengganti nilai yang hilang dengan statistik seperti mean atau median. Dalam
hal nilai kategorikal, yang seringkali berupa string, kita dapat menggantinya dengan
mode.
Pustaka Python Pandas adalah pustaka analisis statistik yang memungkinkan ilmuwan
data melakukan banyak tugas pembersihan dan persiapan data ini. Ilmuwan data dapat
dengan cepat dan mudah memeriksa kualitas data menggunakan metode dasar Pandas
yang disebut info yang memungkinkan tampilan jumlah nilai yang tidak hilang dalam data
Anda. Metode Panda seperti dropna() memungkinkan Anda menghapus nilai yang hilang

2021 Analisis Data


9 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
dan fillna() memungkinkan Anda mengganti nilai yang hilang. Metode Pandas to_numeric
memungkinkan Anda untuk memaksa kolom memiliki nilai numerik dengan mengonversi
nilai non-numerik menjadi nilai yang hilang yang nantinya dapat diperhitungkan dengan
fillna() atau dihapus dengan dropna(). Terakhir, pemfilteran data sederhana dengan
bingkai data Pandas dapat menghapus outlier dalam data.
Di sini, kita akan melihat bagaimana melakukan pembersihan dan persiapan data pada
kumpulan data perumahan Boston .

Pembersihan Data dengan Python

Pustaka Python Pandas adalah pustaka analisis statistik yang memungkinkan


ilmuwan data melakukan banyak tugas pembersihan dan persiapan data ini. Ilmuwan data
dapat dengan cepat dan mudah memeriksa kualitas data menggunakan metode dasar
Pandas yang disebut info yang memungkinkan tampilan jumlah nilai yang tidak hilang
dalam data Anda. Metode Panda seperti dropna() memungkinkan Anda menghapus nilai
yang hilang dan fillna() memungkinkan Anda mengganti nilai yang hilang. Metode Pandas
to_numeric memungkinkan Anda untuk memaksa kolom memiliki nilai numerik dengan
mengonversi nilai non-numerik menjadi nilai yang hilang yang nantinya dapat
diperhitungkan dengan fillna() atau dihapus dengan dropna(). Terakhir, pemfilteran data
sederhana dengan bingkai data Pandas dapat menghapus outlier dalam data.

Analisis Kualitas Data


Langkah pertama pembersihan data adalah memahami kualitas data Anda. Untuk tujuan
kami, ini berarti menganalisis nilai-nilai yang hilang dan outlier. Mari kita mulai dengan
mengimpor perpustakaan Pandas dan membaca data kita ke dalam bingkai data Pandas:
import pandas as pd
df = pd.read_csv("HousingData.csv")
print(df.head())

G
ambar dari Screen Output.

2021 Analisis Data


10 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Kami melihat di sini bahwa data berisi 14 kolom:

 CRIM - tingkat kejahatan per kapita menurut kota


 ZN - proporsi lahan perumahan yang dikategorikan untuk kavling lebih dari 25.000
kaki persegi
 INDUS - proporsi hektar bisnis non-ritel per kota.
 CHAS - variabel dummy Sungai Charles (satu jika saluran membatasi sungai; nol
sebaliknya)
 NOX - konsentrasi oksida nitrat (bagian per 10 juta)
 RM - rata-rata jumlah kamar per hunian
 AGE - proporsi unit yang ditempati oleh pemilik yang dibangun sebelum tahun 1940
 DIS - jarak tertimbang ke lima pusat pekerjaan Boston
 RAD - indeks aksesibilitas ke jalan raya radial
 PAJAK - tarif pajak properti nilai penuh per $10.000
 PTRATIO - rasio murid-guru menurut kota
 B - 1000(Bk - 0,63)^2 di mana Bk adalah proporsi penduduk kulit hitam menurut
kota
 LSTAT - persentase status populasi yang lebih rendah berdasarkan nilai properti
 MEDV - Nilai rata-rata rumah yang ditempati pemilik di $1000's
Selanjutnya, mari kita lihat berapa banyak nilai yang hilang dalam data. Kami melakukan
ini dengan metode info Pandas:
df.info()

Gambar dari Screen Output.

2021 Analisis Data


11 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Kami melihat bahwa, di bagian atas output yang ditampilkan dari metode info, kami
memiliki entri RangeIndex: 506. Jika kita melihat kolom Non-null Count dalam output yang
ditampilkan, kita melihat bahwa kolom dengan 506 nilai non-null memiliki nol yang hilang,
sedangkan kolom dengan kurang dari 506 nilai non-null memiliki beberapa yang hilang.
Misalnya, kolom Crim memiliki 486 nilai bukan nol, yang berarti berisi 20 nilai yang hilang.
Hal berikutnya yang dapat kita lakukan adalah menganalisis outlier pada beberapa kolom
tersebut dengan membuat plot kotak untuk sebuah kolom. Plot kotak berguna untuk
mendeteksi outlier karena menyediakan cara yang mudah untuk memvisualisasikan
mean, dispersi, dan skewness dalam data. Untuk melakukan ini, mari impor pustaka
visualisasi Python Seaborn dan Matplotlib
import seaborn as sns
import matplotlib.pyplot as plt
Sekarang, mari kita lihat plot kotak rata-rata jumlah kamar per hunian di rumah Boston:

Lingkaran hitam di plot sesuai dengan outlier dan lingkaran di antara tanda hubung bawah
dan atas membentuk sebagian besar nilai untuk nomor kamar. Apa pun di bawah lima
dan di atas delapan sesuai dengan outlier.

Menangani Nilai yang Hilang


Bagian penting lainnya dari pembersihan data adalah menangani nilai yang hilang.
Metode paling sederhana adalah menghapus semua nilai yang hilang menggunakan
dropna:
print(“Before removing missing values:”, len(df))
df.dropna(inplace=True)
print(“After removing missing values:”, len(df))

2021 Analisis Data


12 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Kami melihat bahwa jumlah catatan dalam bingkai data kami berkurang dari 506
menjadi 394. Jadi, cara yang lebih baik untuk menangani nilai yang hilang adalah dengan
memasukkannya. Metode paling sederhana adalah mengganti nilai numerik yang hilang
dengan statistik seperti mean karena mudah dihitung dibandingkan dengan metode yang
lebih canggih. Mari kita lakukan ini untuk kolom Crim:

Kami melihat bahwa panjang bingkai data tidak berubah dan kolom Usia tidak lagi
memiliki nilai yang hilang. Mari kita ulangi proses ini untuk kolom lainnya:
df['CRIM'].fillna(df['CRIM'].mean(),inplace=True)
df['ZN'].fillna(df['ZN'].mean(),inplace=True)
df['INDUS'].fillna(df['INDUS'].mean(),inplace=True)
df['CHAS'].fillna(df['CHAS'].mean(),inplace=True)
df['LSTAT'].fillna(df['LSTAT'].mean(),inplace=True)
df.info()

2021 Analisis Data


13 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Sekarang kita melihat bahwa tidak ada kolom yang berisi nilai yang hilang.

Menangani Nilai Buruk


Bagian penting lainnya dari pembersihan data adalah menangani nilai buruk, yaitu nilai
yang tidak masuk akal atau memiliki tipe yang tidak terduga. Misalnya, daftar usia harus
bilangan bulat. Jadi, untuk daftar ini, nilai usia yang buruk bisa berupa karakter atau kata
atau angka besar yang tidak masuk akal untuk usia, seperti 500. Kami akan
mempertimbangkan contoh beberapa nilai usia sebagai string. Data ini sudah cukup
bersih dalam aspek ini, jadi kami akan menambahkan nilai string yang buruk secara
artifisial. Mari kita baca ulang dalam bingkai data kita:
df_original = pd.read_csv("HousingData.csv")
Mari kita cetak usia rata-rata:
print(df_bad['AGE'].mean())

Di sini, kita akan mendefinisikan bingkai data baru yang disebut df_bad, di mana usia di
atas rata-rata akan berupa string. Sekali lagi, ini untuk mensimulasikan bagaimana kita
menangani data yang nyata, seringkali berantakan.
df_bad['AGE'] = [str(x) if x > df_bad['AGE'].mean() else x for x in
list(df_bad['AGE']) ]

2021 Analisis Data


14 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Sekarang, jika kita mencoba mencetak usia rata-rata, kita mendapatkan:
print(df_bad['AGE'].mean())

Kesalahan ini terjadi karena Anda tidak dapat menghitung rata-rata antara string dan
bilangan bulat, yang merupakan masalah kualitas data yang sering muncul saat bekerja
dengan data nyata. Kami dapat memaksa nilai buruk menjadi bilangan bulat
menggunakan metode Pandas yang disebut to_numeric:
df_bad['AGE'] = pd.to_numeric(df_bad['AGE'], errors = 'coerce')
print(df_bad['AGE'].mean())
Kami melihat bahwa kami sekarang dapat menghitung usia rata-rata.

Menangani Pencilan
Metode pembersihan data lainnya adalah menghapus outlier dalam data. Ingat plot kotak
yang kita buat sebelumnya untuk jumlah kamar:

Menghapus outlier penting untuk melakukan analisis statistik dan membangun model
prediktif karena mereka dapat mengubah statistik dan membuatnya tidak dapat
diinterpretasikan. Selanjutnya, outlier dapat mempengaruhi kinerja model prediktif secara
negatif.
Kami akan menggunakan Z-score untuk menghapus outlier dari satu kolom, di mana Z-
score adalah ukuran seberapa jauh suatu nilai dari mean. Nilai yang jauh dari rata-rata
biasanya merupakan outlier. Misalnya, nilai tiga standar deviasi dari mean dapat dianggap
sebagai outlier. Mari kita hilangkan outlier dari kolom Rm (jumlah kamar):

2021 Analisis Data


15 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
from scipy import stats
import numpy as np
print("Length before removing RM outlier:", len(df_bad))
df_bad['RM_zscore'] = np.abs(stats.zscore(df['RM']))
df_clean1 = df_bad[df_bad['RM_zscore']< 3]
print("Length after removing RM outlier:", len(df_clean1))

Kami juga dapat melakukan ini untuk kolom numerik lainnya. Mari kita definisikan fungsi
yang mengambil nama kolom sebagai input dan mengembalikan bingkai data tempat
outlier di kolom tersebut dihapus:
def remove_outliers(column_name, df_in):
print(f"Length before removing {column_name} outlier:", len(df_in))
df_in[f'{column_name}_zscore'] =
np.abs(stats.zscore(df_in[f'{column_name}']))
df_clean = df_in[df_in[f'{column_name}_zscore']< 3]
print(f"Length after removing {column_name} outlier:",
len(df_clean))
return df_clean
Mari kita terapkan fungsi ini ke kolom Dis (jarak bobot ke lima pusat pekerjaan Boston):
df1 = remove_outliers('DIS', df_bad)

Kami melihat bahwa dalam kedua kasus penghapusan outlier mengakibatkan hilangnya
data, yang diharapkan.
Kode dari posting ini tersedia di GitHub .

Membersihkan Data Itu Mudah


Pembersihan dan persiapan data merupakan bagian integral dari pekerjaan yang
dilakukan oleh para ilmuwan data. Baik Anda melakukan peringkasan data, penceritaan
data, atau membangun model prediktif, yang terbaik adalah bekerja dengan data bersih
untuk mendapatkan hasil yang andal dan dapat ditafsirkan. Misalnya, saat meringkas
hasil analisis statistik, masalah seperti nilai yang hilang, nilai buruk, dan outlier harus
ditangani karena hal itu dapat berdampak signifikan pada hasil.
Lebih lanjut, jika seorang ilmuwan data berusaha untuk membingkai masalah analitis dan
memotivasi masalah melalui penceritaan data, data harus bersih. Isu-isu seperti outlier
dan nilai-nilai yang hilang dapat mengakibatkan masalah analitis yang didefinisikan
dengan buruk.
Akhirnya, nilai-nilai yang hilang, nilai-nilai buruk dan outlier dapat secara signifikan
mempengaruhi keakuratan model prediktif. Ini karena algoritma yang mendasari untuk
sebagian besar model pembelajaran mesin menghitung bobot pembelajaran berdasarkan

2021 Analisis Data


16 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
statistik dalam data, yang dapat dikacaukan oleh masalah ini. Memiliki pemahaman yang
baik tentang metode dasar untuk membersihkan data dengan Python adalah keterampilan
yang sangat berharga bagi ilmuwan data mana pun.

12.3. Daftar Pustaka


https://www.mygreatlearning.com/blog/data-cleaning-in-python/
https://builtin.com/data-science/data-cleaning-python

2021 Analisis Data


17 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/

Anda mungkin juga menyukai