Iris Data - Maple Help

Iris Data

The Iris data set contains measurements in centimeters for the variables sepal length and width, and petal length and width, for 150 flowers from 3 species of iris, Iris setosa, versicolor, and virginica. The data was collected over several years by Edgar Anderson, who used the data to show that the measurements could be used to differentiate between different species of irises.

The following example discusses techniques for analyzing the Iris data set.

Getting Started

While any command in the package can be referred to using the long form, for example, Statistics:-PCA, it is often easier to load the package and then use the short form command names.

 > restart;
 > with(Statistics):

Importing and summarizing the data

The "Iris" dataset is available in the datasets directory of Maple's data directory. By default, the Import command returns a dataframe object when importing csv files.

 > IrisData := Import("datasets/iris.csv", base = datadir);
 ${\mathrm{DataFrame}}{}\left({{\mathrm{_rtable}}}_{{36893628111713464060}}{,}{\mathrm{rows}}{=}\left[{1}{,}{2}{,}{3}{,}{4}{,}{5}{,}{6}{,}{7}{,}{8}{,}{9}{,}{10}{,}{11}{,}{12}{,}{13}{,}{14}{,}{15}{,}{16}{,}{17}{,}{18}{,}{19}{,}{20}{,}{21}{,}{22}{,}{23}{,}{24}{,}{25}{,}{26}{,}{27}{,}{28}{,}{29}{,}{30}{,}{31}{,}{32}{,}{33}{,}{34}{,}{35}{,}{36}{,}{37}{,}{38}{,}{39}{,}{40}{,}{41}{,}{42}{,}{43}{,}{44}{,}{45}{,}{46}{,}{47}{,}{48}{,}{49}{,}{50}{,}{51}{,}{52}{,}{53}{,}{54}{,}{55}{,}{56}{,}{57}{,}{58}{,}{59}{,}{60}{,}{61}{,}{62}{,}{63}{,}{64}{,}{65}{,}{66}{,}{67}{,}{68}{,}{69}{,}{70}{,}{71}{,}{72}{,}{73}{,}{74}{,}{75}{,}{76}{,}{77}{,}{78}{,}{79}{,}{80}{,}{81}{,}{82}{,}{83}{,}{84}{,}{85}{,}{86}{,}{87}{,}{88}{,}{89}{,}{90}{,}{91}{,}{92}{,}{93}{,}{94}{,}{95}{,}{96}{,}{97}{,}{98}{,}{99}{,}{100}{,}{101}{,}{102}{,}{103}{,}{104}{,}{105}{,}{106}{,}{107}{,}{108}{,}{109}{,}{110}{,}{111}{,}{112}{,}{113}{,}{114}{,}{115}{,}{116}{,}{117}{,}{118}{,}{119}{,}{120}{,}{121}{,}{122}{,}{123}{,}{124}{,}{125}{,}{126}{,}{127}{,}{128}{,}{129}{,}{130}{,}{131}{,}{132}{,}{133}{,}{134}{,}{135}{,}{136}{,}{137}{,}{138}{,}{139}{,}{140}{,}{141}{,}{142}{,}{143}{,}{144}{,}{145}{,}{146}{,}{147}{,}{148}{,}{149}{,}{150}\right]{,}{\mathrm{columns}}{=}\left[{\mathrm{Sepal Length}}{,}{\mathrm{Sepal Width}}{,}{\mathrm{Petal Length}}{,}{\mathrm{Petal Width}}{,}{\mathrm{Species}}\right]\right)$ (1)

The import commands displays a summary of the first 8 rows of the dataset as well as the row and column labels. This dataframe contains 4 columns of floating point data and one column of strings for the plant "Species".

The Describe command prints a brief description for the structure of the imported data:

 > Describe( IrisData );
 IrisData :: DataFrame: 150 observations for 5 variables Sepal Length:  Type: anything  Min: 4.300000  Max: 7.900000 Sepal Width:   Type: anything  Min: 2.000000  Max: 4.400000 Petal Length:  Type: anything  Min: 1.000000  Max: 6.900000 Petal Width:   Type: anything  Min: 0.100000  Max: 2.500000 Species:       Type: anything  Tally: ["versicolor" = 50, "virginica" = 50, "setosa" = 50]

From the dataframe, you can see that the column labels are:

 > CLabels := ColumnLabels( IrisData );
 ${\mathrm{CLabels}}{≔}\left[{\mathrm{Sepal Length}}{,}{\mathrm{Sepal Width}}{,}{\mathrm{Petal Length}}{,}{\mathrm{Petal Width}}{,}{\mathrm{Species}}\right]$ (2)

The DataSummary command shows summary statistics for the numeric columns of the dataset:

 > interface(displayprecision=4):
 > DataSummary( IrisData[ CLabels[1 .. 4] ], summarize = embed ):

 Sepal Length Sepal Width Petal Length Petal Width mean ${5.8433}$ ${3.0573}$ ${3.7580}$ ${1.1993}$ standarddeviation ${0.8281}$ ${0.4359}$ ${1.7653}$ ${0.7622}$ skewness ${0.3107}$ ${0.3147}$ ${-0.2712}$ ${-0.1016}$ kurtosis ${2.4103}$ ${3.1598}$ ${1.5938}$ ${1.6528}$ minimum ${4.3000}$ ${2.0000}$ ${1.0000}$ ${0.1000}$ maximum ${7.9000}$ ${4.4000}$ ${6.9000}$ ${2.5000}$ cumulativeweight ${150.0000}$ ${150.0000}$ ${150.0000}$ ${150.0000}$

To summarize the column of strings, you can list the distinct elements by collapsing the column into a set:

 > convert( IrisData[ Species ], set );
 $\left\{{"setosa"}{,}{"versicolor"}{,}{"virginica"}\right\}$ (3)

