Statisztikák és ábrázolásuk (seaborn)

In [1]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib
In [2]:
import pandas as pd

Érettségi adatok feldolgozása

Az alábbiakban folytatjuk az érettségi statisztikák elemzését. Koncentrálva a statisztikai mennyiségek számítására és összefoglaló ábrák készítésére. Olvassuk be újra az adatokat:

In [3]:
df=pd.read_csv("data/erettsegi.csv.gz",sep=";",index_col=0)

Elemi statisztika

A describe függvény segítségével kaphatunk egy összefoglalót a táblázatunkról.

In [4]:
df.describe()
Out[4]:
vizsgázó évfolyama érdemjegy össz százalék össz pontszám I. feleletválasztós kérdéssor II. esszé: tartalom II. esszé: kifejtés módja III. összetett feladatok írásbeli pontszám mérés és tételkifejtés: tartalmi helyesség mérés és tételkifejtés: felépítés, kifejtés szóbeli pontszám év egy téma kifejtése kísérlettel vagy méréssel: tartalom egy téma kifejtése kísérlettel vagy méréssel: felépítés, kifejtés II. összetett feladatok
count 19811.000000 21444.000000 21444.000000 21444.000000 20635.000000 5047.000000 5047.000000 5047.000000 20635.000000 5058.000000 5058.000000 20715.000000 21890.000000 15657.000000 15657.000000 15588.000000
mean 12.737015 4.022617 66.553861 100.219269 22.418173 12.948286 4.228849 28.152170 55.282966 35.715896 4.014433 47.302872 2013.364824 45.667369 4.162866 28.829099
std 34.817782 1.074826 19.247675 28.865995 7.112939 3.860824 1.023183 12.347646 18.886694 9.203527 1.096126 12.863038 1.157214 11.646716 1.100549 12.855951
min 1.000000 1.000000 0.000000 0.000000 2.000000 0.000000 0.000000 0.000000 8.000000 0.000000 0.000000 0.000000 2011.000000 0.000000 0.000000 0.000000
25% 12.000000 3.000000 54.000000 82.000000 18.000000 11.000000 4.000000 19.000000 41.000000 31.000000 3.000000 40.000000 2012.000000 40.000000 3.000000 19.000000
50% 12.000000 4.000000 70.000000 105.000000 22.000000 14.000000 5.000000 29.000000 56.000000 38.000000 4.000000 50.000000 2013.000000 50.000000 5.000000 29.000000
75% 12.000000 5.000000 82.000000 123.000000 28.000000 16.000000 5.000000 39.000000 70.000000 43.000000 5.000000 58.000000 2014.000000 55.000000 5.000000 40.000000
max 2014.000000 5.000000 100.000000 150.000000 40.000000 18.000000 5.000000 47.000000 100.000000 90.000000 10.000000 120.000000 2015.000000 110.000000 10.000000 50.000000
In [5]:
df.describe().T
Out[5]:
count mean std min 25% 50% 75% max
vizsgázó évfolyama 19811.0 12.737015 34.817782 1.0 12.0 12.0 12.0 2014.0
érdemjegy 21444.0 4.022617 1.074826 1.0 3.0 4.0 5.0 5.0
össz százalék 21444.0 66.553861 19.247675 0.0 54.0 70.0 82.0 100.0
össz pontszám 21444.0 100.219269 28.865995 0.0 82.0 105.0 123.0 150.0
I. feleletválasztós kérdéssor 20635.0 22.418173 7.112939 2.0 18.0 22.0 28.0 40.0
II. esszé: tartalom 5047.0 12.948286 3.860824 0.0 11.0 14.0 16.0 18.0
II. esszé: kifejtés módja 5047.0 4.228849 1.023183 0.0 4.0 5.0 5.0 5.0
III. összetett feladatok 5047.0 28.152170 12.347646 0.0 19.0 29.0 39.0 47.0
írásbeli pontszám 20635.0 55.282966 18.886694 8.0 41.0 56.0 70.0 100.0
mérés és tételkifejtés: tartalmi helyesség 5058.0 35.715896 9.203527 0.0 31.0 38.0 43.0 90.0
mérés és tételkifejtés: felépítés, kifejtés 5058.0 4.014433 1.096126 0.0 3.0 4.0 5.0 10.0
szóbeli pontszám 20715.0 47.302872 12.863038 0.0 40.0 50.0 58.0 120.0
év 21890.0 2013.364824 1.157214 2011.0 2012.0 2013.0 2014.0 2015.0
egy téma kifejtése kísérlettel vagy méréssel: tartalom 15657.0 45.667369 11.646716 0.0 40.0 50.0 55.0 110.0
egy téma kifejtése kísérlettel vagy méréssel: felépítés, kifejtés 15657.0 4.162866 1.100549 0.0 3.0 5.0 5.0 10.0
II. összetett feladatok 15588.0 28.829099 12.855951 0.0 19.0 29.0 40.0 50.0

