Lesen Sie unseren Artikel zum Thema

class="lazyload

Die Sortimentsoptimierung ist ein entscheidender Prozess im Einzelhandel, bei dem es darum geht,die ideale Produktzusammensetzung zu finden, um die Nachfrage der Verbraucher zu befriedigen und dabei die zahlreichen logistischen Rahmenbedingungen zu berücksichtigen. Die Einzelhändler müssen sicherstellen, dass sie die richtigen Produkte in den richtigen Mengen zum richtigen Zeitpunkt anbieten. Durch die Nutzung data Verbrauchererkenntnissen können Einzelhändler fundierte Entscheidungen darüber treffen, welche Artikel sie vorrätig halten, wie sie den Lagerbestand verwalten und welche Produkte sie auf der Grundlage von Kundenpräferenzen, saisonalen Trends und Absatzmustern priorisieren sollten.

Für Einzelhandelsunternehmen ist die Sortimentsoptimierung entscheidend, um ein Gleichgewicht zwischenVielfaltundEffizienz zu finden. Ein zu geringes Angebot kann Kunden abschrecken, während ein zu großes Angebot zu Verwirrung, Überbeständen und geringeren Gewinnmargen führen kann. Durch die Optimierung des Sortiments können Unternehmen die Kundenzufriedenheit steigern, indem sie sicherstellen, dass beliebte Artikel verfügbar sind, und gleichzeitig Produkte mit geringer Nachfrage aus dem Sortiment nehmen, die wertvollen Regalplatz beanspruchen.

Die Entscheidungsmodellierungist ein effizienter Ansatz zur Sortimentsoptimierung, da sie einen data Rahmen bietet, um Kundenpräferenzen zu verstehen und vorherzusagen, wie sich Kunden zwischen verschiedenen Produkten entscheiden werden. Durch die Analyse verschiedener Faktoren wie Preissensibilität, Produkteigenschaften und Markentreue hilft die Entscheidungsmodellierung Einzelhändlern dabei, zu ermitteln, welche Produkte die Kundennachfrage am ehesten erfüllen.

Letztendlich ermöglicht die Auswahlmodellierung den Einzelhändlern, die richtige Produktpalette anzubieten, das Sortiment auf bestimmte Kundensegmente zuzuschneiden und zudem die Regalfläche zu optimieren, um die Rentabilität zu steigern oder sogar die Preisgestaltung für Artikel zu optimieren.

Falls Sie noch nie von Wahlmodellierung gehört haben, können Sieunseren Artikellesen, in dem die wichtigsten Konzepte anhand von Beispielen vorgestellt werden. In diesem Artikel konzentrieren wir uns vor allem darauf, wie diskrete Wahlmodelle zur Optimierung eines Produktsortiments eingesetzt werden können. Wir stellen Code-Beispiele auf Basis der Bibliothek„choice-learn“zur Verfügung, die speziell dafür entwickelt wurde, data bei solchen Anwendungsfällen zu unterstützen.

Der bereitgestellte Code nutzt das Python-Paket „choice-learn“ und ist in einem Notebook zu finden hier.

Einrichtung: Installation von Python und Choice-Learn

In diesem Artikel stellen wir Codeausschnitte zur Veranschaulichung der Erläuterungen bereit. Der Code nutzt die Bibliothek„Choice-Learn“, die effiziente Werkzeuge für die Modellierung von Entscheidungsprozessen und verschiedene Anwendungsbereiche – wie beispielsweise Sortimentsoptimierung oder Preisgestaltung – bereitstellt. Choice-Learn ist über PyPI verfügbar und lässt sich ganz einfach mit


pip install choice-learn

Der Datensatz: Kaufbelege

Wir werden den TaFeng-Lebensmittel-Datensatz verwenden. Sie können ihn vonKaggleherunterladen und in Ihrer Python-Umgebung mit choice-learn öffnen:

from choice_learn.datasets import load_tafeng
tafeng_df = load_tafeng(as_frame=True)
print(tafeng_df.head())
class="lazyload

