Giroptic iO 届く

360度撮影カメラモジュール「Giroptic iO」が届きました!

開封の様子…

すでに新しいファームウェアが登場しているので最初にアップデートを促されますが、カメラモジュールの充電量が足りないのでお預け。このあと準備ができ次第試してみます。

でも、こうしてiPadでも使えるというのは、Insta 360 nanoにはできない、このカメラの強みですね。しかもカメラモジュール自体で自立するので、ちょっと外して置くときに便利です。

使用報告は後日します。

RでPISA2015〈その2〉

RでPISA2015」というエントリーで、いくつかのWeb記事に触発されて、OECDという国際機関が3年間隔で行なっている国際学力調査「PISA」の2015年実施データを、統計向けプログラミング言語「R」を使って触り始めたことを書きました。

R言語の基礎知識が無いまま、サンプルを見様見真似でデータファイルの読み込みからグラフの描画までやってみましたが、まだまだ未完成状態でした。

その後、R言語のリファレンス書籍を購入した上で、さらにプログラムを修正し、思い描いていたグラフを一通り描けるところまで辿り着きました。

PISA2015_IC013Q12NAのグラフ

作成中気になっていたことの一つとして、PISA2015データを日本語で扱うための情報が、明石書店発行のPISA正規報告書(有償)しかないことがあります。

PISA2015関連の情報については、「PISA2015関連」(ICTのある学び)にまとめておきましたが、日本語版を作成して調査協力をした国立教育政策研究所のWebページでさえ報道機関向けレベルの公表資料が掲載されているだけで、PISAに関する正規の日本語情報は明石書店が契約して発行している日本語版報告書くらいしかありません。

そのため、背景指標を得る質問調査(ICT活用調査を含む)の日本語は、販売されている報告書を手に入れないと知ることができません。いくつかのWeb記事で分析・紹介されている調査結果の質問や回答の文章は、OECDがWebサイトで無償公開している英語版報告書を各自で翻訳している状態です。

PISAの趣旨や目的からすれば、調査結果をもとに各国の教育政策に関する議論が様々に誘発されることが大事であるにも関わらず、日本の場合、どうしても日本語要約された報道発表範囲の限られた話題しか扱われず、それ以外は英語原文か有償の日本語版報告書を得なければならない壁があります。

今回のように調査の生データを処理して視覚化する際も、質問文や回答選択肢文を日本語で表示した方が圧倒的に理解がしやすいわけですが、そのためのリソースはネット上に存在しません。

日本語によるPISA調査作業量の大変さとそれを担われている関係者の労力には敬意を持ちますし、それを踏まえて発行される日本語報告書が有償販売されることは理解できます。ただ、もう少し社会的な議論が進むよう無償部分の情報流通量を増やす努力も必要かなと思います。

少なくとも調査データを自前で処理する際に使えるリソースは欲しいものです。

そこで、プログラム処理する際に使えるようPISA2015における「国別コードと国名」「ICT活用調査の質問文」「ICT活用調査の回答選択肢文」をcsvファイルにしておきました。

国別コードと国名
(csv)http://www.edufolder.jp/files/pisa2015/ISO3166_pisa.csv
(xlsx)http://www.edufolder.jp/files/pisa2015/ISO3166_pisa.xlsx
ICT活用調査の質問文
(csv)http://www.edufolder.jp/files/pisa2015/pisa2015_ICT_Familiarity_Questionnaire.csv
(xlsx)http://www.edufolder.jp/files/pisa2015/pisa2015_ICT_Familiarity_Questionnaire.xlsx
ICT活用調査の回答選択肢文
(csv)http://www.edufolder.jp/files/pisa2015/pisa2015_ICT_Familiarity_Questionnaire_answercode.csv
(xlsx)http://www.edufolder.jp/files/pisa2015/pisa2015_ICT_Familiarity_Questionnaire_answercode.xlsx

(csv形式の方は)UTF-8コードで日本語も含めてありますので、英文と日本文を切り替えて利用するのにも便利です。データ構造の解説は今回省略します(ごめんなさい)。

