分類問題のデータセット

# 概要
機械学習の最初の一歩に，irisデータセットを用いたアヤメの分類問題があります．このアヤメのデータセットは，入手のしやすさと扱いやすさで知られています．本記事では，irisデータセットのように初心者にも扱いやすい表形式のデータを使用し，3つ以上のクラスを識別する分類問題に焦点を当てたデータセットを紹介します．基本的にUCIの機械学習リポジトリから容易にダウンロード可能なデータセットです．

**【基本方針】**
* 表形式のデータ
* 特徴量が多くても10程度
* カテゴリーデータはできるだけ少ない．利用しなくても分析できる．
* 分類数は3〜9程度（２値分類は除く）


# 1. Land Mine (地雷の分類)
地雷の種類をセンサーの値で見分ける問題．

### 基本情報
https://archive.ics.uci.edu/dataset/763/land+mines-1

* 地雷の種類 (5分類)
* データの数：338
* 特徴量の数: 3

ダウンロードするとxlsとcsvファイルが表示されます．csvファイル名はMine_Dataset.csvとなります．


~~~python
data = pd.read_csv("../LandMine/Mine_Dataset.csv")
print(data.sample(5))
#       	V 	     H 	        S 	    M
# 135 	0.350453 	0.727273 	1.0 	3
# 199 	0.347432 	0.545455 	0.2 	5
# 179 	0.329305 	0.727273 	1.0 	4
# 319 	0.320241 	0.909091 	0.0 	5
# 59 	0.655588 	0.545455 	0.6 	2
~~~

### 特徴量の簡単な紹介
* V：センサーの出力電圧
* H：センサーから地面までの距離（高さ）
* S：土壌のタイプ６種類を０から１に変換したもの
* M：地雷のタイプ５種類（分類するもの）

:::note
各クラスの要素数
class 1： 71
class 2： 70
class 3： 66
class 4： 66
class 5： 65
:::



# 2. Abalone (アワビの年齢分類)
アワビのリングを利用した年齢の分類．

### 基本情報
https://archive.ics.uci.edu/dataset/1/abalone
* データ数：4177
* 特徴量の数: 8
* カテゴリーデータ：1
* 分類数：リングを３種類にまとめる


ダウンロードされたファイルを展開すると，abalone.dataやabalone.namesなどが表示されます．
* abalone.data：データ本体のcsvファイル
* abalone.names：データの説明のファイル

~~~python
import pandas as pd
col = ["Sex", "Length","Diameter","Height","Whole weight","Shucked weight","Viscera weight","Shell weight","Rings"]    
data = pd.read_csv("./abalone/abalone.data", names=col)
print(data.head())

#      Sex  Length Diameter Height  Whole weight 	Shucked weight 	Viscera weight 	Shell weight 	Rings
# 0 	M 	0.455 	0.365 	  0.095 	0.5140 	     0.2245     	0.1010 	        0.150            15
# 1 	M 	0.350 	0.265 	  0.090 	0.2255 	     0.0995 	    0.0485 	        0.070 	          7
# 2 	F 	0.530 	0.420 	  0.135 	0.6770 	     0.2565 	    0.1415 	        0.210 	          9
# 3 	M 	0.440 	0.365 	  0.125 	0.5160 	     0.2155 	    0.1140 	        0.155 	         10
# 4 	I 	0.330 	0.255 	  0.080 	0.2050 	     0.0895         0.0395 	        0.055 	          7
~~~

### 特徴量の簡単な紹介
1. Sex: 性別．M，F，I（幼児）
2. Length：全長
3. Diameter：直径
4. Height：高さ
5. Whole weight：全重量
6. Shucked weight：殻付き重量
7. Viscera weight：内臓重量
8. Shell Weight：殻重量
9. Rings：リングの値　１〜29まで（分類の対象）


abalone.namesでは，Rings(年齢)を３種類のクラスに分けて紹介しています[^1]．

:::note 
3分類の例
* class 1：Rings 1〜8．1407個
* class 2：Rings 9〜10．1323個
* class 3：Rings 11〜29．1447個
:::



# 3. Palmer Penguins (ペンギンの分類)
ペンギンの種類に関するデータセット．seabornのload_dataset()を利用することでpythonでも簡単に利用できます．

### 基本情報
https://allisonhorst.github.io/palmerpenguins/
* ペンギンの種類：3種類
* データの数：344
* 特徴量の数: 6
* カテゴリーデータ：2

