Прежде всего, это может быть сделано в 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
, который показывает, чтоточки не обязательно распределены одинаково по обе стороны склона.Дальнейшая пробежка точки может привести к еще большему дисбалансу набора данных и, следовательно, к улучшению наклона.Так что будьте осторожны при этом