(修正20170116:「〜」を「-」に修正し,xlsx形式も用意しました。)

ちなみに,OECDが用意しているコード表は「Codebooks for the main files」としてダウンロードページに用意されています。これの日本語版があったらいいのになという感じです。

上記のデータファイルを利用したプログラムを作成してみました。質問番号(と表示順序)を設定したら半自動でグラフが出力されるところまで動くようになったと思います。

設定した質問についてグラフ化するR言語ソースコードは以下が現在の進捗です。今回はファイルやライブラリの読み込み(Base部分)と質問ごとに集計してグラフ描画する部分(ICT部分)を分けてみました。Base部分は最初の一回だけ実行すれば、あとは読込み済みのデータで処理できます。

(追記20170114:macOSでの導入を前提としたスクリプトのため,Windows等の他環境では,日本語フォント指定の部分等について改変する必要あり。)

# For PISA2015 Base (※最新のものが下方のリンクに有り)
# K.RIN

library(readr)
library(haven)
library(ggplot2)
library(plyr)
library(tidyverse)

question_items <- read_csv("pisa2015_ICT_Familiarity_Questionnaire.csv", col_names = TRUE, col_types = list(col_character(), col_character(), col_character()))
answer_items <- read_csv("pisa2015_ICT_Familiarity_Questionnaire_answercode.csv", col_names = TRUE, col_types = list(.default = col_character(), items_count = col_character()))
country_code <- read_csv("ISO3166_pisa.csv", col_names = TRUE, col_types = list(col_character(), col_character(), col_character(), col_character()))

student_raw <- read_sav("Cy6_ms_cmb_stu_qqq.sav")
school_raw <- read_sav("Cy6_ms_cmb_sch_qqq.sav")

pisa2015_base.R (←こちらの方が最新版)

# For PISA2015 ICT (※最新のものが下方のリンクに有り)
# K.RIN
#
# ★設定項目
# ・質問ID(「selected_question = " "」の部分)
# ・表示順序の組合わせ(「mutate('list_order' = `1`)」の部分)

#★質問番号
selected_question = "IC010Q09NA"
selected_question_big = substring(selected_question, 1,5)

#質問文読込
q_title <- paste(question_items$questions_ja[grep(selected_question_big, question_items$questions_no, value = FALSE, fixed = FALSE)][[1]])

#質問文整形
q_width = 39
q_title_disp <- character()
q_title_length <- nchar(q_title)
for(i in 1:q_title_length%/%q_width+1) {
 q_title_disp[i] <- paste(substring(q_title, ((i-1)*q_width+1), ((i-1)*q_width+1)+(q_width-1)), '\n')
}
q_title_disp[i+1] <- paste("\n", selected_question,"\n", question_items$questions_ja[grep(selected_question, question_items$questions_no)])
q_title_all <- paste(q_title_disp, collapse="")

#回答選択肢読込
ans_item_count <- as.integer(answer_items$items_count[grep(selected_question, answer_items$questions_no)])
ans_item_colcount <- as.integer(answer_items$items_count[grep(selected_question_big, answer_items$questions_no)][1])

#回答選択肢設定
ans_limits <- as.character(answer_items[grep(selected_question_big, answer_items$questions_no),][1,3:sum(ans_item_count+2)])
ans_labels <- as.character(answer_items[grep(selected_question, answer_items$questions_no),][1,sum(ans_item_colcount+3):sum(ans_item_colcount+ans_item_count+2)])

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

#回答データ抽出
stu_tmp <- subset(student_raw, student_raw[[selected_question]] != "NaN")
#scl_tmp <- subset(school_raw, school_raw$[[selected_question]] != "NaN")
country_ans_table <- table(stu_tmp[["CNT"]],stu_tmp[[selected_question]])

#縦長dfへ変換
country_ans_long <- as_tibble(country_ans_table,validate = FALSE)
colnames(country_ans_long) <- c("CNT", "answer", "count")
#横長df版クロス表
country_ans_wide <- spread(country_ans_long, answer, count)

