Skip to main content

skewness

Function skewness 

Source
pub fn skewness(data: &[f64]) -> StatsResult<f64>
Expand description

Calculate skewness (measure of asymmetry)

Examples found in repository?
examples/advanced_statistics.rs (line 26)
6fn main() {
7    println!("=== Advanced Statistics Demo ===\n");
8
9    // Sample dataset: student test scores
10    let scores = vec![
11        85.0, 92.0, 78.0, 95.0, 88.0, 76.0, 89.0, 94.0, 81.0, 87.0, 90.0, 83.0, 86.0, 91.0, 79.0,
12    ];
13
14    println!("📊 Student Test Scores: {:?}\n", scores);
15
16    // Basic statistics
17    println!("Basic Statistics:");
18    println!("  Mean: {:.2}", scores.mean().unwrap());
19    println!("  Median: {:.2}", scores.median().unwrap());
20    println!("  Std Dev: {:.2}", scores.std_dev().unwrap());
21    println!("  Coefficient of Variation: {:.2}%", coefficient_of_variation(&scores).unwrap());
22    println!("  Standard Error: {:.2}", standard_error(&scores).unwrap());
23
24    // Distribution shape
25    println!("\n📈 Distribution Shape:");
26    println!("  Skewness: {:.4}", skewness(&scores).unwrap());
27    println!("  Kurtosis: {:.4}", kurtosis(&scores).unwrap());
28
29    // Normalization
30    println!("\n🔄 Normalized Scores (0-1 scale):");
31    let normalized = normalize_min_max(&scores).unwrap();
32    println!("  First 5: {:?}", &normalized[0..5].iter().map(|&x| format!("{:.2}", x)).collect::<Vec<_>>());
33
34    // Grade scaling (60-100 scale)
35    println!("\n📏 Scaled to 60-100:");
36    let scaled = normalize_range(&scores, 60.0, 100.0).unwrap();
37    println!("  First 5: {:?}", &scaled[0..5].iter().map(|&x| format!("{:.2}", x)).collect::<Vec<_>>());
38
39    // Linear regression: study hours vs test scores
40    println!("\n📉 Linear Regression: Study Hours vs Test Scores");
41    let study_hours = vec![2.0, 3.5, 1.5, 5.0, 3.0, 1.0, 3.5, 4.5, 2.5, 3.0, 4.0, 2.0, 3.0, 4.0, 1.5];
42    
43    let regression = linear_regression(&study_hours, &scores).unwrap();
44    println!("  Slope: {:.2} (points per hour)", regression.slope);
45    println!("  Intercept: {:.2}", regression.intercept);
46    println!("  R²: {:.4}", regression.r_squared);
47    
48    // Predict score for 6 hours of study
49    let predicted_score = regression.predict(6.0);
50    println!("  Predicted score for 6 hours of study: {:.2}", predicted_score);
51
52    // Correlation analysis
53    println!("\n🔗 Correlation Analysis:");
54    let corr = correlation(&study_hours, &scores).unwrap();
55    println!("  Correlation between study hours and scores: {:.4}", corr);
56
57    // Normal distribution analysis
58    println!("\n📊 Normal Distribution Analysis:");
59    let mean = scores.mean().unwrap();
60    let std_dev = scores.std_dev().unwrap();
61    
62    println!("  Using mean={:.2}, std_dev={:.2}", mean, std_dev);
63    
64    // Probability of scoring exactly 85
65    let pdf_85 = normal_pdf(85.0, mean, std_dev).unwrap();
66    println!("  PDF at score 85: {:.6}", pdf_85);
67    
68    // Probability of scoring 85 or less
69    let cdf_85 = normal_cdf(85.0, mean, std_dev).unwrap();
70    println!("  Probability of scoring ≤85: {:.2}%", cdf_85 * 100.0);
71    
72    // Probability of scoring 90 or less
73    let cdf_90 = normal_cdf(90.0, mean, std_dev).unwrap();
74    println!("  Probability of scoring ≤90: {:.2}%", cdf_90 * 100.0);
75    
76    // Probability of scoring above 90
77    println!("  Probability of scoring >90: {:.2}%", (1.0 - cdf_90) * 100.0);
78
79    // Real-world interpretation
80    println!("\n💡 Insights:");
81    if regression.r_squared > 0.7 {
82        println!("  ✓ Strong correlation between study hours and test scores!");
83    } else if regression.r_squared > 0.4 {
84        println!("  ≈ Moderate correlation between study hours and test scores.");
85    } else {
86        println!("  ✗ Weak correlation between study hours and test scores.");
87    }
88    
89    let skew_val = skewness(&scores).unwrap();
90    if skew_val.abs() < 0.5 {
91        println!("  ✓ The score distribution is approximately symmetric.");
92    } else if skew_val > 0.0 {
93        println!("  ⚠ The distribution is right-skewed (more low scores).");
94    } else {
95        println!("  ⚠ The distribution is left-skewed (more high scores).");
96    }
97    
98    let cv = coefficient_of_variation(&scores).unwrap();
99    if cv < 10.0 {
100        println!("  ✓ Low variability: scores are consistent.");
101    } else if cv < 20.0 {
102        println!("  ≈ Moderate variability in scores.");
103    } else {
104        println!("  ⚠ High variability: scores are widely spread.");
105    }
106}