「ワインのデータセット」について学ぶ(scikit-learn /トイデータセット)

2023年5月13日

この記事では、統計学を初めて学ぶ筆者が、「scikit-learn」の「トイデータセット」における「ワインのデータセット」について学んだ内容について記載しています。

学習には、scikit-learnのガイド「7.1. Toy datasets」を参考にし、Pythonのプログラミングにも触れ、理解を深めました。

プログラミングには、機械学習ライブラリのscikit-learnを使用しました。

この記事は、他の人が参考にできるよう、わかりやすく書くことを心がけました。

scikit-learn トイデータセット

機械学習ライブラリscikit-learnに用意されている「トイデータセット」は、機械学習の問題を解くためのサンプルデータセットのことで、いくつかの種類が用意されています。例えば、Iris(アヤメ)の花の特徴から、その種類を分類する問題を解くための「irisデータセット」や、ボストン市の住宅価格に関するデータを用いて、住宅価格を予測する問題を解くための「bostonデータセット」などがあります。

scikit-learnにはいくつかの小さな標準データセットが付属しており、外部のウェブサイトからファイルをダウンロードする必要はありません。

これらは以下の関数を使って読み込むことができます。

load_boston() : load_boston は 1.0 で非推奨となり、1.2 で削除される予定である。

load_iris() : アヤメのデータセット(分類)をロードして返す。

load_diabetes() : 糖尿病のデータセット(回帰)をロードして返す。

load_linnerud() : 身体運動のデータセットをロードして返す。

load_digits() : 数字のデータセット(分類)をロードして返す。

load_wine() : ワインのデータセット(分類)をロードして返す。

load_breast_cancer() : ウィスコンシン州の乳がんのデータセット(分類)をロードして返す。7.1. Toy datasetsts

ワインのデータセット

ワインのデータセットは、イタリアの同じ地域で栽培された3つの異なる品種のワインの化学分析の結果を収集したデータセットです。このデータセットには、13個の異なる化学的特性に関する情報が含まれています。これらの特性は、アルコール、マリック酸、灰、アルカリ灰度、マグネシウム、総フェノール、フラボノイド、非フラボノイドフェノール、プロアントシアニジン、色の強度、色相、希釈ワインのOD280 / OD315、プロリンです。クラス0には59、クラス1には71、クラス2には48のサンプルが含まれています。ワインデータセットは、分類やクラスタリングなどの機械学習アルゴリズムの評価や開発に使用されることがあります。

Pythonプログラミング

「ワインのデータセット」をイメージしやすいようPythonでのプログラミングについても学びます。

プログラム

ワインのデータセットを読み込み、データセットの詳細を出力します。

from sklearn.datasets import load_wine

wine = load_wine()

print("ワインのデータセットの定義:")
print("----------------------------")
print("データセット名:", wine['DESCR'])
print("----------------------------")
print("特徴量名:", wine['feature_names'])
print("----------------------------")
print("特徴量の数:", len(wine['feature_names']))
print("----------------------------")
print("クラス名:", wine['target_names'])
print("----------------------------")
print("クラスの数:", len(wine['target_names']))
print("----------------------------")
print("データ数:", len(wine['data']))
print("----------------------------")
print("データの先頭5行:")
print(wine['data'][:5])
print("----------------------------")
print("クラスの先頭5行:")
print(wine['target'][:5])

実行結果

ワインのデータセットの定義:
----------------------------
データセット名: .. _wine_dataset:

Wine recognition dataset
------------------------

**Data Set Characteristics:**

    :Number of Instances: 178 (50 in each of three classes)
    :Number of Attributes: 13 numeric, predictive attributes and the class
    :Attribute Information:
 		- Alcohol
 		- Malic acid
 		- Ash
		- Alcalinity of ash  
 		- Magnesium
		- Total phenols
 		- Flavanoids
 		- Nonflavanoid phenols
 		- Proanthocyanins
		- Color intensity
 		- Hue
 		- OD280/OD315 of diluted wines
 		- Proline

    - class:
            - class_0
            - class_1
            - class_2
		
    :Summary Statistics:
    
    ============================= ==== ===== ======= =====
                                   Min   Max   Mean     SD
    ============================= ==== ===== ======= =====
    Alcohol:                      11.0  14.8    13.0   0.8
    Malic Acid:                   0.74  5.80    2.34  1.12
    Ash:                          1.36  3.23    2.36  0.27
    Alcalinity of Ash:            10.6  30.0    19.5   3.3
    Magnesium:                    70.0 162.0    99.7  14.3
    Total Phenols:                0.98  3.88    2.29  0.63
    Flavanoids:                   0.34  5.08    2.03  1.00
    Nonflavanoid Phenols:         0.13  0.66    0.36  0.12
    Proanthocyanins:              0.41  3.58    1.59  0.57
    Colour Intensity:              1.3  13.0     5.1   2.3
    Hue:                          0.48  1.71    0.96  0.23
    OD280/OD315 of diluted wines: 1.27  4.00    2.61  0.71
    Proline:                       278  1680     746   315
    ============================= ==== ===== ======= =====

    :Missing Attribute Values: None
    :Class Distribution: class_0 (59), class_1 (71), class_2 (48)
    :Creator: R.A. Fisher
    :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
    :Date: July, 1988

