$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Основни типови визуализације података

У овој радној свесци ћемо увести (или обновити) неке основне типове визуализације података (линијске, стубичасте и секторске дијаграме) на примеру припремљених података о студентима и дипломцима преузетих са сајта Републичког завода за статистику. Уз обнављање већ познатих опција које ови дијаграми нуде, искористићемо и увести и неке нове (ознаке на линијама, тип линије, наслагање стубића и измештање стубића) у складу са подацима који су нам на располагању.

Иако се учитавање библиотеке може одиграти на било ком месту у радној свесци, "бонтон" је да се све библиотеке увезу на почетку, чиме читалац одмах на почетку има представу које све додатне функције се користе у анализи у наставку. Користићемо библиотеке pandas (у овој свесци само за учитавање и преглед табеларних података) и matplotlib (за цртање дијаграма) које ћемо учитати и преименовати у њихове типичне скраћенице.

In [2]:
import pandas as pd
import matplotlib.pyplot as plt

Наша највећа мотивација за коришћење pandas библиотеке је у једноставности учитавања, манипулације и чувања табеларних података. Стога ћемо и у наставку почети са учитавањем read_csv и прегледањем head фајла republika_srbija_visoko_2009_2017.csv:

In [3]:
data = pd.read_csv('data/studenti data/republika_srbija_visoko_2009_2017.csv')
data.head()
Out[3]:
Skolska godina Godina upisa/diplome Broj visih Upisani studenti vise Budzetski studenti vise Diplomirani studenti vise Broj fakulteta Upisani studenti fakulteti Budzetski studenti fakulteti Diplomirani studenti fakulteti Ukupno studenata Ukupno studentkinja Ukupno diplomiranih Ukupno diplomiranih zene Diploma I stepen visa Diploma II stepen visa Diploma I stepen fakultet Diploma II stepen fakultet Diploma III stepen fakultet Diploma stari program
0 2009-2010 2009 59 43707 15081 11674 130 183065 83528 31871 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 2010-2011 2010 59 47169 16091 10057 130 181362 81699 36105 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 2011-2012 2011 58 47322 16740 10751 130 184339 85362 36772 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 2012-2013 2012 57 46649 17213 11648 125 192296 89271 36149 238945.0 133427.0 47797.0 27930.0 10184.0 1464.0 6318.0 29081.0 750.0 NaN
4 2013-2014 2013 56 48052 17117 12768 124 194796 87316 37960 242848.0 134448.0 50728.0 29340.0 11060.0 1708.0 7163.0 30056.0 741.0 NaN

Ова табела настала је комбиновањем више извештаја које издаје Републички завод за статистику (Општине и региони у Републици Србији), а у којима се налазе информације о броју уписаних студената у току одговарајуће школске године на нивоу државе, али и појединачних региона и општина. Како се формат тих табела пар пута мењао у протеклих 10 година, у учитаној табели су само сумирани подаци на нивоу целе Србије, а у некој наредној радној свесци ћемо додатно анализирати и једну конкретну годину.

Како табела садржи велики број колона па их не сагледавамо лепо прегледом првих пар редова, све колоне можемо излистати функцијом columns:

In [3]:
data.columns
Out[3]:
Index(['Skolska godina', 'Godina upisa/diplome', 'Broj visih',
       'Upisani studenti vise', 'Budzetski studenti vise',
       'Diplomirani studenti vise', 'Broj fakulteta',
       'Upisani studenti fakulteti', 'Budzetski studenti fakulteti',
       'Diplomirani studenti fakulteti', 'Ukupno studenata',
       'Ukupno studentkinja', 'Ukupno diplomiranih',
       'Ukupno diplomiranih zene', 'Diploma I stepen visa',
       'Diploma II stepen visa', 'Diploma I stepen fakultet',
       'Diploma II stepen fakultet', 'Diploma III stepen fakultet',
       'Diploma stari program'],
      dtype='object')

Међутим поред назива колона, уз помоћ функција info можемо сазнати и тип података који се крије у свакој од колона:

