Struktur dataset sudah kita pahami; kini kita minta tabel itu memperkenalkan isinya. Membaca 18 baris transaksi satu per satu masih mungkin, tetapi membaca 18.000 baris jelas tidak. pandas menyediakan sekelompok alat peringkasan yang memadatkan seluruh kolom menjadi beberapa angka kunci. Pada chapter ini kita memakai describe(), agg(), dan groupby() untuk membuat kartu identitas dataset penjualan Toko Kopi Kita.
Membaca Data dan Ringkasan Numerik Dasar #
Kita memakai berkas transaksi_kopi.csv — 18 pesanan selama sepekan penuh, 13-18 Januari 2025:
tanggal,pelanggan,menu,jumlah,total_ribu
2025-01-13,Budi,kopi susu,2,48
2025-01-13,Siti,teh tawar,1,20
2025-01-13,Dewi,matcha latte,2,56
2025-01-14,Agus,kopi susu,1,24
2025-01-14,Rani,teh tawar,3,60
2025-01-14,Budi,matcha latte,1,28
2025-01-15,Siti,kopi susu,2,48
2025-01-15,Dewi,teh tawar,2,40
2025-01-15,Agus,matcha latte,1,28
2025-01-16,Rani,kopi susu,4,96
2025-01-16,Budi,teh tawar,1,20
2025-01-16,Dewi,matcha latte,2,56
2025-01-17,Dewi,kopi susu,1,24
2025-01-17,Agus,teh tawar,2,40
2025-01-17,Rani,kopi susu,1,24
2025-01-18,Budi,kopi susu,3,72
2025-01-18,Siti,teh tawar,1,20
2025-01-18,Dewi,matcha latte,1,28Langkah pertama setelah membaca berkas adalah describe() — ringkasan delapan angka untuk setiap kolom numerik:
import pandas as pd
df = pd.read_csv("transaksi_kopi.csv")
print(df.describe())Output yang Dihasilkan:
jumlah total_ribu
count 18.000000 18.000000
mean 1.722222 40.666667
std 0.894792 21.132634
min 1.000000 20.000000
25% 1.000000 24.000000
50% 1.500000 34.000000
75% 2.000000 54.000000
max 4.000000 96.000000Cara membaca delapan baris ringkasan tersebut:
count: jumlah nilai terisi — 18 untuk kedua kolom, berarti tidak ada sel kosong pada kolom numerik.mean: rata-rata. Rata-ratajumlahdi bawah 2 berarti kebanyakan pesanan berisi satu-dua gelas saja.std: simpangan baku, ukuran sebaran data di sekitar rata-rata. Semakin besarstddibandingmean, semakin lebar jarak nilai-nilai yang satu dengan yang lain.min,25%,50%,75%,max: nilai terkecil, tiga kuartil, dan nilai terbesar. Kuartil50%adalah median — separuh pesanan bernilaijumlahdi bawahnya, separuh lainnya di atasnya.
Jarak antar kuartil juga cepat memancing pertanyaan lanjutan. Jika max jauh lebih besar dari 75%, ada pesanan yang mencolok besar dibanding sisanya — petunjuk awal adanya nilai ekstrem yang akan kita dalami pada chapter Analisis Data Numerik.
Ringkasan Semua Kolom dengan include=“all” #
Secara bawaan describe() mengabaikan kolom teks. Argumen include="all" memaksa pandas merangkum kolom kategorikal sekaligus:
import pandas as pd
df = pd.read_csv("transaksi_kopi.csv")
print(df.describe(include="all"))Output yang Dihasilkan:
tanggal pelanggan menu jumlah total_ribu
count 18 18 18 18.000000 18.000000
unique 6 5 3 NaN NaN
top 2025-01-13 Dewi kopi susu NaN NaN
freq 3 5 7 NaN NaN
mean NaN NaN NaN 1.722222 40.666667
std NaN NaN NaN 0.894792 21.132634
min NaN NaN NaN 1.000000 20.000000
25% NaN NaN NaN 1.000000 24.000000
50% NaN NaN NaN 1.500000 34.000000
75% NaN NaN NaN 2.000000 54.000000
max NaN NaN NaN 4.000000 96.000000Empat baris baru muncul dari kolom teks. unique menghitung banyaknya nilai berbeda: 5 pelanggan dan 3 menu. top menampilkan nilai yang paling sering muncul, dan freq menyebut berapa kali nilai itu muncul. Baris statistik numerik pada kolom teks terisi NaN — bukan berarti ada data kosong, melainkan peringkat bahwa rata-rata tidak berlaku untuk kolom berisi label.
Kombinasi top dan freq adalah detak jantung kolom kategorikal. Kita langsung tahu menu mana paling laris dan siapa pelanggan paling rajin tanpa menghitung manual — dan tahu pula seberapa dominan nilainya: top yang muncul 18 dari 18 baris adalah pola yang sama sekali berbeda dengan top yang muncul 7 dari 18.
Statistik Pilihan dengan agg dan groupby #
Kadang kita hanya memerlukan beberapa statistik tertentu, bukan delapan baris penuh. Method agg() memungkinkan kita memilih sendiri daftar ukurannya:
import pandas as pd
df = pd.read_csv("transaksi_kopi.csv")
ringkas = df[["jumlah", "total_ribu"]].agg(["count", "mean", "median", "std", "max"])
print(ringkas)Output yang Dihasilkan:
jumlah total_ribu
count 18.000000 18.000000
mean 1.722222 40.666667
median 1.500000 34.000000
std 0.894792 21.132634
max 4.000000 96.000000agg() menerima nama statistik sebagai string di dalam list, lalu menyusunnya sebagai baris ringkasan. Kita bebas memilih kombinasi apa pun — "count", "mean", "median", "std", "min", "max", hingga "sum" untuk total.
Sementara itu, groupby() memindahkan peringkasan ke tingkat yang lebih tajam: per kelompok. Tabel berikut meringkas penjualan per menu — ukuran yang langsung menjawab pertanyaan “menu mana penyumbang pendapatan terbesar?”:
import pandas as pd
df = pd.read_csv("transaksi_kopi.csv")
per_menu = df.groupby("menu").agg(
pesanan=("menu", "count"),
gelas=("jumlah", "sum"),
pendapatan=("total_ribu", "sum"),
)
print(per_menu)
print()
print("Menu tercatat:", df["menu"].unique().tolist())Output yang Dihasilkan:
pesanan gelas pendapatan
menu
kopi susu 7 14 336
matcha latte 5 7 196
teh tawar 6 10 200
Menu tercatat: ['kopi susu', 'teh tawar', 'matcha latte']Bedah kode di atas:
df.groupby("menu")membagi 18 baris menjadi tiga kelompok menurut menu, laluagg()menghitung tiga ukuran untuk tiap kelompok.pesanan=("menu", "count"): bentuk pasangan(kolom, statistik)memberi nama kolom hasil sendiri — hitungan baris pada kolommenumenjadi kolompesanan.gelas=("jumlah", "sum")danpendapatan=("total_ribu", "sum"): penjumlahan gelas dan pendapatan per menu, sehingga ketiga ukuran berbeda tingkat (frekuensi, volume, nilai) terbaca berdampingan.df["menu"].unique().tolist()menampilkan nilai menu yang tercatat — pemeriksaan cepat bahwa tidak ada varian ejaan yang menyembunyikan kategori keempat.
Hasilnya: satu tabel tiga baris yang langsung bisa dipakai untuk keputusan stok dan promosi. Inilah pola dasar seluruh analisis pada section ini — bagi data menurut kelompok yang bermakna, ringkas dengan ukuran yang menjawab pertanyaan, lalu baca hasilnya sebagai narasi keputusan.
Rangkuman #
describe()memadatkan kolom numerik menjadi delapan angka: jumlah data, rata-rata, sebaran, dan lima titik ringkas dari minimum sampai maksimum.describe(include="all")menambahunique,top, danfrequntuk kolom kategorikal;NaNpada baris statistik berarti ukuran itu tidak berlaku, bukan data kosong.agg()memungkinkan kita memilih statistik tertentu, dangroupby()memindahkan peringkasan ke tingkat per kelompok dengan nama kolom hasil sendiri.- Selalu baca ringkasan berdampingan dengan jumlah datanya (
count) — ukuran tanpa konteks jumlah mudah salah tafsir.
Ringkasan per menu barusan memperlihatkan struktur frekuensi: beberapa nilai muncul lebih sering dari yang lain. Frekuensi itulah bahan analisis berikutnya — berapa kali tiap kategori muncul, berapa proporsinya, dan bagaimana dua kolom kategorikal saling bertaut. Kita bahas pada chapter Analisis Frekuensi .