A corr függvénnyel lekérhetjük a Pearson/Speaman/Kendall korrelációs táblázatot.

In [6]:
df.corr(method="pearson")
Out[6]:
vizsgázó évfolyama érdemjegy össz százalék össz pontszám I. feleletválasztós kérdéssor II. esszé: tartalom II. esszé: kifejtés módja III. összetett feladatok írásbeli pontszám mérés és tételkifejtés: tartalmi helyesség mérés és tételkifejtés: felépítés, kifejtés szóbeli pontszám év egy téma kifejtése kísérlettel vagy méréssel: tartalom egy téma kifejtése kísérlettel vagy méréssel: felépítés, kifejtés II. összetett feladatok
vizsgázó évfolyama 1.000000 0.013730 -0.000021 0.000101 -0.006200 -0.012108 -0.016003 -0.008011 0.006674 -0.008256 0.014697 -0.012063 0.012776 0.006201 -0.000067 0.050594
érdemjegy 0.013730 1.000000 0.907772 0.906896 0.507316 0.560202 0.445160 0.707938 0.846829 0.775403 0.645829 0.632853 0.049254 0.787951 0.666969 0.842976
össz százalék -0.000021 0.907772 1.000000 0.998582 0.684114 0.663993 0.500275 0.891349 0.903683 0.805784 0.686136 0.759383 0.019835 0.810324 0.687220 0.895515
össz pontszám 0.000101 0.906896 0.998582 1.000000 0.684060 0.664042 0.500438 0.891243 0.904050 0.796333 0.676032 0.748877 0.019255 0.799206 0.676825 0.895725
I. feleletválasztós kérdéssor -0.006200 0.507316 0.684114 0.684060 1.000000 0.356895 0.256725 0.534321 0.652535 0.415918 0.335439 0.474384 -0.107093 0.400883 0.350101 0.639866
II. esszé: tartalom -0.012108 0.560202 0.663993 0.664042 0.356895 1.000000 0.646490 0.518907 0.686980 0.433555 0.392058 0.436247 0.131977 NaN NaN NaN
II. esszé: kifejtés módja -0.016003 0.445160 0.500275 0.500438 0.256725 0.646490 1.000000 0.370415 0.506517 0.344682 0.332567 0.349502 0.076108 NaN NaN NaN
III. összetett feladatok -0.008011 0.707938 0.891349 0.891243 0.534321 0.518907 0.370415 1.000000 0.941172 0.550949 0.459826 0.550095 0.081351 NaN NaN NaN
írásbeli pontszám 0.006674 0.846829 0.903683 0.904050 0.652535 0.686980 0.506517 0.941172 1.000000 0.591616 0.499105 0.420815 0.025150 0.544409 0.468870 0.954703
mérés és tételkifejtés: tartalmi helyesség -0.008256 0.775403 0.805784 0.796333 0.415918 0.433555 0.344682 0.550949 0.591616 1.000000 0.832555 0.994463 0.009425 NaN NaN NaN
mérés és tételkifejtés: felépítés, kifejtés 0.014697 0.645829 0.686136 0.676032 0.335439 0.392058 0.332567 0.459826 0.499105 0.832555 1.000000 0.861251 0.007014 NaN NaN NaN
szóbeli pontszám -0.012063 0.632853 0.759383 0.748877 0.474384 0.436247 0.349502 0.550095 0.420815 0.994463 0.861251 1.000000 -0.022371 0.995005 0.836474 0.552048
év 0.012776 0.049254 0.019835 0.019255 -0.107093 0.131977 0.076108 0.081351 0.025150 0.009425 0.007014 -0.022371 1.000000 0.002093 0.011521 0.030493
egy téma kifejtése kísérlettel vagy méréssel: tartalom 0.006201 0.787951 0.810324 0.799206 0.400883 NaN NaN NaN 0.544409 NaN NaN 0.995005 0.002093 1.000000 0.809229 0.550518
egy téma kifejtése kísérlettel vagy méréssel: felépítés, kifejtés -0.000067 0.666969 0.687220 0.676825 0.350101 NaN NaN NaN 0.468870 NaN NaN 0.836474 0.011521 0.809229 1.000000 0.471478
II. összetett feladatok 0.050594 0.842976 0.895515 0.895725 0.639866 NaN NaN NaN 0.954703 NaN NaN 0.552048 0.030493 0.550518 0.471478 1.000000

