RでTALIS2018〈その2〉

OECDが行なった国際教員指導環境調査(TALIS2018)を,統計処理環境Rで遊んで?みようという試み「RでTALIS2018」の〈その2〉です。〈その1〉はこちら

なお,厳密に処理した結果を参照したい場合は『教員環境の国際比較 OECD国際教員指導環境調査(TALIS)2018報告書 学び続ける教員と校長』(ぎょうせい)を当たってください。ここで公開する処理は,無回答処理が面倒くさいのでばっさり削ぎ落としています。本来ならば,そんな乱暴な処理をしてはいけません。

さて,せっかく集計処理用データがOECDで公開されているので,それを自分たちでグラフ化できたら面白いのに…という思い付きから始まっているのが「RでTALIS2018」です。

TALIS 2018 Data
http://www.oecd.org/education/talis/talis-2018-data.htm

しかし,これを日本語化するには,いろんな翻訳対応データの作成が必要となり,ハードルとなっていました。残念ながら待っていても誰も作ってくれないので,力技で用意してみたわけです。

ATGINTT3 質問文データ
http://www.edufolder.jp/files/talis2018/ATGINTT3_Q.csv

ATGINTT3 回答選択肢データ
http://www.edufolder.jp/files/talis2018/ATGINTT3_A.csv

国別コードと国名データ
http://www.edufolder.jp/files/talis2018/ISO3166.csv

前回は用意できていなかった回答選択肢のデータも作成したので,今回のRスクリプトを実行すれば日本語化されたグラフを出力することができます。

talis2018_base.R
http://www.edufolder.jp/files/talis2018/talis2018_base.R

talis2018_script.R
http://www.edufolder.jp/files/talis2018/talis2018_script.R

以上が,今回のTALIS2018日本語グラフ作成スクリプトです。

使い方は…

  1. 関係ファイルをダウンロードしておき,フォルダに用意する。
  2. talis2018_base.Rを実行する(多少警告メッセージが出るかも知れない)
  3. talis2018_script.R内の「質問番号」「表示順」「言語」を設定する
  4. talis2018_script.Rを実行する
  5. 「Plots」ウインドウにグラフが描画される

となります。RStudioを利用することなどは〈その1〉で紹介済みです。

 —

英語の問題文と選択肢はダウンロードされたデータにもともと含まれているので,それを取り出して日本語翻訳する方法もあるし,その方がエレガントなようにも思いました。

しかし,実際には同じ回答英文でも質問によって日本語翻訳が変わってくるものもあり,結局はPISA2015の際と同様に羅列型の翻訳対応データを力技で作成する結果となりました。

質問文の整形部分も,冗長な部分を整理したかったのですが,結果的にはそのままとしました。

今回,TALIS2018のグラフ化はできたものの,校長質問結果や国内用データまでは手が回っていないため,まだデータ見比べの楽しさまで到達できていませんが,またの機会にやってみたいと思います。

RでTALIS2018

2019年6月19日にTALIS(国際教員指導環境調査)2018年調査結果が公表されました。

TALIS - The OECD Teaching and Learning International Survey (OECD)
http://www.oecd.org/education/talis/


「OECD国際教員指導環境調査(TALIS)2018調査結果」(文部科学省)
http://www.mext.go.jp/b_menu/toukei/data/Others/1349189.htm


「OECD 国際教員指導環境調査(TALIS) 2018年報告書について」(国立教育政策研究所)
https://www.nier.go.jp/kenkyukikaku/talis/index.html


『教員環境の国際比較 OECD国際教員指導環境調査(TALIS)2018報告書 学び続ける教員と校長』(ぎょうせい)
https://shop.gyosei.jp/products/detail/10041

