Группировка водителей на основе среднего расстояния, пройденного за день, и среднего процента превышения скорости

Привет и добро пожаловать в мою статью! В этом посте вы узнаете, как использовать методы кластеризации, когда у вас есть немаркированные данные. Используя кластеризацию KMeans, вы сможете кластеризовать их, принимая во внимание различные характеристики. Давайте начнем.

Описание набора данных

Найдите набор данных здесь. Для простоты возьмем только две характеристики:

  1. среднее расстояние, пройденное за день
  2. средний процент времени, в течение которого водитель превышал скорость более чем на 5 миль в час

Вот что представляют данные:

  • id: уникальный идентификатор водителя.
  • mean_dist_day: среднее расстояние, пройденное водителем в день.
  • mean_over_speed_perc: средний процент времени, когда водитель › на 5 миль/ч превышал ограничение скорости.

(1) Импорт необходимых библиотек и наборов данных —

import numpy as pn
import pandas as pd
import sklearn
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
import warnings
warnings.filterwarnings(‘ignore’)
%matplotlib inline

Сначала импортируйте необходимые библиотеки, а затем импортируйте набор данных.

df=pd.read_csv('driver-data.csv')
df.head()

(2) Проверка информации и распространение основных данных —

# Check the no. of records - it should be 4000
df.info()
# Check the basic distribution of data
df.describe()

Мы готовы использовать технику кластеризации, но есть проблема. Какое количество кластеров мы должны использовать? Итак, мы будем использовать подход Elbow для определения количества кластеров.

(3) Определите количество кластеров с помощью метода локтя –

WCSS (внутрикластерная сумма квадратов) — это сумма квадратов расстояний между каждой точкой в ​​кластере и его центром тяжести. Когда мы строим WCSS со значением K, мы получаем локоть.

Значение WCSS уменьшается по мере роста числа кластеров. Когда K = 1, значение WCSS является самым высоким.

Мы будем использовать Yellowbrick. Это библиотека Python, объединяющая scikit-learn и matplotlib. Yellowbrick улучшает API Scikit-Learn, чтобы упростить выбор модели и настройку гиперпараметров. Matplotlib используется в фоновом режиме.

!pip install yellowbrick #if you haven't install yellowbrick yet
from yellowbrick.cluster import KElbowVisualizer
model = KMeans()
visualizer = KElbowVisualizer(model, k=(1,12)).fit(df)
visualizer.show()

Здесь оптимальное количество кластеров = 3 или k = 3.

(4) Запустите алгоритм с K=3 —

# using the KMeans from sklearn
from sklearn.cluster import KMeans
# create an instance of a k-means model with 3 clusters
kmeans = KMeans(n_clusters = 3)
df_analyze = df.drop('id',axis=1)
# fit the model to all the data, except for the id label
kmeans.fit(df_analyze)
# get cluster center vectors
kmeans.cluster_centers_
# Output
array([[  50.04763438,    8.82875   ],
       [ 180.017075  ,   18.29      ]])

Давайте проверим метки точек данных. Размер меток должен соответствовать количеству наборов данных.

# check the labels of the data points
kmeans.labels_
# how many drivers are there in 1st, 2nd and 3rd cluster
from collections import Counter
Counter(kmeans.labels_)
# Output
Counter({0: 3200, 2: 104, 1: 696})

Теперь мы готовы построить график, но сначала давайте создадим столбец, указывающий номер кластера для каждой точки данных.

# create a column for cluster label
df_analyze['cluster'] = kmeans.labels_
# plot the data
sns.set_style('whitegrid')
sns.lmplot(x = 'mean_dist_day', y = 'mean_over_speed_perc', 
data = df_analyze, hue = 'cluster', palette = 'cubehelix', 
size = 5, aspect = 2, fit_reg = False)

Инсайты

Я сделал некоторые выводы, которые заключаются в следующем:

  1. Есть 696 водителей, которые в среднем проезжают более 110 миль в день, но имеют средний процент превышения скорости менее 40%.
  2. Из 4000 водителей 104 допускают превышение скорости (>40%) и проезжают в среднем более 110 миль в день.
  3. 3200 водителей проезжают менее 90 миль в день и превышают скорость не более чем на 60 процентов.

Ссылка

  1. https://www.scikit-yb.org/en/latest/api/cluster/elbow.html
  2. https://www.scikit-yb.org/en/latest/index.html

Спасибо за чтение! Буду признателен, если вы подпишитесь на меня или поделитесь этой статьей с кем-нибудь. С наилучшими пожеланиями.

Ваша поддержка была бы потрясающей❤️