# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # Analiza serij na spletnem portalu [MAL](https://myanimelist.net/topanime.php)
# Projektna naloga pri predmetu Programiranje 1
#
# ## 0. Priprava podatkov
#
# Preden začnemo, moramo uvoziti vnaprej pripravljene podatke. V ta namen uporabimo knjižnico pandas in vnesemo podatke v tabele.

# +
import pandas as pd
import os

# izberemo interaktivni stil risanja
# %matplotlib inline

# spremenimo velikost figur
import matplotlib as plt
plt.rcParams['figure.figsize'] = (10, 5)

pd.set_option('display.max_rows', 20)

# naložimo razpredelnice, s katero bomo delali
pot_do_serij = os.path.join('data', 'serije.csv')
pot_do_licensorjev = os.path.join('data', 'licensorji.csv')
pot_do_producerjev = os.path.join('data', 'producerji.csv')
pot_do_studijev = os.path.join('data', 'studiji.csv')
pot_do_zanrov = os.path.join('data', 'žanri.csv')


serije = pd.read_csv(pot_do_serij)
licensorji = pd.read_csv(pot_do_licensorjev)
producerji = pd.read_csv(pot_do_producerjev)
studiji = pd.read_csv(pot_do_studijev)
zanri = pd.read_csv(pot_do_zanrov)
# -

# Tukaj še malo očisitmo podatke, saj nam manjkajoča polja pri popularnosti in število glasov gredo samo v napoto.

serije = serije[
        serije.popularity.notnull() &  serije.votes.notnull()
    ].astype(
        {'popularity': 'int64', 'votes': 'int64'}
    ).sort_values('popularity')


# Nato razcepimo čas premiere na leto in sezono, saj bo z razcepljenima podatkoma kasnejša obravnava lažja. Poleg tega bomo tudi kasneje obravnavali vsakega izmed njiju posebej.

# +
def add_season_year(df, premiered_series):
    def get_year(s):
        if type(s) == str:
            return int(s.split()[1])
        else:
            return float('NaN')
    
    def get_season(s):
        if type(s) == str:
            return s.split()[0]
        else:
            return float('NaN')
        
    leta = premiered_series.apply(get_year)
    sezone = premiered_series.apply(get_season)
    
    df['leto'] = leta
    df['sezona'] = sezone


add_season_year(serije, serije.premiered)
# -

# Sedaj si oglejmo, katere podatke smo zajeli. Začnimo z glavno tabelo, tabelo serij.
# Kot vidimo, so zajeta naslednja polja:
# * naslov
# * vrsta serije
# * število epizod
# * status predvajanja
# * čas premiere
# * vir originalnega materiala
# * trajanje posamezne epizode
# * primernost vsebine
# * ocena uporabnikov
# * število glasov
# * popularnost glede na število uporabnikov, ki so si serijo ogledali
# * leto izdaje
# * sezona izdaje

serije

# V tabeli licensorjev so seveda shranjeni licensorji. To so podjetja, ki jim pripadajo pravice do serij. Niso pa to nujno podjetja, ki so proizvedle serijo, ampak jo samo izdajajo. Torej so nekako kot izdajatelji, ki naročajo avtorjem, kaj želijo imeti narejeno.

licensorji

# Producerji imajo nadzor nad kreacijo serije. Odločajo se, kateri studio bo naredil animacije, katere glasovne igralce bodo pozvali k igranju, katere dele originalnega materiala bodo uporabili. Torej imajo v nadzoru širšo sliko proizvodnje.

producerji

# Studiji so odgovorni za samo animacijo in proizvodnjo epizod kot celote. Čeprav so bolj proti dnu same hierarhije, imajo ravno oni največji vpliv na izgled serije, saj so odgovorni za vizualni del.

studiji

# Na koncu pa imamo še tabelo žanrov, kjer je za vsako serijo shranjen širši žanr, v katerega spada.

zanri

# ## 1. Vpliv posamičnih elementov na popularnost in oceno
#
# ### 1.1 Čas premiere
#
# Standardni časi premier so razdeljeni na 4 letne čase. V navadi je namreč, da se leto razdeli na 4 časovna obdobja po 12 tednov in v vsakem tednu izide nova epizoda. Zaradi tega so popularne 12 in 24 epizod dolge serije in studiji so primorani se močno držati teh rokov. V nasprotnem primeru se morajo višji v hierarhiji odločiti ali končati serijo na slabem mestu, ali pa zakupiti mesto za predajanje v naslednji sezoni.

