rd-9. テーブルデータ処理,並べ替え(ソート),集計・集約

-- Views

February 25, 22

スライド概要

データサイエンス演習
(R システムを使用)
https://www.kkaneko.jp/cc/rd/index.html

profile-image

金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

rd-9. テーブルデータ 処理,並べ替え(ソー ト),集計・集約 データサイエンス演習 (R システムを使用) https://www.kkaneko.jp/cc/rd/index.html 金子邦彦 1

2.

アウトライン 9-1 データテーブル 9-2 選択,射影,自然結合,直積 9-3 並べ替え(ソート) 9-4 集約 9-5 演算の組み合わせ 2

3.

9-1 テーブルデータ 3

4.

想定する処理の流れ データファイル コンストラクタ リレーショナル データベース ◆ グラフ ◆ 新しいデータ ◆ 解析結果 R システム Web データソース 4

5.

テーブルデータの例 科目 受講者 国語 A 国語 B 算数 A 算数 B 理科 A 得点 90 80 95 90 80 成績テーブル 科目 国語 算数 理科 コンストラクタ 教室 教室テーブル library(dplyr) d1 <- data_frame( 科目=c("国語", "国語", "算数", "算数", "理科"), 受講者=c("A", "B", "A", "B", "A"), 得点=c(90, 80, 95, 90, 80) ) 101 201 301 library(dplyr) d3 <- data_frame( 科目=c("国語", "算数", "理科"), 教室=c("101", "201", "301") ) コンストラクタ 5

6.

9-2 選択、射影、自然結合、 直積 6

7.

選択 テーブルの中から、選択条件に合致するレコード のみを選択する.結果は、新しいテーブルになる 科目 受講者 A テーブル 国語 国語 B 成 算数 A 績 算数 B 理科 A 得点 90 80 95 90 80 選択 科目 受講者 国語 A 算数 A 得点 90 95 新しいテーブル 結合条件は 「得点 >= 90」 7

8.

選択条件で用いる比較演算子 等しいか等しくないか == 等しい != 等しくない 大小の比較 > より大きい >= 以上 < より小さい <= 以下 8

9.

選択 科目 受講者 得点 国語 A 90 国語 B 80 算数 A 95 算数 B 90 理科 A 80 元データ 選択を行うテーブ d1 ルのオブジェクト 名 選択条件 得点 >= 90 行いたいこと 結果 library(dplyr) d1 <- data_frame( 科目=c("国語", "国語", "算数", "算数", "理科"), 受講者=c("A", "B", "A", "B", "A"), 得点=c(90, 80, 95, 90, 80) ) d1 %>% filter(得点 >= 90) 9

10.

射影 テーブルの中の、必要なフィールド名リスト を指定する.結果は、新しいテーブルになる 科目 受講者 国語 A テーブル 国語 B 成 算数 A 績 算数 B 理科 A 得点 90 80 95 90 80 射影 科目 受講者 国語 A 国語 B 算数 A 算数 B 理科 A 新しいテーブル フィールド名リストは 「受講者, 得点」 10

11.

射影 科目 受講者 得点 国語 A 90 国語 B 80 算数 A 95 算数 B 90 理科 A 80 元データ 射影を行うテーブル d1 のオブジェクト名 フィールド名リスト 科目, 受講者 行いたいこと 結果 library(dplyr) d1 <- data_frame( 科目=c("国語", "国語", "算数", "算数", "理科"), 受講者=c("A", "B", "A", "B", "A"), 得点=c(90, 80, 95, 90, 80) ) d1 %>% select(科目, 受講者) 11

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 新しいテーブル 12

13.

自然結合 科目 受講者 得点 国語 A 90 国語 B 80 算数 A 95 算数 B 90 理科 A 80 科 目 国 語 算 数 理 科 元データ 教室 101 201 301 自然結合を d1, 行うテーブ d3 ルのオブ ジェクト名 行いたいこと 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

14.

直積 直積は、2つのテーブルの全レコードの組み合 わせ.結果は、新しいテーブルになる 科目 受講者 得点 国語 A 90 国語 B 80 算数 A 95 算数 B 90 理科 A 80 科目 国語 算数 理科 教室 101 直積 201 301 参考 Web ページ: http://www.alfredo.motta.name/datamanipulation-primitives-in-r-and-python/ 新しいテーブル 14

15.

直積 科目 受講者 得点 国語 A 90 国語 B 80 算数 A 95 算数 B 90 理科 A 80 科 目 国 語 算 数 理 科 元データ 教室 101 201 301 直積を行う d1, テーブルの d3 オブジェク ト名 行いたいこと 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

16.

9-3 並べ替え(ソート) 16

17.

並べ替え(ソート)の例 科目 受講者 国語 A 国語 B 算数 A 算数 B 理科 A 得点 90 80 95 90 80 得点で昇順 並べ替え(ソート)前 データを一定の規則で並べ替え. 並べ替えは行単位 得点で降順 17

18.

