categorical 配列の利点
categorical データの自然表現
categorical
は、離散カテゴリの有限集合からの値をもつデータを格納するためのデータ型です。categorical 配列の代わりによく使用される方法の 1 つとして、文字配列または文字ベクトルの cell 配列を使用する方法があります。文字配列の値と文字ベクトルの cell 配列を比較するには、strcmp
を使用しなければなりませんが、煩雑な場合があります。categorical 配列を利用すれば、論理演算子 eq
(==
) を使用して、数値配列を比較するのと同じように要素を比較することができます。categorical 配列の代わりによく使用されるもう 1 つの方法は、数値配列で整数を使用して categorical データを保存する方法です。数値配列を使用すると、有用なすべての説明情報がカテゴリ名から失われるだけでなく、整数値が categorical データの場合にはもたないような通常の数値的意味をもっているように受け止められる傾向があります。
文字ベクトルの数学的な順序
categorical 配列は、離散カテゴリの有限集合からの値をもつ非数値データに使用できる、メモリ効率に優れた便利なコンテナーです。これらは、特に、カテゴリに意味のある数学的な順序が付けられている場合、たとえば、small < medium < large
であるカテゴリの離散集合 {'small','medium','large'}
からの要素をもつ配列などでは便利です。
文字配列または文字ベクトルの cell 配列ではアルファベット順以外の順序付けは使用できません。そのため、「より大きい」や「より小さい」などの不等号による比較はできません。categorical 配列を利用すれば、関係演算を使用して等価性をテストし、意味のある数学的な順序が付けられている要素単位の比較を実行することができます。
必要なメモリの削減
この例では、データを文字ベクトルの cell 配列として格納する場合と categorical 配列として格納する場合に必要なメモリを比較する方法を説明します。categorical 配列のカテゴリは文字ベクトルとして定義されるため、文字ベクトルの cell 配列や配列 char
で格納や操作を行うには多大なコストがかかる場合があります。categorical 配列には各カテゴリ名のコピーが 1 つだけ格納されるので、多くの場合、配列を格納するために必要なメモリ量を削減することができます。
文字ベクトルの cell 配列のサンプルを作成します。
state = [repmat({'MA'},25,1);repmat({'NY'},25,1);... repmat({'CA'},50,1);... repmat({'MA'},25,1);repmat({'NY'},25,1)];
変数 state
に関する情報を表示します。
whos state
Name Size Bytes Class Attributes state 150x1 16200 cell
変数 state
は文字ベクトルの cell 配列で、メモリが 17,400 バイト必要です。
state
を categorical 配列に変換します。
state = categorical(state);
変数 state
の離散カテゴリを表示します。
categories(state)
ans = 3x1 cell
{'CA'}
{'MA'}
{'NY'}
state
には 150 個の要素が含まれていますが、カテゴリは 3 つだけです。
変数 state
に関する情報を表示します。
whos state
Name Size Bytes Class Attributes state 150x1 476 categorical
変数の格納に必要なメモリは大幅に減少しています。