spelapovrzenic / APPR-2014-15

Repozitorij z gradivi za predmet Analiza podatkov s programom R v študijskem letu 2014/15
MIT License
0 stars 0 forks source link

težava #12

Closed spelapovrzenic closed 9 years ago

spelapovrzenic commented 9 years ago

Pozdravljeni, zanima me samo, kaj narobe delam, da mi ne pokaže nakoncu še linearne premice? graf mi lepo izriše, potem pa mi linearno sploh noče. Hvala in lp

t <- apply(porecja, 1, c)
donava <- t[,2]
skupaj <- t[,1]
plot(donava, skupaj, xlab="Povodje Donave",ylab="Slovenija - skupaj")
linearna <- lm(donava~skupaj)
abline(linearna, col="blue")
jaanos commented 9 years ago

Če hočeš napovedovati skupno dobavo iz podatkov za Donavo, bo treba obrniti spremenljivki pri gradnji modela:

linearna <- lm(skupaj~donava)
spelapovrzenic commented 9 years ago

najlepša hvala! Pa še to, nekako mi ne uspe ta graf urediti on najmanjšega do največjega, ne da bi se mi tudi imena pravilno spremenila. Bi prosila za pomoč, hvala.


na.vrstice2 <- is.na(euro[,6])
barplot(euro[!na.vrstice2,6], ylab = "milijon m3", las = 2,
        main="Preskrba z vodo v evropskih državah, leto 2005",
        names.arg = rownames(euro[!na.vrstice2,]), cex.names = 0.5,
        col = heat.colors(sum(!na.vrstice2)))
spelapovrzenic commented 9 years ago

ter še ena težavica oz pomoč. namreč v 4 fazi sem se odločila da bi na podlagi nove uvožene tabele "world" (v kateri so podatki za celoten svet -> 1.problem: iz te tabele bi odstarnila vse ne evropske države, da bi potem imela samo tabelo z evropskimi), potem pa bi nekako pogledala/predvidevala kaj se bi dogajalo z porabo v prihodnosti v posameznih državah, lahko tudi za celotno europo. nakoncu, da bi bili rezultati bolj primerljivi, pa bi lahko tudi delila z številom prebivalcev ki je v tabeli "prebivalci"(v tej tabeli so že predvideni podatki za št. prebivalcev do leta 2050). Nakoncu pa nevem ali bi naredila zemlejvid ali tudi kakšen graf? hvala za vsak nasvet, saj trenutno še ne vem kako bi vse te ideje zbrala v lepo analizo. Lp

jaanos commented 9 years ago

Nekaj takega bi šlo:

na.vrstice2 <- is.na(euro[,6])
preskrba <- (euro[!na.vrstice2,])[6]
o <- order(preskrba, decreasing = TRUE)
barplot(preskrba[o,], ylab = "milijon m3", las = 2,
        main="Preskrba z vodo v evropskih državah, leto 2005",
        names.arg = rownames(preskrba)[o], cex.names = 0.5,
        col = heat.colors(sum(!na.vrstice2)))

Če želiš iz razpredelnice world dobiti samo evropske države, si lahko pomagaš z zemljevidom EU:

podatki.EU <- world[as.character(EU$sovereignt),]

Trenutno ti sicer izpusti Srbijo in Slovaško, ker so imena v razpredelnici različna od imen v zemljevidu. Svetujem, da ju popraviš kar v datoteki CSV.

Napovedi lahko delaš za posamezne države, ali pa za celotno Evropo - v tem primeru seveda nariši graf, iz katerega so razvidni podatki ter tvoj model in napoved (jasno naj bo, kateri model si uporabila; v poročilo bi se spodobilo napisati tudi enačbo dobljene premice oziroma krivulje). Lahko, da bodo modeli za različne države podobni, lahko se pa pojavijo tudi kakšne razlike. Svetujem, da podatke deliš s številom prebivalcev za posamezne države, potem pa na teh podatkih narediš razvrščanje v skupine (verjetno potem ni potrebno dodatno skalirati podatkov). Potem lahko pogledaš, ali za države v isti skupini dobiš podobne modele, oziroma če se razlikujejo med skupinami. Če je tako, lahko potem npr. iz vsake skupine izbereš eno državo (npr. najbolj "tipično" za svojo skupino) in narediš graf z modelom zanjo; na zemljevidu pa prikažeš, katere države sodijo v katero skupino.

spelapovrzenic commented 9 years ago

Aha najlepša hvala! :) zanima pa me še, kakor ste mi svetovali, bi res naredila tako grafe za posamezne države kot evropo, vendar imam problem, kako naj naredim graf za evropo, saj moja tabela vsebuje veliko NA. Razmišljala sem, da bi si npr izbrala leta 2002,2007 in 2013 , (mogoče tudi še kakšne ostale) saj imajo najmanj NA-jev, ter seštela potem te vrednosti. Vendar mi ne dela, kako naj seštejem kljub vrednostim NA? In če je to ok, da bo nekje pač manj podatkov seštetih?

