avaialable from (https://rpubs.com/staszkiewicz/EX_6_NA_PL)

Wprowadzenie

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())

Podstawy

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)

Przykład (dane fikcyjne) wprowadzający

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…

zbudujmy sobie połączenie między firmami a ich logami

#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ć.

rasterujmey obrazki

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

Generowanie podgrafów (podsieci)

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? )

Pozycjonowanie sieci

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

Nota

Zadania do samodzielnej pracy

  • Certech s. 188

Zadanie

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:

  1. Pokaż graficzne transakcje ze stronami powiązanymi w wartościach netto

  2. 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.

Do przeczytania:

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

Staszkiewicz, Piotr, and Renata Karkowska. 2021. “Audit Fee and Banks Communication Sentiment.” Economic Research-Ekonomska Istraživanja, October, 1–21. https://doi.org/10.1080/1331677x.2021.1985567.