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:

csv
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,200

EDA yang runtut selalu dimulai dari pertanyaan, bukan dari kode. Untuk dataset ini kita membawa tiga pertanyaan dari pemilik toko:

  1. Menu mana yang paling menopang penjualan, dan seberapa besar bagiannya?
  2. Apakah ada menu yang penjualannya bergantung jenis hari — hari kerja dibandingkan akhir pekan?
  3. 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:

python
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:

text
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              240

Empat 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:

python
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:

text
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.0

Kopi 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:

python
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:

text
              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.4

Tabel 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):

python
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:

text
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:

python
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:

text
                    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.

Referensi #

  1. pandas — Getting Started: Intro Tutorials
  2. pandas — API Reference: DataFrame.pivot_table
  3. pandas — User Guide: Time Series