Top Banner
わんくま同盟 熊本勉強会 #04 VBAPythonで始める数値計算教育 ver. 0.999 2017-03-18 14:40-15:30 森下
42

VBAとPythonで始める数値計算教育

Apr 11, 2017

Download

Education

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

VBAとPythonで始める数値計算教育ver. 0.999

2017-03-18 14:40-15:30森下

Page 2: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

自己紹介属性

• 熊本高専建築社会デザイン工学科助教

• 専門は衛星測位や電子回路

• センサーでデータ集めたり

• 機械学習歴6年ほど

• 言語

– Python, C/C++, C#, VB, VB.NET, 後はかじった位

2

Page 3: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04 3

が大好きです

Page 4: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

目次• 背景

• 評価をどう実現する問題

• 採点をどうする問題

• 実際の採点

• まとめ

• 付録

Page 5: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

背景熊本高専建築社会デザイン工学科では、4年次に数値計算を学びます

数値計算・・・数値微分とか、数値積分とか、ニュートン法とか、掃き出し法とか。工学的な問題を計算機で解くために必要な技術。

①𝑥"の初期値𝑥#更新値𝑥$

②𝑓 𝑥# を計算

③𝑥#における接線の傾き(微分値)を求める

④接線とy = 0の交点の𝑥座標で𝑥"を更新

⑤以下、解が収束するまで繰り返す

O𝑥

𝑦

図 ↑ニュートン法

Page 6: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

使用言語を何にするか・・・?

私「Pythonを使いたいと思うんですがどうでしょうか?」

同僚「現場はExcelだからね〜。VBAでしょ。」

私「わかりました。ちょっとやってみます。」

Page 7: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

VBA• Microsoft Office用マクロ言語

• MacのVBA開発画面は超貧弱

• WinではOKでもMacではエラーとなったり

Macではエラーになる例 左の修正例

開発環境@Mac

Page 8: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

数値計算そのものをVBAででやっている現場はないと思う。そもそも、VBAで業務用のマクロを組むだけなら、1000円で本を買ってくればなんとかなる。

それでも教育現場でVBAというのは、モダンな言語を扱える教員が少ないということに原因が在ると思う。

「VBは習得が簡単な言語である」という神話もある*。ちなみに、C言語は低学年でやるが死屍累々らしい。

どうしてこうなった!?

*うちの学校だけだったらスミマセンw

Page 9: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

設定した受講生のゴール

到達目標理想的な到達レベル

の目安(優)標準的な到達レベル

の目安(良)未到達レベルの目安(不可)

Excelのマクロを

記述し、実行できる。

例えば成績表において赤点者のチェックができるなど、繰り返しと関数を含む処理を実装できる。

セルの値を読み込み、その値を用いた四則演算の結果をセルに表示できる。

いかなるマクロも書けない。

数値微分・積分について理解し、利用できる。

任意の関数について、微分と積分の推定値を求めることができる。

微分および積分の数値計算方法について説明でき、プログラムで表現できる。

微分および積分の数値計算方法について説明できない。

連立方程式を解くプログラムを作成し、利用できる。

掃き出し法をプログラムで表現でき、任意の問題を解くことができる。

掃き出し法を説明できる。 掃き出し法を説明できない。

Page 10: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

評価をどう実現する問題

Page 11: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

森下は、プログラミング能力を測る指標としてのペーパー試験結果を全く信じていません

プログラムは動いてなんぼです

Page 12: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

つまり、評価指標は・・・・

「結果の正しい関数を書けたかどうか?」だ!!

Page 13: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

出題例

引数で渡された配列の平均値を返す関数を実装せよ。

ここで、引数に渡される配列は「Dim a(リテラル) as Double」の様にして宣言されているものとする。

Function get_mean(arr)'ここに解答する。

End Function

Page 14: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

解答例

Function get_mean(arr)total_ = 0For i = 0 To UBound(arr)

total_ = total_ + arr(i)Next iget_mean = total_ / (UBound(arr) + 1)

End Function

Page 15: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

学生が解答した関数の出力が正しいことを確認する必要がある

Page 16: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

方法1 VBAで関数を呼出&Sheetをチェック

• 学生の書いた関数を呼び出し、返り値を評価したい

