Области, в которых наука о данных может помочь правоохранительным органам, включают следующее:

  • распознавание лиц
  • алгоритмы прогнозирования
  • временной ряд и геопространственный анализ преступности
  • оценка риска: в некоторых штатах использовались алгоритмы прогнозирования для прогнозирования вероятности повторных правонарушений

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

  • предвзятость в данных
  • предвзятость, внесенная специалистом (-ами) по данным
  • плохая доступность данных или методы сбора

Среди этих проблем предвзятость - одна из самых трудных для преодоления. Согласно Оксфордскому словарю, предубеждение - это предубеждение в пользу или против одного предмета, человека или группы по сравнению с другим, обычно считающееся несправедливым. В правоохранительных органах эта проблема может проявляться по-разному. Например, если ваш набор данных больше или меньше представляет подмножество населения, вы можете сделать неправильные выводы о людях на основе собранных вами данных о них. Некоторые распространенные формы предвзятости в области науки о данных включают:

  • Систематическая ошибка выборки, когда некоторые члены населения чрезмерно представлены
  • Ошибка исключения возникает из-за исключения определенных групп из выборки.
  • Предвзятость наблюдателя - это склонность видеть то, что мы ожидаем или хотим увидеть.
  • Ошибка измерения относится к любой систематической или неслучайной ошибке, которая возникает при сборе данных в исследовании.

В статье [1] описаны некоторые другие применения науки о данных в правоохранительных органах и связанные с ними проблемы. Среди этих различных вариантов использования есть такие вещи, как крупномасштабное наблюдение, которое заставляет многих людей чувствовать себя неуютно из-за проблем с конфиденциальностью. Одним из важных вариантов использования является использование моделей глубокого обучения для распознавания лиц известных преступников. Многие страны в настоящее время широко используют камеры, особенно в городах, и различные правоохранительные органы использовали изображения, снятые этими камерами, и программное обеспечение для распознавания лиц, чтобы идентифицировать людей, причастных к преступной деятельности. Я вас спрошу: что будет, если модель найдет кого-то, похожего на преступника? Если вы хотите узнать больше о глубоком обучении, прочтите справочную статью [2], в которой рассказывается о некоторых проблемах, связанных с обучением моделей глубокого обучения.

Наука о данных и правоохранительные органы

Чтобы следовать приведенным ниже примерам, вам необходимо установить следующие библиотеки python:

Пример 1 - Исследовательский анализ набора данных о преступлениях

Набор данных, используемый в этом примере, доступен на Kaggle. Набор данных содержит информацию о различных преступлениях, произошедших в Ванкувере.

import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('crime/crime.csv')
df.head(2)

Давайте посмотрим на распределение преступлений по типам:

df['TYPE'].value_counts(normalize=True)
Theft from Vehicle                                        0.325449
Mischief                                                  0.132691
Break and Enter Residential/Other                         0.114693
Offence Against a Person                                  0.102029
Other Theft                                               0.098307
Theft of Vehicle                                          0.072398
Break and Enter Commercial                                0.063780
Theft of Bicycle                                          0.048488
Vehicle Collision or Pedestrian Struck (with Injury)      0.041272
Vehicle Collision or Pedestrian Struck (with Fatality)    0.000479
Homicide                                                  0.000415
Name: TYPE, dtype: float64

Пока мы можем рассмотреть все это, давайте пока сосредоточимся на кражах велосипедов. Во-первых, давайте посмотрим на географическое распределение краж велосипедов. Есть ли области, где риск кражи выше?

bicycle_theft = df[df['TYPE']=='Theft of Bicycle']   # create a subset of the dataframe
bicycle_theft.head(1)

Поскольку этот фрейм данных включает широту и долготу, мы можем преобразовать его в фреймворк геопанд и нанести данные на шейп-файл Ванкувера.

gdf_bicycle_theft = gpd.GeoDataFrame(bicycle_theft, geometry=gpd.points_from_xy(bicycle_theft.Longitude, bicycle_theft.Latitude))

Карту Ванкувера можно получить на сайте opendata_vancouver.ca. Лицензия на передачу данных доступна здесь.

vancouver_map = gpd.read_file('crime/public-streets/public-streets.shp')
vancouver_map.plot();

Можно совместить два графика на одних и тех же осях. Самый простой способ сделать это:

base = vancouver_map.plot()

gdf_bicycle_theft.plot(ax=base, marker='o', color='red', markersize=5);

Если вы предпочитаете, вы можете использовать matplotlib для объединения графиков. Если вы сделаете это таким образом, вам нужно будет установить аспект на «равный».

fig, ax = plt.subplots()

ax.set_aspect('equal')

vancouver_map.plot(ax=ax)