serije.groupby('sezona').mean()[['score', 'votes', 'popularity']]

# Opazimo, da je poletni čas rahla anomalija glede tako na popularnost, kot na število glasov. Pričakovali bi, da med sezonami ne bi bilo velikih razlik, saj lahko dobre serije izidejo kadarkoli. Najverjetneje gre za dejstvo, da imajo ljudje med poletjem preprosto več prostega časa. Tu še posebej pride do izraza razporeditev populacije glede na starost. Namreč otroci in najstniki ne samo da imajo poleti čas zaradi počitnic, ampak so tudi največji delež populacije, ki uporablja internet. Kombinacija teh dveh dejstev pripomore, da je poleti največ aktivnosti.

serije.groupby('sezona').mean().sort_values('popularity').plot.bar(y='popularity')

serije.groupby('sezona').mean().sort_values('votes', ascending=False).plot.bar(y='votes')

# Dejstvo, da so ocene serij bolj ali manj enake ne glede na čas premiere, toliko bolj potrdi domnevo, da gre pri povišani aktivnosti preko poletja res za večjo mero prostega časa pri uporabnikih. Namreč ni opazne razlike v kvaliteti serij, ki bi konstanto spodbujevale pogovore, slabe ali dobre.

serije.groupby('sezona').mean().sort_values('score', ascending=False).plot.bar(y='score')

# Nato si poglejmo še leto premiere. Pričakovano je, da se bo z leti popularnost zmanjševala zaradi naslednjih razlogov:
# * novejša tehnologijo omogoča več kreativnosti in bolj osupljive možnosti animacije
# * dostop do starih serij je veliko težji
# * oboževalci starih serij so starejši in zato v delu populacije, ki interneta ne uporablja toliko kot mlajši

serije.groupby('leto').mean()

# In res, novejše serije so bolj popularne od starejših. Zanimiv pa je padec popularnosti v zadnjih desetih letih. En možen faktor je, da je pri malo starejših serijah poteklo že dovolj časa, da si jo lahko uporabniki ogledajo. Pri novejših serijah, predvsem s povečanjem popularnosti ogleda preko interneta, ni dovolj časa za ogled vseh novo izdanih serij.

serije.groupby('leto').mean().plot(y='popularity')

# Drug prispevajoč faktor je morda padec kvalitete v primerjavi z malo starejšimi serijami. Opazimo lahko višje ocene za serije v okolici leta 2010 v primerjavi s tistimi okoli leta 2000 in sedajšnimi. Z rastočo priljubljenostjo tega vira zabave, se povečuje število izdanih serij. Precej verjetno je, da je kvaliteta objektivno slabša zaradi večjega pritiska na studije, da proizvedejo čim več serij.

serije.groupby('leto').mean().plot(y='score')

# ## 1.2 Vir originalnega materiala
#
# Velik del serij je animacija predhodnega materiala. Prednost je predvsem v tem, da je za originalne serije potrebno precej več vloženega časa, truda, planiranja, in kljub temu je možnost uspeha morda celo manjša. Namreč originalni material ima že privržence, ki so navdušeni nad pridobitvijo novega materiala v franšizi.
#
# Zato so dobljeni podatki smiselni. Popularnost iger, manga serij in "lahkih novel" je na splošno veliko večja od knjig, radia in glasbenih del. In animirane serije to toliko bolj potrdijo, saj obstaja veliko večje zanimanje za popularne franšize.

serije.groupby('source').mean()

serije.groupby('source').mean().sort_values('popularity').plot.bar(y='popularity')

# Ocene uporabnikov se tudi dokaj približno držijo popularnosti. Čeprav bi lahko prišlo do manjše kvalitete, saj bo serija uspešna že po zaslugi uspešnosti predhodnega materiala, se za res popularne franšize borijo res največja podjetja. In slaba adaptacija jim morda res ne uniči posla, vendar pa jim zagotovo prinese slab ugled s strani gledalcev serij. Poleg tega si lahko privoščijo bolj ambiciozne adaptacije, z boljšo glasbeno spremljavo, z boljšimi glasovni igralci in vse to skupaj privede v povprečju do večje kvalitete popularnih serij.

serije.groupby('source').mean().sort_values('score', ascending=False).plot.bar(y='score')

