goo blog サービス終了のお知らせ 

Java エクセルVBAのサンプル

浮かんだ、JavaとVBAのサンプルを備忘録として、残しておこうかな、
コードを利用するときは自己責任にてよろしく

今日の雑感

2009-01-12 09:58:46 | Weblog

gooのブログ、特殊文字を使う時は、
注意しないと駄目みたいです。
プログラムのリストを掲載する場合は

<>"&など沢山使うので、

注意して、使わないと、テキストエディタで書いたあと
ホームページビルダー等にペーストして、
奇麗はHTMLにして、ブログ書かないと
バランスが崩れるみたいです。

しかし、このブログで、不思議なことを発見
<pre>タグの修飾している文字列を
<font>で、文字サイズを変えようとすると
ホームページビルダーでは、拒否されたが
このブログでは、許可されて、
なんと、文字サイズも許可された。

今後、この辺を注意しないといけないのかもしれませんね。

Jakarta Commons MathのVariance

2009-01-11 16:08:39 | Weblog
しかし、ホント、このAPI不思議です。
パソコンと、数学が、得意な人が作ったのかな???
ただ、分散値を計算する分には、前に書いたように
別に問題は、ないのですが。
平均値を与えた場合なのです。

double []data={14,19,25,37,46,47,50,51,52,52,54,70,76,81,85};

Variance vv = new Variance();
  System.out.println(vv.evaluate(data));
  for(double md =1.0;md<100000.0;md=md*10.0){
      System.out.println(md+"  "+vv.evaluate(data, md));
   }

計算結果
454.11428571428576
1.0  454.1142857142856
10.0  454.1142857142856
100.0  454.1142857142856
1000.0  454.1142857142591
10000.0  454.11428570747375

分散値が、平均値に依存しないことは、前に書いたが
なんと、平均値の大きさにより、
計算結果が、さほどではなくとも変わってします。
誤差範囲ではあるが、計算過程で、
無駄な平均値との引き算が、誤差を膨らましている
様な気がする。

違った、アルゴリズムにした方が
いい様な気がするのは、私だけだろうか。???

Jakarta Commons Math 統計

2009-01-11 09:28:27 | Weblog
Javaの数値計算関係のAPIがある、Jakarta Commons Math
今、統計処理で、バグと、言って良いのか、
困った現象にぶち当たった。

分散値のAPIである。

Varianceである。

普通にデータから、直接、分散値を計算する時は、
問題ないのですが。
統計的に、平均値が、与えられていて、
変則的な計算をするときに問題がある見たいです。

double evaluate(double[] values, double mean)
Returns the variance of the entries in the input array, using the precomputed mean value.

このメソッドで、もともとのデータの平均値ではなく、
統計的に特殊な平均値で、計算してくれるのかと
思ったのですが。
mean、平均値に何を入れても、関係ない同じ結果になります。

Varianceのソースコードを見ると
そのアルゴリズムは

http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance

の IIa. Compensated variant を採用しているみたいです。

Javaではないが、コピーペーすると以下に様な、コードになっています。


n = 0
sum1 = 0
foreach x in data:
  n = n + 1
  sum1 = sum1 + x
end for
mean = sum1/n

sum2 = 0
sumc = 0
foreach x in data:
  sum2 = sum2 + (x - mean)^2
  sumc = sumc + (x - mean)
end for
variance = (sum2 - sumc^2/n)/(n - 1)




このアルゴリズム、meanを計算しくとも
meanがどんな値だろと、分散値には、影響を
与えない。
特殊な平均値が、与えられた場合は、MathのVarianceでは、計算できず、
自分で、ソースコードを書かないと駄目みたいです。
 
既製品で、計算する場合、間違いを見つけるまでに
多大な時間を費やし、困ったことがでる
既製品が、良いのか、自分で書いたほうが良いのか、
賛否両論が、まだ、出るような時代なのですね。
まだまだ、発展段階なのかな???



今日の雑感 No.1

2009-01-09 17:46:26 | Weblog
今日、信頼区間で、いろいろ検索すると
いろいろ出てきますね。

そこで、気になったのが以下のページ

http://aoki2.si.gunma-u.ac.jp/Hanasi/excel/

私の使っているエクセルはXPなので、
これで、いろいろ処理をしています。

エクセルで、いろいろやるには、まだまだ、いろいろな問題が
あるのですね。
全部読んでいないので、注意する点は、どんなことか、
よく解りませんが。
私自身、厳格な処理を求めていないので、
基本的な勉強程度には、問題なく、利用できるのではと、
達観しています。

しかし、表計算、マイクロソフトには、
数値計算等を想定して、設計しているのだろうか???
ちょっと、疑問、どうせなら、数値積分、微分等も
標準で、付いてくれると助かる。
あくまでも、四則演算だけを想定しかしてなかったりして、
どうなのでしょうね。
統計処理も、しかり。


ネット検索していると、「信頼区間」「演習」とうで
検索しても、なかなか、良い、検算する
ページにたどり着かなかった。
あんまり例というのないのでしょうか。

世間の学者先生たちは、その辺のデータを沢山持っているのでしょうけど
あまり、公開をしないのかな。
いろいろな分野の、サンプルデータを公開してくれると
ありがたいですね。

さて、また、しこしこ、サンプルコードでも作るかな!!!
本日は、以上

統計 信頼区間

