#U okviru programkog jezika Julia postoji veoma bogat skup funkcija za rad sa statističkim podacima i njihovu
#vizuelizaciju. Osnovi rada za statistiku nalaze se u paketima Statistics i Distrubusions, koje ćemo ovde koristiti.
#Takođe, ovde ćemo koristiti i jedan od najznačajnijih formi za crtanje grafika u programskom jeziku Julia - GR
using Plots, Distributions, Statistics
gr() #komanda sa kojom uvodimo GR
#U okviru paketa Distributions postoje već ugrađene funkcije za generisanje svih poznatih i široko primenljivih
#raspodela
#Prvo ćemo izvršiti generisanje normalne raspodele. Kreiranje objekta tipa Normal vrši se sa: Normal() - normalna raspodela, čiji je prvi argument srednja vrednost
#a drugi argument varijansa naše slučajne promenljive
x = Normal(0,1);
t = -5 : 0.01 : 5;
y = pdf.(x, t); #pošto je prikaz objekta raspodele problematičan za funkciju plot, ona se npr. može vršiti
#estimacijom funkcije gustine verovatnoće tačka po tačka za vrednosti argumenta koje prosledimo
y = convert.(Float32, y);
plot(t,y, title = "Normalna raspodela, m=0, var = 1")
x = Cauchy(0.5, 2);
t = -5 : 0.01 : 5;
y = pdf.(x, t);
plot(t,y, title = "Košijeva raspodela, u=0.5, b = 2")
#U praktičnim situacijama, mnogo češće nećemo imati "savršeno" generisane raspodele, već će podaci sa kojima radimo
#imati neka odstupanja od mogućnosti da njihova funkcija gustine verovatnoće bude savršeno analitički zapisana.
#Zbog toga, potrebno je i uvesti malo drugačiji pristup vizuelizaciji podataka u tom slučaju:
#Na primer:
x = randn(1000); #generišimo slučajnu promenljivu koja je Normalnog tipa - ona ima neku svoju srednju vrednost i
#varijansu (podrazumevanu) koje ne znamo - ali to nas ne sprečava da iscrtamo njenu
#funkciju gustine verovatnoće (do na faktor skaliranja)- to postižemo uz pomoć funkcije histogram()
#kao prvi argument prosleđujemo vektor koji sadrži odbirke naše slučajne promenljive, a kao
#drugi argument prosleđujemo broj korpica za čije intervale ćemo koliko su vrednosti iz tog intervala
#zastupljene
histogram(x, bins = 40)
#Povećavanjem broja ovih korpica, dobićemo sve finiju i finiju raspodelu, te za broj korpica koji teži beskonačnosti
#naš histogram praktično teži funkciji gustine verovatnoće
histogram(x, bins = 100)
histogram(x, bins = 200) #još finiji prikaz histograma
#Faktor skaliranja koji nam je potreban da bi naš histogram vršio aproksimaciju funkcije gustine verovatnoće
#jeste 1/N, gde je N ukupan broj odbiraka naše slučajne promenljive
#U slučaju kada imamo dvodimenzionalni slučajni vektor, a želkimo da vidimo kakvu raspodelu on ima - koristimo
#ugrađenu funkciju histogram2d
x = rand(2, 1000); #geerišemo slučajni vektor čije su promenljive normalno raspodeljenje
#Kako možemo dobiti njegovu združenu funkciju gustine verovatnoće?
#kao prvi argument prosleđujemo naš slučajni vektor - njegove komponente ponaosob
#a kao preostale argumente prosleđujemo broj korpica po jednoj promenljivoj, i po drugoj itd.
#ovde konkretno, ako prosledimo samo jedan broj, onda će se raditi podela po obe ose u taj
#broj korpica
histogram2d(x[1,:], x[2,:], nbins = 10)
#Faktor skaliranja koji nam je potreban da bi naš histogram vršio aproksimaciju funkcije gustine verovatnoće
#jeste, slično kao i kod jednodimenzionog slučaja, 1/N, gde je N ukupan broj odbiraka našeg slučajnog vektora
#Konačno, za kraj, navešćemo još jednu vizuelizaciju za statističke podatke (koju smo već pominjali), u slučaju kada imamo višedimenzione
#slučajne promenljive - korelaciona matrica
x = randn(7,200); #generišimo sedmodimenzioni slučajni vektor - pošto je vizuelizacija njegove združene funkcije
#gustine verovatnoće jako teška zbog svoje veće dimenzionalnosti, u tu svrhu se on opisuje svojim vektorom
#matematičkog očekivanja i momentima višeg reda,pa korelacionom matricom, koja
#nam daje informacije o korelisanosti među koordinatama ovog vektora
x = x'; #potrebno je izvršiti transponovanje matrice
R = cor(x);
#U velikom broju situacija nam je od praktičnog značaja da imamo uvid o korelisanosti između slučajnih promenljivih,
#a u praktičnim situacijama se najčešće koristi iscrtavanje ovih zavoisnosti preko heatmap-a:
heatmap(R, c=:thermal)