Ki is rajzolhatjuk könnyen.

In [7]:
c=df.corr(method="pearson")

imshow(c,interpolation="none",cmap='BrBG')
xticks(range(len(c.index)),c.index,rotation=90)
yticks(range(len(c.index)),c.index)
colorbar();

Ábrázolás

A pandas nagy erőssége, hogy a DataFrame-ekből nagyon rövid szintaxissal lehet egészen elfogadható ábrákat készíteni. Ehhez a pandas a matplotlib könyvtárat használja, melyet emiatt be is kell importálnunk.

Az ábra paramétereit (title, ylabel stb.) a matplotlib-ben megszokott módon állíthatjuk be.

Elsőként növeljük meg alapértelmezetten a tengelyfeliratokat:

In [8]:
rcParams["font.size"]=12

Eloszlások

In [9]:
pontok=df[['írásbeli pontszám',
         'III. összetett feladatok']]
pontok.head()
Out[9]:
írásbeli pontszám III. összetett feladatok
0 NaN NaN
1 NaN NaN
2 86.0 NaN
3 23.0 NaN
4 66.0 NaN
In [10]:
pontok.hist(figsize=(8,4));
In [11]:
pontok.plot.hist(figsize=(9,6),alpha=0.5);
In [12]:
pontok.plot.box(figsize=(9,6));

Kovarianciák

In [13]:
pontok.plot.scatter(x='írásbeli pontszám',y= 'III. összetett feladatok');
In [14]:
pontok.plot.hexbin(x='írásbeli pontszám',y= 'III. összetett feladatok',gridsize=20);

Nézzük meg egyben néhány pontszám hisztogramját, és kovarianciáját

In [15]:
pd.scatter_matrix(pontok,figsize=(9,9));
/opt/conda/lib/python3.5/site-packages/ipykernel/__main__.py:1: FutureWarning: pandas.scatter_matrix is deprecated. Use pandas.plotting.scatter_matrix instead
  if __name__ == '__main__':

Egyedi ábrák

Nézzük meg ábrán is az emelt szintű és a középszintű érettségizők számának időbeli alakulását.

In [16]:
toplot=df.groupby(['szint','év'])[['szint']].count()
toplot
Out[16]:
szint
szint év
E 2011 50
2012 1152
2013 1457
2014 1462
2015 1357
K 2011 358
2012 4829
2013 4176
2014 3491
2015 3558

Használjuk az unstack függvényt hogy könnyen plottolhatóak legyenek az egyes csoportok.

