Достигните целевого значения наклона, устранив выбросы с помощью python - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть набор данных, из которого я могу исключить максимум две точки данных, чтобы достичь целевого наклона 10. Мой критерий отклонения выброса состоит в том, чтобы сказать, находится ли наклон в пределах +/- 5%, если целевое значение (10),это ВСЕ ОК.Однако все вышеперечисленное должно быть удалено.

Пробный набор данных выглядит следующим образом:

Dataset

Как видно изС левой стороны изображения получаются три склона = 11,6,10,5 и 9,4.Однако целевой наклон равен 10.

На правой стороне данных я удалил точки данных, которые отклонялись вверх по склону, т. Е. Не позволяя ему достичь целевого наклона 10.

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

Как мне сделать это в Python?Любая помощь в этом вопросе высоко ценится.

1 Ответ

0 голосов
/ 25 сентября 2018

Прежде всего, это может быть сделано в python, если вы уже знаете нужный вам уклон, но вам нужно быть осторожным с ним, если у вас много данных.Во-вторых, с критериями 5% наклон 10,5 не будет исправлен.

решение, которое вы запрашивали

#some imports
import pandas as pd
import numpy as np
from scipy.stats import norm
from scipy import stats
import matplotlib.pyplot as plt
import pandas as pd
df = read_csv('your_file.csv')
state = 'USA'
desire_slope = 10
x = df[df['Country']==state][x]
y = df[df['Country']==state][y]

'''to use for test
x = [ 4+(i/10) for i in range(100)]
y = [c*11+norm.rvs()*4 for c in x ]
'''
z = [abs(v-desire_slope*c) for v,c in zip(y,x)]

slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
print(slope)
if(abs(slope-desire_slope)/slope<0.05):
    print("slope is fine")
else:
    sorted_index_pos = [index for index, num in sorted(enumerate(z), key=lambda x: x[-1])][-2:]
    print(sorted_index_pos)
    del x[sorted_index_pos[-1]]
    del y[sorted_index_pos[-1]]
    del x[sorted_index_pos[0]]
    del y[sorted_index_pos[0]]

new_slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
print(new_slope)

Выход :

11.08066739990693
[78, 85]
11.026005655263733

Почему вам нужно быть осторожным

сначала мы не учитываем перехват, и это может быть проблемой.Кроме того, если я запускаю следующее:

x = [ 4+(i/100) for i in range(1000)]
y = [c*10+norm.rvs()*4 for c in x ]

slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
print("the slope here is: "+str(slope))
z = [c*slope for c in x]
print("average of values: "+str(sum(x)/len(x)))
plt.plot(x,y,'b',x,z,'r-')

я получаю следующий вывод:

the slope here is: 10.04367376783041
average of values: 8.995

enter image description here

, который показывает, чтоточки не обязательно распределены одинаково по обе стороны склона.Дальнейшая пробежка точки может привести к еще большему дисбалансу набора данных и, следовательно, к улучшению наклона.Так что будьте осторожны при этом

...