Files
hakorune/examples/app_statistics.hako

218 lines
5.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 📊 統計計算アプリ - 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!")