In [1]:
# 1. Import libraries
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
In [2]:
# 2. Dataset
data = {
'Brand': ['Toyota', 'Honda', 'BMW', 'Toyota', 'Honda', np.nan, 'Tata', 'Hyundai', 'Tata', 'Maruti Suzuki', 'Maruti Suzuki', np.nan, 'Hyundai', 'Toyota', 'Maruti Suzuki', 'Honda', 'Maruti Suzuki', 'Tata', 'BMW', 'Maruti Suzuki'],
'Model': ['Corolla', 'Civic', 'X5', 'Yaris', np.nan, 'City', 'Magic Iris', 'Creta', 'Nexon', 'Eeco', 'Celerio', 'Vitara Brezza', 'i20', 'Fortuner', 'Alto', 'i10', 'Ignis', 'Punch', 'M5', 'Baleno'],
'Year': [2015, 2018, 2020, 2017, 2019, 2016, 2014, 2018, 2021, 2015, 2017, 2020, 2019, 2017, 2013, 2010, 2018, 2019, 2018, 2019],
'Mileage': [50000, 30000, np.nan, 40000, 35000, 45000, 30000, 45000, np.nan, 40000, 45000, 40000, 35000, 50000, 40000, 35000, 45000, 45000, 55000, 45000],
'Price': [700000, 850000, 3500000, 600000, 900000, 650000, 350000, 800000, 850000, 600000, 600000, 900000, 650000, 1500000, 500000, 550000, 700000, 750000, 3000000, 650000]
}
df = pd.DataFrame(data)
print("Original DataFrame with Missing Values:\n", df)
Original DataFrame with Missing Values:
Brand Model Year Mileage Price
0 Toyota Corolla 2015 50000.0 700000
1 Honda Civic 2018 30000.0 850000
2 BMW X5 2020 NaN 3500000
3 Toyota Yaris 2017 40000.0 600000
4 Honda NaN 2019 35000.0 900000
5 NaN City 2016 45000.0 650000
6 Tata Magic Iris 2014 30000.0 350000
7 Hyundai Creta 2018 45000.0 800000
8 Tata Nexon 2021 NaN 850000
9 Maruti Suzuki Eeco 2015 40000.0 600000
10 Maruti Suzuki Celerio 2017 45000.0 600000
11 NaN Vitara Brezza 2020 40000.0 900000
12 Hyundai i20 2019 35000.0 650000
13 Toyota Fortuner 2017 50000.0 1500000
14 Maruti Suzuki Alto 2013 40000.0 500000
15 Honda i10 2010 35000.0 550000
16 Maruti Suzuki Ignis 2018 45000.0 700000
17 Tata Punch 2019 45000.0 750000
18 BMW M5 2018 55000.0 3000000
19 Maruti Suzuki Baleno 2019 45000.0 650000
In [3]:
#3. Handle missing values
# For categorical columns, fill with the most frequent value
cat_imputer = SimpleImputer(strategy='most_frequent')
df[['Brand', 'Model']] = cat_imputer.fit_transform(df[['Brand', 'Model']])
In [4]:
print("after filling most frequent values:\n", df)
after filling most frequent values:
Brand Model Year Mileage Price
0 Toyota Corolla 2015 50000.0 700000
1 Honda Civic 2018 30000.0 850000
2 BMW X5 2020 NaN 3500000
3 Toyota Yaris 2017 40000.0 600000
4 Honda Alto 2019 35000.0 900000
5 Maruti Suzuki City 2016 45000.0 650000
6 Tata Magic Iris 2014 30000.0 350000
7 Hyundai Creta 2018 45000.0 800000
8 Tata Nexon 2021 NaN 850000
9 Maruti Suzuki Eeco 2015 40000.0 600000
10 Maruti Suzuki Celerio 2017 45000.0 600000
11 Maruti Suzuki Vitara Brezza 2020 40000.0 900000
12 Hyundai i20 2019 35000.0 650000
13 Toyota Fortuner 2017 50000.0 1500000
14 Maruti Suzuki Alto 2013 40000.0 500000
15 Honda i10 2010 35000.0 550000
16 Maruti Suzuki Ignis 2018 45000.0 700000
17 Tata Punch 2019 45000.0 750000
18 BMW M5 2018 55000.0 3000000
19 Maruti Suzuki Baleno 2019 45000.0 650000
In [5]:
# For numerical columns, fill with mean
num_imputer = SimpleImputer(strategy='mean')
df[['Mileage']] = num_imputer.fit_transform(df[['Mileage']])
print("\nDataFrame after Handling Missing Values:\n", df)
DataFrame after Handling Missing Values:
Brand Model Year Mileage Price
0 Toyota Corolla 2015 50000.000000 700000
1 Honda Civic 2018 30000.000000 850000
2 BMW X5 2020 41666.666667 3500000
3 Toyota Yaris 2017 40000.000000 600000
4 Honda Alto 2019 35000.000000 900000
5 Maruti Suzuki City 2016 45000.000000 650000
6 Tata Magic Iris 2014 30000.000000 350000
7 Hyundai Creta 2018 45000.000000 800000
8 Tata Nexon 2021 41666.666667 850000
9 Maruti Suzuki Eeco 2015 40000.000000 600000
10 Maruti Suzuki Celerio 2017 45000.000000 600000
11 Maruti Suzuki Vitara Brezza 2020 40000.000000 900000
12 Hyundai i20 2019 35000.000000 650000
13 Toyota Fortuner 2017 50000.000000 1500000
14 Maruti Suzuki Alto 2013 40000.000000 500000
15 Honda i10 2010 35000.000000 550000
16 Maruti Suzuki Ignis 2018 45000.000000 700000
17 Tata Punch 2019 45000.000000 750000
18 BMW M5 2018 55000.000000 3000000
19 Maruti Suzuki Baleno 2019 45000.000000 650000
In [6]:
# 4. Encode categorical variables using Label Encoding
label_enc = LabelEncoder()
df['Brand'] = label_enc.fit_transform(df['Brand'])
df['Model'] = label_enc.fit_transform(df['Model'])
print("\nDataFrame after Label Encoding:\n", df)
DataFrame after Label Encoding:
Brand Model Year Mileage Price
0 5 5 2015 50000.000000 700000
1 1 4 2018 30000.000000 850000
2 0 15 2020 41666.666667 3500000
3 5 16 2017 40000.000000 600000
4 1 0 2019 35000.000000 900000
5 3 3 2016 45000.000000 650000
6 4 11 2014 30000.000000 350000
7 2 6 2018 45000.000000 800000
8 4 12 2021 41666.666667 850000
9 3 7 2015 40000.000000 600000
10 3 2 2017 45000.000000 600000
11 3 14 2020 40000.000000 900000
12 2 18 2019 35000.000000 650000
13 5 8 2017 50000.000000 1500000
14 3 0 2013 40000.000000 500000
15 1 17 2010 35000.000000 550000
16 3 9 2018 45000.000000 700000
17 4 13 2019 45000.000000 750000
18 0 10 2018 55000.000000 3000000
19 3 1 2019 45000.000000 650000
In [7]:
# 5. Split into features (X) and target (y)
X = df.drop('Price', axis = 1)
y = df['Price']
In [8]:
df
Out[8]:
| Brand | Model | Year | Mileage | Price | |
|---|---|---|---|---|---|
| 0 | 5 | 5 | 2015 | 50000.000000 | 700000 |
| 1 | 1 | 4 | 2018 | 30000.000000 | 850000 |
| 2 | 0 | 15 | 2020 | 41666.666667 | 3500000 |
| 3 | 5 | 16 | 2017 | 40000.000000 | 600000 |
| 4 | 1 | 0 | 2019 | 35000.000000 | 900000 |
| 5 | 3 | 3 | 2016 | 45000.000000 | 650000 |
| 6 | 4 | 11 | 2014 | 30000.000000 | 350000 |
| 7 | 2 | 6 | 2018 | 45000.000000 | 800000 |
| 8 | 4 | 12 | 2021 | 41666.666667 | 850000 |
| 9 | 3 | 7 | 2015 | 40000.000000 | 600000 |
| 10 | 3 | 2 | 2017 | 45000.000000 | 600000 |
| 11 | 3 | 14 | 2020 | 40000.000000 | 900000 |
| 12 | 2 | 18 | 2019 | 35000.000000 | 650000 |
| 13 | 5 | 8 | 2017 | 50000.000000 | 1500000 |
| 14 | 3 | 0 | 2013 | 40000.000000 | 500000 |
| 15 | 1 | 17 | 2010 | 35000.000000 | 550000 |
| 16 | 3 | 9 | 2018 | 45000.000000 | 700000 |
| 17 | 4 | 13 | 2019 | 45000.000000 | 750000 |
| 18 | 0 | 10 | 2018 | 55000.000000 | 3000000 |
| 19 | 3 | 1 | 2019 | 45000.000000 | 650000 |
In [9]:
X
Out[9]:
| Brand | Model | Year | Mileage | |
|---|---|---|---|---|
| 0 | 5 | 5 | 2015 | 50000.000000 |
| 1 | 1 | 4 | 2018 | 30000.000000 |
| 2 | 0 | 15 | 2020 | 41666.666667 |
| 3 | 5 | 16 | 2017 | 40000.000000 |
| 4 | 1 | 0 | 2019 | 35000.000000 |
| 5 | 3 | 3 | 2016 | 45000.000000 |
| 6 | 4 | 11 | 2014 | 30000.000000 |
| 7 | 2 | 6 | 2018 | 45000.000000 |
| 8 | 4 | 12 | 2021 | 41666.666667 |
| 9 | 3 | 7 | 2015 | 40000.000000 |
| 10 | 3 | 2 | 2017 | 45000.000000 |
| 11 | 3 | 14 | 2020 | 40000.000000 |
| 12 | 2 | 18 | 2019 | 35000.000000 |
| 13 | 5 | 8 | 2017 | 50000.000000 |
| 14 | 3 | 0 | 2013 | 40000.000000 |
| 15 | 1 | 17 | 2010 | 35000.000000 |
| 16 | 3 | 9 | 2018 | 45000.000000 |
| 17 | 4 | 13 | 2019 | 45000.000000 |
| 18 | 0 | 10 | 2018 | 55000.000000 |
| 19 | 3 | 1 | 2019 | 45000.000000 |
In [10]:
y
Out[10]:
0 700000 1 850000 2 3500000 3 600000 4 900000 5 650000 6 350000 7 800000 8 850000 9 600000 10 600000 11 900000 12 650000 13 1500000 14 500000 15 550000 16 700000 17 750000 18 3000000 19 650000 Name: Price, dtype: int64
In [11]:
# 6. Train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42)
In [12]:
# 7. Choose a simple regression algorithm
model = LinearRegression()
In [13]:
# 8. Train the model
model.fit(X_train, y_train)
Out[13]:
LinearRegression()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
| fit_intercept | True | |
| copy_X | True | |
| tol | 1e-06 | |
| n_jobs | None | |
| positive | False |
In [14]:
X_train
Out[14]:
| Brand | Model | Year | Mileage | |
|---|---|---|---|---|
| 8 | 4 | 12 | 2021 | 41666.666667 |
| 5 | 3 | 3 | 2016 | 45000.000000 |
| 11 | 3 | 14 | 2020 | 40000.000000 |
| 3 | 5 | 16 | 2017 | 40000.000000 |
| 18 | 0 | 10 | 2018 | 55000.000000 |
| 16 | 3 | 9 | 2018 | 45000.000000 |
| 13 | 5 | 8 | 2017 | 50000.000000 |
| 2 | 0 | 15 | 2020 | 41666.666667 |
| 9 | 3 | 7 | 2015 | 40000.000000 |
| 19 | 3 | 1 | 2019 | 45000.000000 |
| 4 | 1 | 0 | 2019 | 35000.000000 |
| 12 | 2 | 18 | 2019 | 35000.000000 |
| 7 | 2 | 6 | 2018 | 45000.000000 |
| 10 | 3 | 2 | 2017 | 45000.000000 |
| 14 | 3 | 0 | 2013 | 40000.000000 |
| 6 | 4 | 11 | 2014 | 30000.000000 |
In [15]:
X_test
Out[15]:
| Brand | Model | Year | Mileage | |
|---|---|---|---|---|
| 0 | 5 | 5 | 2015 | 50000.0 |
| 17 | 4 | 13 | 2019 | 45000.0 |
| 15 | 1 | 17 | 2010 | 35000.0 |
| 1 | 1 | 4 | 2018 | 30000.0 |
In [16]:
y_train
Out[16]:
8 850000 5 650000 11 900000 3 600000 18 3000000 16 700000 13 1500000 2 3500000 9 600000 19 650000 4 900000 12 650000 7 800000 10 600000 14 500000 6 350000 Name: Price, dtype: int64
In [17]:
y_test
Out[17]:
0 700000 17 750000 15 550000 1 850000 Name: Price, dtype: int64
In [18]:
#9. Predict on test data
y_pred = model.predict(X_test)
In [19]:
#10. Evaluate the model
mse = mean_squared_error(y_test, y_pred)
print("\nMean Squared Error:", mse)
print("Predicted Prices:", y_pred)
Mean Squared Error: 548010972257.59863 Predicted Prices: [ 603798.10342287 1049748.02478854 1970651.00702796 576703.60047896]