updated:  2026 20. June
published:  2026 18. June

R - Programmierung

Statistische Berechnungen mit R.

Statistische Probleme lösen mit R

Download des grafischen Benutzerinterface RGui unter R-project.org oder direkt unter cran.r-project.org

Im folgenden ist ein R-Code um eine CSV-Datei mit einer Datenreihe (Spalte) einzulesen und auszuwerten.


library(tcltk)


# Öffnet Dateidialog und gibt eine Liste zurück.
funcReadCSVFile <- function(){
	datei <- tk_choose.files(
		caption = "Bitte CSV oder TXT auswählen",
		filters = matrix(
			c(
			"CSV und TXT", ".csv .txt",
			"CSV", ".csv",
			"TXT", ".txt"
			),
		ncol = 2,
		byrow = TRUE
		)
	)
	if (length(datei) == 0 || datei == "") {		
		return(list(
			success = FALSE,
			file = NULL))
	}
	return(list(
		success = TRUE,
		file = datei))
}

# Lädt Daten aus csv Datei in die lokale Variable "daten" und gibt diese zurück
funcLoadData <- function() {
	ok <- funcReadCSVFile()
	if(!ok$success){
		cat("\nDateidialog beendet - keine Datei geladen\n")
		return(invisible(NULL))
	}
	cat("\nLese Datei:\t", ok$file, "\n")

 	# Header erkennen (einfach & robust)
	first_line <- readLines(ok$file, n = 1)
	fields <- strsplit(first_line, ";")[[1]]

	test <- suppressWarnings(as.numeric(gsub("\\.", "", fields[1])))
	hat_header <- is.na(test)

	# CSV einlesen
	daten <- read.csv(
	  ok$file,
	  sep = ";",
	  dec = ",",
	  stringsAsFactors = FALSE,
	  header = hat_header
	)
	cat("Datei erfolgreich eingelesen.\n")
	#str(daten)
	#names(daten)

	# Wenn nur 1 Spalte → sauber extrahieren
	if (ncol(daten) == 1) {
	    daten <- daten[[1]]
	}
	return(daten)
}

funcAnalyzeData <- function(x) {

  x <- as.numeric(x)
  x <- x[!is.na(x)]   # NA entfernen

  n <- length(x)

  # Basis
  min_x <- min(x)
  max_x <- max(x)
  range_x <- max_x - min_x
  sum_x <- sum(x)

  mean_x <- mean(x)
  median_x <- median(x)

  # Quartile / IQR
  q1 <- quantile(x, 0.25, na.rm = TRUE)
  q3 <- quantile(x, 0.75, na.rm = TRUE)
  iqr <- IQR(x, na.rm = TRUE)

  lower <- q1 - 1.5 * iqr
  upper <- q3 + 1.5 * iqr

  outliers <- x[x < lower | x > upper]

  # Standardabweichung
  sd_sample <- sd(x)                 # n-1 (Stichprobe)
  sd_pop <- sqrt(mean((x - mean_x)^2))  # n (Population)

  # Standardfehler des Mittelwerts
  se_mean <- sd_sample / sqrt(n)

  # Variationskoeffizient
  cv <- sd_sample / mean_x

  # Median absolute deviation (MAD)
  mad_val <- mad(x, constant = 1)  # ohne Skalierung auf Normalverteilung

  # Schiefe (Momentkoeffizient)
  skewness <- mean((x - mean_x)^3) / (sd_pop^3)

  result <- list(

    n = n,

    Min = min_x,
    Max = max_x,
    Spannweite = range_x,
    Summe = sum_x,

    Mittelwert = mean_x,
    Median = median_x,
    Median_MAD = mad_val,

    Q1 = q1,
    Q3 = q3,
    IQR = iqr,

    Untere_Grenze = lower,
    Obere_Grenze = upper,


    Stdabwg_Stichprobe = sd_sample,
    Stdabwg_Gesamt = sd_pop,
    Stdfehler_Mittelwert = se_mean,
    Variationskoeffizient = cv,

    Schiefe = skewness,
    Ausreisser = outliers
  )

  return(result)
}


funcPrintResults <- function(res) {

  cat("\n============ AUSWERTUNG ===========\n\n")

  for (name in names(res)) {

    value <- res[[name]]

    if (is.numeric(value)) {
	cat(sprintf("%-20s \t%12.2f\n", name, value))
    } 
	else if (is.vector(value)) {
	      cat(sprintf("%-20s \t%s Werte\n", name, length(value)))
	}
  }

  cat("\n===================================\n")
}



