Dynamische ABC-Analyse mit DAX

Die ABC-Analyse ist ein betriebswirtschaftliches Mittel zur Planung und Entscheidungsfindung. Dabei werden die Objekte (Kunden, Artikel, Projekte, etc.) in drei Klassen unterteilt.

Die Klasse A steht für einen hohen Ergebnisbeitrag,
die Klasse B für einen mittelmäßigen Ergebnisbeitrag und
die Klasse C für einen geringen Ergebnisbeitrag.

Mit der ABC-Analyse ist es möglich,

  • das „Wesentliche“ vom „Umwesentlichen“ zu trennen,
  • Rationalisierungsschwerpunkte zu setzen,
  • unwirtschaftliche Anstrengungen zu vermeiden,
  • die Wirtschaftlichkeit zu steigern.

Als idealtypisch gilt die 80/20-Regel (Paretoprinzip), das heißt es werden zum Beispiel im Fall der Kundenbewertung mit lediglich 20% der Kunden bereits 80% des Umsatzes erzielt (A-Kunden), 30% der Kunden bringen 15% des Umsatzes (B-Kunden) und von 50% der Kunden kommen nur 5% des Umsatzes. Die Ergebnisse des Pareto-Ansatzes werden allerdings in der Realität selten erreicht.

In diesem YouTube zeigt Parker Stevens von BI Elite, wie Sie in Power BI ein Pareto-Diagramm erstellt. Mit einer zusätzlichen bedingten Formatierung, kann dann die visuelle Klassifizierung in ABC erfolgen.

In der DAX-Kennzahl Pareto % wird der kumulierte prozentuale Wertanteil des betrachteten Objektes (Kunden, Artikel, Projekte, etc.) ermittelt. Hierfür wird die Gesamtsumme (100%) aller Objekte berechnet, die Summe für das aktuelle Objekt und eine Zusammenfassung (SUMMARIZE) für jedes einzel Objekt. Danach werden über SUMX alle Zeilen als laufende Summe aufaddiert, deren Wert größer oder gleich dem aktuellen Wert ist. Die laufende Summe wird dann im Verhältnis zur Gesamtsumme gesetzt.

Pareto % =
VAR GesamtUmsatz =
    CALCULATE (
        SUM ( 'Debitorposten'[Verkauf (MW)] );
        ALLSELECTED ( Debitorposten )
    )
VAR AktuellerUmsatz =
    SUM ( Debitorposten[Verkauf (MW)] )
VAR ZusammengefassteTabelle =
    SUMMARIZE (
        ALLSELECTED ( Debitorposten );
        Debitorposten[Debitorennr.];
        "@Umsatz"; SUM ( Debitorposten[Verkauf (MW)] )
    )
VAR LaufendeSumme =
    SUMX (
        FILTER ( ZusammengefassteTabelle; [@Umsatz] >= AktuellerUmsatz );
        [@Umsatz]
    )
RETURN
    DIVIDE ( LaufendeSumme; GesamtUmsatz )

ALLSELECTED gibt alle Zeilen der Tabelle zurück, wobei alle Filter ignoriert werden, die möglicherweise in der Abfrage angewendet wurden, jedoch von außen kommende Filter werden beibehalten.

DAX Pareto % Formel

Für die Anzeige wählen Sie das Linien- und gruppiertes Säulendiagramm.
Auf die Gemeinsame Achse wird das Objekt gelegt (In diesem Bespiel die Debitorennr. = Kunde)
Für die Spaltenwerte wird der gewichtende Wert hinterlegt. (In diesem Beispiel der Verkauf (MW) = Umsatz)
Für die Zeilenwerte verwenden Sie die DAX-Kennzahl Pareto %.

Linien- und gruppiertes Säulendiagramm einrichten

Für die ABC Klassifizierung hinterlegen wir auf der Standardfarbe eine bedingte Formatierung mit folgenden Regeln basierend auf das Feld Pareto %.
Wenn Wert ist größer als oder gleich 0 Zahl
und ist kleiner als oder gleich 0,8 Zahl
dann Grün (Klasse A).
Wenn Wert ist größer als 0,8 Zahl
und ist kleiner als oder gleich 0,95 Zahl
dann Gelb (Klasse B).
Wenn Wert ist größer als 0,95 Zahl
und ist kleiner als oder gleich 1 Zahl
dann Rot (Klasse C).

