#---------------------------------------------------------------- #-------------------------General evolution---------------------- #---------------------------------------------------------------- #' Return graph representing the general attacks evolution by year #' #' @param Attacks data.frame with procesed source data #' @param point.vjust Vector of vertical just to each point label #' @param point.hjust Vector of Horizontal just to each point label #' @param iso2013.y Vertical position to ISO27001:2013 label #' @param iso2013.label.hjust Horizontal just to ISO27001:2013 label #' @param smooth.x Horizontal position to smooth slope label #' @param smooth.y Vertical position to smooth slope label #' @param smooth.label.hjust Horizontal just to smooth slope label #' #' @return list(graph, slope) #' @export GetAttacksEvolution <- function(Attacks, point.vjust = 0, point.hjust = 0, iso2013.y = 0, iso2013.label.hjust = 0, smooth.x = 0, smooth.y = 0, smooth.label.hjust = 0){ #Extracting year from date attacks.evol <- dplyr::mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% dplyr::group_by(Year)#Grouping by year #Counting attacks each year attacks.evol <- as.data.frame(table(attacks.evol$Year)) colnames(attacks.evol) <- c("Year","Attacks") #Slope of smooth attacks.evol.slope <- lm(formula = Attacks ~ as.numeric(Year), data = attacks.evol)$coef[[2]] #Graph attacks.evol.graph <- ggplot2::qplot(main = "Cyberattacks evolution", x = attacks.evol$Year, y = attacks.evol$Attacks, group = 1, xlab = "Years", ylab = "Attacks", data = attacks.evol, geom = "line") + ggplot2::geom_point() + ggplot2::geom_label(aes(label=attacks.evol$Attacks), vjust = point.vjust, hjust = point.hjust)+ ggplot2::theme(plot.title = element_text(hjust = 0.5)) + ggplot2::geom_smooth(method = "lm", se = FALSE) + ggplot2::geom_label(aes(x = smooth.x, y = smooth.y, label = paste("Slope =", signif(attacks.evol.slope))), color = "blue", hjust = smooth.label.hjust) + ggplot2::geom_vline(xintercept = 3, color = "Red", linetype = "longdash") + ggplot2::geom_label(aes(x = "2014", y = iso2013.y, label = "ISO27001:2013 effects"), color = "Red", hjust = iso2013.label.hjust) list(attacks.evol.graph, attacks.evol.slope) } #' Return graph representing the general ISO27001 evolution #' #' @param Cert_PerCountry data.frame with procesed source data #' @param point.vjust Vector of vertical just to each point label #' @param point.hjust Vector of Horizontal just to each point label #' @param iso2013.y Vertical position to ISO27001:2013 label #' @param iso2013.label.hjust Horizontal just to ISO27001:2013 label #' @param smooth.x Horizontal position to smooth slope label #' @param smooth.y Vertical position to smooth slope label #' @param smooth.label.hjust Horizontal just to smooth slope label #' #' @return list(graph, slope) #' @export GetCertsEvolution <- function(Cert_PerCountry, point.vjust = 0, point.hjust = 0, iso2013.y = 0, iso2013.label.hjust = 0, smooth.x = 0, smooth.y = 0, smooth.label.hjust = 0){ #Years from columns to rows in 1 column Certs.evol <- tidyr::gather(Cert_PerCountry, "Year", "Count", 2:6) #Group by year Certs.evol <- dplyr::group_by(Certs.evol, Year) #Sum counts to 1 row for each year Certs.evol <- dplyr::summarise(Certs.evol, Count = sum(Count)) #Removing X from years Certs.evol$Year <- substr(Certs.evol$Year, 2, 5) #Slope of smooth Certs.evol.slope <- lm(formula = Count ~ as.numeric(Year), data = Certs.evol)$coef[[2]] #Graph Certs.evol.graph <- ggplot2::qplot(main = "ISO 27001 evolution", x = Certs.evol$Year, y = Certs.evol$Count, group = 1, xlab = "Years", ylab = "Certifications", data = Certs.evol, geom = "line") + geom_point() + geom_label(aes(label=Certs.evol$Count), vjust = point.vjust, hjust = point.hjust)+ theme(plot.title = element_text(hjust = 0.5)) + ggplot2::geom_smooth(method = "lm", se = FALSE) + ggplot2::geom_label(aes(x = smooth.x, y = smooth.y, label = paste("Slope =", signif(Certs.evol.slope))), color = "blue", hjust = smooth.label.hjust)+ ggplot2::geom_vline(xintercept = 3, color = "Red", linetype = "longdash") + ggplot2::geom_label(aes(x = "2014", y = iso2013.y, label = "ISO27001:2013 changes"), color = "Red", hjust = iso2013.label.hjust) list(Certs.evol.graph, Certs.evol.slope) } #' Return graph representing the general attacks evolution by month #' #' @param Attacks data.frame with procesed source data #' #' @return graph #' @export GetAttacksMonthEvolution <- function(Attacks){ #Extract Year - Month from date attacks.evol <- mutate(Attacks, Year = format(Attacks$Date, "%Y-%m")) %>% group_by(Year) #Group by Year - Month attacks.evol <- as.data.frame(table(attacks.evol$Year)) colnames(attacks.evol) <- c("Year","Attacks") #Graph ggplot2::qplot(main = "Cyberattacks evolution", x = attacks.evol$Year, y = attacks.evol$Attacks, group = 1, xlab = "Months", ylab = "Attacks", data = attacks.evol, geom = "line") + geom_point() + theme(plot.title = element_text(hjust = 0.5)) + geom_smooth(method = 'loess') + scale_x_discrete(labels = c("2012/01", "", "", "", "", "", "2012/07", "", "", "", "", "", "2013/01", "", "", "", "", "", "2013/07", "", "", "", "", "", "2014/01", "", "", "", "", "", "2014/07", "", "", "", "", "", "2015/01", "", "", "", "", "", "2015/07", "", "", "", "", "", "2016/01", "", "", "", "", "", "2016/07", "", "", "", "", "")) } #---------------------------------------------------------------- #-------------------------Attack type evolution------------------ #---------------------------------------------------------------- #' Return pie graph to show % of each attack type #' #' @param Attacks data.frame with procesed source data #' @param label.vjust Vector of vertical just to each portion label #' @param label.hjust Vector of horizontal just to each portion label #' #' @return list(graph, AttackTypeShowedList) #' @export GetAttackTypePie <- function (Attacks, label.vjust = 0, label.hjust = 0){ #Group by attack type attack.pie <- group_by(Attacks, Attack.standar) #Counting rows for each attack type attack.pie <- as.data.frame(table(attack.pie$Attack.standar)) attack.pie <- setNames(attack.pie, c("Attack", "Count")) #Removing rows without attack type defined attack.pie <- attack.pie[attack.pie$Attack != "",] #Removing attacks with less than 1% of representation from total attack.pie <- attack.pie[attack.pie$Count > (sum(attack.pie$Count) * 0.01),] #Calc % of each attack type attack.pie <- mutate(attack.pie, Perc=paste(round(100 * attack.pie$Count / sum(attack.pie$Count), 2), "%")) #Graph graph1 <- ggplot(data=attack.pie, aes(x=factor(1), y=Count, fill=Attack)) + geom_col(width = 1, color='black') + geom_label(aes(label = attack.pie$Perc), vjust = label.vjust, hjust = label.hjust) + coord_polar(theta="y") + scale_x_discrete(labels = c("")) + scale_y_discrete(labels = c("")) + theme(plot.title = element_text(hjust = 0.5), axis.title.x=element_blank(), axis.title.y=element_blank()) + ggtitle("Attack types") #Returning graph and attack list list(graph1, unique(attack.pie$Attack)) } #' Return graph to show the evolution of a attack types list #' #' @param Attacks data.frame with procesed source data #' @param TypeList List with attack types to show #' #' @return list(graph, data.frame with TypeList attacks data by year) #' @export GetAttackTypeEvolution <- function(Attacks, TypeList){ #Obtaining year from date Attacks.pre <- dplyr::mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Year, Attack.standar) #group by attack type #Count rows for each attack type and each year Attacks.pre <- as.data.frame(table(Attacks.pre$Year, Attacks.pre$Attack.standar)) Attacks.pre <- setNames(Attacks.pre, c("Year", "Attack", "Count")) #Removing rows without an attack type specified Attacks.pre <- Attacks.pre[Attacks.pre$Attack %in% TypeList,] #Graph graph1 <- ggplot(data = Attacks.pre, aes(x = Year, y = Count, color = Attack, group = Attack)) + geom_point() + geom_line() + theme(plot.title = element_text(hjust = 0.5)) + ggtitle("Attack type evolution") + labs(colour = "Attack type") + xlab("Years") + ylab("Attacks") #Return graph and used data to separate representation list(graph1, Attacks.pre) } #' Return graph to show the evolution of a single attack type and his smooth #' #' @param Attacks data.frame with procesed source data #' @param AttackType Attack type to represent #' @param smooth.x Horizontal position to smooth slope label #' @param smooth.y Vertical position to smooth slope label #' @param smooth.label.hjust Horizontal just to smooth slope label #' #' @return list(graph, slope) #' @export GetAttackTypeSigleEvolution <- function(Attacks, AttackType, smooth.x = 0, smooth.y = 0, smooth.label.hjust = 0){ #Filtering for the AttackType specified attacks.evol <- Attacks[Attacks$Attack == AttackType,] #Cal slope slope1 <- lm(formula = Count ~ as.numeric(Year), data = attacks.evol)$coef[[2]] #Graph graph1 <- ggplot(data = attacks.evol, aes(x = Year, y = Count, group = 1)) + geom_line() + geom_point() + theme(plot.title = element_text(hjust = 0.5)) + ggtitle(AttackType) + xlab("Years") + ylab("Attacks")+ geom_smooth(method = "lm", se = FALSE) + geom_label(aes(x = smooth.x, y = smooth.y, label = paste("Slope =", signif(slope1, 5))), color = "blue", hjust = smooth.label.hjust) #Returning list(graph, slope) list(graph1, slope1) } #---------------------------------------------------------------- #-------------------------Geolocal evolution--------- #---------------------------------------------------------------- #' Return pie graph to show % of attacks and certifications for each continent #' #' @param Attacks data.frame with procesed source data of attacks #' @param Attacks.label.vjust Vector of vertical just to each portion label #' @param Attacks.label.hjust Vector of horizontal just to each portion label #' @param Cert_PerCountry data.frame with procesed source data of certifications #' @param Certs.label.vjust Vector of vertical just to each portion label #' @param Certs.label.hjust Vector of horizontal just to each portion label #' #' @return list(AttacksGraph, CertsGraph, ContinentListToStudy) #' @export GetContinentPie <- function (Attacks, Attacks.label.vjust = 0, Attacks.label.hjust = 0, Cert_PerCountry, Certs.label.vjust = 0, Certs.label.hjust = 0){ #Group attacks by continent attack.pie <- group_by(Attacks, Continent) #Count attacks for each continent attack.pie <- as.data.frame(table(attack.pie$Continent)) attack.pie <- setNames(attack.pie, c("Continent", "Count")) #Remove rows without Continent specified attack.pie <- attack.pie[attack.pie$Continent != "",] #Calc % of each continent attack.pie <- mutate(attack.pie, perc = round(100 * attack.pie$Count / sum(attack.pie$Count), 2)) #Attacks graph graph1 <- ggplot(data=attack.pie, aes(x=factor(1), y=Count, fill=Continent)) + geom_col(width = 1, color='black') + geom_label(aes(label=paste(attack.pie$perc, "%")), vjust = Attacks.label.vjust, hjust = Attacks.label.hjust) + coord_polar(theta="y") + scale_x_discrete(labels = c("")) + scale_y_discrete(labels = c("")) + theme(plot.title = element_text(hjust = 0.5), axis.title.x=element_blank(), axis.title.y=element_blank()) + ggtitle("Attacks") #Grouping certifications by continent cert.pie <- group_by(Cert_PerCountry, Continent) #Counting certificates for each continent cert.pie <- dplyr::summarise(cert.pie, Count = sum(X2011 + X2012 + X2013 + X2014 + X2015)) #Remove rows without Continent specified cert.pie <- cert.pie[cert.pie$Continent != "",] #Calc % of each continent cert.pie <- mutate(cert.pie, perc = round(100 * cert.pie$Count / sum(cert.pie$Count), 2)) #Certifications graph graph2 <- ggplot(data=cert.pie, aes(x=factor(1), y=Count, fill=Continent)) + geom_col(width = 1, color='black') + geom_label(aes(label=paste(cert.pie$perc, "%")), vjust = Certs.label.vjust, hjust = Certs.label.hjust) + coord_polar(theta="y") + scale_x_discrete(labels = c("")) + scale_y_discrete(labels = c("")) + theme(plot.title = element_text(hjust = 0.5), axis.title.x=element_blank(), axis.title.y=element_blank()) + ggtitle("ISO 27001") #Return graphs and union of continent to study list(graph1, graph2, union(unique(attack.pie[attack.pie$perc > 5,]$Continent), unique(cert.pie[cert.pie$perc > 5,]$Continent))) } #' Return graph to show the evolution of a attack types list #' #' @param Attacks data.frame with procesed source data #' @param ContinentList List with continents to show #' #' @return list(graph, data.frame with ContinentList attacks data by year) #' @export GetContinentAttacksEvolution <- function(Attacks, ContinentList){ #Extract year from date attacks.evol <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Continent, Year) #Grouping atacks by continent and year #Counting attacks for each continent and year attacks.evol <- as.data.frame(table(attacks.evol$Continent, attacks.evol$Year)) colnames(attacks.evol) <- c("Continent", "Year","Attacks") #Filtering by the ContinentList especified attacks.evol <- attacks.evol[attacks.evol$Continent %in% ContinentList,] #Graph graph1 <- ggplot2::qplot(main = "Cyberattacks evolution", x = attacks.evol$Year, y = attacks.evol$Attacks, group = Continent, xlab = "Years", ylab = "Attacks", data = attacks.evol, geom = "point", color = Continent) + geom_line() + theme(plot.title = element_text(hjust = 0.5)) #Return graph and data to represent 1b1 list(graph1, attacks.evol) } #' Return graph to show the evolution of certifications in a continent list #' #' @param Cert_PerCountry data.frame with procesed source data #' @param ContinentList List with continents to show #' #' @return list(graph, data.frame with ContinentList certifications data by year) #' @export GetContinentCertsEvolution <- function(Cert_PerCountry, ContinentList){ #Collapsing year columns to 1 column with year value certs.evol <- gather(Cert_PerCountry, "Year", "Certs", 2:6) %>% group_by(Continent, Year) #Grouping by continent and year #Sum of certifications for echa continent and year certs.evol <- summarise(certs.evol, Certs = sum(Certs)) #Removing the X from year values certs.evol$Year <- substr(certs.evol$Year,2,5) #Filtering for the specified continents certs.evol <- certs.evol[certs.evol$Continent %in% ContinentList,] #graph graph1 <- ggplot2::qplot(main = "ISO 27001 evolution", x = certs.evol$Year, y = certs.evol$Certs, group = Continent, xlab = "Years", ylab = "Certifications", data = certs.evol, geom = "point", color = Continent) + geom_line() + theme(plot.title = element_text(hjust = 0.5)) #Return the graph and data to represent continents 1b1 list(graph1, certs.evol) } #' Return graph to show the evolution of attacks in a single continent and his smooth #' #' @param Attacks data.frame with procesed source data #' @param Continent Continent to represent #' @param smooth.x Horizontal position to smooth slope label #' @param smooth.y Vertical position to smooth slope label #' @param smooth.label.hjust Horizontal just to smooth slope label #' #' @return list(graph, slope) #' @export GetContinentAttacksSigleEvolution <- function(Attacks, Continent, smooth.x = 0, smooth.y = 0, smooth.label.hjust = 0){ #Filtering for the continent specified attacks.evol <- Attacks[Attacks$Continent == Continent,] #Calc slope slope1 <- lm(formula = Attacks ~ as.numeric(Year), data = attacks.evol)$coef[[2]] #Graph graph1 <- ggplot(data = attacks.evol, aes(x = Year, y = Attacks, group = 1)) + geom_line() + geom_point() + theme(plot.title = element_text(hjust = 0.5)) + ggtitle(Continent) + xlab("Years") + ylab("Attacks")+ geom_smooth(method = "lm", se = FALSE) + geom_label(aes(x = smooth.x, y = smooth.y, label = paste("Slope =", signif(slope1, 5))), color = "blue", hjust = smooth.label.hjust) #Returning list(graph, slope) list(graph1, slope1) } #' Return graph to show the evolution of certifications in a single continent and his smooth #' #' @param Certs_byContinent data.frame with procesed source data #' @param Continent Continent to represent #' @param smooth.x Horizontal position to smooth slope label #' @param smooth.y Vertical position to smooth slope label #' @param smooth.label.hjust Horizontal just to smooth slope label #' #' @return list(graph, slope) #' @export GetContinentCertsSingleEvolution <- function(Certs_byContinent, Continent, smooth.x = 0, smooth.y = 0, smooth.label.hjust = 0){ #Filtering for the continent specified certs.evol <- Certs_byContinent[Certs_byContinent$Continent == Continent,] #Calc slope slope1 <- lm(formula = Certs ~ as.numeric(Year), data = certs.evol)$coef[[2]] #Graph graph1 <- ggplot(data = certs.evol, aes(x = Year, y = Certs, group = 1)) + geom_line() + geom_point() + theme(plot.title = element_text(hjust = 0.5)) + ggtitle(Continent) + xlab("Years") + ylab("Certifications")+ geom_smooth(method = "lm", se = FALSE) + geom_label(aes(x = smooth.x, y = smooth.y, label = paste("Slope =", signif(slope1, 5))), color = "blue", hjust = smooth.label.hjust) #Returning list(graph, slope) list(graph1, slope1) } #' Return graph to show the attacks by country #' #' @param Attacks data.frame with procesed source data of attacks #' @param Attacks.label.vjust Vector of vertical just to each portion label #' @param Attacks.label.hjust Vector of horizontal just to each portion label #' @param Cert_PerCountry data.frame with procesed source certifications #' @param Certs.label.vjust Vector of vertical just to each portion label #' @param Certs.label.hjust Vector of horizontal just to each portion label #' #' @return list(AttacksGraph, CertsGraph, CountryListToStudy) GetCountriesCol <- function(Attacks, Attacks.label.vjust = 0, Attacks.label.hjust = 0, Cert_PerCountry, Certs.label.vjust = 0, Certs.label.hjust = 0){ #Group attacks by continent and country attacks.col <- group_by(Attacks, Continent, Country) #Count attacks for each country attacks.col <- as.data.frame(table(attacks.col$Continent, attacks.col$Country)) attacks.col <- setNames(attacks.col, c("Continent", "Country", "Count")) #Remove rows without Continent/Country specified attacks.col <- attacks.col[attacks.col$Country != "",] attacks.col <- attacks.col[attacks.col$Country != "AU",] #Abnormal behaivour, corrupt?? attacks.col <- attacks.col[attacks.col$Continent != "",] #Only the countries with more than 2% of total attacks attacks.col <- attacks.col[attacks.col$Count > (sum(attacks.col$Count) * 0.015), ] #Sort by attacks attacks.col <- arrange(attacks.col, desc(Count)) #Attacks graph graph1 <- ggplot2::ggplot(aes(x = reorder(Country, Count), y = Count), data = attacks.col) + geom_col(aes(fill = Continent)) + geom_text(aes(label = attacks.col$Count), vjust = Attacks.label.vjust, hjust = Attacks.label.hjust, size = 3) + theme(plot.title = element_text(hjust = 0.5)) + ggtitle("Attacks") + xlab("Country") + ylab("Attacks") #Grouping certifications by continent certs.col <- group_by(Cert_PerCountry, Continent, country_short) #Counting certificates for each continent certs.col <- dplyr::summarise(certs.col, Count = sum(X2011 + X2012 + X2013 + X2014 + X2015)) #Remove rows without Continent specified certs.col <- certs.col[certs.col$Continent != "",] certs.col <- certs.col[certs.col$country_short != "",] #Only the countries with more than 2% of total certs certs.col <- certs.col[certs.col$Count > (sum(certs.col$Count) * 0.02), ] #Sort by certifications certs.col <- arrange(certs.col, desc(Count)) #Certifications graph graph2 <- ggplot2::ggplot(aes(x = reorder(country_short, Count), y = Count), data = certs.col) + geom_col(aes(fill = Continent)) + geom_text(aes(label = certs.col$Count), vjust = Certs.label.vjust, hjust = Certs.label.hjust, size = 3) + theme(plot.title = element_text(hjust = 0.5)) + ggtitle("ISO 27001") + xlab("Country") + ylab("Certifications") #Return graphs and union of countries to study list(graph1, graph2, union(unique(head(attacks.col$Country, 3)), unique(head(certs.col$country_short, 3)))) } #' Return graph to show the evolution of attacks in a single continent and his smooth #' #' @param Attacks data.frame with procesed source data #' @param Country Country to represent #' @param smooth.x Horizontal position to smooth slope label #' @param smooth.y Vertical position to smooth slope label #' @param smooth.label.hjust Horizontal just to smooth slope label #' #' @return list(graph, slope) #' @export GetCountriesAttacksSingleEvolution <- function(Attacks, Country, smooth.x = 0, smooth.y = 0, smooth.label.hjust = 0){ #Extract year from date attacks.evol <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Year, Country) #Group by country #Count attacks for each year and country attacks.evol <- as.data.frame(table(attacks.evol$Year, attacks.evol$Country)) attacks.evol <- setNames(attacks.evol, c("Year", "Country", "Count")) #Filter by the specified country attacks.evol <- attacks.evol[attacks.evol$Country == Country,] #Calc slope slope1 <- lm(formula = Count ~ as.numeric(Year), data = attacks.evol)$coef[[2]] #Graph graph1 <- ggplot(data = attacks.evol, aes(x = Year, y = Count, group = 1)) + geom_line() + geom_point() + theme(plot.title = element_text(hjust = 0.5)) + ggtitle(paste("Cyberattacks -", Country)) + xlab("Years") + ylab("Attacks")+ geom_smooth(method = "lm", se = FALSE) + geom_label(aes(x = smooth.x, y = smooth.y, label = paste("Slope =", signif(slope1, 5))), color = "blue", hjust = smooth.label.hjust) #Return list(graph, slope) list(graph1, slope1) } #' Return graph to show the evolution of certifications in a single continent and his smooth #' #' @param Attacks data.frame with procesed source data #' @param Country Country to represent #' @param smooth.x Horizontal position to smooth slope label #' @param smooth.y Vertical position to smooth slope label #' @param smooth.label.hjust Horizontal just to smooth slope label #' #' @return list(graph, slope) #' @export GetCountriesCertsSingleEvolution <- function(Cert_PerCountry, Country, smooth.x = 0, smooth.y = 0, smooth.label.hjust = 0){ #Collapsing year columns to only one with the year value certs.evol <- gather(Cert_PerCountry, "Year", "Certs", 2:6) %>% group_by(country_short, Year) #Group by country and year #sum certificates for each country and year certs.evol <- summarise(certs.evol, Certs = sum(Certs)) #Removing the X of the year values certs.evol$Year <- substr(certs.evol$Year,2,5) #Filter by the specified Country certs.evol <- certs.evol[certs.evol$country_short == Country,] #Calc slope slope1 <- lm(formula = Certs ~ as.numeric(Year), data = certs.evol)$coef[[2]] #Graph graph1 <- ggplot(data = certs.evol, aes(x = Year, y = Certs, group = 1)) + geom_line() + geom_point() + theme(plot.title = element_text(hjust = 0.5)) + ggtitle(paste("ISO 27001 -", Country)) + xlab("Years") + ylab("Certifications")+ geom_smooth(method = "lm", se = FALSE) + geom_label(aes(x = smooth.x, y = smooth.y, label = paste("Slope =", signif(slope1, 5))), color = "blue", hjust = smooth.label.hjust) #Return graph and slope list(graph1, slope1) } #---------------------------------------------------------------- #-------------------------gelocal/type--------------------------- #---------------------------------------------------------------- #' Return graph representing % of attacks type by continent #' #' @param Attacks data.frame with procesed source data #' @param Country Country to represent on the left side #' @param Country2 Country to represent on the right side #' #' @return Graph #' @export GetContinentAttackCol <- function (Attacks, Country, Country2){ #Grouping attacks by attack type and country attack.pie <- group_by(Attacks, Attack.standar, Country) #Counting attacks for each attack type and country attack.pie <- as.data.frame(table(attack.pie$Country, attack.pie$Attack.standar)) attack.pie <- setNames(attack.pie, c("Country", "Attack", "Count")) #Remove rows withouth a country specified attack.pie <- attack.pie[attack.pie$Country != "",] #Remove rows withouth attack type specified attack.pie <- attack.pie[attack.pie$Attack != "",] #grouping non 'important' attack types in 'Otros' attack.pie$Attack <- as.character(attack.pie$Attack) attack.pie[attack.pie$Attack != "DDoS" & attack.pie$Attack != "Defacement" & attack.pie$Attack != "Injection",]$Attack <- "Otros" attack.pie$Attack <- as.factor(attack.pie$Attack) #Grouping atatcks by attacky type and country attack.pie <- group_by(attack.pie, Attack, Country) #sum attacks for each attack type and country attack.pie <- summarise(attack.pie, Count = sum(Count)) #Filtering by the desired countries attack.pie.C1 <- attack.pie[attack.pie$Country == Country,] attack.pie.C2 <- attack.pie[attack.pie$Country == Country2,] #Calc % of each attack type attack.pie.C1$perc <- round(100 * attack.pie.C1$Count / sum(attack.pie.C1$Count), 2) attack.pie.C2$perc <- round(100 * attack.pie.C2$Count / sum(attack.pie.C2$Count), 2) #Calc max % to draw gray background attack.pie.max <- data.frame(Attack = attack.pie.C1$Attack) percs <- c() for (AT in attack.pie.max$Attack){ percs <- c(percs, max(attack.pie.C1[attack.pie.C1$Attack == AT,]$perc, attack.pie.C2[attack.pie.C2$Attack == AT,]$perc)) } attack.pie.max$perc <- percs graph1 <- ggplot() + geom_col(aes(x=Attack, y=perc), width = 1, data = attack.pie.max, color = "Black", fill = "Grey") + geom_col(aes(x=1.25:4.25, y=perc, fill = Country), width = 0.4, data = attack.pie.C1) + geom_text(aes(x=1.25:4.25, y=perc + 1, label = paste(perc, "%")), data = attack.pie.C1) + geom_col(aes(x=0.75:3.75, y=perc, fill = Country2), width = 0.4, data = attack.pie.C2) + geom_text(aes(x=0.75:3.75, y=perc + 1, label = paste(perc, "%")), data = attack.pie.C2) + scale_x_discrete("Attack", attack.pie.C1$Attack) + ylab("% of total attacks") + theme(plot.title = element_text(hjust = 0.5)) + ggtitle(paste(Country, Country2, sep = " - ")) graph1 } #' Return graph representing the evolution of attack types in a country #' #' @param Attacks data.frame with procesed source data #' @param Country Country to represent #' #' @return list(Graph, data to represent attacktypes of the country 1b1) GetContinentAttackEvolution <- function(Attacks, Country){ #Extract Year from date attack.evol <-mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Attack.standar, Country, Year) #Group by attack type, country and year #Counting the attacks for each attack type, country and year attack.evol <- as.data.frame(table(attack.evol$Country, attack.evol$Attack.standar, attack.evol$Year)) attack.evol <- setNames(attack.evol, c("Country", "Attack", "Year", "Count")) #Removing rows without country or attack type attack.evol <- attack.evol[attack.evol$Country != "",] attack.evol <- attack.evol[attack.evol$Attack != "",] #grouping non 'important' attack types in 'Otros' attack.evol$Attack <- as.character(attack.evol$Attack) attack.evol[attack.evol$Attack != "DDoS" & attack.evol$Attack != "Defacement" & attack.evol$Attack != "Injection",]$Attack <- "Otros" attack.evol$Attack <- as.factor(attack.evol$Attack) #Counting attacks of new tyoe attack.evol <- group_by(attack.evol, Attack, Country, Year) attack.evol <- summarise(attack.evol, Count = sum(Count)) #Filtering by specified country attack.evol <- attack.evol[attack.evol$Country == Country,] #Graph graph1 <- ggplot2::qplot(main = Country, x = attack.evol$Year, y = attack.evol$Count, group = attack.evol$Attack, xlab = "Years", ylab = "Attacks", data = attack.evol, geom = "point", color = Attack) + geom_line() + theme(plot.title = element_text(hjust = 0.5)) #list with graph and processed data to represent 1b1 list(graph1, attack.evol) }