• 他のブックから呼び出すことはできるが、Sheetに記述された関数からは返り値が返ってこない

• そこで、ワークシートに出力させて、それを確認

Excel VBA codeon 学生作成ブック

Excel VBA codeon 評価用ブック

Sheet

Function hoge()

Sheet

Function test()ワークシート

②③

Page 17: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

学生に変な癖がつきそうなので却下

Page 18: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

方法2 VBAで関数を呼出&学生はModule内に記述

• 学生には標準Module内に解答してもらう

• 外部からの呼び出しに返り値が返る

• ・・・だが、学生の作った関数はライブラリではない

• Moduleの使い方を間違えている

Module

Function hoge()

Sheet

Function test()

Excel VBA codeon 学生作成ブック

Excel VBA codeon 評価用ブック

Page 19: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

これも、学生に変な癖がつきそうなので却下

Page 20: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

方法3 Pythonで関数を呼出&学生はSheet内に記述

• 学生にはSheet内に解答してもらう

• Pythonから呼び出すと、返り値が返ってくる

• ・・・これで良い気がする

Sheet

Function hoge()

Python

Function test()

Excel VBA codeon 学生作成ブック

Python code

Page 21: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

VBAを呼び出すPythonコード例

*Windows OS上でしか動作しません。orz

Page 22: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

PythonとVBA間で渡せるデータ型• PythonからVBAへ渡す引数

– str, int, floatとこれらを格納したlistを渡せることを確認

– numpyのndarrayやnumpyが定義する変数型は渡せない

– intの値がint32の範囲を超えた場合は未確認

• VBAからPythonへ返される返り値

– String, Double, Integerとこれらを格納した配列はOK– Array型オブジェクトは渡せなかった

Page 23: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

最終形態

Sheet

Function hoge()

Python

Function test()

Excel VBA codeon 学生作成ブック

Python code

Sheet

Function hoge()

Excel VBA codeon 教員作成ブック

双方の解の一致を確認する

Page 24: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

採点をどうする問題

Page 25: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

解答のパターン• 文字列

• 数値(整数・浮動小数点)

• None(nullみたいなやつ)

• 複素数

• 文字列 or 数値を格納した配列

• 2次元配列

Page 26: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

課題• 個々人の計算条件により、模範解答と解答が一致しない

– アルゴリズム

– 微分や積分に使う微小幅

– 解の収束条件

– 初期条件

• 文法・論理上のエラーはないが、実用的な計算速度でない

• 見かけ上の誤差小への対応– 特定の変数範囲では相対的な誤差が小さいこともある

• 模範解答と学生の解答とで返り値の型が異なる場合がある– 正解は”解なし”なのに数値を返してきたとか

Page 27: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

対策• 初期条件

– 問題文に明示

• 実用的な計算時間でない

– 動かないのだから、不可

• 見かけ上誤差小

– 問題文に変数範囲を明示するのが妥当

– その上で、複数回関数を呼び出して、確認する

• 型が異なる

– 「解なしの場合は”解なし”を返す」など、予め定めておく

– 型が異なる場合は、不可とする

Page 28: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

誤差に対する対応• 微積場合、微小変化量を妥当に設定する必要がある

• 妥当な実装ならば、誤差は1%もない

Page 29: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

行きついた評価プログラム

Download:https://gist.github.com/KatsuhiroMorishita/ffa12a1b0791d35f49632596862610a3

Page 30: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

注意• Excelが開いたままになったりするので、採点作業後

は再起動が必要になる・・・orz– 採点プログラムが悪かったかな?

• 学生40人分もあると、プログラムは絶対にクラッシュするので、Python側はtry構文が必須

• タイムアウト処理も必要

Page 31: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

実際の採点

時間が余れば

Page 32: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

エラーメッセージと原因• 'パラメーターの数が無効です。’

– 引数の数が一致しない。呼び出される関数側で引数の数が少ないと出る。渡す引数が多いと出る。

• unsupported operand type(s) for / 'NoneType' and 'float'– 返り値がなかったなどして演算エラー

• 'パラメーターはオプションではありません。’– 呼び出される関数側の引数の数が多かった。渡す引数の数が少なかった。

• <unknown>.関数名– 関数が存在しなかった。

• math domain error– 宣言されていない変数が使われるなど