This is a copy of UCI ML Wine recognition datasets.
https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data

The data is the results of a chemical analysis of wines grown in the same
region in Italy by three different cultivators. There are thirteen different
measurements taken for different constituents found in the three types of
wine.

Original Owners: 

Forina, M. et al, PARVUS - 
An Extendible Package for Data Exploration, Classification and Correlation. 
Institute of Pharmaceutical and Food Analysis and Technologies,
Via Brigata Salerno, 16147 Genoa, Italy.

Citation:

Lichman, M. (2013). UCI Machine Learning Repository
[https://archive.ics.uci.edu/ml]. Irvine, CA: University of California,
School of Information and Computer Science. 

.. topic:: References

  (1) S. Aeberhard, D. Coomans and O. de Vel, 
  Comparison of Classifiers in High Dimensional Settings, 
  Tech. Rep. no. 92-02, (1992), Dept. of Computer Science and Dept. of  
  Mathematics and Statistics, James Cook University of North Queensland. 
  (Also submitted to Technometrics). 

  The data was used with many others for comparing various 
  classifiers. The classes are separable, though only RDA 
  has achieved 100% correct classification. 
  (RDA : 100%, QDA 99.4%, LDA 98.9%, 1NN 96.1% (z-transformed data)) 
  (All results using the leave-one-out technique) 

  (2) S. Aeberhard, D. Coomans and O. de Vel, 
  "THE CLASSIFICATION PERFORMANCE OF RDA" 
  Tech. Rep. no. 92-01, (1992), Dept. of Computer Science and Dept. of 
  Mathematics and Statistics, James Cook University of North Queensland. 
  (Also submitted to Journal of Chemometrics).

----------------------------
特徴量名: ['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline']
----------------------------
特徴量の数: 13
----------------------------
クラス名: ['class_0' 'class_1' 'class_2']
----------------------------
クラスの数: 3
----------------------------
データ数: 178
----------------------------
データの先頭5行:
[[1.423e+01 1.710e+00 2.430e+00 1.560e+01 1.270e+02 2.800e+00 3.060e+00
  2.800e-01 2.290e+00 5.640e+00 1.040e+00 3.920e+00 1.065e+03]
 [1.320e+01 1.780e+00 2.140e+00 1.120e+01 1.000e+02 2.650e+00 2.760e+00
  2.600e-01 1.280e+00 4.380e+00 1.050e+00 3.400e+00 1.050e+03]
 [1.316e+01 2.360e+00 2.670e+00 1.860e+01 1.010e+02 2.800e+00 3.240e+00
  3.000e-01 2.810e+00 5.680e+00 1.030e+00 3.170e+00 1.185e+03]
 [1.437e+01 1.950e+00 2.500e+00 1.680e+01 1.130e+02 3.850e+00 3.490e+00
  2.400e-01 2.180e+00 7.800e+00 8.600e-01 3.450e+00 1.480e+03]
 [1.324e+01 2.590e+00 2.870e+00 2.100e+01 1.180e+02 2.800e+00 2.690e+00
  3.900e-01 1.820e+00 4.320e+00 1.040e+00 2.930e+00 7.350e+02]]
----------------------------
クラスの先頭5行:
[0 0 0 0 0]

和訳します。(Original Owners: / Citation: / .. topic:: Referencesを除きます。)

ワインのデータセットの定義:
----------------------------
データセット名: .. _wine_dataset:

ワイン認識データセット
------------------------

データセットの特性:

:インスタンス数: 178 (3つのクラスそれぞれに50ずつ)
:属性の数: 13個の数値予測属性とクラス
:属性情報:
	- アルコール
	- リンゴ酸
	- 灰
	- 灰のアルカリ度
	- マグネシウム
	- 総フェノール
	- フラボノイド
	- ノンフラボノイドフェノール
	- プロアントシアニン
	- 色の強さ
	- 色相
	- 希釈ワインのOD280 / OD315
	- プロリン

- クラス:
        - クラス_0
        - クラス_1
        - クラス_2
	
:要約統計:

============================= ==== ===== ======= =====
                               最小値 最大値 平均値 標準偏差
============================= ==== ===== ======= =====
アルコール:                      11.0  14.8    13.0   0.8
リンゴ酸:                   0.74  5.80    2.34  1.12
灰:                          1.36  3.23    2.36  0.27
灰のアルカリ度:            10.6  30.0    19.5   3.3
マグネシウム:                    70.0 162.0    99.7  14.3
総フェノール:                0.98  3.88    2.29  0.63
フラボノイド:                   0.34  5.08    2.03  1.00
ノンフラボノイドフェノール:         0.13  0.66    0.36  0.12
プロアントシアニン:              0.41  3.58    1.59  0.57
色の強さ:              1.3  13.0     5.1   2.3
色相:                          0.48  1.71    0.96  0.23
希釈ワインのOD280 / OD315: 1.27  4.00    2.61  0.71
プロリン:                       278  1680     746   315
============================= ==== ===== ======= =====

Missing Attribute Values: None
Class Distribution: class_0 (59), class_1 (71), class_2 (48)
Creator: R.A. Fisher
Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
Date: July, 1988
これはUCI ML Wine recognitionデータセットのコピーです。
https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data

このデータは、同じイタリアの地域で3人の異なる栽培者が育てたワインの化学分析の結果です。
3種類のワインに見つかるさまざまな成分のために、13種類の異なる測定値が取られています。

----------------------------
特徴量名: ['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline']
----------------------------
特徴量の数: 13
----------------------------
クラス名: ['class_0' 'class_1' 'class_2']
----------------------------
クラスの数: 3
----------------------------
データ数: 178
----------------------------
データの先頭5行:
[[1.423e+01 1.710e+00 2.430e+00 1.560e+01 1.270e+02 2.800e+00 3.060e+00
  2.800e-01 2.290e+00 5.640e+00 1.040e+00 3.920e+00 1.065e+03]
 [1.320e+01 1.780e+00 2.140e+00 1.120e+01 1.000e+02 2.650e+00 2.760e+00
  2.600e-01 1.280e+00 4.380e+00 1.050e+00 3.400e+00 1.050e+03]
 [1.316e+01 2.360e+00 2.670e+00 1.860e+01 1.010e+02 2.800e+00 3.240e+00
  3.000e-01 2.810e+00 5.680e+00 1.030e+00 3.170e+00 1.185e+03]
 [1.437e+01 1.950e+00 2.500e+00 1.680e+01 1.130e+02 3.850e+00 3.490e+00
  2.400e-01 2.180e+00 7.800e+00 8.600e-01 3.450e+00 1.480e+03]
 [1.324e+01 2.590e+00 2.870e+00 2.100e+01 1.180e+02 2.800e+00 2.690e+00
  3.900e-01 1.820e+00 4.320e+00 1.040e+00 2.930e+00 7.350e+02]]
----------------------------
クラスの先頭5行:
[0 0 0 0 0]

プログラムの説明

from sklearn.datasets import load_wine

scikit-learnのdatasetsモジュールから、load_wine関数をインポートします。これにより、wineデータセットを読み込むことができます。

wine = load_wine()

load_wine()関数を使って、wineデータセットを読み込み、wineという名前で保存します。

print("ワインのデータセットの定義:")
print("----------------------------")
print("データセット名:", wine['DESCR'])
print("----------------------------")
print("特徴量名:", wine['feature_names'])
print("----------------------------")
print("特徴量の数:", len(wine['feature_names']))
print("----------------------------")
print("クラス名:", wine['target_names'])
print("----------------------------")
print("クラスの数:", len(wine['target_names']))
print("----------------------------")
print("データ数:", len(wine['data']))
print("----------------------------")

print(“データセット名:", wine['DESCR’])は、ワインのデータセットの詳細情報を出力します。
print(“特徴量名:", wine['feature_names’])は、ワインのデータセットの特徴量名を出力します。
print(“特徴量の数:", len(wine['feature_names’]))は、ワインのデータセットの特徴量の数を出力します。
print(“クラス名:", wine['target_names’])は、ワインのデータセットのクラス名を出力します。
print(“クラスの数:", len(wine['target_names’]))は、ワインのデータセットのクラスの数を出力します。
print(“データ数:", len(wine['data’]))は、ワインのデータセットのデータの数を出力します。

print("データの先頭5行:")
print(wine['data'][:5])
print("----------------------------")
print("クラスの先頭5行:")
print(wine['target'][:5])

print(wine['data’][:5])は、ワインのデータセットの最初の5行を出力します。

wine['data’]は、ワインのデータセットから取得したデータの行列を表します。各行が1つのデータポイントであり、各列が13個の特徴量の値を表します。wine['data’][:5]は、最初の5つの行を取得するためのPythonのスライスです。したがって、print(iris['data’][:5])は、最初の5つのデータポイントの特徴量の値を表示します。

print(wine['target’][:5])は、ワインのデータセットのクラスの最初の5行を出力します。

wine['target’]は、ワインのデータセットから取得したクラスラベルを表します。各クラスラベルは、各データポイントに対応しています。wine['target’][:5]は、最初の5つのクラスラベルを取得するためのPythonのスライスです。したがって、print(wine['target’][:5])は、最初の5つのデータポイントのクラスラベルを表示します。

データセットの分布

Pythonプログラミング

「ワインのデータセットの分布」をイメージしやすいようPythonでのプログラミングについても学びます。

プログラム

ワインのデータセットの各特徴量について、3種類のワインの分布をそれぞれヒストグラムで表示します。

from sklearn.datasets import load_wine
import matplotlib.pyplot as plt

# ワインのデータセットをロードする
wine = load_wine()

# 各特徴量ごとにヒストグラムを描画する
for i, feature_name in enumerate(wine.feature_names):
    plt.hist(wine.data[wine.target==0, i], alpha=0.5, label=wine.target_names[0], bins=10)
    plt.hist(wine.data[wine.target==1, i], alpha=0.5, label=wine.target_names[1], bins=10)
    plt.hist(wine.data[wine.target==2, i], alpha=0.5, label=wine.target_names[2], bins=10)
    plt.xlabel(feature_name)
    plt.ylabel("Number of samples")
    plt.legend(loc="best")
    plt.show()

実行結果

プログラムの説明

from sklearn.datasets import load_wine
import matplotlib.pyplot as plt

scikit-learnライブラリからload_wine関数をインポートします。

Matplotlibのpyplotモジュールをインポートし、pltという名前で呼び出します。

# ワインのデータセットをロードする
wine = load_wine()

scikit-learnのdatasetsモジュールから、load_wine関数をインポートします。これにより、wineデータセットを読み込むことができます。

# 各特徴量ごとにヒストグラムを描画する
for i, feature_name in enumerate(wine.feature_names):

ループを開始し、wineの特徴量名を順番に取り出します。iは特徴量のインデックス、feature_nameは特徴量名を表します。

    plt.hist(wine.data[wine.target==0, i], alpha=0.5, label=wine.target_names[0], bins=10)
    plt.hist(wine.data[wine.target==1, i], alpha=0.5, label=wine.target_names[1], bins=10)
    plt.hist(wine.data[wine.target==2, i], alpha=0.5, label=wine.target_names[2], bins=10)

wineのデータから、種類が0のものだけをi番目の特徴量だけを取り出して、ヒストグラムを描画します。alphaはグラフの透明度を指定します。
wineのデータから、種類が1のものだけをi番目の特徴量だけを取り出して、ヒストグラムを描画します。alphaはグラフの透明度を指定します。
wineのデータから、種類が2のものだけをi番目の特徴量だけを取り出して、ヒストグラムを描画します。alphaはグラフの透明度を指定します。

    plt.xlabel(feature_name)
    plt.ylabel("Number of samples")
    plt.legend(loc="best")
    plt.show()

plt.xlabel(feature_name) はx軸ラベルをfeature_nameに設定します。
plt.ylabel(“Number of samples") はy軸ラベルを"Number of samples"に設定します。
plt.legend(loc="best") は凡例をグラフの最適な位置に表示します。
plt.show() は描画したヒストグラムを表示する。ループを回しているため、特徴量ごとに複数のヒストグラムが表示されます。