M4rble / APPR-2019-20

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

napredna analiza - nelinearna regresija in omejevanje modela #6

Open M4rble opened 4 years ago

M4rble commented 4 years ago

Pri napredni analizi se mi pojavlja težava, saj pri napovedovanju podatkov za prihodnost (npr primerjava_rasti_tur) linearen model funkcije ni čisto ustrezen - čeprav je graf po podatkih do sedaj res linearen, v prihodnosti skoraj gotovo ne bo, saj kaže % dostopanja do interneta, torej se bo v prihodnosti postopoma zmanjševal, hkrati pa konvergiral k 100%. Zanima me, če obstaja kakšna funkcija, ki bi pokazala tak napredek, hkrati pa tudi kako model omejiti da vrednosti ne bodo presegle 100? Poizkusil sem z logaritemsko in korensko funkcijo vendar vrneta popolnoma napačne vrednosti.

jaanos commented 4 years ago

Če delaš napovedi na deležih, si lahko pomagaš z logistično funkcijo 1/(1+e-x) in njenim inverzom (logit) log(y / (1-y)) - glede na to, da imaš procente, bo potrebno ustrezno skalirati, npr.

library(scales)

logisticna <- function(x) { 100 / (1 + exp(-x)) }
logisticna_inv <- function(y) { log(y / (100 - y)) }
logisticna_breaks <- . %>% logisticna() %>% extended_breaks()() %>% logisticna_inv()

logisticna_trans <- trans_new("logistična funkcija", logisticna, logisticna_inv)

primerjava_rasti_log <- primerjava_rasti %>% mutate(delez=logisticna_inv(delez))

graf7 <- ggplot(primerjava_rasti_log %>% filter(drzava %in% c("Islandija", "Turčija")),
                aes(x=leto, y=delez, col=drzava)) +
  geom_point() + ggtitle("Primerjava rasti držav z največjo in najmanjšo rastjo") + 
  xlab("leto") + ylab("delež v %") + facet_grid(. ~ drzava) + stat_smooth(method="lm") +
  coord_trans(y=logisticna_trans) + scale_y_continuous(breaks=logisticna_breaks,
                                                       labels=logisticna)

Mimogrede: opažam, da imaš v mapi slike datoteko Europe.rar z zemljevidom. Ta ne sodi na repozitorij, tako da jo pobriši. Lahko tudi dodaš vrstico *.rar v .gitignore, da ti git takih datotek več ne bo ponujal pri vključevanju v commit.

Svetujem še, da v svojih programih izven poročila ne uporabljaš ukaza source - tako se ti trenutno uvoz izvede dvakrat (seveda poskrbi za ustrezen vrstni red klicanja).

M4rble commented 4 years ago

Hvala za odgovor in nasvete, sem popravil. Sem na gitu posodobil zadnjo verzijo projekta, če se pojavijo še kakšni komentarji ali nasveti za popravljanje, drugače pa mislim da je projekt končan in da sem pripravljen na zagovor.

jaanos commented 4 years ago

Poročila ti trenutno ne prevede - treba bo zamenjati vrstni red klicanja uvoza in vizualizacije. Poleg tega svetujem, da slovar premakneš v uvoz, saj ga že tam potrebuješ.

M4rble commented 4 years ago

Sem popravil, zdaj bi moralo prevesti poročilo brez težav.

jaanos commented 4 years ago

V redu, zdaj poročilo deluje, tako da bom dodal povezavo na repozitorij za zagovore. Če se še nisi, se lahko z @alenFMF domeniš za termin zagovora. Če boš do takrat še kaj spreminjal, mi javi, da posodobim povezavo.

Imam še dve pripombi:

M4rble commented 4 years ago

Hvala za pripombe, sem popravil še par stvari, tako da prosim za posodobitev povezave.

jaanos commented 4 years ago

V redu, bom posodobil.

Opažam še, da imaš pri graf3b nelinearno lestvico, kar kaže na neustrezno zabeležena števila. Glavni problem se zgodi tukaj: https://github.com/M4rble/APPR-2019-20/blob/d683613a1bd029d00384651a88ec31d846657d55/vizualizacija/vizualizacija.r#L108 Ker podatke nadomeščaš z nizom, se celoten stolpec pretvori v nize. Tudi sicer nadomeščanje manjkajočih vrednosti (tukaj kot NaN, ker se izračunajo kot 0/0) z 0 ni ustrezna rešitev. Namesto tega lahko celotno razpredelnico aktivnosti_po_letih pripraviš tako:

aktivnosti_po_letih <- internetne_aktivnosti %>% mutate(leto=factor(leto)) %>%
  filter(uporaba %in% c("branje novic", "posiljanje/prejemanje e-poste", 
                        "poslusanje glasbe", 
                        "pridobivanje informacij o proizvodih in storitvah",
                        "uporaba aplikacij za izmenjavo sporocil (npr Messenger)",
                        "uporaba socialnih omrezij")) %>%
  group_by(leto, uporaba) %>% summarise(delez=mean(delez, na.rm=TRUE))

Graf, dobljen iz take razpredelnice, bo tako imel linearno lestvico z ustreznimi oznakami.

M4rble commented 4 years ago

Hvala za popravek, sem popravil, tako da prosim za ponovno posodobitev povezave.

jaanos commented 4 years ago

Posodobljeno.