gdf_bicycle_theft.plot(ax=ax, marker='o', color='red', markersize=5)

plt.show();

Итак, мы можем видеть, где происходят кражи, но мы могли бы сделать это по старинке, воткнув булавки в карту. Сила использования анализа данных в том, что мы можем легко и быстро исследовать данные дальше. В какой день и в какое время происходят кражи? Информация о том, когда и где украдены велосипеды, может быть полезной для полиции.

gdf_bicycle_theft.head(1)

фрейм данных содержит некоторые временные данные, которые мы также можем проанализировать:

gdf_bicycle_theft['HOUR'].value_counts(normalize=True)
18.0    0.080062
17.0    0.070812
0.0     0.065565
12.0    0.064166
19.0    0.063506
16.0    0.061446
15.0    0.059425
20.0    0.056899
14.0    0.050408
21.0    0.050291
22.0    0.049942
13.0    0.044850
9.0     0.043568
8.0     0.042557
23.0    0.037738
10.0    0.035600
11.0    0.033657
7.0     0.022192
1.0     0.019433
6.0     0.012437
2.0     0.012204
3.0     0.007967
5.0     0.007928
4.0     0.007346
Name: HOUR, dtype: float64

Кажется, 90% краж происходят с 8 утра до полуночи; около двух третей приходится на период с 14:00 до полуночи. Помимо времени суток, мы можем посмотреть дни недели. Мы можем преобразовывать даты в дни недели в пандах. Во-первых, нам нужно объединить столбцы года, месяца и дня в один столбец даты, а затем создать столбец day_of_week:

gdf_bicycle_theft['YEAR'] = df['YEAR'].apply(str)
gdf_bicycle_theft['MONTH'] = df['MONTH'].apply(str)
gdf_bicycle_theft['DAY'] = df['DAY'].apply(str)
gdf_bicycle_theft['date'] = gdf_bicycle_theft[['YEAR','MONTH','DAY']].agg('-'.join, axis=1)

gdf_bicycle_theft.head(1)

gdf_bicycle_theft['date'] = pd.to_datetime(gdf_bicycle_theft['date'])
gdf_bicycle_theft['day_of_week'] = gdf_bicycle_theft['date'].dt.weekday

Это дает нам числовое значение, где понедельник = 0. Другие функции возвращают название дня, но числовые значения обычно лучше подходят для анализа.

gdf_bicycle_theft.head(1)

gdf_bicycle_theft['day_of_week'].value_counts().plot(kind='bar');

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

corr = gdf_bicycle_theft.corr()
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns,cmap='Blues');

Эта тепловая карта корреляции показывает, что нет сильной корреляции между временем суток, днем ​​недели или местоположением. Возможно, большинство краж велосипедов - это случайные кражи; они могут произойти где угодно и когда угодно.

В следующем разделе мы рассмотрим другой способ визуализации данных о преступности.

Пример 2 - Рассказ с данными - как распределяется преступность в течение года

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

Создание сводной таблицы для визуализации среднего количества преступлений в день в течение года.

crimes_pivot_table = df.pivot_table(values='YEAR', index='DAY', columns='MONTH', aggfunc=len)
crimes_pivot_table_year_count = df.pivot_table(values='YEAR', index='DAY', columns='MONTH', aggfunc=lambda x: len(x.unique()))
crimes_average = crimes_pivot_table/crimes_pivot_table_year_count
crimes_average.columns = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']

plt.figure(figsize=(7,9))
plt.title('Average Number of Crimes per Day and Month', fontsize=14)
sns.heatmap(crimes_average.round(), cmap='seismic', linecolor='black',linewidths=0.1, cbar=False, annot=True, fmt=".0f");

Более высокий уровень преступности в некоторые праздники, но не в Рождество:

Некоторые даты выделяются на этой визуализации как имеющие более высокие, чем обычно, показатели преступности, например, Хэллоуин (31 октября) и Новый год (1 января). Какие виды преступлений совершаются в разные праздники?