seabornを利用してダウンロードされるファイル名は，penguins.csvとなり，sns.get_data_home()でダウンロードされたcsvファイルの保存先が表示されます．データセットの中にNaNがいくつかあります．

~~~python
import seaborn as sns
data = sns.load_dataset("penguins")
print(data.head())

#   	species island     bill_length_mm  	bill_depth_mm 	flipper_length_mm 	body_mass_g 	sex
# 0 	Adelie 	Torgersen 	39.1     	      18.7 	        181.0 	            3750.0 	        Male
# 1 	Adelie 	Torgersen 	39.5 	          17.4 	        186.0 	            3800.0 	        Female
# 2 	Adelie 	Torgersen 	40.3 	          18.0 	        195.0 	            3250.0 	        Female
# 3 	Adelie 	Torgersen 	NaN 	          NaN 	        NaN 	            NaN 	        NaN
# 4 	Adelie 	Torgersen 	36.7 	          19.3 	        193.0 	            3450.0 	        Female
~~~

### 特徴量の簡単な紹介

1. species: ペンギンの種類 3種類
2. island: 生息場所
2. bill_length: くちばしの長さ
3. bill_depth: くちばしの奥行き
4. flipper_length: ヒレの長さ
5. body_mass: 体重
6. sex: 性別
* 細かい内容は，[公式のページ](https://allisonhorst.github.io/palmerpenguins/)にイラスト付きで紹介されています．

:::note
NaNの情報を削除していない状態での分類数の内訳
* Adelie       ：152
* Gentoo       ：124
* Chinstrap     ：68
:::


# 4. Wine (ワイン品種分類)
イタリアの同じ地域で栽培された異なる３品種の分類

### 基本情報
https://archive.ics.uci.edu/dataset/109/wine

* ワインの品種クラス分類 (3種類)
* データの数：178
* 特徴量の数: 13

3種類のワインそれぞれに含まれる13の成分の量を特徴量としています．ダウンロードされるファイルは，wine.data，wine.namesなどとなります．データのファイルには列名が記載されていないので，列の呼称を付してデータを表示してみます．
* wine.names：データの詳細が記述されているファイル
* wine.data：データ本体．csvファイル

~~~python
col = ["class","Alcohol","Malic acid","Ash","Alcalinity of ash","Magnesium","Total phenols","Flavanoids","Nonflavanoid phenols","Proanthocyanins","Color intensity","Hue", "OD diluted wines", "Proline" ]
data = pd.read_csv("./wine/wine.data", names=col)
print(data.sample(5))

#  	  class	Alcohol	Malic acid 	Ash 	Alcalinity of ash 	Magnesium 	Total phenols 	Flavanoids 	Nonflavanoid phenols 	Proanthocyanins 	Color intensity 	Hue 	OD diluted wines 	Proline
# 4 	1 	13.24 	2.59 	2.87 	21.0 	118 	2.80 	2.69 	0.39 	1.82 	4.32 	1.04 	2.93 	735
# 59 	2 	12.37 	0.94 	1.36 	10.6 	88 	    1.98 	0.57 	0.28 	0.42 	1.95 	1.05 	1.82 	520
# 144 	3 	12.25 	3.88 	2.20 	18.5 	112 	1.38 	0.78 	0.29 	1.14 	8.21 	0.65 	2.00 	855
# 141 	3 	13.36 	2.56 	2.35 	20.0 	89 	    1.40 	0.50 	0.37 	0.64 	5.60 	0.70 	2.47 	780
# 119 	2 	12.00 	3.43 	2.00 	19.0 	87 	    2.00 	1.64 	0.37 	1.87 	1.28 	0.93 	3.05 	564
~~~

### 特徴量の簡単な紹介
1. class：品種
2. Alcohol：アルコール                          
3. Malic acid：リンゴ酸
4. Ash：灰分
5. Alcalinity of ash：灰分アルカリ度  
6. Magnesium：マグネシウム
7. Total phenols：総フェノール
8. Flavanoids：フラバノイド
9. Nonflavanoid phenols：非フラバノイドフェノール
10. Proanthocyanins：プロアントシアニン
11. Color intensity：色の濃さ
12. Hue：色相
13. OD280/OD315 of diluted wines：希釈したワインのOD280/OD315
14. Proline：プロリン

        



:::note
品種の内訳
* class 1 ：59
* class 2 ：71
* class 3 ：48
:::

# 5. Wine Quality (ワイン品質分類)
ワイン品種分類と似ていますが異なるデータセットです．ワインの品質に焦点を当てたもので赤ワインと白ワインの２種類用意されています．

### 基本情報
https://archive.ics.uci.edu/dataset/186/wine+quality


* 分類クラスごとの要素数が大きく異なる不均衡なデータセット
* ダウンロードされるデータファイルは，winequality-red.csv，winequality-white.csv，winequality.namesなどとなります．


## 5.1 赤ワイン
* データの数：1600
* 特徴量の数: 11
* 赤：品質６種類
* 品質は０から10の11段階用意されていますが，実際は３〜８の値(６種類)に収まっています．
* winequality-red.csv：データのファイル．区切り記号がセミコロン「 ; 」なので，pandasで読み込むときに，`sep=";"`を利用します．

~~~python
data = pd.read_csv("./wine_quality/winequality-red.csv", sep=";")
print(data.head())

#   fixed acidity 	volatile acidity 	citric acid 	residual sugar 	chlorides 	free sulfur dioxide 	total sulfur dioxide 	density 	pH 	sulphates 	alcohol 	quality
# 0 	7.4 	0.70 	0.00 	1.9 	0.076 	11.0 	34.0 	0.9978 	3.51 	0.56 	9.4 	5
# 1 	7.8 	0.88 	0.00 	2.6 	0.098 	25.0 	67.0 	0.9968 	3.20 	0.68 	9.8 	5
# 2 	7.8 	0.76 	0.04 	2.3 	0.092 	15.0 	54.0 	0.9970 	3.26 	0.65 	9.8 	5
# 3 	11.2 	0.28 	0.56 	1.9 	0.075 	17.0 	60.0 	0.9980 	3.16 	0.58 	9.8 	6
# 4 	7.4 	0.70 	0.00 	1.9 	0.076 	11.0 	34.0 	0.9978 	3.51 	0.56 	9.4 	5
~~~

### 特徴量の簡単な紹介 

1. fixed acidity：固定酸度       
2. volatileacidity：揮発性酸度
3. citricacid：クエン酸
4. residualsugar：残留糖分
5. chlorides：塩化物
6. freesulfurdioxide：遊離二酸化硫黄
7. totalsulfurdioxide：全二酸化硫黄
8. density：濃度
9. pH：pH
10. sulphates：硫酸塩
11. alcohol：アルコール
12. quality(scorebetween0and10)：品質（0～10点．分類の対象）


:::note
品質ごとのデータ数
* 品質3     ：10
* 品質4     ：53
* 品質5    ：681
* 品質6    ：638
* 品質7    ：199
* 品質8     ：18
:::
圧倒的に品質５と品質６が多い！

## 5.2 白ワイン
* データの数：4899
* 特徴量の数: 11
* 白：品質７種類
* 品質は０から10の11段階ですが，３〜９の値（７種類）に収まっています．
* winequality-white.csv：データファイル．区切り記号がセミコロン「 ; 」．

~~~python
data = pd.read_csv("./wine_quality/winequality-white.csv", sep=";")
print(data.head())

#  	fixed acidity 	volatile acidity 	citric acid 	residual sugar 	chlorides 	free sulfur dioxide 	total sulfur dioxide 	density 	pH 	sulphates 	alcohol 	quality
# 0 	7.0 	0.27 	0.36 	20.7 	0.045 	45.0 	170.0 	1.0010 	3.00 	0.45 	8.8 	6
# 1 	6.3 	0.30 	0.34 	1.6 	0.049 	14.0 	132.0 	0.9940 	3.30 	0.49 	9.5 	6
# 2 	8.1 	0.28 	0.40 	6.9 	0.050 	30.0 	97.0 	0.9951 	3.26 	0.44 	10.1 	6
# 3 	7.2 	0.23 	0.32 	8.5 	0.058 	47.0 	186.0 	0.9956 	3.19 	0.40 	9.9 	6
# 4 	7.2 	0.23 	0.32 	8.5 	0.058 	47.0 	186.0 	0.9956 	3.19 	0.40 	9.9 	6
~~~

:::note
品質ごとのデータ数
* 品質3      ：20
* 品質4     ：163
* 品質5    ：1457
* 品質6    ：2198
* 品質7     ：880
* 品質8     ：175
* 品質9       ：5
:::
白ワインも圧倒的に品質５と品質６が多い！


# 6. Glass Identification（ガラスの分類）
ガラスの用途で分類したデータセット．フロートガラス（透明ガラス）とノン・フロートガラスによる２分類や窓ガラス，車のガラス，それ以外の３分類などいくつかのクラスに分けて利用することもできます．

### 基本情報
https://archive.ics.uci.edu/dataset/42/glass+identification
* データ数: 214
* ガラスの種類の分類（６種類）
* 特徴量の数: 9

~~~python
col = ["ID","RI","Na","Mg","Al","Si","K","Ca","Ba","Fe","class"]
data = pd.read_csv("../GlassIdentification/glass.data", names=col)
print(data.head())

# ID 	RI 	Na 	Mg 	Al 	Si 	K 	Ca 	Ba 	Fe 	class
# 0 	1 	1.52101 	13.64 	4.49 	1.10 	71.78 	0.06 	8.75 	0.0 	0.0 	1
# 1 	2 	1.51761 	13.89 	3.60 	1.36 	72.73 	0.48 	7.83 	0.0 	0.0 	1
# 2 	3 	1.51618 	13.53 	3.55 	1.54 	72.99 	0.39 	7.78 	0.0 	0.0 	1
# 3 	4 	1.51766 	13.21 	3.69 	1.29 	72.61 	0.57 	8.22 	0.0 	0.0 	1
# 4 	5 	1.51742 	13.27 	3.62 	1.24 	73.08 	0.55 	8.07 	0.0 	0.0 	1
~~~

### 特徴量の簡単な紹介
 1 . ID：ID番号
 2 . RI：屈折率             
 3 . Na：ナトリウム         
 4 . Mg：マグネシウム       
 5 . Al：アルミニウム       
 6 . Si：ケイ素             
 7 . K：カリウム           
 8 . Ca：カルシウム         
 9 . Ba：バリウム           
10 . Fe：鉄                    
11 . class：クラス

:::note
ガラスの種類 
class 1:　70
class 2:　76
class 3:　17
class 5:　13
class 6:　9
class 7:　29
:::
このデータセットにはclass 4に該当するデータが存在しないようです．






# 7. Seeds （小麦の種の分類）
3つの異なる小麦品種の穀粒の幾何学的特性の測定したデータセット．

### 基本情報
https://archive.ics.uci.edu/dataset/236/seeds

* 分類数：３
* データ数：210 (70x3)
* 特徴量の数：7
* seeds_dataset.txt：データファイル．空白「　」が区切り記号なので`sep="\s+"`を利用します．

~~~python
col = ["Area","Perimeter","Compactness","Length","Width","Aym_coeff","groove","class"]
data = pd.read_csv("../Seeds/seeds_dataset.txt", sep="\s+", names=col)
print(data.sample(5))

#    	Area    Perimeter  Compactness 	Length 	Width 	Aym_coeff 	groove 	class
# 145 	11.21 	13.13 	    0.8167     5.279 	2.687 	6.169 	   5.275 	3
# 94 	18.36 	16.52 	    0.8452 	   6.666 	3.485 	4.933      6.448 	2
# 107 	17.63 	15.86 	    0.8800 	   6.033 	3.573 	3.747 	   5.929 	2
# 204 	12.37 	13.47 	    0.8567 	   5.204 	2.960 	3.919 	   5.001 	3
# 57 	14.92 	14.43 	    0.9006 	   5.384 	3.412 	1.142 	   5.088 	1
~~~

### 特徴量の簡単な紹介
1. area       ：面積A             
2. perimeter  ：外周P             
3. compactness：コンパクト度 $C = (4\pi A)/P^2$
4. length	   ：カーネルの長さ    
5. width	   ：カーネルの幅      
6. asy_coeff  ：非対称係数        
7. groove     ：カーネルの溝の長さ        
8. class：クラス（品種）

:::note
クラスの内訳
class 1：70
class 2：70
class 3：70
:::



# 8. Ecoli (Protein Localization Sites Dataset)
タンパク質の局在サイトデータセット．タンパク質が細胞内や細胞間でのどの場所に位置しているのかを示したデータらしい[^2]．クラスごとの要素数にかなりの偏りがあります．

### 基本情報
https://archive.ics.uci.edu/dataset/39/ecoli
* データ数：336
* 特徴量の数：8
* カテゴリーデータ:1
* ecoli.data: データファイル．区切り記号が「　」．pandasで読み込むときに，`sep="\s+"`を利用します．

~~~python
col = ["SequenceName","mcg","gvh","lip","chg","aac","alm1","alm2","class"]
data = pd.read_csv("../Ecoli/ecoli.data", sep="\s+", names=col)
print(data.head())

# 	SequenceName  mcg 	gvh 	lip 	chg 	aac 	alm1 	alm2 	class
#0 	AAT_ECOLI 	  0.49 	0.29 	0.48 	0.5 	0.56 	0.24 	0.35 	cp
#1 	ACEA_ECOLI 	  0.07 	0.40 	0.48 	0.5 	0.54 	0.35 	0.44 	cp
#2 	ACEK_ECOLI 	  0.56 	0.40 	0.48 	0.5 	0.49 	0.37 	0.46 	cp
#3 	ACKA_ECOLI 	  0.59 	0.49 	0.48 	0.5 	0.52 	0.45 	0.36 	cp
#4 	ADI_ECOLI 	  0.23 	0.32 	0.48 	0.5 	0.55 	0.25 	0.35 	cp
~~~

### 特徴量の簡単な紹介

1. SequenceName：配列名 SWISS-PROTデータベース名称
2. mcg： McGeochのシグナル配列認識法
3. gvh：von Heijneのシグナル配列認識法
4. lip：von HeijneのシグナルペプチダーゼIIのコンセンサス配列スコア 
5. chg： 予測されるリポタンパク質のN末端の電荷の有無
6. aac: 外膜タンパク質とペリプラズムタンパク質のアミノ酸含量の判別分析のスコア
7. alm1: ALOM膜領域予測プログラムのスコア
8. alm2：配列から切断可能なシグナル領域を除いた後のALOMプログラムのスコア
9. class：クラス（分類対象）



:::note
クラスの内訳
cp：     143
im：      77
pp：      52
imU：     35
om：      20
omL：      5
imS：      2
imL：      2
:::

# 9. Thyrioid Disease
甲状腺ホルモンに関するデータセット．甲状腺ホルモンの分泌量によって３種類に分類しています[^3]．

### 基本情報
https://archive.ics.uci.edu/dataset/102/thyroid+disease

* データ数：215
* 特徴量の数: 5
* 分類数：3
* ファイルをダウンロードすると，たくさんのファイルが表示されます．今回紹介するのは次の２種類となります．
    * new-thyroid.data
    * new-thyrioid.names

---
~~~python
col = ["class","T3","thyroxin","triiodothyronine","TSH","AD_TSH"]
data = pd.read_csv("../ThyrioidDisease/new-thyroid.data", names=col)
print(data.head())

# 	 class 	T3 	thyroxin 	triiodothyronine   TSH 	 AD_TSH
# 0 	1 	107 	10.1 	  2.2 	           0.9    2.7
# 1 	1 	113 	9.9 	  3.1 	           2.0    5.9
# 2 	1 	127 	12.9 	  2.4 	           1.4 	  0.6
# 3 	1 	109 	5.3 	  1.6 	           1.4 	  1.5
# 4 	1 	105 	7.3 	  1.5 	           1.5 	 -0.1
~~~

### 特徴の簡単な紹介
1. class             ：クラス（3種類）
2. T3				 ：T3-レジン取り込み試験
3. thyroxin			 ：同位体置換法で測定した血清総サイロキシン
4. triiodothyronine	 ：ラジオイムノ法で測定した血清トリヨードサイロニン総量
5. TSH				 ：基礎甲状腺刺激ホルモン（TSH)
6. AD_TSH			 ：200マイクログラムのサイロトロピン放出ホルモンを注射した後のTSH値の基礎値に対する最大絶対差

:::note
クラスの内訳
class 1（正常）:　150
class 2（過多）:　35
class 3（不足）:　30
:::





# 注
[^1]: Rings 1〜8までの要素数は，`sum((data["Rings"]>=1)&(data["Rings"]<=8))`で数えられます．
[^2]: 未知の分野なので訳に誤りがある可能性があります．正しい情報を確認してください:bow:．
[^3]: 特徴量の内容を含めて
無知な部分ですので，やはり正しい情報を確認してください:bow::bow:．