Der Datensatz umfasst über 800.000 einzelne Käufe in einem chinesischen Lebensmittelgeschäft. Zu jedem Kauf werden verschiedene Angaben gemacht, darunter der gekaufte Artikel (PRODUCT_ID), der Verkaufspreis (SALES_PRICE) und die Altersgruppe des Kunden (AGE_GROUP).

Man stellt fest, dass viele verschiedene Artikel angeboten werden, von denen einige nur selten verkauft werden. Um die Logistik zu optimieren, könnte der Händler beschließen, sein Produktangebot zu reduzieren. Das Ziel besteht in diesem Fall darin, die optimale Auswahl an Artikeln für den Verkauf zu ermitteln.

Um dies zu erreichen, konzentrieren wir uns auf die meistverkauften Artikel, da diese mit größerer Wahrscheinlichkeit erneut gekauft werden und eine entscheidende Rolle bei der Gestaltung eines effizienteren und rentableren Sortiments spielen.Beachten Sie, dass wir dies hauptsächlich zur Vereinfachung des Beispiels tun und dass alle Artikel beibehalten werden könnten.

# Nur die 20 meistverkauften Produkte behalten
tafeng_df = tafeng_df.loc[
tafeng_df.PRODUCT_ID.isin(tafeng_df.PRODUCT_ID.value_counts().index[:20])
].reset_index(drop=True)
# NaN-Werte entfernen
tafeng_df = tafeng_df.loc[
tafeng_df.AGE_GROUP.isin([„25-29“, „40-44“, „45-49“, „>65“, „30-34“, „35-39“, „50-54“, „55-59“, „60-64“] )
].reset_index(drop=True)
print(tafeng_df.head())

Lassen Sie uns außerdem die Alterskategorien alle zehn Jahre mit One-Hot-Werten kodieren:

# Kodierung der Altersgruppen
tafeng_df[„twenties“] = tafeng_df.apply(lambda row: 1 if row[„AGE_GROUP“] == „25-29“ else 0,axis=1)
tafeng_df[„thirties“] = tafeng_df.apply(
lambda row: 1 if row[„AGE_GROUP“] in ([„30-34“, „35-39“]) else 0,axis=1
)
tafeng_df[„forties“] = tafeng_df.apply(
lambda row: 1 if row[„AGE_GROUP“] in ([„40-44“, „45-49“]) else 0,axis=1
)
tafeng_df[„fifties“] = tafeng_df.apply(
lambda row: 1 if row[„AGE_GROUP“] in ([„50-54“, „55-59“]) else 0,axis=1
)
tafeng_df["sixties_and_above"] = tafeng_df.apply(
lambda row: 1 if row["AGE_GROUP"] in (["60-64", ">65"]) else 0,axis=1
)

Nachdem unsere data nun bereit data , müssen wir ein„ChoiceDataset“ erstellen, das data inchoice-learn. Dazu müssen wir die Merkmale angeben, die den Kontext beschreiben, in dem ein Kauf getätigt wird:

  • Kundenmerkmale(gemeinsame Merkmale): die Altersgruppe
  • Produktmerkmale(Artikelmerkmale): der Artikelpreis

Ein wesentlicher Aspekt der Entscheidungsmodellierung besteht darin, dass wir die Eigenschaftenaller zum Zeitpunkt des Kaufs verfügbaren Artikel benötigen, nicht nur die des ausgewählten Artikels. So können wir analysieren, wie die Preise verschiedener Produkte die Entscheidung des Kunden beeinflussen. Da diese Informationen im Datensatz nicht direkt verfügbar sind, gehen wir davon aus, dass bei jedem Kauf die Preise der anderen Artikel unverändert gegenüber dem vorherigen Verkauf bleiben.

