データサイエンス全般

Irisデータセット

Irisデータセットとは

Irisデータセットは、データサイエンスの世界でもっとも有名なデータセットのひとつです。

統計学に多大な功績を残したロナルド・エイルマー・フィッシャー(Ronald Aylmer Fisher)が論文で使用したデータセットであることから、フィッシャーのIrisデータセット(Fisher’s Iris Dataset)と呼ばれることもあります。

Irisは日本語で「アヤメ」と呼ばれる花です。生物分類として科・属・種がありますが、日本で単に「アヤメ」といった場合は、通常アヤメ科アヤメ属アヤメを指します。[1]アヤメ科アヤメ属の中で、他に日本で有名な花としては、カキツバタやハナショウブなどがあります。

Irisデータセットでは、アヤメ科アヤメ属の中でsetosa、versicolor、virginicaという3種の花に着目しています。

setosa、versicolor、virginicaは、素人にはほとんど同じような花に見えます。しかしがく片(sepal)の長さ、幅、および花弁(petal)の長さ、幅を測定、分析することによって、それらを区別するための特徴が見えてきます。setosa、versicolor、virginicaそれぞれ、50個体について測定しています。

下記がそのデータセットです。一部を抜き出していますが、全部で150行5列あります。

Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5 3.6 1.4 0.2 setosa
5.4 3.9 1.7 0.4 setosa
7 3.2 4.7 1.4 versicolor
6.4 3.2 4.5 1.5 versicolor
6.9 3.1 4.9 1.5 versicolor
5.5 2.3 4 1.3 versicolor
6.5 2.8 4.6 1.5 versicolor
5.7 2.8 4.5 1.3 versicolor
6.3 3.3 6 2.5 virginica
5.8 2.7 5.1 1.9 virginica
7.1 3 5.9 2.1 virginica
6.3 2.9 5.6 1.8 virginica
6.5 3 5.8 2.2 virginica
7.6 3 6.6 2.1 virginica

各列の説明

繰り返しになりますが、各列の説明は下記です。

列名 説明
Sepal.Length がく片の長さ [cm]
Sepal.Width がく片の幅 [cm]
Petal.Length 花弁の長さ [cm]
Petal.Width 花弁の幅 [cm]
Species 花の種類
(setosa、versicolor、virginicaの3種)

Irisデータセットの読み込み

Irisデータセットを読み込み、dfという名前の変数に代入します。

Rでは標準的に、irisという名前のデータフレームが用意(プリセット)されています。

df <- iris

Pythonではいくつか方法がありますが、ここではライブラリSeabornから読み込む方法をご紹介します[2]ライブラリscikit-learnから読み込む方法もあります。

import seaborn as sns
df = sns.load_dataset('iris')

SeabornのIrisデータセットは、Pandasのデータフレーム(Pandas.DataFrame)として用意されています。Rのデータセットと比べると、列名の大文字が小文字になったり、ピリオド(.)がアンダーバー(_)になったりという若干の差異はあります。

Irisデータセットのデータ型

各列のデータ型(data type)を調べます。

Rでは、str関数[3]str関数のstrはstring(文字列)ではなく、structure(構造)の略です。を使用します。

str(df)
'data.frame': 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Sepal.Length~Sepal.Lengthはnumeric型(数値型)、Speciesはfactor型(因子型)[4]Rでは、質的変数をcharacter型として扱う方法(流儀)もあります。です。

Pythonでは、Pandas.DataFrameのdtypes属性を確認します。

df.dtypes
sepal_length float64 sepal_width float64 petal_length float64 petal_width float64 species object dtype: object

sepal_length~petal_widthはfloat64型(倍精度浮動小数点型)、speciesはobject型(オブジェクト型)[5]Pythonでは、質的変数をcategory型として扱う方法(流儀)もあります。です。

Irisデータセットの要約統計量

各列の要約統計量を確認します。

Rでは、summary関数を使用します。

summary(df)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50 Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50 Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800 Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500

Sepal.Length~Petal.Widthは中央値(Median)を含む四分位数(1st Qu.、Median、3rd Qu.)と平均値(Mean)、最小値(Min.)、最大値(Max.)が、Speciesは各階級(クラス)の度数が表示されています。

setosa、versicolor、virginicaはそれぞれ、50行ずつあることが確認できます。

Pythonでは、pandas.DataFrameのdescribeメソッドを使用します。

df.describe()
sepal_length sepal_width petal_length petal_width count 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.057333 3.758000 1.199333 std 0.828066 0.435866 1.765298 0.762238 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

sepal_length~petal_widthは中央値(50%)を含む四分位数(25%、50%、75%)と平均値(mean)、標準偏差(std)、最小値(min)、最大値(max)および欠損値を除く個数(count)が表示されています。

Irisデータセットの散布図行列

Irisデータセットの散布図行列(pairplot)[6]列同士をペアにして、すべてのペアで散布図を並べたもの。を描きます。

Rではいくつか方法がありますが、ここではライブラリGGallyのggpairs関数を使用します。[7]体裁のためにコードが長くなっていますが、ggpairs(df)だけでデフォルトの散布図行列を、ggpairs(df, mapping = aes(colour = … Continue reading

library(GGally)
# 散布図行列
ggpairs(df,
    columns = 1:4,
    mapping = aes(fill = Species, colour = Species),
    upper = list(continuous = wrap('points', alpha = 0.5)),
    diag = list(continuous = wrap('densityDiag', alpha = 0.5)),
    lower = list(continuous = wrap('points', alpha = 0.5)),
    legend = 2) +
theme(legend.position = 'bottom')

Pythonではいくつか方法がありますが、ここではライブラリSeabornのpairplotメソッドを使用します。[8]体裁のためにコードが長くなっていますが、sns.pairplot(df)だけでデフォルトの散布図行列を、sns.pairplot(df, hue = … Continue reading

import seaborn as sns
# 散布図行列
g = sns.pairplot(df, hue = 'species')
g._legend.remove()
g.fig.legend(
    handles = g._legend_data.values(),
    labels = g._legend_data.keys(),
    loc = 'lower center', ncol = 3,
    title = 'species')
g.fig.subplots_adjust(bottom = 0.12)

RとPythonどちらの図を見ても同じですが、setosaはPetal.Length(petal_length)またはPetal.Width(petal_width)の1変数だけを使って、容易に判別可能なことがわかります。

versicolorとvirginicaは点が重なっている部分があり、精度100%の分類は難しそうです。しかしPetal.LengthやPetal.Widthの値が大きくなるほど、virginicaの割合が大きくなるという、およその傾向は読み取ることができます。

脚注

脚注
1 アヤメ科アヤメ属の中で、他に日本で有名な花としては、カキツバタやハナショウブなどがあります。
2 ライブラリscikit-learnから読み込む方法もあります。
3 str関数のstrはstring(文字列)ではなく、structure(構造)の略です。
4 Rでは、質的変数をcharacter型として扱う方法(流儀)もあります。
5 Pythonでは、質的変数をcategory型として扱う方法(流儀)もあります。
6 列同士をペアにして、すべてのペアで散布図を並べたもの。
7 体裁のためにコードが長くなっていますが、ggpairs(df)だけでデフォルトの散布図行列を、ggpairs(df, mapping = aes(colour = Species))だけで色分けした散布図行列を描くことが可能です。
8 体裁のためにコードが長くなっていますが、sns.pairplot(df)だけでデフォルトの散布図行列を、sns.pairplot(df, hue = 'species')だけで色分けした散布図行列を描くことが可能です。
タイトルとURLをコピーしました