Поиск линий тренда данных с помощью Ruby?

У меня есть набор данных с номерами сеансов пользователей с моего сайта, который выглядит так:

page_1 = [4,2,4,1,2,6,3,2,1,6,2,7,0,0,0]
page_2 = [6,3,2,3,5,7,9,3,1,6,1,6,2,7,8]
...

И так далее.

Я хотел бы узнать, имеет ли страница положительную или отрицательную линию тренда с точки зрения роста, однако я также хотел бы получить страницы, которые растут/падают за определенный порог.

У Python есть масса решений и библиотек для такого рода задач, но у Ruby есть только одна жемчужина (линия тренда ), в котором нет кода. Прежде чем я начну учиться делать это с помощью математики, может быть, у кого-нибудь есть рабочее решение?


person The Whiz of Oz    schedule 20.07.2018    source источник
comment
Посмотрите здесь: sciruby.com/blog/2013/11/07/   -  person Casper    schedule 20.07.2018
comment
Что значит, у него нет кода? В README есть четкий пример использования?   -  person Tom Lord    schedule 20.07.2018
comment
@TomLord да, Readme хорош, но посмотри в репо;)   -  person The Whiz of Oz    schedule 20.07.2018
comment
Редко бывает только 1 гем github.com/daugaard/linear-regression github.com/escline/linefit github.com/kei500/liblinear-ruby github.com/clbustos/ statsample, но все они определенно ориентированы на серьезную статистику и намного сложнее, чем trendline похоже, что это было задумано   -  person engineersmnky    schedule 20.07.2018


Ответы (1)


Найдя математическую формулу для линий тренда, вы можете довольно легко определить свой собственный метод. Например, следуя этому https://math.stackexchange.com/questions/204020/what-is-the-equation-used-to-calculate-a-linear-trendline, я исправил класс Array.

class Array

  def trend_line
    points = map.with_index { |y, x| [x+1, y] }
    n = points.size
    summation_xy = points.map{ |e| e[0]*e[1] }.inject(&:+)
    summation_x = points.map{ |e| e[0] }.inject(&:+)
    summation_y = points.map{ |e| e[1] }.inject(&:+)
    summation_x2 = points.map{ |e| e[0]**2 }.inject(&:+)
    slope = ( n * summation_xy - summation_x * summation_y ) / ( n * summation_x2 - summation_x**2 ).to_f
    offset = ( summation_y - slope * summation_x ) / n.to_f
    {slope: slope, offset: offset}
  end

end

p page_1.trend_line #=> {:slope=>-0.1357142857142857, :offset=>3.7523809523809524}
p page_2.trend_line #=> {:slope=>0.1, :offset=>3.8}

Наклон дает вам рост: знак указывает направление ( + растет, - уменьшается), значение указывает, насколько быстро.

person iGian    schedule 21.07.2018