Slovenija 2023:
Najprej iz Excelove datoteke shranimo v obliki CSV obe tabeli na karierne_poti_ostro.csv
in karierne_poti_ostro_osebe.csv
> wdir <- "C:/Users/vlado/docs/papers/2023/ostro" > setwd(wdir) > datum <- function(d,m,y) as.integer(as.Date( + ifelse(d!="",d,ifelse(is.na(m),paste("1/1/",y,sep=""), + paste("1/",m,"/",y,sep=""))),format="%d/%m/%Y")) > D <- read.csv("karierne_poti_ostro.csv",sep=",",head=TRUE) > P <- read.csv("karierne_poti_ostro_osebe.csv",sep=",",head=TRUE) > head(D) > head(P) > sort(union(NULL,D$part_of_cv)) [1] "delovne izkušnje" "Delovne izkušnje" [3] "izobraževanje" "Izobraževanje" [5] "lastništvo podjetja" "Lastništvo podjetja" [7] "prostočasne aktivnosti" "Prostočasne aktivnosti" [9] "strankarska pozicija" "Strankarska pozicija" [11] "svetovalne in nadzorne funkcije etc." > (S <- sort(union(NULL,tolower(D$part_of_cv)))) [1] "delovne izkušnje" "izobraževanje" [3] "lastništvo podjetja" "prostočasne aktivnosti" [5] "strankarska pozicija" "svetovalne in nadzorne funkcije etc." > sort(union(NULL,D$position_si)) [1] "častnik" [2] "član" [3] "član vodstva" [4] "član vodstva stranke" [5] "članica" ... [119] "zaposlen" [120] "zaposlen kot slušatelj" [121] "zaposlena" [122] "zastopnik društva"
Modelu programov za analizo tirov kolikor toliko ustreza spremenljivka part_of_cv
. Še pri tej se izkaže, da vrednosti niso vnešene enovito - včasih oznake začnejo z veliko, drugič z malo začetnico (v R-ju je to preprosto poenotiti). Večje težave bi bile, če bi se naslonili na spremenljivko position_si
, kjer stvari zaplete “enakopravnost spolov” (član - članica, zaposlen - zaposlena, itd.); spol je sicer podan v spremenljivki gender
v drugi tabeli.
V prvem poskusu analize se je pokazalo, da je neznano končno leto zakodirano z 2100 - razlog za zelo velik razpon vrednosti in debele črne črte na sliki.
> which(D$end_year>2023) [1] 21 36 42 46 49 59 63 64 65 66 69 70 84 85 86 89 90 119 120 122 123 141 145 165 171 [26] 175 200 218 219 225 226 227 252 > D$end_year[which(D$end_year>2023)] [1] 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 [21] 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100 2100
Za te analize smo ga prestavili na 2024.
> max(D$end_year,na.rm = TRUE) [1] 2100 > I <- which(D$end_year==2100) > D$end_year[I] <- 2024
Prebrane podatke predelamo v obliko zaporedja dogodkov oblike (ID,s,f,S), kjer je ID ime osebe, s začetek dogodka, f konec dogodka in S stanje (vrenost spremenljivke part_of_cv
). Zapišemo jih na datoteko ostro.csv
. Datumi so predelani v število dni od 1/1/1970.
> CSV <- "ostro.csv"; csv <- file(CSV,"w",encoding="UTF-8") > cat("ID s f S\n",file=csv) > n <- nrow(D) > for(i in 1:n){ + ds <- datum(D$start_day[i],D$start_month[i],D$start_year[i]) + de <- datum(D$end_day[i],D$end_month[i],D$end_year[i]) + ID <- D$person_name[i]; rel <- tolower(D$part_of_cv[i]) + if(!is.na(de)) {cat('"',ID,'" ',ds,' ',de,' "',rel,'"\n',sep='',file=csv) + } else {cat(i,":",ID,D$start_year[i],rel,'*** missing end date\n'); + flush.console()} + } 13 : Vojko Volk 2009 svetovalne in nadzorne funkcije etc. *** missing end date 16 : Vojko Volk 2017 strankarska pozicija *** missing end date 17 : Vojko Volk 1991 strankarska pozicija *** missing end date > close(csv)
V nekaj zapisih mankajo končni datumi.
Za pretvorbo uporabimo shemo iz mvad
> source("https://raw.githubusercontent.com/bavla/Rnet/master/R/Pajek.R") > source("https://raw.githubusercontent.com/bavla/TQ/master/trajectories/trajectoR.R") > E <- read.csv("ostro.csv",sep="") > traj2Pajek(E,500000,"ostro.net") % traj2Pajek Tue Nov 28 21:51:58 2023 events 252 ..................................................50 299 Tue Nov 28 21:52:02 2023 ..................................................100 819 Tue Nov 28 21:52:11 2023 ..................................................150 1478 Tue Nov 28 21:52:21 2023 ..................................................200 1858 Tue Nov 28 21:52:27 2023 ..................................................250 2164 Tue Nov 28 21:52:32 2023 . Tue Nov 28 21:52:32 2023 density R = 0.1663821 tests = 5262 density E = 0.06851957 edges = 2167 % finished Tue Nov 28 21:52:32 2023
Omrežje je shranjeno na datoteki ostro.net
. Ročno sem v znakovnem urejevalniku dodal datoteki BOM - Pajek razpozna UTF-8.
Za prikaz omrežja ga najprej preberemo v Pajka. Ker so uteži povezav precej velike [1, 33237], večkratne in imajo velik razpon, jih transformiramo w´ = sqrt(sum(w)/1000).
Create New Network/Transform/Remove/Multiple lines/Sum values
Create New Network/Transform/Line values/Divide by [1000]
Create New Network/Transform/Line values/Abs + Sqrt
Draw/Network
Za prikaz različnih relacij moramo najprej spremeniti nekaj slikovnih nastavitev in končno shraniti sliko v obliki SVG:
Options/Lines/Different widths
Options/Size/of Lines [0.5]
Options/Colors/Edges/Relation number
Export/Options/Edge width [0.5]
Export/2D/SVG/Multiple Relations Network
> names(D) [1] "ID" "person_name" "part_of_cv" [4] "show_in_network" "start_day" "start_month" [7] "start_year" "institution_si" "institution_en" [10] "institution_standardized_si" "institution_standardized_en" "institution_department_si" [13] "institution_department_en" "affiliation_type_si" "affiliation_type_en" [16] "position_si" "position_en" "end_day" [19] "end_month" "end_year" "notes_institution_si" [22] "notes_institution_en" "notes_position_si" "notes_position_en" > names(P) [1] "ID" "id.projekt" "wikidata_id" [4] "name" "position" "institution_si" [7] "institution_en" "is_visible" "birth_date" [10] "party_si" "party_en" "first_time_in_office" [13] "is_first_time_in_office" "gender"
V prvem poskusu smo uporabili grobo določitev povezav večrelacijskega omrežja:
part_of_cv
), če obstaja neprazen presek časovnih intervalov pripadajočih dogodkov. Utež povezave je enaka velikosti preseka - dolžina presečnega časovnega intervala (merjeno v dnevih).Tako določeno omrežje ne daje odgovorov na zastavljena vprašanja saj opisuje časovno ujemanje glede na posamezne dele CV. Za želene odgovore moramo najprej ustvariti ustrezna omrežja. Določiti moramo kdaj sta osebi povezani in na kakšen način. Pri tem naj število možnih načinov ne bo (veliko) večje od 10.
Morda bi se valjalo nasloniti na relacije iz part_of_cv
in zaostriti pogoje povezanosti. Npr. uporabljenemu pogoju dodamo še:
institution_si
Poskusite iz zbranih podatkov sami ročno določiti nekaj parov povezanih oseb in zapišite, kako ste jih določili.
Dodatni zanimivi relaciji bi lahko bili “sokrajan” (morda izpeljiva iz naslova) in “sorodstvo”.
Maja Cakaric maja@ostro.si Wed 13-Dec-23 7:31 PM
PODATKI IZ ZAVIHKA CV_LIVE, razen kjer je označeno drugače
Opomba