In [4]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 20 columns):
Skolska godina                    9 non-null object
Godina upisa/diplome              9 non-null int64
Broj visih                        9 non-null int64
Upisani studenti vise             9 non-null int64
Budzetski studenti vise           9 non-null int64
Diplomirani studenti vise         9 non-null int64
Broj fakulteta                    9 non-null int64
Upisani studenti fakulteti        9 non-null int64
Budzetski studenti fakulteti      9 non-null int64
Diplomirani studenti fakulteti    9 non-null int64
Ukupno studenata                  6 non-null float64
Ukupno studentkinja               6 non-null float64
Ukupno diplomiranih               6 non-null float64
Ukupno diplomiranih zene          6 non-null float64
Diploma I stepen visa             6 non-null float64
Diploma II stepen visa            6 non-null float64
Diploma I stepen fakultet         6 non-null float64
Diploma II stepen fakultet        6 non-null float64
Diploma III stepen fakultet       6 non-null float64
Diploma stari program             4 non-null float64
dtypes: float64(10), int64(9), object(1)
memory usage: 1.5+ KB

Корисно је што поред типа података (int64 или float64) сазнајемо и колико има уноса у којој колони, види нпр. "Ukupno diplomiranih zene: 6 non-null float64" где сазнајемо да само за 6 од 9 година имамо информације о броју жена које су дипломирале (то је једна од поменутих измена која се дешавала у публикацију РСЗ-а, тек у неком каснијем моменту кренули су да прикупљају и бележе одвојене податке за жене, што је направило измене у формату у коме се чувају подаци).

Ова табелица као што видимо, не садржи тако пуно података и одабрана је намерно да буде тако мала и сагледива, али ћемо и даље приметити разне начине да ове податке визуелно представимо и тако сагледамо информације које нам нису видљиве у табеларном облику.

За почетак ћемо представити укупан број студената на факултетима линијским дијаграмом. У наставку је најосновнији облик фунцкије plot са само једним аргументом. Ако је функцији прослеђена само 1 листа, вредности из листе коришћене су за координате на у оси, а на х оси су бројеви редом од 0:

In [5]:
plt.plot(data['Upisani studenti fakulteti'])
plt.show()

Да прикажемо нацртани график, користимо и функцију show, пробајте шта се дешава без ње.

Међутим, ми у табели имамо и године којима одговарају ови бројеви студената, па можемо и то проследити функцији plot тако да координате на х-оси постану смисленије:

In [6]:
plt.plot(data['Godina upisa/diplome'], data['Upisani studenti fakulteti'])
#plt.plot(data['Godina upisa/diplome'], data['Upisani studenti fakulteti'], 'o')
#plt.plot(data['Godina upisa/diplome'], data['Upisani studenti fakulteti'], 'o-')
#plt.plot(data['Godina upisa/diplome'], data['Upisani studenti fakulteti'], 'o--', color = 'tomato')
plt.xlabel('Godina upisa')
plt.ylabel('Ukupan broj upisnih studenata')
plt.show()

У претходном блоку кода додали смо имена х и у осе (користећи функције xlabel и ylabel), али смо додали и пар линија које су коментарисане (више различитих опција линијских дијаграма за исте податке), истражите разлике!

У табели имамо и број студената у вишим школама, али и број студената који су дипломирали и слично. Ако желимо да представимо више различитих линија на дијаграмима, то можемо видети на следећи начин. У наставку смо и одступили од стандардних боја, бирајући неке од именованих боја које можете наћи на овој листи. Додали смо такође имена овим линијама labels и уз помоћ њих можемо лако додати легенду графику користећи функцију legend.

In [7]:
plt.plot(data['Godina upisa/diplome'], data['Upisani studenti fakulteti'], 'o--', color = 'salmon',label = 'Ukupan broj studenata na fakultetima')
plt.plot(data['Godina upisa/diplome'], data['Budzetski studenti fakulteti'], 'o--', color = 'darkcyan',label = 'Budžetski studenti na fakultetima')
plt.xlabel('Godina upisa')
plt.ylabel('Broj studenata na fakultetima')
plt.ylim([0,230000])
plt.legend()
plt.show()

