We Catch you All

03.07.2019 - The Infamous - Reading time ~15 Minutes

Forschungsfrage

Wir wollen untersuchen ob Frauen und Männer im deutschen Parlament unterschiedliche Themen ansprechen. Dazu beschränken wir uns auf die 17 Legislaturperiode.

Preliminiaries

suppressPackageStartupMessages(library(devtools))
#install_github("saschagobel/legislatoR")
suppressPackageStartupMessages(library(polmineR))
suppressPackageStartupMessages(library(GermaParl))
suppressPackageStartupMessages(library(quanteda))
suppressPackageStartupMessages(library(legislatoR))
suppressPackageStartupMessages(library(slam))
suppressPackageStartupMessages(library(tidyr))
suppressPackageStartupMessages(library(ggplot2))
suppressPackageStartupMessages(library(stringr))
suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(ldatuning))
suppressPackageStartupMessages(library(corrplot))
# Hier einmal den pfad festlegen in dem deine Analyse liegt
#dein_pfad <- "C:/Users/felix/OneDrive/Dokumente/Master Angewandte Statistik/SS19/Standardisierte Erhebungsmethoden/Analysen/CatchYouAll"
dein_pfad <- "../../../webpage_gruppen/gruppe5"
#setwd(dein_pfad)
pfad <- paste(dein_pfad, "/", sep = "")
################################################################################
source(paste(pfad, "GermaParl_Daten_wrapper.R", sep = ""))


# Welche Legislatuperiode
lp = "17"
# für welche Parteien
party = "all"

Loading and checking the Data

use("GermaParl") 
## ... activating corpus: GERMAPARL
## ... activating corpus: GERMAPARLMINI
polmineR::corpus() 
##          corpus      size template
## 1     GERMAPARL 101013708     TRUE
## 2 GERMAPARLMINI    222201     TRUE
## 3       REUTERS      4050    FALSE
size("GERMAPARL")
## [1] 101013708

# extrahiere Sprecher
speaker <- s_attributes("GERMAPARL", s_attribute = "speaker")

wer_spricht_wie_viel <- as.data.frame(size("GERMAPARL", s_attribute = c("speaker", "party")))
wer_spricht_wie_viel <- subset(wer_spricht_wie_viel, speaker != "")

head(wer_spricht_wie_viel)
##                 speaker party   size
## 6        Achim Großmann   SPD 113226
## 7            Achim Post   SPD   4785
## 8  Adelheid D. Tröscher   SPD  29462
## 9        Adolf Ostertag   SPD  44002
## 10           Adolf Roth   CDU  24900
## 11         Agnes Alpers LINKE  18824
deu_politicians <- get_core(legislature = "deu")

str(deu_politicians)
## 'data.frame':    4075 obs. of  12 variables:
##  $ country   : chr  "DEU" "DEU" "DEU" "DEU" ...
##  $ pageid    : int  2657 171955 171957 171967 172061 172064 172072 172084 172133 172135 ...
##  $ wikidataid: chr  "Q2492" "Q100613" "Q360721" "Q1382213" ...
##  $ wikititle : chr  "Konrad_Adenauer" "Willi_Agatz" "Adolf_Ahrens_(Kapitän)" "Johannes_Albers" ...
##  $ name      : chr  "Konrad Adenauer" "Willi Agatz" "Adolf Ahrens" "Johannes Albers" ...
##  $ sex       : chr  "male" "male" "male" "male" ...
##  $ ethnicity : chr  "white" NA NA NA ...
##  $ religion  : chr  "catholicism" NA "protestantism evangelical" "catholicism" ...
##  $ birth     : POSIXct, format: "1876-01-05" "1904-01-01" ...
##  $ death     : POSIXct, format: "1967-04-19" "1957-01-01" ...
##  $ birthplace: chr  "50.94222,6.95778" "51.45083,7.01306" "53.5364,8.60056" "51.2,6.43333" ...
##  $ deathplace: chr  "50.6595,7.21282" "52.51667,13.38333" "53.07694,8.80889" "50.94222,6.95778" ...

log_matching_speaker <- speaker %in% deu_politicians$name
table(log_matching_speaker)
## log_matching_speaker
## FALSE  TRUE 
##   173  1649
# which speakers don´t match
# head(speaker[!log_matching_speaker])

