- Pendahuluan EDA
- Importing Data
- Dasar Data Preparation (tipe data, duplikasi, var selection)
- Noise vs Outliers
- Missing Values dan Imputasi
- Basic Statistics
- Video EDA-01
- Code EDA-01
- Referensi
Code Lesson EDA-01
Code dari lesson ini dapat di akses di Link berikut (wajib login ke Google/Gmail): Code EDA-01
Di link tersebut anda langsung bisa merubah code dan menjalankannya. Keterangan lebih lanjut di video yang menyertai lesson ini.
Sangat disarankan untuk membuka code dan video berdampingan/"side-by-side" untuk mendapatkan pengalaman belajar yang baik. Silahkan modifikasi (coba-coba) hal lain, selain yang ditunjukkan di video untuk mendapatkan pengalaman belajar yang lebih mendalam. Tentu saja juga silahkan akses berbagai referensi lain untuk memperkaya pengetahuan lalu diskusikan di forum yang telah disediakan.
Video EDA-01
tau-data Indonesia
Exploratory Data Analysis-01: Data Preparations
https://tau-data.id/eda-01/
Outline:¶
- Pendahuluan EDA
- Importing Data
- Dasar Data Preparation (tipe data, duplikasi, var selection)
- Noise vs Outliers
- Missing Values dan Imputasi
- Basic Statistics
Pendahuluan:¶
Exploratory Data Analysis (EDA) bagaikan jiwa bagi semua proses analisa data. Kemampuan untuk melakukan EDA dengan baik adalah syarat dasar utama bagi seluruh profesi yang terkait dengan pengolahan data, baik itu business intelligence, data analyst, data scientist, dan sebagainya. EDA juga menjadi tahapan awal dari kebanyakan proses analisa data dan menjadi suatu tahapan yang amat menentukan seberapa baik analisa data selanjutnya akan dihasilkan.
Diperkenalkan oleh John Tukey 1961: " Procedures for analyzing data, techniques for interpreting the results of such procedures, ways of planning the gathering of data to make its analysis easier, more precise or more accurate, and all the machinery and results of (mathematical) statistics which apply to analyzing data."
Komponen EDA meliputi preprocessing, perhitungan berbagai nilai statistics dasar (e.g. ukuran pusat dan penyebaran data), visualisasi, penyusunan hipotesis (dugaan awal), pemeriksaan asumsi, hingga story-telling dan reporting. Di dalamnya juga termasuk proses penanganan missing values, outlier, reduksi dimensi, pengelompokkan, transformasi dan distribusi data.
Tools: Python, R, S-Plus, etc
Tujuan EDA¶
- Suggest hypotheses about the causes of observed phenomena
- Assess assumptions on which statistical inference will be based
- Support the selection of appropriate statistical techniques
- Provide a basis for further data collection
Data(set)
- Koleksi entitas/objek data dan atributnya
- Atribut adalah sifat atau karkteristik dari objek
- Contoh pada objek manusia: umur, berat badan, tinggi badan, jenis kelamin, dsb.
- Setiap atribut memiliki beberapa kemungkinan "state", sebagai contoh: pria/wanita.
- koleksi atribut mendefinisikan suatu objek.
Seringkali pada saat terjun ke lapangan, data yang kita dapat tidak datang dalam keadaan rapi dan bersih, bahkan seringkali data yang kita peroleh sangat berantakan, diperlukan usaha ekstra untuk mempersiapkan data tersebut untuk siap dilakukan analisis
image Source: https://miro.medium.com/max/1869/0*1-i9w0e4kklVQl5B.jpg
Preprocessing¶
- Kunci utama dalam mendapatkan model Data Science yang valid & reliable.
- Preprocessing yang berbeda akan menghasilkan kesimpulan/insight yang berbeda.
Beberapa Proses Dasar¶
- Seleksi variable dan "Join"
- Data Cleaning : Duplikasi, Noise dan Outliers
- Transformasi Data
- Dimensional Reduction
Data Understanding: Relevance¶
- Data apa yang tersedia?
- Seberapa banyak (dan lama) data tersedia?
- Ada yang memiliki label? (Variabel Target)
- Apakah data ini relevan? Atau bisa dibuat relevan?
- Bagaimana dengan kualitas data ini?
- Ada data tambahan (eksternal)?
- Siapa yang memahami tentang data ini dengan baik di perusahaan?
Mengapa perlu preprocessing?¶
- Data di dunia nyata biasanya tidak sebersih/indah data di buku akademik.
- Noise: Misal gaji bernilai negatif
- Ouliers: Misal seseorang dengan penghasilan >500 juta/bulan.
- Duplikasi: Banyak di media sosial
- Encodings, dsb: Banyak di Big Data, karena masalah bagaimana data disimpan/join.
- Tidak lengkap: hanya agregat, kurang variabel penting, dsb.
- Analisa pada data yang tidak di preprocess biasanya menghasilkan insight yang tidak/kurang tepat.
Garbage in-Garbage out¶
Beberapa langkah utama:¶
- Data Gathering:
- Data warehouse, database, web crawling/scrapping/streaming.
- Identifikasi, ekstraksi, dan integrasi data
- Data Cleaning:
- Transformasi data (misal encoding var kategorik)
- Normalisasi/standarisasi
- Data reduction:
- variable selection (domain knowledge/automatic)
- Feature Engineering
- Variable reduction
Studi Kasus¶
- Misal seorang Data Scientist ditugaskan untuk menentukan investasi properti terbaik.
- Tujuan analisa di modul ini adalah menemukan harga rumah yang lebih rendah dari harga pasaran
- Asumsikan kita memiliki data harga rumah yang ditawarkan dan variabel-variabel terkait lainnya.
- Untuk membuat keputusan investasi, kita akan melakukan EDA dan membuat pada data yang ada.
Contoh Kasus Data Harga Property Rumah¶
- Sumber Data: http://byebuyhome.com/
- Objective: menemukan harga rumah yang berada di bawah pasaran.
- Variable:
- Dist_Taxi – distance to nearest taxi stand from the property
- Dist_Market – distance to nearest grocery market from the property
- Dist_Hospital – distance to nearest hospital from the property
- Carpet – carpet area of the property in square feet
- Builtup – built-up area of the property in square feet
- Parking – type of car parking available with the property
- City_Category – categorization of the city based on the size
- Rainfall – annual rainfall in the area where property is located
- House_Price – price at which the property was sold
Catatan penting:¶
Harap pelajari https://tau-data.id/dfds-01/ & https://tau-data.id/adsp-01/ dengan baik*.¶
# Importing Some Python Modules
import warnings; warnings.simplefilter('ignore')
import scipy, itertools, pandas as pd, matplotlib.pyplot as plt, seaborn as sns, numpy as np
from scipy import stats
from sklearn.preprocessing import StandardScaler, MinMaxScaler
plt.style.use('bmh'); sns.set()
# Importing CSV data https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
try:
# Running Locally
price = pd.read_csv('data/price.csv')
except:
# Running in Google Colab
!mkdir data
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/price.csv
price = pd.read_csv('data/price.csv')
Prefer XLS atau CSV di Data Science/Machine Learning ... Mengapa?¶
# Tipe Datanya : DataFrame (df)
print(type(price))
# Ukuran Data
N, P = price.shape
'baris = ', N, ', Kolom = ', P
# "Mengintip" beberapa data pertamanya
price.head(7)
# "Mengintip" beberapa data akhirnya
price.tail(9)
# chosen at random
price.sample(10)
Removing a variable(s)¶
# perhatikan perintahnya tidak menggunakan tanda "()" ==> Properties
price.columns
# Drop kolom pertama karena tidak berguna (hanya index)
price.drop("Observation", axis=1, inplace=True)
Mengoreksi Tipe variabel¶
# tipe data di setiap kolom
# Wajib di periksa apakah tipe datanya sudah tepat?
# Perhatikan df sebagaimana semua variable di Python diperlakukan seperti object
price.info()
# dataframe types: https://pbpython.com/pandas_dtypes.html
price['Parking'] = price['Parking'].astype('category')
price['City_Category'] = price['City_Category'].astype('category')
price.dtypes
Removing Duplicate Data¶
- Banyak di temukan di sistem Big Data.
- mempengaruhi model dan analisa yang berdasarkan frekuensi.
- Terkadang kita sengaja membuat duplikasi (misal pada kasus imbalanced learning).
image source: http://www.dagdoo.org/excel-learning/power-query/
#mengecek apakah ada duplikat data?
print(price.shape)
price.duplicated().sum()
#menghapus entri yang memiliki data duplikat
price.drop_duplicates(inplace=True)
print(price.duplicated().sum()) # no more duplicates
print(price.shape) # re-check by printing data size
Variable Selection¶
# Memilih hanya variable dengan tipe tertentu
price_num = price.select_dtypes(include = ['float64', 'int64'])
price_num.head()
# Perhatikan price_num adalah variable df baru! ... (hati-hati di data yang besar)
# Memilih hanya variable dengan tipe tertentu
price_cat = price.select_dtypes(include = ['category'])
price_cat.head()
Dasar Pengolahan variabel Kategorik: Dummy Variable¶
df = pd.get_dummies(price['Parking'], prefix='Park')
df.head()
Menggabungkan dengan data awal (concat)¶
df2 = pd.concat([price, df], axis = 1)
df2.head().transpose()
Memilih Data Secara Manual¶
# Choosing some columns manually
X = price[['House_Price','Dist_Market']]
X[:7]
Noisy Data¶
- Noise dapat terjadi karena:
- Kesalahan instrumen pengukuran: Misal di alat IoT pada saat cuaca buruk/baterai yang lemah.
- Kesalahan input/entry
- Transmisi yang tidak sempurna
- inkonsistensi penamaan
Outliers¶
- Data yang memiliki karakteristik secara signifikan berbeda dengan kebanyakan data lainnya menurut suatu kriteria tertentu yang ditetapkan.
- Datanya valid (bukan Noise)
- di Big Data sangat umum terjadi.
- Apa yang sebaiknya dilakukan ke outliers?
Univariate Outliers¶
- Quartiles (Boxplot)
- Asumsi Normal
- Asumsi distribusi lain
Multivariate Outliers¶
- Clustering (DBSCAN)
- Isolation Forest
Perbandingan beberapa metode pendeteksian outliers (multivariate):
- http://scikit-learn.org/stable/auto_examples/applications/plot_outlier_detection_housing.html#sphx-glr-auto-examples-applications-plot-outlier-detection-housing-py
- http://scikit-learn.org/stable/auto_examples/covariance/plot_outlier_detection.html#sphx-glr-auto-examples-covariance-plot-outlier-detection-py
- http://scikit-learn.org/stable/auto_examples/neighbors/plot_lof.html#sphx-glr-auto-examples-neighbors-plot-lof-py
- http://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#sphx-glr-auto-examples-preprocessing-plot-all-scaling-py
- https://blog.dominodatalab.com/topology-and-density-based-clustering/
Apakah ada kecenderungan perbedaan harga rumah akibat dari tipe tempat parkir?¶
p= sns.catplot(x="Parking", y="House_Price", data=price)
# Apa yang bisa dilihat dari hasil ini?
# Distributions
p = sns.distplot(price['House_Price'], kde=True, rug=True)
# Misal dengan asumsi data berdistribusi normal
# dan menggunakan 95% confidence interval di sekitar variabel "harga"
df = np.abs(price.House_Price - price.House_Price.mean())<=(2*price.House_Price.std())
# mu-2s<x<mu+2s
print(df.shape)
df.head()
price2 = price[df] # Data tanpa outliers
print(price2.shape, price.shape)
# Perhatikan disini sengaja data yang telah di remove outliernya
# disimpan dalam variabel baru "Price2"
# Jika datanya besar hati-hati melakukan hal ini
# Distributions
p = sns.distplot(price2['House_Price'], kde=True, rug=True)
p= sns.catplot(x="Parking", y="House_Price", data=price2)
# Apa yang bisa dilihat dari hasil ini?
Missing Values¶
Salah satu proses dalam ‘membersihkan data’ itu adalah mengidentifikasi dan menghandle missing value, apa itu missing value? Missing value adalah istilah untuk data yang hilang
Penyebab Missing Value¶
Data yang hilang ini bisa disebabkan oleh beberapa hal, salah satu contohnya adalah
- Error pada data entry, baik itu human error ataupun kesalahan pada sistem
- Pada data survey, bisa disebabkan oleh responden yang lupa mengisi pertanyaan, pertanyaan yang sulit dimengerti, ataupun pertanyaan enggan diisi karena merupakan pertanyaan yang sensitif
Bagaimana cara mendeteksi Missing Value?¶
Biasanya untuk menandakan bahwa suatu data hilang, cell tersebut dibiarkan kosong
Nah, permasalahan yang dihadapi pada data di lapangan adalah, penandaan untuk mengatakan bahwa data tersebut missing sangat beragam, bisa ditulis ‘?’ (tanda tanya), bisa ditulis ‘-‘ (strip), bisa suatu bilangan yang sangat besar atau sangat kecil (misal 99 atau -999)
Sebagai ilustrasi, perhatikan berikut ini:
Perhatikan bahwa data ini memiliki berbagai macam cara untuk mengatakan bahwa data pada cell tertentu adalah missing, misalnya:
- cellnya dikosongkan
- ditulis dengan n/a, NA, na, ataupun NaN
- ditulis dengan symbol –
- ataupun mempunyai nilai yang cukup aneh seperti nilai 12 pada kolom OWN_OCCUPIED, ataupun HURLEY pada kolom NUM_BATH
Ketika kita meng-load data ini ke python menggunakan pandas, beberapa notasi missing yang umum otomatis dikategorikan sebagai NaN (notasi missing value pada python)
Tipe Missing Value¶
Missing completely at random (MCAR)¶
Data hilang secara acak, dan tidak berkaitan dengan variabel tertentu
Missing at random (MAR)¶
Data di suatu variabel hilang hanya berkaitan dengan variabel respon/pengamatan. Sebagai contoh, orang yang memiliki rasa was-was tinggi (x) cenderung tidak melaporkan pendapatan (y) mereka, walaupun missing value bergantung pada berapa nilai x, tapi seberapa besar nilai y yang missing tersebut masih tetap acak
Missing not at random (MNAR)¶
Data di suatu variabel y berkaitan dengan variabel itu sendiri, tidak terdistribusi secara acak. Sebagai contoh, orang yang pendapatannya rendah cenderung tidak melaporkan pendapatannya. Tipe missing value ini yang relatif paling sulit untuk di handle
Pada MCAR dan MAR, kita boleh menghilangkan data dengan missing value ataupun mengimputasinya. Namun pada kasus MNAR, menghilangkan data dengan missing value akan menghasilkan bias pada data. mengimputasinya pun tidak selalu memberikan hasil yang baik
Menangani Missing Value¶
Setelah kita mengenali apa itu missing value, bagaimana biasanya missing value itu ditulis, dan juga apa saja tipe missing value. Sekarang akan dijelaskan bagaimana cara menghandle missing value
sumber gambar : https://towardsdatascience.com/how-to-handle-missing-data-8646b18db0d4¶
Perlu dicatat bahwa, tidak ada metode yang benar benar terbaik dalam menghandle missing value, metode yang dapat digunakan akan bergantung pada tipe data dan masalah yang ditelaah
Menghindari data dengan missing value¶
yaitu drop data / menghapus data yang mengandung missing value ataupun menghapus variabel yang memiliki banyak sekali missing value
Cara menghapus data inipun ada beberapa macam
- Listwise Deletion, yaitu menghapus row yang mempunyai satu atau lebih missing
- Pairwise Deletion, yaitu hanya menghapus missing value pada variabel variabel yang ingin digunakan, misal kita ingin mencari korelasi antara glucose_conc dan diastolic_bp, kita hanya perlu menghapus row berikut ini
- Menghapus variabel, yaitu membuang variabel jika data pada kolom tersebut banyak sekali yang missing, misalkan hampir 50%.
Mengabaikan missing value¶
Beberapa algoritma machine learning atau metode analisis lainnya dapat dengan sendirinya menghandle missing value, contohnya adalah decision tree, k-Nearest Neighbors (kNN), Gradient Boosting Method (GBM) yang dapat mengabaikan missing value, ataupun XGBoost yang dapat mengimputasi sendiri missing value pada data
Ataupun jika ada beberapa kolom yang tidak memberikan informasi apa apa, kita dapat membiarkan missing value ada di kolom tersebut karena kolom tersebut pun tidak memberikan informasi yang signifikan, contohnya adalah nomor tiket pada data penerbangan, kita tidak perlu sulit-sulit memikirkan bagaimana cara mengimputasi kolom tersebut.
Mengimputasinya¶
Kita dapat menggantikan missing value tersebut dengan suatu nilai, ada beberapa metode dalam mengimputasi missing value
• Univariate Imputation¶
Imputasi dengan median / mean / modus¶
Imputasi dengan median / mean digunakan pada data numerik, idenya kita mengganti missing value pada kolom dengan median / mean dari data yang tidak missing, sedangkan imputasi dengan modus digunakan pada data kategorik.
(catatan : Jika distribusi data cukup skewed (menceng kanan atau kiri), atau terdapat nilai nilai ekstrim, median lebih di sarankan daripada mean)
Alternatifnya, kita pun dapat membedakan imputasi berdasarkan variabel kategorik tertentu, misalnya untuk yang penderita diabetes, akan diimputasi dengan rata rata dari penderita diabetes, dan sebaliknya
• Multivariate Imputation¶
Single Imputation¶
Metode metode yang dapat digunakan adalah memprediksi nilai missing dengan menggunakan metode metode supervised learning seperti kNN, regresi linear, regresi logistik (untuk data kategorik)
Kasus Lainnya¶
Salah satu cara menangani missing value pada data kategorik dapat dijadikan level tersendiri
missing value pada data Time Series, imputasi dapat dilakukan dengan:
mengisi nilai yang missing dengan nilai sebelumnya yang tidak missing, sering disebut juga dengan Last Observation Carried Forward (LOCF) ataupun dengan nilai selanjutnya yang tidak missing, sering disebut juga Next Observation Carried Backward (NOCB)
Menggunakan Interpolasi Linear
- Menggunakan Interpolasi Linear dengan memperhitungkan tren seasonal
Missing Values¶
# General Look at the Missing Values
print(price2.isnull().sum())
set(price2['Parking'])
Gambaran yang Lebih baik tentang MV terutama di Big Data¶
sns.heatmap(price2.isnull(), cbar=False)
plt.title('Heatmap Missing Value')
plt.show()
(price2.isnull().sum()/len(price2)).to_frame('persentase missing')
# Simplest solution, if the MV is not a lot
# drop rows with missing values : Ada berbagai cara
X = price.dropna() # jika ada MV minimal satu di salah satu kolom, maka baris di hapus
price2.dropna(how='all') # jika ada MV di semua kolom, maka baris di hapus
price2.dropna(thresh=2) # jika ada MV minimal di salah 2 kolom, maka baris di hapus
price2.dropna(subset=['Dist_Hospital'])[:7] # jika ada MV minimal satu di salah kolom Dist_Hospital
# inplace=True if really really sure
price2.dropna(inplace=True)
print(price2.isnull().sum())
image source: http://writer.lk/portfolio-item/statistics/¶
Central Tendency is not enough¶
Keragaman Data¶
Statistika Deskriptif¶
price2.describe()
# Statistika Sederhana dari data "Numerik"-nya
price2.describe(include='all')
# ini adalah parameter tambahan jika kita juga ingin mendapatkan statistik sederhana seluruh datanya
# (termasuk data kategorik)
price[['Dist_Taxi','Parking']].describe(include='all')
Distribusi nilai pada setiap variabel kategorik¶
# get all unique values of a variable/column
for col in price_cat.columns:
print(col,': ', set(price[col].unique()))
price['Parking'].unique()
# price
# Jika yang dibutuhkan memang hanya nama kolom, maka kita bisa melakukan hal ini untuk menghemat penggunaan memory
numVar = price.select_dtypes(include = ['float64', 'int64']).columns
list(numVar)
# Distribusi tiap data
price['Parking'].value_counts()
# kita bisa juga visualisasikan informasi ini
Two-Way Tables (contingency tables)¶
CT = pd.crosstab(index=price2["City_Category"], columns=price2["Parking"])
CT
Data Grouping¶
# Slicing DataFrame - Just like query in SQL
price2[price2["City_Category"] == "CAT B"].describe()
# Bisa ditambahkan .drop("Parking", axis=1) untuk menghilangkan kolom dengan single value
Saving (preprocessed) Data¶
# Saving the preprocessed Data for future use/analysis
price2.to_csv("data/price_PreProcessed.csv", encoding='utf8')
End of Module¶
Referensi
- Cox, V. (2017). Exploratory data analysis. In Translating Statistics to Make Decisions (pp. 47-74). Apress, Berkeley, CA.
- DuToit, S. H., Steyn, A. G. W., & Stumpf, R. H. (2012). Graphical exploratory data analysis. Springer Science & Business Media.
- Bock, H. H., & Diday, E. (Eds.). (2012). Analysis of symbolic data: exploratory methods for extracting statistical information from complex data. Springer Science & Business Media.
- Cleveland, W.S., 1993. Visualizing Data. Hobart Press.
- Cleveland, W.S., 1994. The elements of graphing data. Hobart Press.
- Few, S., 2009. Now you see it. Analytics Press.
- Harris, R.L., 1999. Information Graphics. Oxford University Press.
- Healy, K., 2018. Data Visualization: A Practical Introduction. Princeton University Press.
- Knaflic, C.N., 2015. Storytelling with Data. Wiley.
- Robbins, N.B., 2005. Creating More Effective Graphs. Wiley.
- Tufte, E.R., 2001. The Visual Display of Quantitative Information, 2nd ed. Cheshire, CT: Graphics Press.
- Tufte, E.R., 1997. Visual Explanations. Cheshire, CT: Graphics Press.
- Tufte, E.R., 2006. Beautiful evidence. Cheshire, CT: Graphics Press.
- Wainer, H., 2009. Picturing the Uncertain World. Princeton University Press.
- Yau, N., 2013. Data Points – Visualization that means something. Wiley.
- Huff, D. (1993). How to lie with statistics. WW Norton & Company.
- Reinhart, A. (2015). Statistics done wrong: The woefully complete guide. No starch press.
Warning, you need to login (to tau-data & Google) to view the quiz.
(Registration is free and easy: click here)
No comments:
Post a Comment
Relevant & Respectful Comments Only.