spelapovrzenic commented 9 years ago

in tudi pri razvrščanju po skupinah, so te NA ji ovirajoči, mi ga noče narediti, mi prosim pomagate, kako naresti hclust četudi imam NA podatke? Najlepša hvala!

spelapovrzenic commented 9 years ago
podatki.EU <- world[as.character(EU$sovereignt),]
ma <- match(row.names(podatki.EU), row.names(prebivalci))
povprecno.prebivalstvo <- apply(prebivalci[m, c("X1980", "X2020")], 1, mean)  #vzela poprečno št preb
analiza.eu <- podatki.EU/povprecno.prebivalstvo  #podatki deljeno preb

za pomoč, iz teh podatkov bom namreč izvirala

jaanos commented 9 years ago

Če hočeš, da ti pri seštevanju ignorira vrednosti NA, uporabi parameter na.rm = TRUE. Vendar pa seveda to ni vedno najboljša ideja, saj lahko tako izgubiš velik del podatkov.

Vrednosti NA lahko nadomestiš z interpoliranimi vrednostmi s pomočjo knjižnice impute (glej #9). Kot predlagaš, bo smiselno vzeti samo stolpce z dovolj podatki; enako lahko narediš tudi za vrstice (v vsakem primeru je smiselno izpustiti vrstice, kjer sploh nimaš podatkov):

library(impute)
#izberemo želena leta
izbor <- analiza.eu[c("X2002", "X2007", "X2013")]
# dovolimo največ 1 manjkajoč podatek na vrstico
analiza.izbor <- impute.knn(as.matrix(izbor[apply(is.na(izbor), 1, sum) <= 1,]))$data

Sedaj lahko na teh podatkih narediš združevanje v skupine, npr.

h <- hclust(dist(analiza.izbor))

Mimogrede, v zgornji kodi definiraš spremenljivko ma, ki pa je potem ne uporabiš, tako da jo lahko pobrišeš. Seveda bi jo bilo smiselno uporabiti namesto m, a je ta v resnici boljša, saj se vrstni red podatkov v podatki.EU ujema s tistim iz zemljevida (za katerega je bil m prvotno uporabljen); ker pa si spremenila imena držav v podatkih, se v ma pojavijo vrednosti NA. V programu analiza.r iz podatki.EU izpelješ še matriko euroana, vendar to storiš, preden definiraš podatki.EU, tako da bo to potrebno obrniti.

spelapovrzenic commented 9 years ago

Najlepša hvala, pogrupirala (hclust) sem že, tudi naredila zemljevid europe po skupinah, sedaj pa sem opazila da graf in zemljevid ne vsebujeta enakih članov v skupini, tudi različno velike so te skupine, tako da ne vem ali sem se kje zmotila, a te napake nikakor ne najdem, ali ko rišeš zemljevid potem drugače grupira kot pri grafu, verjetno da ne?

jaanos commented 9 years ago

Na dendrogramu uporabiš hclust, delitev za zemljevid pa dobiš s kmeans, zato je seveda delitev drugačna. Če hočeš delitev hh prikazati na zemljevidu, uporabi funkcijo cutree:

plot(svet, col=ifelse(is.na(m), "grey", barve[cutree(hh, k = 6)[m]]),
     xlim=c(-12, 35), ylim=c(34, 70), main="Evropa po skupinah glede na količino zajema vode")
spelapovrzenic commented 9 years ago

najlepša hvala! :) torej sedaj sem se lotila risanja grafa za evropo,

#za podatke europe
podatki.EU <- world[as.character(EU$sovereignt),]
izbor3 <- podatki.EU[c(  "X1987",  "X1992", "X1997","X2002", "X2007", "X2013")]
analiza.izbor3 <- impute.knn(as.matrix(izbor3[apply(is.na(izbor3), 1, sum) <= 1,]))$data
vsotaeu2 <-colSums(analiza.izbor3)
plot(vsotaeu2)

graf je skoraj linearno padajoč, ali pa "kvadratno padajoč" (x^-2), tako da sedaj sem želela narediti to linearno premico, vendar bi vas samo prosila za nasvet, namreč vedno smo imeli pri takih grafih dve vrednosti da smo lahko primerali y~x in potem dobili premice. Ali se da narediti premico samo na mojem zgornjem plotu? (da bo očitno da vrednosti padajo in bodo tudi v prihodnosti), ali si moram zbrati še eno vrednost in jo z njo primerjati (y~x)? Če zadnje velja, bi vas prosila če mi svetujete katero uporabim. Mogoče prabivalstvo?

jaanos commented 9 years ago

V spremenljivki vsotaeu2 imaš številski vektor, indeksiran z imeni stolpcev, ki ustrezajo letom. Tvoja neodvisna spremenljivka je torej leto - najbolje bo, če si pripraviš vektor let in na podlagi tega izbereš ustrezne stolpce:

leta <- c(1987, 1992, 1997, 2002, 2007, 2013)
izbor3 <- podatki.EU[paste0("X", leta)]

