R の因数分解: カテゴリ変数と連続変数

⚡ スマートサマリー

R言語のfactor関数は、カテゴリデータを整数コードと一連のレベルを組み合わせたベクトルとして格納します。これは、限られたカテゴリ群と連続的な測定値を区別する方法です。

  • 🏷️ 構造: ファクターは整数コードとレベル属性を保持しており、各カテゴリは固定リストに対して検証されます。
  • 🧩 作成: factor() は文字ベクトルを変換し、class() は結果が文字から因子に変換されたことを確認します。
  • 🔘 名目: レベル引数がない場合、Rはカテゴリを自動的にソートするため、色や性別による順位付けは行われません。
  • 📊 序数: ordered = TRUE に明示的なレベルベクトルを渡すと、ランキングが最低から最高まで固定されます。
  • 🔢 連続: 数値列と整数列は、デフォルトでは連続した状態になります。これは、class(mtcars$mpg) で示されているとおりです。
  • ⚠️ コンバージョンの罠: ファクターに対して as.numeric() を実行するとレベルコードが返されるため、まず levels() を介してラベルを読み取ります。
  • 🧠 メンテナンス: relevel() はモデルのベースラインを設定し、droplevels() はサブセットによって残されたカテゴリをクリアします。

Rにおけるカテゴリ変数と連続変数の因子分析

ファクターインRとは何ですか?

R を因数分解する は、限られた数の異なる値を持つ、データを分類して保存するために使用される変数です。データは整数値のベクトルとして保存されます。R のファクターは、文字列と整数の両方のデータ値をレベルとして保存するカテゴリ変数としても知られています。ファクターは、主に R を使用した統計モデリングや探索的データ分析で使用されます。

内部的には、ファクターは一緒に移動する 2 つのオブジェクトです。コードの整数ベクトルと、名前が付けられた文字属性です。 レベル各コードはそのレベルベクトル内の位置であり、そのためファクターを出力すると単語が表示されますが、 クラス解除() 数字を表示します。

データセットでは、次の XNUMX 種類の変数を区別できます。 カテゴリー (NAIST) と 連続的な.

  • R のカテゴリ変数の記述統計では、値は制限されており、通常は特定の有限グループに基づいています。 たとえば、R のカテゴリ変数には、国、年、性別、職業を指定できます。
  • しかし、連続変数は整数から小数まで、あらゆる値をとることができます。例えば、収益や株価などが挙げられます。

その区別は重要です。なぜなら、R はそれぞれに対して異なるデフォルト値を暗黙のうちに選択するからです。数値列は平均値と中央値で要約され、因子はレベルごとのカウントで要約されます。したがって、カテゴリをテキストとして保存するか数値として保存するかによって、得られる分析が変わります。より広範な保存モードについては、ガイドで説明されています。 Rのデータ型と演算子.

カテゴリ変数

カテゴリ変数 R は因子に格納されます。R で文字変数を因子変数に変換する以下のコードを確認してみましょう。多くのモデリングおよび機械学習ルーチンは生のテキストを処理できないため、モデルを適合させる前にカテゴリをレベルまたは数値としてエンコードする必要があります。

構文

factor(x = character(), levels, labels = levels, ordered = is.ordered(x))

基本Rリファレンスには、上記の短縮版では省略されている2つの引数がさらに記載されています。 除外するレベルセットが構築される前に値を削除し、 nmax非常に大きなベクトルの変換を高速化するレベル数の上限。

引数:

  • xRにおけるカテゴリデータのベクトル。文字列または整数である必要があり、小数値は不可。
  • レベルxが取り得る値のベクトル。この引数は省略可能です。デフォルト値は、ベクトルxの要素を昇順に並べた一意のリストです。
  • ラベルR言語で、xのカテゴリデータにラベルを追加します。例えば、1には「男性」、0には「女性」というラベルを付けることができます。
  • 除外するレベルセット形成時に除外する値のベクトル。除外された値は結果ではNAになります。
  • 順序付けられましたレベルが指定された順序で順序付けられているかどうかを決定する論理フラグ。
  • nmax: レベル数の上限を指定するオプション。長いベクトルに便利です。