並べ替え(ソート) • データを一定の規則(昇順または降順)で並べ替え • 並べ替えはレコード単位 • 並べ替えの結果、新しいテーブルができる • 並べ替え時に、「キーとなるフィールド名」と「順 序(昇順または降順) 」を設定する必要がある 科目 受講者 得点 国語 A 90 国語 B 80 算数 A 95 算数 B 90 理科 A 80 並べ替え前 得点で昇順 18

19.

昇順での並べ替え(ソート) 並べ替え(ソート)を行う テーブルのオブジェクト名 キー d1 順序 昇順 得点 library(dplyr) d1 <- data_frame( 科目=c("国語", "国語", "算数", "算数", "理科"), 受講者=c("A", "B", "A", "B", "A"), 得点=c(90, 80, 95, 90, 80) ) d1 %>% arrange(得点) 19

20.

降順での並べ替え(ソート) 並べ替え(ソート)を行う テーブルのオブジェクト名 キー 順序 d1 得点 降順 library(dplyr) d1 <- data_frame( 科目=c("国語", "国語", "算数", "算数", "理科"), 受講者=c("A", "B", "A", "B", "A"), 得点=c(90, 80, 95, 90, 80) ) d1 %>% arrange(desc(得点)) 20

21.

複数フィールドでの並べ替え(ソート) 並べ替え(ソート)を行う テーブルのオブジェクト名 キー d1 順序 得点は降順 受講者は昇順 得点, 受講者 library(dplyr) d1 <- data_frame( 科目=c("国語", "国語", "算数", "算数", "理科"), 受講者=c("A", "B", "A", "B", "A"), 得点=c(90, 80, 95, 90, 80) ) d1 %>% arrange(desc(得点), 受講者) 21

22.

9-4 集約 22

23.

集約の例 科目 受講者 国語 A 国語 B 算数 A 算数 B 理科 A 得点 90 80 95 90 80 Aさんは 3科目 Bさんは 2科目受講した A B 3 2 集約の例 元データ 23

24.

集約で求めるもの グループごとに、頻度や要約統計量を求める • 頻度(数え上げ) 種類ごとの数え上げ • 要約統計量 平均 (mean)、標準偏差 (sd)、分散 (var) 中央値 (median)、四分位点 (quantile)、 最大値 (max)、最小値 (min) 24

25.

集約では、グループの基準もいろいろ グループの基準が 受講者 科目 受講者 国語 A 国語 B 算数 A 算数 B 理科 A 元データ 得点 90 80 95 90 80 A B 88.33333 85 得点の平均 グループの基準が 科目 国語 85 算数 92.5 得点の平均 理科 80 集約の例 25

26.

集約の例 ① d1 %>% group_by(科目) %>% summarise(n()) ② d1 %>% group_by(受講者) %>% summarise(mean(得点)) ③ d1 %>% group_by(科目) %>% summarise(mean(得点)) 国語 算数 理科 A B 国語 算数 理科 2 2 1 データの個数 88.33333 85 85 92.5 80 得点の合計 得点の平均 •26

27.

集約 ① 科目 受講者 得点 国語 A 90 国語 B 80 算数 A 95 算数 B 90 理科 A 80 成績 集約を行う 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(得点)) 27

28.

集約 ② 科目 受講者 得点 国語 A 90 国語 B 80 算数 A 95 算数 B 90 理科 A 80 成績 集約を行う 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

29.

ピボットテーブル(クロス集約表)の例 女性 元データ 男性 済 1 2 未 1 2 ピボットテーブル (クロス集約表)の例 29

30.

ピボットテーブル(クロス集計表) 集約を行う テーブルの オブジェク ト名 グループの 基準 d4 性別, 申 し込み ※ 結果は縦長形式 (long-format) library(dplyr) d4 <- data_frame( 名前=c("A", "B", "C", "D", "E", "F"), 性別=c("男性", "男性", "女性", "女性", "男性", "男性"), 申し込み=c("済", "未", "済", "未", "済", "未") ) d4 %>% group_by(性別, 申し込み) %>% summarise(count=n()) 30

31.

ピボットテーブル(クロス集計表) 集約を行う テーブルの オブジェク ト名 グループの 基準 d4 性別, 申 し込み ※ 結果は横長形式 (wide-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

32.

9-5 演算の組み合わせ 32

33.

演算の組み合わせの例 科目 受講者 国語 A 国語 B 算数 A 算数 B 理科 A 得点 90 80 95 90 80 成績テーブル (オブジェクト名は d1) 科目 国語 算数 理科 教室 101 201 301 部屋テーブル (オブジェクト名は d3) d1 %>% filter(得点 >= 90) %>% select(科目, 受講者) 選択+射影 d3 %>% filter(教室 == 101) %>% inner_join(d1) %>% select(受講者) 選択+結合+射影 d1 %>% group_by(科目) %>% summarise(Mean=mean(得点)) %>% filter(Mean >= 85) 集約+選択 33