Vorbemerkungen

Dieses Dokument beschreibt die Vorprozessierung und explorative Analyse des Datensatzes, der unter srf.ch interaktiv visualisiert und unter diesem Link als CSV-Datei zum Download angeboten wird.

SRF Data legt Wert darauf, dass die Datenvorprozessierung und -Analyse nachvollzogen und überprüft werden kann. SRF Data glaubt an das Prinzip offener Daten, aber auch offener und nachvollziehbarer Methoden. Zum anderen soll es Dritten ermöglicht werden, auf dieser Vorarbeit aufzubauen und damit weitere Auswertungen oder Applikationen zu generieren.

Die Vorprozessierung und Analyse wurde im Statistikprogramm R vorgenommen. Die Endprodukte des verwendeten Scripts sind:

  • output/seco_dual_use_for_vis.csv: Wird für die Visualisierung verwendet, reduzierte Menge von Attributen
  • output/seco_dual_use.csv: Vollständiger Datensatz, der zum Download angeboten wird. Dieser Datensatz wird im folgenden Kapitel beschrieben.

R-Script & Daten

Die Vorprozessierung und Analyse wurde im Statistikprogramm R vorgenommen. Das zugrunde liegende Script sowie die prozessierten Daten können unter diesem Link heruntergeladen werden. Durch Ausführen von main.Rmd kann der hier beschriebene Prozess nachvollzogen und der für den Artikel verwendete Datensatz generiert werden. Dabei werden Daten aus dem Ordner input eingelesen und Ergebnisse in den Ordner output geschrieben.

SRF Data verwendet das rddj-template von Timo Grossenbacher als Grundlage für seine R-Scripts. Entstehen bei der Ausführung dieses Scripts Probleme, kann es helfen, die Anleitung von rddj-template zu studieren.

Debug-Informationen: This report was generated on 2018-12-07 10:38:27. R version: 3.4.4 on x86_64-pc-linux-gnu. For this report, CRAN packages as of 2017-09-01 were used.

GitHub

Der Code für die vorliegende Datenprozessierung ist auf https://github.com/srfdata/2018-01-dual-use zur freien Verwendung verfügbar.

Lizenz

Creative Commons Lizenzvertrag
2018-01-dual-use von SRF Data ist lizenziert unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 4.0 International Lizenz.

Weitere Projekte

Code & Daten von SRF Data sind unter https://srfdata.github.io verfügbar.

Haftungsausschluss

Die veröffentlichten Informationen sind sorgfältig zusammengestellt, erheben aber keinen Anspruch auf Aktualität, Vollständigkeit oder Richtigkeit. Es wird keine Haftung übernommen für Schäden, die durch die Verwendung dieses Scripts oder der daraus gezogenen Informationen entstehen. Dies gilt ebenfalls für Inhalte Dritter, die über dieses Angebot zugänglich sind.

Datenbeschreibung seco_dual_use.csv

Attribut Typ Beschreibung
(Erste Spalte, keine Bezeichnung) Integer Identifikator, eindeutig.
GN Integer Geschäftsnummer in der Seco-Datenbank, zwei unterschiedliche Formate je nach Herkunfstdatei.
UnterGN Integer Durchnummerierung von Geschäften mit gleicher GN.
Datum Date Datum der Bewilligung im Format YYYY-MM-DD. Ab 2016 nur noch jeweils der erste Tag des Quartals, in dem die Bewilligung erteilt wurde
Land String Land, in das die Güter exportiert werden.
Wert Float Wert der Güter in Schweizer Franken.
Verzeichnis String Kürzel für Verzeichnis, siehe unten.
Signatur String Code, der die Kategorie/Art der gehandelten Güter kodiert, aufgeschlüsselt in Haupttyp, Untertyp, Zusatz, siehe Beispiel unten. Achtung: Es kann sein, dass ein Geschäft zwei Signaturen aufweist. Dann wird nur die erste zur Ermittelung der Teilsignaturen verwendet.
Haupttyp String Erste Hierarchiestufe der Signatur, entspricht Überkategorien in den einzelnen Verzeichnissen.
Untertyp String Zweite Hierarchiestufe der Signatur, entspricht Unterkategorien in den einzelnen Verzeichnissen.
Zusatz String Rest der Signatur.
Herkunftsdatei String Originaldatei auf der Website des SECO

Attribut Verzeichnis

Folgende Werte sind möglich:

  • 5.1: Güter die dem Waffengesetz unterliegen
  • 5.2: Zivile Sprengstoffe
  • ChKV: Chemikalien der Chemikalienkontrollverordnung
  • GKV: Güter des Anhangs 1 + 2 der Güterkontrollverordnung, sogenannte “Dual-Use-Güter”
  • ML (GKV): “Besondere militärische Güter”, ebenfalls Teil der GKV
  • unbekannt

Die in der Visualisierung mit hochgestellten Buchstaben referenzierte Zusammenfassung der Verzeichnisse (“Dual-Use-Güter”, “Besondere militärische Güter” und “Andere Güter”) wurde von SRF Data vorgenommen und ist unter output/verzeichnis_beschreibung.csv einsehbar.

Attribut Haupttyp

Die in der Visualisierung dargestellte “Kategorie” entspricht dem Haupttyp. Die Übersetzung von Haupttyp wurde von SRF Data basierend auf amtlichen Dokumenten (Verordnungen, Verzeichnisse) vorgenommen und ist unter output/signatures_verzeichnis_haupttyp_beschreibung.csv einsehbar.

Beispiel Signaturaufschlüsselung

GKV 6A002.c1 ergibt…

  • Haupttyp: 6 (“Sensoren und Laser”)
  • Untertyp: A (“Ausrüstungen, Baugruppen, Bestandteile”)
  • Zusatz: 002.c1

In der Gesamtheit: “Ausrüstung zur ‘direkten Bildwandlung’ mit eingebauten Bildverstärkerröhren” (gemäss Anhang 1 + 2 GKV, 2012).

Originalquelle

Der Datensatz für die Jahre 2012, 2013 und 2014 basiert ursprünglich auf zwei verschiedenen, von SECO im Januar 2015 publizierten Datensätzen:

Der Datensatz für das Jahr 2015 findet sich auf der neuen Übersichtsseite unter dem Reiter 2015 -> im Ordner input/elic_2015_new.xlsx.

Der Datensatz für das Jahr 2016 und das Jahr 2017 findet sich auf der neuen Übersichtsseite unter dem Reiter 2016 bzw. 2017. Er ist jeweils auf vier Excel-Files (für jedes Quartal) aufgesplittet.

Hinweis zu Mehrfachbewilligungen

Laut Aussage des SECO kann die veröffentlichte Bewilligungs-Datenbank Mehrfachbewilligungen enthalten. Gewisse Aufträge sind so umfassend, dass ihre Ausführung mehrere Jahre dauert. Weil eine Exportbewilligung aber nur ein Jahr gültig ist, tauchen in den Daten vereinzelt auch Geschäfte auf, die schon vor 2012 bewilligt wurden. Solche Mehrfachbewilligungen führen dazu, dass Aufträge in der Statistik mehrfach vorkommen können.

Vom SECO wurde SRF Data eine Liste mit Geschäften übergeben, die schon vor 2012 erstmals bewilligt wurden und ihren Weg wiederum in die Datenbank fanden. Es handelt sich um folgende Geschäftsnummern:

Geschäftsnummer Beschreibung Auftragsvolumen
8001226 (ELIC) Flugzeuge und Simulatoren nach Indien rund 155 Mio. CHF
14476 Flugzeuge nach Indien rund 165 Mio. CHF
16043 Flugzeuge nach Indien rund 80 Mio. CHF
12332 Flugzeuge nach Saudi-Arabien rund 1 Mia. CHF
8001302 (ELIC) Simulatoren nach Katar rund 345 Mio. CHF

Für die Jahre 2015, 2016 und 2017 liegen keine solchen Informationen vor.

Vorbereitungen

## [1] "package package:rmarkdown detached"

Packages definieren

# von https://mran.revolutionanalytics.com/web/packages/checkpoint/vignettes/using-checkpoint-with-knitr.html
# alle Packages, die nicht gebraucht werden, können hier entfernt werden (auskommentieren reicht nicht!)
# tidyverse: see https://blog.rstudio.org/2016/09/15/tidyverse-1-0-0/
cat("
library(tidyverse) # ggplot2, dplyr, tidyr, readr, purrr, tibble
library(magrittr) # pipes
library(forcats) # factors
library(stringr) # string manipulation
library(readxl) # excel
library(scales) # scales for ggplot2
library(rmarkdown) # muss für automatisches knitting 
# in deploy.sh eingebunden werden",
file = "manifest.R")

Packages installieren

# if checkpoint is not yet installed, install it (for people using this
# system for the first time)
if (!require(checkpoint)) {
  if (!require(devtools)) {
    install.packages("devtools", repos = "http://cran.us.r-project.org")
    require(devtools)
  }
  devtools::install_github("RevolutionAnalytics/checkpoint",
                           ref = "v0.3.2", # could be adapted later,
                           # as of now (beginning of July 2017
                           # this is the current release on CRAN)
                           repos = "http://cran.us.r-project.org")
  require(checkpoint)
}
## Loading required package: checkpoint
## 
## checkpoint: Part of the Reproducible R Toolkit from Microsoft
## https://mran.microsoft.com/documents/rro/reproducibility/
# nolint start
if (!dir.exists("~/.checkpoint")) {
  dir.create("~/.checkpoint")
}
# nolint end
# install packages for the specified CRAN snapshot date
checkpoint(snapshotDate = package_date,
           project = path_to_wd,
           verbose = T,
           scanForPackages = T,
           use.knitr = F,
           R.version = R_version)
## Scanning for packages used in this project
## rmarkdown files found and will not be parsed. Set use.knitr = TRUE
## - Discovered 9 packages
## All detected packages already installed
## checkpoint process complete
## ---
rm(package_date)

Packages laden

source("manifest.R")
## Loading tidyverse: ggplot2
## Loading tidyverse: tibble
## Loading tidyverse: tidyr
## Loading tidyverse: readr
## Loading tidyverse: purrr
## Loading tidyverse: dplyr
## Conflicts with tidy packages ----------------------------------------------
## filter(): dplyr, stats
## lag():    dplyr, stats
## 
## Attaching package: 'magrittr'
## The following object is masked from 'package:purrr':
## 
##     set_names
## The following object is masked from 'package:tidyr':
## 
##     extract
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor
unlink("manifest.R")
sessionInfo()
## R version 3.4.4 (2018-03-15)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 18.04.1 LTS
## 
## Matrix products: default
## BLAS: /opt/R/R-3.4.4/lib64/R/lib/libRblas.so
## LAPACK: /opt/R/R-3.4.4/lib64/R/lib/libRlapack.so
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] rmarkdown_1.6    scales_0.5.0     readxl_1.0.0     stringr_1.2.0   
##  [5] forcats_0.2.0    magrittr_1.5     dplyr_0.7.2      purrr_0.2.3     
##  [9] readr_1.1.1      tidyr_0.7.0      tibble_1.3.4     ggplot2_2.2.1   
## [13] tidyverse_1.1.1  checkpoint_0.4.0
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.12     cellranger_1.1.0 compiler_3.4.4   plyr_1.8.4      
##  [5] bindr_0.1        tools_3.4.4      digest_0.6.12    lubridate_1.6.0 
##  [9] jsonlite_1.5     evaluate_0.10.1  nlme_3.1-131.1   gtable_0.2.0    
## [13] lattice_0.20-35  pkgconfig_2.0.1  rlang_0.1.2      psych_1.7.5     
## [17] yaml_2.1.14      parallel_3.4.4   haven_1.1.0      bindrcpp_0.2    
## [21] xml2_1.1.1       httr_1.3.1       knitr_1.17       hms_0.3         
## [25] rprojroot_1.2    grid_3.4.4       glue_1.1.1       R6_2.2.2        
## [29] foreign_0.8-69   modelr_0.1.1     reshape2_1.4.2   backports_1.1.0 
## [33] htmltools_0.3.6  rvest_0.3.2      assertthat_0.2.0 mnormt_1.5-5    
## [37] colorspace_1.3-2 stringi_1.1.5    lazyeval_0.2.0   munsell_0.4.3   
## [41] broom_0.4.2