In [17]:
toplot=toplot.unstack(level=0)
toplot
Out[17]:
szint
szint E K
év
2011 50 358
2012 1152 4829
2013 1457 4176
2014 1462 3491
2015 1357 3558
In [18]:
toplot.plot(kind="area", figsize=(9, 6))
ylabel("Érettségizok száma")
ylim(0,7000)
xticks(range(2011,2016),map(str,range(2011,2016)));

Megnézhetjük kördiagramon, hogy melyik iskolatípusból hányan érettségiztek közép- és emelt szinten 2011 és 2015 között. Ehhez két alábrát készítünk a múltkor tanultakhoz hasonlóan.

Vajon mit csinált az autopct kulcsszó? Mi lehet a -?

In [19]:
t=df[(df["vizsgázó részvétele"]=="megjelent")].groupby(["szint","vizsgázó képzési típusa"])
t=t.size().unstack(level=1)
t.plot.pie(subplots=True,autopct="%.1f",figsize=(12,4));

Seaborn csomag

In [20]:
import seaborn as sns

Ez egy olyan csomag, amivel esztétikus plotokat készíthetünk kevés vesződéssel, leginkább statisztikai elemzésre.

Hisztogram és eloszlássűrűség-becslés.

In [21]:
sns.distplot(df['írásbeli pontszám'].dropna());
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Csak kde (kernel density estimate).

In [22]:
sns.kdeplot(df['írásbeli pontszám']);
/home/horvath.anna/.local/lib/python3.5/site-packages/statsmodels/nonparametric/kde.py:454: RuntimeWarning: invalid value encountered in greater
  X = X[np.logical_and(X>clip[0], X<clip[1])] # won't work for two columns.
/home/horvath.anna/.local/lib/python3.5/site-packages/statsmodels/nonparametric/kde.py:454: RuntimeWarning: invalid value encountered in less
  X = X[np.logical_and(X>clip[0], X<clip[1])] # won't work for two columns.
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Kumulatív eloszlásfüggvény. ( De a becsült, nem az igazi! )

In [23]:
sns.kdeplot(df['írásbeli pontszám'].dropna(),cumulative=True);
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Lehet több eloszlást egyben

In [24]:
pontok=df.loc[df['szint']=='K',['írásbeli pontszám',
           'szóbeli pontszám',
           'vizsgázó képzési típusa']]
pontok.head()
Out[24]:
írásbeli pontszám szóbeli pontszám vizsgázó képzési típusa
0 NaN NaN gimnázium
1 NaN NaN gimnázium
2 86.0 60.0 gimnázium
3 23.0 38.0 gimnázium
4 66.0 60.0 gimnázium

Egyesével kirajzolhatjuk a pontokat.

In [25]:
sns.stripplot(x='vizsgázó képzési típusa', y='írásbeli pontszám',
              data=pontok.dropna().iloc[:1000],jitter=True);
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Dobozokat is rajzolhatunk.

In [26]:
sns.boxplot(x='vizsgázó képzési típusa', y='írásbeli pontszám',
              data=pontok);
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Vagy az eloszlássűrűségeket egymás mellé.

In [27]:
sns.violinplot(x='vizsgázó képzési típusa', y='írásbeli pontszám',
              data=pontok);
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Többdimenziós eloszlásokat is ábrázolhatunk.

In [28]:
x='írásbeli pontszám'
y='szóbeli pontszám'

Becsült eloszlássűrűséggel.

In [29]:
sns.jointplot(x=x, y=y, data=pontok, kind="kde");
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Vagy hisztogramokkal is.

In [30]:
sns.jointplot(x=x, y=y, data=pontok,kind="hex", color="k");
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

A már látott párplot is megvan.

In [31]:
sns.pairplot(pontok.dropna());
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Illeszhetünk és rajzolhatunk lineáris modellt.

In [32]:
sns.lmplot(x=y, y=x, data=pontok.dropna().iloc[:30,:]);
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Kirajzolva még más dolgokat is.

In [33]:
sns.jointplot(x=y, y=x, data=pontok.dropna().iloc[:30,:],kind='reg');
/home/horvath.anna/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))