Rにおけるfactor変数が分かりにくかったワケ2024年09月24日 05:54

 統計ソフトRのサイトを見るとFactor変数がよくわからない謎だということをよく目にします。

購入したオレイリーのRレシピ―という解説本でも
oreilly-978-4-87311-885-7e.pdf

「レシピ5.4 ファクタ(カテゴリ変数)を作成する
問題
文字列や整数のベクトルがある。それをRにファクタとして扱わせたい(ファクタはRでカテゴリ変数を表す用語)。
解決策
factor関数は離散値のベクトルをファクタにエンコードします。
f <- factor(v) # v は文字列や整数のベクトルである
ベクトルとして取れる値の部分集合だけが含まれ、全体が含まれていない場合には、ファクタの水
準を示す2番目の引数を指定します。
f <- factor(v, levels)
解説
Rでは、カテゴリ変数が取る値を水準と呼びます。水準のベクトルをファクタと呼びます。
ほとんどの場合、カテゴリデータをファクタに変換するにはfactor関数を呼び出すだけです。
factor関数ではカテゴリデータの個別の水準を指定し、それらをファクタに含めます。」

との説明の後の例題に

f <- factor(c("Win", "Win", "Lose", "Tie", "Win", "Lose"))
f
## [1] Win Win Lose Tie Win Lose
## Levels: Lose Tie Win

と書かれているだけです。即ちオブジェクトfは
ベクトルcをファクタと呼ばれるカテゴリーデータに変換した結果をしめしています。
 ここで

## [1] 行で示しているのは各要素をクラス分けをするための略号なのですが、それを変数名である"Win", "Win", "Lose", "Tie", "Win", "Lose"をファクターという変数の略号としてそのまま使っていることは想像できます。

問題は
## Levels: Lose Tie Win
である。Levelsと言っているからにはクラス分けしたれべるなのだが、なぜ
Lose Tie Win
の順番で並んでいるのかがわかりません。(普通の日本人には)

 ちょっと考えると、これはレベルがアルファベット順になっています。
 レベルの略号が数値ならすぐにわかるが、略号だとどうしてレベルがその順に並ぶのかが、アルファベットを使ってない国民には直感的に理解できない説明になっていいるのです。これがファクタ変数をすぐには理解できない大きなポイントなのです。

因みに数字文字の場合は分かりやすい。

> f <- factor(c("1", "3", "5","2", "4", "6"))
> f
[1] 1 3 5 2 4 6
Levels: 1 2 3 4 5 6


では日本語を使った場合にはレベルはどう表示されるのでしょうか。

> f<- factor(c("ゆ", "き", "こ","さ", "ん", "へ"))
> f
[1] ゆ き こ さ ん へ
Levels: き こ さ へ ゆ ん

どうもあいうえお順です。
漢字の場合は、
f> f<- factor(c("雪", "麒麟", "米","際", "夢夢", "偏"))
> f
[1] 雪 麒麟 米 際 夢夢 偏
Levels: 際 雪 米 偏 夢夢 麒麟

音読み順のようです。

これらが混ざった場合は、何とかという言語関係のルールがありましたが、忘れました。Rも言語の一種ではありますが。どの言語を母語にしているかでRの説明も分かりやすかったり難しかったりするようです。

なお、何のためにFactor型が必要になるのか。

分かりやすい例として、
私たちのRというサイトでのグラフ化の例を示します。
https://www.jaysong.net/RBook/datatype.html

著者
宋財泫(Jaehyun Song)関西大学
矢内勇生(Yuki Yanai)高知工科大学

この9.6節に5つの都道府県と財政力指標の表が出ています。
このデータは3つの列で構成されており、IDとZaisei列はnumeric型、Pref列はcharacter型です。
ID 都道府県 | 財政 指数|
1 Hokkaido 0.44396
2 Tokyo 1.19157
3 Aichi 0.92840
4 Osaka 0.78683
5 Fukuoka 0.64322

これを単純に図示すると横軸がAichi,Fukuoka,Hokkaido,Osaka,Tokyoのアルファベット順になってしまいます。

そこでこれを北から順に図示したい場合、factor関数のオプションとして
levelをアルファベット順から変更できます。
zaisei_df$Pref <- factor(zaisei_df$Pref,
levels = c("Hokkaido", "Tokyo", "Aichi", "Osaka", "Fukuoka"))

このようにzaisei_dfのPref列をfactor型にしてから同じ図を描くとlevelsオプションで指定した通り北から順に横軸が並ぶ図にすることができます。