Buka kekuatan Pandas GroupBy untuk analisis data. Panduan ini membahas teknik agregasi dan transformasi dengan contoh praktis.
Menguasai Operasi GroupBy Pandas: Agregasi vs. Transformasi
Pandas, landasan manipulasi data di Python, menawarkan alat yang ampuh untuk menganalisis dan memahami data: operasi GroupBy. Fitur ini memungkinkan Anda untuk membagi data Anda menjadi grup berdasarkan karakteristik bersama dan kemudian menerapkan fungsi pada grup-grup ini, mengungkapkan wawasan yang jika tidak akan tetap tersembunyi. Artikel ini mendalami dua operasi GroupBy utama: agregasi dan transformasi, yang memberikan contoh praktis dan penjelasan yang cocok untuk para profesional data di seluruh dunia.
Memahami Konsep GroupBy
Pada intinya, GroupBy adalah proses yang melibatkan tiga langkah utama: memisahkan data menjadi grup berdasarkan satu atau lebih kriteria, menerapkan fungsi ke setiap grup secara independen, dan menggabungkan hasilnya menjadi struktur data baru. Strategi "split-apply-combine" ini adalah konsep fundamental dalam analisis data dan menyediakan kerangka kerja yang fleksibel untuk mengeksplorasi kumpulan data yang kompleks.
Kekuatan GroupBy terletak pada kemampuannya untuk menangani berbagai jenis dan struktur data, membuatnya dapat diterapkan di berbagai domain. Baik Anda menganalisis data penjualan dari berbagai wilayah, pembacaan sensor dari perangkat yang berbeda, atau aktivitas media sosial di seluruh demografi, GroupBy dapat membantu Anda mengekstrak wawasan yang bermakna.
Agregasi: Meringkas Data dalam Grup
Agregasi adalah proses menghitung statistik ringkasan untuk setiap grup. Statistik ini memberikan gambaran ringkas tentang karakteristik grup, memungkinkan Anda untuk membandingkan dan membedakan segmen data Anda yang berbeda. Fungsi agregasi umum meliputi:
sum(): Menghitung jumlah nilai dalam setiap grup.mean(): Menghitung nilai rata-rata dalam setiap grup.median(): Menghitung nilai tengah dalam setiap grup.min(): Menemukan nilai minimum dalam setiap grup.max(): Menemukan nilai maksimum dalam setiap grup.count(): Menghitung jumlah nilai non-null dalam setiap grup.size(): Mengembalikan ukuran setiap grup (termasuk null).std(): Menghitung standar deviasi dalam setiap grup.var(): Menghitung varians dalam setiap grup.
Contoh Praktis Agregasi
Mari kita pertimbangkan kumpulan data penjualan internasional untuk perusahaan e-commerce hipotetis. Data tersebut mencakup informasi tentang kategori produk, negara penjualan, dan jumlah penjualan.
import pandas as pd
# Sample data
data = {
'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Home Goods', 'Electronics', 'Clothing', 'Home Goods'],
'Country': ['USA', 'UK', 'Canada', 'USA', 'Germany', 'UK', 'Canada', 'Germany'],
'Sales': [100, 50, 75, 60, 80, 90, 45, 70]
}
df = pd.DataFrame(data)
print(df)
Ini akan menghasilkan:
Category Country Sales
0 Electronics USA 100
1 Clothing UK 50
2 Electronics Canada 75
3 Clothing USA 60
4 Home Goods Germany 80
5 Electronics UK 90
6 Clothing Canada 45
7 Home Goods Germany 70
Contoh 1: Menghitung Total Penjualan per Kategori
Untuk menghitung total penjualan untuk setiap kategori produk, kita dapat menggunakan metode groupby() diikuti dengan fungsi agregasi sum().
category_sales = df.groupby('Category')['Sales'].sum()
print(category_sales)
Ini akan menghasilkan:
Category
Clothing 155
Electronics 265
Home Goods 150
Name: Sales, dtype: int64
Contoh 2: Menghitung Rata-rata Penjualan per Negara
Demikian pula, untuk menghitung rata-rata penjualan per negara, kita dapat menggunakan fungsi agregasi mean().
country_sales = df.groupby('Country')['Sales'].mean()
print(country_sales)
Ini akan menghasilkan:
Country
Canada 60.0
Germany 75.0
UK 70.0
USA 80.0
Name: Sales, dtype: float64
Contoh 3: Menggunakan Beberapa Fungsi Agregasi
Pandas memungkinkan Anda menerapkan beberapa fungsi agregasi secara bersamaan menggunakan metode agg(). Ini memberikan ringkasan komprehensif tentang karakteristik grup.
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', 'median', 'count'])
print(category_summary)
Ini akan menghasilkan:
sum mean median count
Category
Clothing 155 51.666667 50.0 3
Electronics 265 88.333333 90.0 3
Home Goods 150 75.000000 75.0 2
Contoh 4: Fungsi Agregasi Kustom
Anda juga dapat mendefinisikan fungsi agregasi kustom Anda sendiri menggunakan ekspresi lambda atau fungsi bernama. Ini memungkinkan Anda untuk menghitung statistik tertentu yang tidak tersedia dalam fungsi agregasi standar.
# Custom function to calculate the range (max - min)
def custom_range(x):
return x.max() - x.min()
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', custom_range])
print(category_summary)
Ini akan menghasilkan:
sum mean custom_range
Category
Clothing 155 51.666667 15
Electronics 265 88.333333 25
Home Goods 150 75.000000 10
Transformasi: Memodifikasi Data dalam Grup
Sebaliknya, transformasi melibatkan modifikasi data dalam setiap grup berdasarkan beberapa perhitungan. Berbeda dengan agregasi, yang mengembalikan nilai ringkasan untuk setiap grup, transformasi mengembalikan nilai untuk setiap baris dalam data asli, tetapi nilainya dihitung berdasarkan grup tempat baris tersebut berada. Operasi transformasi mempertahankan indeks dan bentuk asli DataFrame.
Kasus penggunaan umum untuk transformasi meliputi:
- Menstandardisasi data dalam setiap grup.
- Menghitung peringkat atau persentil dalam setiap grup.
- Mengisi nilai yang hilang berdasarkan statistik grup.
Contoh Praktis Transformasi
Mari kita lanjutkan dengan data penjualan internasional kita. Kita dapat menerapkan transformasi untuk melakukan perhitungan yang berkaitan dengan angka penjualan di dalam setiap negara.
Contoh 1: Menstandardisasi Data Penjualan di Setiap Negara (Z-score)
Menstandardisasi data melibatkan transformasi nilai-nilai untuk memiliki rata-rata 0 dan standar deviasi 1. Ini berguna untuk membandingkan data di berbagai skala dan distribusi. Kita dapat menggunakan metode transform() bersama dengan ekspresi lambda untuk mencapai ini.
from scipy.stats import zscore
df['Sales_Zscore'] = df.groupby('Country')['Sales'].transform(zscore)
print(df)
Ini akan menghasilkan:
Category Country Sales Sales_Zscore
0 Electronics USA 100 1.000000
1 Clothing UK 50 -1.000000
2 Electronics Canada 75 1.000000
3 Clothing USA 60 -1.000000
4 Home Goods Germany 80 1.000000
5 Electronics UK 90 1.000000
6 Clothing Canada 45 -1.000000
7 Home Goods Germany 70 -1.000000
Kolom Sales_Zscore sekarang berisi nilai penjualan yang distandardisasi untuk setiap negara. Nilai di atas 0 berada di atas rata-rata penjualan untuk negara tersebut, dan nilai di bawah 0 berada di bawah rata-rata.
Contoh 2: Menghitung Peringkat Penjualan di Setiap Kategori
Untuk menghitung peringkat setiap penjualan dalam kategorinya, kita dapat menggunakan metode rank() di dalam fungsi transform().
df['Sales_Rank'] = df.groupby('Category')['Sales'].transform(lambda x: x.rank(method='dense'))
print(df)
Ini akan menghasilkan:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA 100 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA 60 -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
Kolom Sales_Rank menunjukkan peringkat setiap penjualan dalam kategori masing-masing. Argumen `method='dense'` memastikan bahwa peringkat berurutan ditetapkan tanpa celah.
Contoh 3: Mengisi Nilai yang Hilang Berdasarkan Rata-rata Grup
Mari kita perkenalkan beberapa nilai yang hilang dalam data penjualan dan kemudian mengisinya berdasarkan rata-rata penjualan untuk setiap negara.
import numpy as np
# Introduce missing values
df.loc[[0, 3], 'Sales'] = np.nan
print(df)
# Fill missing values based on country mean
df['Sales_Filled'] = df['Sales'].fillna(df.groupby('Country')['Sales'].transform('mean'))
print(df)
DataFrame awal dengan nilai yang hilang akan terlihat seperti ini:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA NaN 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA NaN -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
Dan setelah mengisi nilai yang hilang:
Category Country Sales Sales_Zscore Sales_Rank Sales_Filled
0 Electronics USA NaN 1.000000 3.0 NaN
1 Clothing UK 50 -1.000000 2.0 50.0
2 Electronics Canada 75 1.000000 1.0 75.0
3 Clothing USA NaN -1.000000 3.0 NaN
4 Home Goods Germany 80 1.000000 2.0 80.0
5 Electronics UK 90 1.000000 2.0 90.0
6 Clothing Canada 45 -1.000000 1.0 45.0
7 Home Goods Germany 70 -1.000000 1.0 70.0
Catatan Penting: Karena tidak ada rata-rata yang ada untuk `USA`, nilai yang dihasilkan di `Sales_Filled` adalah `NaN`. Menangani kasus tepi seperti ini sangat penting untuk analisis data yang andal dan harus dipertimbangkan selama implementasi.
Agregasi vs. Transformasi: Perbedaan Utama
Meskipun agregasi dan transformasi adalah operasi GroupBy yang kuat, keduanya melayani tujuan yang berbeda dan memiliki karakteristik yang berbeda:
- Bentuk Keluaran: Agregasi mengurangi ukuran data, mengembalikan satu nilai untuk setiap grup. Transformasi mempertahankan ukuran data asli, mengembalikan nilai yang ditransformasi untuk setiap baris.
- Tujuan: Agregasi digunakan untuk meringkas data dan mendapatkan wawasan tentang karakteristik grup. Transformasi digunakan untuk memodifikasi data dalam grup, seringkali untuk standardisasi atau normalisasi.
- Nilai Kembali: Agregasi mengembalikan DataFrame atau Series baru dengan nilai yang diagregasi. Transformasi mengembalikan Series dengan nilai yang ditransformasi, yang kemudian dapat ditambahkan sebagai kolom baru ke DataFrame asli.
Memilih antara agregasi dan transformasi tergantung pada tujuan analitis spesifik Anda. Jika Anda perlu meringkas data dan membandingkan grup, agregasi adalah pilihan yang tepat. Jika Anda perlu memodifikasi data dalam grup sambil mempertahankan struktur data asli, transformasi adalah pilihan yang lebih baik.
Teknik GroupBy Lanjutan
Selain agregasi dan transformasi dasar, GroupBy Pandas menawarkan berbagai teknik lanjutan untuk analisis data yang lebih canggih.
Menerapkan Fungsi Kustom dengan apply()
Metode apply() memberikan fleksibilitas paling besar, memungkinkan Anda untuk menerapkan fungsi kustom apa pun ke setiap grup. Fungsi ini dapat melakukan operasi apa pun, termasuk agregasi, transformasi, atau bahkan perhitungan yang lebih kompleks.
def custom_function(group):
# Calculate the sum of sales for each category in a group, only if there is more than one row in the group
if len(group) > 1:
group['Sales_Sum'] = group['Sales'].sum()
else:
group['Sales_Sum'] = 0 # Or some other default value
return group
df_applied = df.groupby('Country').apply(custom_function)
print(df_applied)
Dalam contoh ini, kami mendefinisikan fungsi kustom yang menghitung jumlah penjualan dalam setiap grup (negara). Metode apply() menerapkan fungsi ini ke setiap grup, menghasilkan kolom baru yang berisi jumlah penjualan untuk grup tersebut.
Catatan Penting: Fungsi apply bisa lebih intensif secara komputasi daripada metode lain. Optimalkan kode Anda dan pertimbangkan implementasi alternatif saat bekerja dengan kumpulan data yang sangat besar.
Mengelompokkan berdasarkan Beberapa Kolom
Anda dapat mengelompokkan data Anda berdasarkan beberapa kolom untuk membuat segmen yang lebih granular. Ini memungkinkan Anda untuk menganalisis data berdasarkan persimpangan beberapa karakteristik.
category_country_sales = df.groupby(['Category', 'Country'])['Sales'].sum()
print(category_country_sales)
Ini akan mengelompokkan data berdasarkan Category dan Country, memungkinkan Anda untuk menghitung total penjualan untuk setiap kategori di setiap negara. Ini memberikan pandangan yang lebih rinci tentang kinerja penjualan di berbagai wilayah dan lini produk.
Iterasi Melalui Grup
Untuk analisis yang lebih kompleks, Anda dapat mengulang melalui grup menggunakan loop for. Ini memungkinkan Anda untuk mengakses setiap grup secara individual dan melakukan operasi kustom padanya.
for name, group in df.groupby('Category'):
print(f"Category: {name}")
print(group)
Ini akan mengulang melalui setiap kategori produk dan mencetak data yang sesuai. Ini bisa berguna untuk melakukan analisis kustom atau menghasilkan laporan untuk setiap kategori.
Praktik Terbaik untuk Menggunakan GroupBy
Untuk memastikan penggunaan GroupBy yang efisien dan efektif, pertimbangkan praktik terbaik berikut:
- Pahami Data Anda: Sebelum menerapkan
GroupBy, luangkan waktu untuk memahami data Anda dan identifikasi kriteria pengelompokan yang relevan serta fungsi agregasi/transformasi. - Pilih Operasi yang Tepat: Pertimbangkan dengan cermat apakah agregasi atau transformasi adalah pilihan yang tepat untuk tujuan analitis Anda.
- Optimalkan Kinerja: Untuk kumpulan data besar, pertimbangkan untuk mengoptimalkan kode Anda dengan menggunakan operasi vektor dan menghindari loop yang tidak perlu.
- Tangani Nilai yang Hilang: Waspadai nilai yang hilang dalam data Anda dan tangani dengan tepat menggunakan metode seperti
fillna()ataudropna(). - Dokumentasikan Kode Anda: Dokumentasikan kode Anda dengan jelas untuk menjelaskan tujuan setiap operasi
GroupBydan alasan di balik pilihan Anda.
Kesimpulan
GroupBy Pandas adalah alat yang ampuh untuk analisis data, memungkinkan Anda untuk membagi data Anda, menerapkan fungsi ke setiap grup, dan mengekstrak wawasan yang berharga. Dengan menguasai teknik agregasi dan transformasi, Anda dapat membuka potensi penuh data Anda dan mendapatkan pemahaman yang lebih dalam tentang pola dan tren yang mendasarinya. Apakah Anda menganalisis data penjualan, pembacaan sensor, atau aktivitas media sosial, GroupBy dapat membantu Anda membuat keputusan berbasis data dan mencapai tujuan analitis Anda. Rangkullah kekuatan GroupBy dan tingkatkan keterampilan analisis data Anda ke tingkat berikutnya.
Panduan ini telah memberikan gambaran komprehensif tentang operasi Pandas GroupBy dengan fokus pada Agregasi vs Transformasi. Dengan menggunakan teknik-teknik ini pada data internasional, para ilmuwan data di seluruh dunia dapat mengekstrak wawasan bisnis penting dari berbagai kumpulan data. Latihan, bereksperimen, dan sesuaikan teknik-teknik ini dengan kebutuhan spesifik Anda untuk memanfaatkan potensi penuh Pandas.