<jupyter_start><jupyter_text>OBDELAVA PODATKOV O EVROVIZIJI  Kazalo1. [Uvod](uvod)2. [Analiza uspeha držav od leta 1994](uspeh)3. [Povezava uspeha in bdp](bdp)4. [Povezava podeljenih točk in geografske bližine](meje)5. [Povzetek](povzetek)  Uvod Sem <NAME>, študent 2. letnika matematike na FMF. Pri Programiranju 1 sem za projektno nalogo izbral obdelavo podatkov o Evroviziji.Pred začetkom sem si pripravil 3 vprašanja, ki jih bom raziskoval:* So bile katere države nadpovprečno / podpovprečno uspešne, ali vse približno enako?* Obstaja povezava med uspehom države in njeno gospodarsko razvitostjo?* Obstaja povezava med številom podeljenih točk med dvema državama in njuno geografkso bližino?Pa začnimo. Na začetku uvozim potrebne knjižice in svoje podatke.<jupyter_code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os.path
import pylab as py 
import statsmodels.api as sm
import scipy
import seaborn
import scipy.optimize as opt

pd.options.display.max_rows = 10
%matplotlib inline

bdp = pd.read_csv(os.path.join('podatki', 'bdp.csv'))
meje = pd.read_csv(os.path.join('podatki', 'meje.csv'))
glasovi = pd.read_csv(os.path.join('podatki', 'esc.csv'), sep=';')
uvrstitve = pd.read_csv(os.path.join('podatki', 'uvrstitve.csv'))<jupyter_output><empty_output><jupyter_text>Najprej bom uredil tabelo glasovi, da pomečem proč nepomembne stolpce in preimenujem indekse ter države.<jupyter_code>glasovi = glasovi.drop(columns=['Edition', '(semi-) final', 'Jury or Televoting'])
glasovi = glasovi.rename(columns={'Year': 'leto', 'From country': 'od države', 'To country': 'državi', 'Points      ' : 'točke', 'Duplicate': 'podvojeno'})
glasovi = glasovi[glasovi['podvojeno'] != 'x'].drop(columns='podvojeno')
glasovi.replace(to_replace=['The Netherands'], value='The Netherlands', inplace=True) # to napako sem opazil že v pridobitvi podatkov
glasovi.replace(to_replace=['North Macedonia'], value='Macedonia', inplace=True)
glasovi.replace(to_replace=['F.Y.R. Macedonia'], value='Macedonia', inplace=True)<jupyter_output><empty_output><jupyter_text>Zdaj imam vse tabele pripravljene. Analiza uspeha držav od leta 1994 Zanimalo me bo, če so bile vse države približno enako uspešne, če obstaja kakšen vzorec, kako se je odrezala Slovenija,...Za ta del imam pripravljeno tabelo uvrstitve:<jupyter_code>uvrstitve<jupyter_output><empty_output><jupyter_text>Ustvaril bom novo tabelo s povprečnimi točkami posameznih držav in jo predstavil grafično.<jupyter_code>uvrstitve_po_državah = uvrstitve.drop(columns='leto').groupby('država').mean()
točke = uvrstitve_po_državah['točke'].to_numpy()

plt.hist(točke)
plt.title('razporeditev povprečnih točk')
plt.xlabel('povprečne točke od leta 1994 naprej za posamezno državo')
plt.ylabel('število držav')
plt.show()<jupyter_output><empty_output><jupyter_text>Največ držav doseže povprečno okoli 50 točk. Histogram spominja na normalno porazdelitev. Narišmo najbolje prilegajočo se krivuljo.<jupyter_code>_, bins, _ = plt.hist(točke, density=1)
mu, sigma = scipy.stats.norm.fit(točke)
best_fit_line = scipy.stats.norm.pdf(bins, mu, sigma)
plt.plot(bins, best_fit_line)
plt.title('razporeditev povprečnih točk')
plt.xlabel('točke')<jupyter_output><empty_output><jupyter_text>Normalno porazdelitev bom podrobneje testiral na dva načina:1.  Q-Q test<jupyter_code>qqplot = sm.qqplot(točke, line='45', fit=True)<jupyter_output><empty_output><jupyter_text>Če bi podatki bili normalno porazdeljeni, bi se prilegali rdeči črti. Videti je, da najbolj odstopajo skrajno levo in desno. To pomeni, da je mojih podatkov več v ekstremnih vrednostih, kot bi jih bilo, če bi bila distribucija normalna.2.  Shapiro–Wilk test<jupyter_code>shapiro_test = scipy.stats.shapiro(točke)
p = shapiro_test.pvalue
print(p)<jupyter_output>0.002811499172821641<jupyter_text>Majhno odstopanje od normalne porazdelitve pomeni veliko verjetnostno vrednost ali p-vrednost.Veliko odstopanje ima tako nizko p-vrednost.Če je p manjše od 0,05, ne verjamemo, da gre za normalno zarporeditev.Za naše podatke velja `p = 0.002811499172821641`. Poglejmo še, kako se je odrezala Slovenija.<jupyter_code>slo = uvrstitve_po_državah.loc['Slovenia']
print('Slovenija je povprečno dosegla ' + f'{round(float(slo), 2)}' + ' točk. To je podpovprečno.')

print('Najbolj uspešne države:')
uvrstitve_po_državah.sort_values('točke').tail()<jupyter_output>Slovenija je povprečno dosegla 26.29 točk. To je podpovprečno.
Najbolj uspešne države:<jupyter_text>Povezava uspeha in bdp Poleg tabele uvrstitve imam pripravljeno še eno, kjer je za vsako leto in državo podan njen bdp tisto leto.<jupyter_code>bdp<jupyter_output><empty_output><jupyter_text>Naj opomnim, da je bil za nekatere države v mojem viru podan za vsako leto isti bdp, za nakatere pa ne.Najprej bom narisal graf doseženih točk v odvisnosti od bdp. Vsaka pika predstavlja povprečje točk, ki so jih dosegle države, ki so poljubno leto imele določen bdp.<jupyter_code>bdp_in_uvrstitve = pd.merge(bdp, uvrstitve).drop(columns='leto')
povprečja_točk_po_bdp = bdp_in_uvrstitve.groupby('bdp', as_index=False).mean()
povprečja_točk_po_bdp.plot.scatter(x = 'bdp', y = 'točke').set_xscale('log')<jupyter_output><empty_output><jupyter_text>Iz točk si težko predstavljamo korelacijo, zato poskušajmo podatke aproksimirati s polinomi.<jupyter_code>def linearni_polinom(x, a, b):
    return a * x + b

def prilegajoč_se_polinom(polinom):
    koeficienti, _ = opt.curve_fit(polinom, povprečja_točk_po_bdp['bdp'], povprečja_točk_po_bdp['točke'])
    polinom = polinom(povprečja_točk_po_bdp['bdp'], *koeficienti)
    
    fig, ax = plt.subplots(1, 1, figsize=(7, 4))
    ax.plot(povprečja_točk_po_bdp['bdp'], povprečja_točk_po_bdp['točke'], 'o')
    ax.plot(povprečja_točk_po_bdp['bdp'], polinom)

    ax.set_xscale('log')
    ax.set_xlabel('bdp')
    ax.set_ylabel('točke')
    ax.set_title('odvisnost uspeha držav od gospodarske razvitosti')
    
prilegajoč_se_polinom(linearni_polinom)<jupyter_output><empty_output><jupyter_text>Zdi se, da velja, da so razvitejše države uspešnejše. Aproksimirajmo namesto z linearnim polinomom še s polinomom višje stopnje.<jupyter_code>def polinom_visje_stopnje(x, a, b, c, d, e, f):
    return a * x ** 5 + b * x ** 4 + c * x ** 3 + d * x ** 2 + e * x + f

prilegajoč_se_polinom(polinom_visje_stopnje)<jupyter_output><empty_output><jupyter_text>Krivulja je načeloma naraščujoča. Izpostavil bi desni del, kjer pade. Poglejmo, zaradi katerih držav se to zgodi (to so tiste z največjim bdp).<jupyter_code>države = bdp_in_uvrstitve.groupby('država').mean()
države_ki_kvarijo_krivuljo = države[države.bdp > 9 ** 6]
države_ki_kvarijo_krivuljo<jupyter_output><empty_output><jupyter_text>Vidimo, da so te države Francija, Nemčija in <NAME>. Zanimivo, da se te države izkažejo nesorazmerno svoji gospodarski moči (če bi bila korelacija linearna), čeprav imajo od leta 2000 naprej avtomatsko vstopnico v finale.Poglejmo si še, katere druge države najbolj odstopajo od linearne aproksimacije.<jupyter_code>države['razmerje'] = države.točke / države.bdp
povprečno_razmerje = države.razmerje.mean()

države['odstopanje'] = države.razmerje - povprečno_razmerje
države.sort_values('odstopanje')<jupyter_output><empty_output><jupyter_text>K tem podatkom bi dodal le še opombo, da sta Andora in Monako le nekajkrat sodelovala in nikoli prišla v finale. Po drugi strani je zanimivo, da so najuspešnejše države po tem kriteriju ravno Kavkaške države.  Povezava podeljenih točk in geografske bližine  Za ta del imam tabelo s podrobnimi glasovi od leta 1975 naprej.<jupyter_code>glasovi<jupyter_output><empty_output><jupyter_text>Za pregled deljenja točk bom ustvaril matriko, ki bo prikazovala, povprečno koliko točk je posamezna država dala drugim.<jupyter_code>države = set(glasovi['od države'].tolist())
matrika = pd.DataFrame(index=države, columns=države)
for državi in države:
    točke = glasovi.query('državi == @državi').groupby('od države')['točke'].aggregate([np.mean])['mean']
    matrika[državi] = round(točke)  
    if državi in države:
        matrika.loc[državi, državi] = float('NaN')