調査結果についての概要や分析は,上記のサイトから資料や報告書を入手していただくとして,今回はOECDが提供している調査回答データをRで利用しようというのが本題。以前,PISA2015で挑戦したことをTALIS2018でもやってみようということになります。(RでPISA2015RでPISA2015〈その2〉RでPISA2015〈グラフ〉

OECDのTALIS 2018サイトで公開されているデータはこちら

TALIS 2018 Data
http://www.oecd.org/education/talis/talis-2018-data.htm

それぞれの統計処理パッケージ(SAS, SPSS, STATA)用のデータが配布されています。とりあえずSPSS用のファイルをダウンロードします。

今回は「SPSS_international.zip」を先に覗いてみることにしましょう。

校長
ACGINTT3.sav(小学校) 
BCGINTT3.sav(中学校)
CCGINTT3.sav(高等学校)
教員
ATGINTT3.sav(小学校)
BTGINTT3.sav(中学校)
CTGINTT3.sav(高等学校)

どのファイルが何に該当するのか説明が添えられていないので,中身から判断します。

質問文を参照するためには質問紙データをダウンロードします。

TALIS 2018 questionnaires
http://www.oecd.org/education/school/talis2018questionnaires.htm

国立教育政策研究所で公開されている日本語版や各国の質問用紙は,OECDの国際版をベースに作成されているので問題番号の対応は自分で調べます。

とりあえず,小学校教員用質問紙「ATGINTT3」の問題番号と英語・日本語の質問文対応データを作成しましたのでこれを使います。それから国名も日本語の方がいいでしょう。

ATGINTT3 質問文データ
http://www.edufolder.jp/files/talis2018/ATGINTT3_Q.csv

国別コードと国名データ
http://www.edufolder.jp/files/talis2018/ISO3166.csv

小学校教員用質問紙「ATGINTT3」用のみですが,最低限必要なデータは揃いました。

本来ならば,質問項目に対応した回答項目データも作成して,回答も日本語で分かりやすく表示できるとよいのですが,データ作成の手間の問題なので,とりあえず後に回します。

さて,RとR Studioをインストールしておきます。これは以前のPISA2015での記録を参照してください。

今回も最初に一度読み込むための「talis2018_base.R」と質問グラフを生成する毎に実行する「talis2018_script.R」という2つのスクリプトファイルに分けて作成しました。

質問項目ごとに回答の数が異なるので,毎度修正しなければならないという課題は残っていますが,とりあえず動作すると思います。

「talis2018_base.R」

# talis2018_base.R
# For TALIS2018
# K.RIN
#

#ライブラリ読み込み
library(readr)
library(tidyverse)
library(plyr)
library(haven)

#データファイル読み込み
ATGINTT3 <- read_sav("ATGINTT3.sav")

question_items <- read_csv("ATGINTT3_Q.csv", col_names = TRUE, col_types = list(col_character(), col_character(), col_character()))

country_code <- read_csv("ISO3166.csv", col_names = TRUE, col_types = list(col_character(), col_character(), col_character(), col_character()))

「talis2018_script.R」

# talis2018_script.R
# For TALIS2018
# K.RIN
#
# ★設定項目(★マーク)
# ・質問ID(「selected_question = " "」の部分)
# ・表示順(「order_setting = 1」の部分)
# ・表示順の組合わせ(「mutate('list_order' = `1`)」の部分)

library(plyr)
library(tidyverse)

#★質問番号
selected_question = "TT3G55I"

#★表示順(降順1,昇順-1)
order_setting = 1

#ラベル
y_label <- "パーセント %"
x_label <- "国"
legend_label <- "回答"

#質問文データから質問番号に該当する質問文を抽出
if (is.na(question_items$ja[grep(selected_question, question_items$q_no, value = FALSE, fixed = FALSE)][[1]])) {
q_title <- paste("【", selected_question,"】")
} else { #質問文が空欄でなければ…
q_title <- paste("【", selected_question,"】", question_items$ja[grep(selected_question, question_items$q_no, value = FALSE, fixed = FALSE)][[1]])
}

#回答データ抽出
stu_tmp <- subset(ATGINTT3, ATGINTT3[[selected_question]] != "NaN") #無回答を除く(質問してない国もあるため)
data_ans <- table(stu_tmp[["CNTRY"]],stu_tmp[[selected_question]]) #質問番号のデータを抽出

ans_df <- as_tibble(data_ans,validate = FALSE) #df(データフレーム)へ変換
colnames(ans_df) <- c("CNT", "answer", "count") #dfの列ラベル設定
ans_wide <- spread(ans_df, answer, count) #横長dfへ変換

#行番号をデータに変換して列として追加
#★グラフ表示順を決める回答項目の数値合計を列として追加[ +`2`+`3`+`4`+`5`]
ans_wide <- ans_wide %>% rownames_to_column('num') %>% mutate('list_order' = `2` + `3`)

#num列の数字を文字から数値にモード変換
mode(ans_wide$num) <- "integer"
typeof(ans_wide$num)

#国コードをもとに国名をcountry_name列として追加
ans_wide <- ddply(ans_wide, "CNT", transform, country_name = country_code$Name_ja[grep(CNT, country_code$Alpha3)])
#列ラベルの設定
colnames(ans_wide) <- c("num", "CNT", "1", "2", "3", "list_order", "country_name") #※回答項目3つの場合(, "4")

#縦長dfに変換
ans_df <- gather(ans_wide, answer,count,-num,-CNT,-list_order,-country_name)

#国コードと回答で並べ替え
ans_df <- arrange(ans_df, desc(CNT), desc(answer))

#パーセント計算(描画計算用パーセント)
ans_df <- ddply(ans_df, "CNT", transform, percent = count / sum(count) * 100, 0.1)
#小数点以下1桁処理(表示用パーセント)
country_ans <- ddply(ans_df, "CNT", transform, percent_rounded = round_any(count / sum(count) * 100, 0.1))
#数値合計した分のパーセント数値を計算(表示順序用パーセント)
country_ans <- ddply(country_ans, "CNT", transform, list_percent_order = round_any(list_order / sum(count) * 100 * order_setting, 0.1))


#ラベル位置計算
country_ans <- ddply(country_ans, "CNT", transform, percent_label_y = cumsum(percent)-0.5*percent)

#フォント準備(Mac用)
#
quartzFonts(HiraKaku = quartzFont(rep("HiraginoSans-W3", 4)))
par(family = "HiraKaku")

#グラフ描画準備
#
graph <- ggplot(country_ans, aes(x = reorder(country_name, list_percent_order), y = percent, fill = answer)) + 
ggtitle(sprintf("%s", q_title)) + #タイトル
ylab(y_label) + #国ラベル
xlab(x_label) + #パーセントラベル
coord_flip(expand = FALSE) + 
geom_bar(stat = "identity", position='stack') + 
geom_text(aes(y = percent_label_y, 
label = paste(format(percent_rounded, nsmall = 1),"")), color = "white", size = 4) + #データラベル
scale_y_reverse(breaks = c(100.0,75.0,50.0,25.0,0.0), 
labels = c("0%","25%","50%","75%","100%")) + #横軸
scale_color_manual(values = rainbow(7)) + #カラー
theme_bw() + 
theme(plot.margin = margin(1, 1, 1, 1, "cm"),
plot.title = element_text(family = "HiraKaku", size = 10), 
plot.caption = element_text(family = "HiraKaku", size = 10),
legend.title = element_text(family = "HiraKaku", size = 10), 
legend.text = element_text(family = "HiraKaku", size = 7), 
axis.title = element_text(family = "HiraKaku", size = 9), 
axis.title.y = element_text(angle = 0, vjust = 0.5), 
axis.text.x = element_text(family = "HiraKaku", size = 9), 
axis.text.y = element_text(family = "HiraKaku", size = 10))

print(graph) #グラフ描画

以上で「Plots」ウインドウにグラフが描画されると思います。

また詳細は〈その2〉を予定しています。

Scratchで数字表示

Scratchのサンプルプログラムを作成しています。

その際,変数に入れた数値や文字を大きく表示したい場面が出てきます。

変数の内容を確認するためだけなら,Scratchでこんな感じの表示ができます。

20190601 123456c

しかし,これだとあまりに小さい。吹き出しに表示する方法も控えめな大きさです。

願わくは,もっと大きく表示したい。たとえばこんな感じ…

20190601 123456

Scratchプログラムを教室のスクリーンに提示する際,ありそうなニーズのように思えます。

ところが,Scratchでこのようなことをするのは意外と難しいのです。

似たような表示をさせるだけならこんな感じで6つの数字スプライトを用意して並べる方法があり得ます。変数から数字を読み取って必要な数字スプライト(そのコスチューム)を用意するといった仕組みです。

20190601 123456a

しかし,この方法には問題が残ります。

たとえば,表示できる数字が6桁縛りになることです。

6桁もいらない数字のときや,6桁よりも大きな数字を表示したいときには,そういう場合に対応するための準備やプログラムが必要になります。

そもそも,桁数分だけのスプライトを用意しなければならないことも面倒です。

そこで他に方法がないかを調べてみたところ,スタンプ機能を使った方法が紹介されていました。

「【Scratch】数字を表示するスプライト」(コドモとアプリ)
https://studio.beatnix.co.jp/kids-it/kids-programming/scratch/scratch-material/scratch-label/

望む位置合わせに応じたスプライトが用意され,好きな桁数の数字を好きな大きさを指定して表示できるので,大変便利なサンプルです。用意されているフォントもオーソドックスなので使いやすいかも知れません。

このサンプルでほぼ解決!ともいえるのですが,ペン拡張機能のスタンプ機能を利用しているため,数字を消去しようとするとペンで描かれたもの(たとえば図形)が一緒に消えてしまうという弱点があります。

算数教材を作成しているときには,このような弱点が大変困る場合もあるわけです。

というわけで,スタンプ機能を使わずにスプライトをクローンする方法で作ってみました。

20190601 123456b

数字表示 - スプライトクローンによる数値表示
https://scratch.mit.edu/projects/314069120/

ご覧のように一つのスプライトと,あとは数字のための変数を用意するだけ。(ネコはおまけです)

文字のデザインはScratchに標準で付いているものを利用していますが,必要であれば自分でデザインし直してもらえれば,どんな文字デザインでも応用できるのはスタンプ方式と違いはありません。

変数とメッセージ(broadcast)で呼び出すため,複製して複数の数字を表示したい場合はメッセージを異なるものに設定し直す必要はあります。

数字ではなくて数式を表示したい場合も出てくるので,別に「式表示」プログラムも作りました。

式表示
https://scratch.mit.edu/projects/314409226/

さて,これらを使ってサンプルプログラム作りに励むことにします。

PaSoRich – ICカードリーダーをScratch3.0で

グラフィカルなプログラミング環境であるScratch

2019年に3.0へと移行し,HTML5対応Webブラウザのみでも利用できるようになりました。

Scratch 3.0には「拡張機能」を追加する仕組みがあり,ブロックを増やすだけでなく,外部機器を制御できるようになっています。たとえば「micro:bit」や「LEGO Education WeDo 2.0」といったものです。

Scratch 3.0自体がリリースされて間もないため,拡張機能は限られたものが提供されている段階です。いずれ様々な拡張機能が登場したり,ユーザーが作ったものを申し込みで追加できるようになると思います。

今回,Scratch 3.0の拡張機能としてICカードリーダーを扱えるように作業してみました。

量販店で最も入手しやすいICカードリーダーの1つであるソニー社「PaSoRi」パソリをScratch 3.0で利用するための拡張機能「PaSoRich」パソリッチです。

PaSoRi with Scratch 3.0
https://con3office.github.io/pasorich/

これを利用するとICカードの識別番号を読み取ることが出来ます!

Pasorich2019

簡単なデモプロジェクトでは,「s」キーでICカードを読み取って配列に識別番号を登録し,「スペース」キーでICカードを読み取って登録した識別番号に対応したセリフを表示します(デモなので3パターンだけ)。物理的なカードと画面上のステージを組み合わせたプログラムが組めるわけです。

ICカードは,いま使っている会員カードや電子マネーカードが利用できます。使い切って家で眠っているもの,旅行先で利用したが持って帰って使ってないものも使えます。

つまり,カードを入手するのに大きな苦労はしない上,数を用意するのも難しくない。それでいて,識別番号という面白い特性が利用できるのです。

カード対戦ゲームを作ることから始まって,かざす果物カードによって果物が表示されていく提示教材とか,宝探しで見つけ出したヒントカードをかざすと次なるヒントが音声で流れてくるとか,児童生徒カードと先生カードとの組み合わせでいろんな記録システムを作成するといったことも可能です。

ちょっと面白そうでしょ?

(追記)

試す環境を構築するのも大変なので,デモサイトを用意してみました。

Scratch 3.0 GUI with PaSoRich
https://con3office.github.io/scratch-gui/

Windows環境の方はICカードリーダーが認識されないことがあります。以下のZadigという汎用USBドライバをインストールすると認識することもあるようです。Windowsユーザーの方はお試しください。

Zadig - USB driver installation made easy
https://zadig.akeo.ie/

(追記ここまで)

でも残念ながら,いまのところこの拡張機能を使うのはとても難しいです。

第1に,ICカードリーダーが必要です。ソニー社のパソリという製品のみ対応です。

第2に,ChromeというWebブラウザのみ対応です。

第3に,冒頭で説明した理由のため正式なScratch 3.0では利用できません。

第4に,技術的理由で,ネットを介した環境では利用できません。
(これはHTTPS通信なら大丈夫だったようです)

へ?それではどうやって使うのか?

自分のコンピュータに自分専用のローカルなScratchをつくって,そこで利用するしかありません。(もしくはデモサイトをどうぞ。)

PaSoRichを追加したローカルなScratch環境を構築するのです。

以下が手順です。

  1. コンピュータに「Node.js」と「Git」というソフトウェアをインストールする
  2. GitHubサイトにあるScratchの大元ソフトウェアをコンピュータにコピーする
  3. 2.をするときは,あらかじめPaSoRichを追加したバージョンを選んでコピーする。
  4. コピーしたScratchの準備を整え,scratch-guiを(「npm start」で)動かす
  5. Webブラウザで http://localhost:8601(または http://0.0.0.0:8601 )をアクセスする
  6. ローカルなScratchが使い始められるのでPaSoRichの拡張機能を追加する。

以上です。

PaSoRichを組み込んだ「scratch-vm」と「scratch-gui」のGitHubリポジトリは以下の通りです。

https://github.com/con3office/scratch-vm

https://github.com/con3office/scratch-gui

これを以下のページの説明のように作業を進めることでローカルなScratchを構築できます。(アドレスを置き換えて入力します。)

Scratch 3.0の拡張機能を作ってみよう/下準備

ぜひ挑戦してみてください。

(追記)

動作条件が厳しく,動かないケースが多いと思われます。まさに挑戦して確かめてください。

[参考情報]Web USBでPaSoRiを扱えるOSをまとめてみた

プログラミング教育? 前提からの理解

林向達「プログラミング教育? 前提からの理解」(20190404)

同じ学園に属する小学校に校内研修の講師として呼ばれました。

プログラミング教育について話して欲しいというご依頼でしたので,手際よくご紹介するためのスライドを作りました。文部科学省が進めている方向性を前向きに解釈しつつ,論理的思考に関しては「演繹」「帰納」「仮説形成」の3つで考える提案を盛り込んだものとなりました。

作成者である私の基本スタンスは,プログラミングよりもコンピューティング(コンピュータ技術が関わる領域)を学ぶ方向に発展することです。

そのため,このスライドで,プログラミング教育なら万事OKであると伝えたいわけではありません。それは「プログラミング的思考」なる言葉を参考資料内の引用部分以外使っていないことでも表しているつもりです。

それでも,実際の小学校の先生たちのシチュエーションに寄り添えば,学習指導要領やその周辺がプログラミング教育として推進しようとしている動きを無視して何かを語っても,現場の取り組みを後ろ立ててくれるものにならないと感じるだけです。

今回のスライドが「プログラミング教育」をフォーカスしているのは,想定している聴衆がそうした文脈を入り口にいま起こっていることを学ぼうとしているからにすぎません。

その上で,「プログラミング的思考」という言葉を殺しながら,この文脈で目指したい論理的思考を踏み台にして,「コンピューティング」という捉え方へとつなげていく「プログラミング」活動を模索するというのが私が選択している道筋です。

このスライドが,頭でっかちに受け取られてしまうのも,その辺の面倒くさい気の回し方が鼻についてしまうからかも知れません。

このスライドを再利用されることについて,特に制限はありません。学習や研修,研究において役立てていただけるのであれば,ご自由にシェアしてください。

平場で,いろんな議論が起こることを望んでいます。