Метод определения точки, где числа резко падают

У меня есть ряд чисел:

numbers = [100, 101, 99, 102, 99, 98, 100,  97.5, 98, 99, 95, 93, 90, 85, 80]

график чисел

Очень наглядно видно, что числа начинают резко падать примерно на 10, но есть ли простой способ определить эту точку (или близкую к ней) на оси х?

Это делается ретроспективно, так что вы можете использовать весь список чисел, чтобы выбрать точку оси x, где ускорение выпадения ускоряется.

Python-решения предпочтительнее, но псевдокод или общая методология тоже подойдут.

1 ответ

Решение

Хорошо, это в конечном итоге соответствует моим потребностям. Я вычисляю среднее значение, отклонение стандартного отклонения и cdf при распределении, чтобы сказать, насколько маловероятно каждое последующее значение.

Это работает только с уменьшениями, так как я проверяю только для cdf < 0,05, но это работает очень хорошо.

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

numbers = np.array([100, 101, 99, 102, 99, 98, 100,  97.5, 98, 99, 95, 93, 90, 85, 80])

# Calculate a running mean
cum_mean = numbers.cumsum() / (np.arange(len(numbers)) + 1)

# Calculate a running standard deviation
cum_std = np.array([numbers[:i].std() for i in range(len(numbers))])

# Calculate a z value 
cum_z =  (numbers[1:] - cum_mean[:-1]) / cum_std[:-1]

# Add in NA vals to account for records without sample size
z_vals = np.concatenate((np.zeros(1+2), cum_z[2:]), axis=0)

# Calculate cdf 
cum_t = np.array([stats.t.cdf(z, i) for i, z in enumerate(z_vals)])

# Identify first number to fall below threshold
first_deviation = np.where(cum_t < 0.05)[0].min()

fig, ax = plt.subplots()

# plot the numbers and the point immediately prior to the decrease
ax.plot(numbers)
ax.axvline(first_deviation-1, color='red')

номера с обнаруженным падением

Другие вопросы по тегам