1. 説明
こんにちは、すべて順調だといいですね! 今日、この記事には 3 つの異なるセクションがあります。1)テーマについて学べるように、テーマ ストーリーを共有したいと思います。2) プロセスを詳しく見ていきます。いくつかのWebスクレイピング方法を学びます。3) 次に、もちろんEDAプロセスです。
最後のパートでは、3 つの主要なステップを学習します。
- 特徴エンジニアリング。
- モデルの選択と進化。
- モデルを使用して予測を行います。
2. タコ素数の話をしましょう
昔々、ディストピアの世界にオクトパスという名前のロボットが住んでいました。Octopus は、試合の結果を予測する際に優位性を求めていた、サッカーに夢中のデータ サイエンティストのグループによって作成されました。Octopus は、チームとその選手に関するすべての統計、選手のパフォーマンス、その他の関連データにフィードされます。
すべては情熱的なデータサイエンティストのグループから始まりました。
彼らはタコのポールがかわいいと思い、自分たちでタコを作ることにしました。彼らは彼を「プライム・オクトパス」と呼んだ。このロボットはフットボールの試合でゴールを予測することができる。
彼らは彼にすべての統計情報を提供し始めました。タコさん、お金を稼ぎ始めてください。タコは学習が早いです。このパターンは、独自の決定から始まります。彼は高級な車を買いたいと思っています。彼は車の価格を学習するモデルを作成しました。
タコはお金は持っていますが、所詮は人間界ではよそ者です。彼は車についてあらゆることを調べ始めました。彼はトゥルキエで生まれたので、ちょっと不運です。
彼は「2022 年に最も売れた中古車」 に焦点を当てることにしました。
回帰モデルを作成するために、彼はまず Web スクレイピングを実行しました。データを収集したら、自分で食事をする準備が整いました。彼は多くのモデルを評価しています。ついに最高のものを見つけました!
その数日間、Octopus Prime は自由で幸せでしたが、このように長くは続きませんでした。
短期間のうちに政府がそれを掌握し、自らの利益のために利用したため、国民の間に不信と恐怖が広がりました。
かつてはスポーツ愛好家の道具であったタコは、その力によって腐敗し、自らの利益のために試合の結果を操作し始め、極悪非道な存在へと変貌しました。
3. Webスクレイピング用のデータソースとツール
Web スクレイピング プロセスには、Python の urllib ライブラリと beautifulsoup ライブラリを使用します。トルコの中古車ウェブサイト「arabam.com」がデータソースです。
###Necessary Libraries###
from urllib.request import urlopen
import requests
from bs4 import BeautifulSoup as bts
import pandas as pd
import re
import numpy as np
import time
### A Function to take links from Website###
def getAndParseURL(url):
result=requests.get(url,headers={"User-Agent":"Chrome/109.0.5414.120"})
soup=bts(result.text,"html.parser")
return soup
### For Collecting All Links in Each Page ###
pages=["https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50"]
for page in range(2,51):
pages.append("https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=" +str (page))
pages
['https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=2',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=3',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=4',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=5',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=6',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=7',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=8',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=9',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=10',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=11',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=12',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=13',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=14',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=15',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=16',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=17',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=18',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=19',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=20',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=21',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=22',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=23',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=24',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=25',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=26',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=27',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=28',
'https://www.arabam.com/ikinci-el/otomobil/renault-clio?take=50&page=29',
......]
3.1 ページ内のすべての自動車リンクを収集しましょう
この属性は、リンク先のページの URL を指定します。href
この属性が存在しない場合、タグはハイパーリンクになりません。href
<a>
ヒント:現在のページの上部を使用するか、上部にリンクすることができます。href="#top"
href="#"
これを行うには、まずリンクを「チェック」し、「href」を見つけようとする必要があります。
### Collecting all car links in a list! ###
cars=[]
for page in pages:
html=getAndParseURL(page)
for carlink in html.findAll("td",{"class":"listing-modelname pr"}):
cars.append("https://www.arabam.com/"+carlink.a.get("href"))
cars
['https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-5-dci-touch/kale-otomotiv-den-2018-touch-dizel-otomatik-degisensiz/21907028',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-2-authentique/orjinal-aile-arabasi/21906665',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-0-tce-joy/2022-tam-otomatik-vites-hatasiz-boyasiz-turbo-motor-clio/21905162',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-5-dci-joy/e-force-guvencesiyle-2016-dusuk-km-temiz-renault-clio-1-5-dci/21898316',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-5-dci-touch/beyazkent-otomotiv-den-2018-clio-touch/21806590',
'https://www.arabam.com//ilan/sahibinden-satilik-renault-clio-1-2-turbo-joy/acili-sahibinden-hatasiz-boyasiz-tramersiz-dusuk-km/21877860',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-0-tce-joy/otomobil-renault-clio-hatchback-1-0-tce-joy-x-tronic/21859662',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-5-dci-touch/renault-clio-1-5-dci-touch-2019-model/21870379',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-2-expression/gosterisli-renault-cli-1-2-16-v-lpgli-2005-model/21870007',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-0-tce-touch/hatasiz-boyasiz-2022-model-renault-clio-1-0-tce-touch-otomatik/21869762',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-0-tce-joy/abakay-otomotiv-den-hatasiz-boyasiz-clio-1-0-tce-18-faturali/21862559',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-5-dci-sporttourer-joy/hatasiz-boyasiz-sifir-ayarinda/21859577',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-5-dci-grandtour-extreme/renault-clio-1-5-dci-grandtour-extreme-2012-model-antalya/21851768',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-5-dci-sporttourer-joy/galeriden-renault-clio-1-5-dci-sporttourer-joy-2013-model-mugla/21812256',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-5-dci-joy/galeriden-renault-clio-1-5-dci-joy-2019-model-denizli/21803907',
'https://www.arabam.com//ilan/galeriden-satilik-renault-clio-1-0-tce-touch/otomobil-renault-clio-hatchback-1-0-tce-touch-x-tronic/21797303'
.....]
3.2 次に、HTML でデータを検索する必要があります。
次に、車に関するすべてのデータを保存するリストを作成する必要があります。これはかなり長いループになります。エラーなく動作する必要があります。これには、「time.sleep」関数を使用します。そして、それぞれの機能を試してみてください。
features = []
for carl in cars:
html=getAndParseURL(carl)
try:
brand =html.find("ul",{"w100 cf mt12 detail-menu"}).find(text=re.compile("Marka")).findNext().text.strip()
except:
brand = np.nan
try:
model=html.find("ul",{"class":"w100 cf mt12 detail-menu"}).find(text=re.compile("Model")).findNext().text.strip()
except:
model=np.nan
try:
year=html.find("ul",{"class":"w100 cf mt12 detail-menu"}).find(text=re.compile("Yıl")).findNext().text.strip()
except:
year=np.nan
try:
km=html.find("ul",{"class":"w100 cf mt12 detail-menu"}).find(text=re.compile("Kilometre")).findNext().text.strip()
except:
km=np.nan
try:
engsize=html.find("ul",{"class":"w100 cf mt12 detail-menu"}).find(text=re.compile("Motor Hacmi")).findNext().text.strip()
except:
engsize=np.nan
try:
hp=html.find("ul",{"class":"w100 cf mt12 detail-menu"}).find(text=re.compile("Motor Gücü")).findNext().text.strip()
except:
hp=np.nan
try:
fuel=html.find("ul",{"class":"w100 cf mt12 detail-menu"}).find(text=re.compile("Yakıt Tipi")).findNext().text.strip()
except:
fuel=np.nan
try:
gear=html.find("ul",{"class":"w100 cf mt12 detail-menu"}).find(text=re.compile("Vites Tipi")).findNext().text.strip()
except:
gear=np.nan
try:
fuelcoms=html.find("ul",{"class":"w100 cf mt12 detail-menu"}).find(text=re.compile("Yakıt Tüketimi")).findNext().text.strip()
except:
fuelcoms=np.nan
try:
price=html.find("div",{"class":"color-red4 font-default-plusmore bold fl"}).text.strip()
except:
price=np.nan
features.append([brand,model,year,km,engsize,hp,fuel,gear,fuelcoms,price])
time.sleep(2)
[['Renault',
'1.5 dCi Touch',
'2018',
'110.000 km',
'1461 cc',
'90 hp',
'Dizel',
'Yarı Otomatik',
'3,7 lt',
'525.000 TL'],
['Renault',
'1.2 Authentique',
'2004',
'133.500 km',
'1149 cc',
'75 hp',
'Benzin',
'Düz',
'5,9 lt',
'227.000 TL'],
...............]
3.3 データ フレーム内のすべてのデータをマージします。
3.4 データのクリーニングと前処理
このパートでは、探索的データ分析を実行し
、データ型を変換します。
- 特殊文字を削除します。
- 外れ値を検出します。
- NaN 値を検出します。
- インデックスを再作成します。
- 重複をチェックする
すべてのデータフレームを連結すると、乱雑なデータフレームが完成します。
予測モデルの場合、データは数値である必要があります。データセットを浮動小数点または整数に変換したいと考えています。
all_cars["Year"]=all_cars["Year"].astype(int)
all_cars["Age"]=2023-all_cars["Year"]
all_cars["Km"]=all_cars["Km"].str.replace("km", "")
all_cars["Km"]=all_cars["Km"].str.replace(".", "")
all_cars["Km"]=all_cars["Km"].astype(float).astype(int)
all_cars["EngSize"]=all_cars["EngSize"].str.replace(" cc", "")
all_cars["EngSize"]=all_cars["EngSize"].str.replace(" cm3", "")
all_cars["EngSize"]=all_cars["EngSize"].str.replace(" -", "")
all_cars['EngSize'] = all_cars['EngSize'].str.split(" ").str[0].astype(int)
.
.
.
.
3.5 特徴量エンジニアリング
- フィーチャー間の関係に注目します。
- 機能の変更
- 新しい機能の作成
- ターゲットに合わせて変更する
- ディストリビューションをより良くする
3.6 非数値データの変換
仮想コーディングを行っていきます。仮想関数を適用する前に。データ型を「カテゴリ」に変換する必要があります。
### Converting data type as category ###
cols_to_convert = ["Fuel", "Gear Type", "Brand"]
for col in cols_to_convert:
all_cars[col] = all_cars[col].astype("category")
### Apllying Dummy Func.###
dummies = pd.get_dummies(all_cars[cols_to_convert],drop_first=True)
all_cars = pd.concat([all_cars, dummies], axis=1)
all_cars = all_cars.drop(cols_to_convert, axis=1)
### Important Reminder For Avoiding Dummy Trap You Should Remove First row###
3.7 機能間の関係を表示する
plt.figure(figsize=(8,4))
sns.heatmap(all_cars.corr(), cmap="YlGnBu", annot=True);
plt.show()
ペアごとのプロットは、データセット内のペアごとの関係をプロットします。関数ペアプロットは、データ内の各変数が 1 行の Y 軸と 1 列の X 軸で共有されるように軸グリッドを作成します。これにより、以下に示すグラフが作成されます。
3.8 データのより適切な配布
### Getting Rid Of Outliers###
all_cars = all_cars.loc[(all_cars["Km"] >= 2000) & (all_cars["Km"] <= 500000),:]
sns.histplot(all_cars["Km"]);
all_cars=all_cars.loc[all_cars["Year"]<=2022,:]
sns.histplot(all_cars["Year"]);
all_cars=all_cars.loc[all_cars["EngSize"]<=2000,:]
sns.histplot(all_cars["EngSize"]);
all_cars=all_cars.loc[all_cars["Price"]<=1000000,:]
sns.histplot(all_cars["Price"])
.
.
.
.
3.9 モデルの選択と評価
- テストとトレーニングごとにデータを分割する
- 過学習と過小学習をチェックする
- バイアスと分散をチェックする
- モデルの選択
- モデル比較
3.10 線形、なげなわ、リッジ回帰
### StatsModel for statistical data exploration ###
y = df_new["PriceLog"]
X = df_new.drop(columns=["PriceLog"])
X = sm.add_constant(X)
model=sm.OLS(y,X)
fit=model.fit()
fit.summary()
### Linear Regression ###
lr_model=LinearRegression()
lr_model.fit(X_train,y_train)
validation_score=lr_model.score(X_val,y_val)
validation_score
lr_model.score(X_train,y_train)
### Lasso ###
test_set_pred=lasso_model.predict(X_val)
print("R2 of Lasso Model",r2_score(y_val,test_set_pred))
### Ridge ###
test_set_pred2=ridge_model.predict(X_val)
print("R2 of Ridge Model",r2_score(yval,test_set_pred2))
3.11 モデル効果の比較
3.12 実質価格と予測の比較
基本的に。。。。
中古車の購入を検討している場合は、データの力を信頼してください。
4. 追記
上記の記事では、Web データのクローリングのプロセスを説明するために実際の需要 (中古車の購入) の例を示しています。クローリングは複雑かつ多様なプロセスであり、事例を読めば読むほど、より多くの経験と技術が現れるからです。 . より多くの症例を提供し、十分な症例で経験を増やします。ヒクメット・エムレ・グル