見出し画像

【Python初心者】中古車の販売価格を予測するモデルを作成してみた

目次

・背景
・テーマ設定
・環境
・データ取得元
・モジュール
・データ読み込み
・コード
・実行結果
・総括

背景

社会人15年目となった2023年、3人目の子供が生まれるにあたり、約10ヵ月間の育児休業の取得を申請。それまで職務経験は営業職が主だったため、スキルアップの好機と捉え、育児が少し落ち着いた頃にAidemyデータ分析講座6カ月コースを受講開始しました。
※本ブログはAidemy Premiumのカリキュラムの一環で、受講修了条件を満たすために公開しています。

テーマ設定

当初は子供の出生数で時系列分析を進めようと思ったが、Kaggleデータセットのcarpricesを基に車の販売価格の予測モデルをつくることにしました。このモデルでは、車両のマイレージ、年齢、およびモデル(BMW X5、Audi A5、Mercedes Benz C classのどれか)から販売価格を予測できます。

環境

Python3
Let's note
Google Chrome
Google Colaboratory

データ取得元

Kaggleデータセットより carprices

データ構造は以下の通り


モジュール

インポートするモジュールは以下の通り

import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import seaborn as sns

バージョン 1.5.3

データ読み込み

このCSVデータ読み込み時にエラーが多発してつまずく。
理由はファイルを適切な場所においてパスを書けていなかったため。
Aidemy講師のアドバイスにより、GoogleColabを使用するためマイドライブとのマウントが必要と判明。詳しい手順はこちらを参照。

コード

今回使用したコードと処理の流れは以下の通り。

import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv("/content/drive/MyDrive/carprices.csv")

# プロットする前にデータフレームをコピー
df_plot = df.copy()

# カーモデルをダミー変数に変換
df = pd.get_dummies(df, drop_first=True)

# 特徴量と目的変数の定義
X = df.drop('Sell Price($)', axis=1)
y = df['Sell Price($)']

# 線形回帰モデルの学習
model = LinearRegression()
model.fit(X, y)

# 予測の例(Mileage=45000, Age=4, BMW X5)
print(model.predict([[45000, 4, 1, 0]]))

# MileageとSell Priceの関係
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df_plot, x='Mileage', y='Sell Price($)', hue='Car Model')
plt.title('Relationship between Mileage and Sell Price')
plt.show()

# AgeとSell Priceの関係
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df_plot, x='Age(yrs)', y='Sell Price($)', hue='Car Model')
plt.title('Relationship between Age and Sell Price')
plt.show()

# 相関係数の計算
correlation = df.corr()

# 'Sell Price($)'との相関係数を表示
print(correlation['Sell Price($)'])


  1. 車の価格データ('carprices.csv')を読み込みます。

  2. データフレームをコピーし、プロット用のデータとして保持します('df_plot')。

  3. 'Car Model'列をダミー変数に変換します。これにより、カテゴリ変数である'Car Model'列が数値に変換され、モデル学習に利用可能になります。

  4. 'Sell Price($)'列を目的変数 y とし、それ以外の列を特徴量 X とします。

  5. 線形回帰モデル(LinearRegression)を学習させます。 ※

  6. 学習したモデルを用いて、走行距離が45000マイル、車齢が4年、車種がBMW X5である車の売却価格を予測します。

  7. 'Mileage'(走行距離)と'Sell Price($)'(売却価格)の関係をプロットします。

  8. 'Age(yrs)'(車齢)と'Sell Price($)'(売却価格)の関係をプロットします。

  9. 各特徴量の目的変数の相関係数を表示します。

※線形回帰モデルは、二つ以上の変数間の関係をモデル化するための手法であり、一つの目的変数と一つまたはそれ以上の特徴量との間の線形関係を表します。線形回帰の基本的な形式は以下のようになります y = ax + b

実行結果

予測結果
[30253.10988495]
これは走行距離が45000マイル、車齢が4年、カーモデルがBMW X5の車の売却価格を予測した結果、その価格が約30253.11ドルになると予測されたということを意味します。
相関係数
Mileage -0.927116
Sell Price($) 1.000000
Age(yrs) -0.921741
Car Model_BMW X5 0.400640
Car Model_Mercedez Benz C class -0.175394
走行距離・車齢の相関係数が-1に限りなく近いため、この特徴量が売却価格の下落に最も大きな影響を及ぼしていると考えられます。一般的に、車は新しく走行距離が短いほど価値が高いとされているため、直感的にも納得がいく結果です。一方、車種の相関係数は低く、上記2つの特徴量に比べるとあまり価格に影響を及ぼしていない可能性があります。

①MileageとSell Priceの関係図


②AgeとSell Priceの関係図

matplotlibで可視化してみると一目瞭然で、2つのプロット共に強い負の相関関係にあることを示しています。

今回はとてもシンプルなデータでトライしましたが、実際には内装・外装の状態なども価格決定因子として大きな要素となります。より精度高いモデルを作成する場合は、より特徴量が多くデータ数の多いデータセットを使用し、様々なモデルを試してみる必要があります。今回のモデルではデータ数の多い他データには応用できないと思われます。

総括

業務では簡単なSQLしか使用していない中、今回、Aidemyの成果物としてPythonを使ったデータ分析の一連の流れを行ったが、Pythonの可能性やデータ分析の奥深さを実感できて大変学びが多かった。ただ、まだまだ初歩レベルのため、次回は小売りの分析などに取り組み、データ分析マインドの歩みを止めずに進んでいきたい。

この記事が気に入ったらサポートをしてみませんか?