avaialable from (https://rpubs.com/staszkiewicz/EX_6_NA_PL)
Sieć (graf) składa się z wierzchołka (węzła) i krawędzi. Sposód wielu
pakietów dostępnych do analizy sieci, my skorzystamy z
igrapha
#rm(list = ls()) # Gdyby była potrzeba wyczyszczenia środowiska
#install.packages("igraph") # jeśli po raz pierwszy instalujemy bibliotekę
library(igraph) # ładowanie pakietu
##
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
##
## decompose, spectrum
## The following object is masked from 'package:base':
##
## union
Igraph nakłada na przestrzeń roboczą swoje nazwy, więc jego stosowanie polecam raczej samodzielnie (bez przeładowania bibliotek w przestrzeni nazw)
Jak zwykle, wykorzystamy dane pierwotne z artykułu Audit fee and communication sentiment. Badania Ekonomiczne-Ekonomska Istraživanja. https://doi.org/10.1080/1331677X.2021.1985567 Staszkiewicz and Karkowska (2021). Dane, jak zwykle, dostępne są w Niezbędniku (“Materiały Publiczne”) plik o nazwie Bank.cvs. Proszę pobrać go na swój komputer i wgrać do R. Proszę pamiętać, że dane mogą być wykorzystywane po zajęciach tylko do celów niekomercyjnych z podaniem źródła.
# z bazowych funkcji systemu wczytamy klasyczny plik z csv ale w taki sposób
# że wybierzemy z okienka umiejscowienie pliku na włanym komuterze
# dlaego zagnieżdzamy polecenie "file.choose()"
# bank <- read.csv(file.choose())
Igraph pozwala zwizualizować sieć (graf). Nazwijmy wierzchołki 1,2,3 oraz ich związki, że 1 łączy się z 2, dalej 2 łączy się z 3, zaś 3 łączy się z 1. Teraz zdefiniujmy sobie taką sieć jako obiekt S1 i zobaczmy jego strukturę:
S1<-graph( edges=c(1,2, 2,3, 3, 1), n=3, directed=F )
class(S1)
## [1] "igraph"
S1
## IGRAPH 4ef6031 U--- 3 3 --
## + edges from 4ef6031:
## [1] 1--2 2--3 1--3
S1 to obiekt “igraph”, który jest listą. Opisaną następującymi charakterystykami: 4 literami D olub U, skierowana(directed) albo nieskieowana (undirected) sieć N gdy, sieć jest nazwana (wierzchołki mają atrybut nazwy) W gdy sieć jest ważona (krawędzie mją atrybut waga) B dla wykresu dwudzielnego (dwutrybowego) (gdzie wieszchołki mają atrybut typu) Dwie liczby (3 3) odpowiednio liczba wierzchołków i krawędzi. Oraz literowe oznaczenie cech (atrybutów) wierzchołków i krawędzi:
(g/c) - siec-poziom atrybut znakowy (v/c) - wierzchołek -poziom atrybut znakowy (e/n) - krawędź-poziom atrybut numeryczny
w naszym przypadku mamy do czynienia z siecią nieskierowaną, bo
tworząc obiekt wybraliśmy oppcję: directed=F
a więc
zwizualizujmy naszą sieć funcją plot
plot(S1)
Grupa ABB w 2018 była badana przez KPMG w 2019 i 2016 i 2015 przez Deloitte, w 2020 i 2017 przez PWC, a w 2021 przez EY. Średniorocznie firmy audytorskie zatrudniaj 223, 198, 204, 187 biegłych rewidentów dane odpowiednio dla KPMG, Deloitte, PWC i EY.
Stwórzmy sieć pokazujący kierunek przepływu ABB między firmami audytorskimi. Nasze węzły to firmy audytorskie (W), zaś krawędzie to zmiana firmy audytorskiej w danym roku. Ponieważ ma znaczenie czy ABB w danym roku przechodzi od EY do KPMG czy odwrotnie, więc nasza sieć będzie skierowana.
W<-c("KPMG","Deloitte","PWC","EY") # zdefinowaliśmy wierzchołki
# Definiujemy krawędzie odpowiadające transfer firm audytorskich w poszczególnych latach
# 2015->2016; 2016->2017; 2017->2018 2018->2019 2019->2020 2020->2021
K<-c("KPMG","KPMG", "KPMG","Deloitte", "Deloitte","KPMG", "KPMG","Deloitte", "Deloitte","PWC", "PWC","EY")
Zobrazujmy siec:
S2 <- S1<-graph( edges=K, n=4, directed=T )
## Warning in graph(edges = K, n = 4, directed = T): 'n' is ignored for edge list
## with vertex names
plot(S2)
Proszę zauważyć, że gdy definiujemy wierzchołki nazwami własnymi nie musimy ich podawać parametrem n. W roku 2015 i 2016 ABB korzystało z usług KPMG więc mamy zacykloną (pętlę) krawędź do KPMG, podczas gdy w kolejnych latach następowały wymiany między KPMG i Deloitte. Nie zawsze potrzebujemy tak szczegółowych informacji i niekiedy możemy chcieć pominąć zbędne powtarzające się lub zacyklone krawędzie między naszymi wierzchołkami, stąd można uprościć graf w następujący usuwając powtórzenia i pętle.
#upraszczamy sieć S2 poprze usunięcie powtórzeń i pętli
S2b <- simplify(S2, remove.multiple = T, remove.loops = T)
# zobrazujmy uproszczoną sieć
plot(S2b)
Do tej pory operowaliśmy na węzłach i krawędziach, ale zarówno dla
węzłów jak i krawędzi możemy stworzyć atrybuty (cechy). Wpierw zobaczmy
jaka jest obecna stryktura sieci S2 a następnie przypiszemy jej
atrybuty. Możemy sprawdzić wierzchołki
V(nazwa_obiektu)
,
V(S2)
## + 4/4 vertices, named, from 1768124:
## [1] KPMG Deloitte PWC EY
krawędzie E(nazwa_obiektu)
E(S2)
## + 6/6 edges from 1768124 (vertex names):
## [1] KPMG ->KPMG KPMG ->Deloitte Deloitte->KPMG KPMG ->Deloitte
## [5] Deloitte->PWC PWC ->EY
Związek między wierzchołami a krawędziami można pokazać także w formie macierzy (z reguły rzadkiej), w następujący sposób:
S2[]
## 4 x 4 sparse Matrix of class "dgCMatrix"
## KPMG Deloitte PWC EY
## KPMG 1 2 . .
## Deloitte 1 . 1 .
## PWC . . . 1
## EY . . . .
Do tej pory nie zobrazowaliśmy na grafie informacji, kiedy następuje transfer firmy audytorskiej. Ponieważ jest to cecha krawędzi to zbudujmy taką cechę skorzystmy z funkcji V i dopiszemy lata transferu
lata<- c("2015->2016","2016->2017","2017->2018","2018->2019","2019->2020","2020->2021")
E(S2)$lata<-lata
edge_attr(S2)
## $lata
## [1] "2015->2016" "2016->2017" "2017->2018" "2018->2019" "2019->2020"
## [6] "2020->2021"
Zwizualizujmy
plot(S2, edge.label=E(S2)$lata,edge.arrow.size = 0)
Pomniejszy w tej wizualizacji wielkość domyślnej czcionki w grafie
edge.label.cex=0.4
oraz pokażmy zwroty krawędzi
edge.arrow.size = 0.05
plot(S2, edge.label=E(S2)$lata,edge.arrow.size = 1,edge.label.cex=0.4)
Na razie w naszym gafie wydobyliśmy informacje o firmach audytorskich, dynamice zmian (charakterystyka krawędzi), tego czego nie zobrazowaliśmy to zatrudnienie w firmach audytorskich. Zatrudnienie nie jest cechą krawędzie ale wierzchołka. Obecnie wierzchołek mamy opisanty nazwą firmy audytorskiej, wykorzystamy dwie cechy węzła tj. kolor okręgu oraz kolor pola okręgu do ukazania danych o zatrudnieniu. Zacznijmy od koloru pola okręgu: Przypiszmy kolor do wielkości zatrudnienia. Wobec powyższego: 1. Przypiszy atrybut do wieszchołka ‘staff’ opisujący wielość zatrudnienia
V(S2)$staff<-c(223,198,204,187) # przypisujemy atrybuty
vertex_attr(S2) # zobaczmy przypisanie
## $name
## [1] "KPMG" "Deloitte" "PWC" "EY"
##
## $staff
## [1] 223 198 204 187
Zobrazujmy sieć, przy czym pola okręgów będą oznaczone kolorami zależnymi od liczby rewidentóW
plot(S2, edge.label=E(S2)$lata,edge.arrow.size = 0.05,edge.label.cex=0.4,vertex.color=colors(V(S2)$staff) )
## Warning in if (distinct) c[!duplicated(t(col2rgb(c)))] else c: the condition has
## length > 1 and only the first element will be used
Możemy także przypisać indywidualne kolory do poszczególnych firm audytorskich np.:
plot(S2, edge.label=E(S2)$lata,edge.arrow.size = 0.05,edge.label.cex=0.4,vertex.color=c("blue","yellow","green","red") )
A poprzez obramowanie owalu, podzielić na te podmoty któRe mają więcej niż 200 biegłych rewidentóW
plot(S2, edge.label=E(S2)$lata,edge.arrow.size = 0.05,edge.label.cex=0.4,vertex.color=c("brown","yellow","green","red"),
vertex.frame.color=c( "black", "cyan")[1+(V(S2)$staff<200)])
Połączmy skaowanie kolorów pól powierzchni oraz obramowanie kół w jedno
plot(S2, edge.label=E(S2)$lata,edge.arrow.size = 0.05,edge.label.cex=0.4,vertex.color=colors(V(S2)$staff),vertex.frame.color=c( "black", "cyan")[1+(V(S2)$staff<200)] )
## Warning in if (distinct) c[!duplicated(t(col2rgb(c)))] else c: the condition has
## length > 1 and only the first element will be used
Uzupełnijmy naszą sieć o grafikę wierzchołków. A mianowicie czesto chcielibyśmy zobrazować graficznie wierzchołki np. logami firma audytorskich. By tego dokonać należy 1) zbudować bazę danych grafik 2) przepisać grafikę na ich odzwierciedlenie cyfrowe (raster) 3) stworzyć w obiecie igraphic atrybut grafiki. A więc…
#Buduję kontener na obrazki
rasters <- as.list(c(imgType1='',imgType2='',imgType3='',imgType4=''))
rasters jest listą zawierającą cztery obiekty graficzne. W folderze
“path” umieściłem 4 loga graiczne poszczególnych podmotów, by je
skonwertować na obiekty graiczne potrzebujemy uruchomić bibliotekę
library(jpeg)
ewentualnie ją ziainstalować.
library(jpeg)
rasters$imgType1 <- readJPEG("path/KPMG.jpg",native=TRUE)
rasters$imgType2 <- readJPEG("path/PWC.jpg",native=TRUE)
rasters$imgType3 <- readJPEG("path/D.jpg",native=TRUE)
rasters$imgType4 <- readJPEG("path/EY.jpg",native=TRUE)
#połączenie wierzchów z obrazkami Budujemy ramkę danych, w której mamy nazwy wierzchołków i odpowiadające im typy rasterowanych obrazków:
lkp_mat <- data.frame(from=c('KPMG','PWC','Deloitte','EY'),type=c('imgType1','imgType2','imgType3','imgType4'))
a nastepnie połączym typy obrazków z wierzchołakmi w naszym obiecie
igraph, wykorzystamy do tego nazwę wierzchołka ‘name’ oraz ideksy
wierzchołków w obu obiekatach tj. lkp_mat
oraz
S2
w następujący sposób:
for(i in V(S2)$name){
imgtype <- lkp_mat$type[lkp_mat["from"]==i]
V(S2)[name==i]$raster <- rasters[imgtype]
}
To co nam zostaje to wizualizacja dodajemy 1) vertex.shape=“raster” -
by wprowadzić obrazki 2)vertex.label=""
by nie wstawiać
opisu tekstowego
a oto efekt
plot(S2, edge.label=E(S2)$lata,edge.arrow.size = 0.05,edge.label.cex=0.4,vertex.color=colors(V(S2)$staff),
vertex.frame.color=c( "black", "cyan")[1+(V(S2)$staff<200)],
vertex.shape="raster",vertex.size=20, vertex.size2=20,vertex.label="")
## Warning in if (distinct) c[!duplicated(t(col2rgb(c)))] else c: the condition has
## length > 1 and only the first element will be used
Często nie potrzebujemy całej sieci a jedynie jej wycinek, wobec powyższego możemy zerdukować sieć w oparicu charakterystykę wieszchołków lub krawędzi. Zanalizmy tylko dwa wieszchołki a manowicie KPMG i Deloitte.
sel<-c("KPMG","Deloitte") #generujemy listę wierzchołków
S3<- induced.subgraph(graph=S2,vids=sel) #bubujemy subsieć
plot(S3, main="ABB zmiany firm audytorskich") #wizualizujemy
Inteaktywne rysowanie wymaga biblitek networkD3
oraz
danych w postaci ramki danych wobec powyższego włączmy bibliotekę i do
obiecktu egs przypiszy ramkę krawędzi z obiektu S2
library(networkD3)
egs<- as.data.frame(get.edgelist(S2))
p <- simpleNetwork(egs, height=“100px”, width=“100px”,
Source = 1, # column number of source Target = 2, # column number of
target linkDistance = 10, # distance between node. Increase this value
to have more space between nodes charge = -900, # numeric value
indicating either the strength of the node repulsion (negative value) or
attraction (positive value) fontSize = 14, # size of the node names
fontFamily = “serif”, # font og node names linkColour = “#666”, # colour
of edges, MUST be a common colour for the whole graph nodeColour =
“#69b3a2”, # colour of nodes, MUST be a common colour for the whole
graph opacity = 0.9, # opacity of nodes. 0=transparent. 1=no
transparency zoom = T # Can you zoom on the figure? )
Istnieje wiele różnych typów sieci
#Paremetry funkcji plot
Wierzchołki vertex.color kolor wierzchołka vertex.frame.color kolor obramowania wierzchołka vertex.shape Jeden z “none”, “circle”, “square”, “csquare”, “rectangle” “crectangle”, “vrectangle”, “pie”, “raster”, lub “sphere” vertex.size Wielkość wierzchołka (domyślnie to 15) vertex.size2 Duga wielkość wierzchołka (naprzykład dla prostokąta rectangle) vertex.label Ciąg znakóW słuzacy jako nazwa wierzchołka vertex.label.family Czcionka (“Times”, “Helvetica” itd) vertex.label.font Typ cionki: 1 zwykła, 2 pogrubiona, 3, pochyła, 4 pogrubiona i pochyła , 5 symymbol vertex.label.cex Font size (multiplication factor, device-dependent) vertex.label.dist odległość label a wierzchołkiem vertex.label.degree pozycja label w stosunku do wierzchołak, gzie 0 prawo, “pi” lewo, “pi/2” poniżej i “-pi/2” powyżej
Krawędzie edge.color kolor krawędzi edge.width szerokość krawedzie, domyślne =1, edge.arrow.size wielkość strzałki, domyślnie = 1 edge.arrow.width szerokość strzałki, domyślnie =1 edge.lty typ lini 0 dla “braku”, 1 dla “ciągłej”, 2 dla “przerywana”, 3 dla “wykorpkowana”, 4 dla “wykropkowanej i przerywanej”, 5 dla “długa przerywana”, 6 dla “podwójna przerywana” edge.label Ciąg znaków użytych do etykiety karawędzi edge.label.family typ czcionki (“Times”, “Helvetica” itd.) edge.label.font Font: 1 plain, 2 bold, 3, italic, 4 bold italic, 5 symbol edge.label.cex wiekość czcionki w etykiecie edge.curved zakrzywienie krawędzi, w zakresie 0-1 (FALSE to 0, TRUE to 0.5) arrow.mode wektor wskazujący czy ma być strzałka, możliew stay: 0 no arrow, 1 back, 2 forward, 3 both Inne margin Empty space margins around the plot, vector with length 4 frame jeśli TRUE, graf będzie obramowany main jeśli ustawione będzie wskazany tytuł gafu sub podtytuł grafu
Marco Van Fun Marco Van Fun jest dyrektorem banku spółdzielczego w Gliwicach, dziś właśnie otrzymał co miesięczny raport realizacji portfela kredytowego. W 10 największych ekspozycjach znajduje się kredyt udzielony Ośrodkowi Doradctwa Rolniczego (ODR) w Dobrzeniu Wielkim, na kwotę 70 milionów złotych. Kredyt został zabezpieczony udziałami ODR w spółce RodzinaNaSwoim Sp. z o.o. w momencie udzielenia kredytu tj. 12 miesięcy temu RodzinaNaSwoim była grupą kapitałową o takiej strukturze:
Babcia sp. z.o. Wnuczek sp. z o.o. Wujek s.a. Kuzyn s.r.o Zwroty wektorów wskazują na kontrolę, zaś wielkości procentowe na poziomo kontroli i wpływu. Udziałowcami rodziny na swojej oprócz Wnuczka sp. z o.o. (40%) były także osoby fizyczne, babcia (10)%, mama (20%), tata (15%), dziecko (10%), wnuczka (5%). Raport wskazuje na następujące transakcje ze stronami powiązanymi za ostatnie 12 miesięcy.
Strona nal. | Strona zob. | Wart. trans. | Wart. godz. |
RnS | Mama | 100 | 90 |
Mama | RnS | 300 | 350 |
RnS | Mama | 200 | 100 |
RnS | Wnuczek | 500 | 550 |
Wujek | RnS | 111 | 100 |
Wujek | Tata | 120 | 220 |
Wujek | Babci | 100 | 100 |
Babcia | RnS | 500 | 350 |
Babcia | Mama | 702 | 560 |
TaTa | RnS | 200 | 210 |
RnS | Tata | 300 | 100 |
W sprawozdaniach przekazanych we wniosku kredytowym, była wykazana jedna transakcja ze stronami powiązanym Mama sp. z o.o. sprzedała RodzinieNaSwoim, produkty za kwotę 100 milionów o wartości godziwej 130 milionów.
Do wykonania:
Pokaż graficzne transakcje ze stronami powiązanymi w wartościach netto
Wskaż Markowi jaką miarę ryzyka zabezpieczenia powinien zastosować.
Wskazówka Omówienie idei artykułu: Staszkiewicz, P. (2011). Ryzyko struktury. Szkic koncepcyjny. (K. Jajuga & W. Ronka-Chmielowiec, Eds.) Inwestycje finansowe i ubezpieczenia - tendencje światowe a rynek polski, 183, 378–384.
Interatkywne rysowanie sieci w 3d interaktywny
Sprawnie napisany przewodnik po igraphie zajdziecie tutaj.
W jaki sposób polinkować grafiki do wierzchołków image link
W jaki sposób zobrazować wycinek sieci generowanie podsieci