Међутим, када се вредности у два различита низа оволико разликују, није лако више увидети шта се дешава на појединачним линијама. Обратите пажњу, на претходном дијаграму где смо посматрали само укупан број студената на факултетима, видели смо и неке успоне и падове у броју студената током година, док је овде та линија практично равна. Ово је последица "зумираности" дијаграма зато што је раније посматрани опсег на у оси био између 180 000 и 220 000 студената, док на последњем дијаграму гледамо цео распон у осе од 0 до 220 000 студената (ово смо контролисани користећи функцију ylim). Слично можемо погледати у каквом су односу бројеви студената на факултетима и вишим школама:

In [8]:
plt.plot(data['Godina upisa/diplome'], data['Upisani studenti fakulteti'], 'o--', color = 'salmon',label = 'Ukupan broj studenata na fakultetima')
plt.plot(data['Godina upisa/diplome'], data['Upisani studenti vise'], 'o--', color = 'darkcyan',label = 'Ukupan broj studenata na visim skolama')
plt.xlabel('Godina upisa')
plt.ylabel('Broj studenata')
plt.ylim([0,225000])
plt.legend()
plt.show()

У овом случају је још теже уочити да ли постоје неке везе међу овим бројевима зато што је укупан број студената на вишим школама далеко мањи. Међутим, ако смо заинтересовани да ли дати бројеви студената варирају и колико, уместо да пратимо апсолутни број студената из године у годину, можемо истражити како се број студената мења у односу на прву посматрану годину:

In [9]:
plt.plot(data['Godina upisa/diplome'],data['Upisani studenti fakulteti']/data['Upisani studenti fakulteti'][0], 'o--', color = 'salmon')
plt.plot(data['Godina upisa/diplome'],data['Upisani studenti vise']/data['Upisani studenti vise'][0], 'o--', color = 'darkcyan')
plt.axhline(y=1,color='grey')
plt.xlabel('Godina upisa')
plt.ylabel('Odnos broja studenata u datoj i 2009. godini')
plt.legend(['Fakulteti','Vise skole'])
plt.show()

Упозорење у вези са повезаним линијским дијаграмима: Покушајте да прво сортирате табелу по колони коју желите да нацртате па тек онда да нацртате одговарајући дијаграм.

In [10]:
# место за ваш код
In [11]:
# data = data.sort_values(by='Godina upisa/diplome')

Како је колона која садржи информације о укупном броју студената (и на факултетима и на вишим школама) непотпуна, у наставку ћемо је допунити:

In [12]:
data['Ukupno studenata'] = data['Upisani studenti fakulteti'] + data['Upisani studenti vise']

Иако на х оси ових наших дијаграма имамо време, које је често довољан разлог да се одлучимо за линијски дијаграм, чињеница да број студената као измерена вредност има смисла само у дискретним временским тренуцима, позива да ипак можда ове податке представимо стубичастим дијаграмом (функција bar). Основни формат ове функције:

In [13]:
plt.bar(data['Godina upisa/diplome'], data['Upisani studenti fakulteti'])
plt.show()

За разлику од функције plot, bar функцији је потребно проследити и х координате, тј. није могуће проследити само висине барова. Као и у функцији plot могуће је доделити одређену боју стубићима, као и означити одређен сет података за касније коришћење у легенди:

In [14]:
plt.bar(data['Godina upisa/diplome'], data['Upisani studenti fakulteti'], color = 'salmon',label = 'Fakulteti')
plt.bar(data['Godina upisa/diplome'], data['Upisani studenti vise'], color = 'darkcyan',label = 'Vise skole')
plt.xlabel('Godina upisa')
plt.ylabel('Ukupan broj upisnih studenata')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.9))
plt.show()