例:

文字ベクトルをファクターに変換し、class() でその変更を確認してみましょう。

# Create gender vector
gender_vector <- c("Male", "Female", "Female", "Male", "Male")
class(gender_vector)
# Convert gender_vector to a factor
factor_gender_vector <-factor(gender_vector)
class(factor_gender_vector)

出力:

## [1] "character"
## [1] "factor"

クラスは文字型から因子型に切り替わりましたが、印刷された値には何も変化がありませんでした。 string 機械学習タスクを実行する前に、R言語の因子変数に変換しておく。なぜなら、その時点でカテゴリが固定され、検証済みのセットになるからである。

R のカテゴリ変数は次のように分割できます。 名目上のカテゴリ変数 (NAIST) と 順序カテゴリ変数.

公称カテゴリ変数

名義尺度変数は複数の値を持つが、その順序は関係ない。例えば、男性または女性などである。Rにおける名義尺度変数は、順序関係を持たない。

# Create a color vector
color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow')
# Convert the vector to factor
factor_color <- factor(color_vector)
factor_color

出力:

## [1] blue   red    green  white  black  yellow
## Levels: black blue green red white yellow

factor_color からは順序を特定できません。レベルリストがアルファベット順になっているのは、levels 引数が指定されていないため、R が一意の値を自動的にソートしたからです。このソートは、通常の ASCII ではなく、アクティブなロケールに従います。これが、順序が重要な場合にレベルを明示的に指定する必要がある理由の一つです。

順序カテゴリ変数

順序カテゴリ変数には自然な順序があります。ランキングは、に渡されるベクトルの順序から来ています。 レベル 引数として指定し、ordered = TRUE を指定すると、R はそのシーケンスを単なるリストではなくランキングとして扱います。ordered = FALSE を設定してもランキングは反転せず、単に通常の順序付けされていない因子が生成されます。最高位から最低位にランク付けするには、レベルベクトル自体を反転します。

例:

summary を使用して、R の各因子変数の値をカウントできます。

# Create Ordinal categorical vector 
day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening')
# Convert `day_vector` to a factor with ordered level
factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight'))
# Print the new variable
factor_day

出力:

## [1] evening   morning   afternoon midday    
midnight  evening

コンソールには、まず値が出力され、その下にランキングが表示されます。次のブロックは、まだコメントアウトされたままのLevels行で始まるため、summary()呼び出しが前のコードに追加される間もランキングは表示されたままになります。

## Levels: morning < midday < afternoon < evening < midnight
# Append the line to above code
# Count the number of occurence of each level
summary(factor_day)

出力:

##   morning    midday afternoon   evening  midnight
##         1         1         1         2         1

Rは、levels引数で指定されたとおり、「午前」から「深夜」までの順序でレベルを並べ替えます。この要素は順序付けされているため、<や>などの比較演算子も使用できますが、上記の名義上の色要素では使用できません。

連続変数

連続型変数は、R のデフォルト値です。数値または整数として格納されます。以下のデータセットから確認できます。mtcars は組み込みデータセットです。さまざまな種類の車に関する情報を収集しています。mtcars を使用してインポートし、変数 mpg (マイル/ガロン) のクラスを確認できます。数値が返されるため、連続型変数であることがわかります。

dataset <- mtcars
class(dataset$mpg)

出力

## [1] "numeric"

すべての数値列が真に連続的であるとは限りません。同じデータセットでは、cyl列には4、6、8しか含まれておらず、am列には0と1しか含まれていないため、どちらもたまたま数値として格納されているカテゴリです。モデル化の前にfactor()関数で変換することで、Rが4と6のシリンダー間のギャップを測定量として扱うのを防ぐことができます。逆に、連続列を帯状に分割する操作はcut()関数で行います。