# haben wir für alle Politiber das Geschlecht?
table(is.na(deu_politicians$sex))
## 
## FALSE  TRUE 
##  4073     2


speakers_by_gender <- data.frame(speaker, gender = rep(NA, length(speaker)))
suppressWarnings(
for (i in 1:length(speaker)) {
  if(log_matching_speaker[i]){
    row_number <- which(speaker[i] == deu_politicians$name)
    speakers_by_gender$gender[i] <- deu_politicians$sex[row_number]
  }
# irgendwie enstehen NAs, es kann sein das mache Namen nicht matchen
})

# wie löschen die NAs erstmal
speakers_by_gender <- drop_na(speakers_by_gender)

# jetzt haben wir eine aufgeräumte Liste aller speaker mit gender
head(speakers_by_gender)
##            speaker gender
## 1    Rita Süssmuth female
## 2   Günter Rexrodt   male
## 3 Rudolf Scharping   male
## 4     Michael Glos   male
## 5    Antje Vollmer female
## 6  Joschka Fischer   male

Corpus in für Geschlecht teilen und auf Reden aggregieren. Danach extrahieren wir die Daten die wir wollen. Wenn für party “all” eingegeben wird erhalten wir die Daten für alle Partein. Externe Definition für spätere Benennung des Models von variable lp und party.

female_speakers <- speakers_by_gender$speaker[speakers_by_gender$gender == "female"]
male_speakers <-  speakers_by_gender$speaker[speakers_by_gender$gender == "male"]

# Welche Legislatuperiode
lp = "17"
# für welche Parteien
party = "all"
list_gender_speeches <- Daten_wrapper(female_speakers = female_speakers,
                                        male_speakers = male_speakers,
                                        lp = lp,
                                        party = party)
  # extrahiere männliche und weibliche reden aus der liste
  female_speeches <- list_gender_speeches[[1]]
  save(female_speeches, file=
         paste(pfad, "female_speeches", "_", party, ".rda", sep = ""))
  male_speeches <- list_gender_speeches[[2]]
  save(male_speeches, file=
         paste(pfad, "male_speeches", "_", party, ".rda", sep = ""))
  class(female_speeches)
  # lösche die lite für memory management
  rm(list_gender_speeches)

Wie sieht diese Funktion eigentlich aus?

Daten_wrapper <- function(female_speakers = female_speakers, 
                          male_speakers = male_speakers,
                          lp = "17",
                          party = "all"){
  
  partition_by_gender <- function(genders){
    GermaParl_partition <- partition("GERMAPARL", lp = "17", interjection = FALSE)
    GermaParl_partition <- partition(GermaParl_partition, 
                                     speaker = genders, regex = F)
# Filtern nach Partei
    if(party != "all"){
      GermaParl_partition <- partition(GermaParl_partition, 
                                       party = party, regex = F)
    }
    
    # jetzt sollte das decoden schnell gehen
    GermaParl_partition <- decode(GermaParl_partition)
    return(GermaParl_partition)
  }
  
  female_partition <- partition_by_gender(female_speakers)
  male_partition <- partition_by_gender(male_speakers)

  
  # für die weitere Berechnung gibt es sonst Namespace Kollisionen
  detach("package:GermaParl", unload=TRUE)
  detach("package:polmineR", unload=TRUE)
  
  unified_speeches <- function(GermaParl_partition){
    GermaParl_partition2 <- as_tibble(GermaParl_partition)
    
    
    # Aggregation auf Reden
    time1 <- Sys.time()
    GermaParl_speeches <- GermaParl_partition2 %>% 
      #Gruppiere über alle möglichen Id Variablen
      group_by(lp, year, session, date, speaker, party, parliamentary_group, role, 
               agenda_item, agenda_item_type, url, src) %>% 
      #Aggregieren lemma, pos, word
      summarise(lemma = str_c(lemma, collapse = " "), 
                pos = str_c(pos, collapse = " "), 
                word = str_c(word, collapse = " ")) %>% 
      ungroup() 
    (dauer <- Sys.time()-time1)
    
    names(GermaParl_speeches)[names(GermaParl_speeches)== "word"] <- "text"
    
    return(GermaParl_speeches)
  }
  
  female_speeches <- unified_speeches(female_partition)
  male_speeches <- unified_speeches(male_partition)
  
  return(list(female_speeches, male_speeches))
}

Erstellen einer Document Feature Matrix

