R言語Tidyverseデータ分析入門|社労士が実践するHRデータ分析の基礎

記事のアイキャッチ画像

「Excelでの分析に限界を感じている」「データサイエンスに興味はあるけど、何から始めればいいかわからない」。社労士として人事データを扱う中で、私も同じ悩みを抱えていました。そんな時に出会ったのが、R言語とTidyverseです。この記事では、プログラミング未経験の私が、実務でHRデータ分析を行えるようになるまでに学んだTidyverseの基礎を、初心者目線で解説します。

R言語とTidyverseとの出会い

Excelからの脱却を決意した理由

社労士として、人事データ(従業員の年齢、勤続年数、給与、離職率など)を分析する機会が多くありました。しかし、Excelでの分析には以下のような課題がありました:

  • 大量データの処理が遅い:数千行のデータだと動作が重くなる
  • 再現性がない:手作業が多く、同じ分析を再現するのが困難
  • 複雑な分析が難しい:クロス集計やグループ化が煩雑
  • グラフの柔軟性が低い:見栄えの良いグラフを作るのに時間がかかる

「もっと効率的に、正確に、美しくデータを分析したい」という思いから、データ分析ツールを探し始めました。

なぜR言語・Tidyverseを選んだのか

PythonやSQLなど選択肢がある中で、R言語とTidyverseを選んだ理由:

  • 統計分析に特化:HRデータ分析に必要な統計機能が豊富
  • Tidyverseの直感的な文法:英語の文章のように読めるコード
  • 可視化が美しい:ggplot2で論文レベルのグラフが作れる
  • 無料:R言語もRStudioも完全無料
  • 豊富な日本語資料:学習教材が充実している

Tidyverseとは何か

セクション画像

Tidyverseの概要

Tidyverseは、データサイエンスのワークフローを効率化するR言語のパッケージ集です。以下の主要パッケージで構成されています:

  • dplyr:データの絞り込み・集計・変換(SQLのような操作)
  • ggplot2:データの可視化(美しいグラフ作成)
  • tidyr:データの整形(縦横変換など)
  • readr:CSVなどのファイル読み込み
  • purrr:関数型プログラミング(繰り返し処理)
  • stringr:文字列操作

Tidyverseの哲学:パイプ演算子(%>%)

Tidyverseの最大の特徴は「パイプ演算子(%>%)」です。これにより、処理を「流れるように」記述できます。

# 従来のR言語(ネストが深い)
result <- mean(filter(data, age > 30)$salary)

# Tidyverseスタイル(読みやすい)
result <- data %>%
  filter(age > 30) %>%
  summarise(平均給与 = mean(salary))

パイプ演算子は「次の関数にデータを渡す」という意味です。「データを取り出して → 絞り込んで → 集計する」という流れが一目でわかります。

実践:HRデータ分析の基本ワークフロー

ステップ1: 環境構築とデータ読み込み

まず、RStudioをインストールし、Tidyverseをセットアップします。

# Tidyverseのインストール(初回のみ)
install.packages("tidyverse")

# ライブラリの読み込み
library(tidyverse)

# CSVファイルの読み込み
employees <- read_csv("従業員データ.csv")

# データの確認
glimpse(employees)

実務での活用例:
私は給与計算システムからエクスポートしたCSVファイルを、この方法で読み込んでいます。数千行のデータも一瞬で読み込めます。

ステップ2: データの絞り込み(filter)

特定の条件に合致するデータだけを抽出します。

# 30歳以上の従業員だけ抽出
employees_30plus <- employees %>%
  filter(年齢 >= 30)

# 複数条件(AND)
it_department_30plus <- employees %>%
  filter(年齢 >= 30, 部署 == "IT部")

# OR条件
young_or_senior <- employees %>%
  filter(年齢 < 25 | 年齢 > 55)

実務での活用例:
「定年間近の従業員(60歳以上)」や「入社3年以内の若手」など、人事施策のターゲットを絞り込むのに活用しています。

ステップ3: データの集計(group_by + summarise)

グループごとに集計を行う、最も使用頻度の高い操作です。

# 部署ごとの平均給与
dept_salary <- employees %>%
  group_by(部署) %>%
  summarise(
    従業員数 = n(),
    平均給与 = mean(給与),
    最高給与 = max(給与),
    最低給与 = min(給与)
  )

# 部署×性別のクロス集計
dept_gender <- employees %>%
  group_by(部署, 性別) %>%
  summarise(従業員数 = n(), .groups = "drop")

実務での活用例:
部署ごとの人件費分析、男女比の確認、年齢層別の分布など、経営層への報告資料作成に使っています。

ステップ4: データの並び替え(arrange)

データを昇順・降順で並び替えます。

# 給与の高い順に並び替え
high_earners <- employees %>%
  arrange(desc(給与))

# 部署ごとに、給与の高い順
by_dept <- employees %>%
  group_by(部署) %>%
  arrange(部署, desc(給与))

ステップ5: 新しい列の追加(mutate)

既存のデータから新しい列を計算して追加します。

# 年齢層の分類を追加
employees_with_age_group <- employees %>%
  mutate(
    年齢層 = case_when(
      年齢 < 30 ~ "若手",
      年齢 < 50 ~ "中堅",
      TRUE ~ "ベテラン"
    ),
    月給 = 給与 / 12
  )

実務での活用例:
賞与計算(基本給×月数)、勤続年数の計算(現在年 - 入社年)など、派生データの作成に活用しています。

データ可視化の基礎(ggplot2)

セクション画像

ggplot2の基本構造

ggplot2は「レイヤーを重ねる」ように、グラフを作成します。

