0Pricing
Pandas & NumPy Academy · Pelajaran

Peringkat dan Persentil dalam Grup

Hitung peringkat dalam grup menggunakan groupby().rank() dan buat kelompok persentil dengan pd.qcut untuk perbandingan relatif.

Peringkat dan Persentil dalam Grup adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Mengapa Melakukan Peringkat dalam Kelompok?

Nilai mentah sering kali kurang bermakna dibandingkan peringkat relatif. Tenaga penjualan dengan pendapatan bulanan $50.000 merupakan kinerja terbaik jika rata-ratanya $30.000, tetapi berkinerja buruk jika rata-ratanya $80.000. Dengan menghitung peringkat dalam kelompok (misalnya, peringkat dalam setiap wilayah atau setiap kuartal), Anda memperoleh perbandingan ternormalisasi yang memperhitungkan perbedaan titik dasar antar kelompok. Pandas memudahkan pemeringkatan dalam kelompok dengan groupby().rank().

import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'rep': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve',
            'Frank', 'Grace', 'Hank', 'Iris', 'Jake'],
    'region': ['East']*5 + ['West']*5,
    'sales': np.random.randint(30000, 100000, 10)
})
print(df.sort_values('region'))

Series.rank() — Pemeringkatan Dasar

Series.rank() memberikan peringkat pada setiap nilai: peringkat 1 adalah yang terkecil, sedangkan peringkat n adalah yang terbesar. Parameter ascending=False membalik arah sehingga peringkat 1 menjadi nilai terbesar. Hasilnya berupa Series pecahan, bukan bilangan bulat, karena nilai yang sama secara bawaan diselesaikan dengan merata-ratakan peringkat yang sama tersebut. Untuk kolom dengan 5 nilai, peringkat berkisar dari 1.0 hingga 5.0 — atau jika ada nilai yang sama, beberapa nilai dapat memiliki peringkat seperti 2.5.

import pandas as pd

s = pd.Series([80, 45, 90, 45, 70])

print('Values:', s.values)
print('Rank (ascending=True, default):', s.rank().values)
print('Rank (ascending=False — best=1):', s.rank(ascending=False).values)
# Note: two 45s share ranks 1 and 2 → both get 1.5

Metode Pemecahan Nilai Sama dalam rank()

Parameter method mengendalikan perlakuan terhadap nilai yang sama. Pilihannya adalah: 'average' (bawaan — nilai yang sama berbagi rata-rata peringkatnya), 'min' (semua nilai yang sama mendapat peringkat terendah), 'max' (semuanya mendapat peringkat tertinggi), 'first' (peringkat berdasarkan urutan kemunculan — tanpa nilai yang sama), dan 'dense' (tanpa celah dalam peringkat — 1, 2, 3, 3, 4 menjadi 1, 2, 3, 3, 4, bukan 1, 2, 3, 3, 5). Metode 'dense' paling berguna untuk pemeringkatan bergaya persentil.

import pandas as pd

s = pd.Series([80, 45, 90, 45, 70])

result = pd.DataFrame({
    'value': s,
    'average': s.rank(method='average'),
    'min': s.rank(method='min'),
    'max': s.rank(method='max'),
    'first': s.rank(method='first'),
    'dense': s.rank(method='dense')
})
print(result)

Pemeringkatan dalam Kelompok dengan groupby().rank()

groupby('group_col')['value_col'].rank() menghitung peringkat secara independen dalam setiap kelompok. Peringkat dimulai kembali pada awal setiap kelompok — sehingga kinerja terbaik di wilayah Timur mendapat peringkat 1 di wilayah Timur, dan kinerja terbaik di wilayah Barat juga mendapat peringkat 1 di wilayah Barat. Inilah yang membuat pemeringkatan dengan groupby sangat berguna untuk perbandingan yang adil antar kelompok.

import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'rep': list('ABCDEABCDE'),
    'region': ['East']*5 + ['West']*5,
    'sales': np.random.randint(30000, 100000, 10)
})

# Rank within each region (best = rank 1)
df['rank_in_region'] = df.groupby('region')['sales'].rank(ascending=False, method='min')
df_sorted = df.sort_values(['region', 'rank_in_region'])
print(df_sorted.to_string(index=False))

Pemeringkatan Persentil dengan rank(pct=True)

Menetapkan pct=True dalam rank() akan mengembalikan peringkat persentil: nilai antara 0 dan 1 yang menunjukkan proporsi nilai dalam kelompok yang berada pada atau di bawah nilai saat ini. Peringkat persentil 0.8 berarti nilai tersebut berada pada persentil ke-80 — lebih tinggi daripada 80% dari seluruh nilai. Normalisasi ini membuat nilai dari kelompok dengan ukuran berbeda dapat dibandingkan secara langsung tanpa mengetahui ukuran kelompok sebenarnya.

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({
    'name': list('ABCDEFGHIJ'),
    'region': ['East']*5 + ['West']*5,
    'score': np.random.randint(50, 100, 10)
})

# Percentile rank within region
df['pct_rank'] = df.groupby('region')['score'].rank(pct=True)
df['percentile'] = (df['pct_rank'] * 100).round(0).astype(int)
print(df.sort_values(['region', 'percentile'], ascending=[True, False]).to_string(index=False))

pd.qcut: Pengelompokan Berbasis Kuantil

pd.qcut(series, q) membagi nilai ke dalam q kelompok dengan frekuensi sama, sehingga setiap kelompok berisi kira-kira jumlah pengamatan yang sama. Berbeda dari pd.cut yang menggunakan interval dengan lebar sama, pd.qcut menyesuaikan batas interval dengan distribusi data. Ini sangat cocok untuk membuat kuartil (q=4), kuintil (q=5), atau desil (q=10) untuk tingkatan kinerja.

import pandas as pd
import numpy as np

np.random.seed(42)
sales = pd.Series(np.random.exponential(scale=50000, size=100))

# Divide into quartiles
quartiles = pd.qcut(sales, q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])

result = pd.DataFrame({'sales': sales, 'quartile': quartiles})
print('Quartile counts (should be ~25 each):')
print(result['quartile'].value_counts().sort_index())
print('\nMean sales per quartile:')
print(result.groupby('quartile')['sales'].mean().round(0))

pd.cut vs pd.qcut

pd.cut(series, bins=n) membuat interval dengan lebar sama (rentang sama, jumlah berbeda). pd.qcut(series, q=n) membuat interval dengan frekuensi sama (jumlah sama, rentang berbeda). Untuk data yang menceng, pd.cut menghasilkan kelompok yang hampir kosong di bagian ekor, sedangkan pd.qcut mendistribusikan pengamatan secara merata. Pilih pd.cut ketika batas interval memiliki makna bisnis yang alami (rentang harga, kelompok usia); pilih pd.qcut untuk tingkatan kinerja ketika Anda menginginkan ukuran kelompok yang sama.

import pandas as pd
import numpy as np

np.random.seed(0)
# Right-skewed data
data = pd.Series(np.random.exponential(1, 100))

cut_result = pd.cut(data, bins=5).value_counts().sort_index()
qcut_result = pd.qcut(data, q=5).value_counts().sort_index()

print('Equal-width bins (pd.cut) — uneven counts:')
print(cut_result.to_string())
print('\nEqual-frequency bins (pd.qcut) — even counts:')
print(qcut_result.to_string())

Membuat Label Desil dengan pd.qcut

pd.qcut(series, q=10, labels=range(1,11)) menetapkan setiap pengamatan ke dalam desilnya (1 hingga 10). Ini merupakan teknik standar dalam analitik pemasaran (desil nilai pelanggan), penilaian kredit (desil risiko), dan pengujian AB (desil lalu lintas untuk analisis kohort). Parameter labels dapat berupa daftar apa pun dengan panjang yang sama seperti q — gunakan string seperti ['Bottom 10%', ..., 'Top 10%'] agar hasilnya lebih mudah dibaca.

import pandas as pd
import numpy as np

np.random.seed(7)
customer_value = pd.Series(np.random.exponential(500, 1000))

# Assign to deciles 1-10
decile_labels = [f'D{i}' for i in range(1, 11)]
customer_decile = pd.qcut(
    customer_value,
    q=10,
    labels=decile_labels
)

result = pd.DataFrame({'value': customer_value, 'decile': customer_decile})
print('Mean customer value per decile:')
print(result.groupby('decile')['value'].mean().round(0))

Kelompok Persentil dalam Kelompok

