Sepuluh chapter belakangan ini kita mengumpulkan peralatan satu per satu: memeriksa struktur, meringkas, menghitung frekuensi dan distribusi, menelusuri hubungan antar variabel, membaca dimensi waktu, hingga menandai pola dan anomali. Exploratory Data Analysis (EDA) adalah momen seluruh peralatan itu dipakai bersama pada satu dataset utuh — bukan sebagai rangkaian latihan terpisah, melainkan sebagai alur kerja yang runtut: mulai dari pertanyaan, pemeriksaan struktur dan kualitas, penyelaman per variabel, pembagian menurut kelompok, sampai perumusan temuan yang siap dilaporkan. Pada chapter penutup Section ini kita menjalankan EDA penuh terhadap satu dataset baru: catatan penjualan menu Toko Kopi Kita selama sepuluh hari pertama bulan Februari.
Dataset dan Pertanyaan Analisis #
Dataset kita, penjualan_menu.csv, memuat satu baris per produk per hari: menu apa yang terjual, berapa gelas, dan berapa pendapatannya dalam ribuan rupiah. Empat menu utama berjualan sepanjang periode — kopi susu, matcha latte, americano, dan teh tawar — selama Senin 2 Februari sampai Rabu 11 Februari 2026. Berikut sepuluh baris pertamanya:
tanggal,produk,gelas,pendapatan_ribu
2026-02-02,kopi susu,32,768
2026-02-02,matcha latte,18,504
2026-02-02,americano,25,550
2026-02-02,teh tawar,12,240
2026-02-03,kopi susu,30,720
2026-02-03,matcha latte,20,560
2026-02-03,americano,24,528
2026-02-03,teh tawar,10,200
2026-02-04,kopi susu,34,816
2026-02-04,matcha latte,19,532
2026-02-04,americano,26,572
2026-02-04,teh tawar,11,220
2026-02-05,kopi susu,31,744
2026-02-05,matcha latte,21,588
2026-02-05,americano,23,506
2026-02-05,teh tawar,12,240
2026-02-06,kopi susu,45,1080
2026-02-06,matcha latte,24,672
2026-02-06,americano,18,396
2026-02-06,teh tawar,14,280
2026-02-07,kopi susu,52,1248
2026-02-07,matcha latte,30,840
2026-02-07,americano,12,264
2026-02-07,teh tawar,16,320
2026-02-08,kopi susu,50,1200
2026-02-08,matcha latte,28,784
2026-02-08,americano,10,220
2026-02-08,teh tawar,15,300
2026-02-09,kopi susu,33,792
2026-02-09,matcha latte,26,728
2026-02-09,americano,24,528
2026-02-09,teh tawar,11,220
2026-02-10,kopi susu,35,840
2026-02-10,matcha latte,29,812
2026-02-10,americano,22,484
2026-02-10,teh tawar,12,240
2026-02-11,kopi susu,32,768
2026-02-11,matcha latte,31,868
2026-02-11,americano,25,550
2026-02-11,teh tawar,10,200EDA yang runtut selalu dimulai dari pertanyaan, bukan dari kode. Untuk dataset ini kita membawa tiga pertanyaan dari pemilik toko:
- Menu mana yang paling menopang penjualan, dan seberapa besar bagiannya?
- Apakah ada menu yang penjualannya bergantung jenis hari — hari kerja dibandingkan akhir pekan?
- Adakah menu yang trennya sedang berubah — membaik atau memburuk — selama periode ini?
Langkah 1: Periksa Struktur dan Kualitas #
Sebelum percaya pada data, kita perlu memastikan bentuk dan kesehatannya: berapa baris dan kolom, tipe apa saja, apakah ada nilai kosong atau baris ganda. Pemeriksaan ini murah tetapi menentukan — kesalahan yang ditemukan di sini belum sempat mencemari kesimpulan apa pun:
import pandas as pd
df = pd.read_csv("penjualan_menu.csv", parse_dates=["tanggal"])
print("Ukuran:", df.shape)
print("Tipe kolom:")
print(df.dtypes.to_string())
print()
print("Nilai kosong per kolom:", df.isna().sum().sum())
print("Baris duplikat:", df.duplicated().sum())
print()
print(df.head(4).to_string(index=False))Output yang Dihasilkan:
Ukuran: (40, 4)
Tipe kolom:
tanggal datetime64[ns]
produk object
gelas int64
pendapatan_ribu int64
Nilai kosong per kolom: 0
Baris duplikat: 0
tanggal produk gelas pendapatan_ribu
2026-02-02 kopi susu 32 768
2026-02-02 matcha latte 18 504
2026-02-02 americano 25 550
2026-02-02 teh tawar 12 240Empat puluh baris berarti 10 hari × 4 produk — sesuai perkiraan, tidak ada hari atau menu yang hilang. Tipe kolom sudah benar sejak dibaca (berkat parse_dates), tidak ada nilai kosong, tidak ada baris ganda. Data ini sehat dan siap dianalisis; pada data nyata, langkah inilah tempat kita menemukan masalah seperti yang kita latih di Section Data Cleaning
.
Langkah 2: Selami Satu Variabel Lebih Dulu #
Pertanyaan pertama menyangkut peringkat menu. Sebelum membagi-bagi menurut hari, kita lihat dulu gambaran besarnya: total gelas per produk, lalu sebaran statistik kolom gelas untuk mengenal nilai tipisnya:
import pandas as pd
df = pd.read_csv("penjualan_menu.csv", parse_dates=["tanggal"])
total = df.groupby("produk")["gelas"].sum().sort_values(ascending=False)
print("Total gelas per produk (10 hari):")
print(total.to_string())
print()
print("Statistik gelas harian:")
print(df["gelas"].describe().round(1).to_string())Output yang Dihasilkan:
Total gelas per produk (10 hari):
produk
kopi susu 374
matcha latte 246
americano 209
teh tawar 123
Statistik gelas harian:
count 40.0
mean 23.8
std 10.7
min 10.0
25% 14.8
50% 24.0
75% 30.2
max 52.0Kopi susu memimpin jauh dengan 374 gelas — hampir 40% dari total 952 gelas seluruh menu — disusul matcha latte (246), americano (209), dan teh tawar (123). Statistik describe menambahkan konteks: rata-rata 23,8 gelas per hari per menu dengan simpangan baku 10,7; rentangnya lebar, dari 10 gelas (penjualan terendah teh tawar dan americano akhir pekan) sampai 52 gelas (puncak kopi susu di hari Minggu). Jawaban pertanyaan pertama sudah kelihatan, tetapi angka agregat seperti ini menyembunyikan struktur — kita lanjut ke pembagian kelompok.
Langkah 3: Bagi Menurut Jenis Hari #
Pertanyaan kedua menuntut perbandingan antar kelompok: hari kerja lawan akhir pekan, per menu. Kita tandai jenis harinya lewat dt.dayofweek (0=Senin sampai 6=Minggu; nilai 5 ke atas adalah akhir pekan), lalu ringkas dengan pivot_table — rata-rata gelas per menu per jenis hari:
import pandas as pd
df = pd.read_csv("penjualan_menu.csv", parse_dates=["tanggal"])
df["ujung_minggu"] = df["tanggal"].dt.dayofweek >= 5
pola = df.pivot_table(index="produk", columns="ujung_minggu",
values="gelas", aggfunc="mean").round(1)
pola.columns = ["hari_kerja", "akhir_pekan"]
pola["selisih"] = (pola["akhir_pekan"] - pola["hari_kerja"]).round(1)
print(pola.sort_values("selisih", ascending=False).to_string())Output yang Dihasilkan:
hari_kerja akhir_pekan selisih
produk
kopi susu 34.0 51.0 17.0
matcha latte 23.5 29.0 5.5
teh tawar 11.5 15.5 4.0
americano 23.4 11.0 -12.4Tabel ini membalik sebagian cerita agregat. Kopi susu memang rajin di semua hari dan melonjak di akhir pekan (+17 gelas per hari) — pengunjung akhir pekan jelas menuju kopi susu. Yang mengejutkan adalah americano: di hari kerja ia terjual 23,4 gelas per hari (hampir menyamai matcha latte), tetapi runtuh ke 11,0 gelas saat akhir pekan. Pola ini konsisten dengan pelanggannya: pekerja kantoran sekitar gedung yang hadir Senin-Jumat. Teh tawar stabil rendah di semua hari — bukan menu yang sedang naik, juga tidak sedang jatuh.
Langkah 4: Telusuri Tren dalam Waktu #
Pertanyaan ketiga meminta dimensi waktu. Kandidat paling menarik adalah matcha latte: menu yang diluncurkan baru bulan Januari. Kita bandingkan rata-rata hari kerja minggu pertama (2-5 Februari) dengan minggu kedua (9-11 Februari):
import pandas as pd
df = pd.read_csv("penjualan_menu.csv", parse_dates=["tanggal"])
matcha = df[df["produk"] == "matcha latte"].set_index("tanggal")["gelas"]
minggu1 = matcha["2026-02-02":"2026-02-05"]
minggu2 = matcha["2026-02-09":"2026-02-11"]
print("Matcha latte minggu pertama (4 hari):", list(minggu1))
print("Rata-rata:", round(minggu1.mean(), 1))
print("Matcha latte minggu kedua (3 hari):", list(minggu2))
print("Rata-rata:", round(minggu2.mean(), 1))
print()
naik = (minggu2.mean() / minggu1.mean() - 1) * 100
print(f"Kenaikan rata-rata harian: {naik:.1f}%")Output yang Dihasilkan:
Matcha latte minggu pertama (4 hari): [18, 20, 19, 21]
Rata-rata: 19.5
Matcha latte minggu kedua (3 hari): [26, 29, 31]
Rata-rata: 28.7
Kenaikan rata-rata harian: 47.0%Rata-rata harian matcha latte naik dari 19,5 ke 28,7 gelas — kenaikan 47% dalam sepekan, dan deret nilainya (18, 20, 19, 21, lalu 26, 29, 31) menanjak cukup rapi untuk disebut tren, bukan kebetulan satu hari. Dengan catatan: tiga hari pada minggu kedua adalah sampel kecil; kesimpulan yang jujur menyebut batas itu dan merekomendasikan pemantauan dua pekan ke depan sebelum mengambil keputusan besar.
Merangkai Temuan Menjadi Narasi #
Langkah terakhir EDA bukan lagi kode, melainkan tulisan: mengubah angka-angka menjadi temuan yang bisa dibaca pemilik toko. Kumpulkan setiap temuan beserta buktinya — satu kalimat, satu angka:
import pandas as pd
df = pd.read_csv("penjualan_menu.csv", parse_dates=["tanggal"])
temuan = pd.DataFrame({
"temuan": [
"Produk terlaris",
"Penguasa akhir pekan",
"Menu pekerja kantoran",
"Menu yang sedang naik daun",
],
"bukti": [
"kopi susu: 374 gelas (39,3% dari 952)",
"kopi susu naik 34,0 ke 51,0 gelas/hari",
"americano: 23,4 di hari kerja, 11,0 akhir pekan",
"matcha latte: 19,5 ke 28,7 gelas/hari (+47,0%)",
],
})
print(temuan.to_string(index=False))Output yang Dihasilkan:
temuan bukti
Produk terlaris kopi susu: 374 gelas (39,3% dari 952)
Penguasa akhir pekan kopi susu naik 34,0 ke 51,0 gelas/hari
Menu pekerja kantoran americano: 23,4 di hari kerja, 11,0 akhir pekan
Menu yang sedang naik daun matcha latte: 19,5 ke 28,7 gelas/hari (+47,0%)Tabel kecil semacam ini adalah jembatan menuju laporan: setiap baris adalah satu klaim yang bisa dilacak balik ke kode di atasnya. Dari sini rekomendasi mengalir alami — jaga stok kopi susu menjelang akhir pekan, pertahankan promosi hari kerja untuk americano, dan beri matcha latte dua pekan lagi sebelum memutuskan menaikkan porsi produksinya.
Rangkuman #
- EDA adalah alur, bukan kumpulan teknik: pertanyaan → struktur dan kualitas → per variabel → antar kelompok → dimensi waktu → temuan yang berbukti.
- Periksa struktur dulu (ukuran, tipe, kosong, duplikat) agar kesalahan data tertangkap sebelum mencemari kesimpulan.
- Angka agregat (total, rata-rata) adalah titik awal, bukan titik akhir — pembagian kelompok (hari kerja vs akhir pekan) hampir selalu menemukan struktur yang tersembunyi.
- Tren yang tampak jelas pada sampel kecil tetap perlu batas kepercayaan: sebutkan jumlah harinya dan rencana verifikasi lanjutan.
- Tutup EDA dengan tabel temuan-bukti; ia menjadi draf laporan sekaligus alat audit ulang keseluruhan analisis.
Angka-angka yang sudah tertata rapi ini akan jauh lebih bermakna ketika pembaca bisa melihatnya: batang yang menunjukkan peringkat menu, garis yang menanjak untuk matcha latte, dua warna yang memisahkan hari kerja dari akhir pekan. Section berikutnya, Visualisasi Data , mengajari kita memilih dan membuat grafik yang tepat untuk setiap temuan.