Zadanie domowe - EDA Danych dotyczących Irysów¶
- Twoim zadaniem jest wykonanie analizy danych zawartych w załączonym pliku CSV (
25__iris.csv
). - Plik znajduje się pod video. Pamiętaj, żeby wrzucić plik do tego samego folderu, w którym znajduje się ten notebook.
- Wykorzystaj nowo nabytą wiedzę z biblioteki
Pandas
- Jeżeli jest taka konieczność posiłkuj się code explainerem lub / i data chatterem (który również te dane ma dostępne).
- Prześlij na discordzie notebook z rozwiązaniem (
#modul-4-zad1
) - Pamiętaj:
- Nie spiesz się
- Potraktuj zadanie domowe jak prawdziwy projekt
- Dodawaj opisy, obserwacje, wnioski
- Dodaj wizualizacje
- Dodaj konkluzję i wnioski końcowe
Powodzenia!!! I mega zabawy!
O Danych¶
Zbiór danych zawiera informacje o trzech gatunkach irysów: Iris setosa, Iris versicolor, i Iris virginica.
Dane obejmują pomiary czterech cech: długość i szerokość działki kielicha oraz długość i szerokość płatka.
Każdy wiersz w zbiorze danych reprezentuje pojedynczy kwiat, a wartości pomiarów są podane w centymetrach.
Zbiór składa się z 150 próbek, po 50 dla każdego gatunku, i jest szeroko stosowany jako podstawowy zbiór danych do testowania algorytmów klasyfikacji oraz w nauce o danych i uczeniu maszynowym.
Kolumny:
- długość kielicha (sepal length) - Długość kielicha w cm
- szerokość kielicha (sepal width) - Szerokość kielicha w cm
- długość płatka (petal length) - Długość płatka w cm
- szerokość płatka (petal width) - Szerokość płatka w cm
- klasa (class) - Klasa irysa (setosa, versicolor, virginica)
ANALIZA¶
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('25__iris.csv', sep=",")
df.sample(10)
długość kielicha (sepal length) | szerokość kielicha (sepal width) | długość płatka (petal length) | szerokość płatka (petal width) | klasa (class) | |
---|---|---|---|---|---|
17 | 5.1 | 3.5 | 1.4 | 0.3 | Iris-setosa |
139 | 6.9 | 3.1 | 5.4 | 2.1 | Iris-virginica |
93 | 5.0 | 2.3 | 3.3 | 1.0 | Iris-versicolor |
29 | 4.7 | 3.2 | 1.6 | 0.2 | Iris-setosa |
51 | 6.4 | 3.2 | 4.5 | 1.5 | Iris-versicolor |
112 | 6.8 | 3.0 | 5.5 | 2.1 | Iris-virginica |
87 | 6.3 | 2.3 | 4.4 | 1.3 | Iris-versicolor |
95 | 5.7 | 3.0 | 4.2 | 1.2 | Iris-versicolor |
45 | 4.8 | 3.0 | 1.4 | 0.3 | Iris-setosa |
149 | 5.9 | 3.0 | 5.1 | 1.8 | Iris-virginica |
df.info()
df.describe()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 150 entries, 0 to 149 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 długość kielicha (sepal length) 150 non-null float64 1 szerokość kielicha (sepal width) 150 non-null float64 2 długość płatka (petal length) 150 non-null float64 3 szerokość płatka (petal width) 150 non-null float64 4 klasa (class) 150 non-null object dtypes: float64(4), object(1) memory usage: 6.0+ KB
długość kielicha (sepal length) | szerokość kielicha (sepal width) | długość płatka (petal length) | szerokość płatka (petal width) | |
---|---|---|---|---|
count | 150.000000 | 150.000000 | 150.000000 | 150.000000 |
mean | 5.843333 | 3.054000 | 3.758667 | 1.198667 |
std | 0.828066 | 0.433594 | 1.764420 | 0.763161 |
min | 4.300000 | 2.000000 | 1.000000 | 0.100000 |
25% | 5.100000 | 2.800000 | 1.600000 | 0.300000 |
50% | 5.800000 | 3.000000 | 4.350000 | 1.300000 |
75% | 6.400000 | 3.300000 | 5.100000 | 1.800000 |
max | 7.900000 | 4.400000 | 6.900000 | 2.500000 |
# skracamy nazwy kolumn
df.columns = ["dl.kielicha", "szer.kielicha", "dl.platka", "szer.platka", "klasa"]
df.nunique()
dl.kielicha 35 szer.kielicha 23 dl.platka 43 szer.platka 22 klasa 3 dtype: int64
df["klasa"].value_counts()
Iris-setosa 50 Iris-versicolor 50 Iris-virginica 50 Name: klasa, dtype: int64
df.isnull().sum()
dl.kielicha 0 szer.kielicha 0 dl.platka 0 szer.platka 0 klasa 0 dtype: int64
Posiadamy dane dla 150 próbek irysów, po 50 dla każdego z trzech gatunków: Iris-setosa, Iris-versicolor, i Iris-virginica. Możemy zauważyć, że dane są kompletne, nie występują braki wartości.
df.groupby("klasa").mean()
dl.kielicha | szer.kielicha | dl.platka | szer.platka | |
---|---|---|---|---|
klasa | ||||
Iris-setosa | 5.006 | 3.418 | 1.464 | 0.244 |
Iris-versicolor | 5.936 | 2.770 | 4.260 | 1.326 |
Iris-virginica | 6.588 | 2.974 | 5.552 | 2.026 |
df.groupby("klasa").median()
dl.kielicha | szer.kielicha | dl.platka | szer.platka | |
---|---|---|---|---|
klasa | ||||
Iris-setosa | 5.0 | 3.4 | 1.50 | 0.2 |
Iris-versicolor | 5.9 | 2.8 | 4.35 | 1.3 |
Iris-virginica | 6.5 | 3.0 | 5.55 | 2.0 |
Widzimyimy, że w przypadku klasy Iris-setosa średnia i mediana dla wszystkich cech są zdecydowanie mniejsze niż dla pozostałych dwóch gatunków.
sns.pairplot(df, hue="klasa", kind="kde", )
<seaborn.axisgrid.PairGrid at 0x7c67cb5a3110>
Widzimy, że gatunek Iris-setosa jest łatwo rozróżnialny od pozostałych dwóch gatunków, ponieważ jego zaktres wielkości nie nakłada się z zakresem wielkości pozostałych dwóch gatunków i jest znacznie mniejszy.
corr_matrix = df.iloc[:,:-1].corr()
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", vmin=-1, vmax=1)
<Axes: >
W całym zbiorze widzimy wyraźną korelację dodatnią między długością i szerokością płatka oraz nieco mniejsze kerelacje między długością i szerokością płatka a długością kielicha.
klasy = df["klasa"].unique()
for klasa in klasy:
plt.figure()
subset = df[df["klasa"] == klasa]
corr_matrix = subset.drop(columns="klasa").corr()
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", vmin=-1, vmax=1)
plt.title(f"Mapa korelacji dla: {klasa}")
plt.show()
plt.close()
Ciekawostką jest, że tak duże korelacje jak w całymłym zbiorze, nie występują w zakresie poszczególnych gatunków. Wyraźna jest korelacja między dłgością płatka a długością kielicha w przypadku gatunku Iris-virginica.
df.plot(kind="box", by="klasa", layout=(2,2), figsize=(10,10))
dl.kielicha Axes(0.125,0.53;0.352273x0.35) dl.platka Axes(0.547727,0.53;0.352273x0.35) szer.kielicha Axes(0.125,0.11;0.352273x0.35) szer.platka Axes(0.547727,0.11;0.352273x0.35) dtype: object
Na wykresach możemy zauważyć, że jesteśmy w stanie rozróżnić poszczególne gatunki na podstawie wielkośkości ich cech. Najbardzieziej wyraźne jest to w przypadku Iris-setosa, którego płatki są są znacznie mniejsze niż u pozostałych dwóch gatunków a jego kielich jest krótki i szeroki. W tym gatunku najczęściej także występują odstające wartości wielkościsci płatków, jednakże wciąż są mniejsze od pozostałych gatunków.
W przypadku Iris-versicolor i Iris-virginica różnice nie są tak zauważalne, ale nadal można je rozróżnić na podstawie długości kielicha i wielkości płatków. Iris-virginica ma nieco dłuższy kielich i dłuższe i szersze płatki niż Iris-versicolor.
KONKLUZJA¶
Na podstawie analizy danych możemy stwierdzić, że możemy rozróżnić poszczególne gatunki irysów na podstawie ich cech.
- Iris-setosa jest łatwo rozróżnialny od pozostałych dwóch gatunków, jest znacznie mniejszy.
- Iris-versicolor i Iris-virginica różnice nie są tak zauważalne, ale nadal można je rozróżnić na podstawie długości kielicha i wielkości płatków. Iris-virginica ma nieco dłuższy kielich oraz dłuższe i szersze płatki od Iris-versicolor.
Jednakże należy pamiętać, że analiza ta jest oparta na danych, które mamy do dyspozycji. Dostarczona próbka jest stosunkowo mała (50 próbek dla każdego gatunku), więc wyniki mogą być nieco ograniczone. Aby uzyskać bardziej pewne wyniki, należałoby przeprowadzić analizę na większej próbce danych. Nie wiemy także nic o sposobie pomiaru cech irysów: czy były wykonywane w warunkach kontrolowanych na jednej hodowli, czy kwiatostan był w jednakowej fazie rozwoju itd.