matrika<jupyter_output><empty_output><jupyter_text>Matriko še vizualno uredim:<jupyter_code>plt.figure(figsize=(25,15))
heatmap = seaborn.heatmap(matrika, annot=True, fmt='g', cmap='YlOrBr', linewidth=1)
heatmap.set_title('porazdelitev točk\n', fontsize=22)
heatmap.tick_params(axis='x', labelrotation=90, labelsize=13)
heatmap.set_xlabel('države, ki prejmejo točke', fontsize=16)
heatmap.tick_params(axis='y')
heatmap.set_ylabel('države, ki dajo točke', fontsize=16)
heatmap<jupyter_output><empty_output><jupyter_text>Vidimo, da res izstopajo nekatere sosednje države:* <NAME> in Albanija* Romunija in Moldavija* Grčija in Ciper* Andora in ŠpanijaOpozoril bi, da so Maroko, Luksemburg in Jugoslavija le nekajkrat sodelovali na Evroviziji oziroma so sodelovali že nekaj desetletji nazaj, ko še ni sodelovalo dosti držav. Zato imajo z malo državami podeljene točke.Po drugi strani pa je Srbija skupaj s Črno Goro sodelovala le dvakrat in zmeraj zelo uspešno, zato ima nadpovprečno dosti prejetih točk.Zato bom te tri države odstranil iz matrike.<jupyter_code>matrika = matrika.drop(columns=['Morocco', 'Serbia & Montenegro', 'Yugoslavia', 'Luxembourg']) \
                 .drop(['Morocco', 'Serbia & Montenegro', 'Yugoslavia', 'Luxembourg'])<jupyter_output><empty_output><jupyter_text>Poglejmo najbolj izstopajoče pare. To so države, ki so dale veliko točk specifično neki drugi državi.<jupyter_code>pari = matrika.stack().to_frame('točke')
pari = pari.sort_values(by='točke', ascending=False).head(25)
pari.reset_index(inplace=True)
pari = pari.rename(columns={'level_0': 'od države', 'level_1': 'državi'})
pari<jupyter_output><empty_output><jupyter_text>Vidimo, da je večina parov tudi sosedov. Poglejmo, kolikšen delež prvih 25 parov je sosedov.Pripravil sem že tabelo z mejami:<jupyter_code>meje<jupyter_output><empty_output><jupyter_text>K parom dodajmo še stolpec, ki preveri, ali sta državi sosedi.<jupyter_code>pari = pari.merge(meje, left_on='od države', right_on='država')
pari['sosedi'] = pari.meja == pari.državi
pari = pari.drop(columns=['meja', 'država'])
pari = pari.sort_values('sosedi').drop_duplicates(subset=['od države', 'državi'], keep='last')
pari = pari.sort_values('točke', ascending=False)

n = len(pari[pari['sosedi']])
print(f'Od prvih 25 najboljših prijateljev je {n} sosedov.')

pari<jupyter_output>Od prvih 25 najboljših prijateljev je 18 sosedov.<jupyter_text>Torej je večina najboljših prijateljev sosedov. Poglejmo še prijatelje, ki niso sosedi.<jupyter_code>pari[pari['sosedi'] == False]<jupyter_output><empty_output><jupyter_text>Vse te države so si geografsko blizu. Poleg tega bi med njimi lahko potegnili kakšne vzporednice glede zgodovine, kulture ali vere. Za konec še poglejmo, kdo so naši prijatelji. Ustvaril bom dve tabeli, prva bo prikazala države, ki nam dajejo veliko točk, druga pa države, katerim mi podelimo veliko točk.<jupyter_code>prijatelji1 = glasovi[glasovi['državi'] == 'Slovenia'].groupby('od države')['točke'] \
        .aggregate([sum]) \
        .sort_values('sum', ascending=False) \
        .rename(columns={'sum': 'vsota točk'})
prijatelji1.head()
prijatelji2 = glasovi[glasovi['od države'] == 'Slovenia'].groupby('državi')['točke'] \
        .aggregate([sum]) \
        .sort_values('sum', ascending=False) \
        .rename(columns={'sum': 'vsota točk'})
prijatelji2.head()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11064499213424227, 'fraction_numerical': 0.010837266212200665, 'mean_word_length': 6.57313037723362, 'pattern_counts': {'":': 0, '<': 93, '<?xml version=': 0, '>': 94, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '23', 'dir': 'jupyter-structured-clean-dedup', 'id': '116941', 'license': 'MIT', 'n_tokens_mistral': 5035, 'n_tokens_neox': 4934, 'n_words': 1049, 'path': 'obdelava_podatkov.ipynb', 'repo_name': 'lukasimcic/Evrovizija-obdelava-podatkov', 'size': '11469'}