# übersetzen in einen Corpus
  female_speeches_corp <- female_speeches %>% 
    quanteda::corpus()
  male_speeches_corp <- male_speeches %>% 
    quanteda::corpus()
  
  
  #Dokumentenvariablen, hier können auch noch weitere je nach bedarf 
  # ausgewählt werden
  quanteda::docvars(female_speeches_corp) <- female_speeches %>% 
    select(date, speaker, text)
  quanteda::docvars(male_speeches_corp) <- male_speeches %>% 
    select(date, speaker, text)
  
  #Exploration
  # female_speeches_corp %>% 
  #   summary(2)
  
  #DFM female erstellen
  time2.1 <- Sys.time()
  speeches_dfm_female <- female_speeches_corp %>% 
    dfm(remove_punct = TRUE, #Punktuation löschen
        remove_numbers = TRUE, #Zahlen löschen
        remove = stopwords("german"), #Deutsche Stoppwörter löschen
        stem = TRUE) #Zurückführen auf Wortstamm
  (time2.2 <- Sys.time()- time2.1)
  
  speeches_dfm_female %>% 
    dim()
  save(speeches_dfm_female, file=
         paste(pfad, "speeches_dfm_female", "_", party, ".rda", sep = ""))
  
  #DFM male erstellen
  time2.1 <- Sys.time()
  speeches_dfm_male <- male_speeches_corp %>% 
    dfm(remove_punct = TRUE, #Punktuation löschen
        remove_numbers = TRUE, #Zahlen löschen
        remove = stopwords("german"), #Deutsche Stoppwörter löschen
        stem = TRUE) #Zurückführen auf Wortstamm
  (time2.2 <- Sys.time()- time2.1)
  
  speeches_dfm_male %>% 
    dim()
  save(speeches_dfm_male, file=
         paste(pfad, "speeches_dfm_male", "_", party, ".rda", sep = ""))
## Document-feature matrix of: 10 documents, 6 features (63.3% sparse).
## 10 x 6 sparse Matrix of class "dfm"
##         features
## docs     herr präsident nehm wahl gern bedank
##   text1     1         1    1    1    1      1
##   text2     0         0    1    1    0      1
##   text3     0         0    1    1    1      0
##   text4     0         0    0    0    0      0
##   text5     0         0    0    0    0      0
##   text6     1         1    0    0    1      0
##   text7     5         2    0    0    0      0
##   text8     0         1    0    0    0      0
##   text9     2         0    1    0    0      0
##   text10    2         0    0    0    1      0

Berechnung Latent Dirichlet Allocation

# lade LDA Funktion und speichere Berechnung
source(paste(pfad, "LDA_Topic_Model_wrapper1.R", sep = ""))
# führe Berechnung durch, wenn sie bereits erfolg ist wird das File geladen

# Set Hyperparameters for Gibbs-Sampling
burnin <- 5000
iter <- 2000
thin <- 500
seed <-list(2019,11,7,100003,943)
nstart <- 5
best <- TRUE
control <- list(nstart=nstart, 
                seed = seed, 
                best=best, 
                burnin = burnin, 
                iter = iter, 
                thin=thin)
# welche Topic Modelle wollen wir testen?
topics_seq <- c(5,10,15,20,25,30,35,40,50,60,80,100)

Ausführen der eigentlichen Funktion.

### LDA ###
list_number_topics_female <- LDA_Topic_Model(daten = speeches_dfm_female, 
                                         lp = lp, party = party, 
                                         gender = "female", plot = TRUE,
                                         topics_seq = topics_seq,
                                         pfad = pfad,
                                         cores = 2L,
                                         control = control)
if(file.exists(paste(pfad, "number_topics",
                     "_", "female", "_", lp, "_", party, 
                     ".rda", sep = ""))){

  input_dfm_female <- list_number_topics_female[[1]]
  number_topics_female <- list_number_topics_female[[2]]
  print(list_number_topics_female[[3]])
}
## Time difference of 21.25967 mins
# lösche die Liste wieder
rm(list_number_topics_female)

# Abbildung
number_topics_female %>% 
  FindTopicsNumber_plot()

Für Männliche Parlamentarier.

### LDA ###
list_number_topics_male <- LDA_Topic_Model(daten = speeches_dfm_female, 
                                         lp = lp, party = party, 
                                         gender = "male", plot = TRUE,
                                         topics_seq = topics_seq,
                                         pfad = pfad,
                                         cores = 2L,
                                         control = control)
