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 結合とフィルタは、依然として不一致のレベルセットではなく、単純な文字列を比較します。
