import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import root_mean_squared_error
file_path = "/데이터가_있는_폴더/car_data.csv"
df = pd.read_csv(file_path)
df.head()
# 차량 이름은 종류가 많으므로 제거
car_df = df.drop(columns="Car_Name")
# 주행거리 이상치 제거
car_df = car_df[car_df["Kms_Driven"] < 100000].copy()
# 연식(Year)을 차량 나이(Vehicle_Age)로 변환
car_df["Vehicle_Age"] = 2020 - car_df["Year"]
car_df = car_df.drop(columns="Year")
# CNG 차량 데이터 제거
car_df = car_df[car_df["Fuel_Type"] != "CNG"].copy()
# 범주형 데이터를 숫자형으로 변환
car_df = pd.get_dummies(
car_df,
columns=["Fuel_Type", "Seller_Type", "Transmission"],
drop_first=True,
dtype=int
)
car_df.head()
X: 가격 예측에 사용할 입력 정보y: 예측할 정답값인 판매 가격X = car_df.drop(columns="Selling_Price")
y = car_df["Selling_Price"]
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=2026
)
tree_model = DecisionTreeRegressor(
max_depth=6,
min_samples_leaf=5,
random_state=2026
)
tree_model.fit(X_train, y_train)
tree_pred = tree_model.predict(X_test)
tree_rmse = root_mean_squared_error(y_test, tree_pred)
print(f"결정 트리 RMSE: {tree_rmse:.3f}")
rf_model = RandomForestRegressor(
n_estimators=200,
random_state=2026
)
rf_model.fit(X_train, y_train)
rf_pred = rf_model.predict(X_test)
rf_rmse = root_mean_squared_error(y_test, rf_pred)
print(f"랜덤 포레스트 RMSE: {rf_rmse:.3f}")
빨간 선에 가까울수록 실제 판매 가격과 예측 가격이 비슷하다는 의미입니다.
sns.scatterplot(x=y_test, y=rf_pred)
plt.plot(
[y_test.min(), y_test.max()],
[y_test.min(), y_test.max()],
color="red"
)
plt.xlabel("실제 판매 가격")
plt.ylabel("예측 판매 가격")
plt.show()
랜덤 포레스트가 가격을 예측할 때 어떤 변수를 중요하게 사용했는지 확인합니다.
feature_importance = pd.DataFrame({
"feature": X.columns,
"importance": rf_model.feature_importances_
}).sort_values("importance", ascending=False)
print(feature_importance)
sns.barplot(
data=feature_importance,
x="importance",
y="feature"
)
plt.title("변수 중요도")
plt.show()
RMSE가 작을수록 예측 오차가 작습니다.