Versteckte Zusammenhänge können Optimierungsstrategien in die Irre führen

Foto von Chun Equipment Soo An Unsplash

p99, oder der Wert, unter dem 99 % der Beobachtungen liegen, wird branchenübergreifend häufig verwendet, um die Worst-Case-Leistung zu verfolgen und zu optimieren. Beispielsweise kann die Zeit, die zum Laden einer Seite, zum Ausführen einer Bestellung oder zum Ausliefern einer Sendung benötigt wird, durch die Verfolgung von p99 optimiert werden.

Obwohl p99 zweifellos wertvoll ist, muss man sich bewusst machen, dass es die obersten 1 % der Beobachtungen ignoriert, die einen unerwartet großen Einfluss haben können, wenn sie mit anderen wichtigen Geschäftsmetriken korreliert werden. Blindes Streben nach p99 ohne Überprüfung solcher Korrelationen kann möglicherweise andere Geschäftsziele untergraben.

In diesem Artikel analysieren wir die Einschränkungen von p99 anhand eines Beispiels mit Dummy-Daten, verstehen, wann man sich auf p99 verlassen kann, und erkunden different Metriken.

Stellen Sie sich eine E-Commerce-Plattform vor, bei der ein Crew die Aufgabe hat, das Checkout-Erlebnis im Warenkorb zu optimieren. Das Crew hat Kundenbeschwerden erhalten, dass das Checkout im Vergleich zu anderen Plattformen ziemlich langsam ist. Additionally greift das Crew auf die letzten 1.000 Checkout-Daten zu und analysiert die dafür benötigte Zeit. (Ich habe hierfür einige Dummy-Daten erstellt, Sie können diese gerne verwenden und ohne Einschränkungen daran herumbasteln.)

import pandas as pd
import seaborn as sns
order_time = pd.read_csv('https://gist.githubusercontent.com/kkraoj/77bd8332e3155ed42a2a031ce63d8903/uncooked/458a67d3ebe5b649ec030b8cd21a8300d8952b2c/order_time.csv')
fig, ax = plt.subplots(figsize=(4,2))
sns.histplot(knowledge = order_time, x = 'fulfillment_time_seconds', bins = 40, shade = 'okay', ax = ax)
print(f'p99 for fulfillment_time_seconds: {order_time.fulfillment_time_seconds.quantile(0.99):0.2f} s')
Verteilung der Bestellabwicklungszeiten. Bild vom Autor.

Wie erwartet scheinen die meisten Checkouts von Einkaufswagen innerhalb weniger Sekunden abgeschlossen zu sein. Und 99 % der Checkouts erfolgen innerhalb von 12,1 Sekunden. Mit anderen Worten, der p99 beträgt 12,1 Sekunden. Es gibt einige Lengthy-Tail-Fälle, die bis zu 30 Sekunden dauern. Da es so wenige davon gibt, könnten es Ausreißer sein und man sollte sie getrost ignorieren, oder?

Wenn wir jetzt nicht innehalten und die Bedeutung des letzten Satzes analysieren, könnte das ziemlich gefährlich sein. Ist es wirklich sicher, die oberen 1 % zu ignorieren? Sind wir sicher, dass die Checkout-Zeiten nicht mit anderen Geschäftskennzahlen korrelieren?

Nehmen wir an, unser E-Commerce-Unternehmen legt auch Wert auf den Bruttowarenwert (GMV) und hat das unternehmensweite Ziel, diesen zu steigern. Wir sollten sofort prüfen, ob die Zeit bis zum Bezahlvorgang mit dem GMV korreliert, bevor wir die oberen 1 % ignorieren.

import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
order_value = pd.read_csv('https://gist.githubusercontent.com/kkraoj/df53cac7965e340356d6d8c0ce24cd2d/uncooked/8f4a30db82611a4a38a90098f924300fd56ec6ca/order_value.csv')
df = pd.merge(order_time, order_value, on='order_id')
fig, ax = plt.subplots(figsize=(4,4))
sns.scatterplot(knowledge=df, x="fulfillment_time_seconds", y="order_value_usd", shade = 'okay')
plt.yscale('log')
ax.yaxis.set_major_formatter(ScalarFormatter())
Beziehung zwischen Bestellwert und Erfüllungszeit. Bild vom Autor.

Oh Mann! Der Warenkorbwert korreliert nicht nur mit den Checkout-Zeiten, er steigt bei längeren Checkout-Zeiten auch exponentiell an. Was ist der Nachteil, wenn man die oberen 1 % der Checkout-Zeiten ignoriert?