Zusätzliche Scripts laden

# falls Logik auf andere Scripts ausgelagert werden soll (z.B. der Übersichtlichkeit halber), hier einkommentieren
knitr::read_chunk("scripts/classify.R")
source("scripts/classify.R")
knitr::read_chunk("scripts/numberFormatter.R")
source("scripts/numberFormatter.R")

Vorprozessierung

Daten reinladen und typisieren

tracker_raw <- read_excel(path = "input/tracker.xlsx", sheet = 1)
# Spaltentypen setzen und umbenennen
tracker_raw <- tracker_raw %>%
  mutate(Bewilligungsdatum = as.Date(Bewilligungsdatum, "%Y-%m-%d"), 
         Geschäftsnummer = as.integer(Geschäftsnummer),
         Wert = as.numeric(Wert), 
         Quartal = paste(format(Bewilligungsdatum, "%y"), 
                  sprintf("%02i", 
                          (as.POSIXlt(Bewilligungsdatum)$mon) %/% 3L + 1L), 
                  sep = "/")) %>%
  rename(GN = Geschäftsnummer, 
         Datum = Bewilligungsdatum, 
         Land = Endverbraucherland)

# überprüfen
str(tracker_raw)
## Classes 'tbl_df', 'tbl' and 'data.frame':    4718 obs. of  15 variables:
##  $ GN         : int  11738 11746 11747 11747 11747 11747 11748 11693 11710 11749 ...
##  $ Datum      : Date, format: "2012-01-04" "2012-01-04" ...
##  $ Land       : chr  "China" "China" "Thailand" "Thailand" ...
##  $ AG (GKV)   : chr  NA NA NA NA ...
##  $ MTCR (GKV) : chr  NA NA NA NA ...
##  $ NSGI (GKV) : chr  NA NA NA NA ...
##  $ NSGII (GKV): chr  "2B201b" "2B201a1" NA NA ...
##  $ WA (GKV)   : chr  "2B001c" "2B001b2" NA NA ...
##  $ ML (GKV)   : chr  NA NA NA NA ...
##  $ Anhang 5.1 : num  NA NA 5.1 5.1 5.1 5.1 NA NA NA NA ...
##  $ Anhang 5.2 : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Anhang 5.3 : logi  NA NA NA NA NA NA ...
##  $ ChKV       : chr  NA NA NA NA ...
##  $ Wert       : num  492552 341164 7616 6241 1174 ...
##  $ Quartal    : chr  "12/01" "12/01" "12/01" "12/01" ...
elic_raw <- read_excel(path = "input/elic.xlsx", sheet = 1)
# Spaltentypen setzen und umbenennen
elic_raw <- elic_raw %>%
  mutate(Ausstellungsdatum = as.Date(Ausstellungsdatum, "%d.%m.%Y"),
         Geschäftsnummer = as.integer(Geschäftsnummer), 
         `Position / Wert [CHF]` = 
           as.numeric(`Position / Wert [CHF]`), 
         Quartal = paste(format(Ausstellungsdatum, "%y"), 
                         sprintf("%02i", 
                              (as.POSIXlt(Ausstellungsdatum)$mon) %/% 3L + 1L), 
                  sep = "/")) %>%
  rename(GN = Geschäftsnummer, 
         Datum = Ausstellungsdatum, 
         Land = `Bestimmungs-/Lieferland`, 
         Wert = `Position / Wert [CHF]`)

# überprüfen
str(elic_raw)
## Classes 'tbl_df', 'tbl' and 'data.frame':    873 obs. of  7 variables:
##  $ GN                 : int  8000002 8000004 8000009 8000012 8000010 8000013 8000016 8000015 8000026 8000024 ...
##  $ Datum              : Date, format: "2014-02-07" "2014-02-11" ...
##  $ Land               : chr  "China, Volksrepublik" "Russische Föderation" "Singapur" "Slowenien" ...
##  $ Position / Güterart: chr  "Dual Use Güter" "Dual Use Güter" "Dual Use Güter\r\nDual Use Güter" "Besondere militärische Güter" ...
##  $ Position / EKN     : chr  "2B120" "6A002.c1" "2B001.b1\r\n2B201.a1" "ML15" ...
##  $ Wert               : num  1950000 2098305 209609 128000 43188 ...
##  $ Quartal            : chr  "14/01" "14/01" "14/01" "14/01" ...
# elic 2015
elic_2015 <- read_xlsx(path = "input/elic_2015_new.xlsx", sheet = 1)
# Spaltentypen setzen und umbenennen
elic_2015 <- elic_2015 %>%
  mutate(Ausstellungsdatum = as.Date(Ausstellungsdatum, "%d.%m.%Y"), 
         Geschäftsnummer = as.integer(Geschäftsnummer), 
         `Wert [CHF]` = as.numeric(`Wert [CHF]`), 
         Quartal = paste(format(Ausstellungsdatum, "%y"), 
                         sprintf("%02i", 
                              (as.POSIXlt(Ausstellungsdatum)$mon) %/% 3L + 1L), 
                  sep = "/")) %>%
  rename(GN = Geschäftsnummer, 
         Datum = Ausstellungsdatum, 
         Land = Bestimmungsland, 
         Wert = `Wert [CHF]`, 
         `Position / Güterart` = Güterart, 
         `Position / EKN` = EKN, 
         Art = Geschäftsart) %>% 
  filter(Art == "Ausfuhr") %>% 
  select(-Art)

elic_ab_2016 <- map_dfr(list.files("input/", "elic_\\d{4}_\\d{1}\\.xlsx$"), 
                        function(file){
  # parse file name
  year <- as.numeric(str_match_all(file, 
                                   "elic_(\\d{4})_(\\d{1})\\.xlsx$")[[1]][, 2])
  quart <- as.numeric(str_match_all(file, 
                                    "elic_(\\d{4})_(\\d{1})\\.xlsx$")[[1]][, 3])
  
  month <- (quart - 1) * 3 + 1
  # read in excel
  raw_data <- read_excel(path = paste0("input/", file), sheet = 1)
  data <- raw_data %>% 
    mutate(Datum = as.Date(paste(paste(year, month, "01", sep = "-"), 
                                 "00:00:01"))) %>% 
    mutate(Quartal = paste(format(Datum, "%y"), 
                           sprintf("%02i", 
                                   (as.POSIXlt(Datum)$mon) %/% 3L + 1L), 
                           sep = "/")) %>%
    select(GN = Geschäftsnummer, 
           Datum, 
           Quartal, 
           Land = Bestimmungsland, 
           Wert = `Wert [CHF]`, 
           `Position / Güterart` = Güterart, 
           `Position / EKN` = `Exportkontrollnummer [EKN]`, 
           Art = Richtung) %>% 
  filter(Art == "Ausfuhr") %>% 
  select(-Art)
  return(data)
})

# manuelle Fehlerbehebung: Für EKN 5.3 gibt es keine offizielle Definition, 
# gemeint ist wohl 5.1
elic_ab_2016 %<>%
  mutate(`Position / EKN` = ifelse(GN == 8010868 & `Position / EKN` == 5.3, 
                                   5.1, 
                                   `Position / EKN`))



elic_raw <- rbind(elic_raw, elic_2015, elic_ab_2016)
rm(elic_2015)
rm(elic_ab_2016)

Duplikate

Duplikate: Mehrere Einträge unter der gleichen Geschäftsnummer

Wie viele “Duplikate” gibt es?

dim(tracker_raw)[1] - dim(distinct(select(tracker_raw, GN)))[1]
## [1] 374
dim(elic_raw)[1] - dim(distinct(select(elic_raw, GN)))[1]
## [1] 2823

Diese werden nicht aggregiert sondern so belassen, jedoch durchnummiert (Generierung neue Spalte UnterGN)

tracker_summarized <- tracker_raw %>%
  group_by(GN, Quartal, Land) %>%
  mutate(UnterGN = row_number())
elic_summarized <- elic_raw %>%
  group_by(GN, Quartal, Land) %>%
  mutate(UnterGN = row_number())

rm(tracker_raw)
rm(elic_raw)

Wie viele Einträge haben in der Tracker-Applikation zwei Signaturen?

tracker_summarized %>% 
  filter(`NSGII (GKV)` != "" & `WA (GKV)` != "") %>% 
  nrow()
## [1] 757

Wie viele davon sind solche, die mit der gleichen Obersignatur (sprich: dem gleichen Haupt- und Untertyp, siehe unten) beginnen?

tracker_summarized %>% 
  filter(`NSGII (GKV)` != "" & `WA (GKV)` != "" &
           substr(`NSGII (GKV)`, 1, 2) == substr(`WA (GKV)`, 1, 2)) %>% 
  nrow()
## [1] 757

Wie viele Geschäfte haben keine Signatur?

tracker_without_signature <- tracker_summarized %>% 
  gather(Variable, Value, `AG (GKV)`:
           ChKV) %>% 
  group_by(GN, Quartal, Land, UnterGN) %>%
  filter(all(is.na(Value) | Value == "NA")) %>% 
  slice(1)
dim(tracker_without_signature)[1]
## [1] 99

ELIC?

dim(elic_summarized[elic_summarized$`Position / EKN` == "", ])[1]
## [1] 0

Restrukturieren

# ELIC: Umbenennen und Spalte hinzufügen
elic_restructured <- elic_summarized %>%
  rename(Signatur = `Position / EKN`, 
         "Verordnung/Typ ELIC" = `Position / Güterart`) %>%
  mutate("Verordnung/Typ" = NA)

# Tracker: Kondensieren (breit nach lang)
tracker_restructured <- tracker_summarized %>% 
  gather(Variable, Value, `AG (GKV)`:ChKV) %>%                        
  group_by(GN, Quartal, Land, UnterGN) %>% 
# wenn Geschäft gar keine Signatur hat, dann nur den ersten nehmen, 
# sonst alle nehmen, die einen Wert haben 
# (für solche, die mehr als eine Signatur haben)
  filter( if (all(is.na(Value) | Value == "NA")) 
    row_number() == 1 
    else (!is.na(Value) | Value == "NA")) %>% 
# alle eindeutigen Werte pro Gruppe mit einem newline-Operator zusammenfügen
  summarise_each(funs(paste(unique(.), collapse = "\n")))  %>%        
  mutate(Wert = as.numeric(Wert))                                     
## `summarise_each()` is deprecated.
## Use `summarise_all()`, `summarise_at()` or `summarise_if()` instead.
## To map `funs` over all variables, use `summarise_all()`
# Tracker: Einträge, für die keine Signatur bekannt ist, 
# umbenennen, und eine leere Spalte für Kombination 
# mit ELIC hinzufügen, sowie Spalten umbennenen
tracker_restructured <- tracker_restructured %>%
  mutate(Variable = ifelse(is.na(Value) | Value == "NA", "unbekannt", 
                           Variable), 
         Value = ifelse(is.na(Value) | Value == "NA", "unbekannt", Value), 
         "Verordnung/Typ ELIC" = NA) %>%
  rename("Verordnung/Typ" = Variable, "Signatur" = Value)