2009-01-08 19:38:01 | Weblog
確率と統計の本を見ている。。。。其処で出てきた信頼区間
大抵、95%、99%の信頼区間が、ほとんどみたい。
(1-α)*100で、信頼区間を表現するみたいで、
95%の時はα=0.05、、99%の時は、α=0.01になるらしい。
世の中、正規分布で出来ていることが多いらしい。
正規分布が成立していないのには、これらは、使えないらしい。
ようは、95%の信頼区間とは、
正規分布で成り立っている事象のデータが
95%の確率で入る範囲はどの程度かを知るのに計算するらしい。
解りにくい文章であるが。自分には、解るので、
良いとしよう。

例として、まず95%の信頼区間は、どの様になるか、
エクセルのVBAで、計算してみた。

まず、母標準偏差が解っている時のソースコード



Public Function Aa(data As Range, alpa As Double, sigma As Double) As String

 Dim d As Double
 Dim x1 As Double, x2 As Double
 Dim a As Double
 Dim hekin As Double
 Dim n As Double


	hekin = WorksheetFunction.Average(data)

	n = data.Count


	a = WorksheetFunction.NormSInv(1# - alpa / 2#)

	d = a * Sqr(sigma ^ 2 / n)

	x1 = hekin - d
	x2 = hekin + d

	Aa = x1 & "  <= μ <=  " & x2


End Function



母標準偏差が解らない時のソースコード

Public Function ts(data As Range, alpa As Double) As String

 Dim d As Double
 Dim x1 As Double, x2 As Double
 Dim a As Double
 Dim s As Double
 Dim hekin As Double
 Dim n As Double


	n = data.Count

	hekin = WorksheetFunction.Average(data)

	a = WorksheetFunction.TInv(alpa, n - 1)

	s = WorksheetFunction.StDevP(data)

	d = a * Sqr(s ^ 2 / (n - 1#))

	x1 = hekin - d
	x2 = hekin + d

	ts = x1 & "  <= μ <=  " & x2


End Function



95%ないに入る分散値は

Public Function ss(data As Range, alpa As Double) As String

 Dim n As Double
 Dim s As Double
 Dim chi1 As Double
 Dim chi2 As Double
 Dim x1 As Double, x2 As Double


	n = data.Count


	s = WorksheetFunction.StDevP(data)

	chi1 = WorksheetFunction.ChiInv(alpa / 2#, n - 1#)
	chi2 = WorksheetFunction.ChiInv(1# - alpa / 2#, n - 1#)

	x1 = n * s ^ 2 / chi1
	x2 = n * s ^ 2 / chi2

	ss = x1 & "  <= σ2 <=  " & x2


End Function



まだ、文字数制限にひっからないかな???

95%の信頼区間の例として50日の雌雄のラットの体重を取り上げてみた。


99%の信頼区間として試料の銅の含有量%を例にとって見た。


まだ2000文字くらい、まだまだ、大丈夫だ。


エクセルVBAで、複素数

2009-01-05 19:08:39 | Weblog
エクセルのVBAで、複素数を扱ってみた。
エクセル2007だと、電気屋で見たら、エンジニアリング関数は
アドインではなく、標準になっていた。
古いエクセルで、アドインで、エンジニアリング関数を
使うようにするには、どうするか。
まず、エンジニアリング関数をアドインする
次に、VBAで、利用できるようにするには、
参照設定を利用して、

http://www.geocities.jp/tomtomf/denki/AC4/

上記設定をすると、VBAでも、複素数関数が、
他の関数と同様に、使えるようになります。
関数の利用の仕方は、エンジニアリング関数のヘルプを
見てください。


学校で習う、二次方程式の解の公式を
コーディングしてみました。


Public Function kx(a As Double, b As Double, c As Double) As String

Dim d As Double
Dim x1 As Double, x2 As Double
Dim x1s As String, x2s As String

'判別式
    d = b ^ 2 - 4 * a * c

If d > 0 Then

    x1 = (-b + Sqr(d)) / 2# / a
    x2 = (-b - Sqr(d)) / 2# / a

    kx = x1 & " , " & x2

ElseIf d = 0 Then

    kx = CStr(-b / 2# / a)

Else

    x1s = Complex(-b / 2# / a, Sqr(-d) / 2# / a)
    x2s = ImConjugate(x1s)

    kx = x1s & " , " & x2s

End If


End Function





実行結果は図の様になりました。


エクセルvba 六星占術

2009-01-05 13:32:56 | Weblog

六星占術での今日の年月日の運勢
エクセルVBAの関数

求めたい日(today)の運勢を求める

http://kashiwamochi.jp/html/unmeisei.html#MOVE-SENTOU

等で結果を比較して確認してみてください。



Public Function modr(today As String) As String

Dim r As Variant
Dim sdate As Date
Dim tdate As Date
Dim y As Long
Dim m As Long
Dim d As Long

'sdateは、自分の年月日が、全部種子の日

    sdate = CDate("1900/12/5")
    tdate = CDate(today)

        r = Array("種子", "緑生", "立花", "健弱", "達成", "乱気", "再会", "財成", "安定", "陰影", "停止", "減退")

            y = DateDiff("yyyy", sdate, tdate)
            m = DateDiff("m", sdate, tdate)
            d = DateDiff("d", sdate, tdate)

            y = y Mod 12
            m = m Mod 12
            d = d Mod 12

modr = r(y) & "/" & r(m) & "/" & r(d)

End Function


タグ使うとどうなる

2009-01-04 15:34:36 | Weblog
Public Sub show(a As Variant)

Dim i As Integer, j As Integer
For i = LBound(a, 1) To UBound(a, 1)
    For j = LBound(a, 2) To UBound(a, 2)
        Debug.Print a(i, j),
    Next
    Debug.Print
 Next
 
End Sub