Gabungkan groupby dengan pd.qcut menggunakan transform untuk membuat kelompok persentil dalam setiap kelompok. Ini berguna ketika Anda ingin memeringkat pelanggan dalam setiap wilayah, bukan secara global — pelanggan yang berada dalam desil global terbawah mungkin berada di posisi teratas dalam desil regionalnya. Gunakan groupby('group')['value'].transform(lambda x: pd.qcut(x, q=4, labels=['Q1','Q2','Q3','Q4'])).

import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'customer': range(20),
    'region': ['North']*10 + ['South']*10,
    'spend': np.random.randint(100, 1000, 20)
})

# Quartile within each region
def quartile_label(x):
    return pd.qcut(x, q=4, labels=['Q1','Q2','Q3','Q4'])

df['region_quartile'] = df.groupby('region')['spend'].transform(quartile_label)
print(df.sort_values(['region', 'region_quartile']).to_string(index=False))

N Teratas dalam Kelompok

Pertanyaan bisnis yang umum adalah "siapa 3 kinerja terbaik di setiap wilayah?" Gunakan groupby().rank(), lalu lakukan penyaringan berdasarkan peringkat: df[df['rank_col'] <= 3]. Cara ini bekerja dengan baik untuk ukuran kelompok apa pun dan menangani nilai yang sama secara wajar dengan mempertahankan lebih dari 3 baris jika terdapat peringkat yang sama pada batas tersebut. Sebagai alternatif, gunakan groupby().nlargest(n), yang langsung mengembalikan n nilai terbesar per kelompok tanpa menambahkan kolom peringkat.

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({
    'rep': [f'Rep_{i}' for i in range(15)],
    'region': ['East']*5 + ['West']*5 + ['North']*5,
    'revenue': np.random.randint(40000, 120000, 15)
})

df['region_rank'] = df.groupby('region')['revenue'].rank(ascending=False, method='min')

print('Top 2 per region:')
top2 = df[df['region_rank'] <= 2].sort_values(['region', 'region_rank'])
print(top2[['rep', 'region', 'revenue', 'region_rank']].to_string(index=False))

Menggabungkan Rank dan Transform untuk Normalisasi

Anda dapat menggunakan groupby().rank(pct=True) yang digabungkan dengan transform untuk menambahkan kolom peringkat persentil ke DataFrame asli. Kolom ternormalisasi ini sering kali lebih berguna sebagai fitur model daripada nilai mentah — kolom ini bebas skala dan dapat dibandingkan antar kelompok. Untuk pembelajaran mesin, peringkat persentil merupakan alternatif sederhana untuk standardisasi (penskoran-z) yang lebih tahan terhadap pencilan.

import pandas as pd
import numpy as np

np.random.seed(1)
df = pd.DataFrame({
    'product': np.random.choice(['A', 'B', 'C'], 30),
    'score': np.random.randint(50, 100, 30)
})

# Percentile rank within each product group
df['global_pct'] = df['score'].rank(pct=True).round(3)
df['group_pct'] = df.groupby('product')['score'].rank(pct=True).round(3)

print(df.sort_values(['product', 'score']).head(12).to_string(index=False))

Pemeriksaan Singkat

Uji pemahaman Anda tentang operasi peringkat dan persentil dari pelajaran ini.

Rangkuman Pelajaran

Dalam pelajaran ini, Anda mempelajari bahwa: Series.rank() menghitung peringkat numerik dengan pemecahan nilai sama yang dapat dikonfigurasi, groupby().rank() mengatur ulang peringkat dalam setiap kelompok untuk perbandingan antar kelompok yang adil, pct=True mengubah peringkat menjadi persentil (0 hingga 1), dan pd.qcut membuat kelompok dengan frekuensi sama untuk menetapkan tingkatan kuartil, desil, dan persentil. Selanjutnya, kita akan mempelajari kiat performa Pandas — pembuatan profil, menghindari perulangan yang lambat, dan tipe data yang efisien.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Peringkat dan Persentil dalam Grup” gratis?

Ya — teks lengkap “Peringkat dan Persentil dalam Grup” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Peringkat dan Persentil dalam Grup”?

Hitung peringkat dalam grup menggunakan groupby().rank() dan buat kelompok persentil dengan pd.qcut untuk perbandingan relatif. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?

Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Peringkat dan Persentil dalam Grup” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?

Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Jendela Bergulir
  2. Jendela Meluas
  3. Rata-Rata Bergerak Berbobot Eksponensial
  4. Peringkat dan Persentil dalam Grup
← Kembali ke Pandas & NumPy Academy