dplyrは「データ操作の文法」を提供するパッケージです。データ分析でよく使われる操作を、人間が理解しやすい「動詞」として表現し、複雑なデータ変換を直感的なコードで記述できます。
dplyrの最大の特徴は、一貫性と可読性です。すべての関数が同じ原則に従って設計されているため、一度覚えれば様々な場面で応用できます。
dplyrでデータの魔法を体験。filter, select, mutate, summariseを駆使して、複雑なデータ変換をエレガントに実装し、データ分析の生産性を劇的に向上させる。
dplyrは「データ操作の文法」を提供するパッケージです。データ分析でよく使われる操作を、人間が理解しやすい「動詞」として表現し、複雑なデータ変換を直感的なコードで記述できます。
dplyrの最大の特徴は、一貫性と可読性です。すべての関数が同じ原則に従って設計されているため、一度覚えれば様々な場面で応用できます。
データ分析の第一歩は、データを適切に読み込むことです。Tidyverseではreadrパッケージとtibbleデータ構造を使って、効率的で安全なデータ読み込みを実現します。
readrパッケージは、従来のRの読み込み関数よりも高速で、型推論が優秀で、進捗バーも表示される現代的なデータ読み込みツールです。
tibbleは従来のdata.frameを現代的に再設計したデータ構造です。より安全で、見やすく、扱いやすくなっています。
大きなデータでも最初の10行だけ表示し、列の型情報も自動表示。コンソールが溢れません。
部分マッチングや予期しない型変換を防ぎ、より予測可能で安全なコードを書けます。
文字列のファクター自動変換なし、行名なしなど、現代的なデータ分析に適した仕様です。
メモリ効率が良く、大きなデータセットでも高速に動作します。
読み込んだデータの構造を理解することは、分析の成功の鍵です。Tidyverseでは効率的なデータ探索ツールが豊富に用意されています。
日本語データを扱う際は、文字エンコーディングの設定が重要です。readrパッケージは様々なエンコーディングに対応し、日本語データを安全に読み込めます。
適切なデータ読み込みは、信頼性の高い分析の基盤です。readrとtibbleを活用することで、効率的で安全なデータ処理ワークフローを構築できます。
dplyrは5つの主要な動詞でデータ操作の大部分をカバーします。各動詞は特定の操作に特化し、組み合わせることで複雑な処理を表現できます。
条件に合致する行だけを抽出します。WHERE句のようなデータの絞り込みを行います。
必要な列だけを選択します。データセットから特定の変数を取り出したり、列の順序を変更できます。
新しい列を作成したり、既存の列を変更します。計算フィールドの追加に使用します。
データを集約して要約統計を計算します。平均、合計、最大値などを求められます。
パイプ演算子 %>% は、dplyrの真価を発揮させる重要な要素です。複数の操作を左から右へ、上から下へと自然な流れで記述できます。
パイプを使うことで、「データに何をするか」を順序立てて表現でき、コードが読みやすく、理解しやすくなります。
パイプを使ったコードは、まるで「レシピ」のように読むことができます:
実際のデータ分析では、複数の動詞を組み合わせて複雑な処理を行います。以下に典型的なパターンを示します。
このようにdplyrを使うことで、複雑なデータ変換も段階的に、理解しやすい形で記述できます。各ステップが明確で、後から読み返したときも処理の流れが分かりやすくなります。
基本的なdplyr操作を習得したら、より高度な技法を学習しましょう。 特に統計分析や機械学習に向けたデータ前処理は、分析の成否を大きく左右します。
ビジネス分析では時系列データの処理が頻繁に必要になります。dplyrとslider、lubridateパッケージを組み合わせて効率的に処理しましょう。
# 時系列データの高度な処理
library(tidyverse)
library(slider)
library(lubridate)
sales_data <- tibble(
date = seq(ymd("2020-01-01"), ymd("2023-12-31"), by = "day"),
sales = runif(length(date), 1000, 5000)
)
# 移動平均とトレンド分析
sales_processed <- sales_data %>%
mutate(
year = year(date),
month = month(date),
weekday = wday(date, label = TRUE),
# 移動平均(7日、30日)
ma_7 = slide_dbl(sales, mean, .before = 6, .complete = TRUE),
ma_30 = slide_dbl(sales, mean, .before = 29, .complete = TRUE),
# 前年同期比較
yoy_growth = (sales - lag(sales, 365)) / lag(sales, 365) * 100,
# 季節調整(月平均との比較)
monthly_avg = ave(sales, year, month, FUN = mean),
seasonal_adj = sales / monthly_avg,
# 異常値検出(統計的手法)
z_score = abs((sales - mean(sales)) / sd(sales)),
is_outlier = z_score > 2.5,
# トレンド分解
detrended = sales - ma_30
) %>%
# 欠損値の処理
fill(ma_7, ma_30, .direction = "down")
機械学習モデルの性能向上のため、データの正規化・標準化・特徴量エンジニアリングを実践しましょう。
# 統計的データ前処理のベストプラクティス
library(tidyverse)
# サンプルデータ
customer_data <- tibble(
customer_id = 1:1000,
age = rnorm(1000, 35, 10),
income = rlnorm(1000, 10.5, 0.5),
purchase_count = rpois(1000, 5),
category = sample(c("A", "B", "C"), 1000, replace = TRUE)
)
# 統計的変換の実践
processed_data <- customer_data %>%
mutate(
# 1. 正規化(Min-Max スケーリング)
age_normalized = (age - min(age)) / (max(age) - min(age)),
# 2. 標準化(Z-score)
income_standardized = (income - mean(income)) / sd(income),
# 3. 対数変換(歪んだ分布の修正)
income_log = log(income),
# 4. 四分位区間によるロバストスケーリング
age_robust = (age - median(age)) / IQR(age),
# 5. カテゴリカル変数のエンコーディング
# ワンホットエンコーディング
category_A = as.numeric(category == "A"),
category_B = as.numeric(category == "B"),
category_C = as.numeric(category == "C"),
# 6. 特徴量エンジニアリング
# 購入頻度カテゴリ
purchase_frequency = case_when(
purchase_count <= 2 ~ "Low",
purchase_count <= 5 ~ "Medium",
TRUE ~ "High"
),
# 収入年齢比
income_age_ratio = income / age,
# 7. ビニング(連続値の離散化)
age_group = cut(age,
breaks = c(0, 25, 35, 50, 100),
labels = c("Young", "Adult", "Middle", "Senior"),
include.lowest = TRUE),
# 8. 異常値の処理(Winsorization)
income_winsorized = pmax(pmin(income,
quantile(income, 0.95, na.rm = TRUE)),
quantile(income, 0.05, na.rm = TRUE))
)
# プロフェッショナルなdplyrパターン
# 1. 条件付き変換のエレガントな方法
data %>%
mutate(
new_column = case_when(
condition1 ~ value1,
condition2 ~ value2,
condition3 ~ value3,
TRUE ~ default_value # else句
)
)
# 2. 複数列に対する同じ処理
data %>%
mutate(across(where(is.numeric), ~ scale(.)[,1])) # 数値列を標準化
# 3. 動的な列選択
columns_to_analyze <- c("sales", "profit", "quantity")
data %>%
select(all_of(columns_to_analyze)) %>%
summarise(across(everything(), list(mean = mean, sd = sd), na.rm = TRUE))
# 4. グループ内でのランキング
data %>%
group_by(category) %>%
mutate(
rank_within_group = row_number(desc(sales)),
percentile = percent_rank(sales),
top_10_percent = ntile(sales, 10) >= 9
) %>%
ungroup()
# 5. ウィンドウ関数の活用
data %>%
arrange(date) %>%
mutate(
# 累積統計
cumulative_sales = cumsum(sales),
running_avg = cumsum(sales) / row_number(),
# 前後の値との比較
sales_change = sales - lag(sales),
sales_change_pct = (sales - lag(sales)) / lag(sales) * 100,
# 前後N期間の統計
sales_ma = (lag(sales, 2) + lag(sales, 1) + sales +
lead(sales, 1) + lead(sales, 2)) / 5
)
# 6. ネストしたデータとmap関数
nested_analysis <- data %>%
group_by(region) %>%
nest() %>%
mutate(
# 各グループに対して線形回帰
model = map(data, ~ lm(sales ~ advertising, data = .)),
# 予測値の計算
predictions = map2(model, data, predict),
# モデルの要約統計
r_squared = map_dbl(model, ~ summary(.)$r.squared)
)
# 包括的なデータ品質チェック
quality_check <- function(df) {
df %>%
summarise(
# 基本情報
n_rows = n(),
n_cols = ncol(.),
# 欠損値情報
across(everything(),
list(missing_count = ~ sum(is.na(.)),
missing_pct = ~ round(sum(is.na(.)) / n() * 100, 2)),
.names = "{.col}_{.fn}"),
# 重複行の確認
duplicate_rows = sum(duplicated(.)),
# 数値列の統計サマリー
across(where(is.numeric),
list(min = min, max = max, mean = mean, sd = sd),
na.rm = TRUE,
.names = "{.col}_{.fn}")
) %>%
pivot_longer(everything()) %>%
separate(name, into = c("column", "metric"), sep = "_(?=[^_]*$)")
}
これらの高度なdplyr技法をマスターすることで、複雑な実世界のデータ分析プロジェクトに対応できるようになります。 次の章では、これらの前処理されたデータを美しく効果的に可視化する方法を学びましょう。
※ 当サイトはAmazonアソシエイトプログラムに参加しています