四畳半テクノポリス

コロナのストレスで気が狂い、D進した院生

Excelでもセルをprintfみたいにフォーマットされた文章にしたい

研究においてデータって大切ですよね。データが正しく管理できていないとその実験自体が無効になってしまいます。私は最近雑に管理しすぎてちょっとやらかしてしまったんですが、今回は個人的なメモとしてExcel上でのデータの取り扱いについて書きます。

 

研究で採取したデータが論文の表になるまで大体三つくらいのフェーズを経ると思います

  1. 生データ
  2. 計算途中のデータ
  3. ドキュメントに載せる表

正しい表を作るためには三つの表を正しく管理しなければなりません。特に1から2への計算時には有効数字の問題も発生するので注意です。

 データの管理例

とりあえず架空の実験データを使ってデータ管理のやり方について説明します。表の全体はこんな感じです。

f:id:toriten1024:20210204063210p:plain

 

生データ
  生データ
 データ数 10個 20個 30個 40個 50個 60個 70個 80個 90個 100個
従来手法 10.01 12.75 29.32 32.81 65.98 70.93 75.06 77.28 80.92 85.95
提案手法 25.19 32.34 45.56 65.62 70.02 75.05 80.01 82.88 83.05 85.92

 

例えばある提案手法を使って少ないデータで従来手法より少ないデータ数でも、高い精度の計算結果が得られるようになったとします。私はこの手法がどの程度優れているか知りたかったので、とりあえず従来手法と提案手法の両方に10個から100個のデータでテストを行いその結果を記録しました。その結果が上に示した表になります。

生データなので有効数字はすべて小数点以下で共通になりますが、ここでは小数点以下2桁までを有効数字とします。


途中計算(パーセンテージの計算)
  途中計算
 データ数 10個 20個 30個 40個 50個 60個 70個 80個 90個 100個
提案手法による改善率 151.6 153.6 55.39 100 6.123 5.809 6.595 7.246 2.632 -0.035

次に従来手法に対して提案手法何パーセント改善したかを計算します。ここの計算ではROUND関数を使って有効数字の桁を丸めます。生データでは数値は有効数4桁であったため、計算結果も4桁となります。

例えばデータ数10個の時の計算は有効数字4桁だと小数点以下1桁までとなるので

=ROUND((B5/B4-1)*100,1)

と書くことが出来ます。

ドキュメントに載せる表

f:id:toriten1024:20210204061152p:plain

最後にドキュメントに載せる表です。この表の下段に注目してください。提案手法の精度の後の括弧内に従来手法から何パーセント精度が向上したかが書いてあると思います。このようにExcelにおいてもC言語のprintf文のようにフォーマットを持った文字列を生成して表示することが可能です。

 このようなフォーマットを持った文章は、ExcelにおいてはVBAの文字列の連結を使って表現することが可能です。提案手法で10個の時のセルは以下のような感じで計算しています。

=B5&"("&TEXT(B9,"0.0")&")"

使っているテクニックは以下のような感じです

  • 文字列や変数同氏は&記号で連結することが可能
  • テキストはダブルクオーテーションで囲うことによって文字列とみなされる
  • TEXT関数によって有効数字分0埋めができる

三つ目のTEXT関数はデータ数が40個の時の改善率をみてわかるように小数点以下がすべて0であっても、0で埋めることが出来ます。

まとめ・わからない事

以上が痛い目にあいながら学んだ計算のやり方です。とりあえず当分はこのやり方でデータを管理してゆこうと思います。Excelは良くも悪くもExcelの域を出ないので、可能であればRかJupyterに移行したいです。あと、SpreadsheetはJSを使えるのでjs系のデータ可視化ライブラリでデータ分析ができるいいかなとか思ってます。

現状有効数字を自分で計算しているので、だれか有効数字を自動で計算してくれる機能があれば教えてほしいです。