Zwischenbilanz

str(as.data.frame(elic_restructured))
## 'data.frame':    9722 obs. of  9 variables:
##  $ GN                 : num  8000002 8000004 8000009 8000012 8000010 ...
##  $ Datum              : Date, format: "2014-02-07" "2014-02-11" ...
##  $ Land               : chr  "China, Volksrepublik" "Russische Föderation" "Singapur" "Slowenien" ...
##  $ Verordnung/Typ ELIC: chr  "Dual Use Güter" "Dual Use Güter" "Dual Use Güter\r\nDual Use Güter" "Besondere militärische Güter" ...
##  $ Signatur           : chr  "2B120" "6A002.c1" "2B001.b1\r\n2B201.a1" "ML15" ...
##  $ Wert               : num  1950000 2098305 209609 128000 43188 ...
##  $ Quartal            : chr  "14/01" "14/01" "14/01" "14/01" ...
##  $ UnterGN            : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Verordnung/Typ     : logi  NA NA NA NA NA NA ...
str(as.data.frame(tracker_restructured))
## 'data.frame':    4718 obs. of  9 variables:
##  $ GN                 : int  10263 11180 11435 11435 11663 11666 11667 11671 11693 11710 ...
##  $ Quartal            : chr  "12/01" "12/02" "13/01" "13/01" ...
##  $ Land               : chr  "Iran, Islamische Republik (SG)" "China" "Gabun" "Gabun" ...
##  $ UnterGN            : int  1 1 1 2 1 1 1 1 1 1 ...
##  $ Datum              : chr  "2012-03-22" "2012-05-25" "2013-02-25" "2013-02-25" ...
##  $ Wert               : num  1790 550000 650 4200 158000 ...
##  $ Verordnung/Typ     : chr  "unbekannt" "NSGI (GKV)" "Anhang 5.1" "Anhang 5.1" ...
##  $ Signatur           : chr  "unbekannt" "0B001b14" "5.1" "5.1" ...
##  $ Verordnung/Typ ELIC: logi  NA NA NA NA NA NA ...
rm(tracker_summarized)
rm(elic_summarized)

Beide Datensätze kombinieren

seco_dual_use <- rbind(as.data.frame(elic_restructured), 
                       as.data.frame(tracker_restructured))
str(seco_dual_use)
## 'data.frame':    14440 obs. of  9 variables:
##  $ GN                 : num  8000002 8000004 8000009 8000012 8000010 ...
##  $ Datum              : Date, format: "2014-02-07" "2014-02-11" ...
##  $ Land               : chr  "China, Volksrepublik" "Russische Föderation" "Singapur" "Slowenien" ...
##  $ Verordnung/Typ ELIC: chr  "Dual Use Güter" "Dual Use Güter" "Dual Use Güter\r\nDual Use Güter" "Besondere militärische Güter" ...
##  $ Signatur           : chr  "2B120" "6A002.c1" "2B001.b1\r\n2B201.a1" "ML15" ...
##  $ Wert               : num  1950000 2098305 209609 128000 43188 ...
##  $ Quartal            : chr  "14/01" "14/01" "14/01" "14/01" ...
##  $ UnterGN            : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Verordnung/Typ     : chr  NA NA NA NA ...
rm(tracker_restructured)
rm(elic_restructured)

Länder-Duplikate entfernen

Wie viele Länder gibt es?

laender <- arrange(seco_dual_use, Land)
# unique(laender$Land) # der Lesbarkeit halber auskommentiert
length(unique(laender$Land))
## [1] 173

Manuell umschreiben gemäss SRF-Länderliste.

seco_dual_use$Land[seco_dual_use$Land == "Bosnien und Herzegowina"] <- 
  "Bosnien-Herzegowina"
seco_dual_use$Land[seco_dual_use$Land == "Georgien, Republik"] <- 
  "Georgien"
seco_dual_use$Land[seco_dual_use$Land == "Pakistan (CA)"] <- 
  "Pakistan"
seco_dual_use$Land[seco_dual_use$Land == "Indien (CA)"] <- 
  "Indien"
seco_dual_use$Land[seco_dual_use$Land == "China, Taiwan"] <- 
  "Taiwan"
seco_dual_use$Land[seco_dual_use$Land == "China, Volksrepublik"] <- 
  "China"
seco_dual_use$Land[seco_dual_use$Land == "Ekuador"] <- 
  "Ecuador"
seco_dual_use$Land[seco_dual_use$Land == 
                     "Großbritannien (Vereinigtes Königreich)"] <- 
  "Grossbritannien"
seco_dual_use$Land[seco_dual_use$Land == "Hongkong"] <- 
  "Hong Kong"
seco_dual_use$Land[seco_dual_use$Land == "Iran, Islamische Republik"] <- 
  "Iran"
seco_dual_use$Land[seco_dual_use$Land == "Iran, Islamische Republik (SG)"] <- 
  "Iran"
seco_dual_use$Land[seco_dual_use$Land == "Myanmar (Union)"] <- 
  "Myanmar (Birma)"
seco_dual_use$Land[seco_dual_use$Land == "Qatar"] <- 
  "Katar"
seco_dual_use$Land[seco_dual_use$Land == "Serbia"] <- 
  "Serbien"
seco_dual_use$Land[seco_dual_use$Land == "Slowakei, Slowakische Republik"] <- 
  "Slowakische Republik"
seco_dual_use$Land[seco_dual_use$Land == "Taiwan, Provinz von China"] <- 
  "Taiwan"
seco_dual_use$Land[seco_dual_use$Land == "Vereinigte Staaten"] <- 
  "Vereinigte Staaten von Amerika"
seco_dual_use$Land[seco_dual_use$Land == "Libysch-Arabische Dschamahirija"] <- 
  "Libyen"
seco_dual_use$Land[seco_dual_use$Land == "Russische Föderation"] <- 
  "Russland"
seco_dual_use$Land[seco_dual_use$Land == "Belarus"] <- 
  "Weissrussland"
seco_dual_use$Land[seco_dual_use$Land == "Bangladesch"] <- 
  "Bangladesh"
seco_dual_use$Land[seco_dual_use$Land == "Bermuda"] <- 
  "Bermudas"
seco_dual_use$Land[seco_dual_use$Land == "Brunei Darussalam"] <- 
  "Brunei"
seco_dual_use$Land[seco_dual_use$Land == "Demokratische Republik Kongo"] <- 
  "Kongo-Kinshasa"
seco_dual_use$Land[seco_dual_use$Land == 
                     "Kongo, Demokratische Republik (ex-Zaire)"] <- 
  "Kongo-Kinshasa"
seco_dual_use$Land[seco_dual_use$Land == 
                     "Kongo, Republik"] <- 
  "Kongo-Kinshasa"
seco_dual_use$Land[seco_dual_use$Land == "Cayman-Inseln"] <- 
  "Kaiman-Inseln"
seco_dual_use$Land[seco_dual_use$Land == "Korea, Republik"] <- 
  "Südkorea"
seco_dual_use$Land[seco_dual_use$Land == "Korea, Republik (Südkorea)"] <- 
  "Südkorea"
seco_dual_use$Land[seco_dual_use$Land == "Kroatien (Hrvatska)"] <- 
  "Kroatien"
seco_dual_use$Land[seco_dual_use$Land == 
                     "Laos, Demokratische Volksrepublik"] <- 
  "Laos"
seco_dual_use$Land[seco_dual_use$Land == "Macao"] <- 
  "Macau"
seco_dual_use$Land[seco_dual_use$Land == 
                     "Mazedonien, die ehemalige jugoslawische Republik"] <- 
  "Mazedonien"
seco_dual_use$Land[seco_dual_use$Land == 
                     "Mazedonien (ehemalige jugoslawische Republik)"] <- 
  "Mazedonien"
seco_dual_use$Land[seco_dual_use$Land == "Myanmar (Birma)"] <- 
  "Myanmar"
seco_dual_use$Land[seco_dual_use$Land == "Slowakische Republik"] <- 
  "Slowakei"
seco_dual_use$Land[seco_dual_use$Land == "Tansania, Vereinigte Republik"] <- 
  "Tansania"
seco_dual_use$Land[seco_dual_use$Land == "Tschechische Republik"] <- 
  "Tschechien"
seco_dual_use$Land[seco_dual_use$Land == "Vereinigte Staaten von Amerika"] <- 
  "USA"
seco_dual_use$Land[seco_dual_use$Land == "Moldova"] <- 
  "Moldawien"

Wie viele Länder gibt es jetzt noch?

length(unique(seco_dual_use$Land))
## [1] 150
sort(unique(seco_dual_use$Land))
##   [1] "Afghanistan"                  "Ägypten"                     
##   [3] "Albanien"                     "Algerien"                    
##   [5] "Andorra"                      "Angola"                      
##   [7] "Argentinien"                  "Armenien"                    
##   [9] "Aserbaidschan"                "Äthiopien"                   
##  [11] "Australien"                   "Bahamas"                     
##  [13] "Bahrain"                      "Bangladesh"                  
##  [15] "Belgien"                      "Benin"                       
##  [17] "Bermudas"                     "Bhutan"                      
##  [19] "Bolivien"                     "Bosnien-Herzegowina"         
##  [21] "Botswana"                     "Brasilien"                   
##  [23] "Brunei"                       "Bulgarien"                   
##  [25] "Burkina Faso"                 "Chile"                       
##  [27] "China"                        "Costa Rica"                  
##  [29] "Dänemark"                     "Deutschland"                 
##  [31] "Djibouti"                     "Dominikanische Republik"     
##  [33] "Ecuador"                      "El Salvador"                 
##  [35] "Elfenbeinküste"               "Eritrea"                     
##  [37] "Estland"                      "Fidschi"                     
##  [39] "Finnland"                     "Frankreich"                  
##  [41] "Gabun"                        "Georgien"                    
##  [43] "Ghana"                        "Griechenland"                
##  [45] "Grossbritannien"              "Guatemala"                   
##  [47] "Honduras"                     "Hong Kong"                   
##  [49] "Indien"                       "Indonesien"                  
##  [51] "Irak"                         "Iran"                        
##  [53] "Irland"                       "Island"                      
##  [55] "Israel"                       "Italien"                     
##  [57] "Japan"                        "Jemen"                       
##  [59] "Jordanien"                    "Kaiman-Inseln"               
##  [61] "Kambodscha"                   "Kamerun"                     
##  [63] "Kanada"                       "Kasachstan"                  
##  [65] "Katar"                        "Kenia"                       
##  [67] "Kirgisistan"                  "Kolumbien"                   
##  [69] "Kongo-Kinshasa"               "Kroatien"                    
##  [71] "Kuba"                         "Kuwait"                      
##  [73] "Laos"                         "Lettland"                    
##  [75] "Libanon"                      "Libyen"                      
##  [77] "Litauen"                      "Luxemburg"                   
##  [79] "Macau"                        "Madagaskar"                  
##  [81] "Malaysia"                     "Mali"                        
##  [83] "Malta"                        "Marokko"                     
##  [85] "Marshallinseln"               "Mauretanien"                 
##  [87] "Mauritius"                    "Mazedonien"                  
##  [89] "Mexiko"                       "Moldawien"                   
##  [91] "Monaco"                       "Mongolei"                    
##  [93] "Montenegro"                   "Myanmar"                     
##  [95] "Namibia"                      "Neuseeland"                  
##  [97] "Niederlande"                  "Nigeria"                     
##  [99] "Norwegen"                     "Oman"                        
## [101] "Österreich"                   "Pakistan"                    
## [103] "Panama"                       "Paraguay"                    
## [105] "Peru"                         "Philippinen"                 
## [107] "Polen"                        "Portugal"                    
## [109] "Rumänien"                     "Russland"                    
## [111] "Sambia"                       "San Marino"                  
## [113] "Saudi-Arabien"                "Schweden"                    
## [115] "Schweiz"                      "Senegal"                     
## [117] "Serbien"                      "Sierra Leone"                
## [119] "Singapur"                     "Slowakei"                    
## [121] "Slowenien"                    "Somalia"                     
## [123] "Spanien"                      "Sri Lanka"                   
## [125] "Südafrika"                    "Sudan"                       
## [127] "Südkorea"                     "Swasiland"                   
## [129] "Taiwan"                       "Tansania"                    
## [131] "Thailand"                     "Togo"                        
## [133] "Trinidad und Tobago"          "Tschechien"                  
## [135] "Tunesien"                     "Türkei"                      
## [137] "Turkmenistan"                 "Uganda"                      
## [139] "Ukraine"                      "Ungarn"                      
## [141] "Uruguay"                      "USA"                         
## [143] "Usbekistan"                   "Vatikan"                     
## [145] "Venezuela"                    "Vereinigte Arabische Emirate"
## [147] "Vietnam"                      "Weissrussland"               
## [149] "Zentralafrikanische Republik" "Zypern"
rm(laender)

