【ITニュース解説】Frequency Tables for Categorical Variables in R — 2025 Edition
2025年09月11日に「Dev.to」が公開したITニュース「Frequency Tables for Categorical Variables in R — 2025 Edition」について初心者にもわかりやすく解説しています。
ITニュース概要
R言語でカテゴリ変数の度数分布表を効率的に作る方法を解説。データの前処理、欠損値・レアカテゴリの扱い、大規模データ対応、複数変数での集計、再利用可能な関数の作成など、2025年最新のベストプラクティスを紹介し、データ分析の基礎を築く。
ITニュース解説
カテゴリ変数とは、データがいくつかの決まったグループに分類される情報のことを指す。たとえば、性別(男性、女性)、商品の種類(電化製品、食品)、顧客のタイプ(無料会員、有料会員)などがこれに該当する。実際のデータセットにはこのようなカテゴリ変数が数多く含まれており、データ分析の最初のステップとして、それぞれのカテゴリにどれくらいのデータが存在するのかを把握することは極めて重要だ。この情報を分かりやすくまとめたものが「頻度表」である。頻度表の基本的な作成はシンプルだが、現代のデータ分析では、この頻度表を大規模なデータでも高速に、そして再利用しやすい形で作成し、ダッシュボードや機械学習の準備プロセスにシームレスに組み込むための洗練された手法が求められる。
頻度表が分析において不可欠である理由はいくつかある。まず、機械学習モデルの構築前に、データの分布、つまり特定のカテゴリが極端に少なかったり(スパース性)、カテゴリ間のデータ量に大きな偏りがあったり(不均衡)、ごく稀なカテゴリが存在したりしないかといった、データの基本的な傾向を理解するための基盤となる。次に、頻度データそのものを機械学習モデルの新しい特徴量として利用したり、頻度の低いカテゴリを「その他」としてまとめて、モデルの複雑さを軽減する「特徴量エンジニアリング」にも役立つ。さらに、分析結果を報告するダッシュボードやレポートでは、整然とソートされ、適切にラベル付けされた頻度表が、情報を効果的に伝える上で不可欠である。そして、大規模データや繰り返し行われる分析に対しては、再現性が高く、高速で信頼性の高いコードが必要となるため、堅牢な頻度表の作成プロセスが求められる。
2025年における頻度表作成の考え方やツールにはいくつかの進化がある。Rにおけるデータ処理の主要なパッケージであるTidyverseの使いやすさと、大規模データに特化した高性能な「data.table」のようなツールを組み合わせて利用するハイブリッドなアプローチが主流になってきている。これにより、コードの読みやすさと実行速度の両方を追求できる。また、データが細かくなりすぎたり、機械学習モデルが過学習したりするのを防ぐため、頻度の低いカテゴリを自動的に「その他」としてグループ化する処理が一般化している。データに存在する欠損値(NA)の扱いも、黙って除外するのではなく、明示的にカウントに含めるか、あるいは意図的に除外するかを透明性をもって決定することが重視される。大規模データに対応するためには、処理速度とメモリ効率が最適化されたパッケージを利用したり、データを分割して処理するストリーミングやチャンク処理の手法が活用される。そして、作成した頻度表のコードをダッシュボード、モデルのパイプライン、その他のスクリプトで共通して使えるように、再利用可能な関数としてまとめる「モジュール化」がベストプラクティスとされている。
Rで整理された頻度表を作成する具体的な手順は以下の通りだ。
ステップ1:データの準備
まず、頻度表を作成したいカテゴリ変数が、Rでカテゴリデータとして適切に扱われる「ファクター型」になっているかを確認する。もし文字列型(キャラクター型)であれば、通常はファクター型に変換することが推奨される。この際、欠損値を「欠損」という一つのカテゴリとして含めるか、それともデータから除外するかを決定する。また、後で頻度の低いカテゴリを「その他」としてまとめる必要があるかどうかも、この段階で検討する。
たとえば、データフレームdfのcat_var列を準備する例では、dfに対してmutate関数を使い、cat_var列を一時的に文字列型に変換し、欠損値があればそれを「Missing」という文字列に置き換え、最後にその列をファクター型に変換するといった処理を行う。これにより、欠損値が明示的に扱われ、カテゴリデータとして正しく認識される。
ステップ2:基本的な頻度表の作成
最も基本的な頻度表の作成方法には、Rの基本機能であるtable()関数を使う方法と、dplyrパッケージのcount()関数を使う方法の二つがある。table(df$cat_var)とすることで、指定した列の各カテゴリの出現回数を数えることができる。これをas.data.frame()でデータフレームに変換し、列名を「category」と「count」にすることで、見やすい表にできる。
dplyrのcount()関数を使う場合は、dfに対してcount(cat_var, name = "count")と記述することで、指定した列の各カテゴリの出現回数を「count」という名前の列に持つデータフレームが直接得られる。この方法は、後続のデータ加工がしやすく、Tidyverseの流儀に沿っている。
ステップ3:ソート、割合、レアレベルの処理
多くの場合、頻度が高いカテゴリから順に並べたり、各カテゴリが全体に占める割合(パーセンテージ)を表示したり、頻度の低いカテゴリを「その他」としてまとめたりすることが求められる。
まず、データ全体の行数(総数)を取得する。次に、ステップ2で作成した頻度表を基に、arrange(desc(count))で出現回数が多い順にソートする。さらにmutate関数を使って、各カテゴリの出現回数を総数で割ることで「prop」(割合)を計算する。
レアレベルの処理では、例えば「出現回数が全体の1%未満のカテゴリをレアとする」といった基準を設ける。mutateでis_rareという真偽値の列を作成し、その条件に合致するカテゴリを「Other」という新しいカテゴリ名に置き換えたcategory2列を作成する。最後に、group_by(category2)で「Other」にまとめられたカテゴリを再集計し、その合計のcountとpropをsummarise関数で算出する。これで、十分なデータがあるカテゴリと「その他」にまとめられたカテゴリを持つ、整理された頻度表が完成する。
ステップ4:複数カテゴリ変数の頻度表
もし、複数のカテゴリ変数の組み合わせの頻度を知りたい場合、たとえば「商品カテゴリ」と「ユーザータイプ」といった二つのカテゴリが同時に出現する回数を調べたい場合は、count(cat_var1, cat_var2, name = "count")のように複数の列名を指定するだけで、それらの組み合わせごとの頻度表を作成できる。
また、xtabs(~ cat_var1 + cat_var2, data = df)のようなxtabs関数を使うと、より伝統的なクロス集計表(コンティンジェンシーテーブル)を生成できる。これをデータフレームに変換することで、各組み合わせの頻度を簡単に確認できる。
ステップ5:大規模データセットへのパフォーマンス考慮
データセットが数百万行を超えるような大規模な場合、処理速度とメモリ効率が非常に重要になる。
この対策の一つとして、「data.table」パッケージを利用する方法がある。data.tableはRの標準的なデータフレームよりも高速なデータ操作が可能で、特にグループ化や集計の処理が非常に速い。たとえば、data.tableオブジェクトdtに対してdt[, .(count = .N), by = cat_var]と記述することで、cat_varごとの出現回数(.Nはグループ内の行数を意味する)を高速に集計できる。その後、setorder(freq_dt, -count)で出現回数が多い順にソートすることも可能だ。
他にも、全データを一度にメモリに読み込まず、データを小さな塊(チャンク)に分けて読み込み、それぞれのチャンクで部分的な頻度を計算し、後でそれらを結合するといった「ストリーミング」や「チャンク処理」のワークフローも有効である。また、不要なファクターレベル(カテゴリの種類)が多すぎるとメモリを大量に消費するため、これを制限することも重要である。作成した頻度表の結果は、データベースやR独自のデータ形式であるRDSファイルとして保存しておくと、後で再利用する際に便利だ。
ステップ6:再利用可能な関数としてのラップ
これまでに説明した一連の処理を、一つの関数としてまとめることは強く推奨される。get_freq_tableのような関数を作成すれば、分析者やチーム全体で常に同じ形式の、一貫した頻度表を生成できる。
この関数は、data(対象データ)、var(頻度表を作成したい列の名前)、threshold(レアカテゴリと判断する割合の閾値、デフォルトは1%)、drop_na(欠損値を除外するかどうか、デフォルトは除外しない)といった引数を受け取るように設計する。関数内部では、まず指定された列を適切に処理し、欠損値の扱いを調整する。その後、総数を計算し、基本的な頻度表の作成、割合の計算、レアカテゴリの結合、そして最終的なソートまでの一連の処理を行い、整形された頻度表を返す。
この関数を一度作成しておけば、異なるデータセットや異なる分析パイプラインで、繰り返し頻度表を効率的かつ一貫性をもって利用できるようになる。
頻度表を作成する際には、ガバナンス、倫理、可視化に関するいくつかの点も考慮すべきだ。「カテゴリ」と「Other」のようにデータを出力する場合、「Other」が具体的にどのようなカテゴリを含んでいるのかを、凡例や表のヘッダーで明確に説明することが重要だ。レアレベルの閾値や欠損値の扱い方などを変更した場合は、コードのバージョン管理システムで追跡するか、変更内容を文書化することで、分析の再現性を確保する必要がある。また、「Other」というグループの中に、見過ごしてはならない重要な少数グループが隠れていないか、「公平性チェック」を行うことも倫理的に重要である。可視化の際には、棒グラフやソートされた表を利用し、最も頻度の高いカテゴリを最初に表示したり、割合を表示したりすることで、データがより理解しやすくなる。
現代のRで頻度表を作成することは、まずカテゴリ変数のクリーニングと準備から始まる。これには、欠損値の扱い、ファクター型への変換、そしてレアレベルの閾値の決定が含まれる。その後、table()やcount()といった関数で基本的な頻度表を生成し、これを降順にソートしたり、割合を計算したり、頻度の低いカテゴリを「その他」にまとめたりする。複数のカテゴリ変数を扱う場合は、クロス集計表を作成することで、それらの組み合わせの頻度を探索できる。大規模なデータセットに対しては、data.tableのような高速処理ツールや、ストリーミング・チャンク集計といった手法が有効だ。そして、これら一連の処理を再利用可能な関数としてまとめることで、分析、ダッシュボード、モデル構築の各段階で一貫性を保ちながら、効率的に利用できる。
頻度表は一見するとシンプルな分析に見えるが、実際のデータ作業ではその細部が非常に重要となる。ダッシュボードのためのデータ準備、機械学習モデルの特徴量バランス調整、データの分布探索、あるいはステークホルダーへの報告など、どのような目的であれ、適切に構築された頻度表は分析者の時間を節約し、予期せぬ問題を回避し、分析結果の信頼性を高める。2025年においては、速度、明瞭さ、柔軟性を兼ね備えたアプローチが、頻度表作成のベストプラクティスとなっている。