Menggunakan Pandas GroupBy dan Aggregation untuk Analisis Data Tabular yang Efisien

Lhuqita Fazry
Data Science Pandas Python Data Analysis Aggregation
Menggunakan Pandas GroupBy dan Aggregation untuk Analisis Data Tabular yang Efisien

Ketika bekerja dengan dataset tabular, kita sering perlu melakukan agregasi data berdasarkan kelompok tertentu. Bayangkan kita memiliki data penjualan dari berbagai cabang toko dan perlu menghitung total penjualan per kota atau rata-rata pendapatan per kategori produk. Proses ini bisa dilakukan dengan loop dan conditional statements, tetapi pendekatan tersebut tidak efisien dan cenderung menghasilkan kode yang sulit dibaca.

Pandas menyediakan mekanisme groupby yang powerful untuk melakukan operasi ini dengan syntax yang bersih dan performa yang optimal. Mari kita pelajari cara menggunakan fitur ini secara efektif.

Memahami Konsep GroupBy dalam Pandas

Fungsi groupby() pada Pandas mengimplementasikan konsep split-apply-combine. Proses ini terdiri dari tiga langkah:

1. Split: Memecah DataFrame menjadi groups berdasarkan satu atau lebih kolom 2. Apply: Menerapkan fungsi aggregation atau transformasi pada setiap group 3. Combine: Menggabungkan hasil kembali menjadi DataFrame baru

Ilustrasi Pandas GroupBy

Gambar: Visualisasi library Pandas yang digunakan dalam proses groupby dan aggregation — Sumber: [Pandas Official](https://pandas.org/)

Pendekatan manual dengan loop memang memungkinkan, tetapi memiliki beberapa kelemahan signifikan. Kode menjadi lebih panjang, performa menurun karena iterasi Python native jauh lebih lambat dibandingkan operasi vektorisasi Pandas, dan logic menjadi tersebar sehingga sulit di-maintain.

Berikut perbandingan sederhana antara pendekatan manual dan penggunaan groupby():

pythonpython
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'kota': ['Jakarta', 'Surabaya', 'Jakarta', 'Bandung', 'Surabaya', 'Bandung'],
    'produk': ['A', 'A', 'B', 'A', 'B', 'B'],
    'penjualan': [100, 200, 150, 300, 250, 180]
})

# Pendekatan manual dengan loop
def manual_group_sum(df, group_col, agg_col):
    hasil = {}
    for idx, row in df.iterrows():
        key = row[group_col]
        if key not in hasil:
            hasil[key] = 0
        hasil[key] += row[agg_col]
    return pd.DataFrame(list(hasil.items()), columns=[group_col, agg_col])

# Pendekatan dengan groupby
hasil = df.groupby('kota')['penjualan'].sum().reset_index()

print("Hasil groupby:")
print(hasil)

Output:

text
Hasil groupby:
       kota  penjualan
0   Bandung        480
1   Jakarta        250
2  Surabaya        450

Output dari kode di atas menunjukkan bahwa groupby() menghasilkan DataFrame dengan struktur yang rapi dan proses yang jauh lebih cepat terutama untuk dataset berskala besar.

Fungsi Aggregation Bawaan dan Custom Aggregation

Pandas menyediakan berbagai fungsi aggregation bawaan yang dapat langsung digunakan setelah groupby(). Fungsi-fungsi ini mencakup sum() untuk penjumlahan, mean() untuk rata-rata, count() untuk menghitung jumlah record, min() dan max() untuk nilai ekstrem, serta std() dan var() untuk statistik dispersi.

Kekuatan sesungguhnya dari Pandas terletak pada kemampuan agg() yang memungkinkan kita menerapkan multiple aggregations secara bersamaan. Dengan agg(), kita bisa mendapatkan berbagai statistik dalam satu operasi tanpa perlu memanggil groupby() berulang kali.

pythonpython
# Multiple aggregation pada kolom yang sama
statistik = df.groupby('kota')['penjualan'].agg(['sum', 'mean', 'count', 'std']).reset_index()
print(statistik)

# Multiple aggregation dengan nama kolom berbeda
hasil = df.groupby('kota').agg({
    'penjualan': ['sum', 'mean'],
    'produk': 'count'
}).reset_index()

print(hasil)

Output:

text
       kota  sum   mean  count        std
0   Bandung  480  240.0      2  84.852814
1   Jakarta  250  125.0      2  35.355339
2  Surabaya  450  225.0      2  35.355339
       kota penjualan        produk
                  sum   mean  count
0   Bandung       480  240.0      2
1   Jakarta       250  125.0      2
2  Surabaya       450  225.0      2

Untuk kasus di mana kita memerlukan kalkulasi yang tidak tersedia secara bawaan, Pandas mengizinkan pembuatan custom aggregation function. Fungsi ini menerima array nilai dan mengembalikan satu nilai skalar:

Data Science with Python
Data Science • Beginner

Data Science with Python

Master the art of data analysis, visualization, and predictive modeling.

Daftar
pythonpython
def range_calculator(x):
    return x.max() - x.min()