Ако нам је циљ да сагледамо укупан број студената који се школује у датом тренутку (без обзира на институцију у којој се школује), претходни дијаграм захтева од нас да у глави сабирамо висине стубића две различите боје, и када су међу њима разлике овако мале, са овог дијаграма није једноставно рећи да ли је укупно више студената било у 2013 или 2014 години. Постоје бар два начин да превазиђемо овај проблем у визуализацијама. Први је да уместо веће колоне (у овом случају броја студената на факултетима) цртамо стубиће укупног броја студената (и факултети и више школе), а затим преко нацртамо стубиће који одговарају колони са мањим вредностима:

In [15]:
plt.bar(data['Godina upisa/diplome'], data['Ukupno studenata'], color = 'salmon',label = 'Fakulteti')
plt.bar(data['Godina upisa/diplome'], data['Upisani studenti vise'], color = 'darkcyan',label = 'Vise skole')
plt.xlabel('Godina upisa')
plt.ylabel('Ukupan broj upisnih studenata')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.9))
plt.show()

На овај начин су делови розе дијаграма прекривени и само они видљиви делови одговарају броју студената на факултетима. Овако са у осе директно очитавамо укупан број студената и број студената на вишим школама, док је број студената на факултетима разлика ова два броја (приметимо, добили смо олакшицу у представљању једног податка, али сада други податак захтева рачун у глави). Други начин да се разреши иста ситуација, је коришћење опције bottom у оквиру bar функције. Ова опција дозвољава да се стубићи настављају један на други тиме што се висина једног слоја стубића користи као почетна тачка за висине нових стубића. Ово је посебно погодно кад имате више од 2 категорије стубића које бисте надовезивали.

In [16]:
plt.bar(data['Godina upisa/diplome'], data['Upisani studenti fakulteti'], color = 'salmon',label = 'Fakulteti')
plt.bar(data['Godina upisa/diplome'], data['Upisani studenti vise'], bottom = data['Upisani studenti fakulteti'], color = 'darkcyan',label = 'Vise skole')
plt.xlabel('Godina upisa')
plt.ylabel('Ukupan broj upisnih studenata')
plt.legend(loc='center left', bbox_to_anchor=(1, 1))
plt.show()

На последња два дијаграма смо обрнули редослед стубића да бисмо оставили могућност да се и број студената на факултету директно очитава са у осе. Поправите претходне редове кода да добијете идентичан график претходном!

Коначно, код оваквих, надовезујућих графика, једна од идеја је и да се на једноставан начин осмотри како се однос међу категоријама мења током времена, па онда уместо да гледамо апсолутне вредности на у оси можемо посматрати проценте. Погледајмо исте податке и на тај начин:

In [17]:
plt.bar(data['Godina upisa/diplome'], 100*data['Upisani studenti fakulteti']/data['Ukupno studenata'], color = 'salmon',label = 'Fakulteti')
plt.bar(data['Godina upisa/diplome'], 100*data['Upisani studenti vise']/data['Ukupno studenata'], bottom = 100*data['Upisani studenti fakulteti']/data['Ukupno studenata'], color = 'darkcyan',label = 'Vise skole')
plt.xlabel('Godina upisa')
plt.ylabel('Procenat upisnih studenata')
plt.grid(True,axis='y')
plt.legend(loc='center left', bbox_to_anchor=(1, 1))
plt.show()

И на овај начин видимо да из године у годину више студената студира на факултетима, углавном преко 80%, да бисмо ово лакше уочили, на последњи график додали смо и хоризонталне линије на сваких 20%, функцијом grid.

Слично визуелно истраживање можемо извести и поредећи буџетских и самофинансирајуће студената на факултетима и(ли) вишим школама, пробајте сами једну од претходних визуализација и упредите ове две колоне:

In [18]:
# mesto za vas kod
In [19]:
# mesto za vas kod

У наставку ћемо испробати још једну изузетно корисну функцију subplot којојм олакшавамо преглед више графика одједном тиме што креирамо поддијаграме:

In [20]:
plt.figure(figsize=(15,5))
plt.subplot(1,2,1)
plt.plot(data['Godina upisa/diplome'], 100*data['Budzetski studenti fakulteti']/data['Upisani studenti fakulteti'],'o--',color='grey')
plt.xlabel('Godina upisa')
plt.ylabel('Procenat budzetskih studenata na fakultetima')