# 基本構造
ggplot(data = データ, aes(x = X軸, y = Y軸)) +
  geom_グラフの種類() +
  labs(title = "タイトル") +
  theme_テーマ()

実践例1: 棒グラフ(部署別従業員数)

dept_count <- employees %>%
  group_by(部署) %>%
  summarise(従業員数 = n())

ggplot(dept_count, aes(x = 部署, y = 従業員数, fill = 部署)) +
  geom_col() +
  labs(
    title = "部署別従業員数",
    x = "部署",
    y = "従業員数(人)"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

実践例2: 散布図(年齢と給与の関係)

ggplot(employees, aes(x = 年齢, y = 給与, color = 部署)) +
  geom_point(alpha = 0.6, size = 3) +
  geom_smooth(method = "lm", se = FALSE) +  # 回帰直線を追加
  labs(
    title = "年齢と給与の関係",
    x = "年齢(歳)",
    y = "年収(万円)"
  ) +
  theme_minimal()

実践例3: ヒストグラム(給与の分布)

ggplot(employees, aes(x = 給与)) +
  geom_histogram(binwidth = 50, fill = "#2563eb", color = "white") +
  labs(
    title = "給与分布",
    x = "年収(万円)",
    y = "従業員数"
  ) +
  theme_minimal()

実務での活用例:
これらのグラフを経営会議の資料に組み込んでいます。Excelで作るより圧倒的に速く、見栄えも良いグラフが作れます。

私が実際に行ったHR分析プロジェクト

プロジェクト1: 離職率分析

「どの部署、どの年齢層で離職率が高いか」を分析しました。

# 部署×年齢層別の離職率
turnover_analysis <- employees %>%
  mutate(年齢層 = case_when(
    年齢 < 30 ~ "20代",
    年齢 < 40 ~ "30代",
    年齢 < 50 ~ "40代",
    TRUE ~ "50代以上"
  )) %>%
  group_by(部署, 年齢層) %>%
  summarise(
    総数 = n(),
    離職者数 = sum(離職フラグ == 1),
    離職率 = 離職者数 / 総数 * 100,
    .groups = "drop"
  )

# ヒートマップで可視化
ggplot(turnover_analysis, aes(x = 年齢層, y = 部署, fill = 離職率)) +
  geom_tile(color = "white") +
  scale_fill_gradient(low = "green", high = "red") +
  labs(title = "部署×年齢層別 離職率") +
  theme_minimal()

結果:営業部の20代、IT部の30代で離職率が高いことが判明し、対策を打つことができました。

プロジェクト2: 残業時間の分析

「どの部署で長時間労働が発生しているか」を月次で追跡しました。

overtime_trend <- overtime_data %>%
  group_by(年月, 部署) %>%
  summarise(平均残業時間 = mean(残業時間), .groups = "drop")

ggplot(overtime_trend, aes(x = 年月, y = 平均残業時間, color = 部署, group = 部署)) +
  geom_line(size = 1.2) +
  geom_hline(yintercept = 45, linetype = "dashed", color = "red") +  # 上限ライン
  labs(
    title = "部署別 平均残業時間の推移",
    x = "年月",
    y = "平均残業時間(時間/月)"
  ) +
  theme_minimal()

結果:特定の月に特定部署で急増していることがわかり、業務配分を見直すきっかけになりました。

学習で役立ったリソース

初心者におすすめの書籍

  • 「RユーザのためのRStudio[実践]入門」(技術評論社)
  • 「Rではじめるデータサイエンス」(オライリー・ジャパン)
  • 「前処理大全」(技術評論社)

無料で学べるオンラインリソース

  • RStudio公式チートシート:dplyr、ggplot2の関数が一覧できる
  • R for Data Science(無料Web版):Tidyverse開発者による公式ガイド
  • Tokyo.R:日本のRユーザーコミュニティ

初心者がつまずきやすいポイントと解決策

つまずき1: パイプ演算子の理解

解決策:「%>%は『データを次に渡す』という意味」と覚える。最初は1行ずつ実行して、データがどう変化するか確認する。

つまずき2: エラーメッセージが英語

解決策:エラーメッセージをGoogle翻訳に入れる。または、Stack OverflowやQiitaで検索すると、日本語の解決策が見つかる。

つまずき3: ggplot2のグラフ調整

解決策:RStudioの「ggplot2チートシート」をダウンロードし、印刷して手元に置く。必要な関数がすぐ見つかる。

R言語を学んで変わったこと

業務面での変化

  • 分析時間が1/10に:Excelで半日かかっていた分析が、30分で完了
  • 再現性が向上:コードを保存しておけば、同じ分析を瞬時に再実行可能
  • 説得力のある資料:美しいグラフで経営層への提案が通りやすくなった

キャリア面での変化

  • データドリブンな意思決定ができるようになった
  • 社労士 × データサイエンスという希少性の獲得
  • プログラミングへの苦手意識がなくなった

まとめ

R言語とTidyverseは、プログラミング未経験者でも習得可能な、強力なデータ分析ツールです。このページのポイントをまとめます:

  • Tidyverseの5大機能:filter(絞り込み)、group_by + summarise(集計)、arrange(並び替え)、mutate(列追加)、ggplot2(可視化)
  • パイプ演算子(%>%):処理を「流れるように」記述できる
  • 実務活用:HRデータ分析、離職率分析、残業時間分析など
  • 学習リソース:書籍、公式チートシート、オンラインコミュニティを活用
  • 再現性と効率性:Excelからの脱却で、分析時間を大幅短縮

データ分析のスキルは、どの職種でも強力な武器になります。社労士として人事データを扱う方、Excelに限界を感じている方は、ぜひR言語とTidyverseに挑戦してみてください。

📚 関連記事

この記事が役に立ったら、ぜひシェアしてください!