[やってみた] 探索的データ分析 (EDA) irisのデータセット

スポンサーリンク

はじめに

ひょんなことからデータサイエンスを学ぶことになった私ILab_01が探索的データ分析 (EDA) に挑戦するという記事です。
プログラミング言語はPythonを使用しています。
以下、Jupyter Notebook風にコードと実行結果を書きながら、私が頭で考えていたことをつらつらと書いていきます。

実行結果と考察

# ひとまずデータを読み込む
import seaborn as sns
print(sns.get_dataset_names())
df = sns.load_dataset('iris')
df

[‘anagrams’, ‘anscombe’, ‘attention’, ‘brain_networks’, ‘car_crashes’, ‘diamonds’, ‘dots’, ‘dowjones’, ‘exercise’, ‘flights’, ‘fmri’, ‘geyser’, ‘glue’, ‘healthexp’, ‘iris’, ‘mpg’, ‘penguins’, ‘planets’, ‘seaice’, ‘taxis’, ‘tips’, ‘titanic’]

  • sepal_length : ガクの長さ
  • sepal_width : ガクの幅
  • petal_length : 花弁の長さ
  • petal_width : 花弁の幅
  • species : アヤメの種類
    アヤメの種類をうまい具合に分類したいというデータセットらしい。
# アヤメの種類を見てみる
df['species'].unique()

array([‘setosa’, ‘versicolor’, ‘virginica’], dtype=object)

#各種の個数は?
df['species'].value_counts()
species
setosa        50
versicolor    50
virginica     50
Name: count, dtype: int64
# 欠損値はある? → 全て150件なので無さそう
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   sepal_length  150 non-null    float64
 1   sepal_width   150 non-null    float64
 2   petal_length  150 non-null    float64
 3   petal_width   150 non-null    float64
 4   species       150 non-null    object 
dtypes: float64(4), object(1)
memory usage: 6.0+ KB
# ひとまず、散布図行列を見てみる。
sns.pairplot(df, hue='species')
  • petal_lengthのヒストグラムを見ると、割ときれいに種が別れているので、分類に使えるかもしれない。
  • 同じくpetal_widthも比較的きれいに種を分けるらしい
# まずはデータセットを説明変数Xと目的変数yに分ける
X = df.drop(columns=['species'])
print(X.head())
y = df['species']
print(y.head())
# 学習用とテスト用にデータを分ける
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
   sepal_length  sepal_width  petal_length  petal_width
0           5.1          3.5           1.4          0.2
1           4.9          3.0           1.4          0.2
2           4.7          3.2           1.3          0.2
3           4.6          3.1           1.5          0.2
4           5.0          3.6           1.4          0.2
0    setosa
1    setosa
2    setosa
3    setosa
4    setosa
Name: species, dtype: object
# 決定木モデルを作る
from sklearn import tree
model = tree.DecisionTreeClassifier(max_depth=2, random_state=0)

# 学習
model.fit(X_train, y_train)

# 推論
y_pred = model.predict(X_test)

# 精度の評価
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        16
  versicolor       0.85      0.94      0.89        18
   virginica       0.89      0.73      0.80        11

    accuracy                           0.91        45
   macro avg       0.91      0.89      0.90        45
weighted avg       0.91      0.91      0.91        45

※supportは各ラベル(種)の出力数
f1-scoreでみると、どれも0.8以上で予測している。
macro aveはラベルの単純な平均。weighted aveは件数を考慮して重み付けされた平均。

# 決定木を可視化する
from sklearn.tree import plot_tree
plot_tree(model, feature_names=X_train.columns, filled=True)  # filledは四角の色付け

自分なりの結論

やはり、petal_widthとpetal_lengthである程度、種を分類できるようだ。


データサイエンスに関する記事はメニューバーの「データサイエンス」からどうぞ

コメント

タイトルとURLをコピーしました