plt.subplot(1,2,2)
plt.plot(data['Godina upisa/diplome'], data['Budzetski studenti fakulteti'],'o--',color='grey')
plt.plot(data['Godina upisa/diplome'], data['Upisani studenti fakulteti']-data['Budzetski studenti fakulteti'],'o--',color='salmon')
plt.xlabel('Godina upisa')
plt.ylabel('Ukupan broj studenata na fakultetima')
plt.legend(['Studenti na budzetu','Samofinansirajuci studenti'])

plt.show()

Ова два графика, на два начина приказују податке из исте две колоне и на тај начин нам можемо да схватимо више информација које подаци из тих колона садрже. На пример, график са леве стране приказује како се мењао проценат буџетских студената на факултетима у посматраном временском периоду. Видимо да је у току последње 2 године проценат буџетских студената опао за 3-4% у односу на почетне године за које имамо податке. Како разматрамо проценте, разлог за овај уочени пад може бити смањење државног буџета, па самим тим и укупан број студената на буџету. А може бити и да је укупан број буџетских студената исти, али да се број самофинансирајућих студената повећао. Како би разоткрили узрок, на десној страни цртамо укупан број буџетских и самофинансирајућих студената. Примећујемо да је број буџетских студената доста сличан током година, чак у последњих пар година има више студената на буџету у односу на почетне године. Са друге стране, број студената који се самофинансирају је порастао за више од 20 000 што објашњава пад процента буџетских студената који смо опазили на левом графику.

У наставку ћемо једним примером демонстрирати различите начине да прикажемо упоредне вредности уз помоћ стубичастих дијаграма. Наиме, у табели постоје и подаци о укупном броју студената и студенткиња, па њих можемо из године у годину приказати на 2 дијаграма:

In [21]:
plt.figure(figsize=(10,3))
plt.subplot(1,2,1)
plt.bar(data['Godina upisa/diplome'], data['Ukupno studentkinja'], label='Studentkinje',color='#D6ED17FF')
plt.title('Ukupan broj upisanih studentkinja')

plt.subplot(1,2,2)
plt.bar(data['Godina upisa/diplome'], data['Ukupno studenata']-data['Ukupno studentkinja'], label='Studenti',color='#606060')
plt.title('Ukupan broj upisanih studenata')

plt.show()

Функција bar уколико се другачије не нагласи подешава опсег у осе тако да увек креће од 0, док је максимум такав да и највиши стубић стаје са мало празног простора изнад. Када гледамо само један дијаграм, то нам је углавном у реду, али ако као сада, хоћемо да упоредимо два типа информација, уколико не обратимо пажњу на чињеницу да су распони у оса различити може нам се учинити да не постоји родна разлика.

In [22]:
plt.figure(figsize=(10,3))
plt.subplot(1,2,1)
plt.bar(data['Godina upisa/diplome'], data['Ukupno studentkinja'], label='Studentkinje',color='#D6ED17FF')
plt.title('Ukupan broj upisanih studentkinja')
plt.ylim([0,150000])

plt.subplot(1,2,2)
plt.bar(data['Godina upisa/diplome'], data['Ukupno studenata']-data['Ukupno studentkinja'], label='Studenti',color='#606060')
plt.title('Ukupan broj upisanih studenata')
plt.ylim([0,150000])

plt.show()

Сада већ видимо да постоји родна разлика, међутим ово није оптималан начин представљања података ако је циљ да се истакне разлика која постоји из године у годину. Ови појединачни дијаграми су ок ако је циљ да уочавамо потенцијалне трендове по групама, мада у том случају је боље исте податке сагледати као линијске дијаграме (проверите!).

In [23]:
# место за ваш код

Коначно, погледајмо ове исте податке када се налазе на једном заједничком дијаграму, тако да су позиције стубића смакнуте (не преклапају се) да би поређење било олакшано:

In [24]:
sirina = 0.3
plt.bar(data['Godina upisa/diplome'] - sirina/2, data['Ukupno studentkinja'], sirina, label='Studentkinje',color='#D6ED17FF')
plt.bar(data['Godina upisa/diplome'] + sirina/2, data['Ukupno studenata']-data['Ukupno studentkinja'], sirina, label='Studenti',color='#606060')
plt.show()

Да бисмо ово постигли, функцији bar проследили смо још један опциони аргумент а који се тиче ширине стубића (приметите да су стубићи сада ужи, овај аргумент можете додати и на претходним дијаграмима!). Али само увођење ширине не би померило стубиће лево и десно, то смо урадили мењајући х координате позиција стубића, где смо податке о студенткињама померили у лево у односу на године, а студенте у десно (одузимањем и додавањем половине ширине стубића). Испробајте пар различитих верзија за ширину, али и позиције стубића и додајте имена оса и легенду.

In [ ]:
 

Коначно, додајте овом дијаграму десни дијаграм на коме ће на исти начин бити представљени и упоређени бројеви студената и студенткиња који су дипломирали:

In [25]:
plt.figure(figsize=(10,4))
sirina = 0.3

plt.subplot(1,2,1)
plt.bar(data['Godina upisa/diplome'] - sirina/2, data['Ukupno studentkinja'], sirina, label='Studentkinje',color='#D6ED17FF')
plt.bar(data['Godina upisa/diplome'] + sirina/2, data['Ukupno studenata']-data['Ukupno studentkinja'], sirina, label='Studenti',color='#606060')
plt.legend()

plt.subplot(1,2,2)


plt.show()

Претходне информације можемо сумирати у један дијаграм поредећи процентуалну заступљеност студенткиња међу уписаним и дипломираним студентима:

In [26]:
plt.bar(data['Godina upisa/diplome']-sirina/2,100*data['Ukupno studentkinja']/data['Ukupno studenata'],sirina,color='#D7C49EFF',label='Upisane studentkinje')
plt.bar(data['Godina upisa/diplome']+sirina/2,100*data['Ukupno diplomiranih zene']/data['Ukupno diplomiranih'],sirina,color='#343148FF',label='Diplomirale studentkinje')
plt.axhline(y=50,color='grey')
plt.ylim([0,100])
plt.legend()
plt.show()

Са употребом секторских дијаграма (pie charts) треба бити пажљив (иако су доста доминантни у јавној комуникацији) пре свега зато што људи нису претерано добри у процени и поређењу углова/лукова. Но ако поредите само пар величина или вам је циљ да само демонстрирате да је једна од групација доминантна, питице су изузетне због нашег свакодневног искуства са питама-пицама-тортама :)

Стога ћемо у наставку приказати један део ових података који је погодан за секторски дијаграм, као и кад је секторски дијаграм непогодан и потребно је вратити се стубићима или линијама.

Фокусираћемо се на број дипломираних по различитим степенима факултетског образовања који су дати колонама Диплома I,II,III степен.

In [27]:
plt.figure(figsize=(5,5))
plt.pie(data[data['Godina upisa/diplome']==2017][['Diploma I stepen fakultet','Diploma II stepen fakultet','Diploma III stepen fakultet']].iloc[0],labels=['Diploma I stepen fakultet','Diploma II stepen fakultet','Diploma III stepen fakultet'],colors=['#FC766A','#B0B8B4','#184A45'])
plt.show()

Ако је циљ наше визуализације само да демонстрира да је највише дипломаца 2017 године са дипломом првог степена и то више од пола, док су дипломе другог и трећег степена ређе, ово је идеална визуализација. Међутим, ако очекујемо да се са овог дијаграма оцени у ком су односу дипломци првог и другог степена (дал' је ових првих дупло више од других или тако нешто), то је изузетно тешко на овом дијаграму. Слично, визуализација у наставку је један од лошијих избора, иако често присутна:

In [28]:
plt.figure(figsize=(16,3))
for i in range(5):
    plt.subplot(1,5,i+1)
    plt.pie(data[data['Godina upisa/diplome']==2013+i][['Diploma I stepen fakultet','Diploma II stepen fakultet','Diploma III stepen fakultet']].iloc[0],colors=['#FC766A','#B0B8B4','#184A45'])
    plt.title(str(2013+i)+'. godina')
plt.legend(['I stepen','II stepen','III stepen'],loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()

Опет, ако је циљ само проценити да се нешто десило између 2014 и 2015. године и тачни бројеви и односи међу бројевима нас не занимају, ова илустрација служи сврси. Међутим ако гледамо неке податке упоредно, из године у годину, обично је циљ да проверимо да ли постоје неки трендови а са поређење исечака није јендоставно, стога су у наставку два боља начина да се исти подаци представе стубићима и линијама:

In [29]:
plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
plt.bar(data['Godina upisa/diplome']-sirina,100*data['Diploma I stepen fakultet']/data['Diplomirani studenti fakulteti'],sirina,color='#FC766A', label='I stepen')
plt.bar(data['Godina upisa/diplome'],100*data['Diploma II stepen fakultet']/data['Diplomirani studenti fakulteti'],sirina,color='#B0B8B4', label='II stepen')
plt.bar(data['Godina upisa/diplome']+sirina,100*data['Diploma III stepen fakultet']/data['Diplomirani studenti fakulteti'],sirina,color='#184A45', label='III stepen')
plt.xlabel('Godina')
plt.ylabel('Procenat studenata')
plt.legend()

plt.subplot(1,2,2)
plt.plot(data['Godina upisa/diplome'],100*data['Diploma I stepen fakultet']/data['Diplomirani studenti fakulteti'],'o-',color='#FC766A')
plt.plot(data['Godina upisa/diplome'],100*data['Diploma II stepen fakultet']/data['Diplomirani studenti fakulteti'],'o-',color='#B0B8B4')
plt.plot(data['Godina upisa/diplome'],100*data['Diploma III stepen fakultet']/data['Diplomirani studenti fakulteti'],'o-',color='#184A45')
plt.xlabel('Godina')

plt.savefig('Diplomirani studenti po nivou studija.pdf',format='pdf')
plt.show()

Често ћемо желети да лепе дијаграме које правимо и сачувамо, ван радне свеске, за то нам је од користи функција savefig, видите локални фолдер у њему се сада налази фајл са направљеним дијаграмима.

Неочекивани скок у броју студената који су дипломирали на студијама I степена у 2015. години (испраћен истим наглим падом оних који су дипломирали са II степеном) је последица промене у методологији и дефиницијама I и II степена. Да видимо да ли се укупан број дипломаца мењао, можемо погледати број студената који су дипломирали на студијама првог и другог степена сумарно:

In [30]:
plt.bar(data['Godina upisa/diplome'],data['Diploma I stepen fakultet']+data['Diploma II stepen fakultet'],sirina,color='grey')
#plt.grid(axis='y')
#plt.ylim([32000,38000])
plt.show()

У претходном смо опет пар линија коментарисали, проверите шта оне раде. Понекад, када су сви стубићи високи као на овом графику, и када су њихове међусобне разлике мале у односу на укупну висину, може бити корисно да промените опсег у осе. Али, будите опрезни са скраћивањем у осе, размишљајте о читаоцу ваше визуализације, који неће увек испратити да сте променили опсег што може довести до погрешних интерпретација, видите нпр. овај пример.

Циљ ове радне свеске био је да се упознамо (или подсетимо) са основним типовима визуализација података - линијским, стубичастим и секторским дијаграмима. Све ове визуализације направили смо користећи пајтон и библиотеку matplotlib тако да смо спремни да наставимо са обимнијим сетовима података.

У наставку ћемо се често бавити и већим и неуреднијим сетовима података, где ће први део анализе бити чишћење и издвајању интересантних делова из табеле, тј. конструисање малог сета података који ће затим сличним начинима бити представљан на дијаграмима.

In [ ]:
 
© 2021 Petlja.org Creative Commons License