218 lines
5.1 KiB
Plaintext
218 lines
5.1 KiB
Plaintext
|
|
// 📊 統計計算アプリ - MathBox新機能を活用!
|
|||
|
|
// Everything is Box哲学による統計ライブラリ
|
|||
|
|
|
|||
|
|
print("📊 === Statistics Calculator ===")
|
|||
|
|
print("MathBox拡張機能を活用した統計計算デモ\n")
|
|||
|
|
|
|||
|
|
// デバッグトラッキング開始
|
|||
|
|
DEBUG = new DebugBox()
|
|||
|
|
DEBUG.startTracking()
|
|||
|
|
|
|||
|
|
// 統計計算を行うBox
|
|||
|
|
box Statistics {
|
|||
|
|
init {
|
|||
|
|
data,
|
|||
|
|
math
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// データ追加
|
|||
|
|
func addData(value) {
|
|||
|
|
me.data.push(value)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// データ一括追加
|
|||
|
|
func addMultiple(values) {
|
|||
|
|
i = 0
|
|||
|
|
loop(i < values.length()) {
|
|||
|
|
me.addData(values.get(i))
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 平均値計算
|
|||
|
|
func mean() {
|
|||
|
|
if (me.data.length() == 0) {
|
|||
|
|
return new NullBox()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sum = 0
|
|||
|
|
i = 0
|
|||
|
|
loop(i < me.data.length()) {
|
|||
|
|
sum = sum + me.data.get(i)
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 除算がないので掛け算で代用
|
|||
|
|
count = me.data.length()
|
|||
|
|
mean = sum * me.math.pow(count, -1) // sum / count
|
|||
|
|
return mean
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 分散計算
|
|||
|
|
func variance() {
|
|||
|
|
if (me.data.length() == 0) {
|
|||
|
|
return new NullBox()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
avg = me.mean()
|
|||
|
|
sumSquaredDiff = 0
|
|||
|
|
i = 0
|
|||
|
|
|
|||
|
|
loop(i < me.data.length()) {
|
|||
|
|
diff = me.data.get(i) - avg
|
|||
|
|
sumSquaredDiff = sumSquaredDiff + (diff * diff)
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
count = me.data.length()
|
|||
|
|
variance = sumSquaredDiff * me.math.pow(count, -1)
|
|||
|
|
return variance
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 標準偏差計算
|
|||
|
|
func standardDeviation() {
|
|||
|
|
var = me.variance()
|
|||
|
|
// NullBoxかどうかチェック(型チェックで判定)
|
|||
|
|
if (var.type_name() == "NullBox") {
|
|||
|
|
return new NullBox()
|
|||
|
|
}
|
|||
|
|
return me.math.sqrt(var)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 最大値
|
|||
|
|
func max() {
|
|||
|
|
if (me.data.length() == 0) {
|
|||
|
|
return new NullBox()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
maxVal = me.data.get(0)
|
|||
|
|
i = 1
|
|||
|
|
loop(i < me.data.length()) {
|
|||
|
|
maxVal = me.math.max(maxVal, me.data.get(i))
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
return maxVal
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 最小値
|
|||
|
|
func min() {
|
|||
|
|
if (me.data.length() == 0) {
|
|||
|
|
return new NullBox()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
minVal = me.data.get(0)
|
|||
|
|
i = 1
|
|||
|
|
loop(i < me.data.length()) {
|
|||
|
|
minVal = me.math.min(minVal, me.data.get(i))
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
return minVal
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 範囲(レンジ)
|
|||
|
|
func range() {
|
|||
|
|
return me.max() - me.min()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// データ表示
|
|||
|
|
func showData() {
|
|||
|
|
print("\n📈 Data points (" + me.data.length() + " items):")
|
|||
|
|
i = 0
|
|||
|
|
loop(i < me.data.length()) {
|
|||
|
|
print(" [" + i + "] = " + me.data.get(i))
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 統計サマリー表示
|
|||
|
|
func summary() {
|
|||
|
|
print("\n📊 Statistical Summary:")
|
|||
|
|
print(" Count: " + me.data.length())
|
|||
|
|
print(" Mean: " + me.mean())
|
|||
|
|
print(" Std Dev: " + me.standardDeviation())
|
|||
|
|
print(" Min: " + me.min())
|
|||
|
|
print(" Max: " + me.max())
|
|||
|
|
print(" Range: " + me.range())
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 統計インスタンスを作成する関数
|
|||
|
|
function createStatistics() {
|
|||
|
|
stats = new Statistics()
|
|||
|
|
stats.data = new ArrayBox()
|
|||
|
|
stats.math = new MathBox()
|
|||
|
|
return stats
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// テストデータで実行
|
|||
|
|
print("\n🧪 Test 1: 学生のテスト得点分析")
|
|||
|
|
stats = createStatistics()
|
|||
|
|
DEBUG.trackBox(stats, "Statistics-TestScores")
|
|||
|
|
|
|||
|
|
// テストスコアを追加
|
|||
|
|
scores = new ArrayBox()
|
|||
|
|
scores.push(85)
|
|||
|
|
scores.push(92)
|
|||
|
|
scores.push(78)
|
|||
|
|
scores.push(95)
|
|||
|
|
scores.push(88)
|
|||
|
|
scores.push(73)
|
|||
|
|
scores.push(90)
|
|||
|
|
scores.push(82)
|
|||
|
|
|
|||
|
|
stats.addMultiple(scores)
|
|||
|
|
stats.showData()
|
|||
|
|
stats.summary()
|
|||
|
|
|
|||
|
|
// 新しい機能:三角関数を使った周期データ分析
|
|||
|
|
print("\n\n🌊 Test 2: 周期的データ分析(正弦波)")
|
|||
|
|
wave = createStatistics()
|
|||
|
|
DEBUG.trackBox(wave, "Statistics-WaveData")
|
|||
|
|
|
|||
|
|
// 正弦波データを生成
|
|||
|
|
math = new MathBox()
|
|||
|
|
pi = math.getPi()
|
|||
|
|
i = 0
|
|||
|
|
loop(i < 20) {
|
|||
|
|
// angle = i * π / 10
|
|||
|
|
angle = i * pi * 0.1 // 除算の代わり
|
|||
|
|
value = math.sin(angle) * 10 + 50 // 振幅10、中心50
|
|||
|
|
wave.addData(math.round(value))
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
wave.showData()
|
|||
|
|
wave.summary()
|
|||
|
|
|
|||
|
|
// 対数正規分布風のデータ
|
|||
|
|
print("\n\n📈 Test 3: 成長データ分析(指数関数的)")
|
|||
|
|
growth = createStatistics()
|
|||
|
|
DEBUG.trackBox(growth, "Statistics-GrowthData")
|
|||
|
|
|
|||
|
|
i = 1
|
|||
|
|
loop(i <= 10) {
|
|||
|
|
// 指数関数的成長をシミュレート
|
|||
|
|
value = math.exp(i * 0.3) * 10
|
|||
|
|
growth.addData(math.round(value))
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
growth.showData()
|
|||
|
|
growth.summary()
|
|||
|
|
|
|||
|
|
// NullBox活用:欠損データの扱い
|
|||
|
|
print("\n\n🔍 Test 4: 欠損データの扱い")
|
|||
|
|
incomplete = createStatistics()
|
|||
|
|
incomplete.addData(10)
|
|||
|
|
incomplete.addData(20)
|
|||
|
|
// 空のデータセットの統計値
|
|||
|
|
empty = createStatistics()
|
|||
|
|
emptyMean = empty.mean()
|
|||
|
|
|
|||
|
|
print("Empty dataset mean is null: " + emptyMean.is_null())
|
|||
|
|
|
|||
|
|
// メモリ使用状況
|
|||
|
|
print("\n\n💾 Memory Report:")
|
|||
|
|
print(DEBUG.memoryReport())
|
|||
|
|
|
|||
|
|
print("\n✅ Statistics Calculator completed!")
|