Kategorisierung

Neue Spalten erstellen

# Spalte für Dateiherkunft
seco_dual_use <- seco_dual_use %>%
  mutate(Herkunftsdatei = NA, Verzeichnis = NA, 
         Haupttyp = NA, Untertyp = NA, Zusatz = NA)

Signaturaufschlüsselung

# Verzeichnis finden
computedList <- mapply(classifyVerzeichnis, seco_dual_use[, "Verordnung/Typ"], 
                       seco_dual_use[, "Verordnung/Typ ELIC"],
                       seco_dual_use[, "Signatur"])

seco_dual_use <- seco_dual_use  %>% 
  mutate(Verzeichnis = as.factor(t(computedList)[, 1]), 
         Herkunftsdatei = as.factor(t(computedList)[, 2]))

# Verordnung/Typ (ELIC) werden nicht mehr gebraucht
seco_dual_use <- seco_dual_use  %>% 
  select(-contains("Verordnung/Typ"))

# Signatur aufschlüsseln
# nur GVK anzeigen
seco_dual_use_only_gkv <- seco_dual_use  %>% 
  filter(Verzeichnis == "GKV") %>%
  select(Signatur, Herkunftsdatei)

computedList <- mapply(classifySignatur, seco_dual_use[, "Verzeichnis"], 
                       seco_dual_use[, "Herkunftsdatei"],
                       seco_dual_use[, "Signatur"])

seco_dual_use_cleaned <- seco_dual_use  %>% 
  mutate(Haupttyp = as.factor(t(computedList)[, 1]), 
         Untertyp = as.factor(t(computedList)[, 2]),
         Zusatz = as.factor(t(computedList)[, 3]))

# Sample nehmen, um Klassifikation zu überprüfen
seco_dual_use_cleaned  %>% 
  sample_n(40) %>%
  select(Verzeichnis, Signatur, Haupttyp, Untertyp, Zusatz)
##       Verzeichnis             Signatur Haupttyp Untertyp  Zusatz
## 9927          GKV            6A005a6b2        6        A 005a6b2
## 13903         GKV              2B201b1        2        B   201b1
## 5754          GKV            5A002.a.1        5        A   002a1
## 3227     ML (GKV)              ML10.c2       10       c2    <NA>
## 12724         GKV                   90        9        0        
## 10468         GKV             3A001a2c        3        A  001a2c
## 8722          GKV              2B201.a        2        B    201a
## 880           5.1                  5.1        1     <NA>    <NA>
## 1647          GKV             2B201.b1        2        B   201b1
## 6753          GKV   2B001.b\r\n2B201.a        2        B    001b
## 11863         GKV               2B352b        2        B    352b
## 7575          GKV             2B201.a1        2        B   201a1
## 4132          GKV             2B350.i7        2        B   350i7
## 11392         GKV               2B352b        2        B    352b
## 9109          GKV   2B001.b\r\n2B201.a        2        B    001b
## 2610     ML (GKV)               ML05.b        5        b    <NA>
## 7960     ML (GKV)               ML01.d        1        d    <NA>
## 11122   unbekannt            unbekannt     <NA>     <NA>    <NA>
## 1375          GKV              2B201.a        2        B    201a
## 10385         GKV              2B201b1        2        B   201b1
## 4498          GKV              2B001.a        2        B    001a
## 9622     ML (GKV)               ML18.a       18        a    <NA>
## 8339          GKV 2B001.b2\r\n2B201.a1        2        B   001b2
## 14356         GKV              2B350i4        2        B   350i4
## 4294          GKV             6A005.b2        6        A   005b2
## 2173          GKV             7A003.c1        7        A   003c1
## 10440         GKV              2B201b1        2        B   201b1
## 13526         5.1                  5.1        1     <NA>    <NA>
## 7369          GKV              2B001.a        2        B    001a
## 12979         GKV              3A002g2        3        A   002g2
## 2201     ML (GKV)               ML10.a       10        a    <NA>
## 7782     ML (GKV)                 ML14       14     <NA>    <NA>
## 2136          GKV                2D002        2        D     002
## 3841          GKV             7A003.c1        7        A   003c1
## 3571          GKV 2B001.c1\r\n2B201.b1        2        B   001c1
## 2711          GKV 5A001.f1\r\n5A001.f3        5        A   001f1
## 13748         GKV               5A001f        5        A    001f
## 10460         GKV     2B201a1\n2B001b2        2        B   201a1
## 9742          GKV               2B201a        2        B    201a
## 3771          5.1                  5.1        1     <NA>    <NA>
# Faktorenlevels überprüfen
levels(seco_dual_use_cleaned$Verzeichnis)
## [1] "5.1"       "5.2"       "ChKV"      "GKV"       "ML (GKV)"  "unbekannt"
levels(seco_dual_use_cleaned$Herkunftsdatei)
## [1] "ELIC"    "Tracker"
# Hier gibt es Einträge à la 1A, 2B und 3B, dies sind keine Fehler, sondern Haupttypen der ChKV
levels(seco_dual_use_cleaned$Haupttyp)
##  [1] "0"  "1"  "10" "11" "13" "14" "15" "16" "17" "18" "1A" "2"  "21" "22"
## [15] "2B" "3"  "3B" "4"  "5"  "6"  "7"  "8"  "9"
levels(seco_dual_use_cleaned$Untertyp)
##  [1] ""     ".a"   "0"    "1"    "10"   "11"   "13"   "14"   "16"   "17"  
## [11] "2"    "3"    "4"    "5"    "5b1"  "7"    "9"    "a"    "A"    "a1"  
## [21] "a13a" "a21"  "b"    "B"    "b4"   "c"    "C"    "c2"   "d"    "D"   
## [31] "d1"   "d2"   "E"    "f"    "f1"   "f3"   "g"    "h"    "j"
levels(seco_dual_use_cleaned$Zusatz)
##   [1] ""            "0"           "001"         "001a"        "001A"       
##   [6] "001a1"       "001a10c"     "001a11a"     "001A11B"     "001a12"     
##  [11] "001a13b"     "001a2"       "001a2a"      "001a2a1"     "001a2c"     
##  [16] "001A2C"      "001a3"       "001a5a1"     "001A5A1"     "001a5a2"    
##  [21] "001A5A2"     "001a5a3"     "001a5a4"     "001A5A4"     "001a5a5"    
##  [26] "001a6b"      "001a7a"      "001A7A"      "001a7b"      "001b"       
##  [31] "001B"        "001b1"       "001b10"      "001b14"      "001b141b"   
##  [36] "001b14b"     "001b1b"      "001b2"       "001B2"       "001b2b3"    
##  [41] "001b2d"      "001b3"       "001c"        "001C"        "001c1"      
##  [46] "001c2"       "001d"        "001D"        "001e"        "001E"       
##  [51] "001e1"       "001e2a"      "001f"        "001f1"       "001f2"      
##  [56] "001F2"       "001f3"       "001f3a"      "001f4"       "001g"       
##  [61] "001g2"       "001h"        "001i"        "001j"        "002"        
##  [66] "002a"        "002a+b"      "002a1"       "002A1"       "002a1a"     
##  [71] "002a1b"      "002a1b3"     "002A1B3"     "002a1d"      "002a2a"     
##  [76] "002a3f"      "002a3g"      "002a5"       "002A5"       "002a9"      
##  [81] "002b1"       "002b4b"      "002c1"       "002C1"       "002c1a"     
##  [86] "002c2"       "002D1"       "002d3"       "002g"        "002g2"      
##  [91] "002G2"       "002h1a"      "002H1A"      "002h1b"      "002H1B"     
##  [96] "002h1c"      "002H1C"      "003"         "003a"        "003a3"      
## [101] "003b2d1"     "003b4"       "003b4a"      "003b4b"      "003b4c"     
## [106] "003c1"       "003f"        "003f2"       "004"         "004a"       
## [111] "004c"        "004c1"       "004e"        "005"         "0055b"      
## [116] "005a5b"      "005a6a"      "005A6A"      "005a6b"      "005a6b2"    
## [121] "005A6B2"     "005b2"       "005b6a"      "005B6A"      "005b6a2"    
## [126] "005b6b2"     "005b6d1"     "005b8b"      "005d"        "005d1"      
## [131] "005d1a2"     "005d1d4"     "005e"        "006"         "006a"       
## [136] "006b"        "006b2"       "007"         "008"         "008c"       
## [141] "008d"        "009"         "010b"        "010B"        "010e"       
## [146] "011a"        "012"         "012a"        "012A"        "012a1"      
## [151] "012a2"       "012b"        "101"         "101a"        "101b"       
## [156] "103"         "103a"        "103A"        "103a1"       "103A1"      
## [161] "105"         "105b1"       "108b"        "108b2"       "110"        
## [166] "111"         "111a2a"      "111a2a3"     "111a2c"      "115"        
## [171] "115a"        "117"         "118"         "118a"        "119"        
## [176] "120"         "120a"        "122"         "201"         "2011a"      
## [181] "201a"        "201A"        "201a1"       "201A1"       "201a123"    
## [186] "201a2"       "201a3"       "201b"        "201b1"       "201b2"      
## [191] "201c"        "201C"        "202"         "202b"        "203b3"      
## [196] "204"         "206"         "210A"        "210b"        "216"        
## [201] "225"         "226"         "228"         "228c"        "230"        
## [206] "230c"        "231"         "231a"        "231b"        "231b2"      
## [211] "233"         "233a"        "234"         "235"         "350"        
## [216] "35009"       "35013"       "35014"       "35015"       "35020"      
## [221] "35043"       "35046"       "35049"       "3504g"       "3509"       
## [226] "350a,b,d,g3" "350a3"       "350a4"       "350b2"       "350b3"      
## [231] "350c"        "350c1"       "350c3"       "350c4"       "350d1"      
## [236] "350d2"       "350d2, 3, 9" "350d3"       "350D3"       "350d4"      
## [241] "350d5"       "350d7"       "350e"        "350e1"       "350e2"      
## [246] "350e3"       "350e4"       "350e5"       "350e7"       "350e8"      
## [251] "350g"        "350G"        "350g1"       "350G1"       "350g1a"     
## [256] "350g2"       "350G2"       "350g3"       "350g3b"      "350g4"      
## [261] "350g9c"      "350h2"       "350h3"       "350h6"       "350i"       
## [266] "350i1"       "350i10"      "350i3"       "350i4"       "350i7"      
## [271] "351"         "35111"       "35120"       "351a3"       "351a54"     
## [276] "351c10"      "351d10"      "351d11"      "351d15"      "351d4"      
## [281] "351d5"       "351d7"       "352"         "352b"        "352b1"      
## [286] "352B1"       "352c"        "352d"        "352D"        "352d2"      
## [291] "352e"        "352f"        "352f2"       "352F2"

