import pandas as pd
dt=pd.read_csv('slump_test.data')
dt
dt.info()
dt.describe()
df=dt.drop(columns=['No'])
df
#using formula
import matplotlib.pyplot as plt
import seaborn as sns
sns.pairplot(df)
import numpy as np
x=df['SLUMP(cm)'].values
y=df['FLOW(cm)'].values
mean_x=np.mean(x)
mean_y=np.mean(y)
#linear regression
m=len(x)
num=0
den=0
for i in range(m):
    num+=(x[i]-mean_x)*(y[i]-mean_y)
    den+=(x[i]-mean_x)**2
m=num/den
c=mean_y - (m * mean_x)
print(f"m = {m}\n c = {c}")
max_x=np.max(x)+100
min_x=np.min(y)-100

X=np.linspace(min_x,max_x,103)
Y=c+m*X
plt.figure(figsize=(8,6))
plt.plot(X, Y, color='Blue', label='Regression Line')
plt.scatter(x, y, c='Brown', label='data points')
plt.scatter(max_x,min_x,c='Black', label='outliers')
plt.xlabel('SLUMP(cm)')
plt.ylabel('FLOW(cm)')
plt.legend()
plt.show()
#mean squared error
t_s=0
t_sr=0
for i in range(len(x)):
    y_pred=c + m*x[i]
    t_s += (y[i] - mean_y) ** 2
    t_sr += (y[i] - y_pred) ** 2
r=1-(t_sr/t_s)
print('Mean Squared Error:',r)
#using packages
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression 
from sklearn.metrics import mean_squared_error, mean_absolute_error

p = df['SLUMP(cm)'].values.reshape(-1,1)
q = df['FLOW(cm)'].values.reshape(-1,1)

X_train, X_test, y_train, y_test = train_test_split(p, q, test_size=0.2, random_state=42)

model=LinearRegression()
model.fit(X_train,y_train)

i=model.intercept_
c=model.coef_

print(f'Coefficients: {c}')
print(f'Intercept: {i}')
y_pred=model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse}')

mae = mean_absolute_error(y_test, y_pred)
print(f'Mean Absolute Error: {mae}') 

rmse = np.sqrt(mse)
print(f'Root Mean Squared Error: {rmse}')
plt.scatter(X_test, y_test, label='Testing Set', color='blue') # original data points of test dataset
plt.plot(X_test, y_pred, color='red', label='Linear Regression Line') # linear regression line
plt.xlabel('SLUMP(cm)')
plt.ylabel('FLOW(cm)')
plt.title('Linear Regression')
plt.legend()
plt.show()
