import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os
pd.set_option('display.max_columns', None)
os.chdir('D:\Data\Projects\Klassifikation\mushrooms')
%matplotlib inline
plt.style.use('Solarize_Light2')
print('Pandas Version:', pd.__version__)
print('Numpy Version:', np.__version__)
print('Seaborn Version:', sns.__version__)
df = pd.read_csv('mushrooms.csv')
df.head()
df.shape
df.columns = df.columns.str.replace('-','_')
df = df.rename(columns={'class':'target'})
df.target = df.target.map({'p':'poisonous', 'e':'edible'})
df.bruises = df.bruises.map({'t':'bruises', 'f':'no bruises'})
df.cap_shape = df.cap_shape.map({'c':'Conical', 's':'Sunken', 'b':'Bell', 'k':'Knobbed', 'f':'Flat', 'x':'Convex'})
df.gill_attachment = df.gill_attachment.map({'a': 'attached', 'f': 'free'})
df.gill_color = df.gill_color.map({'k':'black', 'n':'brown', 'b':'buff', 'h':'chocolate', 'g':'gray',
'r':'green', 'o': 'orange', 'p':'pink', 'u':'purple', 'e':'red', 'w':'white', 'y':'yellow'})
df.ring_type = df.ring_type.map({'c':'cobwebby', 'e':'evanescent', 'f':'flaring', 'l':'large', 'n':'none', 'p':'pendant',
's':'sheating', 'z':'zone'})
df.target.value_counts()
plt.figure(figsize=(8,8))
plt.rcParams['font.size'] = 15
labels = df.target.unique().tolist();
sizes = df.target.value_counts().tolist();
plt.pie(sizes, labels=labels, startangle=90, autopct='%1.1f%%');
plt.title('Poisenous and Edible Mushrooms');
Keine Class Imbalance; die beiden Klassen 'poisonous' und 'edible' sind ausgeglichen.
df.isna().sum()
Es gibt keine NaNs im Datensatz. Allerdings können fehlende Werte auch als strings vorkommen.
df.dtypes.unique()
df.cap_shape.value_counts().sort_values().plot(kind='bar')
vc = df.cap_shape.value_counts().sort_values()
plt.figure(figsize=(12,8))
plt.title("Cap Shapes", fontsize = 30)
plt.rcParams['font.size'] = 20
ax = sns.barplot(y= vc.index, x= vc.values);
ax.set_xlabel('Count', fontsize=20)
ax.set_ylabel('Category', fontsize=20)
def figure(col):
vc = df[col].value_counts().sort_values(ascending=False)
plt.figure(figsize=(12,8))
plt.rcParams['font.size'] = 20
plt.title(col, fontsize = 30)
ax = sns.barplot(y= vc.index, x= vc.values);
ax.set_xlabel('Count', fontsize=20)
ax.set_ylabel('Category', fontsize=20)
figure('cap_shape')
Anzahl der Kategorien in den Spalten, die den Stiel eines Pilzes beschreiben
df[['stalk_shape','stalk_root','stalk_surface_above_ring','stalk_surface_below_ring','stalk_color_above_ring', 'stalk_color_below_ring']].nunique().plot(kind='bar')
plt.figure(figsize=(12,8))
plt.title("Stalk Root", fontsize = 30)
ax = sns.countplot(x=df.target, hue=df.stalk_root, data=df, palette=["orange", 'green', 'blue', 'red', 'pink'])
ax.set_xlabel('Category', fontsize=20)
ax.set_ylabel('Count', fontsize=20)
ax.set_xticklabels(['poisenous', 'edible'], rotation='horizontal', fontsize=15);
plt.legend( );
ax.legend(['Equal', 'Club', 'Bulbous','Rooted','?'], fancybox=True, framealpha=1, shadow=True, borderpad=1);
Bei einer großen Anzahl von Pilzen ist 'Stalk Root' unbekannt.
plt.figure(figsize=(15,10))
plt.title("Habitat", fontsize = 25)
ax = sns.countplot(data=df, x=df.target, hue=df.habitat)
ax.set_xlabel('Category', fontsize=20)
ax.set_ylabel('Count', fontsize=20)
ax.set_xticklabels(['poisonous', 'edible'], rotation='horizontal', fontsize=15);
ax.legend(['urban', 'grasses', 'meadows', 'woods', 'paths', 'waste', 'leaves'],
fancybox=True, framealpha=1, shadow=True, borderpad=1, loc=2);
plt.figure(figsize=(15,10))
plt.title("Odor", fontsize = 25)
ax = sns.countplot(data=df, x=df.target, hue=df.odor)
ax.set_xlabel('Category', fontsize=20)
ax.set_ylabel('Count', fontsize=20)
ax.set_xticklabels(['poisonous', 'edible'], rotation='horizontal', fontsize=15);
ax.legend(['pungent', 'almond', 'anise','none','foul', 'creosote','fishy','spicy', 'musty'],
fancybox=True, framealpha=1, shadow=True, borderpad=1, loc=2);
Der Geruch könnte ein guter Hinweis auf die Giftigkeit eines Pilzes sein
plt.figure(figsize=(15,10))
plt.title("Bruises", fontsize = 25)
ax = sns.countplot(data=df, x=df.target, hue=df.bruises)
ax.set_xlabel('Category', fontsize=20)
ax.set_ylabel('Count', fontsize=20)
ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1, loc=2);
plt.figure(figsize=(15,10))
plt.title("Gill Attachment", fontsize = 25)
ax = sns.countplot(data=df, x=df.target, hue=df.gill_attachment)
ax.set_xlabel('Category', fontsize=20)
ax.set_ylabel('Count', fontsize=20)
ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1, loc=2);
plt.figure(figsize=(15,10))
plt.title("Gill Color", fontsize = 25)
ax = sns.countplot(data=df, x=df.target, hue=df.gill_color)
ax.set_xlabel('Category', fontsize=20)
ax.set_ylabel('Count', fontsize=20)
ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1, loc=2);
plt.figure(figsize=(15,10))
plt.title("Ring Type", fontsize = 25)
ax = sns.countplot(data=df, x=df.target, hue=df.ring_type)
ax.set_xlabel('Category', fontsize=20)
ax.set_ylabel('Count', fontsize=20)
ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1, loc=2);
Eine der Kategorien ist jeweils die Baseline und wird entfernt, um Kollinearität zu vermeiden. Der Einfachheit halber wird die abhängige Variable 'target_poisonous' in target umbenannt.
df_ = pd.get_dummies(df, drop_first = True).rename(columns={'target_poisonous':'target'})
df_.shape, df.shape
df_.head()
corr = df_.corr()['target'].sort_values(ascending=False)
Die wichtigsten 20 Variablen, die am stärksten mit dem Ziel korreliert sind.
corr20 = abs(corr).head(20)
list(corr20.index)
#df_.to_csv('df_clean.csv')
#df_if = df_[list(corr20.index)]
#df_if.to_csv('df_if.csv')