#★表示順序用対象項目設定(回答の場合) `1`+`2`
country_ans_wide <- country_ans_wide %>% rownames_to_column('num') %>% mutate('list_order' = `1`)

#文字から数値にモード変換
mode(country_ans_wide$id) <- "integer"

#国名変換
country_ans_wide <- ddply(country_ans_wide, 'CNT', transform, country_name = country_code$Name_ja[grep(CNT, country_code$Alpha3)])

#表示順序用対処数値設定(ナンバリングの場合)
#country_ans_wide <- ddply(country_ans_wide, num, transform, list_order = num * -1)
#ラベルが"X1"などになった場合も想定して…
colnames(country_ans_wide) <- c("num", "CNT", ans_limits, "list_order", "country_name")

#国名付き縦長df
country_ans_long <- gather(country_ans_wide, answer,count,-num,-CNT,-list_order,-country_name)

#並べ替え
country_ans_long <- arrange(country_ans_long, desc(CNT), desc(answer))

#列名変更
colnames(country_ans_long) <- c("num", "CNT", "list_order","country_name","answer", "count")

#パーセント計算(描画計算用)
country_ict <- ddply(country_ans_long, "CNT", transform, percent = count / sum(count) * 100, 0.1)
#小数点以下1桁処理(表示用)
country_ict <- ddply(country_ict, "CNT", transform, percent_rounded = round_any(count / sum(count) * 100, 0.1))

#リスト順序(パーセント計算)
country_ict <- ddply(country_ict, "CNT", transform, list_percent_order = round_any(list_order / sum(count) * 100, 0.1))

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

country_ict <- arrange(country_ict, CNT, desc(answer))

#フォントファミリー設定(macOS用)
quartzFonts(HiraKaku = quartzFont(rep("HiraginoSans-W3", 4)))
par(family = "HiraKaku")

#グラフ描画
graph <- ggplot(country_ict, aes(x = reorder(country_name, list_percent_order), y = percent, fill = factor(answer))) + 
 ggtitle(sprintf("%s", q_title_all)) + 
 ylab(y_label) + 
 xlab(x_label) + 
 labs(fill = legend_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 = 3) + 
 scale_y_reverse(breaks = c(100.0,75.0,50.0,25.0,0.0), 
 labels = c("0%","25%","50%","75%","100%")) + 
 scale_fill_discrete(limits = ans_limits, labels = ans_labels) + 
 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)

#ggsave("pisa2015_graph.png", graph)

pisa2015_ict.R (←こちらの方が最新版)

紅白歌合戦2016

明けましておめでとうございます。徳島文理大学の林向達です。今年は研究室ブログをもう少し緩く使って更新機会を増やそうと思います。というわけで、今回は昨年末の紅白歌合戦について。

この年末年始も帰省して、実家で過ごしていますが、大晦日の夜は特別なことがない限りテレビをつけています。そして、あれこれ迷いつつも、やはりNHK紅白歌合戦を映してます。

今回の紅白については、たとえば産経新聞がこんな記事を書いています。

「【紅白回顧】「謎の演出」「?」の連続だった第67回NHK紅白歌合戦 これでいいのか、国民的番組」(産経ニュース)

最後の勝敗結果も意外だったということや、随時行なっていたネット投票は意味が無かったのではないかということに批判的な声もあるようです。

私個人の感想は、今回の紅白には実験的な演出が散りばめられていて制作者の皆さん頑張ったな、というものです。もちろん不発ネタもたくさんあったと思います。

たぶんですが、今回の番組構成や内容は、狙って実験的だったというよりは、様々な条件上、そうせざるを得なかった結果なのだと思います。

紅白全体の構成については、あのグループが出演するのかしないのかがギリギリまで読めないことを想定して、かなり柔軟に変更できるようにしなければなりません。

