Ryhmien sisäinen järjestys ja prosenttipiste
Laskekaa ryhmien sisäiset järjestysluvut groupby().rank()-menetelmällä ja luokaa suhteelliseen vertailuun prosenttipistealueet pd.qcut-funktiolla.
Ryhmien sisäinen järjestys ja prosenttipiste on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.
Miksi järjestysluvut lasketaan ryhmien sisällä?
Raaka-arvot ovat usein vähemmän merkityksellisiä kuin suhteelliset järjestysluvut. Myyntiedustaja, jonka kuukausittainen liikevaihto on 50 000 dollaria, on huippusuoriutuja, jos keskiarvo on 30 000 dollaria, mutta heikosti suoriutuva, jos keskiarvo on 80 000 dollaria. Kun lasket järjestysluvut ryhmien sisällä (esimerkiksi kullakin alueella tai vuosineljänneksellä), saat normalisoidun vertailun, joka ottaa ryhmien erilaiset lähtötasot huomioon. Pandas tekee ryhmien sisäisestä järjestämisestä helppoa groupby().rank()-menetelmällä.
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() — järjestämisen perusteet
Series.rank() antaa kullekin arvolle järjestysluvun: järjestysluku 1 on pienin ja järjestysluku n suurin. ascending=False-parametri kääntää suunnan, jolloin järjestysluku 1 on suurin. Tulos on liukulukuja sisältävä Series (ei kokonaislukuja), koska oletusarvoisesti tasatulokset ratkaistaan laskemalla tasatuloksena olevien järjestyslukujen keskiarvo. Jos sarakkeessa on 5 arvoa, järjestysluvut ovat välillä 1.0–5.0 — tasatuloksissa joillakin arvoilla voi olla sama järjestysluku, kuten 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.5Tasatulosten ratkaisutavat rank()-metodissa
method-parametri määrittää, miten tasatulokset käsitellään. Vaihtoehdot ovat: 'average' (oletus — tasatuloksena olevat arvot saavat järjestyslukujensa keskiarvon), 'min' (kaikki tasatuloksena olevat arvot saavat pienimmän järjestysluvun), 'max' (kaikki saavat suurimman järjestysluvun), 'first' (järjestys määräytyy esiintymisjärjestyksen mukaan — tasatuloksia ei synny) ja 'dense' (järjestysluvuissa ei ole aukkoja — 1, 2, 3, 3, 4 muuttuu muotoon 1, 2, 3, 3, 4 eikä muotoon 1, 2, 3, 3, 5). 'dense'-menetelmä on hyödyllisin prosenttipistetyyppisessä järjestämisessä.
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)Järjestäminen ryhmien sisällä groupby().rank()-metodilla
groupby('group_col')['value_col'].rank() laskee järjestysluvut kunkin ryhmän sisällä erikseen. Järjestysluvut alkavat alusta jokaisen ryhmän kohdalla — siis East-alueen paras suoriutuja saa East-ryhmässä järjestysluvun 1, ja West-alueen paras suoriutuja saa West-ryhmässä niin ikään järjestysluvun 1. Tämän ansiosta groupby-rank soveltuu hyvin reiluihin ryhmien välisiin vertailuihin.
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))Prosenttipistejärjestys rank(pct=True)-parametrilla
pct=True-asetuksen määrittäminen rank()-metodissa palauttaa prosenttipistejärjestyksen: arvon välillä 0–1, joka ilmaisee, kuinka suuri osa ryhmän arvoista on nykyisen arvon suuruisia tai sitä pienempiä. Prosenttipistejärjestys 0.8 tarkoittaa, että arvo on 80. prosenttipisteessä — suurempi kuin 80 % kaikista arvoista. Tämän normalisoinnin ansiosta erikokoisten ryhmien arvoja voidaan verrata suoraan ilman, että ryhmien tarkkoja kokoja tarvitsee tietää.
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: kvantiileihin perustuva luokittelu
pd.qcut(series, q) jakaa arvot q:ään yhtä usein esiintyvään luokkaan siten, että kussakin luokassa on suunnilleen sama määrä havaintoja. Toisin kuin yhtä leveitä välejä käyttävä pd.cut, pd.qcut mukauttaa välien rajat aineiston jakauman mukaan. Tämä sopii erinomaisesti kvartiilien (q=4), kvintiilien (q=5) tai desiilien (q=10) luomiseen suorituskykyluokkia varten.
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 vai pd.qcut
pd.cut(series, bins=n) luo yhtä leveitä välejä (sama vaihteluväli, eri määrät havaintoja). pd.qcut(series, q=n) luo yhtä usein esiintyviä välejä (sama määrä havaintoja, eri vaihteluvälit). Vinoissa aineistoissa pd.cut tuottaa jakauman häntiin lähes tyhjiä luokkia, kun taas pd.qcut jakaa havainnot tasaisesti. Valitse pd.cut, kun välien rajoilla on luonteva liiketoimintamerkitys (hintaluokat, ikäryhmät), ja pd.qcut, kun haluat samankokoiset ryhmät suorituskykyluokkia varten.
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())Desiilimerkintöjen luominen pd.qcut-menetelmällä
pd.qcut(series, q=10, labels=range(1,11)) sijoittaa kunkin havainnon omaan desiiliinsä (1–10). Tämä on vakiintunut menetelmä markkinointianalytiikassa (asiakasarvon desiilit), luottopisteytyksessä (riskidesiilit) ja A/B-testauksessa (liikenteen desiilit kohorttianalyysiä varten). labels-parametri voi olla mikä tahansa q:n pituinen lista — käyttäkää luettavampaan tulosteeseen esimerkiksi merkkijonoja kuten ['Bottom 10%', ..., 'Top 10%'].
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))Prosenttipisteluokat ryhmien sisällä
Yhdistä groupby ja pd.qcut käyttämällä transform-metodia, niin voit luoda prosenttipisteluokat kunkin ryhmän sisällä. Tämä on hyödyllistä, kun haluat järjestää asiakkaat kunkin alueen sisällä (etkä maailmanlaajuisesti) — maailmanlaajuisesti alimpaan desiiliin kuuluva asiakas voi olla oman alueensa desiilin kärjessä. Käytä koodia 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))Ryhmien sisäiset Top-N-arvot
Yleinen liiketoimintakysymys on: "ketkä ovat kunkin alueen kolme parasta suoriutujaa?" Käytä groupby().rank()-metodia ja suodata sen jälkeen järjestysluvun perusteella: df[df['rank_col'] <= 3]. Tämä toimii siististi kaikenkokoisilla ryhmillä ja käsittelee tasatulokset joustavasti säilyttämällä yli 3 riviä, jos raja-arvon kohdalla on sama järjestysluku. Vaihtoehtoisesti voit käyttää groupby().nlargest(n)-metodia, joka palauttaa suoraan kunkin ryhmän n suurinta arvoa lisäämättä järjestyslukusaraketta.
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))Järjestyslukujen ja transform-metodin yhdistäminen normalisointia varten
Voit käyttää groupby().rank(pct=True)-metodia yhdessä transform-metodin kanssa ja lisätä alkuperäiseen DataFrameen prosenttipistejärjestystä sisältävän sarakkeen. Tämä normalisoitu sarake on usein mallin piirteenä hyödyllisempi kuin raaka-arvo — se ei riipu asteikosta ja on vertailukelpoinen ryhmien välillä. Koneoppimisessa prosenttipistejärjestykset ovat yksinkertainen standardoinnin (z-pisteytyksen) vaihtoehto, joka kestää poikkeavia arvoja paremmin.
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))Pikakertaus
Testaa tämän oppitunnin aikana oppimaasi järjestysluku- ja prosenttipisteoperaatioista.
Oppitunnin yhteenveto
Tässä oppitunnissa opit, että Series.rank() laskee numeeriset järjestysluvut määritettävillä tasatulosten ratkaisuilla, groupby().rank() aloittaa järjestysluvut alusta kussakin ryhmässä reiluja ryhmien välisiä vertailuja varten, pct=True muuntaa järjestysluvut prosenttipisteiksi (0–1) ja pd.qcut luo yhtä usein esiintyviä luokkia kvartiilien, desiilien ja prosenttipisteisiin perustuvien tasojen määrittämistä varten. Seuraavaksi tutustumme Pandasin suorituskykyvinkkeihin — profilointiin, hitaiden silmukoiden välttämiseen ja tehokkaisiin tietotyyppeihin.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Ryhmien sisäinen järjestys ja prosenttipiste” ilmainen?
Kyllä – oppitunnin ”Ryhmien sisäinen järjestys ja prosenttipiste” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Ryhmien sisäinen järjestys ja prosenttipiste”?
Laskekaa ryhmien sisäiset järjestysluvut groupby().rank()-menetelmällä ja luokaa suhteelliseen vertailuun prosenttipistealueet pd.qcut-funktiolla. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Ryhmien sisäinen järjestys ja prosenttipiste”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?
Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Liukuvat ikkunat
- Laajenevat ikkunat
- Eksponentiaalisesti painotettu liukuva keskiarvo
- Ryhmien sisäinen järjestys ja prosenttipiste