A diplomások egyetem utáni fizetésének elemzése iparágak szerint
Adatfeltárás a Pandas segítségével

Az alábbi kérdésekre keressük a válaszokat:
- Mely diplomákhoz tartoznak a legmagasabb kezdő fizetések?
- Mely szakok biztosítják a legalacsonyabb jövedelmet az egyetem után?
- Mely diplomák kínálják a legmagasabb kereseti lehetőségeket?
- Melyek a legalacsonyabb kockázatú egyetemi szakok a keresetek szempontjából?
- Üzleti, (tudomány, technológia, mérnöki tudományok, matematika) vagy (humán szakirányok, művészetek, társadalomtudomány) diplomások keresnek többet átlagosan?
Ebben a gyakorlatban a Google Colab Notebook szoftvert fogom használni. Lényegében ez egy online verziója a Jupyter-nek.
1. lépés
Először is hozzá kell adnunk a „salaries_by_college_major.csv” fájlt a Notebookhoz.
2. lépés
Importáljuk be a Pandas-t a Notebookba, és olvassuk be a .csv fájlt.
A Pandas egy nyílt forráskódú Python könyvtár, amelyet adatkezelésre és -elemzésre használnak. Különösen hasznos a strukturált adatokat (például táblázatos adatokat) kezelő feladatokhoz. Ezt a könyvtárat fogjuk most mi is használni.
import pandas as pd
df = pd.read_csv('salaries_by_college_major.csv')
3. lépés
Nézzünk is rá a Pandas adatkeretünkre. A .head() parancs megmutatja az első 5 sort az adatkeretünkből.
df.head()

4. lépés
Adatfeltárás és adattisztítás a Pandas könyvtár segítségével
Az adatkészlet alapos megvizsgálása értékes betekintéseket és világosabb megértést nyújt arról az információról, amivel dolgozunk. Milyen kérdések merülhetnek fel itt?
- Hány sorunk van az adatkeretünkben?
- Hány oszlop található az adatkeretünkben?
- Milyen címkék vannak hozzárendelve az oszlopokhoz? Vannak-e neveik az oszlopoknak?
- Vannak-e hiányzó értékek vagy üres mezők az adatkeretünkben? Tartalmaz-e hibás vagy nem kívánt adatokat?
A sorok és oszlopok számának megtekintéséhez használjuk a shape attribútumot:
df.shape

A fenti táblázat alján megkaptuk, hogy 51 sorunk és 6 oszlopunk van.
5. lépés
Hogy pontosabb képet kapjunk, vizsgáljuk meg az oszlopokat egy kicsit közelebbről.
df.columns

6. lépés
Valószínűleg van néhány hiányzó érték és/vagy „Junk Data” valahol.
A .isna() metódust fogjuk használni, és megnézzük, találunk-e problémát a táblában.
df.isna()
A futtatás után látjuk, hogy az utolsó sor különbözik az előtte álló soroktól.

Pontosan az 50. sorban van a probléma, ahol a „True” állítások jelennek meg.
7. lépés
Vizsgáljuk meg a dataframe (adattábla) utolsó néhány sorát:
df.tail()

8. lépés
- Töröljük ki az utolsó sort, ahol az adatok hiányosak.
- Hozzunk létre egy új adattáblát az utolsó sor nélkül clean_df néven. Erre a Pandas .dropna() metódusát fogjuk használni.
- Ezek után ellenőrizzük az utolsó 5 sort ismét, hogy megbizonyosodjunk róla, hogy minden rendben van.
clean_df = df.dropna()
clean_df.tail()

9. lépés
Oszlopok és egyedi cellák elérése az adattáblában
Egy adott oszlop elérését a dataframe-ben egyszerűen szögletes zárójelekkel adjuk meg, így:
clean_df['Starting Median Salary']

10. lépés
Keressük meg a legmagasabb kezdő fizetést!
clean_df['Starting Median Salary'].max()

11. lépés
De melyik egyetemi szakirány keres átlagosan, $74,300-t? (Meg kell tudnunk a sornak a számát vagy indexét.)
clean_df['Starting Median Salary'].idxmax()

Eredményül 43-at kapunk.
12. lépés
Hogy megtudjuk annak a sornak megfelelő szak nevét, használhatjuk a .loc (location) tulajdonságot.
clean_df['Undergraduate Major'].loc[43]

13. lépés
Ha nem adunk meg egy konkrét oszlopot, a .loc tulajdonság segítségével egy teljes sort lekérhetünk.
clean_df.loc[43]

14. lépés
Melyik egyetemi szakon végzettek érik el a legmagasabb medián fizetést a karrierjük közép időszakában?
print(f"Highest Mid-Career Salary: {clean_df['Mid-Career Median Salary'].max()}")
print(f"Index for the max Mid-Career Median Salary: {clean_df['Mid-Career Median Salary'].idxmax()}")
print(f"Degree: {clean_df['Undergraduate Major'][8]}")

15. lépés
Mi a legalacsonyabb kezdő fizetés?
print(f"Starting Median Salary: {clean_df['Starting Median Salary'].min()}")
clean_df['Undergraduate Major'].loc[clean_df['Starting Median Salary'].idxmin()]

16. lépés
Mennyi az emberek medián fizetése a karrierjük közép időszakában?
clean_df.loc[clean_df['Mid-Career Median Salary'].idxmin()]
Konzol output:

17. lépés
Legalacsonyabb kockázatú szakok
Az alacsony kockázatú szak olyan, ahol kicsi a különbség a legalacsonyabb és a legmagasabb fizetések között. Más szavakkal, ha a szakok 10. és 90. percentilis jövedelmei között kicsi a különbség, akkor a hallgatók nagyobb bizonyossággal számíthatnak munkára és fizetésre a diploma megszerzése után.
clean_df['Mid-Career 90th Percentile Salary'] - clean_df['Mid-Career 10th Percentile Salary']
A .subtract() metódust is használhatjuk:
clean_df['Mid-Career 90th Percentile Salary'].subtract(clean_df['Mid-Career 10th Percentile Salary'])

18. lépés
Egy újabb dataframe oszloppal fogunk most számolni. Vonjuk ki egymásból a 10. és 90. percentilis jövedelmek közötti különbséget. Ezt hozzáadhatjuk a meglévő dataframe-ünkhöz a .insert() metódussal. Ezek után pedig rendezzük a legkisebb különbség alapján. Annak megtekintésére, hogy mely diplomák rendelkeznek a legkisebb különbséggel, használhatjuk a .sort_values() metódust.
spread_col = clean_df['Mid-Career 90th Percentile Salary'] - clean_df['Mid-Career 10th Percentile Salary']
clean_df.insert(1, 'Spread' , spread_col)
clean_df.head()

19. lépés
Melyik szak rendelkezik a legnagyobb potenciállal?
highest_potential = clean_df.sort_values('Mid-Career 90th Percentile Salary' , ascending=False)
highest_potential[['Undergraduate Major' , 'Mid-Career 90th Percentile Salary']].head()

20. lépés
Mely szakokon a legnagyobb a fizetéskülönbség?
highest_spread = clean_df.sort_values('Spread' , ascending=False)
highest_spread[['Undergraduate Major' , 'Spread']].head()

21. lépés
Mi a helyzet a középpálya-medián fizetéssel?
highest_spread = clean_df.sort_values('Mid-Career Median Salary' , ascending=False)
highest_spread[['Undergraduate Major' , 'Mid-Career Median Salary']].head()

22. lépés
Adatok csoportosítása és pivotálása a Pandas-ban:
Az adatok csoportosítása azt jelenti, hogy az oszlopok értékei alapján kategóriákba rendezzük az adatokat. A pivotálás pedig segít az adatok átstrukturálásában úgy, hogy azokat könnyebben olvashassuk és elemezhessük.
clean_df.groupby('Group').count()

23. lépés
Nézzük meg az átlagfizetéseket csoportonként.
clean_df.groupby('Group').mean()

24. lépés
Módosítsunk a formátumon, hogy a táblázatunk könnyebben olvasható legyen:
pd.options.display.float_format = '{:,.2f}'.format
clean_df.groupby('Group').mean()
