Faculty Development: where to start?

大学のFDアンケート結果を視覚化したら、「教員実施」関連の質問で低く見えるのは 「教員の板書(またはPPT・配布資料など)は読みやすかった(見やすかった)」

2018Koki Anketo Kekka with Question

「板書」と「PPT」と 「配布資料」はそろぞれ実施と評価が違う可能性があるのでもっと詳しく調べる価値があるかもしれない。 プレゼンや配布資料が課題のなら、情報デザインの能力開発を目指すばいいかもしれない。 Robin Williams Covers with LaTeX book by Okumura KatsuHiko

データ表から意味を取るのが難しいようですが、アンケート結果の視覚化するのが能力開発に繋げることができる。基礎プログラミングとデータ視覚化の授業を作ってから、いろいろな学生(または先生)が自らアンケートを作成と実施、分析できるようになるかもしれない。FDも参加型、 “Nothing About Us Without Us”の理念を行かして 大学の「民衆化」(fn:1) の時代に相応しい動きになります。

DrRacketで視覚化を試してみたい方がいるのなら、下にコードが貼ってある。

DrRacket Screenshot Anketo View pict pip-line comment

データ視覚化のコード

#lang racket

(define my-home (find-system-path 'home-dir))
(define learning-directory "Learning-Racket")
(define facdev-directory "FD")
;; ~/home-directory/Learning-Racket/FD"
(define data-file "DG-2018-2-Frequencies.csv")

(define Q-ja-file "SetsuMon.csv")
;; 出席,学生取組,私はこの授業によく出席した                                              
;; 発言,学生取組,私は授業内容について質問や発言した                                      
;; 取組,学生取組,私はこの科目に積極的に取り組んだ予習と復習した)                         
;; 聞取,教員実施,教員の声は聞き取りやすかった。                                          
;; 資料,教員実施,教員の板書(またはPPT・配布資料など)は読みやすかった(見やすかった)   
;; 時刻,教員実施,教員は授業の開始・終了の時刻を守ろうとしていた                          
;; 反応,教員実施,教員は学生の反応を確かめながら授業を進めていた                          
;; 熱意,教員実施,教員は熱意を持って授業をしていた                                        
;; 理解,総合評価,私はこの授業内容を理解できた                                            
;; 役立,総合評価,私はこの授業で学んだ内容はなんらかの形で将来的に役立つと感じた          
;; 満足,総合評価,私は総合的に判断してこの授業で満足が得られた

(define KaiTou-file "KaiTou.csv")
;; 5, 特に,特にそう思う
;; 4, 多少,多少そう思う
;; 3, どちも,どちらともいえない
;; 2, あまり,あまりそう思わない
;; 1, 全く,全くそう思わない

(define working-directory (build-path my-home learning-directory facdev-directory))
(current-directory-for-user working-directory)
(define data-path (build-path working-directory data-file))
(define get-data
  (lambda (pth)
    (let* ((inp (open-input-file pth))
           (lines (port->lines inp)))
      (close-input-port inp)
      (map (lambda (s) (string-split
                        (regexp-replace* "\"" s "")
                        ","))
          lines))))

(define fd-data (get-data data-path))
(define info-data (list (first fd-data) (second fd-data)))
(define data-labels (cddr fd-data))
(define questions-ja (get-data (build-path working-directory Q-ja-file)))
(define kaitou-ja (get-data (build-path working-directory KaiTou-file)))

(define (transpose-table tbl)
  (define (helper tbl dict) ; dictionary
    (cond
     ((empty? (first tbl)) (reverse dict))
     (#t (helper (map cdr tbl) (cons (cons (first (first tbl))
					   (map first (cdr tbl)))
				     dict)))))
  (helper tbl '()))

;; from info-lines generate plot-title and file-name
(define info-dict (transpose-table info-data))
(define (plot-title-join dict)
  (define (title-part entry)
    (string-join entry ":"))
  (map title-part dict))
(define plot-title-string
  (string-join (plot-title-join info-dict)
              ","))
(define (filename-join dict)
  (string-join
   (map car (dict-values dict))
   "-"))
(define plot-file-name
  (filename-join info-dict))

(define (reorder-responses-ascending dat-labs) ;; data-labels
  (map (lambda (row) (cons (car row) (reverse (cdr row)))) dat-labs))

(define ascending-data-labels
  (reorder-responses-ascending data-labels))

(define (get-response-number row n)
  (string->number (list-ref row n)))

(define (sum-responses row n m)
  (+ (get-response-number  row n)(get-response-number row m)))

(define (positives-sum row)
  (sum-responses row 4 5))
(define (negatives-sum row)
  (sum-responses row 1 2))

(require plot)
(require plot/utils)

;; (define neutral-response 3)
(define (neutral-line row y)
  (let* ((neutral-label (list-ref row 3))
         (neutral-number (string->number neutral-label))
	 (half (/ neutral-number 2)))
    (list 
     (hrule y (- half) half #:color "black")
     (point-label (vector 0 y) (string-append "3:" neutral-label)
                 #:anchor 'bottom #:point-size 5 #:size 9))))

(define (positive-line row y)
  (let* ((4-label (list-ref row 4))
         (4-number (string->number 4-label))
         (5-label (list-ref row 5))
         (5-number (string->number 5-label))
         (4n5 (+ 4-number 5-number)))
    (list
     (lines (list(vector 0 y) (vector 4-number y)) #:color "green")
     (lines (list (vector 4-number y) (vector 4n5 y)) #:color "green" #:width 3)
     (points (list (vector 4-number y)) #:color "black" #:sym 'fullcircle #:size 5)
     (point-label (vector 4n5 y) (string-append "4:" 4-label "," "5:" 5-label)
                 #:anchor 'bottom #:point-size 5))))

(define (negative-line row y)
  (let* ((1-label (list-ref row 1))
         (1-number (string->number 1-label))
         (2-label (list-ref row 2))
         (2-number (string->number 2-label))
         (1n2 (+ 1-number 2-number)))
    (list
     (point-label (vector (- 1n2) y) (string-append "1:" 1-label "," "2:" 2-label)
                 #:anchor 'bottom #:point-size 2)
     (lines (list (vector (- 1n2) y) (vector (- 2-number) y)) #:color "blue" #:width 3)
     (lines (list (vector (- 2-number) y) (vector 0 y)) #:color "blue")
     (points (list (vector 0 y)) #:color "black" #:sym 'fullcircle #:size 5)
     )))

(define (place-question key dict y)
  (let* ((d-ref (dict-ref dict key))
         (type (first d-ref))
         (question (second d-ref))
         (label (string-append type ":" question))
         (y-offset .3)
         (q-y (+ y y-offset)))positives-sum
    (point-label (vector 0 q-y) label #:size 14 #:point-size 0)))

(define (plot-a-question row dict y)
  (list
   (neutral-line row (- y .25))
   (positive-line row (- y .05))
   (negative-line row (- y .05))
   (place-question (first row) dict y)
   ))

(define (plot-questions data dict)
  (define (helper rows y plots)
    (cond
      ((empty? rows) plots)
      (#t (helper (cdr rows) (add1 y)
                 (cons (plot-a-question (car rows) dict y) plots)))))
  (helper data 1 '()))

(require pict)

(define visu-pict (blank 1000 1000))
(parameterize
    ((plot-title plot-title-string)
     (plot-x-axis? #f)
     (plot-x-label #f)
     (plot-x-far-axis? #f)
     (plot-y-axis? #f)
     (plot-y-label #f)
     (plot-y-far-axis? #f)
     (plot-width 1000)
     (plot-height 1000))
  (set! visu-pict
     (plot-pict
      (plot-questions
       (sort (cdr ascending-data-labels) #:key positives-sum >)
       questions-ja)
      #:x-min -600 #:x-max 2500
      #:y-min 0 #:y-max 11.5
      )))

  (define (pict-line base x-start y-start x-end y-end
                    #:clr (clr "gray") #:sze (sze 10))
    (define x-diff (- x-end x-start))
    (define y-diff (- y-end y-start))
    (pin-over base x-start y-start
             (colorize
              (pip-line x-diff y-diff sze) clr)))

  (define (pict-line-arrow base x-start y-start x-end y-end
                    #:clr (clr "gray") #:sze (sze 10))
    (define x-diff (- x-end x-start))
    (define y-diff (- y-end y-start))
    (pin-over base x-start y-start
             (colorize
              (pip-arrow-line x-diff y-diff sze) clr)))

  (define (pict-line-arrows base x-start y-start x-end y-end
                    #:clr (clr "gray") #:sze (sze 10))
    (define x-diff (- x-end x-start))
    (define y-diff (- y-end y-start))
    (pin-over base x-start y-start
             (colorize
              (pip-arrows-line x-diff y-diff sze) clr)))
(send
 (pict->bitmap
  (pin-over
   (pict-line
    (pict-line-arrow
     (pin-over visu-pict
              750 15
              (table 3 (map (lambda (x) (text x (cons 'italic 'roman ) 16 ))
                           (flatten kaitou-ja))
                    lc-superimpose cc-superimpose
                    10                5))
     25 290 189 290 #:clr "red")
    346 310 591 310 #:clr "red")
   500 260 (colorize ;345
            (text "教員はどんな能力開発すればいいか、ここから調べる?" (cons 'italic'roman) 20)
            "red"))
  )
 save-file (build-path (current-directory-for-user)
                      "2018Koki-DG-plot-pict-20190704-2.png")
 'png)

#DrRacket #DataVisualization #FD #facdev #Questionnaires #アンケート #教員開発 #情報デザイン