def coefficient_of_variation(x):
    return (x.std() / x.mean()) * 100

custom_agg = df.groupby('kota')['penjualan'].agg([
    ('total', 'sum'),
    ('rata_rata', 'mean'),
    ('jumlah_transaksi', 'count'),
    ('range', range_calculator),
    ('cv_percent', coefficient_of_variation)
]).reset_index()

print(custom_agg)

Output:

text
       kota  total  rata_rata  jumlah_transaksi  range  cv_percent
0   Bandung    480      240.0                 2    120   35.355339
1   Jakarta    250      125.0                 2     50   28.284271
2  Surabaya    450      225.0                 2     50   15.713484

Kemampuan untuk mendefinisikan fungsi aggregation sendiri memberikan fleksibilitas penuh dalam melakukan analisis data sesuai kebutuhan spesifik proyek.

Transformasi Data dengan GroupBy dan Apply

Sering kali kita perlu melakukan operasi yang bukan sekadar aggregation, melainkan transformasi data dalam konteks grup. Misalnya, menormalisasi nilai dalam setiap grup relative terhadap rata-rata grup tersebut. Di sinilah fungsi transform() dan apply() menjadi sangat berguna.

Perbedaan mendasar antara aggregation, transformation, dan filtration perlu dipahami. Aggregation mengurangi jumlah baris dengan menghitung satu nilai per grup. Transformation mempertahankan jumlah baris original tetapi mengubah nilai berdasarkan informasi grup. Filtration menyaring baris berdasarkan kondisi yang melibatkan seluruh grup.

Method transform() sangat powerful untuk operasi seperti normalisasi dalam grup. Berikut contoh penerapannya:

pythonpython
# Normalisasi penjualan dalam setiap grup kota
df['penjualan_normalized'] = df.groupby('kota')['penjualan'].transform(
    lambda x: (x - x.mean()) / x.std()
)

# Menambahkan kolom dengan rata-rata grup
df['rata_rata_kota'] = df.groupby('kota')['penjualan'].transform('mean')

# Kalkulasi rank dalam grup
df['rank_dalam_kota'] = df.groupby('kota')['penjualan'].transform(
    lambda x: x.rank(ascending=False)
)

print(df)

Output:

text
       kota produk  penjualan  penjualan_normalized  rata_rata_kota  rank_dalam_kota
0   Jakarta      A        100            -0.707107           125.0              2.0
1  Surabaya      A        200            -0.707107           225.0              2.0
2   Jakarta      B        150             0.707107           125.0              1.0
3  Bandung      A        300             0.707107           240.0              1.0
4  Surabaya      B        250             0.707107           225.0              1.0
5  Bandung      B        180            -0.707107           240.0              2.0

Method apply() memberikan fleksibilitas yang lebih besar karena dapat mengembalikan DataFrame, Series, atau nilai skalar tunggal. Gunakan apply() ketika kita memerlukan logika yang kompleks dan tidak bisa diselesaikan dengan fungsi bawaan:

pythonpython
def normalize_by_group_mean(x):
    return x / x.mean()

def calculate_z_score(x):
    return (x - x.mean()) / x.std()

df['relative_to_mean'] = df.groupby('kota')['penjualan'].transform(normalize_by_group_mean)
df['z_score'] = df.groupby('kota')['penjualan'].transform(calculate_z_score)

print(df[['kota', 'produk', 'penjualan', 'relative_to_mean', 'z_score']])

Output:

text
       kota produk  penjualan  relative_to_mean   z_score
0   Jakarta      A        100          0.800000 -0.707107
1  Surabaya      A        200          0.888889 -0.707107
2   Jakarta      B        150          1.200000  0.707107
3  Bandung      A        300          1.250000  0.707107
4  Surabaya      B        250          1.111111  0.707107
5  Bandung      B        180          0.750000 -0.707107

Multi-Index dan Hierarchical Grouping

Pandas memungkinkan grouping berdasarkan multiple columns yang menghasilkan multi-level index. Struktur ini bermanfaat ketika kita memerlukan analisis hierarkis, misalnya melihat penjualan berdasarkan kota dan produk secara bersamaan.

Operasi unstack() dan stack() memungkinkan kita untuk mengubah struktur DataFrame dengan pivot antara index dan columns. Kemampuan ini sangat berguna ketika kita perlu menampilkan data dalam format yang berbeda untuk berbagai keperluan reporting:

pythonpython
# Groupby dengan multiple columns
hasil = df.groupby(['kota', 'produk'])['penjualan'].sum().reset_index()
print(hasil)

# Melihat hasil dalam format pivot table
pivot = df.pivot_table(
    values='penjualan',
    index='kota',
    columns='produk',
    aggfunc='sum',
    fill_value=0
)
print(pivot)

# Reset index untuk mendapatkan format flat
pivot_reset = pivot.reset_index()
print(pivot_reset)

# Menggunakan level pada multi-index
grouped = df.groupby(['kota', 'produk'])['penjualan'].sum()
print(grouped.index)
print(grouped['Jakarta'])  # Mengakses data untuk kota Jakarta saja

