AI를 활용한 자동차 효율 분석 및 예측

프로젝트 소개


이 프로젝트는 좋은 자동차를 살려면 연비나 마력같은 요소를 보면서 사야한다고 생각하는데 그런 자동차에 좋은요소를 AI를 통해 분석시키고
분석값을 예측하고 실제값과 비교해보고 효율점수를 통해 얼마나 효율적인지 효과적으로 볼수있다고생각하여 만들어보았다

프로젝트 기획


RandomForest:여러 개의 결정트리를 랜덤하게 만들어서, 각 트리의 예측값을 평균 내어 최종 예측하는 앙상블 회귀모델(앙상블:여러 개의 모델을 동시에 사용해서 더 나은 예측을 만들게 해주는 것)
알고리즘: RandomForest 모델을 활용하여 데이터를 예측하는 구조로 작성되어 있다.
랜덤 포레스트는 여러 개의 결정트리를 만들어 각각의 예측값을 계산한 뒤, 그 예측값들의 평균을 최종 결과로 사용하는 앙상블 학습 기법이다.
이 학습기법을 통해 ai를 학습을 시키고 예측값을 만든다 또한 실제값과 비교하여 얼마나 차이가 나는지 볼 수 있다
개발환경: 코랩
데이터: 코랩 차량 데이터

프로젝트 결과


연비, 마력, 무게 데이터를 0~1 범위로 변환
계산식: (값 - 최소값) / (최대값 - 최소값)
연비_norm, 마력_norm, 무게_norm 컬럼 생성
연비는 높을수록 효율적  연비_norm 그대로 사용
마력과 무게는 낮을수록 효율적 1 - 마력_norm, 1 - 무게_norm
세 값을 합쳐서 총 효율 점수 생성

AI 모델이 예측한 점수를 바탕으로 TOP 10 차량을 선정한 후, 예측 점수 순위 그래프를 그리고, 이어서 실제 점수와 예측 점수를 나란히 비교하는 이중 막대 그래프를 생성하여 모델의 예측 정확도를 시각적으로 검증한다

코드

import os # 운영체제 관리 및 조작 기능들이 담긴 모듈
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib as mpl
#
path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'
font_name = mpl.font_manager.FontProperties(fname=path).get_name()
plt.rcParams['font.family'] = font_name

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score


df = sns.load_dataset('mpg').dropna(subset=['mpg','horsepower','weight','name'])
print("총 자동차 수:", len(df))


df = df.rename(columns={
    'mpg':'연비',
    'horsepower':'마력',
    'weight':'무게',
    'name':'이름'
})


print("데이터 예시:")
print(df.head())

print("\n데이터 컬럼 및 자료형:")
print(df.dtypes)


df['연비_norm'] = (df['연비'] - df['연비'].min()) / (df['연비'].max() - df['연비'].min())
df['마력_norm'] = (df['마력'] - df['마력'].min()) / (df['마력'].max() - df['마력'].min())
df['무게_norm'] = (df['무게'] - df['무게'].min()) / (df['무게'].max() - df['무게'].min())
df['효율_점수'] = df['연비_norm'] + (1 - df['마력_norm']) + (1 - df['무게_norm'])

print("\n정규화된 요소 예시:")
print(df[['연비_norm','마력_norm','무게_norm','효율_점수']].head())


X = df[['연비','마력','무게']]
y = df['효율_점수']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print("\n학습 데이터 크기:", X_train.shape)
print("테스트 데이터 크기:", X_test.shape)


model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)


y_pred = model.predict(X_test)


rmse = np.sqrt(mean_squared_error(y_test, y_pred))
r2 = r2_score(y_test, y_pred)
print(f"\nR2 점수: {r2:.3f}, RMSE: {rmse:.3f}")


X_test = X_test.copy()
X_test['예측_점수'] = y_pred
X_test['실제_점수'] = y_test
X_test = X_test.merge(df[['이름']], left_index=True, right_index=True)

name_map = {
    'chevrolet chevelle malibu': '쉐보레 말리부',
    'buick skylark 320': '뷰익 스카이라크',
    "plymouth satellite": '플리머스 새틀라이트',
    "amc rebel sst": 'AMC 레벨 SST',
    "ford torino": '포드 토리노',
    "ford galaxie 500": '포드 갤럭시 500',
    "pontiac catalina": '폰티악 카탈리나',
    "amc ambassador dpl": 'AMC 엠배서더 DPL',
    "dodge challenger se": '닷지 챌린저 SE',
    "plymouth 'cuda 340": "플리머스 쿠다 340"
}
X_test['이름_한글'] = X_test['이름'].map(name_map).fillna(X_test['이름'])

top10 = X_test.sort_values('예측_점수', ascending=False).head(10)
print("\nTop 10 자동차 (예측 점수 기준):")
print(top10[['이름','이름_한글','연비','마력','무게','예측_점수','실제_점수']])


plt.figure(figsize=(12,6))
bars = plt.bar(
    top10['이름_한글'],
    top10['예측_점수'],
    color=plt.cm.Reds(top10['예측_점수']/top10['예측_점수'].max())
)
plt.xticks(rotation=45, ha='right')
plt.ylabel("예측 효율 점수")
plt.title("AI 예측 기반 자동차 효율 Top 10 우선순위")

for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, height + 0.02, f"{height:.2f}", ha='center', va='bottom')

plt.tight_layout()
plt.show()


x = np.arange(len(top10))
width = 0.35
plt.figure(figsize=(12,6))
plt.bar(x - width/2, top10['실제_점수'], width, label='실제 점수', color='skyblue')
plt.bar(x + width/2, top10['예측_점수'], width, label='예측 점수', color='salmon')
plt.xticks(x, top10['이름_한글'], rotation=45, ha='right')
plt.ylabel("효율 점수")
plt.title("자동차 효율: 실제 점수 vs AI 예측 점수 비교")
plt.legend()
plt.tight_layout()
plt.show()
    

시연 사진

시연 1

실행 화면 1

시연 2

실행 화면 2

시연 3

실행 화면 3

소감


데이터를 가져와서 AI에게 가져온 데이터를 학습 시키라했고 막대그래프로 시각화 했다
이번 프로젝트에서는 머신러닝 기술을 활용하여 연비 마력 무게와 같은 차량 요소로 효율 점수를 예측했다 또한 시각화를 통해 예측값과 실제값의 차이와 경향을 한눈에 파악할 수 있었으며 이를 통해 정보가 더욱 명확하게 드러나는 것을 확인할 수 있었다
시각화 과정에서 어떤 그래프를 선택해야 정보가 가장 잘 드러나는지 결정하는 것이 어려웠다 특히 예측 점수와 실제 점수를 동시에 비교하기 위해 어떤 방식으로 배치해야 이해하기 쉬울지 고민이 많았다 이를 해결하기 위해 여러 시각화 형태를 직접 시도해 보면서 막대그래프 색깔구분으로 예측값과 실제값에 비교가 더욱더 잘 드러났다고 생각한다
아쉬운 점으로는 사용한 데이터의 개수가 정해져 있어 모델이 학습할 수 있는 정보량에 한계가 있었다는 점이다 또한 효율 점수를 단 3가지 요소(연비 마력, 무게)로만 평가했기 때문에 실제 차량의 성능이나 가치 요소를 충분히 반영하지 못했다는 점이 아쉽다
그러므로 나중에 데이터를 늘리고 요소를 늘려 모델에 학습시킨다면 더욱더 정확한 효율점수를 산출해낼수있다고 생각한다