それでいて、詰め込まなければならない要素には、それぞれ独自の調子や雰囲気を持ったものが多く(タモリ、マツコ、シン・ゴジラ、PPAP、恋ダンス等)、これらを活かしながら束ねるのはなかなか難しい話だったと思います。

願わくは全体を通して見て欲しいという制作者側の思いを下敷きに番組を具現化した時、一つのネタやってハイ次っ!ではなく、おそらく今回のように、いろいろな要素を同時並行させて進行する道を選んだのだと思います。

視聴者によるネット投票を毎回の合戦ごとに行なう方式にしたのも、リアルタイムに楽しんでもらおうという意図からだったと思います。

ただ、苦肉ながらも取り組んだこうした試みは、かなり綱渡り的なところも多かったと思います。

同時進行しているネタを細切れにして見せていくためには、お互いの絡み合いをうまく制御しないといけません。何事もなかったかのように振る舞うことでシチュエーション的な笑いを誘ったりすることもあれば、伏線を張るためにわざとらしい演技も必要とされました。リハーサルを繰り返されたのだろうとはいえ、極めてデリケートな積み木だったと思います。シュールだったという評価はそういう演出から来ているのだと思います。

ネット投票が最終得点に加えられなかったのは、不特定多数からの投票で懸念される一部の暴走投票を恐れたからではないかと思います。不正な方法を使って勝敗を左右されてないための選択だったのでしょうし、おそらく、制作者側としては、ネット投票の傾向と会場審査員やゲスト審査員の投票傾向は似ているはずなので、それほど問題ないだろうと思っていたのではないかと推察します。

けれども、現実にはネット投票の進捗とは裏腹な最終結果が出てしまい、制作者側も「やってしまった」と焦ったのだろうと思います。きっと、番組進行中に白組優勢の途中集計結果を見てしまえたことで、ゲスト審査員がバランスを取ろうと紅組に入れた投票が、最終結果に反映されたというのが真相じゃないかと思います。ネット投票や会場審査員の得票との重み関係(ボールの数等)をもっとよく説明しておくべきだったのでしょう。

思うに、今回の紅白歌合戦は、全体を成立させるために頑張って制作されたものの、それがゆえに番組がいったん始まってしまうと、途中乗車するのが難しくなったのだと思います。

こんなことを書いた私自身も、番組を見始めたのは開始後30分ぐらい経過して、iPadで昨年インストール済みの紅白アプリを起動してから、「あ、始まってるのか」と気づいて、なんとなくチャンネルを合わせてからです。つまり、投票システムの説明も、ふるさと審査員の件等も分からないまま途中から視聴を始めました。

やはり最初は訳がわからなかったし、差し挟まれる小ネタの扱い方が雑にも見えたし、「?」なところはありました。今回はどんな演出で番組制作しているんだろうという見方をしなければ、楽しむには至らなかったかもしれません。

長く続いている番組をさらに続けることの難しさを改めて感じましたが、昨年末はいろいろな条件を抱え、実験的であったとしても、その挑戦の成果としてはまずまずだったのではないか。むしろ、番組としてちゃんとやり遂げられたことを考えれば、製作者や関係者の努力は素晴らしかったと思います。

今年1年

2016年もお世話になりました。

ブログの更新が滞りがちになったのは残念でしたが,2016年も本当にいろいろありました。

1月に予想していた「教育とオープンデータ」の波のようなものは,残念ながら今年やって来ませんでしたが,大事なトピックスであり続けるとは思います。

360度カメラに関しては,VRが世間的にも注目を集め始めた年でしたので,徐々に盛り上がってきているのは確かです。Insta360 nanoの登場で,iPhone経由の共有もかなり手軽になりました。まだプラットフォーム側の対応が追いついていないという感じですので,これも今後少しずつ充実すると思います。

2月は昨年度から参加しているICT活用教育アドバイザー事業の仕事や,職場で担当している実習訪問などこなしていました。

