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に挑戦してみてください。
📚 関連記事
この記事が役に立ったら、ぜひシェアしてください!