new_year_crime = df[(df['MONTH'] == 1) & (df['DAY'] == 1)]
halloween_crime = df[(df['MONTH'] == 10) & (df['DAY'] == 31)]
christmas_crime = df[(df['MONTH'] == 12) & (df['DAY'] == 25)]
new_year_crime['TYPE'].value_counts(normalize=True)
Theft from Vehicle                                      0.281266
Offence Against a Person                                0.254881
Mischief                                                0.160422
Break and Enter Residential/Other                       0.092876
Theft of Vehicle                                        0.055409
Break and Enter Commercial                              0.053298
Other Theft                                             0.047493
Vehicle Collision or Pedestrian Struck (with Injury)    0.027968
Theft of Bicycle                                        0.026385
Name: TYPE, dtype: float64
halloween_crime['TYPE'].value_counts(normalize=True)
Theft from Vehicle                                      0.268492
Mischief                                                0.238206
Offence Against a Person                                0.129295
Break and Enter Residential/Other                       0.104834
Other Theft                                             0.070472
Theft of Vehicle                                        0.066977
Break and Enter Commercial                              0.063483
Vehicle Collision or Pedestrian Struck (with Injury)    0.036109
Theft of Bicycle                                        0.020967
Homicide                                                0.001165
Name: TYPE, dtype: float64
christmas_crime['TYPE'].value_counts(normalize=True)
Theft from Vehicle                                        0.349733
Offence Against a Person                                  0.137968
Break and Enter Residential/Other                         0.129412
Mischief                                                  0.119786
Break and Enter Commercial                                0.091979
Theft of Vehicle                                          0.081283
Other Theft                                               0.038503
Vehicle Collision or Pedestrian Struck (with Injury)      0.035294
Theft of Bicycle                                          0.014973
Vehicle Collision or Pedestrian Struck (with Fatality)    0.001070
Name: TYPE, dtype: float64

Таким образом, хотя преступность на Рождество в целом снижается, кражи из транспортных средств - довольно распространенное явление.

В следующем примере для поиска кластеров в данных используется алгоритм неконтролируемой кластеризации.

Пример 3 - Поиск кластеров в данных

Имея некоторые данные, мы можем разделить их на группы, используя алгоритм неконтролируемой кластеризации, такой как k-means. Но сначала нам нужно удалить строки, в которых широта или долгота равны нулю или нулю:

from sklearn.cluster import KMeans
df = df.dropna()
df =df[df.Latitude != 0]
df =df[df.Longitude != 0]
columns = ['Latitude','Longitude']
df_kmeans = df[columns]

Можно вычислить значение k, используя что-то вроде метода изгиба, но давайте предположим значение k = 4. При использовании алгоритма K-средних важно то, что для k не существует правильного значения. Если вы выберете низкое значение, вы упустите некоторые детали, но если k будет слишком большим, кластеры будут перекрываться.

kmeans = KMeans(n_clusters = 4, init ='k-means++')
#kmeans.fit(df[df.columns[2,3,10,11]]) # Compute k-means clustering.
kmeans.fit(df_kmeans)
df['cluster_label'] = kmeans.fit_predict(df_kmeans)
centers = kmeans.cluster_centers_ # Coordinates of cluster centers.
labels = kmeans.predict(df_kmeans) # Labels of each point
df.head(3)

print(centers)
[[  49.25546649 -123.05554761]
 [  49.25595164 -123.16557506]
 [  49.27733873 -123.1171725 ]
 [  49.22510287 -123.10793027]]

создать фрейм данных геопанд из данных центров.

data = [[  49.25546649, -123.05554761],[  49.25595164, -123.16557506],[  49.27733873, -123.1171725 ],[  49.22510287, -123.10793027]]
  
df_centers = pd.DataFrame(data, columns = ['Latitude', 'Longitude'])
gdf_df_centers = gpd.GeoDataFrame(df_centers , geometry=gpd.points_from_xy(df_centers .Longitude, df_centers .Latitude))
gdf_df_centers.head()

Затем мы можем нанести центры криминального кластера kmeans на карту Ванкувера.

base = vancouver_map.plot(alpha=0.3)

gdf_df_centers.plot(ax=base, marker='o', color='red', markersize=200);

Если вы хотели разместить в Ванкувере 4 полицейских участка, возможно, вы захотите разместить их где-нибудь вокруг этих точек. Излишне говорить, что этот анализ можно расширить до гораздо более детального анализа. Например, вы можете найти и визуализировать центры по разным типам преступлений или по разным месяцам или дням… Взгляните на данные сами и посмотрите, что вы можете придумать.

Краткий обзор того, что вы узнали:

Если вы зашли так далеко, вы должны иметь базовое представление о:

  • Как нанести точки данных на карту файла формы
  • Как использовать сводную таблицу и фреймворк pandas, чтобы посмотреть на распределение переменной во времени
  • Как сгруппировать данные с помощью Kmeans и нанести центры кластеров на карту шейп-файла

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

Использованная литература:

  1. Заврсник А., Алгоритмическое правосудие: алгоритмы и большие данные в системе уголовного правосудия, дата получения = 24.05.2021 ссылка
  2. Хаятт, Дж., Требования к разработке надежных нейронных сетей, дата получения = 24.05.2021 ссылка

Свяжитесь с г-ном Data Science:

MrDataScience.com, GitHub, Средний,