# ## 1.3 Čas trajanja epizode
#
# Industrijski standard so postale približno 20-minutne epizode. Ta dolžina omogoča novo epizodo tedensko in ohrani določen nivo kvalitete. Zato je pričakovana večja popularnost pri 20-minutni dolžini epizode. 
#
# Za druge dolžine epizod so odgovorne adaptacije drugih materialov, na primer par-minutni videospoti, eno-epizodne serije, kjer je njihova dolžina pač takšna, kot je. Za najdaljše dolžine epizod so odgovorni filmi. Za njihovo produkcijo gredo veliki stroški, je pa zato pričakovana visoka kvaliteta.

serije.groupby('duration').mean()

# In res, opazimo višjo popularnost pri tam 25-minutni dolžini trajanja, saj je to trenutni standard. Višja popularnost je tudi pri enourni dolžini, kjer se nahajajo kratki filmi in filmi, razdrobljeni na več enournih delov. Trend tudi kaže na večjo popularnost preko enournih epizod. Gre namreč za daljše filme, ki jih je dovolj malo, da imajo ljudje dovolj časa za ogled vseh. Ni tiste nasičenosti, kjer bi izhajalo po deset filmov na sezono, in so zato dovolj redki, da si ljudje vzamejo čas za njihov ogled kjub navalu vseh možnih serij.

serije.groupby('duration').mean().plot(y='popularity')

# Predvsem pri oceni uporabnikov se opazi precej višja kvaliteta pri daljših epizodah, kar je smiselno.

serije.groupby('duration').mean().plot(y='score')

# ## 1.4 Primernost vsebine
#
# Primernost vsebine nakazuje katerih tem se serija dotika. Razporeditev tukaj bo bolj nakazovala porazdelitev gledajoče populacije in manj vpliv same primernosti.

serije.groupby('rating').mean()

# Opazimo precejšno razliko med popularnostjo vsebin, ciljane na najstnike in mlade odrasle, ter ali povsem odraslimi vsebinami ali pa otroškimi vsebinami. Tu res pride do izraza, kdo gleda katere serije. Največji delež gledalcev je ravno moških in to najstnikov in mladih odraslih. Zato je smiselno, da se izdaja popularne serije, ki ciljajo na ta del demografike.

serije.groupby('rating').mean().sort_values('popularity').plot.bar(y='popularity')

# V primerjavi s popularnostjo, pri ocenah ni tako velike razlike. Tukaj so celo dobro ocenjene manj popularne, otroške vsebine, medtem ko *R+ - Mild Nudity* pade skoraj na dno.

serije.groupby('rating').mean().sort_values('score', ascending=False).plot.bar(y='score')

# ## 1.5 Ocena serije
#
# Ocena serije je povezana s popularnostjo v tem smislu, da naj bi kvaliteta serije pripomogla k njeni popularnosti. Seveda naj bi bile izjeme, kjer dobro ocenjena serija ni popularna in kjer popularne serije niso najbolje ocenjene.

serije.groupby('score').mean()

# Opazimo, da je precej več primerov, kjer je serija popularna z nižjo oceno. To se lahko pripeti pri slabih adaptacijah v popularni franšizi. Druga možnost pa je serija, ki je na nek način stereotipična verzija trenutnega stanja. Torej vsebuje standardne tipe likov, vsebuje dostikrat uporabljeno verzijo oblike zgodbe. Take serija bo popularna, vendar pa bo slabo ocenjena, saj se ocenjevanja serij poslužijo bolj zainteresirani uporabniki, ki so morda že naveličani klišejev.

serije.plot.scatter(x='score', y='popularity')

# ## 1.6 Število glasov
#
# Pričakovali bi, da se število glasov tesno ujema s popularnostjo. Morda so kakšne izjeme, kjer malo ljudi glasuje za dokaj priljubljeno serijo, vendar jih ne bi smelo biti veliko.

serije.groupby('votes').mean()

# In res, boljšega prileganja se skoraj ne da dobiti. Opazimo kakšno izjemo popularne serije z malo glasovi. Lahko so to serije, ki so izšle pred kratkim in si še ni veliko ljudi ustvarilo takšnega mnenja, da bi lahko serijo ocenili. Morda pa gre za starejše popularne serije, kjer se ljudem ne zdi več potrebno podajajti svojega mnenja, saj so že tako dobro vgrajene v kulturo.

serije.plot.scatter(x='votes', y='popularity')

# Pri vplivu na oceno pa pride do večje raznolikosti. Slabo ocenjene serije so bile bolj redko ocenjene od dobrih. Ocen, slabših od 5 sploh ni za manj kot 20.000 glasov. Pri višjem številu glasov pa je precej raznolikosti. Skupaj s prejšnim grafom sklepamo, da gre za najbolj popularne serije, kjer pa vemo, da imajo njihove ocene zmerna nihanja.

