Lewati ke konten utama

Exploratory Data Analysis of Craft Beers: Pemprofilan Data

Dalam tutorial ini, Anda akan mempelajari exploratory data analysis (EDA) di Python, dan lebih spesifiknya, pemprofilan data dengan pandas.
Diperbarui 28 Sep 2026  · 14 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

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());

distribution plot

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 IBU hilang. Mengapa demikian? Bagaimana pengaruhnya terhadap analisis kita?
  • Ada dua puncak dalam distribusi IBU. Apa yang menjelaskannya?
  • Apa yang menjelaskan korelasi antara IBU dan ABV? Apa pengaruh gaya bir dalam korelasi ini?
  • Apakah ada perbedaan dalam IBU, ABV atau Style antar 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.

Topik
Analisis Data
Data Science
Python

Pelajari lebih lanjut tentang Python

Kursus

Analisis Data Bayesian dengan Python

4 jam
16.2K
Pelajari semua tentang keunggulan analisis data Bayesian, dan terapkan pada berbagai kasus nyata di dunia nyata!
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat SelengkapnyaLihat Selengkapnya