メインコンテンツ

categorical 配列の作成

この例では、さまざまなタイプの入力データから categorical 配列を作成し、それらの要素を変更する方法を示します。categorical データ型は、離散カテゴリの有限集合からの値を格納します。数値配列、logical 配列、string 配列、または文字ベクトルの cell 配列から categorical 配列を作成することができます。入力配列からの一意の値が categorical 配列のカテゴリになります。categorical 配列は、データを効率的に格納して操作するのに適しています。また、値のわかりやすい名前を維持することもできます。

既定では、categorical 配列のカテゴリに数学的な順序はありません。たとえば、ペットのカテゴリの離散集合 ["dog" "cat" "bird"] には、意味のある数学的な順序が付けられていないので、MATLAB® はアルファベット順 ["bird" "cat" "dog"] を使用します。ただし、カテゴリに意味のある数学的な順序を付けた順序 categorical 配列も作成できます。たとえば、サイズのカテゴリの離散集合 ["small" "medium" "large"] には small < medium < large という数学的な順序を付けることができます。順序 categorical 配列により、それらの要素間の比較が可能になります。

入力配列からの categorical 配列の作成

入力配列から categorical 配列を作成するには、関数 categorical を使用します。

たとえば、ニュー イングランド地域のすべての州を要素とする string 配列を作成します。一部の string の先頭や末尾に空白があることに注意してください。

statesNE = ["MA" "ME" " CT" "VT" " ME " "NH" "VT" "MA" "NH" "CT" "RI "]
statesNE = 1×11 string
    "MA"    "ME"    " CT"    "VT"    " ME "    "NH"    "VT"    "MA"    "NH"    "CT"    "RI "

string 配列を categorical 配列に変換します。string 配列 (または文字ベクトルの cell 配列) から categorical 配列を作成する場合、先頭と末尾の空白が削除されます。

statesNE = categorical(statesNE)
statesNE = 1×11 categorical
     MA      ME      CT      VT      ME      NH      VT      MA      NH      CT      RI 

関数 categories を使用して statesNE のカテゴリを一覧表示します。statesNE の各要素は、これらのカテゴリのいずれかに属します。statesNE には一意の州が 6 つあるため、カテゴリは 6 つになります。州の省略形に数学的な順序はないため、カテゴリはアルファベット順に並べられています。

categories(statesNE)
ans = 6×1 cell
    {'CT'}
    {'MA'}
    {'ME'}
    {'NH'}
    {'RI'}
    {'VT'}

要素の追加と変更

categorical 配列に 1 つの要素を追加するには、カテゴリ名を表すテキストを代入できます。たとえば、statesNE に州を追加します。

statesNE(12) = "ME"
statesNE = 1×12 categorical
     MA      ME      CT      VT      ME      NH      VT      MA      NH      CT      RI      ME 

複数の要素を追加または変更するには、categorical 配列を代入する必要があります。

statesNE(1:3) = categorical(["RI" "VT" "MA"])
statesNE = 1×12 categorical
     RI      VT      MA      VT      ME      NH      VT      MA      NH      CT      RI      ME 

未定義の要素としての欠損値の追加

categorical 配列の未定義の要素として欠損値を代入できます。未定義の categorical 値はいずれのカテゴリにも属しません。これは、数値配列の NaN (Not-a-Number) に似ています。

欠損値を代入するには、関数 missing を使用します。たとえば、categorical 配列の最初の要素を欠損値になるように変更します。

statesNE(1) = missing
statesNE = 1×12 categorical
     <undefined>      VT      MA      VT      ME      NH      VT      MA      NH      CT      RI      ME 

categorical 配列の末尾に欠損値を 2 つ代入します。

statesNE(12:13) = [missing missing]
statesNE = 1×13 categorical
     <undefined>      VT      MA      VT      ME      NH      VT      MA      NH      CT      RI      <undefined>      <undefined> 

string 配列を categorical 配列に変換する場合、欠損 string と空の string は categorical 配列において未定義の要素になります。数値配列を変換する場合は、NaN が未定義の要素になります。したがって、欠損 string、""''、または NaN を categorical 配列の要素に代入すると、それらは未定義の categorical 値に変換されます。

statesNE(2) = ""
statesNE = 1×13 categorical
     <undefined>      <undefined>      MA      VT      ME      NH      VT      MA      NH      CT      RI      <undefined>      <undefined> 

string 配列からの順序 categorical 配列の作成

順序 categorical 配列では、比較を可能にする数学的な順序がカテゴリの順序によって定義されます。この数学的な順序により、順序 categorical 配列の要素は関係演算子を使用して比較できます。順序がない categorical 配列の要素は比較できません。