Sedaj lahko izračunaš vsotaeu2, pri risanju in gradnji modela pa uporabiš spremenljivko leta, npr.:

plot(leta, vsotaeu2)
lin <- lm(vsotaeu2 ~ leta)

Mimogrede, ne pozabi odkomentirati programa analiza.r v glavnem programu.

spelapovrzenic commented 9 years ago

Pozdravljeni! imam vprašanje: v analizaeu1.pdf v mapi slike, sem naredila grupiranje z postopkom hclust

hh <- hclust(dist(analiza.izbor))
plot(hh, hang=0.1, cex=0.7, main = "Zajem vode v Evropi, na prebivalca",xlab ="Analiza",ylab=NULL,
     sub = "za leta 2002, 2007, 2013")
rect.hclust(hh,k=7,border="green")

malo imam težave namreč kaj je razlika med hclust-om in kmeans-om, ter kateri bi bil bolj primeren za moj primer? države sem namreč razdelila, vendar mi ni čisto jasno, kaj zdaj pomeni da so neke države v neki skupini. Sama bi najraje dobila take skupine, da bodo imele v skupinah enake modele in bi potem te modele za usako skupino tudi prikazala. na mojem primeru za hclust sem dejansko tudi pogledala vse članice v vsaki skupini (pogledala sem dejansko usak graf usake države na roko), ali je mogoče kakšna drugačna tehnika da pogledam ali ima skupina podobne lastnosti, torej da je npr linearna padajoča/naraščujoča?

vala za pomoč in lep pozdrav!

jaanos commented 9 years ago

Najprej eno opozorilo: PDF-je rišeš v mape slike/slike-grafi, slike-zemljevidi in slike/slike-analiza, ki pa so prazne (oziroma imaš v njih samo PDF-je) in jih zato ni v repozitoriju, posledično pa program zaradi tega ne deluje. Svetujem, da v vsaki od njih narediš eno datoteko, npr. README.md, kjer opišeš, kaj naj bi bilo v tej mapi (lahko pa to datoteko pustiš tudi prazno), in seveda te datoteke vključiš v commit.

Razlika med hclust in kmeans je v metodi združevanja, cilj pa je pri obeh enak. hclust ti vrne hierarhično razdelitev - po narejeni razdelitvi se lahko odločiš za primerno število skupin. Ta metoda je deterministična, torej boš iz istih podatkov vedno dobila isto razdelitev. Nasprotno pa je kmeans naključnostna metoda (torej lahko vsakič vrne drugačen rezultat), pri kateri je potrebno že v štartu določiti število skupin.

Da bi pogledala podatke za vse države v skupini hkrati, lahko narišeš podatke za vse države skupine na istem grafu, pa npr. pobarvaš po državi:

skupine <- cutree(hh, 7)
sk <- 2 # izbrana skupina
drzave <- names(which(skupine == sk))
n <- length(drzave)
barve <- rainbow(n)
leta <- c(2002, 2007, 2013)
plot(range(leta), range(izbor[drzave,], na.rm = TRUE), "n")
for (i in 1:n) {
  points(leta, izbor[drzave[i],], col = barve[i])
  lines(leta, izbor[drzave[i],], col = barve[i])
}

Seveda ni nujno, da bodo skupine dejansko imele podobne trende - v resnici metode za združevanje v skupine primerjajo vrednosti in ne razlik med njimi, tako da lahko tudi to upoštevaš pri interpretaciji rezultatov. Morda bi boljšo delitev lahko dobila, če bi dodala še razlike med 2002 in 2007 ter 2007 in 2013, npr.

analiza.izbor <- impute.knn(as.matrix(izbor))$data
analiza.izbor <- data.frame(analiza.izbor,
            razlika.2002.2007 = analiza.izbor[,"X2007"] - analiza.izbor[,"X2013"],
            razlika.2007.2013 = analiza.izbor[,"X2013"] - analiza.izbor[,"X2007"])

hh <- hclust(dist(scale(analiza.izbor))) # podatki niso več neposredno primerljivi, zato jih je potrebno skalirati

Katera metoda je najbolj primerna, je težko povedati vnaprej - potrebno bo preizkusiti več možnosti.

spelapovrzenic commented 9 years ago

Najlepša hvala za vso pomoč! Mislim, da sem z svojim projektom dokončno zaključila, še prej bi vas pa lepo prosila, če mi ga pregledate, ter če je kaj še za spremeniti, da to popravim, da bo kot mora biti. Lep pozdrav, Špela

jaanos commented 9 years ago

Izgleda v redu - edino pri zemljevidih in nekaterih grafih pri 4. fazi niso navedene enote, tako da bi to še bilo koristno dodati. Mimogrede lahko še v poročilu dodaš mesta za deljenje besed na dveh mestih, kjer ti besedilo štrli čez desni rob (npr. Ko\-ro\-škem).

Ko boš imela končno verzijo, odpri issue na repozitoriju za zagovore, s profesorjem se pa domeni za termin zagovora.