if(file.exists(paste(pfad, "number_topics",
                     "_", "male", "_", lp, "_", party, 
                     ".rda", sep = ""))){

  input_dfm_male <- list_number_topics_male[[1]]
  number_topics_male <- list_number_topics_male[[2]]
  print(list_number_topics_male[[3]])
}
## Time difference of 36.06369 mins
# lösche die Liste wieder
rm(list_number_topics_male)

# Abbildung
number_topics_male %>% 
  FindTopicsNumber_plot()

Die Funktion mit der alles berechnet wird sieht so aus:

LDA_Topic_Model <- function(daten, lp = lp, party = party, 
                            gender = "female", plot = TRUE,
                            topics_seq = seq(from = 5, to = 95, by = 15),
                            cores = 3L,
                            control = control,
                            pfad = "C:/Users/felix/OneDrive/Dokumente/Master Angewandte Statistik/SS19/Standardisierte Erhebungsmethoden/number_topics"){
  #Konvertierung 
  if(file.exists(paste(pfad, "number_topics",
                       "_", gender, "_", lp, "_", party, 
                       ".rda", sep = ""))){
    load(paste(pfad, "number_topics", "_", gender, "_", lp, "_", party, 
                 ".rda", sep = ""))
    }
    
  } else {
    input_dfm <- daten %>% 
      convert(to = "topicmodels")
    
    #DFM trimmen, d.h. Features löschen
    #hier: nur Features behalten, die einen größeren TF-IDF Wert als den 
    # Medianwert haben für weitere Eläuterungen siehe die Vignette des Paketes:
    #https://cran.r-project.org/web/packages/topicmodels/vignettes/topicmodels.pdf
    
    summary(slam::col_sums(input_dfm))
    
    term_tfidf <- tapply(
      input_dfm$v /
        slam::row_sums(input_dfm)[input_dfm$i], input_dfm$j, mean) *
      log2(nrow(input_dfm)/slam::col_sums(input_dfm > 0))
    summary(term_tfidf)
    
    input_dfm <- input_dfm[, term_tfidf >= median(term_tfidf)]
    input_dfm <- input_dfm[slam::row_sums(input_dfm) > 0, ] #leere Spalten löschen
    summary(slam::col_sums(input_dfm))
    
    input_dfm %>% 
      dim()
    
    input_dfm %>% 
      glimpse()
    
    # -------------------------------------------------------------------------- #
    time1.1 <- Sys.time()
    number_topics <- FindTopicsNumber(
      input_dfm, 
      topics = topics_seq, 
      metrics = c("Griffiths2004", "CaoJuan2009", "Arun2010", "Deveaud2014"),
      method = "Gibbs",
      control = control,
      mc.cores = cores,
      verbose = TRUE
    )
    (time1.2 <- Sys.time()- time1.1)
    
    # Plots if required
    if(plot){
      number_topics %>% 
        FindTopicsNumber_plot()
    }
    
    # save the estimation:
    if(gender == "female"){
      list_number_topics_female <- list(input_dfm, number_topics, time1.2)
      save(input_dfm, file=
             paste(pfad, "input_dfm", "_", gender, "_", lp, "_", party, 
                   ".rda", sep = ""))
      save(number_topics, file=
             paste(pfad, "number_topics", "_", gender, "_", lp, "_", party, 
                   ".rda", sep = ""))
      save(list_number_topics_female, file=
             paste(pfad, "list_number_topics", "_", gender, "_", lp, "_", party, 
                   ".rda", sep = ""))
      print(time1.2)
      return(list_number_topics_female)
    } else if(gender == "male"){
      list_number_topics_male <- list(input_dfm, number_topics, time1.2)
      save(input_dfm, file=
             paste(pfad, "input_dfm", "_", gender, "_", lp, "_", party, 
                   ".rda", sep = ""))
      save(number_topics, file=
             paste(pfad, "number_topics", "_", gender, "_", lp, "_", party, 
                   ".rda", sep = ""))
      save(list_number_topics_male, file=
             paste(pfad, "list_number_topics",
                   "_", gender, "_", lp, "_", party, 
                   ".rda", sep = ""))
      print(time1.2)
      return(list_number_topics_male)
    }
  }
}