たとえば、8 つのオブジェクトのサイズを含む string 配列を作成します。

AllSizes = ["medium" "large" "small" "small" "medium"  ...
            "large" "medium" "small"];

string 配列には一意の値が 3 つ含まれています。"large""medium"、および "small" です。string 配列には small < medium < large を示す便利な方法はありません。

string 配列を順序 categorical 配列に変換します。カテゴリを smallmediumlarge として、この順序で定義します。順序 categorical 配列では、最初に指定されたカテゴリが最小になり、最後に指定されたカテゴリが最大になります。

valueset = ["small" "medium" "large"];
sizeOrd = categorical(AllSizes,valueset,"Ordinal",true)
sizeOrd = 1×8 categorical
     medium      large      small      small      medium      large      medium      small 

categorical 配列の値の順序 sizeOrd は変更されません。

sizeOrd の離散カテゴリを一覧表示します。カテゴリの順序が数学的な順序 small < medium < large と一致しています。

categories(sizeOrd)
ans = 3×1 cell
    {'small' }
    {'medium'}
    {'large' }

数値データのビン化による順序 categorical 配列の作成

連続数値データをもつ配列がある場合、数値の範囲をカテゴリとして指定すると便利なことがあります。このような場合、関数 discretize を使用してデータをビン化します。ビンにカテゴリ名を代入します。

たとえば、0 から 50 までの範囲の 100 個の乱数からなるベクトルを作成します。

x = rand(100,1)*50
x = 100×1

   40.7362
   45.2896
    6.3493
   45.6688
   31.6180
    4.8770
   13.9249
   27.3441
   47.8753
   48.2444
    7.8807
   48.5296
   47.8583
   24.2688
   40.0140
      ⋮

discretize を使用して x の値をビン化することで categorical 配列を作成します。0 ~ 15 のすべての値を最初のビンに、15 ~ 35 のすべての値を 2 番目のビンに、35 ~ 50 のすべての値を 3 番目のビンに入れます。各ビンには左の端点が含まれますが、最後のビンを除いて右の端点は含まれません。

catnames = ["small" "medium" "large"];
binnedData = discretize(x,[0 15 35 50],"categorical",catnames)
binnedData = 100×1 categorical
     large 
     large 
     small 
     large 
     medium 
     small 
     small 
     medium 
     large 
     large 
     small 
     large 
     large 
     medium 
     large 
     small 
     medium 
     large 
     large 
     large 
     medium 
     small 
     large 
     large 
     medium 
     large 
     large 
     medium 
     medium 
     small 
      ⋮

binnedData は、small < medium < large である 3 つのカテゴリを含む順序 categorical 配列です。

各カテゴリの要素数を表示するには、関数 summary を使用します。

summary(binnedData)
binnedData: 100×1 ordinal categorical

     small            30 
     medium           35 
     large            35 
     <undefined>       0 

Additional statistics:

    Min         small   
    Median      medium  
    Max         large   

ビン化されたデータのさまざまな種類のグラフを作成できます。たとえば、binnedData の円グラフを作成します。

pie(binnedData)

Figure contains an axes object. The hidden axes object contains 6 objects of type patch, text. These objects represent small, medium, large.

categorical 配列の事前割り当て

NaN の配列を作成して categorical 配列に変換することにより、任意のサイズの categorical 配列を事前割り当てできます。配列を事前割り当てした後、カテゴリ名を配列に追加することによってカテゴリを初期化できます。

たとえば、NaN の 2 行 4 列の配列を作成します。

A = NaN(2,4)
A = 2×4

   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN

その後、NaN の配列を未定義の categorical 値の categorical 配列に変換します。

A = categorical(A)
A = 2×4 categorical
     <undefined>      <undefined>      <undefined>      <undefined> 
     <undefined>      <undefined>      <undefined>      <undefined> 

この時点で A にカテゴリはありません。

categories(A)
ans =

  0×0 empty cell array

addcats 関数を使用して、カテゴリ smallmediumlargeA に追加します。

A = addcats(A,["small" "medium" "large"])
A = 2×4 categorical
     <undefined>      <undefined>      <undefined>      <undefined> 
     <undefined>      <undefined>      <undefined>      <undefined> 

A の要素は未定義値のままですが、A のカテゴリは定義されています。

categories(A)
ans = 3×1 cell
    {'small' }
    {'medium'}
    {'large' }

A にカテゴリが存在するようになったため、定義済みの categorical 値を A の要素として割り当てることができます。

A(1) = "medium";
A(8) = "small";
A(3:5) = "large"
A = 2×4 categorical
     medium           large      large            <undefined> 
     <undefined>      large      <undefined>      small       

参考

| | | | |

トピック