serije.plot.scatter(x='votes', y='score')

# ## 1.7 Vpletena podjetja
#
# Podjetja imajo določeno percepcijo v očeh gledalcev. Že znano ime studija lahko prinese val zanimanja za serijo preden je sploh narejena. Prav tako pa lahko slab ugled prinese slabe ocene jeznih gledalcev, ki so po njihovem mnenju bili prikrajšani dobre dolgo pričakovane adaptacije.
#
# Tukaj je tudi pomembno, da so nekatera podjetja vpletena v veliko večih serijah, kot ostala. Zato imajo dostikrat nižjo popularnost in nižjo oceno serij, saj jih izdajo toliko, da ne morejo biti vse dobre. Po drugi strani pa ravno njim pripadejo adaptacije najbolj popularnih serij iz drugih medijev.

# Če si najprej pogledamo deset najbolj popularnih licensorjev. Recimo za *<NAME>. Pictures*, *DreamWorks* in *Walt Disney Studios* opazimo dolgo povprečno dolžino epizod. Torej so prevzeli nase več filmov, ki so v povprečju bolje ocenjeni. Na vrhu so torej zato, ker so bili vpleteni v proizvodnji popularnih filmov.
#
# Za večino teh podjetij je tudi res, da niso bila vpletena v veliko serijah, torej so na vrhu le zaradi dveh, treh uspešnic in niso bili vpleteni v ostalih.

serije_z_licensorji = pd.merge(serije, licensorji)
serije_z_licensorji.groupby('licensor').mean().sort_values('popularity')[:10]

# Pri ocenah se mad najboljših deset pojavijo tudi nekateri najbolj popularni licensorji. Ponovno, tu so zaradi izdaje malega števila uspešnic in niso vpleteni v regularni proizvodnji serij.

serije_z_licensorji.groupby('licensor').mean().sort_values('score', ascending=False)[:10]

# Čeprav imajo producerji velik vpliv na končen izdelek, pade večina percepcije na studije, ki so opravili animacije. Zato menimo, da nimajo direktnega vpliva na popularnost in ocene, temveč njihova razporeditev samo refleksira popularnost serij.

serije_s_producerji = pd.merge(serije, producerji)
serije_s_producerji.groupby('producer').mean().sort_values('popularity')[:10]

serije_s_producerji.groupby('producer').mean().sort_values('score', ascending=False)[:10]

# Kot smo že omenili, studiji imajo velik vpliv na popularnost serij. Vsak studio ima svoj stil animacije in svojo končni izgled. Spet, tukaj prevladajo studiji z malim številom relativno uspešnih serij. Čeprav veliki studiji izdelajo najbolj popularne serije, jih izdelajo veliko vsako sezono, sicer ni smiselno imeti toliko zaposlenih. In to jim znižuje povprečje.

serije_s_studiji = pd.merge(serije, studiji)
serije_s_studiji.groupby('studio').mean().sort_values('popularity')[:10]

serije_s_studiji.groupby('studio').mean().sort_values('score', ascending=False)[:10]

# ## 1.7 Žanr serije
#
# Žanr serije je povezan s popularnostjo v tem smislu, da različne dele populacije zanimajo različne stvari. Torej med popularnimi žanri pričakujemo teme, ki so blizu najstnikom in mlajšim odraslim.
#
# Je pa tukaj tudi možno, da bodo na vrhu bolj specializirani in usmerjeni žanri, saj bo adaptiran le dober originalni material, medtem ko za žanre, kjer bi pričakovali širše zanimanje, jim bodo popularnost zniževalo veliko število sprejemljivih, a ne odličnih serij.

# Do neke mere se to res opazi. Akcijske serije, komedije, fantazije npr. niso proti vrhu. Tam so psihološke, vampirske serije, trilerji. Se pa najdejo na vrhu tudi haremske in shojo serije. (namenjene najstnicam, tj. romantične in emocionalne vsebine)
#
# <NAME> so proti dnu. Različne avtomobilske, športne, znanstveno-fantastične serije niso priljubljene na Japonskem in zato ni dobrega originalnega materiala, po katerem bi bilo veliko izvedenih priljubljenih serij.

serije_z_zanri = pd.merge(serije, zanri)
serije_z_zanri.groupby('genre').mean().sort_values('popularity').plot.bar(y='popularity')

serije_z_zanri.groupby('genre').mean().sort_values('score', ascending=False).plot.bar(y='score')

StarcoderdataJupyterScriptsDedupFiltered