Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- from scipy.stats import t
- from IPython.display import Latex
- def f(x):
- return round(k*x + b, 4)
- def f_1(x):
- return k*x + b
- def delta(x, t_gamma):
- return ( (t_gamma*S_y)/np.sqrt(valid_n) ) * np.sqrt(1 + (x - x_mean)**2 / dispersion_y)
- def grafik(df, x_min, x_max):
- df_x = df[df.columns[0]]
- df_y = df[df.columns[1]]
- x = np.linspace(x_min, x_max, 20)
- y = f_1(x)
- delta_y = delta(x, t_gamma)
- delta_y_top = y + delta_y
- delta_y_bottom = y - delta_y
- plt.title(f"Надійність = {gamma*100}%")
- plt.xlabel("x")
- plt.ylabel("y")
- plt.grid()
- plt.plot(df_x, df_y, 'ro', label='Точки')
- plt.plot(x, y, label='Лінійна регресія')
- plt.plot(x, delta_y_top, '--', color='green', label='Інтервал довіри')
- plt.plot(x, delta_y_bottom, '--', color='green')
- plt.fill_between(x, delta_y_top, delta_y_bottom, color='green', alpha=0.1)
- plt.legend()
- plt.show()
- data = {
- "Номер району": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
- "Збір овочів з 1га (ц)": [52.8, 72.6, 50.4, 33.4, 31.5, 54.6, 54.3, 36.6, 15.6, 73.2, 65.9, 44.6, 23.7, 64.6, 25.6],
- "Рівень збитковості (%)": [31.4, 30.9, 37.1, 45.7, 57.7, 46.7, 33.3, 63.8, 68.8, 29.8, 39.4, 46.2, 68.8, 34.0, 47.6]}
- df = pd.DataFrame(data)
- df.set_index('Номер району', inplace=True)
- print(df, '\n')
- valid_n = len(df)
- sum_x = round(df[df.columns[0]].sum(), 1)
- sum_y = round(df[df.columns[1]].sum(), 1)
- sum_xx = (df[df.columns[0]] ** 2).sum()
- sum_yy = (df[df.columns[1]] ** 2).sum()
- sum_xy = round((df[df.columns[0]] * df[df.columns[1]]).sum(), 3)
- x_mean = round(df[df.columns[0]].mean(), 3)
- y_mean = round(df[df.columns[1]].mean(), 3)
- min_x = df[df.columns[0]].min()
- max_x = df[df.columns[0]].max()
- dispersion_x = round(sum_xx / valid_n - x_mean**2, 3)
- dispersion_y = round(sum_yy / valid_n - y_mean**2, 3)
- table_1 = pd.DataFrame(data=[valid_n, min_x, max_x, sum_x, sum_y, sum_xx, sum_yy, sum_xy, x_mean, y_mean, dispersion_x, dispersion_y],
- index=['Valid N','min X', 'max X', 'sum X', 'sum Y', 'sum X^2', 'sum Y^2', 'sum X*Y', 'X mean', 'Y mean', 'D_x', 'D_y'], columns=['Значення'])
- print(table_1, '\n')
- k = round((sum_xy/valid_n - x_mean*y_mean) / dispersion_x, 4)
- b = round(y_mean - k * x_mean, 4)
- display(Latex(f'Знайдемо коефіцієнти рівняння лінійной регресії:\n'))
- display(Latex(fr'$k = \frac{{ (\frac{{ sum_{{xy}} }}{{ valid_n }} - x_{{mean}} \cdot y_{{mean}} ) }}{{ dispersion_x }} = '
- fr'\frac{{ (\frac{{{sum_xy}}}{{{ valid_n }}} - {x_mean} \cdot {y_mean} ) }}{{{dispersion_x }}} = {k}$'))
- display(Latex(f'$b = y_{{mean}} - k \cdot x_{{mean}} = {y_mean} - {k} \cdot {x_mean} = {b}$'))
- r = round(k * np.sqrt(dispersion_x / dispersion_y), 4)
- display(Latex(f'\nЗнайдемо коефіцієнт кореляції:\n'))
- display(Latex(fr'$r = k \cdot \sqrt{{ \frac{{ dispersion_x }}{{ dispersion_y }} }} = {k} \cdot \sqrt{{ \frac{{{dispersion_x}}}{{{dispersion_y}}} }}= {r}$'))
- if abs(r) < 0.6:
- riven = 'низьким'
- display(Latex("Тіснота лінійного зв'язку слабка $(|r| < 0.6)$"))
- if abs(r) >= 0.6 and abs(r) <= 0.9:
- riven = 'середнім'
- display(Latex(fr"Тіснота лінійного зв'язку середня $(0.6 \leqslant |r| \leqslant 0.9)$"))
- if abs(r) > 0.9:
- riven = 'високим'
- display(Latex("Тіснота лінійного зв'язку сильна $(|r| > 0.9)$"))
- display(Latex(f"Тоді, застосовуючи отриманий результат, можна зробити висновок: між факторами $x$ і $y$ спострігається лінійний"))
- display(Latex(f"звя'зок з {riven} рівнем тісноти.\n"))
- y_x_min = f(min_x)
- y_x_mean = f(x_mean)
- y_x_max = f(max_x)
- display(Latex(f'Зробимо передбачення в заданих точках, вважаючи цими точками найменьше, середнє і найбільше значення $x$.\n'))
- display(Latex(f'$y(x) = k \cdot x + b$'))
- display(Latex(f'$y(x_{{min}}) = y({min_x}) = {k} \cdot {min_x} + {b} = {y_x_min}$'))
- display(Latex(f'$y(x_{{mean}}) = y({x_mean}) = {k} \cdot {x_mean} + {b} = {y_x_mean}$'))
- display(Latex(f'$y(x_{{max}}) = y({max_x}) = {k} \cdot {max_x} + {b} = {y_x_max}$'))
- hope = [0.80, 0.95, 0.99, 0.999]
- for i in hope:
- display(Latex(f'Знайдемо інтревали довіри в заданих точках з надійністю ${i}$:\n'))
- gamma = i
- S_y = round(np.sqrt(valid_n/(valid_n-1) * dispersion_y), 4)
- t_gamma = round(t.ppf((1+gamma)/2, valid_n-1), 4)
- delta_x_min = delta(min_x, t_gamma)
- delta_x_mean = delta(x_mean, t_gamma)
- delta_x_max = delta(max_x, t_gamma)
- display(Latex(fr'$S_y = \sqrt{{ \frac{{valid N}}{{(valid N - 1)}} \cdot dispersion_y}} = \sqrt{{ \frac{{{valid_n}}}{{({valid_n} - 1)}} \cdot {dispersion_y}}} = {S_y}$'))
- display(Latex(f'Ширина інтервалу довіри:'))
- display(Latex(fr'$delta(x) = \frac{{t_{{gamma}} \cdot S_y}}{{\sqrt{{valid N}}}} \cdot \sqrt{{1 + \frac{{ (x - x_{{mean}})^2}}{{ dispersion_y }} }}$'))
- display(Latex(fr'$delta(x_{{min}}) = delta({min_x}) = \frac{{ {t_gamma} \cdot {S_y} }}{{ \sqrt{{{valid_n}}} }} \cdot \sqrt{{1 + \frac{{({min_x} - {x_mean})^2}}{{{dispersion_y}}} }} = {round(delta_x_min, 4)}$'))
- display(Latex(fr'$delta(x_{{mean}}) = delta({x_mean}) = \frac{{ {t_gamma} \cdot {S_y} }}{{ \sqrt{{{valid_n}}} }} \cdot \sqrt{{1 + \frac{{({x_mean} - {x_mean})^2}}{{{dispersion_y}}} }} = {round(delta_x_mean, 4)}$'))
- display(Latex(fr'$delta(x_{{max}}) = delta({max_x}) = \frac{{ {t_gamma} \cdot {S_y} }}{{ \sqrt{{{valid_n}}} }} \cdot \sqrt{{1 + \frac{{({max_x} - {x_mean})^2}}{{{dispersion_y}}} }} = {round(delta_x_max, 4)}$'))
- display(Latex(f'Отже, отримаємо інтревали довіри для передбачень $y$ в заданих точках:\n'))
- display(Latex(fr'$y(x) - delta(x) \leqslant y \leqslant y(x) + delta(x)$'))
- display(Latex(fr'$x = {min_x}: \quad {round(f(min_x) - delta_x_min, 4)} \leqslant y \leqslant {round(f(min_x) + delta_x_min, 4)}$'))
- display(Latex(fr'$x = {x_mean}: \quad {round(f(x_mean) - delta_x_mean, 4)} \leqslant y \leqslant {round(f(x_mean) + delta_x_mean, 4)}$'))
- display(Latex(fr'$x = {max_x}: \quad {round(f(max_x) - delta_x_max, 4)} \leqslant y \leqslant {round(f(max_x) + delta_x_max, 4)}$'))
- grafik(df, min_x, max_x)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement