Skip to content
Snippets Groups Projects
Commit 9d7e7c49 authored by Manuel's avatar Manuel
Browse files

Tags added

parent 0915af65
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Title
%% Cell type:markdown id: tags:Title
Vorhersage der Kleidergrößen von Kunden
%% Cell type:markdown id: tags:
## Teaser
%% Cell type:markdown id: tags:Teaser
Rücksendungen sind im Modehandel ein kostspieliges Problem, oft mit Rückgabequoten von bis zu 50%. Viele Kunden bestellen mehrere Größen, um die richtige Größe zu finden. Mit dem Datenmodell, das auf einem Datensatz von ModCloth basiert, können Modehändler nun präzise Größenempfehlungen geben. Das Modell nutzt Körpermerkmale wie Taillenumfang, Größe und Hüftumfang, um die perfekte Größe vorherzusagen. Eine logistische Regression zeigte, dass das Modell etwa 73,7% der Variabilität in den Rücksendungen erklären kann, was zu konsistenten Vorhersagen führt. Durch den Einsatz dieses Modells können Rücksendungen reduziert werden. Diese Lösung lässt sich am besten in ein bestehendes CRM-Systeme integrieren und erhöht sowohl die Kundenzufriedenheit als auch die Effizienz des Unternehmens.
%% Cell type:markdown id: tags:
## Business
%% Cell type:markdown id: tags:Business
Rücksendungen sind Teil des Geschäftsmodells vieler Modegeschäfte. Die Rückgabequote der Unternehmen liegen oft bei etwa 50 %, was das Unternehmen unnötig viel Geld und Aufwand kostet. Hinzu kommt: Gerade in der Modebranche gibt es viele Kunden, die schon vor ihrer Bestellung wissen, dass sie den Artikel mit hoher Wahrscheinlichkeit zurückschicken werden. Sie bestellen zum Beispiel ein und dasselbe Hemd in verschiedenen Größen, weil sie nicht sicher sind, welches passen wird. Mit dieser Demo kann es möglich gemacht werden, Kunden anhand von Körpermerkmalen direkt die passende Größe vorzuschlagen. Dies trägt zur Kundenzufriedenheit bei und senkt die Quote der Retouren.
%% Cell type:markdown id: tags:
## Daten
%% Cell type:markdown id: tags:Daten
Der Datensatz für diese Demo wurde auf der Kaggle-Plattform heruntergeladen und stammt von ModCloth, einem Online-Geschäft für Damenbekleidung. Die Daten beziehen sich auf tatsächlich verkaufte Kleidungsstücke und enthalten zusätzliche Informationen über die Passform bei den Kunden. Der Datensatz umfasst mehrere Merkmale, darunter Taillenumfang, Größe, Qualität, Körbchengröße, Hüftumfang, BH-Größe, Brustumfang, Kategorie, Länge, Passform, Schuhgröße, Schuhbreite, etc. Ziel ist es, anhand dieser Merkmale Muster und Zusammenhänge zu erkennen, die Aufschluss darüber geben, wie gut die Kleidung den Kundenerwartungen entspricht und wie diese Informationen zur Verbesserung der Produktangebote und der Kundenzufriedenheit genutzt werden können.
%% Cell type:markdown id: tags:
## Datenvorbereitung
%% Cell type:markdown id: tags:Datenvorbereitung
Nach dem Einlesen des Datensatzes in das Notebook wird zunächst der Typ der Daten überprüft und Einlese Fehler werden korrigiert. Anschließend werden die einzelnen Merkmale der verkauften Kleidung einer deskriptiven Analyse unterzogen, um den Zusammenhang zur Zielvariable "Passform" visuell darzustellen. Mittels einer Korrelationsanalyse werden die Beziehungen zwischen den verschiedenen Kundenmerkmalen und der Zielvariablen untersucht. Merkmale, die keinen Mehrwert bieten, werden entfernt (Dimensionsreduktion). Danach wird die Ausgewogenheit des Datensatzes hinsichtlich der Zielvariablen grafisch dargestellt. Da die Passform "just right" etwa 74% der Daten ausmacht und "nicht passend" etwa 26%, handelt es sich um einen unausgewogenen Datensatz. Die kategorialen Werte werden dann in Dummy-Variablen umgewandelt. Die Merkmale werden auf Multikollinearität und statistische Signifikanz geprüft und anschließend standardisiert. Die Unausgewogenheit des Datensatzes wird durch Undersampling ausgeglichen, bevor Trainings- und Testdaten erstellt werden.
%% Cell type:markdown id: tags:
## Datenmodell
%% Cell type:markdown id: tags:Datenmodell
Als Datenmodell wird eine logistische Regression verwendet. Dies bietet sich zur Klassifikation der Retouren auf eine binäre Zielvariable (= Retouren) an.
%% Cell type:markdown id: tags:
## Evaluation
%% Cell type:markdown id: tags:Evaluation
Es wurde eine Merkmalsskalierung durchgeführt, um sicherzustellen, dass alle Merkmale im gleichen Maßstab vorliegen. Das trainierte Regressionsmodell wurde mit den Trainingsdaten evaluiert, dies deutet darauf hin, dass das Modell etwa 73,7% der Variabilität in den abhängigen Variablen erklären kann. Die Leistung des Modells wurde auch mit den Testdaten bewertet wobei die selben Werte herauskamen. Zusätzlich wurde eine Vorhersage auf den Testdaten durchgeführt und mit den tatsächlichen Werten verglichen. Ein Diagramm zeigt die ersten 50 Vorhersagen im Vergleich zu den tatsächlichen Werten. Darüber hinaus wurde eine Regressionsanalyse durchgeführt, um die Beziehung zwischen den tatsächlichen und den vorhergesagten Werten grafisch darzustellen. Insgesamt zeigt das Modell eine solide Leistung und kann somit als Modell verwendet werden.
%% Cell type:markdown id: tags:
## Umsetzung
%% Cell type:markdown id: tags:Umsetzung
Die Umsetzung bzw. Einbindung des Datenmodells bietet sich in CRM-Systemen an. Durch die Berücksichtigung von Körpermerkmalen des Kunden kann das System automatisch präzise Vorhersagen bezüglich seiner Kleidergrößen treffen. Diese Herangehensweise ermöglicht es, Retouren aufgrund von Bestellung mehrerer Größen oder fehlerhafter Bestellungen zu reduzieren.
%% Cell type:markdown id: tags:
# 1. Business Understanding # 1. Business Understanding
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Rücksendungen sind Teil des Geschäftsmodells vieler Modegeschäfte. Die Rückgabequote eines fiktiven Unternehmens liegt bei etwa 50 %, was das Unternehmen unnötig viel Geld kostet. Hinzu kommt: Gerade im Rücksendungen sind Teil des Geschäftsmodells vieler Modegeschäfte. Die Rückgabequote eines fiktiven Unternehmens liegt bei etwa 50 %, was das Unternehmen unnötig viel Geld kostet. Hinzu kommt: Gerade im
Modebranche gibt es viele Kunden, die schon vor ihrer Bestellung wissen, dass sie Modebranche gibt es viele Kunden, die schon vor ihrer Bestellung wissen, dass sie
dass sie den Artikel mit hoher Wahrscheinlichkeit zurückschicken werden. Sie bestellen zum Beispiel ein und dasselbe Hemd in verschiedenen Größen, weil sie nicht sicher sind, welches passen wird. dass sie den Artikel mit hoher Wahrscheinlichkeit zurückschicken werden. Sie bestellen zum Beispiel ein und dasselbe Hemd in verschiedenen Größen, weil sie nicht sicher sind, welches passen wird.
nicht sicher, welches passen wird. Ist es möglich, maschinelles Lernen einzusetzen, um die Größe anhand bestimmter Parameter zu bestimmen nicht sicher, welches passen wird. Ist es möglich, maschinelles Lernen einzusetzen, um die Größe anhand bestimmter Parameter zu bestimmen
Parameter zu bestimmen und Rücksendungen aufgrund falscher Größen zu minimieren? Parameter zu bestimmen und Rücksendungen aufgrund falscher Größen zu minimieren?
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# 2. Daten und Datenverständnis # 2. Daten und Datenverständnis
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Der Datensatz wurde von Kaggle heruntergeladen und stammte von Der Datensatz wurde von Kaggle heruntergeladen und stammte von
ModCloth, einem Online-Geschäft für Damenbekleidung. Bei den Daten handelt es sich um tatsächlich verkaufte Kleidung und die Zusatzinformationen der ModCloth, einem Online-Geschäft für Damenbekleidung. Bei den Daten handelt es sich um tatsächlich verkaufte Kleidung und die Zusatzinformationen der
zusätzliche Informationen über die Passform beim Kunden. zusätzliche Informationen über die Passform beim Kunden.
Die Daten beinhalten: item_id, Taille, Größe, Qualität, Körbchengröße, Hüfte, BH-Größe, Kategorie, Die Daten beinhalten: item_id, Taille, Größe, Qualität, Körbchengröße, Hüfte, BH-Größe, Kategorie,
Büstengröße, Länge, Passform, user_id, Schuhgröße, Schuhbreite, review_summary und Büstengröße, Länge, Passform, user_id, Schuhgröße, Schuhbreite, review_summary und
prüfung_text. prüfung_text.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 2.1. Import von relevanten Modulen ## 2.1. Import von relevanten Modulen
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import seaborn as sns import seaborn as sns
sns.set() sns.set()
from sklearn.model_selection import train_test_split from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import StandardScaler
from sklearn import metrics from sklearn import metrics
import statsmodels.api as sm import statsmodels.api as sm
from sklearn.linear_model import LinearRegression from sklearn.linear_model import LinearRegression
from sklearn.metrics import confusion_matrix, classification_report from sklearn.metrics import confusion_matrix, classification_report
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 2.2. Daten einlesen ## 2.2. Daten einlesen
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
my_file = "https://storage.googleapis.com/ml-service-repository-datastorage/Size_prediction_for_online_fashion_retailer_modcloth_final_data.json" my_file = "https://storage.googleapis.com/ml-service-repository-datastorage/Size_prediction_for_online_fashion_retailer_modcloth_final_data.json"
df = pd.read_json(my_file, lines = True) df = pd.read_json(my_file, lines = True)
df.head() df.head()
``` ```
%% Output %% Output
item_id waist size quality cup size hips bra size category bust \ item_id waist size quality cup size hips bra size category bust \
0 123373 29.0 7 5.0 d 38.0 34.0 new 36 0 123373 29.0 7 5.0 d 38.0 34.0 new 36
1 123373 31.0 13 3.0 b 30.0 36.0 new NaN 1 123373 31.0 13 3.0 b 30.0 36.0 new NaN
2 123373 30.0 7 2.0 b NaN 32.0 new NaN 2 123373 30.0 7 2.0 b NaN 32.0 new NaN
3 123373 NaN 21 5.0 dd/e NaN NaN new NaN 3 123373 NaN 21 5.0 dd/e NaN NaN new NaN
4 123373 NaN 18 5.0 b NaN 36.0 new NaN 4 123373 NaN 18 5.0 b NaN 36.0 new NaN
height user_name length fit user_id shoe size \ height user_name length fit user_id shoe size \
0 5ft 6in Emily just right small 991571 NaN 0 5ft 6in Emily just right small 991571 NaN
1 5ft 2in sydneybraden2001 just right small 587883 NaN 1 5ft 2in sydneybraden2001 just right small 587883 NaN
2 5ft 7in Ugggh slightly long small 395665 9.0 2 5ft 7in Ugggh slightly long small 395665 9.0
3 NaN alexmeyer626 just right fit 875643 NaN 3 NaN alexmeyer626 just right fit 875643 NaN
4 5ft 2in dberrones1 slightly long small 944840 NaN 4 5ft 2in dberrones1 slightly long small 944840 NaN
shoe width review_summary review_text shoe width review_summary review_text
0 NaN NaN NaN 0 NaN NaN NaN
1 NaN NaN NaN 1 NaN NaN NaN
2 NaN NaN NaN 2 NaN NaN NaN
3 NaN NaN NaN 3 NaN NaN NaN
4 NaN NaN NaN 4 NaN NaN NaN
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 2.3. Daten bereinigen ## 2.3. Daten bereinigen
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df[df.duplicated(keep=False)] df[df.duplicated(keep=False)]
``` ```
%% Output %% Output
item_id waist size quality cup size hips bra size category bust \ item_id waist size quality cup size hips bra size category bust \
1230 126885 NaN 32 3.0 d 53.0 42.0 new NaN 1230 126885 NaN 32 3.0 d 53.0 42.0 new NaN
1231 126885 NaN 32 3.0 d 53.0 42.0 new NaN 1231 126885 NaN 32 3.0 d 53.0 42.0 new NaN
1264 126885 NaN 26 3.0 d NaN 40.0 new NaN 1264 126885 NaN 26 3.0 d NaN 40.0 new NaN
1265 126885 NaN 26 3.0 d NaN 40.0 new NaN 1265 126885 NaN 26 3.0 d NaN 40.0 new NaN
1370 126885 NaN 38 4.0 c 49.0 48.0 new NaN 1370 126885 NaN 38 4.0 c 49.0 48.0 new NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
81598 806479 NaN 20 5.0 c 42.0 38.0 outerwear NaN 81598 806479 NaN 20 5.0 c 42.0 38.0 outerwear NaN
82085 806856 NaN 20 5.0 j 47.0 36.0 outerwear 47 82085 806856 NaN 20 5.0 j 47.0 36.0 outerwear 47
82086 806856 NaN 20 5.0 j 47.0 36.0 outerwear 47 82086 806856 NaN 20 5.0 j 47.0 36.0 outerwear 47
82398 806856 NaN 4 5.0 NaN NaN NaN outerwear NaN 82398 806856 NaN 4 5.0 NaN NaN NaN outerwear NaN
82399 806856 NaN 4 5.0 NaN NaN NaN outerwear NaN 82399 806856 NaN 4 5.0 NaN NaN NaN outerwear NaN
height user_name length fit user_id shoe size \ height user_name length fit user_id shoe size \
1230 5ft 3in Brandy slightly long fit 94385 NaN 1230 5ft 3in Brandy slightly long fit 94385 NaN
1231 5ft 3in Brandy slightly long fit 94385 NaN 1231 5ft 3in Brandy slightly long fit 94385 NaN
1264 5ft 9in megmattmt just right fit 67002 10.5 1264 5ft 9in megmattmt just right fit 67002 10.5
1265 5ft 9in megmattmt just right fit 67002 10.5 1265 5ft 9in megmattmt just right fit 67002 10.5
1370 5ft 11in kelli.andrews very long large 826087 NaN 1370 5ft 11in kelli.andrews very long large 826087 NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ...
81598 5ft 6in karinabuendia slightly long large 756267 10.0 81598 5ft 6in karinabuendia slightly long large 756267 10.0
82085 5ft 10in bookworm.bedore just right fit 315616 10.5 82085 5ft 10in bookworm.bedore just right fit 315616 10.5
82086 5ft 10in bookworm.bedore just right fit 315616 10.5 82086 5ft 10in bookworm.bedore just right fit 315616 10.5
82398 5ft 5in ktanner779 just right large 858162 NaN 82398 5ft 5in ktanner779 just right large 858162 NaN
82399 5ft 5in ktanner779 just right large 858162 NaN 82399 5ft 5in ktanner779 just right large 858162 NaN
shoe width review_summary \ shoe width review_summary \
1230 NaN NaN 1230 NaN NaN
1231 NaN NaN 1231 NaN NaN
1264 wide NaN 1264 wide NaN
1265 wide NaN 1265 wide NaN
1370 NaN NaN 1370 NaN NaN
... ... ... ... ... ...
81598 NaN I loved this coat since t 81598 NaN I loved this coat since t
82085 average Love it! Fit and material 82085 average Love it! Fit and material
82086 average Love it! Fit and material 82086 average Love it! Fit and material
82398 NaN LOVE this coat. Super war 82398 NaN LOVE this coat. Super war
82399 NaN LOVE this coat. Super war 82399 NaN LOVE this coat. Super war
review_text review_text
1230 NaN 1230 NaN
1231 NaN 1231 NaN
1264 NaN 1264 NaN
1265 NaN 1265 NaN
1370 NaN 1370 NaN
... ... ... ...
81598 I loved this coat since the moment I saw it bu... 81598 I loved this coat since the moment I saw it bu...
82085 Love it! Fit and material is A+. 82085 Love it! Fit and material is A+.
82086 Love it! Fit and material is A+. 82086 Love it! Fit and material is A+.
82398 LOVE this coat. Super warm, beautiful color an... 82398 LOVE this coat. Super warm, beautiful color an...
82399 LOVE this coat. Super warm, beautiful color an... 82399 LOVE this coat. Super warm, beautiful color an...
[754 rows x 18 columns] [754 rows x 18 columns]
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop_duplicates(keep='first') df = df.drop_duplicates(keep='first')
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.describe(include='all') df.describe(include='all')
``` ```
%% Output %% Output
item_id waist size quality cup size \ item_id waist size quality cup size \
count 82413.000000 2881.000000 82413.000000 82345.000000 76185 count 82413.000000 2881.000000 82413.000000 82345.000000 76185
unique NaN NaN NaN NaN 12 unique NaN NaN NaN NaN 12
top NaN NaN NaN NaN c top NaN NaN NaN NaN c
freq NaN NaN NaN NaN 18270 freq NaN NaN NaN NaN 18270
mean 469417.251295 31.319681 12.659714 3.949092 NaN mean 469417.251295 31.319681 12.659714 3.949092 NaN
std 214067.804253 5.303712 8.270768 0.992837 NaN std 214067.804253 5.303712 8.270768 0.992837 NaN
min 123373.000000 20.000000 0.000000 1.000000 NaN min 123373.000000 20.000000 0.000000 1.000000 NaN
25% 314980.000000 28.000000 8.000000 3.000000 NaN 25% 314980.000000 28.000000 8.000000 3.000000 NaN
50% 454030.000000 30.000000 12.000000 4.000000 NaN 50% 454030.000000 30.000000 12.000000 4.000000 NaN
75% 658440.000000 34.000000 15.000000 5.000000 NaN 75% 658440.000000 34.000000 15.000000 5.000000 NaN
max 807722.000000 50.000000 38.000000 5.000000 NaN max 807722.000000 50.000000 38.000000 5.000000 NaN
hips bra size category bust height user_name \ hips bra size category bust height user_name \
count 55804.000000 76421.000000 82413 11796 81308 82413 count 55804.000000 76421.000000 82413 11796 81308 82413
unique NaN NaN 7 40 41 32429 unique NaN NaN 7 40 41 32429
top NaN NaN new 36 5ft 4in Sarah top NaN NaN new 36 5ft 4in Sarah
freq NaN NaN 21395 2042 11876 727 freq NaN NaN 21395 2042 11876 727
mean 40.358559 35.971605 NaN NaN NaN NaN mean 40.358559 35.971605 NaN NaN NaN NaN
std 5.827906 3.224445 NaN NaN NaN NaN std 5.827906 3.224445 NaN NaN NaN NaN
min 30.000000 28.000000 NaN NaN NaN NaN min 30.000000 28.000000 NaN NaN NaN NaN
25% 36.000000 34.000000 NaN NaN NaN NaN 25% 36.000000 34.000000 NaN NaN NaN NaN
50% 39.000000 36.000000 NaN NaN NaN NaN 50% 39.000000 36.000000 NaN NaN NaN NaN
75% 43.000000 38.000000 NaN NaN NaN NaN 75% 43.000000 38.000000 NaN NaN NaN NaN
max 60.000000 48.000000 NaN NaN NaN NaN max 60.000000 48.000000 NaN NaN NaN NaN
length fit user_id shoe size shoe width \ length fit user_id shoe size shoe width \
count 82378 82413 82413.000000 27790.000000 18521 count 82378 82413 82413.000000 27790.000000 18521
unique 5 3 NaN NaN 3 unique 5 3 NaN NaN 3
top just right fit NaN NaN average top just right fit NaN NaN average
freq 61660 56516 NaN NaN 13030 freq 61660 56516 NaN NaN 13030
mean NaN NaN 498819.325701 8.145592 NaN mean NaN NaN 498819.325701 8.145592 NaN
std NaN NaN 286325.583966 1.335898 NaN std NaN NaN 286325.583966 1.335898 NaN
min NaN NaN 6.000000 5.000000 NaN min NaN NaN 6.000000 5.000000 NaN
25% NaN NaN 252928.000000 7.000000 NaN 25% NaN NaN 252928.000000 7.000000 NaN
50% NaN NaN 497756.000000 8.000000 NaN 50% NaN NaN 497756.000000 8.000000 NaN
75% NaN NaN 744641.000000 9.000000 NaN 75% NaN NaN 744641.000000 9.000000 NaN
max NaN NaN 999972.000000 38.000000 NaN max NaN NaN 999972.000000 38.000000 NaN
review_summary review_text review_summary review_text
count 75704 75704 count 75704 75704
unique 61713 73313 unique 61713 73313
top Love it! Love it! top Love it! Love it!
freq 184 152 freq 184 152
mean NaN NaN mean NaN NaN
std NaN NaN std NaN NaN
min NaN NaN min NaN NaN
25% NaN NaN 25% NaN NaN
50% NaN NaN 50% NaN NaN
75% NaN NaN 75% NaN NaN
max NaN NaN max NaN NaN
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.isnull().sum() df.isnull().sum()
``` ```
%% Output %% Output
item_id 0 item_id 0
waist 79532 waist 79532
size 0 size 0
quality 68 quality 68
cup size 6228 cup size 6228
hips 26609 hips 26609
bra size 5992 bra size 5992
category 0 category 0
bust 70617 bust 70617
height 1105 height 1105
user_name 0 user_name 0
length 35 length 35
fit 0 fit 0
user_id 0 user_id 0
shoe size 54623 shoe size 54623
shoe width 63892 shoe width 63892
review_summary 6709 review_summary 6709
review_text 6709 review_text 6709
dtype: int64 dtype: int64
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.dtypes df.dtypes
``` ```
%% Output %% Output
item_id int64 item_id int64
waist float64 waist float64
size int64 size int64
quality float64 quality float64
cup size object cup size object
hips float64 hips float64
bra size float64 bra size float64
category object category object
bust object bust object
height object height object
user_name object user_name object
length object length object
fit object fit object
user_id int64 user_id int64
shoe size float64 shoe size float64
shoe width object shoe width object
review_summary object review_summary object
review_text object review_text object
dtype: object dtype: object
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.shape[1] df.shape[1]
``` ```
%% Output %% Output
18 18
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.shape[0] df.shape[0]
``` ```
%% Output %% Output
82413 82413
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# 3. Datenaufbereitung # 3. Datenaufbereitung
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 3.1. Test auf Multikollinearität ## 3.1. Test auf Multikollinearität
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
f,ax=plt.subplots(figsize = (18,18)) f,ax=plt.subplots(figsize = (18,18))
sns.heatmap(df.corr(),annot= True,linewidths=0.5,fmt = ".1f",ax=ax) sns.heatmap(df.corr(),annot= True,linewidths=0.5,fmt = ".1f",ax=ax)
plt.xticks(rotation=90) plt.xticks(rotation=90)
plt.yticks(rotation=0) plt.yticks(rotation=0)
plt.title('Correlation Map') plt.title('Correlation Map')
plt.show() plt.show()
``` ```
%% Output %% Output
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['user_id'], axis=1) df = df.drop(['user_id'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['user_name'], axis=1) df = df.drop(['user_name'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['item_id'], axis=1) df = df.drop(['item_id'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['review_text'], axis=1) df = df.drop(['review_text'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['review_summary'], axis=1) df = df.drop(['review_summary'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['shoe width'], axis=1) df = df.drop(['shoe width'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['shoe size'], axis=1) df = df.drop(['shoe size'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['waist'], axis=1) df = df.drop(['waist'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['bust'], axis=1) df = df.drop(['bust'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.dropna(axis = 0, subset = ['hips']) df = df.dropna(axis = 0, subset = ['hips'])
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.dropna(axis = 0, subset = ['cup size']) df = df.dropna(axis = 0, subset = ['cup size'])
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.dropna(axis = 0, subset = ['height']) df = df.dropna(axis = 0, subset = ['height'])
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['quality'], axis=1) df = df.drop(['quality'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['length'], axis=1) df = df.drop(['length'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.dropna(axis = 0, subset = ['bra size']) df = df.dropna(axis = 0, subset = ['bra size'])
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.loc[(df.fit == 'small'),'fit']=0 df.loc[(df.fit == 'small'),'fit']=0
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.loc[(df.fit == 'fit'),'fit']=1 df.loc[(df.fit == 'fit'),'fit']=1
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.loc[(df.fit == 'large'),'fit']=0 df.loc[(df.fit == 'large'),'fit']=0
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df["fit"] = df["fit"].astype(str).astype(int) df["fit"] = df["fit"].astype(str).astype(int)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df[df.fit != 0] df = df[df.fit != 0]
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.fit.unique() df.fit.unique()
``` ```
%% Output %% Output
array([1], dtype=int64) array([1], dtype=int64)
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.isnull().sum() df.isnull().sum()
``` ```
%% Output %% Output
size 0 size 0
cup size 0 cup size 0
hips 0 hips 0
bra size 0 bra size 0
category 0 category 0
height 0 height 0
fit 0 fit 0
dtype: int64 dtype: int64
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.describe(include='all') df.describe(include='all')
``` ```
%% Output %% Output
size cup size hips bra size category height \ size cup size hips bra size category height \
count 37187.000000 37187 37187.000000 37187.000000 37187 37187 count 37187.000000 37187 37187.000000 37187.000000 37187 37187
unique NaN 12 NaN NaN 7 32 unique NaN 12 NaN NaN 7 32
top NaN c NaN NaN new 5ft 4in top NaN c NaN NaN new 5ft 4in
freq NaN 8949 NaN NaN 9463 5625 freq NaN 8949 NaN NaN 9463 5625
mean 11.794310 NaN 40.066529 35.669024 NaN NaN mean 11.794310 NaN 40.066529 35.669024 NaN NaN
std 7.661827 NaN 5.692938 3.101530 NaN NaN std 7.661827 NaN 5.692938 3.101530 NaN NaN
min 0.000000 NaN 30.000000 28.000000 NaN NaN min 0.000000 NaN 30.000000 28.000000 NaN NaN
25% 8.000000 NaN 36.000000 34.000000 NaN NaN 25% 8.000000 NaN 36.000000 34.000000 NaN NaN
50% 10.000000 NaN 39.000000 36.000000 NaN NaN 50% 10.000000 NaN 39.000000 36.000000 NaN NaN
75% 15.000000 NaN 43.000000 38.000000 NaN NaN 75% 15.000000 NaN 43.000000 38.000000 NaN NaN
max 38.000000 NaN 60.000000 48.000000 NaN NaN max 38.000000 NaN 60.000000 48.000000 NaN NaN
fit fit
count 37187.0 count 37187.0
unique NaN unique NaN
top NaN top NaN
freq NaN freq NaN
mean 1.0 mean 1.0
std 0.0 std 0.0
min 1.0 min 1.0
25% 1.0 25% 1.0
50% 1.0 50% 1.0
75% 1.0 75% 1.0
max 1.0 max 1.0
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
from statsmodels.stats.outliers_influence import variance_inflation_factor from statsmodels.stats.outliers_influence import variance_inflation_factor
variable = df[['bra size', 'fit', 'hips', 'size']] variable = df[['bra size', 'fit', 'hips', 'size']]
vif = pd.DataFrame() vif = pd.DataFrame()
vif["VIF"] = [variance_inflation_factor(variable.values, i) for i in range(variable.shape[1])] vif["VIF"] = [variance_inflation_factor(variable.values, i) for i in range(variable.shape[1])]
vif["Features"] = variable.columns vif["Features"] = variable.columns
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
vif vif
``` ```
%% Output %% Output
VIF Features VIF Features
0 2.666437 bra size 0 2.666437 bra size
1 306.634974 fit 1 306.634974 fit
2 2.368706 hips 2 2.368706 hips
3 3.356016 size 3 3.356016 size
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = df.drop(['fit'], axis=1) df = df.drop(['fit'], axis=1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.hist(figsize=(25,25), bins=50) df.hist(figsize=(25,25), bins=50)
``` ```
%% Output %% Output
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000001A78129BAC8>, array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000001A78129BAC8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001A7818C6A08>], <matplotlib.axes._subplots.AxesSubplot object at 0x000001A7818C6A08>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x000001A7818B7248>, [<matplotlib.axes._subplots.AxesSubplot object at 0x000001A7818B7248>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001A7818A6288>]], <matplotlib.axes._subplots.AxesSubplot object at 0x000001A7818A6288>]],
dtype=object) dtype=object)
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# Create a figure instance # Create a figure instance
fig = plt.figure(1, figsize=(9, 6)) fig = plt.figure(1, figsize=(9, 6))
# Create an axes instance # Create an axes instance
ax = fig.add_subplot(111) ax = fig.add_subplot(111)
# Create the boxplot # Create the boxplot
bp = ax.boxplot(df['size']) bp = ax.boxplot(df['size'])
``` ```
%% Output %% Output
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.head() df.head()
``` ```
%% Output %% Output
size cup size hips bra size category height size cup size hips bra size category height
9 13 dd/e 41.0 36.0 new 5ft 6in 9 13 dd/e 41.0 36.0 new 5ft 6in
14 3 b 36.0 34.0 new 5ft 3in 14 3 b 36.0 34.0 new 5ft 3in
15 27 c 50.0 40.0 new 5ft 4in 15 27 c 50.0 40.0 new 5ft 4in
16 18 d 44.0 36.0 new 5ft 2in 16 18 d 44.0 36.0 new 5ft 2in
19 9 dd/e 35.0 34.0 new 5ft 5in 19 9 dd/e 35.0 34.0 new 5ft 5in
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 3.2. Umkodierung von kategorialen Variablen ## 3.2. Umkodierung von kategorialen Variablen
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df_dummies = pd.get_dummies(df, drop_first=True) # 0-1 encoding for categorical values df_dummies = pd.get_dummies(df, drop_first=True) # 0-1 encoding for categorical values
df_dummies.head() df_dummies.head()
``` ```
%% Output %% Output
size hips bra size cup size_aa cup size_b cup size_c cup size_d \ size hips bra size cup size_aa cup size_b cup size_c cup size_d \
9 13 41.0 36.0 0 0 0 0 9 13 41.0 36.0 0 0 0 0
14 3 36.0 34.0 0 1 0 0 14 3 36.0 34.0 0 1 0 0
15 27 50.0 40.0 0 0 1 0 15 27 50.0 40.0 0 0 1 0
16 18 44.0 36.0 0 0 0 1 16 18 44.0 36.0 0 0 0 1
19 9 35.0 34.0 0 0 0 0 19 9 35.0 34.0 0 0 0 0
cup size_dd/e cup size_ddd/f cup size_dddd/g ... height_6ft \ cup size_dd/e cup size_ddd/f cup size_dddd/g ... height_6ft \
9 1 0 0 ... 0 9 1 0 0 ... 0
14 0 0 0 ... 0 14 0 0 0 ... 0
15 0 0 0 ... 0 15 0 0 0 ... 0
16 0 0 0 ... 0 16 0 0 0 ... 0
19 1 0 0 ... 0 19 1 0 0 ... 0
height_6ft 1in height_6ft 2in height_6ft 3in height_6ft 4in \ height_6ft 1in height_6ft 2in height_6ft 3in height_6ft 4in \
9 0 0 0 0 9 0 0 0 0
14 0 0 0 0 14 0 0 0 0
15 0 0 0 0 15 0 0 0 0
16 0 0 0 0 16 0 0 0 0
19 0 0 0 0 19 0 0 0 0
height_6ft 5in height_6ft 6in height_6ft 8in height_7ft 11in \ height_6ft 5in height_6ft 6in height_6ft 8in height_7ft 11in \
9 0 0 0 0 9 0 0 0 0
14 0 0 0 0 14 0 0 0 0
15 0 0 0 0 15 0 0 0 0
16 0 0 0 0 16 0 0 0 0
19 0 0 0 0 19 0 0 0 0
height_7ft 7in height_7ft 7in
9 0 9 0
14 0 14 0
15 0 15 0
16 0 16 0
19 0 19 0
[5 rows x 51 columns] [5 rows x 51 columns]
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
#project.save_data("df_dummies.csv", df_dummies.to_csv(index=False)) #project.save_data("df_dummies.csv", df_dummies.to_csv(index=False))
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df_dummies.describe(include="all") df_dummies.describe(include="all")
``` ```
%% Output %% Output
size hips bra size cup size_aa cup size_b \ size hips bra size cup size_aa cup size_b \
count 37187.000000 37187.000000 37187.000000 37187.000000 37187.000000 count 37187.000000 37187.000000 37187.000000 37187.000000 37187.000000
mean 11.794310 40.066529 35.669024 0.004410 0.202517 mean 11.794310 40.066529 35.669024 0.004410 0.202517
std 7.661827 5.692938 3.101530 0.066263 0.401881 std 7.661827 5.692938 3.101530 0.066263 0.401881
min 0.000000 30.000000 28.000000 0.000000 0.000000 min 0.000000 30.000000 28.000000 0.000000 0.000000
25% 8.000000 36.000000 34.000000 0.000000 0.000000 25% 8.000000 36.000000 34.000000 0.000000 0.000000
50% 10.000000 39.000000 36.000000 0.000000 0.000000 50% 10.000000 39.000000 36.000000 0.000000 0.000000
75% 15.000000 43.000000 38.000000 0.000000 0.000000 75% 15.000000 43.000000 38.000000 0.000000 0.000000
max 38.000000 60.000000 48.000000 1.000000 1.000000 max 38.000000 60.000000 48.000000 1.000000 1.000000
cup size_c cup size_d cup size_dd/e cup size_ddd/f \ cup size_c cup size_d cup size_dd/e cup size_ddd/f \
count 37187.000000 37187.000000 37187.000000 37187.000000 count 37187.000000 37187.000000 37187.000000 37187.000000
mean 0.240649 0.210047 0.157932 0.072929 mean 0.240649 0.210047 0.157932 0.072929
std 0.427483 0.407347 0.364682 0.260023 std 0.427483 0.407347 0.364682 0.260023
min 0.000000 0.000000 0.000000 0.000000 min 0.000000 0.000000 0.000000 0.000000
25% 0.000000 0.000000 0.000000 0.000000 25% 0.000000 0.000000 0.000000 0.000000
50% 0.000000 0.000000 0.000000 0.000000 50% 0.000000 0.000000 0.000000 0.000000
75% 0.000000 0.000000 0.000000 0.000000 75% 0.000000 0.000000 0.000000 0.000000
max 1.000000 1.000000 1.000000 1.000000 max 1.000000 1.000000 1.000000 1.000000
cup size_dddd/g ... height_6ft height_6ft 1in height_6ft 2in \ cup size_dddd/g ... height_6ft height_6ft 1in height_6ft 2in \
count 37187.000000 ... 37187.000000 37187.000000 37187.000000 count 37187.000000 ... 37187.000000 37187.000000 37187.000000
mean 0.025708 ... 0.007072 0.001748 0.001183 mean 0.025708 ... 0.007072 0.001748 0.001183
std 0.158265 ... 0.083801 0.041772 0.034378 std 0.158265 ... 0.083801 0.041772 0.034378
min 0.000000 ... 0.000000 0.000000 0.000000 min 0.000000 ... 0.000000 0.000000 0.000000
25% 0.000000 ... 0.000000 0.000000 0.000000 25% 0.000000 ... 0.000000 0.000000 0.000000
50% 0.000000 ... 0.000000 0.000000 0.000000 50% 0.000000 ... 0.000000 0.000000 0.000000
75% 0.000000 ... 0.000000 0.000000 0.000000 75% 0.000000 ... 0.000000 0.000000 0.000000
max 1.000000 ... 1.000000 1.000000 1.000000 max 1.000000 ... 1.000000 1.000000 1.000000
height_6ft 3in height_6ft 4in height_6ft 5in height_6ft 6in \ height_6ft 3in height_6ft 4in height_6ft 5in height_6ft 6in \
count 37187.000000 37187.000000 37187.000000 37187.000000 count 37187.000000 37187.000000 37187.000000 37187.000000
mean 0.000054 0.000027 0.000134 0.000054 mean 0.000054 0.000027 0.000134 0.000054
std 0.007334 0.005186 0.011595 0.007334 std 0.007334 0.005186 0.011595 0.007334
min 0.000000 0.000000 0.000000 0.000000 min 0.000000 0.000000 0.000000 0.000000
25% 0.000000 0.000000 0.000000 0.000000 25% 0.000000 0.000000 0.000000 0.000000
50% 0.000000 0.000000 0.000000 0.000000 50% 0.000000 0.000000 0.000000 0.000000
75% 0.000000 0.000000 0.000000 0.000000 75% 0.000000 0.000000 0.000000 0.000000
max 1.000000 1.000000 1.000000 1.000000 max 1.000000 1.000000 1.000000 1.000000
height_6ft 8in height_7ft 11in height_7ft 7in height_6ft 8in height_7ft 11in height_7ft 7in
count 37187.000000 37187.000000 37187.000000 count 37187.000000 37187.000000 37187.000000
mean 0.000027 0.000215 0.000027 mean 0.000027 0.000215 0.000027
std 0.005186 0.014666 0.005186 std 0.005186 0.014666 0.005186
min 0.000000 0.000000 0.000000 min 0.000000 0.000000 0.000000
25% 0.000000 0.000000 0.000000 25% 0.000000 0.000000 0.000000
50% 0.000000 0.000000 0.000000 50% 0.000000 0.000000 0.000000
75% 0.000000 0.000000 0.000000 75% 0.000000 0.000000 0.000000
max 1.000000 1.000000 1.000000 max 1.000000 1.000000 1.000000
[8 rows x 51 columns] [8 rows x 51 columns]
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.shape[1] df.shape[1]
``` ```
%% Output %% Output
6 6
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df.shape[0] df.shape[0]
``` ```
%% Output %% Output
37187 37187
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# 4. Modellierung und Evaluation # 4. Modellierung und Evaluation
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df_dummies.head() df_dummies.head()
``` ```
%% Output %% Output
size hips bra size cup size_aa cup size_b cup size_c cup size_d \ size hips bra size cup size_aa cup size_b cup size_c cup size_d \
9 13 41.0 36.0 0 0 0 0 9 13 41.0 36.0 0 0 0 0
14 3 36.0 34.0 0 1 0 0 14 3 36.0 34.0 0 1 0 0
15 27 50.0 40.0 0 0 1 0 15 27 50.0 40.0 0 0 1 0
16 18 44.0 36.0 0 0 0 1 16 18 44.0 36.0 0 0 0 1
19 9 35.0 34.0 0 0 0 0 19 9 35.0 34.0 0 0 0 0
cup size_dd/e cup size_ddd/f cup size_dddd/g ... height_6ft \ cup size_dd/e cup size_ddd/f cup size_dddd/g ... height_6ft \
9 1 0 0 ... 0 9 1 0 0 ... 0
14 0 0 0 ... 0 14 0 0 0 ... 0
15 0 0 0 ... 0 15 0 0 0 ... 0
16 0 0 0 ... 0 16 0 0 0 ... 0
19 1 0 0 ... 0 19 1 0 0 ... 0
height_6ft 1in height_6ft 2in height_6ft 3in height_6ft 4in \ height_6ft 1in height_6ft 2in height_6ft 3in height_6ft 4in \
9 0 0 0 0 9 0 0 0 0
14 0 0 0 0 14 0 0 0 0
15 0 0 0 0 15 0 0 0 0
16 0 0 0 0 16 0 0 0 0
19 0 0 0 0 19 0 0 0 0
height_6ft 5in height_6ft 6in height_6ft 8in height_7ft 11in \ height_6ft 5in height_6ft 6in height_6ft 8in height_7ft 11in \
9 0 0 0 0 9 0 0 0 0
14 0 0 0 0 14 0 0 0 0
15 0 0 0 0 15 0 0 0 0
16 0 0 0 0 16 0 0 0 0
19 0 0 0 0 19 0 0 0 0
height_7ft 7in height_7ft 7in
9 0 9 0
14 0 14 0
15 0 15 0
16 0 16 0
19 0 19 0
[5 rows x 51 columns] [5 rows x 51 columns]
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 4.1. Test- und Trainingsdaten ## 4.1. Test- und Trainingsdaten
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
target = df_dummies['size'] target = df_dummies['size']
predictors = df_dummies.drop(['size'], axis = 1) predictors = df_dummies.drop(['size'], axis = 1)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
X_train, X_test, y_train, y_test = train_test_split(predictors, target, test_size=0.2, random_state=365) X_train, X_test, y_train, y_test = train_test_split(predictors, target, test_size=0.2, random_state=365)
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 4.2. Merkmalsskalierung ## 4.2. Merkmalsskalierung
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
scaler = StandardScaler() scaler = StandardScaler()
scaler.fit(X_train) scaler.fit(X_train)
X_train = scaler.transform(X_train) X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test) X_test = scaler.transform(X_test)
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 4.3. Evaluation ## 4.3. Evaluation
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
reg = LinearRegression() reg = LinearRegression()
reg.fit(X_train, y_train) reg.fit(X_train, y_train)
``` ```
%% Output %% Output
LinearRegression() LinearRegression()
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
print('training performance') print('training performance')
print(reg.score(X_train,y_train)) print(reg.score(X_train,y_train))
print('test performance') print('test performance')
print(reg.score(X_test,y_test)) print(reg.score(X_test,y_test))
``` ```
%% Output %% Output
training performance training performance
0.7372938259154406 0.7372938259154406
test performance test performance
0.7370702534364146 0.7370702534364146
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
y_pred = reg.predict(X_test) y_pred = reg.predict(X_test)
test = pd.DataFrame({'Predicted':y_pred,'Actual':y_test}) test = pd.DataFrame({'Predicted':y_pred,'Actual':y_test})
fig= plt.figure(figsize=(16,8)) fig= plt.figure(figsize=(16,8))
test = test.reset_index() test = test.reset_index()
test = test.drop(['index'],axis=1) test = test.drop(['index'],axis=1)
plt.plot(test[:50]) plt.plot(test[:50])
plt.legend(['Actual','Predicted']) plt.legend(['Actual','Predicted'])
sns.jointplot(x='Actual',y='Predicted',data=test,kind='reg',); sns.jointplot(x='Actual',y='Predicted',data=test,kind='reg',);
``` ```
%% Output %% Output
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
from sklearn.metrics import r2_score from sklearn.metrics import r2_score
r2_score(y_test, y_pred) r2_score(y_test, y_pred)
``` ```
%% Output %% Output
0.7370702534364146 0.7370702534364146
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment