Work with Medieval Networks

A Brief Analysis of Networks of Medieval Conflict.

Noah Milstein true
2022-02-10

Briefly Describe the Dataset You Are Using:

Question: Identify initial network format

Network Structure: Wars Startings in the 1000s

 Network attributes:
  vertices = 117 
  directed = TRUE 
  hyper = FALSE 
  loops = FALSE 
  multiple = TRUE 
  bipartite = FALSE 
  total edges= 153 
    missing edges= 0 
    non-missing edges= 153 

 Vertex attribute names: 
    vertex.names 

No edge attributes

Network Structure: Wars Startings in the 1100s

 Network attributes:
  vertices = 78 
  directed = TRUE 
  hyper = FALSE 
  loops = FALSE 
  multiple = TRUE 
  bipartite = FALSE 
  total edges= 225 
    missing edges= 0 
    non-missing edges= 225 

 Vertex attribute names: 
    vertex.names 

No edge attributes

Network Structure: Wars Startings in the 1200s

 Network attributes:
  vertices = 161 
  directed = TRUE 
  hyper = FALSE 
  loops = FALSE 
  multiple = TRUE 
  bipartite = FALSE 
  total edges= 313 
    missing edges= 0 
    non-missing edges= 313 

 Vertex attribute names: 
    vertex.names 

No edge attributes

Question: Describe and identify the nodes (including how many nodes are in the dataset)

Answer: Nodes or vertices in these datasets represent belligerents in wars throughout history, the involved parties in each conflict can be a nation, province, individual, or group so long as they are listed as involved in the conflict.

Question: What constitutes a tie or edge (including how many ties, whether ties are directed/undirected and weighted/binary, and how to interpret the value of the tie if any)

Answer: A tie or edge in this dataset represents a war, this war can be between two nations or groups within a nation. These edges can represent a war that involved many more nations but are always tied to each and every party involved on both sides. These edges are directed and the direction indicates which side “won” the conflict.

Question: Whether or not there are edge attributes that might be used to subset data or stack multiple networks (e.g., tie type, year, etc).

Answer: There are a number of attributes that could be used to subset the data, years that the conflict began or the length of time it lasted are available. Aspects like each side’s religion and the area where the conflict took place.

Closeness Betweeness and Eigenvector Centrality

Question: Calculate closeness, betweenness and eigenvector centrality measures for your network data, and bonachic-power if possible. Compare these measures to basic degree centrality measures. Try to interpret the results. Are there any interesting patterns in the distribution of measures or correlations between them that provide insight into the measures?

Centralization: Wars Startings in the 1000s

name totdegree indegree outdegree eigen
County of Apulia 7 0 7 0.000000
County of Aversa 5 0 5 0.000000
Kingdom of Sicily 8 3 5 0.000000
Ghaznavids 2 0 2 0.000000
Kingdom of Poland 1 0 1 0.182744
Kingdom of Hungary 3 0 3 0.000000

centralization(wars_in_1000s_network, degree, cmode="outdegree") %>% kable()
x
0.1016647
centralization(wars_in_1000s_network, degree, cmode="indegree") %>% kable()
x
0.0494946
centralization(wars_in_1000s_network, degree) %>% kable()
x
0.0674663

As can be seen above I have coded measures of indegree, outdegree, and total centralization in the wars in the 1000s dataset.

Centralization: Wars Startings in the 1100s

name totdegree indegree outdegree eigen
Sultanate of Rum 23 0 23 0.2893116
Danishmends 13 0 13 0.0690251
Seljuk Emirate of Aleppo 13 0 13 0.0690251
Kingdom of Jerusalem 23 11 12 0.5378974
Fatimids of Egypt 1 0 1 0.0973860
Kingdom of Norway 4 0 4 0.0398827

centralization(wars_in_1100s_network, degree, cmode="outdegree") %>% kable()
x
0.2646315
centralization(wars_in_1100s_network, degree, cmode="indegree") %>% kable()
x
0.1593861
centralization(wars_in_1100s_network, degree) %>% kable()
x
0.1148325

I do the same above and calculate measures of indegree, outdegree, and total centralization in the wars in the 1100s dataset.

Centralization: Wars Startings in the 1200s

name totdegree indegree outdegree eigen
Forces of Bohemond IV of Antioch 3 0 3 0.0000000
Knights Templar 22 3 19 0.4663665
Ayyubid Emirate of Aleppo 3 0 3 0.0000000
Kingdom of Jerusalem 3 0 3 0.0000000
Sultanate of Rum 3 0 3 0.0000000
Holy Roman Empire 11 6 5 0.1770181

