Группировка водителей на основе среднего расстояния, пройденного за день, и среднего процента превышения скорости
Привет и добро пожаловать в мою статью! В этом посте вы узнаете, как использовать методы кластеризации, когда у вас есть немаркированные данные. Используя кластеризацию KMeans, вы сможете кластеризовать их, принимая во внимание различные характеристики. Давайте начнем.
Описание набора данных
Найдите набор данных здесь. Для простоты возьмем только две характеристики:
- среднее расстояние, пройденное за день
- средний процент времени, в течение которого водитель превышал скорость более чем на 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)
Инсайты
Я сделал некоторые выводы, которые заключаются в следующем:
- Есть 696 водителей, которые в среднем проезжают более 110 миль в день, но имеют средний процент превышения скорости менее 40%.
- Из 4000 водителей 104 допускают превышение скорости (>40%) и проезжают в среднем более 110 миль в день.
- 3200 водителей проезжают менее 90 миль в день и превышают скорость не более чем на 60 процентов.
Ссылка
- https://www.scikit-yb.org/en/latest/api/cluster/elbow.html
- https://www.scikit-yb.org/en/latest/index.html
Спасибо за чтение! Буду признателен, если вы подпишитесь на меня или поделитесь этой статьей с кем-нибудь. С наилучшими пожеланиями.