Analyse von Diamanten anhand verschiedener Eigenschaften.
Quelle: https://www.kaggle.com/shivam2503/diamonds
In diesem Projekt wird ein Datensatz von Diamanten untersucht. Der Datensatz besteht aus 54000 Beobachtungen.
Jede Beobachtung setzt sich aus folgenden Variablen zusammen:
Enfernen von fehlerhaften Beobachtungen
Korrelationen, Verteilung der Variablen und der Zielvariablen, Visualisierungen mit matplotlib, seaborn, plotly.
Transformieren der Variablen, Erstellen neuer Variablen mit Polynomial Features
Modeltest, Modelauswahl, Hyperparameter Tuning
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
plt.style.use('Solarize_Light2')
from IPython.core.pylabtools import figsize
from sklearn.preprocessing import LabelEncoder
import os
pd.set_option('display.max_columns', None)
os.chdir('D:\Data\Projects\Regression\Diamanten Preise_Regularization')
data = pd.read_csv('diamonds.csv')
data.head()
data = data.drop('Unnamed: 0', axis = 1)
print(data.shape)
data.head()
data.dtypes.sort_values()
data.isnull().sum()
data.describe()
Die Maße x, y, z können nicht = 0 sein, entferne diese Beobachtungen
data.loc[(data.x == 0)| (data.y == 0)| (data.z == 0)].shape
data = data[(data.x != 0) & (data.y != 0) & (data.z != 0)]
data.shape
for col in data:
if data[col].dtype == 'object':
print(col.upper())
print(data[col].value_counts())
# Pandas hist Methode
data.hist(bins=25, grid=False, figsize=(12,8), color='#86bf91', zorder=2, rwidth=0.9);
figsize(10, 8)
plt.hist(data.carat, edgecolor = 'black', bins=30);
plt.title('Verteilung von Carat')
plt.xlabel('Carat', fontsize = 20)
plt.ylabel('Count', fontsize = 20);
sns.catplot(x='cut', data=data , kind='count', aspect=2.5);
sns.catplot(x='cut', y='price', data= data, kind='box' ,aspect= 2.5 )
labels = data.clarity.unique().tolist();
sizes = data.clarity.value_counts().tolist();
colors = ['#006400', '#E40E00', '#A00994', '#613205', '#FFED0D', '#16F5A7','blue','#66b3ff'];
plt.pie(sizes, labels=labels, colors=colors, startangle=0, autopct='%1.1f%%');
plt.title('Anteile der Clarity Kategorien');
sns.kdeplot( data["price"] , color="skyblue", shade=True);
plt.xlabel('Price'), plt.ylabel('Density'), plt.title('Density Plot of Diamond Prices');
d = data[:5000]
sns.scatterplot('carat', 'price', data = d, hue = 'cut' );
a = data[40000:]
sns.scatterplot('carat', 'price', data = a, hue = 'cut' );
Sortierte Daten können vom Algorithmus falsch interpretiert werden, daher sollten diese immer gut durchmischt sein. Dafür werden die Reihen am Index mit np.random.permutation gemischt.
data = data.reindex(np.random.permutation(data.index))
data = data.reset_index(drop=True)
d = data[:5000]
sns.scatterplot('carat', 'price', data = d, hue = 'cut' );
To make the price-carat relation more linear, let’s take a 10-based logarithm of the price and use it as the response variable instead. Adding or subtracting a constant affects the mean but does not affect variance . Therefore it is recommended to add a constant . The best constant to add in case of Cobb Douglas production function is to add the same constant to all values of the same variable which makes all values of the variable positive.
data['carat_log'] = np.log10(data.carat +10)
data.head()
dd = data[:5000]
sns.scatterplot('carat_log', 'price', data = dd, hue = 'cut' );
Um Kollinearität zu vermeiden, wird eine der generierten Spalten entfernt mit drop_first=True
df = pd.get_dummies(data, drop_first=True)
df.shape
df.head()
correlations = df.corr()['price'].sort_values(ascending=False)
correlations
abs_correlations = abs(correlations).sort_values(ascending=False)
print(list(abs_correlations[:10].index))
Gewicht und Größe des Diamanten haben den meisten Einfluss auf den Preis.
# Iteriere duch Corr Matrix und berechne für jedes Paar VIF
# VIF = 1/(1-R^2)
corr = data.corr()
corr
Loop über Matrix.
Verwendung von iloc, j=i+1, um nur die Korrs des oberen Dreiecks zu vergleichen
var1 = []
var2 = []
r = []
for i in range(len(corr.columns)):
for j in range((i)):
if corr.iloc[i,j] > 0.7 or corr.iloc[i,j] < -0.7:
var1.append(corr.columns[i])
var2.append(corr.columns[j])
r.append(corr.iloc[i,j])
h_corr = pd.DataFrame(columns = ['var1', 'var2', 'R'])
h_corr['var1']= var1
h_corr['var2']= var2
h_corr['R']= r
h_corr
h_corr['R_sq'] = h_corr.R**2
h_corr['VIF'] = 1/(1-h_corr.R_sq)
h_corr
Es gibt einige Variablen, die hoch kollinear sind. Größe und Gewicht hängen über die Dichte, 3,51 g/cm³, zusammen. Test in Model mit und ohne Variablen x, y, z
df_nonkol = df.drop(columns=['x', 'y', 'z'], axis = 1)
Die beiden DF sind df und df_nonkol
#df.to_csv('df_clean.csv', sep=',', encoding='utf-8', index=False)
#df_nonkol.to_csv('df_nonkol.csv', sep=',', encoding='utf-8', index=False)