centralization(wars_in_1200s_network, degree, cmode="outdegree") %>% kable()
x
0.2016016
centralization(wars_in_1200s_network, degree, cmode="indegree") %>% kable()
x
0.0758203
centralization(wars_in_1200s_network, degree) %>% kable()
x
0.1174332

Finally I calculate measures of indegree, outdegree, and total centralization in the wars in the 1200s dataset.

Eigenvector Centralization

Question: You may also want to identify whether the same node(s) are more/less central using the different measures, and see if you can find any patterns in the results based on which nodes are high/low on each measures. Discuss (with any related evidence) whether or not the node(s) behavior is in line with or violates expectations based on the degree centrality measure, comparing across those measures using a data frame similar to that constructed in the syntax. Be sure to share your assignment with group members for comments.

name totdegree indegree outdegree eigen rc eigen.rc dc eigen.dc
Byzantine Empire 18 5 13 0.478430 0.3571429 0.1708679 0.6428571 0.3075621
Holy Roman Empire 15 2 13 0.295686 1.0000000 0.2956860 0.0000000 0.0000000
Mirdasid Emirate of Aleppo 1 0 1 0.295686 0.0000000 0.0000000 1.0000000 0.2956860
Kingdom of Georgia 5 1 4 0.295686 0.0769231 0.0227451 0.9230769 0.2729409
Duklja 1 0 1 0.295686 0.0000000 0.0000000 1.0000000 0.2956860
name totdegree indegree outdegree eigen rc eigen.rc dc eigen.dc
Kingdom of Jerusalem 23 11 12 0.5378974 0.2980769 0.1603348 0.7019231 0.3775626
Ayyubid Dynasty 18 10 8 0.5188525 0.3200000 0.1660328 0.6800000 0.3528197
Sultanate of Rum 23 0 23 0.2893116 0.0000000 0.0000000 1.0000000 0.2893116
Holy Roman Empire 12 8 4 0.2303733 0.0892857 0.0205690 0.9107143 0.2098042
Almoravid Dynasty 10 0 10 0.2202864 0.0000000 0.0000000 1.0000000 0.2202864
name totdegree indegree outdegree eigen rc eigen.rc dc eigen.dc
Knights Templar 22 3 19 0.4663665 0.1428571 0.0666238 0.8571429 0.3997427
Ayyubid Dynasty 23 9 14 0.4263748 0.1046512 0.0446206 0.8953488 0.3817542
Bahris 7 0 7 0.2911519 0.0000000 0.0000000 1.0000000 0.2911519
Republic of Genoa 18 5 13 0.2880895 0.1428571 0.0411556 0.8571429 0.2469339
Mongol Empire 41 7 34 0.2228895 0.1206897 0.0269005 0.8793103 0.1959891

Answer: Looking at the outputs above we see that regular eigenvector centrality, which accounts for the centrality of nodes attached to our node of interest. Here we see the top 5 highest observations in each dataset, in the 1000s the Byzantine Empire has the highest war, which is logical historically as they represented a bridge between major fighting factions in the Crusades between the Muslim Middle East and European west. The Kingdom of Jerusalem in the 1100s would also be connected, through its wars to other important powers being contested territory between Muslim empires like the Ayyubid Dynasty and crusading states like the Holy Roman Empire.

arrange(wars_in_1000s.nodes.stat, desc(eigen.rc
))%>%
  slice(1:5) %>% kable()
name totdegree indegree outdegree eigen rc eigen.rc dc eigen.dc
Holy Roman Empire 15 2 13 0.295686 1.0000000 0.2956860 0.0000000 0.0000000
Byzantine Empire 18 5 13 0.478430 0.3571429 0.1708679 0.6428571 0.3075621
Sultanate of Rum 11 7 4 0.295686 0.1186441 0.0350814 0.8813559 0.2606046
Kingdom of Georgia 5 1 4 0.295686 0.0769231 0.0227451 0.9230769 0.2729409
Kingdom of France 10 3 7 0.182744 0.1034483 0.0189046 0.8965517 0.1638394
arrange(wars_in_1100s.nodes.stat, desc(eigen.rc
))%>%
  slice(1:5) %>% kable()
name totdegree indegree outdegree eigen rc eigen.rc dc eigen.dc
Ayyubid Dynasty 18 10 8 0.5188525 0.3200000 0.1660328 0.6800000 0.3528197
Kingdom of Jerusalem 23 11 12 0.5378974 0.2980769 0.1603348 0.7019231 0.3775626
Fatimid Caliphate 17 7 10 0.2202864 0.2884615 0.0635442 0.7115385 0.1567423
Zengid Dynasty 16 6 10 0.2202864 0.1714286 0.0377634 0.8285714 0.1825230
Republic of Venice 6 1 5 0.0797655 0.3333333 0.0265885 0.6666667 0.0531770
arrange(wars_in_1200s.nodes.stat, desc(eigen.rc
))%>%
  slice(1:5) %>% kable()
name totdegree indegree outdegree eigen rc eigen.rc dc eigen.dc
Knights Templar 22 3 19 0.4663665 0.1428571 0.0666238 0.8571429 0.3997427
Ayyubid Dynasty 23 9 14 0.4263748 0.1046512 0.0446206 0.8953488 0.3817542
Republic of Genoa 18 5 13 0.2880895 0.1428571 0.0411556 0.8571429 0.2469339
Kingdom of Cyprus 11 4 7 0.2025283 0.1428571 0.0289326 0.8571429 0.1735957
Mongol Empire 41 7 34 0.2228895 0.1206897 0.0269005 0.8793103 0.1959891

Answer: Reflected centrality represents the centrality one nation receives from another another that is attributable to the first nations contribution to the other nations score. Looking at reflected centrality through wars we see relatively similar trends. In the 1000s the Holy Roman Empire and Byzantine Empire play a distinct role in the crusades so in this case we see how central a nation is in conflict dependent on how much centrality they contribute to a nation they have a conflict with. Being focal points in the center of Europe in the case of the HRE and the focal point of Christian, Muslim conflict in the case of the Byzantine empire. For both fighting minor nations gives the two a great deal of centrality to other, potentially less central groups that they fight. The Ayyubids and Kingdom of Jerusalem that each occupy a central position in conflict. Into the 1200s the Knights Templar and Ayyubids occupy this position.

arrange(wars_in_1000s.nodes.stat, desc(eigen.dc

))%>%
  slice(1:5) %>% kable()
name totdegree indegree outdegree eigen rc eigen.rc dc eigen.dc
Byzantine Empire 18 5 13 0.478430 0.3571429 0.1708679 0.6428571 0.3075621
Mirdasid Emirate of Aleppo 1 0 1 0.295686 0.0000000 0.0000000 1.0000000 0.2956860
Duklja 1 0 1 0.295686 0.0000000 0.0000000 1.0000000 0.2956860
Great Seljuq Empire 4 0 4 0.295686 0.0000000 0.0000000 1.0000000 0.2956860
Kingdom of Georgia 5 1 4 0.295686 0.0769231 0.0227451 0.9230769 0.2729409
arrange(wars_in_1100s.nodes.stat, desc(eigen.dc

))%>%
  slice(1:5) %>% kable()
name totdegree indegree outdegree eigen rc eigen.rc dc eigen.dc
Kingdom of Jerusalem 23 11 12 0.5378974 0.2980769 0.1603348 0.7019231 0.3775626
Ayyubid Dynasty 18 10 8 0.5188525 0.3200000 0.1660328 0.6800000 0.3528197
Sultanate of Rum 23 0 23 0.2893116 0.0000000 0.0000000 1.0000000 0.2893116
Almoravid Dynasty 10 0 10 0.2202864 0.0000000 0.0000000 1.0000000 0.2202864
Abbasid Caliphate 10 0 10 0.2202864 0.0000000 0.0000000 1.0000000 0.2202864
arrange(wars_in_1200s.nodes.stat, desc(eigen.dc

))%>%
  slice(1:5) %>% kable()
name totdegree indegree outdegree eigen rc eigen.rc dc eigen.dc
Knights Templar 22 3 19 0.4663665 0.1428571 0.0666238 0.8571429 0.3997427
Ayyubid Dynasty 23 9 14 0.4263748 0.1046512 0.0446206 0.8953488 0.3817542
Bahris 7 0 7 0.2911519 0.0000000 0.0000000 1.0000000 0.2911519
Republic of Genoa 18 5 13 0.2880895 0.1428571 0.0411556 0.8571429 0.2469339
Anti-Imperial faction 7 0 7 0.2025283 0.0000000 0.0000000 1.0000000 0.2025283

Answer: Finally Derived Centrality measures the centrality a nation receives from fighting another nation that is not a reflection of the first nation’s contribution of centrality to the others. Here the Byzantine Empire remains one of the largest, potentially suggesting their status as a cosmopolitan being high in both derived and reflected centrality. However, nations like the Mirdasid Emirate of Aleppo have little to no reflected centrality by high derived centrality suggesting that they are are a pure bridge.

wars_in_1000s.nodes<-data.frame(name=V(wars_in_1000s.ig)$name,
    totdegree=igraph::degree(wars_in_1000s.ig, loops=FALSE),
    indegree=igraph::degree(wars_in_1000s.ig, mode="in", loops=FALSE),
    outdegree=igraph::degree(wars_in_1000s.ig, mode="out", loops=FALSE))

wars_in_1100s.nodes<-data.frame(name=V(wars_in_1100s.ig)$name,
    totdegree=igraph::degree(wars_in_1100s.ig, loops=FALSE),
    indegree=igraph::degree(wars_in_1100s.ig, mode="in", loops=FALSE),
    outdegree=igraph::degree(wars_in_1100s.ig, mode="out", loops=FALSE))

wars_in_1200s.nodes<-data.frame(name=V(wars_in_1200s.ig)$name,
    totdegree=igraph::degree(wars_in_1200s.ig, loops=FALSE),
    indegree=igraph::degree(wars_in_1200s.ig, mode="in", loops=FALSE),
    outdegree=igraph::degree(wars_in_1200s.ig, mode="out", loops=FALSE))

eigen_cent_wars_in_1000s<-centr_eigen(wars_in_1000s.ig,directed=T)

eigen_cent_wars_in_1100s<-centr_eigen(wars_in_1100s.ig,directed=T)

eigen_cent_wars_in_1200s<-centr_eigen(wars_in_1200s.ig,directed=T)

Some Attempts at Visualization

Graph 1:

Explanation: Below I have graphed the network for the 1000s dataset using base plot and an edgelist

plot(wars_in_1000s_edgelist_network_edgelist, vertex.size=2,  edge.arrow.size=.2, vertex.color="gold", vertex.size=20, vertex.frame.color="gray", vertex.label.color="black", vertex.label.cex=0.25, vertex.label.dist=2, edge.curved=0.2)

Graph 2:

Explanation: Next I used the igraph network object and graphed it using the automatic, proportional clustering.

Graph 3:

Explanation: Finally I used the ggplot network and graphed it using a generic network object. This order follows for the visualization of the 1100s datasets and 1200s.

Graph 4:

plot(wars_in_1100s_edgelist_network_edgelist, vertex.size=2,  edge.arrow.size=.2, vertex.color="gold", vertex.size=20, vertex.frame.color="gray", vertex.label.color="black", vertex.label.cex=0.25, vertex.label.dist=2, edge.curved=0.2)

Graph 5:

Graph 6:

Graph 7:

plot(wars_in_1200s_edgelist_network_edgelist, vertex.size=2,  edge.arrow.size=.2, vertex.color="gold", vertex.size=20, vertex.frame.color="gray", vertex.label.color="black", vertex.label.cex=0.25, vertex.label.dist=2, edge.curved=0.2)

Graph 8:

Graph 9:

$mut
[1] 3

$asym
[1] 147

$null
[1] 6636
 [1] 243974  14792    744    288    149    129     11     28     13
[10]      0      1      0      0      1      0      0
[1] 0.06481481
[1] 0.0774983
[1] 0.093224
[1] 0.01117686
[1] 0.03698225
[1] 0.01207515
     name               degree      
 Length:117         Min.   : 1.000  
 Class :character   1st Qu.: 1.000  
 Mode  :character   Median : 1.000  
                    Mean   : 2.615  
                    3rd Qu.: 3.000  
                    Max.   :18.000  
                name degree
15  Byzantine Empire     18
25 Holy Roman Empire     15
28  Sultanate of Rum     11
47 Kingdom of France     10
29  County of Sicily      9
34           England      9
     name               degree      
 Length:117         Min.   : 1.000  
 Class :character   1st Qu.: 1.000  
 Mode  :character   Median : 1.000  
                    Mean   : 2.615  
                    3rd Qu.: 3.000  
                    Max.   :18.000  

Citation

For attribution, please cite this work as

Milstein (2022, Feb. 10). Noah_Milstein_Blog: Work with Medieval Networks. Retrieved from https://nmilsteinuma.github.io/posts/2022-02-10-workwithmedievalnetworks/

BibTeX citation

@misc{milstein2022work,
  author = {Milstein, Noah},
  title = {Noah_Milstein_Blog: Work with Medieval Networks},
  url = {https://nmilsteinuma.github.io/posts/2022-02-10-workwithmedievalnetworks/},
  year = {2022}
}