# Produkt-ID zu Index
id_to_index =
for i, product_id in enumerate(np.sort(tafeng_df.PRODUCT_ID.unique())):
id_to_index[product_id] = i
# Preise der Artikel initialisieren
prices = [[0] for _ in range(len(id_to_index))] for k, v in id_to_index.items():
prices[v][0] = tafeng_df.loc[tafeng_df.PRODUCT_ID == k].SALES_PRICE.to_numpy()[0] # Erstellen der Arrays, aus denen das ChoiceDataset besteht
shared_features = [] items_features = [] choices = [] # Für jeden gekauften Artikel speichern wir:
# – die Altersdarstellung (One-Hot) des Kunden
# – den Preis aller verkauften Artikel
for i, row in tafeng_df.iterrows():
item_index = id_to_index[row.PRODUCT_ID] prices[item_index][0] = row.SALES_PRICE
shared_features.append(
row[["twenties", "thirties", "forties", "fifties", "sixties_and_above"]].to_numpy()
)
items_features.append(prices)
choices.append(item_index)

Da wir nun alle Informationen haben, können wirdas ChoiceDataset erstellen:

from choice_learndata import ChoiceDataset
dataset = ChoiceDataset(
shared_features_by_choice=shared_features,
shared_features_by_choice_names=[‘twenties’, ‘thirties’, ‘forties’, ‘fifties’, ‘sixties_and_above’],
items_features_by_choice=items_features,
items_features_by_choice_names=[“SALES_PRICE”],
choices=choices
)

Definition und Schätzung des Wahlmodells

Wir werden ein Auswahlmodell entwickeln und bewerten, das die Wahrscheinlichkeit vorhersagt, mit der ein Kunde einen bestimmten Artikel aus einem gesamten Sortiment ähnlicher Produkte auswählt. Auf der Grundlage des verfügbaren Datensatzes definieren wir die folgende Nutzenfunktion für einen Artikeli, den ein Kundej in Betracht zieht:

class="lazyload

Diese Funktion stellt den Nutzen (oder die Zufriedenheit) dar, den ein Kunde durch die Wahl eines bestimmten Artikels erzielt, wobei sowohl das Alter des Kunden als auch der Preis des Artikels eine Rolle spielen.

Weitere Einzelheiten zur Formulierung einer Nutzenfunktion finden Sie in unserem erstenBeitrag. Beachten Sie, dass ein weiteres logisches Modell – das hier der Einfachheit halber jedoch nicht vorgestellt wird – darin bestehen könnte, eine Preissensitivität pro Altersgruppe zu schätzen.

Hier ist der Code zur Schätzung eines solchen Modells mit choice-learn:

from choice_learn.models import ConditionalLogit
model = ConditionalLogit(optimizer=„Adam“,batch_size=1024,epochs=300,lr=0.002)
for age_category in [„twenties“, „thirties“, „forties“, „fifties“, „sixties_and_above“]:
model.add_coefficients(
coefficient_name=age_category, feature_name=age_category,items_indexes=list(range(20))
)
model.add_shared_coefficient(
coefficient_name=“price”,feature_name=“SALES_PRICE”,items_indexes=list(range(20))
)
hist = model.fit(dataset)

Sie können überprüfen, ob das Modell gut zum Datensatz passt:

import matplotlib.pyplot as plt
plt.plot(hist[„train_loss“])
plt.xlabel(„Epoch“)
plt.ylabel(„Negative Log Likelihood“)
plt.show(
class="lazyload

Das optimale Sortiment finden

Mit den Kaufwahrscheinlichkeiten können wir nun den durchschnittlichen Umsatz pro Kunde für ein SortimentA anhandder folgenden Formel schätzen:

class="lazyload

Um das Sortiment zu ermitteln, das den Umsatz maximiert, könnten wir alle möglichen Kombinationen bewerten und diejenige mit dem höchsten Durchschnittsumsatz auswählen. Ein effizienterer Ansatz ist jedoch der Einsatzder linearen Programmierung (LP). Hier konzentrieren wir uns darauf, wie man die„Choice-Learn“-Implementierungdes Sortimentsoptimierers nutzt.

Es ist wichtig, zwischen der Maximierung des Umsatzes und der Maximierung der Gewinnmargen zu unterscheiden. Der Umsatz ist zwar wichtig, doch bei den Gewinnmargen werden die mit jedem Produkt verbundenen Kosten berücksichtigt. Je nach Ihrem Ziel ist es möglicherweise sinnvoller, eher auf den Gewinn als auf den reinen Umsatz zu optimieren.

Um das Sortiment zu optimieren, benötigen wir einige wichtige Angaben:

  • Die Gewichtung, die wir den einzelnen Altersgruppen zuweisen möchten, orientiert sich an ihrem Kundenanteil
  • Der Nutzen jedes Artikels (berechnet anhand unseres Auswahlmodells) für jede Altersgruppe
  • Der zu optimierende Wert für jedes Element (in diesem Fall der Umsatz)
  • Die Größe des Sortiments (zum Beispiel 12 Artikel)

So funktioniert es mitchoice-learn:


from choice_learn.toolbox.assortment_optimizer import LatentClassAssortmentOptimizer
# Preis jedes Artikels
future_prices = np.stack([items_features[-1]]*5,axis=0)
age_category = np.eye(5).astype("float32")
# Berechnung des Nutzwerts jedes Artikels unter Berücksichtigung seines Preises und jeder Alterskategorie
predicted_utilities = model.compute_batch_utility(shared_features_by_choice=age_category,
                                                  items_features_by_choice=future_prices,
                                                  available_items_by_choice=np.ones((5, 20)),
                                                 choices=None
                                                  )
age_category_weights = np.sum(shared_features,axis=0) / len(shared_features)
opt = LatentClassAssortmentOptimizer(
solver="or-tools", # Zu verwendender Solver, entweder "or-tools" oder "gurobi" (falls Sie eine Lizenz besitzen)
class_weights=age_category_weights, # Gewichte jeder Klasse
class_utilities=np.exp(predicted_utilities), # Nutzwerte in der Form (n_classes, n_items)
itemwise_values=future_prices[0][:, 0], # Zu optimierende Werte für jeden Artikel, hier der Preis, der zur Berechnung des Umsatzes verwendet wird
assortment_size=12) # Gewünschte Größe des Sortiments
assortment, opt_obj = opt.solve()

Wenn Sie den Code ausführen, sollten Sie etwa folgendes Ergebnis erhalten:


class="lazyload

Das optimale Sortiment zur Umsatzmaximierung wird durch die Indizes der 1er-Werte im Vektor angegeben. Dieses Sortiment führt theoretisch zu einem durchschnittlichen Umsatz pro Kunde von 134 Yuan. Sie können andere Kombinationen ausprobieren, doch diese führen alle zu einem geringeren Durchschnittsumsatz.

Ein weiteres Ziel könnte darin bestehen, die Anzahl der Verkäufe zu maximieren. In diesem Szenario wird der optimierungsrelevante Wert für alle Artikel auf 1 gesetzt, was zu einem anderen optimalen Sortiment führt.

Die Effizienz dieser Methode wird deutlich, wenn zusätzliche Einschränkungen berücksichtigt werden. So müssen Sie beispielsweise die begrenzte Regalfläche in Ihrem Geschäft berücksichtigen. In diesem Fall können Sie das Sortiment so optimieren, dass die Gesamtgröße der Artikel die verfügbare Regalfläche nicht überschreitet. Diese zusätzliche Einschränkung wirdhier zusammen mit anderen Faktoren wie Preisstrategien veranschaulicht.


Fazit

Wenn Sie an der Sortimentsoptimierung oder Preisgestaltung arbeiten, ist die Entscheidungsmodellierung ein hervorragendes Werkzeug – schauen Sie sich das unbedingt einmal an. Choice-Learn bietet aufGitHub viele interessante Beispiele. Schauen Sie doch mal vorbei und setzen Sie ein Sternchen, wenn Sie es nützlich finden!