Bedingte Formatierungen ABC Analyse

Zusätzlich können Sie jetzt noch die Datenbeschriftung und Markierung aktivieren.

Datenbeschriftung und Markierung anzeigen aktivieren

Wird nun zum Beispiel auf ein bestimmtes Jahr gefiltert, werden die Debitorennr. nach dem Jahresumsatz kategorisiert.

 ABC-Analyse über die Debitorennr. für 2019

Anhand dieser Einordnung kann man sich ein grobes Bild der IST-Situation verschaffen und weitere Vorgehensweisen ableiten.

Quellen:

Veröffentlicht von

Marcus Wegener

Marcus Wegener

Marcus Wegener ist Anwendungsentwickler für Business Intelligence und erstellt Lösungen, mit denen sich große Datenmengen schnell analysieren lassen. Kunden nutzen seine Lösungen, um die Vergangenheit zu analysieren, die Gegenwart zu steuern und die Zukunft zu planen, um damit mehr Erfolg zu generieren. Dabei ist seine einzigartige Kombination aus Wissen und Auffassungsgabe ein Garant für ihren Erfolg.

2 Gedanken zu „Dynamische ABC-Analyse mit DAX“

  1. Hallo liebes think-BI Team,
    der Post ist schon älter, aber ich hätte eine Frage dazu.
    Ich würde die Gesamtsumme, die Laufende Summe und die Pareto % gern als berechnete Spalte in der Power Query berechnen, damit ich die zugeteilten Werte auch als Felder einer Tabelle verwenden kann. Wie müsste ich da den Code umschreiben bzw. ginge das überhaupt?
    Danke und LG,
    Vanessa

    1. Hi Vanessa,
      du kannst die Measures auch als Felder in einem Tabellen-Visual verwenden. Wichtig ist dabei zu beachten, welche weiteren Felder Einfluss auf die Berechnung der Measures haben.
      In Power Query ist die Berechnung statisch und muss auf dem gewünschten Aggregationslevel erfolgen.

      Das könnte dann wie folgt aussehen.
      let
      Quelle = Debitorposten,
      #“Gruppierung Debitor“ = Table.Group(Quelle, {„Debitorennr.“}, {{„Debitor Verkauf (MW)“, each List.Sum([#“Verkauf (MW)“]), type number}}),
      #“Gruppierung Gesamtsumme“ = Table.Group(#“Gruppierung Debitor“, {}, {{„Zeile“, each _, type table [#“Debitorennr.“=text, #“Debitor Verkauf (MW)“=number]}, {„Gesamtsumme“, each List.Sum([#“Debitor Verkauf (MW)“]), type number}}),
      #“Erweiterte Zeile“ = Table.ExpandTableColumn(#“Gruppierung Gesamtsumme“, „Zeile“, {„Debitorennr.“, „Debitor Verkauf (MW)“}, {„Debitorennr.“, „Debitor Verkauf (MW)“}),
      #“Sortierte Zeilen“ = Table.Sort(#“Erweiterte Zeile“,{{„Debitor Verkauf (MW)“, Order.Descending}}),
      #“Hinzugefügter Index“ = Table.AddIndexColumn(#“Sortierte Zeilen“, „Index“, 1, 1, Int64.Type),
      #“Pareto Zeilen“ = Table.AddColumn(#“Hinzugefügter Index“, „Pareto Zeilen“, (_) => Table.SelectRows(#“Hinzugefügter Index“, (r)=> r[Index] <= _[Index])), #"Pareto Summe" = Table.AggregateTableColumn(#"Pareto Zeilen", "Pareto Zeilen", {{"Debitor Verkauf (MW)", List.Sum, "Pareto Summe", type number}}), #"Pareto Prozent" = Table.AddColumn(#"Pareto Summe", "Parto %", each [Pareto Summe] / [Gesamtsumme], Percentage.Type) in #"Pareto Prozent" LG, Marcus

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

I accept that my given data and my IP address is sent to a server in the USA only for the purpose of spam prevention through the Akismet program.More information on Akismet and GDPR.