Beispiel: Bimodaler Test

Ein Qualitätsingenieur in einer Motorenfabrik möchte einen Test auf Bimodalität an Kolben von zwei Lieferanten durchführen. Der Ingenieur misst die Längen einer Stichprobe von je 100 Kolben von jedem der Lieferanten.

Das Skript verwendet das Paket diptest für R, um zu testen, ob die Daten unimodal sind. Wenn der Test die Nullhypothese für unimodale Daten ablehnt, geht das Skript davon aus, dass es sich bei den Daten um eine Mischung aus zwei Normalverteilungen handelt. Das Skript verwendet das Paket mixtools für R, um deskriptive Statistiken und Dichtekurven für zwei Normalverteilungen anzuzeigen.

Das Beispielskript R veranschaulicht die folgenden Funktionen der Integration:
  • Übergeben Sie eine einzelne Spalte aus einem Minitab-Arbeitsblatt als Eingabe.
  • Fügen Sie einen Tabellentitel hinzu.
  • Fügen Sie Spaltenbeschriftungen für eine Tabelle hinzu.
  • Senden Sie eine Tabelle an den Minitab-Ausgabebereich.
  • Erstellen Sie ein Diagramm, und senden Sie das Diagramm an den Minitab-Ausgabebereich.
Verwenden Sie die folgenden Dateien, um die Schritte in diesem Abschnitt auszuführen:
Datei Beschreibung
bimodal.R Ein R Skript, das eine Spalte aus einem Minitab-Arbeitsblatt verwendet, auf Unimodalität testet und Ergebnisse für eine Mischung aus zwei Normalverteilungen erzeugt, wenn die Daten nicht unimodal sind.

Alle Dateien, auf die in diesem Handbuch verwiesen wird, sind in dieser .ZIP-Datei verfügbar: r_guide_files.zip.

Voraussetzungen

  • Das R-Skript im folgenden Beispiel erfordert die folgenden R-Pakete:
    mtbr
    Das R-Paket, das Minitab und R integriert. Im Beispiel übertragen Funktionen aus diesem Modul R-Ergebnisse an Minitab. Informationen zum Installieren des Minitab-Pakets R finden Sie in Schritt 2: Installieren Sie mtbr.
    mixtools
    Das R Paket, das das Skript verwendet, um eine Ausgabe für eine Mischung von Normalverteilungen zu erstellen.
    diptest
    Das R Paket, das das Skript verwendet, um zu testen, ob die Daten unimodal sind.
    In einfachen Fällen können Sie R-Pakete mit den Befehlen wie den folgenden in R installieren.
    install.packages("mixtools")

    Wenn Sie Hilfe bei der Installation von Paketen R benötigen, wenden Sie sich bitte an den technischen Support Ihres Unternehmens. Der technische Support von Minitab kann Sie nicht bei der Installation von R Paketen unterstützen.

Schritte zum Ausführen des Beispiels

  1. Stellen Sie sicher, dass Sie die erforderlichen Module installiert haben: mtbr.
  2. Speichern Sie die R-Skriptdatei, bimodal.R in Ihrem Minitab-Standardspeicherort für Dateien. Weitere Informationen dazu, wo Minitab nach R-Skriptdateien sucht, finden Sie unter Standardordner für R-Dateien für Minitab.
  3. Öffnen Sie den Beispieldatensatz Prozessenergiekosten.MWX.
  4. Geben Sie im Minitab-Fenster Befehlszeile RSCR "bimodal.R" "Process 1" ein.
  5. Wählen Sie Durchlauf aus.

bimodal. R

# Load the necessary libraries
#Original code by Valentina Tillman
library(mixtools)
library(mtbr)
library(diptest)

# Retrieve sample data
input_column <- commandArgs(trailingOnly = TRUE)
data <- mtb_get_column(input_column)
dip_test_result <- dip.test(data)

if (dip_test_result$p.value < 0.05) {
  # Fit a bimodal mixture model
  bimodal_fit <- normalmixEM(data, k = 2)
  
  # Manually extract parameter estimates and format them as a data frame
  bimodal_table <- data.frame(
    Mean = bimodal_fit$mu,
    Standard_Deviation = bimodal_fit$sigma,
    Proportion = bimodal_fit$lambda #tells you what % of the data is clustered around which mean. Also called lambda
  )
  
  # Define title and headers
  mytitle <- "Modeling a Bimodal Distribution"
  myheaders <- names(bimodal_table)
  
  # Add the table to the mtbr output
  mtb_add_table(columns = bimodal_table, headers = myheaders, title = mytitle)
  
  png("r_bimodal_image.png")
  plot(bimodal_fit, density = TRUE, which = 2)
  graphics.off()
  mtb_add_image("r_bimodal_image.png")
  
  # Now generate tolerance intervals using the parameters found using mixtools
  # Set the desired coverage level (e.g., 95%)
  coverage_level <- 0.95
  alpha <- 1 - coverage_level
  
  # Calculate the tolerance intervals for each component
  tolerance_intervals <- lapply(1:2, function(i) {
    mu <- bimodal_fit$mu[i]
    sigma <- bimodal_fit$sigma[i]
    n <- bimodal_fit$lambda[i]  # proportion of the component
    
    # Calculate the critical value for the normal distribution
    z <- qnorm(1 - alpha / (2 * n))
    
    # Calculate lower and upper bounds of the tolerance interval
    lower_bound <- mu - z * sigma
    upper_bound <- mu + z * sigma
    
    c(lower_bound, upper_bound)
  })
  
  # Show the tolerance intervals
  tolerance_intervals_df <- data.frame(
    Component = c("First Mode", "Second Mode"),
    Lower_Bound = sapply(tolerance_intervals, "[", 1),
    Upper_Bound = sapply(tolerance_intervals, "[", 2)
  )
  
  myheaders <- c("Component", "Lower Bound", "Upper Bound")
  mytitle <- "Tolerance Intervals for Bimodal Distribution"
  mtb_add_table(columns = tolerance_intervals_df, headers = myheaders, title = mytitle)
  
  
} else {
  mtb_add_message("This data is unimodal.")
}

Ergebnisse

R Script
Diese Ergebnisse stammen von externer Software.

Modeling a Bimodal Distribution

MeanStandard_DeviationProportion
34.18751.509090.516129
48.33331.849920.483871
Histogramm von Datenwerten, die in der Nähe von 600 zentriert sind, mit zwei überlagerten Normalverteilungskurven. Die rote Kurve ist schmal und hoch und erreicht einen Spitzenwert von fast 600. Die grüne Kurve ist breiter und niedriger und erstreckt sich etwa von 597 bis 603. Der Titel der Tabelle ist "Dichtk kurven". Die Beschriftung der X-Achse lautet "Daten" und die Beschriftung der Y-Achse lautet "Dichte".

Tolerance Intervals for Bimodal Distribution

ComponentLower BoundUpper Bound
First Mode31.682136.6929
Second Mode45.320051.3467
mixtools package, version 2.0.0.1, Released 2022-12-04
This package is based upon work supported by the National Science Foundation under Grant No. SES-0518772 and the Chan Zuckerberg Initiative: Essential Open Source Software for Science (Grant No. 2020-255193).