• 'アプリケーション定義のエラーです。’– 文法エラー。変数の2重宣言や単独のEnd Subなど。また、関数内でCells()を使ってい

るとたまにエラーになる。なんでやねん。

• スタックなんちゃら– 再帰構造によるスタックオーバーフロー

Page 33: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

採点の様子

*学生の名前が出てくるので、録画を止めてお見せしました

Page 34: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

まとめ

Page 35: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

まとめ• 数値計算をVBAを使って教えてみました

• ライブラリが存在しないので、フルスクラッチ

• VBAのテキトウなエラーメッセージが最低

• ベクトルの計算あたりから、脱落者が続出

– 関数が3つ以上・行数10行以上で危ないようだ

– データ構造の理解が課題

• 関数を使って計算を続けることと、引数と返り値のデータ構造を一般化しておくことが重要であることは伝わったと思う

• 問題に合わせた採点は大変だった

Page 36: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

来年度はPythonで全部やります

Page 37: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

専攻科の学生(大学のB3に相当)から「VBAで2ヶ月か

かって作り続けているのだが、デバッグできない。デバッグして欲しい。」という相談を受け、30分考えたが全く分からなかったので2時間でPythonに書き換えた上で機能的にグレードアップした。

結局はオブジェクト内部で使っている変数が独立しておらず、他のオブジェクト内の処理により変更されていたのが直接の原因だったのだが、そんなのVBAでデバッグするのは大変だ・・・。

これにより、更に強くPythonにしようと決心したのでしたw

Page 38: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

付録

Page 39: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

PyCon mini Kumamotoをヨロシク!!

https://pycon-mini-kumamoto.connpass.com/event/45063/

39

Page 40: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

PyCon mini Kumamoto プログラム

時間 大ホール 教室

9:30 - 10:00 受付 –

10:00 - 10:15 オープニング –

10:15 - 11:00 キーノートIan Lewis

11:10 - 11:40 まだ見ぬバグゼロという未来(初級)新井 正貴

kivyの利便性や有用性(初級)齋藤 大輔

11:40 - 12:10 PythonとBI基盤ではじめるPyData入門〜福岡ソフトバンクホークスを添えて(初級)Shinichi Nakagawa(野球の人)

DjangoのDB migrationがどういうしくみで動いているか(初級)野中 哲

12:20 - 13:50 ランチディスカッション

14:00 - 14:30 すぐ始められる、Pythonの環境構築(初級)寺田 学

ボイスインターフェースの現状(仮)と、pythonを使ったフレームワーク(flask)でAmazon Echoがレスポンスを返すまで。堀田 直孝

14:40 - 15:10 Pythonでできる数理最適化(仮)(中級)岩永 二郎

Pythonistaの使いかたjbking

15:20 - 15:50 科学技術計算用言語としてのPython&Webアプリ作ろう(中級)矢野 高宏

データ分析現場におけるPython活用事例の紹介真嘉比 愛

15:50 - 16:00 記念撮影 –

16:00 - 16:30 クロージングLT 1枠5分x5枠。当日、受付にて募集 –

16:30 - 16:45 クロージング –

40

Page 41: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

参考リンク• VBAによる数値計算解説スライド(1-10)

– https://www.slideshare.net/katsuhiromorishita/vba-01-71493565

• VBAによるニュートン法実装例– https://gist.github.com/KatsuhiroMorishita/54fee36290911d7c225

7ffe467efed04

• VBAによるベクトル演算関数群実装例– https://gist.github.com/KatsuhiroMorishita/16a2da253a8afbf60ec8

3a721309dcac

• VBAによる行列計算関数群実装例– https://gist.github.com/KatsuhiroMorishita/16578b870d705731a88

94222a486f065

Page 42: VBAとPythonで始める数値計算教育

わんくま同盟 熊本勉強会 #04

PythonからVBAを呼び出すときの参考サイト

• http://stackoverflow.com/questions/15897371/how-to-call-vba-sub-from-python#

• http://stackoverflow.com/questions/14732340/how-to-call-excel-vba-functions-and-subs-using-python-win32com#

• https://sites.google.com/site/pythoncasestudy/home/pywin32kara-comwo-tsuka-tsu-te-excelwo-sousa-suru-houhou