Rにおける因子レベルとラベル

レベル属性は、ファクターの中で最も調整に時間を費やす部分です。なぜなら、これは出力結果とモデルがベースラインとして扱う値の両方を制御するからです。Rの基本ヘルパー関数4つで、ほぼすべてのケースに対応できます。

演算 何それがありません 典型的な使用
レベル(f) レベル名を読み込むか、置き換えます 略語を読みやすいラベルに変更する
nlevels(f) レベル数を返します カテゴリのチェックは、結合後に爆発しなかった
relevel(f, ref) 1階前方へ移動 回帰分析のベースラインを選択する
ドロップレベル(f) 観測値がゼロのレベルを削除します サブセット化またはフィルタリング後のクリーンアップ

以下のブロックは、先に作成した色と性別の要素に、これら4つの要素すべてを適用します。

# Inspect the levels of an existing factor
levels(factor_color)          # the level names, in the order R stored them
nlevels(factor_color)         # how many distinct levels exist

# Rename the levels in place (the new vector must follow the same order)
levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow')

# Attach labels at creation time instead of renaming afterwards
gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male'))

# Make 'male' the reference level that modelling functions compare against
gender_coded <- relevel(gender_coded, ref = 'male')

# Remove levels that survived a subset but no longer occur in the data
subset_color <- droplevels(factor_color[1:3])

2つの重要な点を覚えておく必要があります。levels() への代入は位置に基づいて名前を変更するため、不一致のベクトルは誤ったカテゴリに暗黙的にラベル付けされます。また、サブセットは droplevels() が呼び出されるまで元のレベルをすべて保持するため、フィルタリングされた データフレーム 空の棒グラフをプロットすることもできます。 ラベル 引数はまた異なり、作成時にレベルに名前を付け、重複したラベルは複数の入力値を1つのレベルに統合します。

Rでファクターを数値または文字に変換する方法

これはRにおけるファクターに関する最も一般的なバグです。ファクターは整数コードを格納するため、as.numeric()を呼び出すと、画面に表示される値ではなく、そのコードが返されます。例えば、2021年から2023年までの年を表すファクターは、1、2、3として返されます。

# A factor whose labels happen to look like numbers
year_factor <- factor(c('2021', '2023', '2022', '2023'))

# WRONG: this returns the internal codes 1, 3, 2, 3 - not the years
as.numeric(year_factor)

# RIGHT: read the label through the levels attribute first
as.numeric(levels(year_factor))[year_factor]

# Equivalent and easier to remember, but slightly slower
as.numeric(as.character(year_factor))

# Back to plain text
as.character(year_factor)

Rの基本ドキュメントでは、as.numeric(levels(f))[f] が正しい方法であり、若干高速な方法として推奨されています。一方、as.numeric(as.character(f)) は、より読みやすい同等の方法として推奨されています。どちらの方法も、最初にラベルを読み込み、その後変換します。

  • 要素から性格へ: as.character(f) はラベルをプレーンテキストとして返します。
  • 整数コードへの因数分解: 実際に必要なコードの場合は、as.integer(f) または unclass(f) を使用します。
  • 特性: factor(x) またはより高速な as.factor(x) ショートカット。
  • 数値を因数に換算: 離散コードの場合は factor(x)、バンディングが必要な連続値の場合は cut(x, breaks) を使用します。

1 つの安全対策がそれらすべてに適用されます。x の値が levels ベクトルに現れない場合、factor() はエラーを発生させる代わりにその要素を NA に設定するため、余分なスペースや大文字小文字の違いによって行が静かに削除される可能性があります。変換の前後の一意の値を比較するか、 データフレームのソート 新しい列では、問題点がすぐに明らかになります。

Rにおけるファクター、文字型、数値型:それぞれをいつ使うべきか