pct_revenue_ignored = df2.loc(df1.fulfilment_time_seconds>df1.fulfilment_time_seconds.quantile(0.99), 'order_value_usd').sum()/df2.order_value_usd.sum()*100
print(f'If we solely focussed on p99, we'd ignore {pct_revenue_ignored:0.0f}% of income')
## >>> If we solely focussed on p99, we'd ignore 27% of income

Wenn wir uns nur auf P99 konzentrieren würden, würden wir 27 % des Umsatzes ignorieren (27-mal mehr als die 1 %, die wir zu ignorieren glaubten). Das heißt, 99 Pence an Checkout-Zeiten entsprechen 73 Pence an Einnahmen. Die Konzentration auf p99 schadet in diesem Fall unbeabsichtigt dem Geschäft. Sie ignoriert die Bedürfnisse unserer umsatzstärksten Kunden.

df.sort_values('fulfillment_time_seconds', inplace = True)
dfc = df.cumsum()/df.cumsum().max() # % cumulative sum
fig, ax = plt.subplots(figsize=(4,4))
ax.plot(dfc.fulfillment_time_seconds.values, shade = 'okay')
ax2 = ax.twinx()
ax2.plot(dfc.order_value_usd.values, shade = 'magenta')
ax.set_ylabel('cumulative achievement time')
ax.set_xlabel('orders sorted by achievement time')
ax2.set_ylabel('cumulative order worth', shade = 'magenta')
ax.axvline(0.99*1000, linestyle='--', shade = 'okay')
ax.annotate('99% of orders', xy = (970,0.05), ha = 'proper')
ax.axhline(0.73, linestyle='--', shade = 'magenta')
ax.annotate('73% of income', xy = (0,0.75), shade = 'magenta')
Kumulative Verteilungsfunktion der Auftragserfüllungszeiten und des Auftragswerts. Bild vom Autor.

Oben sehen wir, warum es eine große Diskrepanz zwischen den Perzentilen der Checkout-Zeiten und dem GMV gibt. Die GMV-Kurve steigt in der Nähe des 99. Perzentils der Bestellungen steil an, was dazu führt, dass die obersten 1 % der Bestellungen einen übergroßen Einfluss auf den GMV haben.

Dies ist nicht nur ein Artefakt unserer Dummy-Daten. Solche extremen Korrelationen sind leider nicht ungewöhnlich. Beispielsweise machen die Prime 1% der Slack-Kunden 50 % des UmsatzesEtwa 12 % des Umsatzes von UPS stammen aus nur 1 Kunde (Amazonas).

Um die Fallstricke zu vermeiden, die mit der Optimierung ausschließlich für p99 verbunden sind, können wir einen ganzheitlicheren Ansatz wählen.

Eine Lösung besteht darin, sowohl p99 als auch p100 (den Maximalwert) gleichzeitig zu verfolgen. Auf diese Weise besteht die Gefahr, dass wir wertvolle Benutzer nicht ignorieren.

Eine andere Lösung besteht darin, umsatzgewichtete p99-Werte zu verwenden (oder nach Bruttowarenwert, Gewinn oder anderen relevanten Geschäftskennzahlen), die Beobachtungen mit höheren damit verbundenen Umsätzen eine höhere Bedeutung beimessen. Diese Kennzahl stellt sicher, dass bei Optimierungsbemühungen die wertvollsten Transaktionen oder Prozesse priorisiert werden, anstatt alle Beobachtungen gleich zu behandeln.

Und schließlich: Wenn zwischen den Leistungs- und Geschäftsmetriken eine hohe Korrelation besteht, kann ein strengerer p99.5- oder p99.9-Wert das Risiko mindern, dass hochwertige Benutzer ignoriert werden.

Es ist verlockend, sich bei Optimierungsbemühungen ausschließlich auf Kennzahlen wie p99 zu verlassen. Wie wir jedoch gesehen haben, kann das Ignorieren der obersten 1 % der Beobachtungen einen großen Prozentsatz anderer Geschäftsergebnisse negativ beeinflussen. Die Verfolgung sowohl von p99 als auch von p100 oder die Verwendung von umsatzgewichtetem p99 kann eine umfassendere Sicht bieten und die Risiken einer Optimierung nur für p99 mindern. Denken wir zumindest daran, uns nicht zu eng auf eine Leistungskennzahl zu konzentrieren und dabei die Gesamtergebnisse für den Kunden aus den Augen zu verlieren.

Von admin

Schreibe einen Kommentar

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