class: center, middle, inverse, title-slide # OBRADA PODATAKA ## Predavanje 2: Vrste podataka ### Luka Sikic, PhD ### Fakultet hrvatskih studija --- # CILJEVI PREDAVANJA <br> <br> <br> - Strukturirani i ne-strukturirani podatci <br> <br> - Kvantitativni i kvalitativni podatci <br> <br> - Diskretni i kontinuirani podatci <br> <br> - Razine podataka <br> <br> - Podatci u "praksi" <br> <br> - Big Data u društvenim znanostima --- layout: true # STRUKTURIRANI I NESTRUKTURIRANI PODATCI --- ### Karakteristike <br> .pull-left[ **STRUKTURIRANI** - observacije sa karakteristikama - uglavnom organizirane u tablicu (redovi i kolone) - znanstveno prikupljeni podatci (npr. telefonski imenik) - manji dio podataka ] .pull-right[ **NESTRUKTURIRANI** - podatci bez (standardne) organizacijske hijerarhije - Facebook objave, Twitter, logovi na server, genetska sekvenca nukleotida, tekstualni podatci - vjerojatno više od 80% svih podataka - zahtjevaju prilagodbu prije analize ] --- #### Primjer strukturiranih podataka ```r # Učitaj paket library(maddison) # Uredi podatke maddi <- maddison %>% filter(iso2c %in% c("HR")) %>% filter(year >= 1952) head(maddi,6) ``` ``` ## # A tibble: 6 x 12 ## countrycode country year cgdppc rgdpnapc pop i_cig i_bm iso2c iso3c ## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <chr> <chr> ## 1 HRV Croatia 1952 3141 3754 3882 Extrapolated <NA> HR HRV ## 2 HRV Croatia 1953 3387 4048 3906 Extrapolated <NA> HR HRV ## 3 HRV Croatia 1954 3663 4378 3930 Extrapolated <NA> HR HRV ## 4 HRV Croatia 1955 4300 5140 3956 Extrapolated <NA> HR HRV ## 5 HRV Croatia 1956 4089 4888 3973 Extrapolated <NA> HR HRV ## 6 HRV Croatia 1957 4822 5764 3991 Extrapolated <NA> HR HRV ## # ... with 2 more variables: continent <chr>, region <chr> ``` --- #### Primjer strukturiranih podataka [Maddison](https://www.rug.nl/ggdc/historicaldevelopment/maddison/releases/maddison-project-database-2020?lang=en) ```r # Vizualiziraj podatke ltg <- ggplot(maddi,aes(x = year, y = rgdpnapc)) + geom_line(color="red") + geom_point() + scale_y_log10(labels = comma, breaks = pretty_breaks(6)) + theme_bw() + labs( title = "Dugoročni BDP per capita u Hrvatskoj", subtitle = "Godine: 1952-2016", caption = "Izvor: Maddison database; izrada autora") + ylab("BDP per capita") + xlab("Godina") ``` --- #### Primjer strukturiranih podataka ![](03_VRSTEdtaXAR_files/figure-html/unnamed-chunk-3-1.png)<!-- --> --- #### Primjer nestrukturiranih podataka [Wikipedia](https://en.wikipedia.org/wiki/Houston) ```r # Učitaj pakete library(tidyverse) library(rvest) # Url url = "https://en.wikipedia.org/wiki/Houston" # Učitaj url houston_html = read_html(url) # Pogledaj objekt houston_html ``` ``` ## {html_document} ## <html class="client-nojs" lang="en" dir="ltr"> ## [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ... ## [2] <body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject ... ``` --- #### Primjer nestrukturiranih podataka ```r # Pogledaj sve tablice houston_html %>% html_nodes(css = "table") ``` ``` ## {xml_nodeset (19)} ## [1] <table class="infobox ib-settlement vcard"><tbody>\n<tr><th colspan="2" ... ## [2] <table class="wikitable mw-collapsible mw-collapsed" style="width:auto; ... ## [3] <table class="wikitable mw-collapsible mw-collapsed" style="width:auto; ... ## [4] <table class="toccolours" style="border-spacing: 1px; float: right; clea ... ## [5] <table class="wikitable sortable collapsible" style="font-size: 90%;"><t ... ## [6] <table style="text-align:left; border-collapse:collapse; width:100%;"><t ... ## [7] <table class="wikitable" style="float:right; font-size:75%; text-align:c ... ## [8] <table class="box-More_citations_needed_section plainlinks metadata ambo ... ## [9] <table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner ... ## [10] <table class="nowraplinks mw-collapsible autocollapse navbox-inner" styl ... ## [11] <table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner ... ## [12] <table class="nowraplinks mw-collapsible autocollapse navbox-inner" styl ... ## [13] <table class="nowraplinks mw-collapsible mw-collapsed navbox-inner" styl ... ## [14] <table class="nowraplinks mw-collapsible autocollapse navbox-inner" styl ... ## [15] <table class="nowraplinks mw-collapsible autocollapse navbox-inner" styl ... ## [16] <table class="nowraplinks mw-collapsible autocollapse navbox-inner" styl ... ## [17] <table class="nowraplinks mw-collapsible autocollapse navbox-inner" styl ... ## [18] <table class="nowraplinks mw-collapsible autocollapse navbox-inner" styl ... ## [19] <table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner ... ``` ```r # Izvuci željenu tablicu pop_table = houston_html %>% html_nodes(css = "table") %>% nth(4) %>% html_table(fill = TRUE) ``` --- #### Primjer nestrukturiranih podataka ```r # Pogledaj tablicu head(pop_table) ``` ``` ## # A tibble: 6 x 4 ## `Historical population` `Historical popul~ `Historical popu~ `Historical popu~ ## <chr> <chr> <chr> <chr> ## 1 Census Pop. "" %± ## 2 1850 2,396 "" — ## 3 1860 4,845 "" 102.2% ## 4 1870 9,382 "" 93.6% ## 5 1880 16,513 "" 76.0% ## 6 1890 27,557 "" 66.9% ``` --- #### Primjer nestrukturiranih podataka ```r # Uredi podatke colnames(pop_table) = c("year", "population", "blank", "percent_change") pop_table = pop_table[2:19, ] pop_table = pop_table %>% select(-blank) %>% mutate( percent_change = str_replace(percent_change, "%", ""), percent_change = str_replace(percent_change, "—", ""), year = str_replace(year, "\\(est.\\)", ""), population = str_replace_all(population, ",", ""), year = lubridate::ymd(year, truncated = 2L), population = as.numeric(population), percent_change = as.numeric(percent_change) ) ``` --- #### Primjer nestrukturiranih podataka ```r # Tablično prikaži knitr::kable(pop_table %>% head(8)) ``` <table> <thead> <tr> <th style="text-align:left;"> year </th> <th style="text-align:right;"> population </th> <th style="text-align:right;"> percent_change </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 1850-01-01 </td> <td style="text-align:right;"> 2396 </td> <td style="text-align:right;"> NA </td> </tr> <tr> <td style="text-align:left;"> 1860-01-01 </td> <td style="text-align:right;"> 4845 </td> <td style="text-align:right;"> 102.2 </td> </tr> <tr> <td style="text-align:left;"> 1870-01-01 </td> <td style="text-align:right;"> 9382 </td> <td style="text-align:right;"> 93.6 </td> </tr> <tr> <td style="text-align:left;"> 1880-01-01 </td> <td style="text-align:right;"> 16513 </td> <td style="text-align:right;"> 76.0 </td> </tr> <tr> <td style="text-align:left;"> 1890-01-01 </td> <td style="text-align:right;"> 27557 </td> <td style="text-align:right;"> 66.9 </td> </tr> <tr> <td style="text-align:left;"> 1900-01-01 </td> <td style="text-align:right;"> 44633 </td> <td style="text-align:right;"> 62.0 </td> </tr> <tr> <td style="text-align:left;"> 1910-01-01 </td> <td style="text-align:right;"> 78800 </td> <td style="text-align:right;"> 76.6 </td> </tr> <tr> <td style="text-align:left;"> 1920-01-01 </td> <td style="text-align:right;"> 138276 </td> <td style="text-align:right;"> 75.5 </td> </tr> </tbody> </table> --- layout: true # KVANTITATIVNI I KVALITATIVNI PODATCI --- <br> <br> <br> <br> .pull-left[ **KVANTITATIVNI** - brojevi, matematičke procedure, prosjek, vremenski trend, threshold efekti ] .pull-right[ **KVALITATIVNI** - "prirodne" kategorije, jezik - najčešća observacija, jedinstvene vrijednosti ] --- #### Učitaj podatke ```python # Učitaj paket (Python) import pandas as pd # ucitaj CSV file sa URL drinks = pd.read_csv('https://raw.githubusercontent.com/sinanuozdemir/principles_of_data_science/master/data/chapter_2/drinks.csv') ``` ```r # prikazi podatke u tablici py$drinks %>% select(1:5) %>% head(4) ``` ``` ## country beer_servings spirit_servings wine_servings ## 1 Afghanistan 0 0 0 ## 2 Albania 89 132 54 ## 3 Algeria 25 0 14 ## 4 Andorra 245 138 312 ## total_litres_of_pure_alcohol ## 1 0.0 ## 2 4.9 ## 3 0.7 ## 4 12.4 ``` --- <br> <br> <br> #### Pregled podataka .pull-left[ ```python drinks['continent'].describe() # pregledaj kolonu 'continent'- KVALITATTIVNA ``` ``` ## count 170 ## unique 5 ## top AF ## freq 53 ## Name: continent, dtype: object ``` ] .pull-right[ ```python drinks['beer_servings'].describe() # pregledaj kolonu 'continent'- KVANTITATIVNA ``` ``` ## count 193.000000 ## mean 106.160622 ## std 101.143103 ## min 0.000000 ## 25% 20.000000 ## 50% 76.000000 ## 75% 188.000000 ## max 376.000000 ## Name: beer_servings, dtype: float64 ``` ] --- layout: true # DISKRETNI I KONTINUIRANI PODATCI --- <br> <br> <br> .pull-left[ **DISKRETNI** - prebrojivi - npr. igraća kocka - integer, logical, character, factor ] .pull-right[ **KONTINUIRANI** - postoje na kontinuiranoj skali - npr. težina ili visina ] --- #### Primjeri diskretnih podataka (numerička varijabla) ```r # Napravi integer varijablu sa dvanaest brojeva bubba <- integer(12) # Pregledaj bubba ``` ``` ## [1] 0 0 0 0 0 0 0 0 0 0 0 0 ``` ```r # Pregledaj prvi element bubba[1] ``` ``` ## [1] 0 ``` ```r # Promijeni 4. element u vrijednost 15 bubba[4] <- 15 # Pregledaj bubba ``` ``` ## [1] 0 0 0 15 0 0 0 0 0 0 0 0 ``` --- #### Primjeri diskretnih podataka (numerička varijabla) ```r # Napravi sekvencu sekvenca <- seq(4,11,by=2) # Pregledaj sekvenca ``` ``` ## [1] 4 6 8 10 ``` ```r # Napravi varijablu koja nije kontinuirana a <- 1.2 # Pregledaj typeof(a) ``` ``` ## [1] "double" ``` ```r # Pregledaj is.integer(a) ``` ``` ## [1] FALSE ``` --- #### Primjeri diskretnih podataka (logička varijabla) ```r # Napravi logičku varaijablu logickaVar <- logical(10) # Pregledaj logickaVar ``` ``` ## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE ``` ```r # Pregledaj typeof(logickaVar) ``` ``` ## [1] "logical" ``` ```r # Prilagodi 3. element logickaVar[3] <- TRUE # Pregledaj logickaVar ``` ``` ## [1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE ``` --- #### Primjeri diskretnih podataka (logička varijabla) ```r # Napravi logičku varaijablu l1 <- c(TRUE,FALSE) # Napravi logičku varaijablu l2 <- c(TRUE,TRUE) # Logički upit & l1&l1 ``` ``` ## [1] TRUE FALSE ``` ```r # Logički upit | l1|l2 ``` ``` ## [1] TRUE TRUE ``` --- #### Primjeri diskretnih podataka (tekstualna (*chraracter*) varijabla) ```r # Napravi chr varaijablu rijec <- "hello" # Pregledaj rijec ``` ``` ## [1] "hello" ``` ```r # Vrsta typeof(rijec) ``` ``` ## [1] "character" ``` ```r # Napravi chr varaijablu viseTeksta <- character(3) # Pregledaj viseTeksta ``` ``` ## [1] "" "" "" ``` --- #### Primjeri diskretnih podataka (tekstualna (*chraracter*) varijabla) ```r # Napravi chr element viseTeksta[2] <- "prvi element" viseTeksta[3] <- 'hej, treći!' viseTeksta[1] <- "prvi na prvom mjestu" # Pregledaj viseTeksta ``` ``` ## [1] "prvi na prvom mjestu" "prvi element" "hej, treći!" ``` --- #### Primjeri diskretnih podataka (tekstualna (*chraracter*) varijabla) ```r # Napravi numerički element broj <- 3.0 # Pregledaj typeof(broj) ``` ``` ## [1] "double" ``` ```r # Stvori chr iz numeričkog elementa rijec <- as.character("broj") # Prgledaj typeof(rijec) ``` ``` ## [1] "character" ``` --- #### Primjeri diskretnih podataka (factor varijabla) ```r # Napravi factor varijablu faktor <- factor(x=c("one","two","three","one", "one", "one", "two")) # Pregledaj faktor ``` ``` ## [1] one two three one one one two ## Levels: one three two ``` ```r # Faktorske razine levels(faktor) ``` ``` ## [1] "one" "three" "two" ``` ```r # Sortiraj sort(faktor) ``` ``` ## [1] one one one one three two two ## Levels: one three two ``` --- #### Primjeri kontinuiranih podataka ```r # Napravi kontinuiranu varijablu d <- double(8) # Pregledaj d ``` ``` ## [1] 0 0 0 0 0 0 0 0 ``` ```r # Pregledaj typeof(d) ``` ``` ## [1] "double" ``` ```r # Promijeni element d[3] <- 17.6 # Pregledaj d ``` ``` ## [1] 0.0 0.0 17.6 0.0 0.0 0.0 0.0 0.0 ``` --- #### Primjeri specijalnih podataka ```r # Stvori varijablu n <- c(NA,2,3,NA,5) # Pregledaj n ``` ``` ## [1] NA 2 3 NA 5 ``` ```r # Primjena is.na(n) ``` ``` ## [1] TRUE FALSE FALSE TRUE FALSE ``` ```r # Primjena n[!is.na(n)] ``` ``` ## [1] 2 3 5 ``` --- layout: true # ČETIRI RAZINE PODATAKA --- <br> <br> <br> <br> 1. **NOMINALNI** 2. **ORDINALNI** 3. **INTERVALNI** 4. **OMJERNI** --- <br> <br> <br> #### Nominalna razina - podatci opisani nazivom ili kategorijom (kategorički podatci) - npr. spol, nacionalnost, biološke vrste - ne mogu se obavljati matematičke operacije poput zbrajanja ili djeljenja --- #### Primjer podataka nominalne razine ```r # Napravi podatke spol_vector <- c("Muški", "Ženski", "Ženski", "Muški", "Muški") # Pregledaj class(spol_vector) ``` ``` ## [1] "character" ``` ```r # Pregledaj spol_vector ``` ``` ## [1] "Muški" "Ženski" "Ženski" "Muški" "Muški" ``` ```r # Pretvori u faktor spol_vector_factor <- factor(spol_vector) # Pregledaj spol_vector_factor ``` ``` ## [1] Muški Ženski Ženski Muški Muški ## Levels: Muški Ženski ``` --- <br> <br> <br> #### Ordinalna razina - kategorički podatci koji imaju hijerarhijsku strukturu - iako postoji hijerarhija, nije moguće utvrditi relativne razlike među opservacijama - matematičke operacije kao zbrajanje ili dijeljenje nisu opravdane - usporedbe i sortiranje podataka su opravdane - moguće je koristiti medijan (ne i prosjek) --- #### Primjer podataka ordinalne razine ```r # Napravi chr varijablu dan_vector <- c('jutro', 'zora', 'popodne', 'podne', 'ponoc', 'predvecer') # Pretvori u ordinalnu varijablu factor_dan <- factor(dan_vector, order = TRUE, levels =c('zora', 'jutro', 'podne', 'popodne', 'predvecer', 'ponoc')) # Pregledaj factor_dan ``` ``` ## [1] jutro zora popodne podne ponoc predvecer ## Levels: zora < jutro < podne < popodne < predvecer < ponoc ``` --- #### Intervalna razina - npr. temperatura - kvantitativni podatci - opravdane su matematičke operacije poput zbrajanja i oduzimanja - opravdano korištenje mjera centralne tendencije i varijabilnosti #### Primjer ```python import numpy # temperatura frizidera u fahrenheitima mjerena svakih sat vremena temps = [31, 32, 32, 31, 28, 29, 31, 38, 32, 31, 30, 29, 30, 31, 26] # pogledaj prosjek i medijan print("prosjek:",round(numpy.mean(temps),2)) ``` ``` ## prosjek: 30.73 ``` ```python print("medijan:",round(numpy.median(temps),2)) ``` ``` ## medijan: 31.0 ``` --- #### Primjer ```python ## pogledaj mjere varijacije squared_differences = [] # napravi praznu listu mean = numpy.mean(temps) # spremi prosjek u objekt for temperature in temps: difference = temperature - mean # definiraj funkciju za izracun udaljenosti (temperature) od prosjeka squared_difference = difference**2 # kvadriraj razliku squared_differences.append(squared_difference) # dodaj listi average_squared_difference = numpy.mean(squared_differences) # izracunaj varijancu standard_deviation = numpy.sqrt(average_squared_difference) # izracunaj standardnu devijaciju print("stdev:",round(standard_deviation,2)) ``` ``` ## stdev: 4.73 ``` --- #### Omjerna razina - kvantitativni podatci - opravdane matematičke operacije množenja i djeljenja - podatci na ovoj razni ne smiju biti negativni #### Primjer ```python # temperatura frizidera u fahrenheitima mjerena svakih sat vremena temps = [31, 32, 32, 31, 28, 29, 31, 38, 32, 31, 30, 29, 30, 31, 26] # izracunaj geometrijsku sredinu num_items = len(temps) product = 1. for temperature in temps: product *= temperature geometric_mean = product**(1./num_items) # prikazi rezultat print("geometrijska sredina:",geometric_mean) ``` ``` ## geometrijska sredina: 30.63473484374659 ``` --- layout: true # PODATCI U "PRAKSI" --- <br> <br> <br> **Big Data** <br> <br> - zbog veličine se ne mogu pohraniti na standardne relacijske baze <br> - nestrukturirani, semi-srtukturirani i strukturirani podatci <br> - od terabayt-a do zettabayt-a veličine <br> - osnova za strojno učenje, AI, predviđanje budućnosti --- <br> <br> <br> **Strukturirani, Ne-strukturirani i Kvazi-strukturirani podatci** <br> <br> - SQL, Excel <br> - podatkovni "polymorphism" zbog uspona novih tehnologije (web,mobile, socialNet,IoT, programming) <br> - [MongoDB](https://www.mongodb.com/), RAVENDB,RETHINKDB, ORIENTDB, PostrgreSQL, ArangoDB cassandra --- <br> <br> <br> **Vremenske serije** <br> <br> - svaka opservacija ima vremenski pečat(događaj ili procesuiranje) <br> - npr. bihevioralni podatci(web) koji se koriste za predviđanje akcijskih modela <br> - npr. financijsko trgovanje --- <br> <br> <br> **Strojni podatci** <br> <br> - sistemski proizvedeni podatci <br> - npr. PC logovi, mobiteli, pametni automobili, aplikacije, API, cloud aplikacije, sensorni signali <br> - posebno korisna za identifikaciju prijetnji, kontrolu kvalitete procesa, predviđanje --- <br> <br> <br> **Prostorno-temporalni podatci** <br> <br> - geografski i temporalni pečat <br> - prokazuju lokacijsku dinamiku u vremenu <br> - praćenje vozila, promjene u populaciji, otkrivanje anomalija u (npr. telekom) mreži --- <br> <br> <br> **Otvoreni podatci** <br> <br> - dostupni javnosti prema "pravilima za upotrebu" <br> - trenutno uglavno ograničeni na znanstvenu uporabu --- <br> <br> <br> **Crni podatci** <br> <br> - neiskorišteni podatci <br> - uglavnom u institucionalnom vlasništvu(tvrtke instituti, think-tank, fakulteti) <br> --- <br> <br> <br> **Podatci u realnom vremenu** <br> - visoka potražnja i "vrući trend" <br> - 5G <br> - medicina, promet, trgovina <br> - velik potencijal --- <br> <br> <br> **Genomski podatci** <br> <br> - analiza DNA u cilju identifikacije efekata ljekova i tretiranja bolesti <br> - analitika je glavno ograničenje <br> - prikupljanje i procesuiranje podataka otežano --- <br> <br> <br> **Operativni podatci** <br> <br> - uvidi u procese ponad analitičara i specijalista <br> - podatci o praksama <br> - korisni za obrnuti inžinjering --- <br> <br> <br> **Visoko-dimenzionalni podatci** <br> <br> - popularizirani kroz IT podršku za prepoznavanje lica <br> - zbog složenosti transformacija zahtijevaju nove načine bilježenja i manipulacije --- <br> <br> <br> **Ne-verificirani podatci** <br> <br> - prikupljeni podatci upitne relevantnosti --- class: inverse, middle layout:false # Hvala na pozornosti!