というよりも,この1〜3月は「研究室のお引っ越し」という一大イベントが進行していて,外部仕事がない限りは,ひたすら研究室の掃除と荷物整理と梱包をしていました。とにかく体力勝負の日々だったと思います。運搬はプロの運送業者がやってくれましたが,梱包と開封と研究室の整理は一人でコツコツと。なんとか引っ越しができたわけですが,それ以外は何もできなかった年度末でした。

3月は,そういうわけでお引っ越し作業。

4月は,新しい研究室で始動したわけですが,職場での担当が新しい入学生の担任となり,新1年生達のサポートをする日々でした。引っ越したばかりで,あらゆる仕事の段取りが停滞気味。授業の方も自転車操業的な感じでした。そういう事情はお構いなしに厄介事も降ってくるし,とにかく慌ただしく始まった新年度でした。

5〜6月は,外部からの依頼仕事や出張も賑やかで,一段と落ち着きがない期間でした。「Get Active」という文献の翻訳作業も同時進行。これがなかなか作業に集中できず,相変わらず周りに迷惑をかけました。

7月には,高松でセミナー,教育と情報の歴史研究会,滋賀県への出張,鳴門教育大学での非常勤講師,日本教育工学会のワークショップ,前期試験,関西教育ICT展への参加,教員免許更新講習の担当などなど,準備が必要なものばかりなのに準備する余裕のない日々が続き,眩暈が…。

8月は,とうとう国外脱出です。とても久し振りに米国へ渡航しました。妹家族が住むアリゾナ州へ。実家の両親のお供でしたが,強制休暇です。

米国では,家で過ごすか,モールへ出かけてApple Storeでお買い物するかだけでしたが,米国の空気や雰囲気を直接感じられたのはよかったです。大統領選挙の行方が今のようなことになるとは,その時は誰も予想だにしていなかったと思います。ただ,クリントン候補がかなり嫌われていたことは印象に残っています。

9〜10月は,ようやく通常運転が始まり,後期の授業開始。それとともに出張も11月も含めて出かける機会が多かったです。そうこうしているうちに12月になり,今に至るという感じでしょうか。

とにかく,研究室引っ越しという大きな出来事があって,そのまま年度が始まった慌ただしさで駆け抜けてしまった1年でした。自分で振り返ると,何もしなかったんだなぁという感じですが,たぶん丁寧に拾えば,何かしていたとは思います。それはまた時間があるときにゆっくりと整理を。

20160805 関西教育ICT展での講演

 慌ただしい夏の日に,大阪で行なわれた「関西教育ICT展」に出かけました。かつてフューチャースクール推進事業に関わったことがあったので,そのときのことを踏まえた話をして欲しいとご依頼を受けたからです。

 「過去〜現在〜近未来の教育とICT」と題したミニ講演は,東芝ブースのステージで1回だけ披露させていただきました。だいぶ前に流行ったバージョン番号表現を,実際の歴史的変遷に重ねたうえで教育の情報化水準として位置付け,それを手がかりに過去・現在・近未来をお話した次第です。

 

スライド中に出てくる図はこちらです。
http://ict.edufolder.jp/archives/758

 講演の中では小学校低学年の国語「おてがみ」(アーノルド・ローベル氏の『ふたりはともだち』に収録)という作品を扱った授業でのタブレットPC活用を紹介するとともに,講演全体のモチーフも現代のおてがみである「メール」を出すためにはアカウントが必要であるといった風に構成したものでした。

 教育の情報化水準でいえば,機器の整備はせいぜい2.x水準をうろついているに過ぎず,これらを本当に活用するためには個々人のアカウントを運用する必要があり,これをちゃんとやることが3.x水準なんだというお話です。

 すでに現実の生活では,あっちこっちに登録をして,1人何十アカウントを持っているというのは珍しくないこと。そうした状況に対応するための知識・技能を養うためにも,そもそも学校教育で個人アカウントを運用するということを考えてもよいのではないかと思うわけです。そうすることで逆説的には2.x水準の情報化にももっと様々な可能性が広がるのだろうと思います。