Plausibilitätsüberprüfungen

Was sind die kleinsten Einträge auf der Liste, das heisst: Wie viele Geschäfte im Wert von 1 Franken gibt es? Wie viele Geschäfte unter 1’000 Franken gibt es? Wie viele Geschäfte unter 10’000 Franken gibt es? Wie viele Geschäfte unter 100’000 Franken gibt es?

dim(seco_dual_use_cleaned[seco_dual_use_cleaned$Wert == 1, ])[1]
## [1] 121
dim(seco_dual_use_cleaned[seco_dual_use_cleaned$Wert <= 1000, ])[1]
## [1] 2153
dim(seco_dual_use_cleaned[seco_dual_use_cleaned$Wert <= 10000, ])[1]
## [1] 5998
dim(seco_dual_use_cleaned[seco_dual_use_cleaned$Wert <= 100000, ])[1]
## [1] 9631

Output als CSV

# Spalten neu ordnen
seco_dual_use_cleaned <- seco_dual_use_cleaned %>%
  select(GN, UnterGN, Quartal, Datum, Land, Wert, Verzeichnis, Signatur,
         Haupttyp, Untertyp, Zusatz, Herkunftsdatei)
# \n durch | ersetzen in Signatur
seco_dual_use_cleaned_for_output <- seco_dual_use_cleaned %>%
  mutate(Signatur = ifelse(Herkunftsdatei == "Tracker", 
                           sub("\\n", "|", Signatur), 
                           sub("\\r\\n", "|", Signatur))) %>%
  mutate(Untertyp = ifelse(is.na(Untertyp), "", as.character(Untertyp))) %>%
  mutate(Haupttyp = ifelse(is.na(Haupttyp), "", as.character(Haupttyp))) %>%
  mutate(Zusatz = ifelse(is.na(Zusatz), "", as.character(Zusatz))) %>% 
  mutate(GN = as.character(GN))
write.csv(seco_dual_use_cleaned_for_output, file = "output/seco_dual_use.csv")

# Output für Visualisierung
# Benötigt: Datum, Land, Wert, Verzeichnis, Haupttyp
seco_dual_use_for_vis <- seco_dual_use_cleaned %>%
  select(Datum, Land, Wert, Verzeichnis, Haupttyp) %>%
  mutate(Haupttyp = as.character(Haupttyp))
# Chemikalien zusammenfassen
seco_dual_use_for_vis$Haupttyp[seco_dual_use_for_vis$Verzeichnis == "ChKV"] <- 
  "0"
# NAs durch leere Strings ersetzen
seco_dual_use_for_vis$Haupttyp[is.na(seco_dual_use_for_vis$Haupttyp)] <- 
  ""
# 
# # Dummy-Daten für letztes Quartal
# seco_dual_use_for_vis %<>%
#   rbind(
#     data.frame(
#       "Datum" = "2017-10-01", 
#       "Land" = "USA", 
#       "Wert" = 1000000,
#       "Verzeichnis" = "GKV", 
#       "Haupttyp" = "2"
#     )
#   )
write.csv(seco_dual_use_for_vis, 
          file = "output/seco_dual_use_for_vis.csv", 
          row.names = F, quote = c(1, 2, 4, 5))

Output aller unterschiedlichen Signaturen als CSV

write.csv(data.frame(signatures = unique(paste(
  seco_dual_use_cleaned$Verzeichnis, 
  seco_dual_use_cleaned$Haupttyp, 
  seco_dual_use_cleaned$Untertyp, 
  seco_dual_use_cleaned$Zusatz))), "output/all_signatures.csv")

Output aller unterschiedlichen Verzeichnis-Haupttyp-Kategorien zur manuellen Beschreibung

only_top_category_signatures <- seco_dual_use_cleaned %>%
  select(Verzeichnis, Haupttyp) %>%
  distinct() %>%
  mutate(Beschreibung = "", Haupttyp = as.character(Haupttyp)) %>%
  arrange(Verzeichnis, Haupttyp)
write.csv(only_top_category_signatures, 
          "output/signatures_verzeichnis_haupttyp.csv", row.names = F)

Analyse

Generelles

Wie sieht die Verteilung aus?

cdf <- ggplot(seco_dual_use_cleaned, aes(x = Wert)) + 
  stat_ecdf() + 
  scale_x_log10(labels = formatAsChfWithoutCHF) + 
  scale_y_continuous(labels = percent)
cdf
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 76 rows containing non-finite values (stat_ecdf).

Wie viel Prozent des Exportvolumens sind Kleinaufträge oder Exporte zu Testzwecken (Definition gemäss SECO: Geschäfte mit einem Wert von unter 10’000 Franken)?

seco_dual_use %>%
  group_by("Unter 10'000" = Wert < 10000,
           "Zwischen 10'000 und 100'000" = Wert < 100000 & Wert >= 10000, 
           "Zwischen 100'000 und 1 Mio." = Wert >= 100000 & Wert < 1000000,
           "Zwischen 1 Mio. und 10 Mio." = Wert >= 1000000 & Wert < 10000000,
           "Über 10 Mio." = Wert >= 10000000) %>%
  summarise(Summe = sum(Wert), Anzahl = n()) %>%
  mutate(Summenanteil = Summe / sum(seco_dual_use_cleaned$Wert)) %>%
  gather(Kategorie, Value, -Summe, -Summenanteil, -Anzahl) %>%
  filter(Value == T) %>%
  select(-Value)
## # A tibble: 5 x 4
##        Summe Anzahl Summenanteil                   Kategorie
##        <dbl>  <int>        <dbl>                       <chr>
## 1   17948295   5957  0.002423761                Unter 10'000
## 2  135110344   3658  0.018245479 Zwischen 10'000 und 100'000
## 3 1444914231   4056  0.195123128 Zwischen 100'000 und 1 Mio.
## 4 1630355248    699  0.220165328 Zwischen 1 Mio. und 10 Mio.
## 5 4176812669     70  0.564042304                Über 10 Mio.
# Sonstige Kennzahlen

seco_dual_use %>%
  summarise(median = formatAsChf(median(Wert)), sd = formatAsChf(sd(Wert)), 
            mean = formatAsChf(mean(Wert)))
##            median               sd            mean
## 1 CHF 20'982.95.- CHF 10'022'994.- CHF 512'821.4.-

Es zeigt sich klar, dass Exporte mit kleinen Summen nur einen verschwindend kleinen Teil des gesamten Exportvolumens ausmachen (< 2 Prozent). Exporte zu Testzwecken oder temporäre Exporte fallen bei der nachfolgenden Analyse rein rechnerisch also nicht ins Gewicht. Geschäfte mit einem Handelswert von über 10 Mio. sind für rund 60 Prozent des Exportvolumens verantwortlich.

Exporte im Wert von wie vielen Franken wurden im untersuchten Zeitraum bewilligt?

formatAsChf(sum(seco_dual_use_cleaned$Wert))
## [1] "CHF 7'405'140'786.-"

Was sind die grössten Exporte auf der Liste?

arrange(seco_dual_use_cleaned, desc(Wert)) %>%
  mutate(Wert = formatAsChf(Wert)) %>%
  select(GN, Land, Verzeichnis, Quartal, Wert) %>%
  slice(1:10) 
## # A tibble: 10 x 5
##         GN          Land Verzeichnis Quartal                   Wert
##      <dbl>         <chr>      <fctr>   <chr>                  <chr>
##  1   12332 Saudi-Arabien    ML (GKV)   12/02 CHF 1'000'000'000.00.-
##  2 8002454 Saudi-Arabien    ML (GKV)   15/02 CHF   415'000'000.00.-
##  3 8001302         Katar    ML (GKV)   14/04 CHF   275'000'000.00.-
##  4 8008471        Indien    ML (GKV)   16/02 CHF   232'000'000.00.-
##  5   14476        Indien    ML (GKV)   13/03 CHF   165'000'000.00.-
##  6 8001226        Indien    ML (GKV)   14/04 CHF   135'100'000.00.-
##  7 8002561     Jordanien    ML (GKV)   16/01 CHF   120'000'000.00.-
##  8 8005535         Katar    ML (GKV)   15/04 CHF   119'200'000.00.-
##  9 8005555        Indien    ML (GKV)   15/04 CHF    80'000'000.00.-
## 10 8005539        Indien    ML (GKV)   15/04 CHF    80'000'000.00.-

Mit welchen 10 Ländern wird am meisten gehandelt?

laenderSummen10Sortiert <- seco_dual_use_cleaned %>%
  group_by(Land) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  slice(1:10)
laenderAndere <- seco_dual_use_cleaned %>%
  group_by(Land) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  slice(11:n()) %>%
  summarise(Land = "Andere", Wert = sum(Wert))

# Summe der sonstigen

laenderSummen10SortiertForBar <- rbind(laenderSummen10Sortiert, 
                                       laenderAndere) %>%
  mutate(Land = factor(Land, 
                       levels = c(laenderSummen10Sortiert$Land, 
                                  laenderAndere$Land))) 
# in die richtige Reihenfolge bringen