Wir haben uns enschieden eine LDA mit 35 Themen zu berechnen. Ausgehen von der Abbildung wäre es vielleicht von Vorteil gewesen nur circa die Hälfte zu nehmen, aber tendenziell werden im deutschen Parlament eher mehr als 35 Themen besprochen.

k = 35

# Für Frauen
  speeches_lda_female <- input_dfm_female %>% 
    topicmodels::LDA(k = k, method= "Gibbs", control = control)
  
  # Für Männer
  speeches_lda_male <- input_dfm_male %>% 
    topicmodels::LDA(k = k, method= "Gibbs", control = control)
  

Ergebnisse

Frauen

speeches_lda_female %>% 
  topicmodels::get_terms(10) %>% 
  t() %>% 
  DT::datatable()

Männer

speeches_lda_male %>% 
  topicmodels::get_terms(10) %>% 
  t() %>% 
  DT::datatable()

Eine kleine Spielerei um zu sehen ob es Übereinstimmungen in den Themen gibt.

woerter <- 50
speeches_lda_female.terms <- as.matrix(terms(speeches_lda_female,woerter))
speeches_lda_male.terms <- as.matrix(terms(speeches_lda_male,woerter))
speeches_lda_female.terms[1:10, 1:6]
topic_connections_f <- diag(35)
for (i in 1:k) {
  for (z in 1:k) {
    tmp <- table(speeches_lda_female.terms[, i] %in% 
            speeches_lda_male.terms[, z])["TRUE"]/woerter
    if(is.na(tmp)){
      tmp <- 0
    }
    topic_connections_f[i,z] <- tmp
    topic_connections_f[z,i] <- tmp
  }
}
topic_connections_f[1:10, 1:10]

corrplot(topic_connections_f, method="color")
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,] 0.02    0 0.10 0.00    0 0.04 0.00 0.00 0.00  0.00
##  [2,] 0.00    0 0.00 0.00    0 0.00 0.00 0.00 0.00  0.00
##  [3,] 0.10    0 0.02 0.00    0 0.00 0.00 0.00 0.10  0.02
##  [4,] 0.00    0 0.00 0.00    0 0.00 0.00 0.00 0.06  0.00
##  [5,] 0.00    0 0.00 0.00    0 0.00 0.00 0.00 0.00  0.00
##  [6,] 0.04    0 0.00 0.00    0 0.04 0.00 0.06 0.00  0.00
##  [7,] 0.00    0 0.00 0.00    0 0.00 0.00 0.12 0.00  0.02
##  [8,] 0.00    0 0.00 0.00    0 0.06 0.12 0.02 0.00  0.00
##  [9,] 0.00    0 0.10 0.06    0 0.00 0.00 0.00 0.02  0.00
## [10,] 0.00    0 0.02 0.00    0 0.00 0.02 0.00 0.00  0.00

# -----------------------------------------------------------------------------#
topic_connections_m <- diag(35)
for (i in 1:k) {
  for (z in 1:k) {
    tmp <- table(speeches_lda_male.terms[, i] %in% 
                   speeches_lda_female.terms[, z])["TRUE"]/woerter
    if(is.na(tmp)){
      tmp <- 0
    }
    topic_connections_m[i,z] <- tmp
    topic_connections_m[z,i] <- tmp
  }
}
#topic_connections_m[1:10, 1:10]
corrplot(topic_connections_m, method="color")

Man könnte sich also ein Thema bei dem viel Übereinstimmung ist genauer ansehen.