Note that DataSummary returns a summary for all rows of the dataframe. The Aggregate command can be used to give aggregate statistics for the three distinct levels (factors) found in the "Species" column. By default, the Aggregate command returns the mean for each factor:

 > Aggregate( IrisData, Species );
 ${\mathrm{DataFrame}}{}\left(\left[\begin{array}{ccccc}5.0060& 3.4280& 1.4620& 0.24600& {"setosa"}\\ 5.9360& 2.7700& 4.2600& 1.3260& {"versicolor"}\\ 6.5880& 2.9740& 5.5520& 2.0260& {"virginica"}\end{array}\right]{,}{\mathrm{rows}}{=}\left[{1}{,}{2}{,}{3}\right]{,}{\mathrm{columns}}{=}\left[{\mathrm{Sepal Length}}{,}{\mathrm{Sepal Width}}{,}{\mathrm{Petal Length}}{,}{\mathrm{Petal Width}}{,}{\mathrm{Species}}\right]\right)$ (4)

Aggregate can return any summary statistic and tally up the number of observations for each factor level:

 > Aggregate( IrisData, Species, function = StandardDeviation, tally );
 ${\mathrm{DataFrame}}{}\left(\left[\begin{array}{cccccc}0.35249& 0.37906& 0.17366& 0.10539& {"setosa"}& 50\\ 0.51617& 0.31380& 0.46991& 0.19775& {"versicolor"}& 50\\ 0.63588& 0.32250& 0.55189& 0.27465& {"virginica"}& 50\end{array}\right]{,}{\mathrm{rows}}{=}\left[{1}{,}{2}{,}{3}\right]{,}{\mathrm{columns}}{=}\left[{\mathrm{Sepal Length}}{,}{\mathrm{Sepal Width}}{,}{\mathrm{Petal Length}}{,}{\mathrm{Petal Width}}{,}{\mathrm{Species}}{,}{\mathrm{Tally}}\right]\right)$ (5)

In order to visually detect patterns between variables, the variables can be plotted against one another using the GridPlot command. Note that for the upper triangle in the grid of plots, the colorscheme option is passed to plots:-pointplot using the valuesplit option. The valuesplit option splits the "Species" column into three levels and colors points accordingly.

 > GridPlot(IrisData[ CLabels[1 .. 4] ],    upper = [plots:-pointplot, colorscheme = ["valuesplit", IrisData[Species]], symbol = solidcircle, symbolsize = 20],    lower = '(x) -> Statistics:-PieChart([" " = abs(x), " " = 1 - abs(x)], color = ["CornflowerBlue", "WhiteSmoke"], title = evalf[3](x), size = [100, 100])',    correlation = [false, true, false], width = 600, widthmode = pixels);
 ${"Tabulate"}$ (6)

 $\mathrm{Sepal Length}$ $\mathrm{Sepal Width}$ $\mathrm{Petal Length}$ $\mathrm{Petal Width}$

In the above grid of plots, the lower triangle contains a series of piecharts that indicate the value for the correlation between corresponding columns. This type of plot is otherwise known as a correlogram and from this, it can be observed that the "Petal Length" and "Petal Width" columns have a high level of correlation.

Performing a principal component analysis on the data

A principal component analysis can be run on the data to determine which variables explain the majority of the variability in the data.

 > IrisPCA := PCA(IrisData[ CLabels[1 .. 4] ], summarize):
 summary:
 Values   proportion of variance  St. Deviation 4.2282     0.9246                 2.0563 0.2427     0.0531                 0.4926 0.0782     0.0171                 0.2797 0.0238     0.0052                 0.1544

The principal component analysis command returns a record, which you can query in order to return the principal components, the rotation matrix, and details on the proportion of variance explained by each component. Note that this can also be seen by using the summarize option as above.

For example, the rotation matrix, or loadings for the components can be returned using the rotation option:

 > IrisPCA:-rotation;
 ${\mathrm{DataFrame}}{}\left(\left[\begin{array}{cccc}0.36139& -0.65659& 0.58203& 0.31549\\ -0.084523& -0.73016& -0.59791& -0.31972\\ 0.85667& 0.17337& -0.076236& -0.47984\\ 0.35829& 0.075481& -0.54583& 0.75366\end{array}\right]{,}{\mathrm{rows}}{=}\left[{\mathrm{Sepal Length}}{,}{\mathrm{Sepal Width}}{,}{\mathrm{Petal Length}}{,}{\mathrm{Petal Width}}\right]{,}{\mathrm{columns}}{=}\left[{1}{,}{2}{,}{3}{,}{4}\right]{,}{\mathrm{datatypes}}{=}\left[{{\mathrm{float}}}_{{8}}{,}{{\mathrm{float}}}_{{8}}{,}{{\mathrm{float}}}_{{8}}{,}{{\mathrm{float}}}_{{8}}\right]\right)$ (7)

A ScreePlot is useful in visualizing the variance explained by each component:

 > ScreePlot( IrisPCA );

From the ScreePlot, it can be seen that the first component accounts for 92.46% of the variance. The second component accounts for a much smaller fraction of the total variance, suggesting that only one component may be enough to summarize the data.

A Biplot can also be used to show the first two components and the observations on the same diagram. The first principal component is plotted on the x-axis and the second on the y-axis.

 > Biplot(IrisPCA, colorscheme = ["valuesplit", IrisData[ Species ] ]);
 >

From the Biplot, it can be observed that petal width and length are highly correlated and their variability can be primarily attributed to the first component. Likewise, the first component also explains a large part of the Sepal length. The variability in Sepal width is more attributed to the second component.

 References The data were collected by Anderson, Edgar (1935). The irises of the Gaspé Peninsula, Bulletin of the American Iris Society. 59: 2-5.