質問編集履歴

3

算出結果は正しく得られたため、タイトルと質問の仕方を変更。

2016/09/06 06:31

投稿

taketake221
taketake221

スコア17

test CHANGED
@@ -1 +1 @@
1
- decimal型とdouble型の違いで、相関係数算出でエラーが生じています
1
+ 相関係数算出における、decimal型とdouble型。
test CHANGED
@@ -4,21 +4,15 @@
4
4
 
5
5
 
6
6
 
7
- [単純な相関係数算出プログラム](https://teratail.com/questions/45914)
8
-
9
- [SQLserver2012から取得した値を配列に格納し、関数の戻り値にする](https://teratail.com/questions/46270)
10
-
11
-
12
-
13
- 問題解決にあたって単純化して考えていたのですが、このたびあわせて、
14
-
15
- 「SQLserver2012から取得した値を用いて相関係数を算出する」ということを実現したと考えいます。
7
+ 「SQLserver2012から取得した値を用いて相関係数を算出する」というプログラムについて
16
-
17
-
18
-
8
+
19
- その際、SQLserverからデータを取得して配列に格納する関数ではDecimal型なのに対し、
9
+ SQLserverからデータを取得して配列に格納する関数ではDecimal型なのに対し、
20
-
10
+
21
- メインの計算部分では変数宣言をdouble型で行なっているのをどのように改善すべきでしょうか。
11
+ メインの計算部分では変数宣言をdouble型で行なっているの改善すべきでしょうか。
12
+
13
+
14
+
15
+ 現在は計算結果も正しく算出されているのですが、デバッグの段階で
22
16
 
23
17
 
24
18
 
@@ -28,9 +22,7 @@
28
22
 
29
23
 
30
24
 
31
- の部分で「0を分母に除算している」といったエラーが生じるも、タイトルに記したうにそうしたデータ型の相違よるものかと考えたのです・・・(考え違ょうか)
25
+ の部分で「0を分母に除算している」といったエラーが生じるケースあったため、より適切なデータ型の指定やコードの記述改善すべきかと不安になり、漠然なら質問させてただきま
32
-
33
-
34
26
 
35
27
  具体性に欠けますが、ご指摘等いただければありがたいです。
36
28
 

2

Visual Stdioのバージョン修正

2016/09/06 06:30

投稿

taketake221
taketake221

スコア17

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  少し前からこちらでお世話になっている初級者です。
2
2
 
3
- ここのところVisual Studio 2013を使って相関係数算出のプログラムを作成しています(ASP.NET Webフォームアプリ)。
3
+ ここのところVisual Studio 2010を使って相関係数算出のプログラムを作成しています(ASP.NET Webフォームアプリ)。
4
4
 
5
5
 
6
6
 

1

書式とタイトルの変更

2016/09/04 07:31

投稿

taketake221
taketake221

スコア17

test CHANGED
@@ -1 +1 @@
1
- SQLserver2012から取得した値で相関係数算出した。データ型はどうればいいでしょうか
1
+ decimal型とdouble型の違い相関係数算出でエラーが生じてす。
test CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  ここのところVisual Studio 2013を使って相関係数算出のプログラムを作成しています(ASP.NET Webフォームアプリ)。
4
4
 
5
- それにともなって、二つの質問をすでにさせていただきました。
6
-
7
5
 
8
6
 
9
7
  [単純な相関係数算出プログラム](https://teratail.com/questions/45914)
@@ -18,6 +16,32 @@
18
16
 
19
17
 
20
18
 
19
+ その際、SQLserverからデータを取得して配列に格納する関数ではDecimal型なのに対し、
20
+
21
+ メインの計算部分では変数宣言をdouble型で行なっているのをどのように改善すべきでしょうか。
22
+
23
+
24
+
25
+ '相関係数算出 = 偏差積平均 / 値Aの標準偏差 * 取得した値の標準偏差
26
+
27
+ Dim Soukan_Keisu As Double = Dev_avg / (Self_std_dev * values_std_dev)
28
+
29
+
30
+
31
+ の部分で「0を分母に除算している」といったエラーが生じるのも、タイトルに記したようにそうしたデータ型の相違によるものかと考えたのですが・・・(考え違いでしょうか)。
32
+
33
+
34
+
35
+ 具体性に欠けますが、ご指摘等いただければありがたいです。
36
+
37
+
38
+
39
+ よろしくお願いします。
40
+
41
+
42
+
43
+
44
+
21
45
  ※取得する先のテーブルは以下の構成です。
22
46
 
23
47
  (取得したいのはvalueA から valueF、いずれもデータ型はdecimal(3,2)。格納するデータがいずれも小数点以下二桁の値ばかりなのでそのように設定したのですが・・・。)
@@ -26,310 +50,282 @@
26
50
 
27
51
 
28
52
 
53
+ <メイン部分>
54
+
55
+ ```ここに言語を入力
56
+
57
+ Imports System.Data.SqlClient
58
+
59
+
60
+
61
+ Partial Class getvalue_Soukan_sub
62
+
63
+ Inherits System.Web.UI.Page
64
+
65
+
66
+
67
+ Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
68
+
69
+
70
+
71
+ '値A 定義
72
+
73
+ Dim self1 As Double = 49
74
+
75
+ Dim self2 As Double = 6
76
+
77
+ Dim self3 As Double = 18
78
+
79
+ Dim self4 As Double = 54
80
+
81
+ Dim self5 As Double = 16
82
+
83
+ Dim self6 As Double = 18
84
+
85
+
86
+
87
+ 'self1 から self6までの平均値算出
88
+
89
+ Dim self_avg As Double = (self1 + self2 + self3 + self4 + self5 + self6) / 6
90
+
91
+
92
+
93
+
94
+
95
+ 'データベースから値を取得する関数呼び出し
96
+
97
+ Dim values() As Decimal = Getvalues()
98
+
99
+
100
+
101
+ '取得した値(配列に格納されている)の平均を算出
102
+
103
+ Dim values_avg = Aggregate value In values Into Average()
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+ '値Aの偏差を求める
112
+
113
+
114
+
115
+ Dim Self_dev(5) As Double
116
+
117
+
118
+
119
+ Self_dev(0) = self1 - self_avg
120
+
121
+ Self_dev(1) = self2 - self_avg
122
+
123
+ Self_dev(2) = self3 - self_avg
124
+
125
+ Self_dev(3) = self4 - self_avg
126
+
127
+ Self_dev(4) = self5 - self_avg
128
+
129
+ Self_dev(5) = self6 - self_avg
130
+
131
+
132
+
133
+
134
+
135
+ '取得した値の偏差を求める格納
136
+
137
+ Dim values_dev(5) As Double
138
+
139
+
140
+
141
+ For b = 0 To 5
142
+
143
+ values_dev(b) = values(b) - values_avg
144
+
145
+ Next
146
+
147
+
148
+
149
+ '偏差は各要素(値)から平均を引いたものです。
150
+
151
+
152
+
153
+
154
+
155
+
156
+
29
- とりあえずつの質問それぞれでいだいた回答・ご指摘を反映させたものをつなぎあわせたのですが、
157
+ '偏差を乗して合計したものを偏差平方和、分散は偏差平方和要素(値)の数割ると算出。
158
+
159
+
160
+
30
-
161
+ Dim Self_HensaHeiho As Double = Self_dev(0) ^ 2
162
+
31
-
163
+ Dim values_HensaHeiho As Double = values_dev(0) ^ 2
164
+
165
+
166
+
32
-
167
+ For c = 0 To 4
168
+
169
+ Self_HensaHeiho = Self_HensaHeiho + (Self_dev(c + 1) ^ 2)
170
+
171
+ values_HensaHeiho = values_HensaHeiho + (values_dev(c + 1) ^ 2)
172
+
173
+ Next
174
+
175
+
176
+
177
+ Dim Self_Bunsan As Double = Self_HensaHeiho / 6
178
+
179
+ Dim values_Bunsan As Double = values_HensaHeiho / 6
180
+
181
+
182
+
183
+
184
+
185
+ '標準偏差の計算 = 分散の平方根をとります。
186
+
187
+ Dim Self_std_dev As Double = System.Math.Sqrt(Self_Bunsan)
188
+
189
+ Dim values_std_dev As Double = System.Math.Sqrt(values_Bunsan)
190
+
191
+
192
+
193
+
194
+
195
+ '偏差積の計算 = 値Aの偏差と取得した値の偏差をかけあわせます。
196
+
197
+ Dim Dev_pdt(5) As Double
198
+
199
+
200
+
201
+ For s = 0 To 5
202
+
203
+ Dev_pdt(s) = Self_dev(s) * values_dev(s)
204
+
205
+ Next
206
+
207
+
208
+
209
+
210
+
211
+ '偏差積平均の計算
212
+
213
+ Dim Dev_avg = Aggregate Self In Dev_pdt Into Average()
214
+
215
+
216
+
33
- '相関係数算出 = 偏差積平均 / 値Aの標準偏差 * 取得した値の標準偏差
217
+ '相関係数算出 = 偏差積平均 / 値Aの標準偏差 * 取得した値の標準偏差
34
218
 
35
219
  Dim Soukan_Keisu As Double = Dev_avg / (Self_std_dev * values_std_dev)
36
220
 
37
221
 
38
222
 
39
- の部分で「0を分母に除算している」といったエラーが生じるなど、コードに不安があります。
40
-
41
-
42
-
43
- SQLserverからデータを取得して配列に格納する関数ではDecimal型なのに対し、
223
+ Soukan_Lbl.Text = Soukan_Keisu.ToString()
44
-
45
- メインの計算部分では変数宣言をdouble型で行なっていることなど、データ型に問題があるのかと考えましたが・・・。
224
+
46
-
47
-
48
-
225
+
226
+
49
- 具体性に欠けますが、ご指摘等いただければありがたいです。
227
+ End Sub
50
-
51
-
52
-
228
+
53
- よろしくお願いします。
229
+ End Class
230
+
54
-
231
+ ```
55
-
56
-
232
+
233
+
234
+
57
- メイン部分>
235
+ 関数部分>
58
236
 
59
237
  ```ここに言語を入力
60
238
 
61
- Imports System.Data.SqlClient
62
-
63
-
64
-
65
- Partial Class getvalue_Soukan_sub
66
-
67
- Inherits System.Web.UI.Page
68
-
69
-
70
-
71
- Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
72
-
73
-
74
-
75
- '値A 定義
76
-
77
- Dim self1 As Double = 49
78
-
79
- Dim self2 As Double = 6
80
-
81
- Dim self3 As Double = 18
82
-
83
- Dim self4 As Double = 54
84
-
85
- Dim self5 As Double = 16
86
-
87
- Dim self6 As Double = 18
88
-
89
-
90
-
91
- 'self1 から self6までの平均値算出
92
-
93
- Dim self_avg As Double = (self1 + self2 + self3 + self4 + self5 + self6) / 6
94
-
95
-
96
-
97
-
98
-
99
- 'データベースから値を取得する関数呼び出し
100
-
101
- Dim values() As Decimal = Getvalues()
102
-
103
-
104
-
105
- '取得した値(配列に格納されている)の平均を算出
106
-
107
- Dim values_avg = Aggregate value In values Into Average()
108
-
109
-
110
-
111
-
112
-
113
-
114
-
115
- '値Aの偏差を求める
116
-
117
-
118
-
119
- Dim Self_dev(5) As Double
120
-
121
-
122
-
123
- Self_dev(0) = self1 - self_avg
124
-
125
- Self_dev(1) = self2 - self_avg
126
-
127
- Self_dev(2) = self3 - self_avg
128
-
129
- Self_dev(3) = self4 - self_avg
130
-
131
- Self_dev(4) = self5 - self_avg
132
-
133
- Self_dev(5) = self6 - self_avg
134
-
135
-
136
-
137
-
138
-
139
- '取得した値の偏差を求める格納
140
-
141
- Dim values_dev(5) As Double
142
-
143
-
144
-
145
- For b = 0 To 5
146
-
147
- values_dev(b) = values(b) - values_avg
148
-
149
- Next
150
-
151
-
152
-
153
- '偏差は各要素(値)から平均を引いたものです。
154
-
155
-
156
-
157
-
158
-
159
-
160
-
161
- '偏差を二乗して合計したものを偏差平方和、分散は偏差平方和の要素(値)の数で割ると算出。
162
-
163
-
164
-
165
- Dim Self_HensaHeiho As Double = Self_dev(0) ^ 2
166
-
167
- Dim values_HensaHeiho As Double = values_dev(0) ^ 2
168
-
169
-
170
-
171
- For c = 0 To 4
172
-
173
- Self_HensaHeiho = Self_HensaHeiho + (Self_dev(c + 1) ^ 2)
174
-
175
- values_HensaHeiho = values_HensaHeiho + (values_dev(c + 1) ^ 2)
176
-
177
- Next
178
-
179
-
180
-
181
- Dim Self_Bunsan As Double = Self_HensaHeiho / 6
182
-
183
- Dim values_Bunsan As Double = values_HensaHeiho / 6
184
-
185
-
186
-
187
-
188
-
189
- '標準偏差の計算 = 分散の平方根をとります。
190
-
191
- Dim Self_std_dev As Double = System.Math.Sqrt(Self_Bunsan)
192
-
193
- Dim values_std_dev As Double = System.Math.Sqrt(values_Bunsan)
194
-
195
-
196
-
197
-
198
-
199
- '偏差積の計算 = 値Aの偏差と取得した値の偏差をかけあわせます。
200
-
201
- Dim Dev_pdt(5) As Double
202
-
203
-
204
-
205
- For s = 0 To 5
206
-
207
- Dev_pdt(s) = Self_dev(s) * values_dev(s)
208
-
209
- Next
210
-
211
-
212
-
213
-
214
-
215
- '偏差積平均の計算
216
-
217
- Dim Dev_avg = Aggregate Self In Dev_pdt Into Average()
218
-
219
-
220
-
221
- '相関係数算出 = 偏差積平均 / 値Aの標準偏差 * 取得した値の標準偏差
222
-
223
- Dim Soukan_Keisu As Double = Dev_avg / (Self_std_dev * values_std_dev)
224
-
225
-
226
-
227
- Soukan_Lbl.Text = Soukan_Keisu.ToString()
228
-
229
-
230
-
231
- End Sub
232
-
233
- End Class
239
+ 'データベースから値を取得する関数
240
+
241
+ Private Function Getvalues() As Decimal()
242
+
243
+
244
+
245
+ Dim result(5) As Decimal
246
+
247
+
248
+
249
+ Dim cnStr As String = System.Configuration.ConfigurationManager.
250
+
251
+ ConnectionStrings("testdb_tinoueConnectionString").ConnectionString
252
+
253
+
254
+
255
+ Using connection As New SqlConnection(cnStr)
256
+
257
+
258
+
259
+ 'FacilityID を指定して、該当するレコードのうち、日付が最新のものを取り出します。
260
+
261
+ Dim SQL As String
262
+
263
+ SQL = "SELECT valueA, valueB, valueC, valueD, valueE, valueF" &
264
+
265
+ " from tbl_valueTest as A" &
266
+
267
+ " WHERE Exists(SELECT * from tbl_valueTest" &
268
+
269
+ " group by FacilityID" &
270
+
271
+ " having FacilityID = A.FacilityID and MAX(date) = A.date)" &
272
+
273
+ " and FacilityID = 1"
274
+
275
+
276
+
277
+ Dim command As New SqlCommand(SQL, connection)
278
+
279
+
280
+
281
+ Try
282
+
283
+
284
+
285
+ connection.Open()
286
+
287
+
288
+
289
+ Dim dr As SqlDataReader = command.ExecuteReader()
290
+
291
+
292
+
293
+ Dim valuelist(5) As Decimal
294
+
295
+ While (dr.Read())
296
+
297
+ For count As Integer = 0 To 5
298
+
299
+ valuelist(count) = dr.GetSqlDecimal(count)
300
+
301
+ Next count
302
+
303
+ End While
304
+
305
+
306
+
307
+ result = valuelist
308
+
309
+
310
+
311
+ connection.Close()
312
+
313
+
314
+
315
+ Catch ex As Exception
316
+
317
+
318
+
319
+ End Try
320
+
321
+
322
+
323
+ End Using
324
+
325
+
326
+
327
+ Return result
328
+
329
+ End Function
234
330
 
235
331
  ```
236
-
237
-
238
-
239
- <関数部分>
240
-
241
- ```ここに言語を入力
242
-
243
- 'データベースから値を取得する関数
244
-
245
- Private Function Getvalues() As Decimal()
246
-
247
-
248
-
249
- Dim result(5) As Decimal
250
-
251
-
252
-
253
- Dim cnStr As String = System.Configuration.ConfigurationManager.
254
-
255
- ConnectionStrings("testdb_tinoueConnectionString").ConnectionString
256
-
257
-
258
-
259
- Using connection As New SqlConnection(cnStr)
260
-
261
-
262
-
263
- 'FacilityID を指定して、該当するレコードのうち、日付が最新のものを取り出します。
264
-
265
- Dim SQL As String
266
-
267
- SQL = "SELECT valueA, valueB, valueC, valueD, valueE, valueF" &
268
-
269
- " from tbl_valueTest as A" &
270
-
271
- " WHERE Exists(SELECT * from tbl_valueTest" &
272
-
273
- " group by FacilityID" &
274
-
275
- " having FacilityID = A.FacilityID and MAX(date) = A.date)" &
276
-
277
- " and FacilityID = 1"
278
-
279
-
280
-
281
- Dim command As New SqlCommand(SQL, connection)
282
-
283
-
284
-
285
- Try
286
-
287
-
288
-
289
- connection.Open()
290
-
291
-
292
-
293
- Dim dr As SqlDataReader = command.ExecuteReader()
294
-
295
-
296
-
297
- Dim valuelist(5) As Decimal
298
-
299
- While (dr.Read())
300
-
301
- For count As Integer = 0 To 5
302
-
303
- valuelist(count) = dr.GetSqlDecimal(count)
304
-
305
- Next count
306
-
307
- End While
308
-
309
-
310
-
311
- result = valuelist
312
-
313
-
314
-
315
- connection.Close()
316
-
317
-
318
-
319
- Catch ex As Exception
320
-
321
-
322
-
323
- End Try
324
-
325
-
326
-
327
- End Using
328
-
329
-
330
-
331
- Return result
332
-
333
- End Function
334
-
335
- ```