speeches_lda_female.terms[, 20] 
##  [1] "ausschuss"                "drucksach"               
##  [3] "beschlussempfehlung"      "stimmt"                  
##  [5] "abgeordnet"               "bündnis"                 
##  [7] "abgeordneten"             "tagesordnungspunkt"      
##  [9] "überweisungsvorschlag"    "aussprach"               
## [11] "enthaltungen"             "f"                       
## [13] "empfiehlt"                "überweisung"             
## [15] "tagesordnung"             "berichterstattung"       
## [17] "einverstanden"            "drucksachen"             
## [19] "interfraktionel"          "eingebrachten"           
## [21] "spd-fraktion"             "rechtsausschuss"         
## [23] "ausschüss"                "protokol"                
## [25] "aufgeführten"             "sammelübersicht"         
## [27] "innenausschuss"           "buchstab"                
## [29] "entschließungsantrag"     "senioren"                
## [31] "jugend"                   "finanzausschuss"         
## [33] "gegenstimmen"             "vorlag"                  
## [35] "enthaltung"               "petitionsausschuss"      
## [37] "federführung"             "stadtentwicklung"        
## [39] "reaktorsicherheit"        "naturschutz"             
## [41] "angelegenheiten"          "petitionen"              
## [43] "landwirtschaft"           "technikfolgenabschätzung"
## [45] "fdp-fraktion"             "unionsfrakt"             
## [47] "humanitär"                "ausschussfassung"        
## [49] "vorlagen"                 "geschäftsordnung"
speeches_lda_male.terms[, 34]
##  [1] "ausschuss"                "drucksach"               
##  [3] "beschlussempfehlung"      "beratung"                
##  [5] "stimmt"                   "abgeordnet"              
##  [7] "tagesordnungspunkt"       "angenommen"              
##  [9] "enthaltungen"             "überweisungsvorschlag"   
## [11] "f"                        "empfiehlt"               
## [13] "berichterstattung"        "überweisung"             
## [15] "eingebrachten"            "tagesordnung"            
## [17] "aussprach"                "rechtsausschuss"         
## [19] "drucksachen"              "gegenstimmen"            
## [21] "protokol"                 "interfraktionel"         
## [23] "einverstanden"            "ausschüss"               
## [25] "sammelübersicht"          "enthaltung"              
## [27] "innenausschuss"           "aufgeführten"            
## [29] "buchstab"                 "petitionsausschuss"      
## [31] "linksfrakt"               "senioren"                
## [33] "technikfolgenabschätzung" "zusatzpunkt"             
## [35] "jugend"                   "naturschutz"             
## [37] "stadtentwicklung"         "petitionen"              
## [39] "reaktorsicherheit"        "vorlag"                  
## [41] "ausschussfassung"         "schlussabstimmung"       
## [43] "federführung"             "handzeichen"             
## [45] "entschließungsantrag"     "landwirtschaft"          
## [47] "gegenprob"                "ausgewiesen"             
## [49] "geschäftsordnung"         "redner"

Jede Rede wird als eine Mischung verschiedener Themen angesehen. Man kann sich dementsprechend auch die Wahrscheinlichkeiten anschauen, mit der jedes Thema zu der Rede gehört.

#probabilities associated with each topic assignment
topicProbabilities <- as.data.frame(speeches_lda_female@gamma)
topicProbabilities[1:10, 1:6]
##            V1         V2         V3         V4         V5         V6
## 1  0.02747253 0.02747253 0.02747253 0.02747253 0.02747253 0.06593407
## 2  0.02747253 0.02747253 0.02747253 0.02747253 0.02747253 0.06593407
## 3  0.02801120 0.02801120 0.02801120 0.02801120 0.02801120 0.04761905
## 4  0.01642036 0.01642036 0.01642036 0.01642036 0.01642036 0.02791461
## 5  0.01457726 0.03498542 0.02478134 0.04518950 0.02478134 0.01457726
## 6  0.02998236 0.01763668 0.01763668 0.09171076 0.02998236 0.02998236
## 7  0.01855288 0.01855288 0.03153989 0.01855288 0.01855288 0.04452690
## 8  0.03469388 0.02040816 0.02040816 0.02040816 0.02040816 0.02040816
## 9  0.01700680 0.01700680 0.01700680 0.01700680 0.01700680 0.02891156
## 10 0.01680672 0.01680672 0.01680672 0.01680672 0.01680672 0.01680672

Mal schauen was in den Reden steht.