Output:

text
       kota produk  penjualan
0   Bandung      A        300
1   Bandung      B        180
2   Jakarta      A        100
3   Jakarta      B        150
4  Surabaya      A        200
5  Surabaya      B        250
produk      A    B
kota
Bandung   300  180
Jakarta   100  150
Surabaya  200  250
produk      kota    A    B
0        Bandung  300  180
1        Jakarta  100  150
2       Surabaya  200  250
MultiIndex([( 'Bandung', 'A'),
            ( 'Bandung', 'B'),
            ( 'Jakarta', 'A'),
            ( 'Jakarta', 'B'),
            ('Surabaya', 'A'),
            ('Surabaya', 'B')],
           names=['kota', 'produk'])
produk
A    100
B    150
Name: penjualan, dtype: int64

Kemampuan untuk mengakses data pada level tertentu dari multi-index memberikan fleksibilitas tinggi dalam eksplorasi dan analisis data hierarkis.

Praktik Terbaik dan Common Pitfalls

Ketika bekerja dengan groupby() pada dataset besar, beberapa praktik terbaik perlu diperhatikan untuk memastikan performa dan reliability kode.

Performance optimization sangat penting untuk dataset dengan jutaan baris. Gunakan categorical dtype untuk kolom yang sering digunakan sebagai grouping key karena Pandas dapat mengoptimalkan operasi groupby pada categorical data jauh lebih efisien dibandingkan string biasa. Sebagai contoh, konversi kolom kategori sebelum melakukan groupby:

pythonpython
# Konversi ke categorical untuk optimasi
df['kota'] = df['kota'].astype('category')
df['produk'] = df['produk'].astype('category')

# Sekarang groupby akan lebih cepat
hasil = df.groupby(['kota', 'produk'])['penjualan'].sum()
print(hasil)

Output:

text
kota      produk
Bandung   A         300
          B         180
Jakarta   A         100
          B         150
Surabaya  A         200
          B         250
Name: penjualan, dtype: int64

Debugging strategy yang efektif mencakup penggunaan groups attribute untuk melihat struktur grup, get_group() untuk memeriksa data dalam grup tertentu, dan size() untuk melihat jumlah elemen per grup sebelum melakukan operasi lebih kompleks.

Ingin memperdalam kemampuan data analysis dengan Python? Rumah Coding menyediakan bootcamp Data Science yang mencakup Pandas, Visualisasi Data, dan Machine Learning fundamentals. Kunjungi website kami untuk informasi lebih lanjut tentang program yang tersedia.

Course Terkait

E-commerce Sales Dashboard
Premium Course Data Science

Data Science with Python

Master the art of data analysis, visualization, and predictive modeling.

Capstone Project

E-commerce Sales Dashboard

  • Data Cleaning Pipeline
  • Interactive Charts
  • Sales Forecasting Model
7 Weeks Beginner
Lihat Detail Course
GreenGuard: Intelligent Plant Disease Diagnosis Web App
Premium Course Machine Learning

Deep Learning Bootcamp

A beginner-friendly, highly interactive bootcamp designed to take you from foundational concepts to deploying real-world Artificial Intelligence applications. Through a completely project-based approach, you will master the core of Deep Learning, Artificial Neural Networks, and Computer Vision using Python and TensorFlow, ultimately building a professional-grade AI web application for your portfolio.

Capstone Project

GreenGuard: Intelligent Plant Disease Diagnosis Web App

  • Interactive Image Upload UI: A clean, user-friendly interface built with Streamlit that supports drag-and-drop image uploads directly from a computer or mobile phone.
  • Real-Time AI Inference: Utilizes a lightweight, optimized CNN model (like MobileNetV2) to process the image and return a diagnosis in seconds without heavy server load.
  • Confidence Scoring Dashboard: Visually displays the model's prediction probability (e.g., "95% confident this is Tomato Late Blight") using interactive progress bars or charts.
7 Weeks Intermediate
Lihat Detail Course
Domain-Specific AI Knowledge Assistant
Premium Course Machine Learning

LLM Bootcamp

This project-based bootcamp is designed for beginners to dive practically into the world of Large Language Models (LLMs). Through hands-on building, you will learn how to interact with top-tier AI APIs, master prompt engineering, orchestrate complex workflows using LangChain, and implement Retrieval-Augmented Generation (RAG) to query your own documents. By the end of this course, you will have the skills to build, test, and deploy a fully functional, custom AI web application.

Capstone Project

Domain-Specific AI Knowledge Assistant

  • Dynamic Document Processing: A sidebar interface allowing users to upload new PDF or TXT files, which the app automatically chunks, embeds, and stores in the vector database.
  • Context-Aware Chat UI: A modern chat interface built with Streamlit that maintains conversation history, allowing users to ask follow-up questions naturally.
  • Strict Guardrails (Anti-Hallucination): System instructions designed so the AI politely declines to answer questions that fall outside the context of the uploaded documents.
7 Weeks Beginner
Lihat Detail Course

Artikel Terkait