ストレージモードを早めに選択することで、後々のデバッグ作業を大幅に削減できます。この表は、テキストまたはコードの列が取り得る3つのモードを比較したものです。

プロパティ 因子 人格 数値の
として保存されます 整数コードとレベル属性 Doublesまたは整数
固定された値のセット はい、レベルによって定義されます いいえ いいえ
カスタムディスプレイ注文 はい、レベルを通じて アルファベット順のみ 数値のみ
算術 許可されていない 許可されていない 許可
モデルの比較 自動的に構築されます 最初に強制された 測定値として扱われる

使用 要因 値が既知の閉じたリストから取得される場合、表示順序やランキング順序が重要な場合、または列がモデルやプロット凡例にフィードされる場合。 文字 自由形式のテキスト、識別子、および名前、メモ、新しい値とともに次々と到着するコードなど、解析または結合するあらゆるものに対して使用します。 数値の 2つの値間の距離が意味を持つ場合に限る。

以下のブロックは、実際に所有しているものを確認する最も簡単な方法を示しています。

# Ask R what each column of a data frame actually is
sapply(mtcars, class)

# Direct membership tests
is.factor(factor_day)
is.ordered(factor_day)

# unclass() exposes the integer codes hiding behind the labels
unclass(factor_color)

2つの習慣で選択の正確性を保つ。インポートのたびに sapply(df, class) を実行する。数値列に1文字でも文字が混入すると、列全体がテキストになってしまうためである。そして、データがクリーニングされ結合された後、できるだけ遅くファクターに変換する。 dplyr 結合とフィルタは、依然として不一致のレベルセットではなく、単純な文字列を比較します。

よくあるご質問

levels が指定されていない場合、factor() は unique() を呼び出し、値を昇順にソートします。このソートはアクティブなロケールに依存するため、必ずしもプレーンな ASCII 形式になるとは限りません。順序に意味がある場合は、levels 引数を明示的に指定してください。

table(f) は各レベルの名前付きカウントを返し、prop.table(table(f)) はそれらのカウントを割合に変換します。どちらも空のレベルを表示したままにするため、フィルタリング後に消えたカテゴリを見つけるのに役立ちます。 データフレーム.

factor() は、指定したレベルに対してすべての要素を照合し、一致する値がない場合はエラーではなく NA になります。変換前に setdiff(unique(x), your_levels) を確認し、ソースデータに不要な空白や大文字小文字の区別がないか注意してください。

cut() は、指定した区切り点で数値ベクトルを分割し、ファクターを返します。読みやすいバンド名にはラベルを、バンドがランク付けされている場合は ordered_result = TRUE を指定してください。findInterval() は、ビンのインデックスのみが必要な場合に、より高速な代替手段です。

R 4.0.0以降、data.frame()とread.csv()の初期設定時のデフォルト値はstringsAsFactors = FALSEとなっているため、テキスト列は文字型のまま保持されます。自動変換に依存していた以前のスクリプトでは、モデル化する列に対してfactor()を明示的に呼び出す必要があります。

Less 以前よりもその差は小さくなっています。Rの基本リファレンスでは、同一の文字列はストレージを共有するようになったため、ほとんどの場合、その差は小さくなっています。ファクターは、カテゴリの検証や、モデルやプロットで使用されるレベルの順序の固定に依然として役立ちます。

ほとんどのモデリング関数は因子を直接受け入れ、ダミー対比を自動的に構築しますが、 機械学習 パッケージは数値行列を想定しています。model.matrix() またはワンホットエンコーディングを使用することでこのギャップを埋めることができ、順序付きファクターであればその順位を維持できます。

Yes. GitHubコパイロット RStudio 2023.09.0以降で動作し、開いているファイル内のコメントとコードから補完候補を提示します。レベルの順序とNAの処理は、事実ではなく、検証すべき提案として扱ってください。