female_speeches$text[1]
## [1] "Herr Präsident , ich nehme die Wahl gerne an und bedanke mich herzlich für das Vertrauen ."
female_speeches$text[6]
## [1] "Herr Präsident ! Meine Damen und Herren ! Sehr geehrte Kollegen von der Linksfraktion , das Positive zu Beginn . Den ersten Teil Ihres Antrags , die `` Kreditklemme überwinden `` , unterstütze ich gern . Auch Ihre Situationsanalyse teile ich in einigen Punkten , komme allerdings zu komplett anderen Schlussfolgerungen , was Sie wahrscheinlich verwundert . Die Kreditversorgung von Unternehmen ist eine der Kernaufgaben der Banken . Das gilt umso mehr in der schwersten Wirtschaftskrise der Bundesrepublik . Noch gibt es keine flächendeckende Kreditklemme ; so die Auskunft der Regierung im Finanzausschuss dieser Woche . `` Noch keine `` heißt : Die Bundesregierung ist sich durchaus bewusst , dass sich die Situation 2010 verschärfen kann , wenn die Bankbilanzen für 2009 aufgrund der Verlustabschreibung weniger Eigenkapital ausweisen werden . Hinzu kommt , dass die Wirtschaft in einem beginnenden Aufschwung erfahrungsgemäß einerseits mehr Fremdkapital benötigt , andererseits das Eigenkapital der Unternehmen abgeschmolzen ist und zur Besicherung nicht mehr ausreichend zur Verfügung steht . `` Noch nicht flächendeckend `` bedeutet : In einzelnen Branchen , zum Beispiel im Handwerk und im Maschinenbau , und bei einzelnen Betriebsgrößen , hier vor allen Dingen im Mittelstand , haben Unternehmen unbestritten bereits heute Probleme , Kredite zu erhalten . Es besteht durchaus Handlungsbedarf ; blinder Aktionismus ist unangebracht . Es ist sehr kritisch zu sehen , dass viele Kreditinstitute ihrer Verantwortung nicht gerecht wurden und werden . Ich sage deutlich : Jetzt sind in erster Linie die Banken am Zug , nicht der Staat , sprich : die Steuerzahler . Ich begrüße ausdrücklich die Ankündigungen der Commerzbank und des Deutschen Sparkassen - und Giroverbands , das Volumen der Kredite für den Mittelstand zu erhöhen , ebenso den Vorschlag der Deutschen Bank , seitens der Privatbanken einen Mittelstandsfonds aufzulegen . Ich erwarte allerdings auch , dass diese Ankündigungen zügig umgesetzt werden . Die in den letzten Monaten verschärften Kreditvergaberichtlinien erschweren den wirtschaftlichen Aufschwung . Trotzdem ist es natürlich richtig und sinnvoll , dass die Banken vor der Kreditvergabe sorgfältig die Risiken prüfen . Dies ist in der Vergangenheit nicht immer der Fall gewesen ; wir alle haben die Folgen noch im Gedächtnis . Was die Fraktion Die Linke mit dem vorliegenden Antrag vorschlägt -- die Aussetzung des Hausbankprinzips der Förderbanken und die Verstaatlichung der Privatbanken -- , taugt gewiss nicht zur Problemlösung . Dieser Antrag ist Ausdruck einer staatsgläubigen Ideologie , die im Wesentlichen auf dem Glauben an die Allmacht des Staates basiert . Ich erinnere daran , dass die Staatsbanken KfW und IKB sowie die Landesbanken die Ersten waren , die in der Finanzkrise in massive Schwierigkeiten geraten sind , aber auch die Ersten , die wieder Boni ausgezahlt haben . Ich kann hier keinen Hinweis darauf erkennen , dass der Staat der bessere Banker ist oder auch nur in moralischer Hinsicht besser agiert . Dieser Antrag der Linken ist nichts anderes als eine populistische Nebelkerze . Mein Fazit : Die Bundesregierung ergreift in der Krise die richtigen Maßnahmen . Ich nenne zum Beispiel den erfolgreichen Konjunkturgipfel im Kanzleramt und die Einrichtung der Stelle eines Kreditmediators . Wir setzen anders als die Linken in erster Linie auf den Dialog mit den Akteuren , auf Verpflichtung , besser noch auf Selbstverpflichtung , statt Verstaatlichung . Ziel muss es sein , die Eigenkapitalquote der Unternehmen zu erhöhen . Im Mittelstand liegt die Quote derzeit im Schnitt bei 3,9 Prozent ; optimal wäre eine Quote von 12 bis 14 Prozent . Deshalb haben wir mit dem Wachstumsbeschleunigungsgesetz als Sofortmaßnahme erste Schritte zur Entlastung kleiner und mittlerer Unternehmen umgesetzt . Meine Damen und Herren von der Linken , es mutet seltsam an , wenn Sie 20 Jahre nach dem Mauerfall den Einstieg in die Staatswirtschaft als Lösung aller Probleme vorschlagen . Ja , wir haben die Lehren aus der Krise gezogen . Wann ziehen Sie Ihre Lehren aus der Geschichte ? Vielen Dank ."

Vielen Dank