37 lines
1.3 KiB
Python
37 lines
1.3 KiB
Python
"""Statistical analysis helpers."""
|
|
|
|
from typing import Dict, List, Optional
|
|
|
|
import numpy as np
|
|
import pandas as pd
|
|
from scipy import stats
|
|
|
|
|
|
def descriptive_stats(values: List[float]) -> Dict[str, float]:
|
|
if not values:
|
|
return {"mean": 0.0, "std": 0.0, "min": 0.0, "max": 0.0, "median": 0.0}
|
|
arr = np.array(values, dtype=float)
|
|
return {
|
|
"mean": round(float(np.mean(arr)), 4),
|
|
"std": round(float(np.std(arr, ddof=1)), 4),
|
|
"min": round(float(np.min(arr)), 4),
|
|
"max": round(float(np.max(arr)), 4),
|
|
"median": round(float(np.median(arr)), 4),
|
|
}
|
|
|
|
|
|
def anova(groups: List[List[float]]) -> Dict[str, Optional[float]]:
|
|
"""One-way ANOVA across groups."""
|
|
if len(groups) < 2 or any(len(g) < 2 for g in groups):
|
|
return {"f_statistic": None, "p_value": None}
|
|
f_stat, p_value = stats.f_oneway(*groups)
|
|
return {"f_statistic": round(float(f_stat), 4), "p_value": round(float(p_value), 6)}
|
|
|
|
|
|
def paired_t_test(a: List[float], b: List[float]) -> Dict[str, Optional[float]]:
|
|
"""Paired t-test between two samples."""
|
|
if len(a) != len(b) or len(a) < 2:
|
|
return {"t_statistic": None, "p_value": None}
|
|
t_stat, p_value = stats.ttest_rel(a, b)
|
|
return {"t_statistic": round(float(t_stat), 4), "p_value": round(float(p_value), 6)}
|