laenderSummenBar <- ggplot(data = laenderSummen10SortiertForBar, 
                           aes(x = Land, y = Wert)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Land") +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))
laenderSummenBar

Mit welchen 10 Ländern wird am meisten gehandelt, 2017?

laenderSummen10Sortiert <- seco_dual_use_cleaned %>%
  filter(Datum >= as.Date("2017-01-01")) %>% 
  group_by(Land) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  slice(1:10)
laenderAndere <- seco_dual_use_cleaned %>%
  filter(Datum >= as.Date("2017-01-01")) %>% 
  group_by(Land) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  slice(11:n()) %>%
  summarise(Land = "Andere", Wert = sum(Wert))

# Summe der sonstigen

laenderSummen10SortiertForBar <- 
  rbind(laenderSummen10Sortiert, laenderAndere) %>%
  mutate(Land = factor(Land, 
                       levels = c(laenderSummen10Sortiert$Land, 
                                  laenderAndere$Land))) 
# in die richtige Reihenfolge bringen

laenderSummenBar <- ggplot(data = laenderSummen10SortiertForBar, 
                           aes(x = Land, y = Wert)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Land") +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))
laenderSummenBar

Wie viel Prozent des Exportvolumens fallen auf die 5 Länder mit dem grössten bewilligten Exportvolumen?

laenderSummen5Sortiert <- seco_dual_use_cleaned %>%
  group_by(Land) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  slice(1:5)
sum(laenderSummen5Sortiert$Wert) / sum(seco_dual_use_cleaned$Wert) * 100
## [1] 67.13084

Wie verteilt sich das Exportvolumen auf die einzelnen Verzeichnisse?

verzeichnisSummen <- seco_dual_use_cleaned  %>% 
  group_by(Verzeichnis) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  mutate(Verzeichnis = factor(Verzeichnis, levels = Verzeichnis))
verzeichnisSummenBar <- ggplot(data = verzeichnisSummen, 
                               aes(x = Verzeichnis, y = Wert)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Verzeichnis") +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))
verzeichnisSummenBar

Temporale Auswertung

Summe nach Jahr

# Summe nach Jahr
exportvolumenNachJahr <- seco_dual_use_cleaned  %>% 
  group_by(Jahr = format(Datum, "%Y"), Verzeichnis) %>%
  summarise(Wert = sum(Wert)) %>%
  mutate(Verzeichnis = factor(Verzeichnis, levels = c("ML (GKV)", "GKV", 
                                                      "unbekannt", 
                                                      "ChKV", "5.1", "5.2")))

exportvolumenNachJahrBar <- ggplot(data = exportvolumenNachJahr, 
                                   aes(x = Jahr, 
                                       y = Wert, 
                                       fill = factor(Verzeichnis), 
                                       order = Verzeichnis)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Jahr") +
  scale_fill_discrete(name = "Verzeichnis")
  
exportvolumenNachJahrBar

Summe nach Jahr, nur Irak

# Summe nach Jahr
exportvolumenNachJahr <- seco_dual_use_cleaned  %>% 
  filter(Land == "Irak") %>% 
  group_by(Jahr = format(Datum, "%Y"), Verzeichnis) %>%
  summarise(Wert = sum(Wert)) %>%
  mutate(Verzeichnis = factor(Verzeichnis, 
                              levels = c("ML (GKV)", "GKV", 
                                         "unbekannt", "ChKV", "5.1", "5.2")))

exportvolumenNachJahrBar <- ggplot(data = exportvolumenNachJahr, 
                                   aes(x = Jahr, 
                                       y = Wert, 
                                       fill = factor(Verzeichnis), 
                                       order = Verzeichnis)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Jahr") +
  scale_fill_discrete(name = "Verzeichnis")
  
exportvolumenNachJahrBar

Summe nach Quartal

seco_dual_use_cleaned_with_quarter <- seco_dual_use_cleaned %>% 
  mutate(quarter = ceiling(as.integer(format(Datum, format = "%m")) / 3))

exportvolumenNachQuartal <- seco_dual_use_cleaned  %>% 
  group_by(Quartal = paste(format(Datum, format = "%Y"), 
                           ceiling(as.integer(format(Datum, 
                                                     format = "%m")) / 3), 
                           sep = "-"), 
           Verzeichnis) %>%
  summarise(Wert = sum(Wert)) %>%
  mutate(Verzeichnis = factor(Verzeichnis, 
                              levels = c("ML (GKV)", "GKV", 
                                         "unbekannt", "ChKV", "5.1", "5.2")))

exportvolumenNachQuartalBar <- ggplot(data = exportvolumenNachQuartal, 
                                      aes(x = Quartal, 
                                          y = Wert, 
                                          fill = factor(Verzeichnis), 
                                          order = Verzeichnis)) +
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Quartal") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  scale_fill_discrete(name = "Verzeichnis")
  
exportvolumenNachQuartalBar

Nur besondere militärische Güter (ML)

# Summe nach Jahr, nur Wassenaar-Güter
# zuerst brauchen wir die grössten fünf Kategorien
exportvolumenML5Groesste <- seco_dual_use_cleaned %>%
  filter(Verzeichnis == "ML (GKV)") %>%
  group_by(Haupttyp) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  select(Haupttyp) %>%
  slice(1:5)
exportvolumenNachJahrML <- seco_dual_use_cleaned  %>% 
  filter(Verzeichnis == "ML (GKV)") %>%
  group_by(Jahr = format(Datum, "%Y"), Haupttyp) %>%
  summarise(Wert = sum(Wert)) %>%
  mutate(Haupttyp = ifelse(Haupttyp %in% 
                             as.data.frame(exportvolumenML5Groesste)[, 1], 
                           as.character(Haupttyp), "andere")) %>%
  mutate(Haupttyp = factor(Haupttyp, 
                           levels = c(as.character(
                             as.data.frame(exportvolumenML5Groesste)[, 1]), 
                             "andere")))

exportvolumenNachJahrMLBar <- ggplot(data = exportvolumenNachJahrML, 
                                     aes(x = Jahr, 
                                         y = Wert, 
                                         fill = factor(Haupttyp), 
                                         order = Haupttyp)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Jahr") +
  scale_fill_discrete(name = "Haupttyp")
exportvolumenNachJahrMLBar

Nur Dual-Use (GKV)

# Summe nach Jahr, nur GKV
# zuerst brauchen wir die grössten fünf Kategorien
exportvolumenGKV5Groesste <- seco_dual_use_cleaned %>%
  filter(Verzeichnis == "GKV") %>%
  group_by(Haupttyp) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  select(Haupttyp) %>%
  slice(1:5)
exportvolumenNachJahrGKV <- seco_dual_use_cleaned  %>% 
  filter(Verzeichnis == "GKV") %>%
  group_by(Jahr = format(Datum, "%Y"), Haupttyp) %>%
  summarise(Wert = sum(Wert)) %>%
  mutate(Haupttyp = ifelse(Haupttyp %in% 
                             as.data.frame(exportvolumenGKV5Groesste)[, 1], 
                           as.character(Haupttyp), "andere")) %>%
  mutate(Haupttyp = factor(Haupttyp, levels = c(as.character(
    as.data.frame(exportvolumenGKV5Groesste)[, 1]), "andere")))

exportvolumenNachJahrGKVBar <- ggplot(data = exportvolumenNachJahrGKV, 
                                      aes(x = Jahr, 
                                          y = Wert, 
                                          fill = factor(Haupttyp), 
                                          order = Haupttyp)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Jahr") +
  scale_fill_discrete(name = "Haupttyp")
exportvolumenNachJahrGKVBar

Nur Irak

# Summe nach Jahr, nur GKV
# zuerst brauchen wir die grössten fünf Kategorien
exportvolumenGKV5Groesste <- seco_dual_use_cleaned %>%
  filter(Verzeichnis == "GKV", Land == "Irak") %>%
  group_by(Haupttyp) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  select(Haupttyp) %>%
  slice(1:5)
exportvolumenNachJahrGKV <- seco_dual_use_cleaned  %>% 
  filter(Verzeichnis == "GKV", Land == "Irak") %>%
  group_by(Jahr = format(Datum, "%Y"), Haupttyp) %>%
  summarise(Wert = sum(Wert)) %>%
  mutate(Haupttyp = ifelse(Haupttyp %in% 
                             as.data.frame(exportvolumenGKV5Groesste)[, 1], 
                           as.character(Haupttyp), "andere")) %>%
  mutate(Haupttyp = factor(Haupttyp, levels = c(as.character(
    as.data.frame(exportvolumenGKV5Groesste)[, 1]), "andere")))

exportvolumenNachJahrGKVBar <- ggplot(data = exportvolumenNachJahrGKV, 
                                      aes(x = Jahr, 
                                          y = Wert, 
                                          fill = factor(Haupttyp), 
                                          order = Haupttyp)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Jahr") +
  scale_fill_discrete(name = "Haupttyp")
exportvolumenNachJahrGKVBar

Summe nach Jahr, Naher Osten

neareastcountries <- c("Kuwait", "Bahrain", "Oman", "Katar", 
                       "Saudi-Arabien", "Vereinigte Arabische Emirate", 
                       "Jemen", "Israel", "Jordanien", "Libanon", 
                       "Syrien", "Ägypten", "Iran", "Türkei", "Irak")

# Summe nach Jahr
exportvolumenNachJahr <- seco_dual_use_cleaned  %>% 
  filter(Land %in% neareastcountries) %>% 
  group_by(Jahr = format(Datum, "%Y")) %>%
  summarise(Wert = sum(Wert))
exportvolumenNachJahrBar <- ggplot(data = exportvolumenNachJahr, 
                                   aes(x = Jahr, y = Wert)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Jahr")
  
exportvolumenNachJahrBar

Summe nach Quartal, Naher Osten

exportvolumenNachQuartal <- seco_dual_use_cleaned  %>% 
  filter(Land %in% neareastcountries) %>% 
  group_by(Quartal = paste(format(Datum, format = "%Y"), 
                           ceiling(as.integer(format(Datum, 
                                                     format = "%m")) / 3), 
                           sep = "-")) %>%
  summarise(Wert = sum(Wert))
exportvolumenNachQuartalBar <- ggplot(data = exportvolumenNachQuartal, 
                                      aes(x = Quartal, y = Wert)) +
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Quartal") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
  
exportvolumenNachQuartalBar

Summe nach Quartal, total

exportvolumenNachQuartal <- seco_dual_use_cleaned  %>% 
  group_by(Quartal = paste(format(Datum, format = "%Y"), 
                           ceiling(as.integer(format(Datum, 
                                                     format = "%m")) / 3), 
                           sep = "-")) %>%
  summarise(Wert = sum(Wert))
exportvolumenNachQuartalBar <- ggplot(data = exportvolumenNachQuartal, 
                                      aes(x = Quartal, y = Wert)) +
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Quartal") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
  
exportvolumenNachQuartalBar

Spezialauswertung IMSI-Catcher / Überwachungstechnologie

Bis Januar 2015 waren IMSI-Catcher wahrscheinlich vor allem in der Kat. 5A001i (“Systeme oder Ausrüstung, besonders entwickelt oder geändert für das Abhören und das Verarbeiten der Luftschnittstelle von mobilen Funkdiensten”), weniger noch in der Kat. 5A001f1 (“Vortäuschen der Funktionen von Einrichtungen eines Funkzugangsnetzes (RAN, Radio Access Network)”).

Ab Januar 2015 war es dann va. Kat. 5A001f (“Ausrüstung für das Abhören oder Stören von mobiler Kommunikation sowie Überwachungsausrüstung hierfür”).

Im aktuell gültigen Anhang (Mai 2017) ist es immer noch diese Kategorie

Filtern

imsi_exporte <- seco_dual_use_cleaned %>% 
  filter(Haupttyp == "5" & Untertyp == "A" &
    ((Datum < as.Date("2015-01-01") & (str_detect(Zusatz, "^001i") | 
                                         str_detect(Zusatz, "^001f1"))) | 
       (Datum >= as.Date("2015-01-01") & str_detect(Zusatz, "^001f")
        )
     )
    )
imsi_exporte %>% arrange(Land, Datum) %>% 
  mutate(Wert = formatAsChf(Wert)) %>% 
  select(Datum, Land, Wert, Signatur)
##          Datum                         Land               Wert
## 1   2013-07-04                     Algerien CHF  4'879'406.0.-
## 2   2013-06-19                    Äthiopien CHF      1'300.0.-
## 3   2017-10-01                    Äthiopien CHF     19'000.0.-
## 4   2014-07-11                   Bangladesh CHF      1'500.0.-
## 5   2016-04-01          Bosnien-Herzegowina CHF      3'000.0.-
## 6   2013-01-24                     Botswana CHF     29'318.0.-
## 7   2012-07-12                    Brasilien CHF      3'000.0.-
## 8   2014-07-11                       Brunei CHF      1'500.0.-
## 9   2015-12-08                    Bulgarien CHF      1'500.0.-
## 10  2016-01-01                    Bulgarien CHF      3'000.0.-
## 11  2016-01-01                    Bulgarien CHF      3'000.0.-
## 12  2016-07-01                        Chile CHF      9'500.0.-
## 13  2015-05-27                        China CHF     16'150.0.-
## 14  2015-08-27                        China CHF      7'125.0.-
## 15  2015-08-27                        China CHF     86'140.0.-
## 16  2015-09-01                        China CHF     16'150.0.-
## 17  2015-10-22                        China CHF      8'850.0.-
## 18  2015-12-14                        China CHF      8'075.0.-
## 19  2015-12-22                        China CHF        200.0.-
## 20  2016-01-01                        China CHF     17'700.0.-
## 21  2016-01-01                        China CHF     44'250.0.-
## 22  2016-04-01                        China CHF     17'700.0.-
## 23  2016-10-01                        China CHF     16'150.0.-
## 24  2016-10-01                        China CHF     20'060.0.-
## 25  2017-04-01                        China CHF     24'225.0.-
## 26  2012-06-12                  Deutschland CHF      3'000.0.-
## 27  2012-10-24                  Deutschland CHF      2'500.0.-
## 28  2015-09-16                  Deutschland CHF     44'250.0.-
## 29  2016-01-01                  Deutschland CHF        400.0.-
## 30  2017-07-01                  Deutschland CHF      8'850.0.-
## 31  2015-08-13      Dominikanische Republik CHF    301'823.0.-
## 32  2012-08-27                      Ecuador CHF      2'500.0.-
## 33  2014-04-09               Elfenbeinküste CHF      1'500.0.-
## 34  2015-08-13                   Frankreich CHF     90'155.0.-
## 35  2015-09-22                   Frankreich CHF      7'125.0.-
## 36  2016-01-01                   Frankreich CHF     90'155.0.-
## 37  2016-04-01                   Frankreich CHF        100.0.-
## 38  2016-04-01                   Frankreich CHF        100.0.-
## 39  2016-10-01                   Frankreich CHF      8'850.0.-
## 40  2017-04-01                   Frankreich CHF     14'250.0.-
## 41  2015-07-07                        Ghana CHF      4'500.0.-
## 42  2012-09-27                    Guatemala CHF        360.0.-
## 43  2014-08-04                    Hong Kong CHF      1'500.0.-
## 44  2013-02-08                       Indien CHF    898'820.0.-
## 45  2015-05-27                       Indien CHF     28'500.0.-
## 46  2015-07-01                       Indien CHF     78'850.0.-
## 47  2015-07-08                       Indien CHF         53.0.-
## 48  2015-07-10                       Indien CHF      8'075.0.-
## 49  2015-11-19                       Indien CHF      8'075.0.-
## 50  2017-10-01                       Indien CHF      8'960.0.-
## 51  2017-10-01                       Indien CHF      8'960.0.-
## 52  2012-11-14                   Indonesien CHF     19'431.0.-
## 53  2012-11-21                   Indonesien CHF      1'000.0.-
## 54  2014-02-26                   Indonesien CHF  1'827'780.0.-
## 55  2017-04-01                   Indonesien CHF     16'150.0.-
## 56  2017-07-01                   Indonesien CHF 13'068'000.0.-
## 57  2015-11-11                       Israel CHF      6'935.0.-
## 58  2012-06-11                        Katar CHF      2'500.0.-
## 59  2012-08-30                        Katar CHF      2'500.0.-
## 60  2012-09-26                        Katar CHF  1'628'480.0.-
## 61  2012-10-10                        Katar CHF    140'260.0.-
## 62  2014-11-17                        Katar CHF  6'082'794.0.-
## 63  2015-06-24                        Katar CHF     18'743.0.-
## 64  2015-06-25                        Katar CHF      5'125.0.-
## 65  2015-08-28                        Katar CHF    410'104.0.-
## 66  2016-01-01                        Katar CHF        394.0.-
## 67  2016-01-01                        Katar CHF        104.0.-
## 68  2016-01-01                        Katar CHF        394.0.-
## 69  2016-01-01                        Katar CHF        273.0.-
## 70  2016-01-01                        Katar CHF        104.0.-
## 71  2016-01-01                        Katar CHF        394.0.-
## 72  2016-01-01                        Katar CHF        104.0.-
## 73  2016-10-01                     Kroatien CHF      8'075.0.-
## 74  2014-02-26                       Kuwait CHF  4'895'800.0.-
## 75  2015-06-09                       Kuwait CHF  4'811'557.0.-
## 76  2015-08-26                       Kuwait CHF  3'486'753.0.-
## 77  2016-01-01                       Kuwait CHF  6'576'007.0.-
## 78  2012-06-05                      Libanon CHF    141'000.0.-
## 79  2012-10-16                      Libanon CHF    485'000.0.-
## 80  2013-04-05                      Libanon CHF        423.0.-
## 81  2014-02-26                      Libanon CHF    248'159.0.-
## 82  2015-06-04                      Libanon CHF  2'100'530.0.-
## 83  2012-12-18                      Litauen CHF      1'000.0.-
## 84  2015-08-19                      Litauen CHF      2'500.0.-
## 85  2012-12-12                        Macau CHF  1'147'080.0.-
## 86  2012-06-04                     Malaysia CHF     25'000.0.-
## 87  2013-04-15                      Marokko CHF      2'800.0.-
## 88  2014-03-26                      Marokko CHF      1'500.0.-
## 89  2014-07-11                      Marokko CHF      6'000.0.-
## 90  2012-07-10                       Mexiko CHF      1'000.0.-
## 91  2012-09-14                       Mexiko CHF      3'400.0.-
## 92  2012-10-03                       Mexiko CHF    777'600.0.-
## 93  2015-12-07                       Mexiko CHF      2'500.0.-
## 94  2017-10-01                       Mexiko CHF    369'365.0.-
## 95  2015-09-17                     Mongolei CHF      4'500.0.-
## 96  2012-06-04                      Nigeria CHF    890'000.0.-
## 97  2012-09-11                         Oman CHF      1'500.0.-
## 98  2016-10-01                   Österreich CHF     61'950.0.-
## 99  2012-07-05                     Pakistan CHF      1'400.0.-
## 100 2013-06-18                     Pakistan CHF     40'000.0.-
## 101 2015-10-02                     Pakistan CHF  1'099'332.0.-
## 102 2015-10-02                     Pakistan CHF    983'987.0.-
## 103 2015-10-02                     Pakistan CHF    550'185.0.-
## 104 2015-11-20                     Pakistan CHF  1'937'053.3.-
## 105 2015-11-20                     Pakistan CHF    417'053.7.-
## 106 2016-04-01                     Pakistan CHF  1'369'540.0.-
## 107 2016-04-01                     Pakistan CHF    561'084.3.-
## 108 2017-01-01                     Pakistan CHF    262'328.0.-
## 109 2017-04-01                     Pakistan CHF    121'235.4.-
## 110 2015-06-04                  Philippinen CHF    964'924.0.-
## 111 2015-10-28                  Philippinen CHF    755'625.0.-
## 112 2017-10-01                        Polen CHF    123'827.0.-
## 113 2016-07-01                     Portugal CHF      8'000.0.-
## 114 2015-11-02                     Russland CHF     10'030.0.-
## 115 2016-10-01                      Serbien CHF    147'000.0.-
## 116 2015-11-06                    Südafrika CHF        100.0.-
## 117 2015-11-30                    Südafrika CHF      7'125.0.-
## 118 2017-07-01                       Taiwan CHF     20'060.0.-
## 119 2012-06-25                     Thailand CHF      1'400.0.-
## 120 2012-09-05                     Thailand CHF        500.0.-
## 121 2012-09-13                     Thailand CHF      1'700.0.-
## 122 2012-09-18                     Thailand CHF        170.0.-
## 123 2012-10-25                     Thailand CHF        700.0.-
## 124 2013-01-21                     Thailand CHF      2'500.0.-
## 125 2014-11-17                     Thailand CHF    105'275.0.-
## 126 2012-05-30                   Tschechien CHF      3'000.0.-
## 127 2012-11-06                   Tschechien CHF      3'500.0.-
## 128 2013-05-28                   Tschechien CHF      2'500.0.-
## 129 2015-09-17                   Tschechien CHF      2'500.0.-
## 130 2014-03-13                     Tunesien CHF      1'500.0.-
## 131 2016-01-01                       Türkei CHF     10'778.0.-
## 132 2017-04-01                          USA CHF      8'075.0.-
## 133 2017-10-01                          USA CHF      8'075.0.-
## 134 2012-10-23                    Venezuela CHF      1'000.0.-
## 135 2012-02-09 Vereinigte Arabische Emirate CHF      3'500.0.-
## 136 2013-04-24                      Vietnam CHF    964'413.0.-
## 137 2016-01-01                      Vietnam CHF     10'030.0.-
## 138 2016-07-01                      Vietnam CHF      7'125.0.-
##                 Signatur
## 1                 5A001i
## 2                 5A001i
## 3               5A001.f1
## 4                 5A001i
## 5   5A001.f1\r\n5A001.f3
## 6                 5A001i
## 7                 5A001i
## 8                 5A001i
## 9               5A001.f2
## 10              5A001.f1
## 11              5A001.f1
## 12              5A001.f1
## 13              5A001.f1
## 14              5A001.f1
## 15              5A001.f1
## 16              5A001.f1
## 17              5A001.f1
## 18              5A001.f1
## 19              5A001.f1
## 20              5A001.f1
## 21              5A001.f1
## 22              5A001.f1
## 23              5A001.f1
## 24              5A001.f1
## 25              5A001.f1
## 26                5A001i
## 27                5A001i
## 28              5A001.f1
## 29              5A001.f1
## 30              5A001.f1
## 31              5A001.f3
## 32                5A001i
## 33                5A001i
## 34              5A001.f1
## 35              5A001.f1
## 36              5A001.f1
## 37              5A001.f1
## 38              5A001.f1
## 39              5A001.f1
## 40              5A001.f1
## 41  5A001.f3\r\n5A001.f1
## 42                5A001i
## 43                5A001i
## 44                5A001i
## 45              5A001.f1
## 46              5A001.f1
## 47              5A001.f1
## 48              5A001.f1
## 49              5A001.f1
## 50              5A001.f1
## 51              5A001.f1
## 52                5A001i
## 53                5A001i
## 54                5A001i
## 55              5A001.f1
## 56  5A001.f1\r\n5A001.f2
## 57              5A001.f1
## 58                5A001i
## 59                5A001i
## 60                5A001i
## 61                5A001i
## 62               5A001.i
## 63              5A001.f3
## 64               5A001.f
## 65               5A001.f
## 66               5A001.f
## 67               5A001.f
## 68               5A001.f
## 69               5A001.f
## 70               5A001.f
## 71               5A001.f
## 72               5A001.f
## 73              5A001.f1
## 74                5A001i
## 75               5A001.f
## 76              5A001.f3
## 77              5A001.f4
## 78                5A001i
## 79                5A001i
## 80                5A001i
## 81                5A001i
## 82               5A001.f
## 83                5A001i
## 84              5A001.f1
## 85                5A001i
## 86                5A001i
## 87                5A001i
## 88                5A001i
## 89                5A001i
## 90                5A001i
## 91                5A001i
## 92                5A001i
## 93  5A001.f1\r\n5A001.f3
## 94              5A001.f2
## 95  5A001.f1\r\n5A001.f3
## 96                5A001i
## 97                5A001i
## 98              5A001.f1
## 99                5A001i
## 100               5A001i
## 101           5A001.f3.a
## 102           5A001.f3.a
## 103           5A001.f3.a
## 104           5A001.f3.a
## 105           5A001.f3.a
## 106             5A001.f1
## 107           5A001.f3.a
## 108           5A001.f3.a
## 109           5A001.f.3a
## 110             5A001.f1
## 111             5A001.f1
## 112             5A001.f1
## 113             5A001.f1
## 114             5A001.f1
## 115             5A001.f2
## 116             5A001.f1
## 117             5A001.f1
## 118             5A001.f1
## 119               5A001i
## 120               5A001i
## 121               5A001i
## 122               5A001i
## 123               5A001i
## 124               5A001i
## 125              5A001.i
## 126               5A001i
## 127               5A001i
## 128               5A001i
## 129             5A001.f2
## 130               5A001i
## 131             5A001.f1
## 132             5A001.f1
## 133             5A001.f1
## 134               5A001i
## 135               5A001i
## 136               5A001i
## 137             5A001.f1
## 138             5A001.f1

Grösste Empfänger, seit 2012

laenderSummen10Sortiert <- imsi_exporte %>%
  group_by(Land) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  slice(1:10)
laenderAndere <- imsi_exporte %>%
  group_by(Land) %>%
  summarise(Wert = sum(Wert)) %>%
  arrange(desc(Wert)) %>%
  slice(11:n()) %>%
  summarise(Land = "Andere", Wert = sum(Wert))

# Summe der sonstigen

laenderSummen10SortiertForBar <- rbind(laenderSummen10Sortiert, 
                                       laenderAndere) %>%
  mutate(Land = factor(Land, 
                       levels = c(laenderSummen10Sortiert$Land, 
                                  laenderAndere$Land))) 
# in die richtige Reihenfolge bringen

laenderSummenBar <- ggplot(data = laenderSummen10SortiertForBar, 
                           aes(x = Land, y = Wert)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Land") +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))
laenderSummenBar

Entwicklung über Zeit

exportvolumenNachQuartal <- imsi_exporte  %>% 
  group_by(Quartal = paste(format(Datum, format = "%Y"), 
                           ceiling(as.integer(format(Datum, 
                                                     format = "%m")) / 3), 
                           sep = "-")) %>%
  summarise(Wert = sum(Wert))
exportvolumenNachQuartalBar <- ggplot(data = exportvolumenNachQuartal, 
                                      aes(x = Quartal, y = Wert)) +
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Quartal") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
  
exportvolumenNachQuartalBar

# Summe nach Jahr
exportvolumenNachJahr <- imsi_exporte %>% 
  group_by(Jahr = format(Datum, "%Y")) %>%
  summarise(Wert = sum(Wert))

exportvolumenNachJahrBar <- ggplot(data = exportvolumenNachJahr, 
                                   aes(x = Jahr, 
                                       y = Wert)) + 
  geom_bar(stat = "identity") + 
  scale_y_continuous(labels = formatAsChf) + 
  xlab("Jahr")
  
exportvolumenNachJahrBar

Was sind die grössten Exporte auf der Liste?

arrange(imsi_exporte, desc(Wert)) %>%
  mutate(Wert = formatAsChf(Wert)) %>%
  select(GN, Land, Verzeichnis, Quartal, Wert) %>%
  slice(1:15) 
## # A tibble: 15 x 5
##         GN       Land Verzeichnis Quartal               Wert
##      <dbl>      <chr>      <fctr>   <chr>              <chr>
##  1 8013093 Indonesien         GKV   17/03 CHF 13'068'000.0.-
##  2 8007794     Kuwait         GKV   16/01 CHF  6'576'007.0.-
##  3 8000865      Katar         GKV   14/04 CHF  6'082'794.0.-
##  4   14756     Kuwait         GKV   14/01 CHF  4'895'800.0.-
##  5   14190   Algerien         GKV   13/03 CHF  4'879'406.0.-
##  6 8001080     Kuwait         GKV   15/02 CHF  4'811'557.0.-
##  7 8003924     Kuwait         GKV   15/03 CHF  3'486'753.0.-
##  8 8001967    Libanon         GKV   15/02 CHF  2'100'530.0.-
##  9 8004927   Pakistan         GKV   15/04 CHF  1'937'053.3.-
## 10   15155 Indonesien         GKV   14/01 CHF  1'827'780.0.-
## 11   13119      Katar         GKV   12/03 CHF  1'628'480.0.-
## 12 8009371   Pakistan         GKV   16/02 CHF  1'369'540.0.-
## 13   13526      Macau         GKV   12/04 CHF  1'147'080.0.-
## 14 8003989   Pakistan         GKV   15/04 CHF  1'099'332.0.-
## 15 8003996   Pakistan         GKV   15/04 CHF    983'987.0.-

Ablehnungen gemäss bundesrätlicher Notverordnung

https://www.admin.ch/opc/de/classified-compilation/20150564/index.html#app1ahref0 Gemäss Verordnung vom 13. Mai 2015 kann der Export von Dual-Use-Gütern verweigert werden, wenn Grund zur Annahme besteht, dass:a.) das auszuführende oder das zu vermittelnde Gut von der Endempfängerin oder vom Endempfänger als Repressionsmittel verwendet wird; oder b.) die Übertragung eines Immaterialgutes nach Artikel 1 Buchstabe b oder die Einräumung von Rechten daran mit Bezug auf ein Gut erfolgt, von welchem anzunehmen ist, dass es als Repressionsmittel verwendet wird.

Als Güter zur Internet- und Mobilfunküberwachung gelten die folgenden im Anhang 2 der GKV1 unter den nachstehenden Exportkontrollnummern (EKN) aufgeführten Waren, Technologien und Softwareprodukte:

1.4A005 (Geräte für Betrieb von Intrusion-Software), 4D004 (Software für Betrieb von Intrusion-Software), 4E001 (Intrusion-Software), 5A001.f (IMSI-Catcher), 5A001.j (Internet-Monitoring-Tools), 5A002.a.2 (Systeme, Ausrüstung oder Bestandteil für kryptografische Informationssicherheit); 2.5D001 (Software zur Herstellung, Verwendung oder Enwicklung von 5A001), sofern Software zu den EKN 5A001.f und 5A001.j betroffen ist; 3.5E001 (Technologie zur Herstellung, Verwendung oder Entwicklung von 5A001), sofern Technologie zu den EKN 5A001.f und 5A001.j. betroffen ist; 4.5D002 (Software, die die Eigenschaften von 5A002 besitzt), sofern Software zur EKN 5A002.a.2 betroffen ist; 5.5E002 (Technologie zur Herstellung, Verwendung oder Enwicklung von 5A002), sofern Technologie zur EKN 5A002.a.2 betroffen ist.

Achtung! Leider lässt sich nicht herauslesen, ob bei den Bewilligungen der Punkte 2-5 die Einschränkungen zutreffen. Daher sind auch viele Exportbewilligungen im Dataframe, die nicht unter die Verordnung fallen.

Daten einlesen

denial_2015 <- read_excel(path = 
                            "input/denials/Denial_IP_2015_Ablehnungen.xlsx", 
                          sheet = 1)
# Spaltentypen setzen und umbenennen
denial_2015 <- denial_2015 %>%
  mutate(Geschäftsnummer = as.integer(Geschäftsnummer),
         Wert = as.numeric(`Wert [CHF]`), 
         Quartal = "15/01") %>%
  rename(GN = Geschäftsnummer, 
         Land = Bestimmungsland,
         Signatur = `Exportkontrollnummer EKN`) %>% 
  select(-`Wert [CHF]`)

denial_ab_2016 <- map_dfr(list.files("input/denials", 
                                     "^\\d{1}.*Quartal.{1}\\d{4}.*\\.xlsx$"), 
                        function(file){
  # parse file name
  quart <- as.numeric(
    str_match_all(file, 
    "^(\\d{1}).*Quartal.{1}\\d{4}.*\\.xlsx$")[[1]][, 2])
  year <- as.numeric(
    str_match_all(file, 
    "^\\d{1}.*Quartal.{1}(\\d{4}).*\\.xlsx$")[[1]][, 2])
  month <- (quart - 1) * 3 + 1
  # read in excel
  raw_data <- read_excel(path = paste0("input/denials/", file), sheet = 1)
  data <- raw_data %>% 
    mutate(Quartal = paste0(str_sub(year, 3), "/0", quart)) %>%
    mutate(as.integer(Geschäftsnummer)) %>% 
    rename_at(vars(contains("EKN")), ~"Signatur") %>% 
    rename_at(vars(starts_with("Ablehnungs")), ~"Ablehnungsgrundlage") %>% 
    select(GN = Geschäftsnummer, 
           Land = Bestimmungsland, 
           Güterart,
           Signatur,
           Ablehnungsgrundlage,
           Wert = `Wert [CHF]`, 
           Quartal
      )
  return(data)
})
denials <- denial_2015 %>% bind_rows(denial_ab_2016)

# print 
denials %>% 
  mutate(Wert = formatAsChf(Wert)) %>% 
  filter(str_detect(Ablehnungsgrundlage, "überwachung")) %>% 
  arrange(Quartal) %>% select(-Ablehnungsgrundlage)
## # A tibble: 11 x 6
##         GN                 Land                                 Güterart
##      <dbl>                <chr>                                    <chr>
##  1 8001798          Bangladesch                           Dual Use Güter
##  2 8002336          Bangladesch                           Dual Use Güter
##  3 8001458              Vietnam                           Dual Use Güter
##  4 8007596               Türkei                           Dual Use Güter
##  5 8010823             Thailand Dual Use Güter / Überwachungstechnologie
##  6 8010823             Thailand Dual Use Güter / Überwachungstechnologie
##  7 8015015 China, Volksrepublik                           Dual Use Güter
##  8 8015015 China, Volksrepublik                           Dual Use Güter
##  9 8015015 China, Volksrepublik                           Dual Use Güter
## 10 8015015 China, Volksrepublik                           Dual Use Güter
## 11 8015015 China, Volksrepublik                           Dual Use Güter
## # ... with 3 more variables: Signatur <chr>, Wert <chr>, Quartal <chr>

Die Tabelle beinhaltet nur Ablehnungen auf Grund von Art. 6 Abs. 1 Bst. a der Verordnung über die Ausfuhr und Vermittlung von Gütern zur Internet- und Mobilfunküberwachung.

Linting

Der Code in diesem RMarkdown wird mit lintr automatisch auf den Wickham’schen tidyverse style guide überprüft.

lintr::lint("main.Rmd", linters = 
              lintr::with_defaults(
                commented_code_linter = NULL,
                trailing_whitespace_linter = NULL
                )
            )
## main.Rmd:414:12: style: Variable and function names should be all lowercase.
##            ChKV) %>% 
##            ^~~~
## main.Rmd:415:31: style: Variable and function names should be all lowercase.
##   group_by(GN, Quartal, Land, UnterGN) %>%
##                               ^~~~~~~
## main.Rmd:436:38: style: Variable and function names should be all lowercase.
##   gather(Variable, Value, `AG (GKV)`:ChKV) %>%                        
##                                      ^~~~
## main.Rmd:437:31: style: Variable and function names should be all lowercase.
##   group_by(GN, Quartal, Land, UnterGN) %>% 
##                               ^~~~~~~
## main.Rmd:662:14: style: Variable and function names should be all lowercase.
##   select(GN, UnterGN, Quartal, Datum, Land, Wert, Verzeichnis, Signatur,
##              ^~~~~~~
## main.Rmd:1127:6: style: Place a space before left parenthesis, except in a function call.
##     ((Datum < as.Date("2015-01-01") & (str_detect(Zusatz, "^001i") | 
##      ^
## main.Rmd:1264:48: warning: Do not use absolute paths.
##     mutate(Quartal = paste0(str_sub(year, 3), "/0", quart)) %>%
##                                                ^~