1
rd-9. テーブルデータ
処理,並べ替え(ソー
ト),集計・集約
金子邦彦
データサイエンス演習
R システムを使用)
https://www.kkaneko.jp/de/rd/index.html
アウトライン
9-1 データテーブル
9-2 選択,射影,自然結合,直積
9-3 並べ替え(ソート)
9-4 集約
9-5 演算の組み合わせ
2
9-1 テーブルデータ
3
想定する処理の流れ
4
R システム
データソース
コンストラクタ
Web
データファイル
リレーショナル
データベース
グラフ
新しいデータ
解析結果
テーブルデータの例
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
5
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
成績テーブル コンストラクタ
科目 教室
国語
101
算数
201
理科
301
教室テーブル コンストラクタ
library(dplyr)
d3 <- data_frame(
科目=c("国語", "算数", "理科"),
教室=c("101", "201", "301") )
9-2 選択、射影、自然結合、
直積
6
選択
7
テーブル
新しいテーブル
選択
結合条件
得点 >= 90
テーブルの中から、選択条件に合致するレコード
のみを選択する.結果は、新しいテーブルになる
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
科目
受講者
得点
国語
A
90
算数
A
95
選択条件で用いる比較演算子
8
等しいか等しくないか 大小の比較
== 等しい
!= 等しくない
>より大きい
>= 以上
<より小さい
<= 以下
選択
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
d1 %>% filter(得点 >= 90)
9
元データ
科目
受講者
国語
A
国語
B
算数
A
算数
B
理科
A
選択を行うテーブ
ルのオブジェクト
d1
選択条件
得点
>= 90
結果
行いたいこと
射影
10
テーブル
新しいテーブル
射影
フィールド名リスト
受講者, 得点
テーブルの中の、必要なフィールド名リスト
を指定する.結果は、新しいテーブルになる
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
科目
受講者
国語
A
国語
B
算数
A
算数
B
理科
A
射影
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
d1 %>% select(科目, 受講者)
11
科目
受講者
国語
A
国語
B
算数
A
算数
B
理科
A
射影を行うテーブル
のオブジェクト名
d1
フィールド名リスト
科目
, 受講者
元データ 結果
行いたいこと
自然結合
12
新しいテーブル
2つのテーブル結合属性を用いて結合する.
結果は、新しいテーブルになる
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
科目
教室
国語
101
算数
201
理科
301
自然結合
科目
受講者
得点
教室
国語
A
90
101
国語
B
80
101
算数
A
95
201
算数
B
90
201
理科
A
80
301
自然結合
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
d3 <- data_frame(
科目=c("国語", "算数", "理科"),
教室=c("101", "201", "301") )
inner_join(d1, d3)13
科目
受講者
国語
A
国語
B
算数
A
算数
B
理科
A
自然結合を
行うテーブ
ルのオブ
ジェクト名
d1
,
d3
教室
101
201
301
元データ 結果行いたいこと
直積
14
新しいテーブル
直積は、2つのテーブルの全レコードの組み合
わせ.結果は、新しいテーブルになる
参考 Web ページ: http://www.alfredo.motta.name/data-
manipulation-primitives-in-r-and-python/
科目
教室
国語
101
算数
201
理科
301
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
直積
直積
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
d3 <- data_frame(
科目=c("国語", "算数", "理科"),
教室=c("101", "201", "301") )
d1$tmp = NA
d3$tmp = NA
full_join(d1, d3, by="tmp") %>% select(-tmp) 15
科目
受講者
国語
A
国語
B
算数
A
算数
B
理科
A
直積を行う
テーブルの
オブジェク
ト名
d1
,
d3
教室
101
201
301
元データ
結果
行いたいこと
9-3 並べ替え(ソート)
16
並べ替え(ソート)の例
17
データを一定の規則で並べ替え.
並べ替えは行単位
並べ替え(ソート)前
得点昇順
得点降順
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
並べ替え(ソート)
データを一定の規則(昇順または降順)で並べ替
並べ替えはレコード単位
並べ替えの結果、新しいテーブルができる
並べ替え時に、「キーとなるフィールド名」と「
序(昇順または降順) 」を設定する必要がある
18
並べ替え前 得点昇順
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
昇順での並べ替え(ソート)
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
d1 %>% arrange(得点)
19
並べ替え(ソート)を行う
テーブルのオブジェクト名
d1
キー
得点
順序
昇順
降順での並べ替え(ソート)
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
d1 %>% arrange(desc(得点))
20
並べ替え(ソート)を行う
テーブルのオブジェクト名
d1
キー
得点
順序
降順
複数フィールドでの並べ替え(ソート)
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
d1 %>% arrange(desc(得点), 受講者)
21
並べ替え(ソート)を行う
テーブルのオブジェクト名
d1
キー
得点
, 受講者
順序
得点は降順
受講者は昇順
9-4 集約
22
集約の例
23
A
3
B
2
集約の例
Aさんは 3科目
Bさんは 2科目受講した
元データ
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
集約で求めるもの
頻度(数え上げ)
種類ごとの数え上げ
要約統計量
平均 (mean)、標準偏差 (sd)、分散 (var)
中央値 (median)、四分位点 (quantile)
最大値 (max)、最小値 (min)
24
グループごとに、頻度や要約統計量を求める
集約では、グループの基準もいろいろ
25
集約の例
元データ
A
88.33333
B
85
得点の平均
国語
85
算数
92.5
理科
80
得点の平均
グループの基準
受講者
グループの基準
科目
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
集約の例
d1 %>% group_by(科目)
%>% summarise(n())
d1 %>% group_by(受講者)
%>% summarise(mean(得点))
d1 %>% group_by(科目)
%>% summarise(mean(得点))
26
国語
2
算数
2
理科
1
データの個数
得点の合計
得点の平均
A
88.33333
B
85
国語
85
算数
92.5
理科
80
集約
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
d1 %>% group_by(受講者) %>% summarise(min(得点),
Q1=quantile (得点, probs=0.25), median(得点), mean(得点),
Q3=quantile(得点, probs=0.75), max(得点)) 27
成績
科目
受講者
国語
A
国語
B
算数
A
算数
B
理科
A
集約を行う
テーブルのオ
ブジェクト名
d1
グループの基
受講者
集約する
フィールド名
得点
集約
library(dplyr)
d1 <- data_frame(
科目=c("国語", "国語", "算数", "算数", "理科"),
受講者=c("A", "B", "A", "B", "A"),
得点=c(90, 80, 95, 90, 80) )
d1 %>% group_by(科目) %>% summarise(min(得点), Q1=quantile (得点,
probs=0.25), median(得点), mean(得点), Q3=quantile(得点, probs=0.75),
max(得点))
28
成績
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
集約を行う
テーブルのオ
ブジェクト名
d1
グループの基
科目
集約する
フィールド名
得点
ピボットテーブル(クロス集約表)の例
29
元データ
女性
男性
1
2
1
2
ピボットテーブル
(クロス集約表)の例
ピボットテーブル(クロス集計表)
library(dplyr)
d4 <- data_frame(
名前=c("A", "B", "C", "D", "E", "F"),
性別=c("男性", "男性", "女性", "女性", "男性", "男性"),
申し込み=c("", "", "", "", "", "") )
d4 %>% group_by(性別, 申し込み) %>% summarise(count=n())
30
集約を行う
テーブルの
オブジェク
ト名
d4
グループの
基準
性別
,
し込み
結果は縦長形式 (long-format)
ピボットテーブル(クロス集計表)
library(dplyr)
library(tidyr)
d4 <- data_frame(
名前=c("A", "B", "C", "D", "E", "F"),
性別=c("男性", "男性", "女性", "女性", "男性", "男性"),
申し込み=c("", "", "", "", "", "") )
d4 %>% group_by(性別, 申し込み) %>% summarise(count=n()) %>%
spread(性別, count)
31
集約を行う
テーブルの
オブジェク
ト名
d4
グループの
基準
性別
,
し込み
結果は横長形式 (wide-format)
9-5 演算の組み合わせ
32
演算の組み合わせの例
d1 %>%
filter(得点 >= 90) %>%
select(科目, 受講者)
33
科目
受講者
得点
国語
A
90
国語
B
80
算数
A
95
算数
B
90
理科
A
80
成績テーブル
(オブジェクト名は d1)
選択+射影
部屋テーブル
(オブジェクト名は d3)
科目
教室
国語
101
算数
201
理科
301
選択+結合+射影
d3 %>%
filter(教室 == 101) %>%
inner_join(d1) %>%
select(受講者)
d1 %>%
group_by(科目) %>%
summarise(Mean=mean(得点)) %>%
filter(Mean >= 85)
集約+選択