funcPrintStatistics <- function(res){

  # Deutsche Zahlenformatierung
  fmt_de <- function(x, digits = 2){

    format(
      round(x, digits),
      big.mark = ".",
      decimal.mark = ",",
      nsmall = digits,
      scientific = FALSE,
      trim = TRUE
    )
  }

  cat("\n")
  cat("=========================================================\n")
  cat("DESKRIPTIVE STATISTIK\n")
  cat("=========================================================\n\n")

 cat(sprintf("%-35s %20s\n", "Anzahl der Stichprobe", res$n))
 cat(sprintf("%-35s %20s\n", "Minimum", fmt_de(res$Min)))
 cat(sprintf("%-35s %20s\n", "Maximum", fmt_de(res$Max)))
 cat(sprintf("%-35s %20s\n", "Spannweite", fmt_de(res$Spannweite)))
 cat(sprintf("%-35s %20s\n", "Summe", fmt_de(res$Summe)))
 cat("\n")
 cat(sprintf("%-35s %20s\n", "Median", fmt_de(res$Median)))
 cat(sprintf("%-35s %20s\n", "Median abs. Abweichung", fmt_de(res$Median_MAD)))
 cat("\n")
 cat(sprintf("%-35s %20s\n", "arithm. Mittel", fmt_de(res$Mittelwert)))
 cat(sprintf("%-35s %20s\n", "Stdabw. Stichprobe (n-1)", fmt_de(res$Stdabwg_Stichprobe)))
 cat(sprintf("%-35s %20s\n", "Stdabw. Gesamtheit (n)", fmt_de(res$Stdabwg_Gesamt)))
 cat(sprintf("%-35s %20s\n", "Standardfehler Mittelwert", fmt_de(res$Stdfehler_Mittelwert)))
 cat(sprintf("%-35s %20s\n", "Variationskoeffizient", fmt_de(res$Variationskoeffizient, 4)))
 cat(sprintf("%-35s %20s\n", "Schiefe", fmt_de(res$Schiefe, 4)))
 cat("\n")
 cat(sprintf("%-35s %20s\n", "1. Quartil (Q1)", fmt_de(res$Q1)))
 cat(sprintf("%-35s %20s\n", "3. Quartil (Q3)", fmt_de(res$Q3)))
 cat(sprintf("%-35s %20s\n", "Interquartilsabstand", fmt_de(res$IQR)))
 cat("\n")
 cat(sprintf("%-35s %21s\n", "Untere Ausreißergrenze", fmt_de(res$Untere_Grenze)))
 cat(sprintf("%-35s %21s\n", "Obere Ausreißergrenze", fmt_de(res$Obere_Grenze)))
 cat("\n")
 cat(sprintf("%-35s %21s\n", "Anzahl Ausreißer", length(res$Ausreisser)))
if(length(res$Ausreisser) > 0){

  antwort <- readline(
    prompt = "\nENTER = Ausreißer anzeigen, X = Ende: "
  )

  if(toupper(trimws(antwort)) != "X"){

    cat("\nAusreißer:\n")

    for(v in sort(res$Ausreisser)){
      cat(sprintf("   %20s\n", fmt_de(v)))
    }
  }
}
 cat("\n=========================================================\n")
}

funcPrintStatistics_disabled01 <- function(res){
  cat("\n")
  cat("=========================================================\n")
  cat("DESKRIPTIVE STATISTIK\n")
  cat("=========================================================\n\n")
  cat(sprintf("%-35s %15d\n", "Anzahl der Stichprobe", res$n))
  cat(sprintf("%-35s %15.2f\n", "Minimum", res$Min))
  cat(sprintf("%-35s %15.2f\n", "Maximum", res$Max))
  cat(sprintf("%-35s %15.2f\n", "Spannweite", res$Spannweite))
  cat(sprintf("%-35s %15.2f\n", "Summe", res$Summe))
  cat("\n")
  cat(sprintf("%-35s %15.2f\n", "Median", res$Median))
  cat(sprintf("%-35s %15.2f\n", "Median abs. Abweichung", res$Median_MAD))
  cat("\n")
  cat(sprintf("%-35s %15.2f\n", "arithm. Mittel", res$Mittelwert))
  cat(sprintf("%-35s %15.2f\n", "Stdabw. Stichprobe (n-1)", res$Stdabwg_Stichprobe))
  cat(sprintf("%-35s %15.2f\n", "Stdabw. Gesamtheit (n)", res$Stdabwg_Gesamt))
  cat(sprintf("%-35s %15.2f\n", "Standardfehler Mittelwert", res$Stdfehler_Mittelwert))
  cat(sprintf("%-35s %15.4f\n", "Variationskoeffizient", res$Variationskoeffizient))
  cat(sprintf("%-35s %15.4f\n", "Schiefe", res$Schiefe))
  cat("\n")
  cat(sprintf("%-35s %15.2f\n", "1. Quartil (Q1)", res$Q1))
  cat(sprintf("%-35s %15.2f\n", "3. Quartil (Q3)", res$Q3))
  cat(sprintf("%-35s %15.2f\n", "Interquartilsabstand", res$IQR))
  cat("\n")
  cat(sprintf("%-35s %15.2f\n", "Untere Ausreißergrenze", res$Untere_Grenze))
  cat(sprintf("%-35s %15.2f\n", "Obere Ausreißergrenze", res$Obere_Grenze))
  cat("\n")
  cat(sprintf("%-35s %15d\n", "Anzahl Ausreißer", length(res$Ausreisser))) 
  if(length(res$Ausreisser) > 0){
    cat("\nAusreißer:\n")
    for(v in res$Ausreisser){
      cat(sprintf("   %.2f\n", v))
    }
  }
  cat("\n=========================================================\n")
}


# Formatiert die Zahlenausgabe auf deutsch mit Punkt als Tausenderzeichen und Komma als Nachkommazeichen
fmtde <- function(x, digits = 2) {

  format(
    round(x, digits),
    big.mark = ".",
    decimal.mark = ",",
    nsmall = digits,
    scientific = FALSE,
    trim = TRUE
  )
}

main <- function(){

  cat("\n===================================\n\n")
  cat("   Statistik-Tool gestartet\n")
  cat("\n===================================\n\n")
  x <- funcLoadData()

  if (is.null(x)) {
    cat("Programm beendet. Keine Daten vorhanden.\n")
    return(invisible(NULL))
  }

  res <- funcAnalyzeData(x)

  #funcPrintResults(res)
  funcPrintStatistics(res)

  # optional: in Workspace verfügbar machen
  cat("Deine Daten sind aufrufbar mit:\n")
  cat("\tdata_raw\t\t - Datenreihe\n")
  cat("\tdata_result\t\t - Ergebnis insgesamt\n")
  cat("\tdata_result$[name]\t - Ergebnis speziell\n")
  assign("data_raw", x, envir = .GlobalEnv)
  assign("data_result", res, envir = .GlobalEnv)

  return(invisible(res))
}

main()

Stichworte (tags)