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:

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

Langkah pertama setelah membaca berkas adalah describe() — ringkasan delapan angka untuk setiap kolom numerik:

python
import pandas as pd

df = pd.read_csv("transaksi_kopi.csv")

print(df.describe())

Output yang Dihasilkan:

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

Cara membaca delapan baris ringkasan tersebut:

  1. count: jumlah nilai terisi — 18 untuk kedua kolom, berarti tidak ada sel kosong pada kolom numerik.
  2. mean: rata-rata. Rata-rata jumlah di bawah 2 berarti kebanyakan pesanan berisi satu-dua gelas saja.
  3. std: simpangan baku, ukuran sebaran data di sekitar rata-rata. Semakin besar std dibanding mean, semakin lebar jarak nilai-nilai yang satu dengan yang lain.
  4. min, 25%, 50%, 75%, max: nilai terkecil, tiga kuartil, dan nilai terbesar. Kuartil 50% adalah median — separuh pesanan bernilai jumlah di 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:

python
import pandas as pd

df = pd.read_csv("transaksi_kopi.csv")

print(df.describe(include="all"))

Output yang Dihasilkan:

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

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

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

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

agg() 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?”:

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

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

  1. df.groupby("menu") membagi 18 baris menjadi tiga kelompok menurut menu, lalu agg() menghitung tiga ukuran untuk tiap kelompok.
  2. pesanan=("menu", "count"): bentuk pasangan (kolom, statistik) memberi nama kolom hasil sendiri — hitungan baris pada kolom menu menjadi kolom pesanan.
  3. gelas=("jumlah", "sum") dan pendapatan=("total_ribu", "sum"): penjumlahan gelas dan pendapatan per menu, sehingga ketiga ukuran berbeda tingkat (frekuensi, volume, nilai) terbaca berdampingan.
  4. 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") menambah unique, top, dan freq untuk kolom kategorikal; NaN pada baris statistik berarti ukuran itu tidak berlaku, bukan data kosong.
  • agg() memungkinkan kita memilih statistik tertentu, dan groupby() 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 .

Referensi #

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