Kursus
Catatan editor: Jean-Nicholas Hould adalah data scientist di Intel Security di Montreal dan ia mengajarkan cara memulai data science di blognya.
Exploratory data analysis (EDA) adalah pendekatan statistik yang bertujuan untuk menemukan dan merangkum sebuah dataset. Pada tahap proses data science ini, Anda ingin mengeksplorasi struktur dataset, variabel-variabelnya, dan hubungan di antaranya.
Dalam tulisan ini, Anda akan berfokus pada satu aspek dari exploratory data analysis: pemprofilan data.
Pemprofilan data adalah tentang merangkum dataset Anda melalui statistik deskriptif. Anda ingin menggunakan beragam pengukuran untuk memahami dataset dengan lebih baik. Tipe data, nilai hilang, mean, median, dan standar deviasi hanyalah beberapa dari banyak elemen yang perlu Anda kumpulkan saat memprofilkan sebuah dataset. Tujuan pemprofilan data adalah memiliki pemahaman yang solid tentang data Anda sehingga Anda dapat mulai melakukan kueri dan memvisualisasikan data dengan berbagai cara.
Ketahui dari mana Data Anda Berasal
Sebelum terjun ke EDA, Anda sebaiknya mengetahui sebanyak mungkin tentang asal-usul data yang Anda analisis. Anda perlu memahami bagaimana data dikumpulkan dan bagaimana data diproses. Adakah transformasi sebelumnya pada data yang dapat memengaruhi analisis Anda?
Anda seharusnya dapat menjawab pertanyaan-pertanyaan ini tentang dataset Anda:
- Bagaimana data dikumpulkan?
- Apakah ini sebuah sampel?
- Apakah penyampelannya dilakukan dengan benar?
- Apakah dataset telah ditransformasikan dengan cara apa pun?
- Apakah ada masalah yang diketahui pada dataset?
Jika Anda tidak memahami dari mana data berasal, Anda akan kesulitan menarik kesimpulan yang bermakna dari dataset. Anda juga berisiko membuat kesalahan analisis yang sangat penting.
Selain itu, Anda harus memastikan dataset terstruktur dengan cara yang terstandardisasi. Format yang direkomendasikan adalah bentuk normal ketiga, juga disebut tidy data. Dataset yang “rapi” memiliki atribut berikut:
- Setiap variabel membentuk sebuah kolom dan berisi nilai
- Setiap observasi membentuk sebuah baris
- Setiap jenis unit observasional membentuk sebuah tabel
Mematuhi format standar ini akan mempercepat analisis Anda karena kompatibel dengan banyak alat dan pustaka.
Pemprofilan Data
Dalam tulisan ini, Anda akan menggunakan dataset Craft Beers dari situs CraftCans. Dataset ini hanya berisi data dari bir kaleng dari pabrik bir di Amerika Serikat. Tidak jelas dari situs tersebut apakah dataset ini mencatat setiap bir kaleng yang diseduh di AS atau tidak. Untuk amannya, Anda akan menganggap dataset ini sebagai sampel yang mungkin mengandung bias.
Berikut adalah struktur dataset yang akan Anda gunakan:
Beers:
ID: Pengidentifikasi unik untuk bir.Name: Nama bir.ABV: Kadar alkohol berdasarkan volume dari bir.IBU: International Bittering Units dari bir.Style: Gaya bir.Ounces: Ukuran bir dalam ons.
Breweries:
ID: Pengidentifikasi unik untuk pabrik bir.Name: Nama pabrik bir.City: Kota tempat pabrik bir berada.State: Negara bagian tempat pabrik bir berada.
Tipe Data
Langkah pertama adalah memahami komposisi dataset Anda.
Variabel apa saja yang Anda hadapi?
Secara umum Anda dapat memasukkan data ke dalam salah satu kategori berikut:
- Numerik
- Kategorikal
- Teks
- Tanggal
Anda akan mengimpor dataset yang dapat Anda temukan di repositori ini dengan fungsi from_csv milik pandas. Anda juga akan menggabungkan dataset beers dan breweries untuk memudahkan analisis selanjutnya.
import pandas as pd
beers = pd.DataFrame.from_csv("https://raw.githubusercontent.com/nickhould/craft-beers-dataset/master/data/craftcans_beers.csv")
breweries = pd.DataFrame.from_csv("https://raw.githubusercontent.com/nickhould/craft-beers-dataset/master/data/craftcans_breweries.csv")
beers_and_breweries = pd.merge(beers,
breweries,
how='inner',
left_on="brewery_id",
right_on="id",
sort=True,
suffixes=('_beer', '_brewery'))
Dengan pustaka pandas, Anda dapat menjalankan fungsi dtypes untuk mencantumkan setiap kolom dan tipe datanya.
beers.dtypes
Yang memberikan hasil sebagai berikut:
abv float64
ibu float64
id int64
name object
style object
brewery_id int64
ounces float64
dtype: object
Seperti yang terlihat di atas, fungsi tersebut tidak mengelompokkan tipe data yang berbeda dengan rapi. Berbagai tipe data numerik (float64 dan int64) tidak dikelompokkan ke dalam satu kategori seperti yang kita inginkan. Selain itu, beberapa kolom terdaftar sebagai objek yang tidak terlalu membantu.
Untuk mengatasi hal ini, Anda dapat membangun fungsi sendiri yang akan menentukan kategori setiap kolom dalam sebuah DataFrame.
def get_var_category(series):
unique_count = series.nunique(dropna=False)
total_count = len(series)
if pd.api.types.is_numeric_dtype(series):
return 'Numerical'
elif pd.api.types.is_datetime64_dtype(series):
return 'Date'
elif unique_count==total_count:
return 'Text (Unique)'
else:
return 'Categorical'
def print_categories(df):
for column_name in df.columns:
print(column_name, ": ", get_var_category(df[column_name]))
Beers Variabel
print_categories(beers)
Perintah di atas memberi Anda hasil berikut:
abv : Numerical
ibu : Numerical
id : Numerical
name : Categorical
style : Categorical
brewery_id : Numerical
ounces : Numerical
Breweries Variabel
print_categories(breweries)
Yang memberikan hasil berikut:
name : Categorical
city : Categorical
state : Categorical
id : Numerical
Dengan informasi ini, Anda sudah dapat lebih memahami dataset kita. Anda tahu bahwa Anda hanya berurusan dengan data kategorikal dan numerik. Variabel numerik dapat digunakan untuk mengekstrak berbagai pengukuran seperti mean, standar deviasi, dan sebagainya. Variabel kategorikal umumnya merupakan cara yang menarik untuk melakukan segmentasi dan pengelompokan data. Misalnya, Anda mungkin ingin memahami bagaimana IBU berbeda di antara berbagai gaya bir.
Statistik Deskriptif
Pada bagian ini, Anda akan menelusuri berbagai statistik deskriptif yang dapat digunakan untuk lebih memahami data kita. Anda akan melihat bahwa masing-masing pengukuran tersebut secara terpisah tidak terlalu membantu. Kombinasi dari berbagai pengukuran inilah yang memungkinkan Anda mengekstrak nilai paling besar.
Anda akan berfokus pada variabel IBU karena ini adalah variabel numerik. Jenis variabel ini menawarkan rentang pengukuran yang lebih luas dibandingkan variabel kategorikal. Anda tetap dapat menjalankan pengukuran pada variabel kategorikal, tetapi akan jauh lebih terbatas.
Panjang
Fungsi len menghitung jumlah observasi dalam sebuah Series. Fungsi ini akan menghitung semua observasi, terlepas dari ada tidaknya nilai hilang atau null.
length = len(beers["ibu"])
print(length)
Dalam Series ini kita memiliki total 2410 observasi.
Hitung
Fungsi count akan mengembalikan jumlah observasi non-NA/non-null dalam sebuah Series.
count = beers["ibu"].count()
print(count)
Seperti yang terlihat, Anda memiliki 1405 observasi non-null dalam Series ini.
Nilai Hilang
Dengan Length dan Count, kini kita dapat menghitung jumlah nilai hilang. Jumlah nilai hilang adalah selisih antara Length dan Count.
number_of_missing_values = length - count
pct_of_missing_values = float(number_of_missing_values / length)
pct_of_missing_values = "{0:.1f}%".format(pct_of_missing_values*100)
print(pct_of_missing_values)
Untuk menampilkan nilai hilang sebagai persentase, Anda cukup membagi jumlah nilai hilang dengan total jumlah observasi, yaitu panjangnya. Fungsi float digunakan untuk memastikan desimal tertangkap dalam pembagian. Fungsi format digunakan untuk memformat angka dengan rapi sebagai persentase.
Dalam kasus ini, Anda kehilangan hampir 42% dari variabel IBU. Ini penting untuk diketahui karena akan memengaruhi analisis Anda. Sebagian besar statistik deskriptif akan mengabaikan nilai hilang tersebut dan ini pasti menyebabkan bias.
Nilai Minimum/Maksimum
Nilai minimum dan maksimum suatu dataset dapat diperoleh dengan mudah menggunakan fungsi min dan max pada sebuah Series.
print("Minimum value: ", beers["ibu"].min())
print("Maximum value: ", beers["ibu"].max())
Nilai min/maks membantu memahami rentang nilai dalam sebuah variabel. Dalam kasus ini, IBU berkisar dari 4 hingga 138.
Modus
Modus adalah nilai yang paling sering muncul dalam sebuah dataset. Dapat diperoleh menggunakan fungsi mode pada sebuah Series.
print(beers["ibu"].mode())
Dalam distribusi normal, modus sama dengan mean dan median.
Dalam kasus ini, modus variabel IBU adalah 20. Itulah IBU yang paling sering muncul dalam dataset kita.
Mean
Mean adalah ukuran tendensi sentral. Ini merepresentasikan jumlah dari nilai-nilai dibagi dengan jumlah observasi yang tidak hilang.
Dapat diperoleh dengan fungsi mean pada sebuah Series.
mean = beers["ibu"].mean()
Mean rentan dipengaruhi oleh outlier. Beberapa nilai ekstrem dapat sangat mengubah mean, menariknya naik atau turun.
Median
Median juga merupakan ukuran tendensi sentral. Ini adalah angka yang tepat berada di tengah dari daftar nilai numerik yang diurutkan.
median = beers["ibu"].median()
Pada distribusi yang condong (skewed), median adalah ukuran tendensi sentral yang jauh lebih baik daripada mean.
Pada kasus distribusi IBU, mean dan median berada pada orde besaran yang sama.
Standar Deviasi
Standar deviasi adalah ukuran dispersi. Standar deviasi yang tinggi menunjukkan titik data tersebar pada rentang nilai yang luas. Standar deviasi dinyatakan dalam satuan yang sama dengan nilainya.
standarddev = beers["ibu"].std()
Dalam kasus ini, standar deviasi ~26. Tepatnya 25.954065911259324. Jika distribusi IBU adalah distribusi normal, Anda akan tahu bahwa ~68% observasi berada dalam satu standar deviasi dari mean.
Statistik Kuantil
Kuantil adalah titik potong yang membagi distribusi menjadi ukuran yang sama. Banyak kuantil memiliki nama masing-masing. Jika Anda membagi distribusi menjadi empat kelompok yang sama besar, kuantil yang Anda buat dinamakan quartile. Anda dapat dengan mudah membuat kuantil menggunakan fungsi quantile pada sebuah Series. Anda dapat memberikan sebuah array berisi berbagai kuantil yang ingin dihitung. Pada kasus di bawah, kita ingin membagi distribusi menjadi empat kelompok yang sama.
quantile = beers["ibu"].quantile([.25, .5, .75])
| 0.25 | 21.0 |
| 0.50 | 35.0 |
| 0.75 | 64.0 |
| Name: ibu, | dtype: float64 |
Seperti terlihat di atas, kuantil 50% sama dengan median. Ini adalah nilai yang membagi dataset menjadi dua. Anda juga dapat mencatat bahwa 75% observasi bernilai sama dengan atau di bawah 64 IBU. Selain itu, 50% distribusi berada antara 21 dan 64 IBU. Penting untuk dicatat bahwa nilai hilang tidak diperhitungkan dalam metrik tersebut.
Plot Distribusi
Visualisasi sangat berguna dalam exploratory data analysis. Dalam tulisan ini, kita tidak akan membahas topik visualisasi secara mendalam. Namun, kita tidak bisa membicarakan pemprofilan data tanpa menyebut pentingnya plot frekuensi-distribusi. Ini adalah salah satu visualisasi paling sederhana namun paling kuat. Plot ini menunjukkan frekuensi setiap nilai dalam dataset kita.
Untuk membuat visualisasi ini, kita menggunakan pustaka seaborn`` dengandisplotfunction. Fungsi ini mengharapkan sebuahSeries` tanpa nilai hilang.
import seaborn as sns
sns.set(color_codes=True)
sns.set_palette(sns.color_palette("muted"))
sns.distplot(beers["ibu"].dropna());

Pada plot distribusi ini, Anda dapat dengan jelas melihat beberapa nilai yang sebelumnya kita hitung. Nilai minimal mendekati 0 IBU dan nilai maksimum mendekati 140 IBU. Anda juga jelas melihat bahwa nilai yang paling sering muncul mendekati 20 IBU. Selain informasi ini, kini kita melihat puncak mendekati 60 IBU.
Mengapa ada dua puncak dalam distribusi ini?
Apa yang dapat menjelaskannya? Ini adalah aspek yang dapat kita eksplorasi pada fase kedua exploratory data analysis.
Korelasi
Korelasi adalah cara yang bagus untuk menemukan hubungan antar variabel numerik. Ada berbagai cara untuk menghitung korelasi. Koefisien korelasi Pearson adalah pendekatan yang banyak digunakan yang mengukur ketergantungan linear antara dua variabel. Koefisien korelasi berkisar dari -1 hingga 1. Korelasi 1 adalah korelasi positif total, -1 adalah korelasi negatif total dan 0 adalah korelasi non-linear. Kita dapat melakukan perhitungan tersebut menggunakan fungsi corr pada sebuah Series. Secara default, fungsi ini akan menggunakan perhitungan koefisien korelasi Pearson. Dimungkinkan menggunakan metode perhitungan lain dengan fungsi ini.
beers[["abv", "ibu", "ounces"]].corr()
| abv | ibu | ounces | |
| abv | 1 | 0.670621 | 0.172529 |
| ibu | 0.670621 | 1 | 0.054691 |
| ounces | 0.172529 | 0.054691 | 1 |
Seperti terlihat di atas, korelasi antara IBU dan dirinya sendiri adalah 1. Jelas, variabel numerik berkorelasi sempurna dengan dirinya sendiri. Yang lebih menarik, Anda dapat melihat bahwa korelasi antara ABV dan IBU sama dengan 0.670621. Meskipun ini bukan korelasi positif total, tetap saja cukup tinggi. Ini adalah aspek menarik yang dapat kita eksplorasi lebih lanjut ke depan.
Beberapa catatan tentang variabel non-numerik
Metrik yang sebelumnya diekstrak sebagian besar hanya berlaku untuk nilai numerik. Jika Anda berurusan dengan tipe data lain seperti data kategorikal, Anda tetap dapat mengumpulkan beberapa pengukuran menarik. Anda dapat menghitung frekuensi setiap nilai dalam dataset.
DataFrame memiliki fungsi bernama describe yang merangkum dataset. Jika DataFrame Anda hanya memiliki nilai kategorikal atau teks, ringkasannya akan diadaptasi khusus untuk tipe data ini.
beers[["name", "style"]].describe()
| name | style | |
| count | 2410 | 2405 |
| unique | 2305 | 99 |
| top | Nonstop Hef Hop | American IPA |
| freq | 12 | 424 |
Pustaka Pemprofilan
Seperti yang Anda lihat di atas, mengumpulkan statistik deskriptif bisa menjadi proses yang melelahkan. Untungnya, ada pustaka yang dapat melakukan seluruh perhitungan data untuk Anda. Pustaka-pustaka tersebut menghasilkan profil data Anda yang sangat jelas. pandas-profiling adalah salah satunya. Pustaka tersebut menawarkan pemprofilan statistik siap pakai untuk dataset Anda. Karena dataset yang kita gunakan rapi dan terstandardisasi, kita dapat langsung menggunakan pustaka tersebut pada dataset kita.
import pandas_profiling
pandas_profiling.ProfileReport(beers_and_breweries)
Pertanyaan Lanjutan
Umumnya, setelah Anda memprofilkan dataset, Anda memiliki jauh lebih banyak pertanyaan daripada sebelumnya. Ini bagus karena pertanyaan-pertanyaan baru tersebut akan mendorong exploratory data analysis Anda.
Berikut beberapa pertanyaan yang kami kumpulkan saat melakukan pemprofilan ini:
- 41,7% nilai
IBUhilang. Mengapa demikian? Bagaimana pengaruhnya terhadap analisis kita? - Ada dua puncak dalam distribusi
IBU. Apa yang menjelaskannya? - Apa yang menjelaskan korelasi antara
IBUdanABV? Apa pengaruh gaya bir dalam korelasi ini? - Apakah ada perbedaan dalam
IBU,ABVatauStyleantar wilayah geografis? Bagaimana dengan East Coast vs West Coast?
Pemprofilan data bukan proses linear. Saat Anda memfilter dan menyegmentasi dataset, Anda akan kembali melakukannya dan mengumpulkan statistik deskriptif pada subkelompok data Anda.
Langkah Selanjutnya
Dalam tulisan ini, Anda telah melihat cara memprofilkan sebuah dataset. Anda kini tahu cara mengaitkan variabel ke dalam kelompok tipe data tertentu. Anda juga telah menghitung berbagai statistik deskriptif pada dataset dan memahami cara menafsirkan pengukuran tersebut. Terakhir, Anda telah melihat bahwa ada pustaka yang dapat membantu Anda melakukan perhitungan untuk memprofilkan dataset. Yang lebih penting, Anda telah menghasilkan lebih banyak pertanyaan untuk mendorong exploratory data analysis Anda.
Lihat Tutorial Exploratory Data Analysis Python dari DataCamp.
