• Stars
    star
    31
  • Rank 820,005 (Top 17 %)
  • Language
    Crystal
  • License
    GNU General Publi...
  • Created over 8 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

An expressive crystal implementation of statistical distributions and usual math functions. 📊

Migrated to https://git.sceptique.eu/Sceptique/stats

stats

An expressive implementation of statistical distributions. Compatible with crystal v0.27.0.

Installation

Add this to your application's shard.yml:

dependencies:
  stats:
    git: https://git.sceptique.eu/Sceptique/stats

Usage

Include it

require "stats"
include Stats

Normal distribution

NormaleDistribution.between # less_than, greater_than
  standard_deviation: 15,
  esperance: 100,
  min: 85,
  max: 115
  # => 0.6826894921370859

Binomial distribution

Math.binomial_distribution(
  tries: 3,
  probability: 0.5,
  success: 1)
  # => 0.375

Binomial coefficient

Math.coef_binomial(5, 2) # => 10

Factorial

Math.factorial(4) # => 24

Radian and degree

90.radian # => (Math::PI / 2)
(Math::PI / 4) # => 45.0

Series & Statistics

[1, 2, 3].mean # => 2.0
[1, 2, 3].variance # => 0.6667
[1, 2, 3].standard_deviation # => 0.8165
[1, 2, 3].quadratic_mean # => 2.16
[2, 32].geometric_mean # => 8.0
[40, 60].harmonic_mean # => 48.0
[1,2,3,2,1].macd 3 # => [2.0, 2.333, 2.0]

Correlations

[1,2,3,4].covariance [4,2,1,0] # => -1.625
[1,2,3,4].correlation_coef [1,2,3,3] + 1 > 1.5 # => true
[1,2,3,4].correlation_coef [-14,14,101,-100] + 1 > 1.5 # => false

Median

[1, 2, 5].median # => 2.0
[42, 1337].median # => 685.5

Quartiles & Boxplot

Note: not big compatible yet

[1, 3, 5].first_quartile  # => 2.0 (alias of lower_quartile)
[1, 3, 5].second_quartile # => 3.0 (alias of median)
[1, 3, 5].third_quartile  # => 4.0 (alias of upper_quartile)
[1, 3, 5].quartiles       # => [2.0, 3.0, 4.0] ([Q1, Q2, Q3])
arr = [-23, -5, 2, 5, 5, 6, 7, 8, 14, 15, 42, 1337]

arr.first_quartile  # => 3.5  (Q1)
arr.second_quartile # => 6.5  (Q2)
arr.third_quartile  # => 14.5 (Q3)
arr.interquartile_range # => 11.0 (alias of iqr) (IQR = Q3 - Q1)

# Tukey's fences with k = 1.5 (default parameter value)
arr.lower_fence # => -13.0 (Q1 - 1.5 * IQR)
arr.upper_fence # => 31    (Q3 + 1.5 * IQR)
arr.lower_outliers # => [-23]
arr.upper_outliers # => [42, 1337]

# Tukey's fences with k = 3 for "far out" outliers
arr.upper_fence(3)    # => 47.5 (Q3 + 3 * IQR)
arr.upper_outliers(3) # => [1337]

Frequency

[0, 1, 2, 3].frequency_of(0) # => 0.25 (amount of X in the population, by the size of the population)
[0, 0, 1, 2, 3].all_frequencies # => { 0 => 0.4, 1 => 0.2, 2 => 0.2, 3 => 0.2}

Development

  • The lib should take care of "big" numbers

Contributing

  1. Fork it ( https://github.com/Nephos/stats/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Contributors

  • Nephos Arthur Poulet - creator, maintainer