Как стать автором
Обновить

Black [O]lives Matter: раса, криминал и огонь на поражение в США. Часть 3

Время на прочтение25 мин
Количество просмотров16K

Продолжаем наше исследование, посвященное ситуации в США со стрельбой полицейских и уровнем преступности среди представителей белой и черной (афроамериканской) рас. Напомню, что в первой части я рассказал о предпосылках исследования, его целях и принятых оговорках / допущениях; а во второй части была демонстрация анализа взаимосвязи между расовой принадлежностью, преступностью и гибелью от рук служб правопорядка.

Напомню также и промежуточные выводы, сделанные на основе статистических наблюдений (за период с 2000 по 2018 год):

  • В количественном (абсолютном) выражении белых жертв полиции больше, чем черных.

  • В среднем от рук полиции погибает 5.9 на 1 млн. черных и 2.3 на 1 млн. белых (черных в 2.6 раз больше).

  • Годовой разброс (отклонение) по гибели чернокожих от рук полиции почти в два раза выше, чем в данных по белым жертвам.

  • Жертвы полиции среди белых монотонно растут (в среднем на 0.1 - 0.2 в год), в то время как жертвы среди черных вернулись на уровень 2009 г. после пика в 2011 - 2013 гг.

  • Белые совершают в два раза больше преступлений, чем черные, в абсолютном выражении, но в 3 раза меньше в относительном выражении (на миллион представителей своей расы).

  • Преступность среди белых относительно монотонно растет на протяжении всего периода (выросла в 2 раза за 18 лет). Преступность среди черных также растет, но скачкообразно. За весь период преступность среди черных выросла также в 2 раза (аналогично белым).

  • Гибель от рук полиции связана с криминальностью (количеством совершаемых преступлений). При этом эта корреляция неоднородна по расам: для белых она близка к идеальной, для черных далека от таковой.

  • Смертельные случаи при встречах с полицией растут "в ответ" на рост преступности, с лагом в несколько лет (особенно видно по данным среди черных).

  • Белые преступники немного чаще встречают смерть от рук полиции, чем черные.

Сегодня, как я обещал, посмотрим на географическое распределение этих данных по отдельным штатам США, что должно либо подтвердить, либо опровергнуть выводы, сделанные в масштабах всей страны.

Однако, прежде чем мы займемся этой географией, давайте сделаем шаг назад и посмотрим, что будет, если вместо категории "все преступления" (All Offenses) в качестве исходных данных по преступности взять только самые "злодейские". Многие из моих читателей указали в комментариях, что это будет правильнее, так как "все преступления" включают, например, мелкое воровство или торговлю наркотиками, что (по логике) не должно быть связано с агрессивным поведением, провоцирующим полицейских на стрельбу. Хотя я лично не могу целиком с этим согласиться и считаю, что любое совершенное преступление может повлечь за собой повышенное внимание со стороны полиции (которое, в свою очередь, может кончиться не лучшим образом)... все же, давайте проявим любопытство и посмотрим!

Нападения и убийства вместо "всех преступлений"

Итак, в том месте, где мы формируем датасет по преступлениям, вместо строки

df_crimes1 = df_crimes1.loc[df_crimes1['Offense'] == 'All Offenses']

пишем:

df_crimes1 = df_crimes1.loc[df_crimes1['Offense'].str.contains('Assault|Murder')]

Таким образом, наш новый фильтр включает виды преступлений, связанных с нападением (Assault) и убийством (Murder). Замечу сразу, что этот набор данных не включает непредумышленное убийство и убийство в рамках самозащиты, а только умышленное убийство.

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

Удельное количество преступлений на миллион представителей расы:

Видим, что порядок меньше, но графики почти идентичны предыдущим (по всем преступлениям).

Связь между преступностью и жертвами полиции:

Корреляционная матрица:

White_promln_cr

White_promln_uof

Black_promln_cr

Black_promln_uof

White_promln_cr

1.000000

0.684757

0.986622

0.729674

White_promln_uof

0.684757

1.000000

0.614132

0.795486

Black_promln_cr

0.986622

0.614132

1.000000

0.680893

Black_promln_uof

0.729674

0.795486

0.680893

1.000000

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

Ну, и наш "самодельный" индекс - отношение количества жертв полиции к количеству преступлений:

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

Таким образом, все сделанные выводы остаются в силе.

Что ж, теперь - уроки географии! :)

Исходные данные

Для анализа преступности по штатам я использовал другие исходные датасеты из базы данных ФБР, а именно:

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

Первый набор содержит данные о количестве преступлений по всем 51 штату с 1991 по 2018 год, по следующим видам преступлений:

  1. violent crime: все насильственные преступления (убийство, грабеж, изнасилование и нападение с отягчающими обстоятельствами), см. определение на сайте ФБР;

  2. homicide: убийство

  3. rape legacy: изнасилование (по старым меркам - до 2013 г.)

  4. rape revised: изнасилование (по новым меркам - начиная с 2013 г.)

  5. robbery: грабеж

  6. aggravated assault: нападение с отягчающими обстоятельствами

  7. property crime: преступления против собственности

  8. burglary: взлом / проникновение в собственность

  9. larceny: хищение

  10. motor vehicle theft: угон автотранспорта

  11. arson: поджог

Для целей настоящего исследования мы будем использовать количество насильственных преступлений (violent crime), что согласуется с вышеизложенной логикой.

Второй набор содержит данные по количествам преступлений по 51 штату с 2000 по 2018 год, с разбивкой по расам (выделяемые расовые категории - см. в предыдущей статье). Поскольку БД по арестам имеет несколько другую разбивку по типам преступлений и не имеет готового набора по насильственным преступлениям, исходный запрос и результаты содержат 4 вида соответствующих правонарушений (убийство, грабеж, изнасилование и нападение с отягчающими обстоятельствами).

География преступности без расовой принадлежности

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

import pandas as pd, numpy as np

CRIME_STATES_FILE = ROOT_FOLDER + '\\crimes_by_state.csv'
df_crime_states = pd.read_csv(CRIME_STATES_FILE, sep=';', header=0, 
                              usecols=['year', 'state_abbr', 'population', 'violent_crime'])

Загруженные данные:

year

state_abbr

population

violent_crime

0

2016

AL

4860545

25878

1

1996

AL

4273000

24159

2

1997

AL

4319000

24379

3

1998

AL

4352000

22286

4

1999

AL

4369862

21421

...

...

...

...

...

1423

2000

DC

572059

8626

1424

2001

DC

573822

9195

1425

2002

DC

569157

9322

1426

2003

DC

557620

9061

1427

2016

DC

684336

8236

1428 rows × 4 columns

Добавим полные названия штатов (CSV перечня штатов здесь - уже использовали в прошлый раз). Также почистим и отсортируем данные:

df_crime_states = df_crime_states.merge(df_state_names, on='state_abbr')
df_crime_states.dropna(inplace=True)
df_crime_states.sort_values(by=['year', 'state_abbr'], inplace=True)

Поскольку в датасете есть данные о численности населения, вычислим удельные значения преступности на миллион человек:

df_crime_states['crime_promln'] = df_crime_states['violent_crime'] * 1e6 / df_crime_states['population']

Наконец, отобразим данные в виде двумерного массива за период с 2000 по 2018 год, переместив названия штатов в столбцы и убрав лишние столбцы:

df_crime_states_agg = df_crime_states.groupby(['state_name', 'year'])['violent_crime'].sum().unstack(level=1).T
df_crime_states_agg.fillna(0, inplace=True)
df_crime_states_agg = df_crime_states_agg.astype('uint32').loc[2000:2018, :]

Получили таблицу с 19 строками (по количеству наблюдений, т.е. лет с 2000 по 2018) и 51 столбцом (по количеству штатов).

Давайте отобразим топ-10 штатов по среднегодовому количеству преступлений:

df_crime_states_top10 = df_crime_states_agg.describe().T.nlargest(10, 'mean').astype('int32')

count

mean

std

min

25%

50%

75%

max

state_name

California

19

181514

19425

153763

165508

178597

193022

212867

Texas

19

117614

6522

104734

113212

121091

122084

126018

Florida

19

110104

18542

81980

92809

113541

127488

131878

New York

19

81618

9548

68495

75549

77563

85376

105111

Illinois

19

62866

10445

47775

54039

64185

69937

81196

Michigan

19

49273

5029

41712

44900

49737

54035

56981

Pennsylvania

19

46941

5066

39192

41607

48188

51021

55028

Tennessee

19

41951

2432

38063

40321

41562

43358

46482

Georgia

19

40228

3327

34355

38283

39435

41495

47353

North Carolina

19

37936

3193

32718

34706

38243

40258

43125

Давайте также посмотрим на графике для наглядности:

df_crime_states_top10 = df_crime_states_agg.loc[:, df_crime_states_agg_top10.index]
plt = df_crime_states_top10.plot.box(figsize=(12, 10))
plt.set_ylabel('Кол-во насильственных преступлений (2000 - 2018)')

"Голливудский" штат намного опережает по этой печальной статистике все остальные. Тройка лидеров - южные штаты (Калифорния, Техас и Флорида); именно про эти штаты снято большинство американских фильмов про бандитов :)

Также видно, что в некоторых штатах уровень преступности существенно изменился за наблюдаемый период (Калифорния, Флорида, Иллинойс), в то время как в других он остался почти на том же уровне (например, в Джорджии).

Подозреваю, что преступность непосредственно связана с численностью населения. Давайте посмотрим на топ-10 штатов по населению в 2018 году:

df_crime_states_2018 = df_crime_states.loc[df_crime_states['year'] == 2018]
plt = df_crime_states_2018.nlargest(10, 'population').sort_values(by='population').plot.barh(x='state_name', y='population', legend=False, figsize=(10,5))
plt.set_xlabel('Население (2018)')
plt.set_ylabel('')

Как говорится, те же фаберже, только в профиль. Удостоверимся в корреляции между преступностью и населением:

# группируем данные по штатам за 2000 - 2018 гг (среднее арифметическое по полям)
df_corr = df_crime_states[df_crime_states['year']>=2000].groupby(['state_name']).mean()
# смотрим корреляцию между столбцами "население" и "кол-во преступлений"
df_corr = df_corr.loc[:, ['population', 'violent_crime']]
df_corr.corr(method='pearson').at['population', 'violent_crime']

- получаем коэффициент корреляции 0.98. Что и требовалось доказать!

А вот удельные показатели преступности дают совсем другой топ-лист:

plt = df_crime_states_2018.nlargest(10, 'crime_promln').sort_values(by='crime_promln').plot.barh(x='state_name', y='crime_promln', legend=False, figsize=(10,5))
plt.set_xlabel('Кол-во насильственных преступлений на 1 млн. чел. (2018)')
plt.set_ylabel('')

Вот так дела! По удельным значениям впереди штаты с небольшой численностью населения: Округ Колумбия (т.е. столица США) и Аляска (в обоих по 700+ тыс. человек на 2018 г.) и один штат со средней численностью (Нью-Мексико с 2 млн. чел.) Из нашего предыдущего топа здесь засветился только Теннесси, что придает этому штату, мягко говоря, не очень хорошую репутацию...

Отобразим наши наблюдения на карте США. Для этого необходимо импортировать библиотеку folium:

import folium

Сначала - преступления за 2018 г. в абсолютных значениях:

FOLIUM_URL = 'https://raw.githubusercontent.com/python-visualization/folium/master/examples/data'
FOLIUM_US_MAP = f'{FOLIUM_URL}/us-states.json'

m = folium.Map(location=[48, -102], zoom_start=3)

folium.Choropleth(
    geo_data=FOLIUM_US_MAP,
    name='choropleth',
    data=df_crime_states_2018,
    columns=['state_abbr', 'violent_crime'],
    key_on='feature.id',
    fill_color='YlOrRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='Насильственные преступления за 2018 г.',
    bins=df_crime_states_2018['violent_crime'].quantile(list(np.linspace(0.0, 1.0, 5))).to_list(),
    reset=True
).add_to(m)

folium.LayerControl().add_to(m)

m

Теперь то же в удельных значениях (на 1 млн человек):

m = folium.Map(location=[48, -102], zoom_start=3)

folium.Choropleth(
    geo_data=FOLIUM_US_MAP,
    name='choropleth',
    data=df_crime_states_2018,
    columns=['state_abbr', 'crime_promln'],
    key_on='feature.id',
    fill_color='YlOrRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='Насильственные преступления за 2018 г. (на 1 млн. населения)',
    bins=df_crime_states_2018['crime_promln'].quantile(list(np.linspace(0.0, 1.0, 5))).to_list(),
    reset=True
).add_to(m)

folium.LayerControl().add_to(m)

m

Видим, что в первом случае примерно поровну северных и южных штатов, а во втором случае - одни южные штаты плюс столица США и Аляска.

Жертвы полиции по штатам (без расовой принадлежности)

Давайте сейчас поглядим, что происходит в конкретных штатах в отношении полицейской стрельбы на уничтожение.

Подготовим данные: добавим в наш существующий датасет по гибели от рук закона (см. предыдущую часть) полные наименования штатов, сгруппируем количество случаев по штатам, выделим период с 2000 по 2018 год и отобразим удобным образом.

df_fenc_agg_states = df_fenc.merge(df_state_names, how='inner', left_on='State', right_on='state_abbr')
df_fenc_agg_states.fillna(0, inplace=True)
df_fenc_agg_states = df_fenc_agg_states.rename(columns={'state_name_x': 'State Name'})
df_fenc_agg_states = df_fenc_agg_states.loc[:, ['Year', 'Race', 'State', 'State Name', 'Cause', 'UOF']]
df_fenc_agg_states = df_fenc_agg_states.groupby(['Year', 'State Name', 'State'])['UOF'].count().unstack(level=0)
df_fenc_agg_states.fillna(0, inplace=True)
df_fenc_agg_states = df_fenc_agg_states.astype('uint16').loc[:, :2018]
df_fenc_agg_states = df_fenc_agg_states.reset_index()

Отобразим топ-10 штатов за 2018 год:

df_fenc_agg_states_2018 = df_fenc_agg_states.loc[:, ['State Name', 2018]]
plt = df_fenc_agg_states_2018.nlargest(10, 2018).sort_values(2018).plot.barh(x='State Name', y=2018, legend=False, figsize=(10,5))
plt.set_xlabel('Кол-во жертв от рук полиции за 2018 г.')
plt.set_ylabel('')

Также посмотрим на данные за весь период в виде "ящиков с усами":

fenc_top10 = df_fenc_agg_states.loc[df_fenc_agg_states['State Name'].isin(df_fenc_agg_states_2018.nlargest(10, 2018)['State Name'])]
fenc_top10 = fenc_top10.T
fenc_top10.columns = fenc_top10.loc['State Name', :]
fenc_top10 = fenc_top10.reset_index().loc[2:, :].set_index('Year')
df_sorted = fenc_top10.mean().sort_values(ascending=False)
fenc_top10 = fenc_top10.loc[:, df_sorted.index]

plt = fenc_top10.plot.box(figsize=(12, 6))
plt.set_ylabel('Кол-во жертв от рук полиции (2000 - 2018)')

Ну что же, та же "великолепная троица": Калифорния, Техас и Флорида плюс еще два южных штата - Аризона и Джорджия. Лидеры обнаруживают, как и прежде, больший разброс по годам, демонстрируя изменения.

Связь между жертвами полиции и криминалом

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

Для начала необходимо объединить данные по преступлениям (насильственного характера) с данными по жертвам полиции, попутно указав диапазон с 2000 по 2018 год (этот же период анализировался в предыдущей части исследования).

# добавляем в исходный датасет полные названия штатов
df_fenc_crime_states = df_fenc.merge(df_state_names, how='inner', left_on='State', right_on='state_abbr')
# переименовываем столбцы
df_fenc_crime_states = df_fenc_crime_states.rename(columns={'Year': 'year', 'state_name_x': 'state_name'})
# обрезаем период до 2000-2018
df_fenc_crime_states = df_fenc_crime_states[df_fenc_crime_states['year'].between(2000, 2018)]
# агрегируем количество смертей по годам и штатам
df_fenc_crime_states = df_fenc_crime_states.groupby(['year', 'state_name'])['UOF'].count().reset_index()
# добавляем данные по преступлениям
df_fenc_crime_states = df_fenc_crime_states.merge(df_crime_states[df_crime_states['year'].between(2000, 2018)], how='outer', on=['year', 'state_name'])
# заполняем пробелы нулями
df_fenc_crime_states.fillna({'UOF': 0}, inplace=True)
# приводим типы данных
df_fenc_crime_states = df_fenc_crime_states.astype({'year': 'uint16', 'UOF': 'uint16', 'population': 'uint32', 'violent_crime': 'uint32'})
# сортируем
df_fenc_crime_states = df_fenc_crime_states.sort_values(by=['year', 'state_name'])
На выходе:

year

state_name

UOF

state_abbr

population

violent_crime

crime_promln

0

2000

Alabama

7

AL

4447100

21620

4861.595197

1

2000

Alaska

2

AK

626932

3554

5668.876369

2

2000

Arizona

11

AZ

5130632

27281

5317.278651

3

2000

Arkansas

4

AR

2673400

11904

4452.756789

4

2000

California

97

CA

33871648

210531

6215.552311

...

...

...

...

...

...

...

...

907

2018

Virginia

18

VA

8517685

17032

1999.604353

908

2018

Washington

24

WA

7535591

23472

3114.818732

909

2018

West Virginia

7

WV

1805832

5236

2899.494527

910

2018

Wisconsin

10

WI

5813568

17176

2954.467893

911

2018

Wyoming

4

WY

577737

1226

2122.072846

Напомню, что столбец UOF (от "Use Of Force" - применение силы) содержит количество смертей от рук служб правопорядка (которых я иногда кратко называю "полицией", хотя здесь есть и другие службы, например ФБР) в результате намеренного применения силы.

Сразу создадим и датафрейм со среднегодовыми данными:

df_fenc_crime_states_agg = df_fenc_crime_states.groupby(['state_name']).mean().loc[:, ['UOF', 'violent_crime']]

Отобразим графики преступлений и жертв полиции (среднегодовые значения для всех штатов):

plt = df_fenc_crime_states_agg['violent_crime'].plot.bar(legend=True, figsize=(15,5))
plt.set_ylabel('Среднегодовое кол-во насильственных преступлений')
plt2 = df_fenc_crime_states_agg['UOF'].plot(secondary_y=True, style='g', legend=True)
plt2.set_ylabel('Среднегодовое кол-во жертв от рук полиции', rotation=90)
plt2.set_xlabel('')
plt.set_xlabel('')
plt.set_xticklabels(df_fenc_crime_states_agg.index, rotation='vertical')
plt

Если внимательно посмотреть на эту совмещенную диаграмму, можно сделать пару наблюдений:

  • связь между преступностью и гибелью от полиции хорошо прослеживается "невооруженным глазом": зеленая кривая в большинстве случаев "повторяет" столбики преступности;

  • в штатах с высоким уровнем преступности (Флорида, Иллинойс, Мичиган, Нью-Йорк, Техас) количество жертв полиции несколько ниже (в пропорциональном отношении) по сравнению со штатами с более низким уровнем преступности.

Посмотрим на диаграмму рассеяния:

plt = df_fenc_crime_states_agg.plot.scatter(x='violent_crime', y='UOF')
plt.set_xlabel('Среднегодовое кол-во насильственных преступлений')
plt.set_ylabel('Среднегодовое кол-во жертв от рук полиции')

Здесь становится хорошо заметно, что соотношение между жертвами полиции и преступностью зависит от уровня преступности. Условно говоря, для штатов со среднегодовым количеством преступлений до 75 тыс. количество жертв полиции растет полее полого, чем для штатов со среднегодовым количеством преступлений свыше 75 тыс. Таких "преступных" штатов здесь, как мы видим, всего четыре. Давайте посмотрим им "в лицо":

df_fenc_crime_states_agg[df_fenc_crime_states_agg['violent_crime'] > 75000]

UOF

violent_crime

state_name

California

133.263158

181514.578947

Florida

54.578947

110104.315789

New York

19.157895

81618.052632

Texas

64.368421

117614.631579

Ну конечно же, это уже знакомая нам четверка "всадников Апокалипсиса": Калифорния, Флорида, Техас и Нью-Йорк.

Давайте посмотрим на корреляцию между нашими данными по 3 кейсам:

  1. Штаты со среднегодовым количеством преступлений до 75 тыс.

  2. Штаты со среднегодовым количеством преступлений свыше 75 тыс. (наша "четверка")

  3. Все штаты

Для первого кейса:

df_fenc_crime_states_agg[df_fenc_crime_states_agg['violent_crime'] <= 75000].corr(method='pearson').at['UOF', 'violent_crime']

получаем коэффициент 0.839. Это значимая величина, но до 0.9 не доходит, так как здесь налицо значительный разброс по 47 штатам.

Для второго кейса:

df_fenc_crime_states_agg[df_fenc_crime_states_agg['violent_crime'] > 75000].corr(method='pearson').at['UOF', 'violent_crime']

получаем уже 0.999 - идеальную корреляцию!

Для третьего кейса (все штаты):

df_fenc_crime_states_agg.corr(method='pearson').at['UOF', 'violent_crime']

получаем нечто среднее между двумя предыдущими: 0.935. Но этот общий коэффициент указывает на весьма значительно корреляцию.

А теперь посмотрим, как распределен по штатам наш "индекс стрельбы в преступников" (это, конечно, условное название). Разделим, как и раньше, количество жертв полиции на количество преступлений:

df_fenc_crime_states_agg['uof_by_crime'] = df_fenc_crime_states_agg['UOF'] / df_fenc_crime_states_agg['violent_crime']
plt = df_fenc_crime_states_agg.loc[:, 'uof_by_crime'].sort_values(ascending=False).plot.bar(figsize=(15,5))
plt.set_xlabel('')
plt.set_ylabel('Отношение кол-ва жертв полиции к кол-ву преступлений')

Здесь интересно заметить, что наши лидеры по преступности ушли в середину и даже ближе концу, показывая тем самым, что в самых преступных штатах не самые "кровавые" полицейские (по отношению к потенциальным или реальным преступникам).

Промежуточные выводы:

1. Количество насильственных преступлений прямо зависит от количества населения (спасибо, кэп!)

2. В абсолютном выражении лидеры по преступности - самые населенные штаты: Калифорния, Флорида, Техас и Нью-Йорк.

2. В удельном отношении (на миллион населения) преступности больше в южных штатах, чем в северных, где заметны только два низко населенных штата - Аляска и Округ Колумбия (г. Вашингтон).

3. Между преступностью и гибелью от рук полиции подтверждается заметная корреляция, составляющая в среднем 0.93 по всем штатам. При этом для лидеров по преступности эта корреляция достигает почти единицы (т.е. линейная пропорция), в то время как для остальных штатов - 0.84.

Влияние расы на преступность и гибель от полиции по штатам

Убедившись, что преступность в целом влияет на гибель от рук полиции, давайте добавим теперь расовый фактор и посмотрим, на что он влияет. Как я уже объяснил выше, для этой цели будем использовать данные по арестам, поскольку они являются наиболее полными из доступных, покрывая основные виды преступлений и все штаты США. Естественно, ни в одном штате и ни в одной стране нельзя приравнять количество арестов к количеству преступлений, но эти показатели, тем не менее, тесно взаимосвязаны. Поэтому для статистических изысканий аресты нам годятся. И мы уже договорились, что будем рассматривать аресты только за насильственные преступления (убийство, грабеж, изнасилование и нападение с отягчающими обстоятельствами), в соответствии с принятой концепцией анализа.

Загружаем данные из CSV и привычно добавляем названия штатов:

ARRESTS_FILE = ROOT_FOLDER + '\\arrests_by_state_race.csv'
# берем только аресты белых и черных
df_arrests = pd.read_csv(ARRESTS_FILE, sep=';', header=0, usecols=['data_year', 'state', 'white', 'black'])
# суммируем аресты за 4 вида преступлений по годам и штатам
df_arrests = df_arrests.groupby(['data_year', 'state']).sum().reset_index()
# добавляем наименования штатов
df_arrests = df_arrests.merge(df_state_names, left_on='state', right_on='state_abbr')
# переименовываем и удаляем столбцы
df_arrests = df_arrests.rename(columns={'data_year': 'year'}).drop(columns='state_abbr')
# поглядим, что получилось
df_arrests.head()

year

state

black

white

state_name

0

2000

AK

140

613

Alaska

1

2001

AK

139

718

Alaska

2

2002

AK

143

677

Alaska

3

2003

AK

173

801

Alaska

4

2004

AK

163

765

Alaska

Сразу создадим данные со среднегодовыми показателями:

df_arrests_agg = df_arrests.groupby(['state_name']).mean().drop(columns='year')
Аресты белых и черных по 51 штату (среднегодовые значения)

black

white

state_name

Alabama

2805.842105

1757.315789

Alaska

221.894737

844.157895

Arizona

1378.368421

7007.157895

Arkansas

2387.894737

2303.789474

California

26668.368421

87252.315789

Colorado

1268.210526

5157.368421

Connecticut

2097.631579

2981.210526

Delaware

1356.894737

1048.578947

District of Columbia

111.111111

4.944444

Florida

12.000000

7.000000

Georgia

8262.842105

3502.894737

Hawaii

81.052632

368.736842

Idaho

44.000000

1362.263158

Illinois

5699.842105

1841.894737

Indiana

3553.368421

5192.263158

Iowa

1104.421053

3039.473684

Kansas

522.315789

1501.315789

Kentucky

1476.894737

1906.052632

Louisiana

5928.789474

3414.263158

Maine

63.736842

699.526316

Maryland

7189.105263

4010.684211

Massachusetts

3407.157895

7319.684211

Michigan

7628.157895

6304.157895

Minnesota

2231.210526

2645.736842

Mississippi

1462.210526

474.368421

Missouri

5777.473684

5703.368421

Montana

27.684211

673.684211

Nebraska

591.421053

1058.526316

Nevada

1956.421053

3817.210526

New Hampshire

68.368421

640.789474

New Jersey

6424.157895

6043.789474

New Mexico

234.421053

2809.368421

New York

8394.526316

8734.947368

North Carolina

10527.947368

7412.947368

North Dakota

61.263158

277.052632

Ohio

4063.947368

4071.368421

Oklahoma

1625.105263

3353.000000

Oregon

445.105263

3373.368421

Pennsylvania

11974.157895

11039.473684

Rhode Island

275.684211

699.210526

South Carolina

5578.526316

3615.421053

South Dakota

67.105263

349.368421

Tennessee

6799.894737

8462.526316

Texas

10547.631579

22062.684211

Utah

167.105263

1748.894737

Vermont

43.526316

439.210526

Virginia

4100.421053

3060.263158

Washington

1688.947368

6012.105263

West Virginia

271.263158

1528.315789

Wisconsin

3440.055556

4107.722222

Wyoming

27.263158

506.947368

При рассмотрении этих данных нельзя не заметить некоторые странности. В одних штатах аресты исчисляются тысячами и сотнями, в других - десятками и единицами. Так, например, по Флориде - одному из самых густо населенных штатов - отображается только 19 арестов в год (12 черных и 7 белых). Здесь явно не хватает каких-то точек наблюдений; проверим это:

df_arrests[df_arrests['state'] == 'FL']

И видим, что, действительно, по Флориде доступны данные только за 2017 год. Что ж, придется использовать то, что имеем... По остальным штатам все данные есть. Но разница на 1-2 порядка может также объясняться различной населенностью. Давайте подгрузим данные по населению (для обеих рас) и посмотрим.

Данные по численности я взял с сайта Бюро переписи населения США. В России сайт почему-то не работает, но вы же знаете, как заставить его заработать ;) Здесь подготовленный CSV с данными переписи с 2010 по 2019 г.

К сожалению, сведений по населению по штатам за более ранние периоды (с 2000 по 2009 г.) нет. Таким образом, для этой части исследования придется сузить диапазон наблюдений до 9 лет (с 2010 по 2018 г.).

POP_STATES_FILES = ROOT_FOLDER + '\\us_pop_states_race_2010-2019.csv'
df_pop_states = pd.read_csv(POP_STATES_FILES, sep=';', header=0)
# данные имеют специфический формат, придется поколдовать ))
df_pop_states = df_pop_states.melt('state_name', var_name='r_year', value_name='pop')
df_pop_states['race'] = df_pop_states['r_year'].str[0]
df_pop_states['year'] = df_pop_states['r_year'].str[2:].astype('uint16')
df_pop_states.drop(columns='r_year', inplace=True)
df_pop_states = df_pop_states[df_pop_states['year'].between(2000, 2018)]
df_pop_states = df_pop_states.groupby(['state_name', 'year', 'race']).sum().unstack().reset_index()
df_pop_states.columns = ['state_name', 'year', 'black_pop', 'white_pop']
Данные по численности белых и черных по штатам

state_name

year

black_pop

white_pop

0

Alabama

2010

5044936

13462236

1

Alabama

2011

5067912

13477008

2

Alabama

2012

5102512

13484256

3

Alabama

2013

5137360

13488812

4

Alabama

2014

5162316

13493432

...

...

...

...

...

454

Wyoming

2014

31392

2167008

455

Wyoming

2015

29568

2177740

456

Wyoming

2016

29304

2170700

457

Wyoming

2017

29444

2148128

458

Wyoming

2018

29604

2139896

Добавляем этот датасет к арестам и вычисляем удельные показатели по арестам на 1 млн представителей каждой расы:

df_arrests_2010_2018 = df_arrests.merge(df_pop_states, how='inner', on=['year', 'state_name'])
df_arrests_2010_2018['white_arrests_promln'] = df_arrests_2010_2018['white'] * 1e6 / df_arrests_2010_2018['white_pop']
df_arrests_2010_2018['black_arrests_promln'] = df_arrests_2010_2018['black'] * 1e6 / df_arrests_2010_2018['black_pop']

И так же создаем датасет со среднегодовыми показателями:

df_arrests_2010_2018_agg = df_arrests_2010_2018.groupby(['state_name', 'state']).mean().drop(columns='year').reset_index()
df_arrests_2010_2018_agg = df_arrests_2010_2018_agg.set_index('state_name')
Объединенный датасет по арестам и численности (среднегодовые значения)

state

black

white

black_pop

white_pop

white_arrests_promln

black_arrests_promln

state_name

Alabama

AL

1682.000000

1342.000000

5.152399e+06

1.349158e+07

99.424741

324.055203

Alaska

AK

255.000000

870.555556

1.069489e+05

1.957445e+06

445.199704

2390.243876

Arizona

AZ

1635.555556

6852.000000

1.279172e+06

2.260403e+07

302.923002

1267.000192

Arkansas

AR

1960.666667

2466.000000

1.855574e+06

9.465137e+06

260.459917

1055.854934

California

CA

24381.666667

79477.000000

1.007921e+07

1.128020e+08

704.731408

2419.234376

Colorado

CO

1377.222222

5171.555556

9.508173e+05

1.882940e+07

274.209456

1439.257054

Connecticut

CT

1823.777778

2295.333333

1.643690e+06

1.165681e+07

196.712775

1114.811569

Delaware

DE

1318.000000

914.111111

8.354622e+05

2.635794e+06

347.374980

1582.395733

District of Columbia

DC

139.222222

4.777778

1.288488e+06

1.154416e+06

4.112547

108.101938

Florida

FL

12.000000

7.000000

1.415383e+07

6.498292e+07

0.107721

0.847827

Georgia

GA

8137.222222

4271.444444

1.279378e+07

2.500293e+07

170.939250

639.869143

Hawaii

HI

81.333333

383.777778

1.124298e+05

1.453712e+06

264.353469

725.477589

Idaho

ID

51.888889

1373.777778

5.288222e+04

6.154316e+06

223.151878

978.205026

Illinois

IL

4216.000000

1284.222222

7.554687e+06

3.980927e+07

32.199075

557.493894

Indiana

IN

2924.444444

5186.111111

2.522917e+06

2.267508e+07

228.699515

1155.168768

Iowa

IA

1181.000000

2999.222222

4.305640e+05

1.141794e+07

262.666753

2760.038539

Kansas

KS

539.555556

1512.111111

7.116182e+05

1.006714e+07

150.232160

758.851182

Kentucky

KY

1443.888889

2173.666667

1.442174e+06

1.558094e+07

139.526970

1001.433470

Louisiana

LA

5917.000000

3255.333333

6.021228e+06

1.174245e+07

277.277874

981.334817

Maine

ME

78.000000

678.000000

7.667733e+04

5.059062e+06

134.024032

1019.061684

Maryland

MD

6460.444444

3325.444444

7.229037e+06

1.426036e+07

233.317775

893.942720

Massachusetts

MA

3349.555556

6895.111111

2.249232e+06

2.226671e+07

309.745910

1505.096888

Michigan

MI

6302.444444

5647.444444

5.645176e+06

3.170670e+07

178.111684

1116.364030

Minnesota

MN

2570.000000

2686.777778

1.311818e+06

1.867259e+07

143.902882

1986.464052

Mississippi

MS

1251.000000

418.777778

4.478208e+06

7.122651e+06

58.753686

279.574565

Missouri

MO

4588.333333

5146.111111

2.854060e+06

2.023871e+07

254.292323

1608.303611

Montana

MT

34.222222

788.333333

2.210444e+04

3.660813e+06

214.944902

1525.795754

Nebraska

NE

618.888889

1154.888889

3.701520e+05

6.709768e+06

172.269972

1687.725359

Nevada

NV

2450.000000

4480.333333

1.052192e+06

8.647157e+06

517.401564

2316.374085

New Hampshire

NH

89.777778

784.777778

7.873600e+04

5.012056e+06

156.580888

1141.127571

New Jersey

NJ

5429.555556

4971.888889

5.241910e+06

2.595141e+07

191.427955

1037.217679

New Mexico

NM

260.111111

3136.000000

2.053876e+05

6.905377e+06

454.129135

1268.115549

New York

NY

6035.777778

6600.222222

1.373077e+07

5.534157e+07

119.253616

439.581451

North Carolina

NC

9549.000000

6759.333333

8.804027e+06

2.844145e+07

238.320077

1088.968561

North Dakota

ND

100.666667

386.222222

6.583289e+04

2.583206e+06

149.190455

1536.987272

Ohio

OH

3632.888889

3733.333333

5.879375e+06

3.844592e+07

97.107129

617.699379

Oklahoma

OK

1577.333333

3049.000000

1.189604e+06

1.160567e+07

262.904593

1326.463864

Oregon

OR

375.444444

3125.000000

3.292284e+05

1.402225e+07

222.819615

1148.158169

Pennsylvania

PA

11227.000000

10652.111111

5.945100e+06

4.232445e+07

251.598838

1893.415475

Rhode Island

RI

274.888889

595.000000

3.275551e+05

3.592825e+06

165.605635

837.932682

South Carolina

SC

4703.222222

3094.111111

5.365012e+06

1.324712e+07

234.287821

877.892998

South Dakota

SD

103.777778

448.333333

6.154533e+04

2.903489e+06

153.995184

1641.137012

Tennessee

TN

7603.000000

9068.666667

4.460808e+06

2.070126e+07

438.486812

1708.022356

Texas

TX

10821.666667

21122.111111

1.345661e+07

8.628389e+07

245.051258

803.917061

Utah

UT

193.222222

1797.333333

1.558876e+05

1.079659e+07

166.431266

1240.117890

Vermont

VT

54.222222

520.555556

3.017111e+04

2.376143e+06

219.129918

1785.111547

Virginia

VA

4059.555556

3071.222222

6.544598e+06

2.340732e+07

131.178648

620.504151

Washington

WA

1791.777778

5870.444444

1.147000e+06

2.289368e+07

256.632241

1566.862244

West Virginia

WV

294.111111

1648.666667

2.597649e+05

6.908718e+06

238.517207

1132.059057

Wisconsin

WI

3525.333333

4046.222222

1.516534e+06

2.018658e+07

200.441064

2325.622492

Wyoming

WY

28.777778

464.555556

2.856356e+04

2.151349e+06

216.004646

1005.725503

Отобразим в виде диаграмм:

  1. Количество арестов в абсолютных значениях

    plt = df_arrests_2010_2018_agg.loc[:, ['white', 'black']].sort_index(ascending=False).plot.barh(color=['g', 'olive'], figsize=(10, 20))
    plt.set_ylabel('')
    plt.set_xlabel('Среднегодовое кол-во арестов (2010-2018 гг.)')
Длинная картинка

2. Теперь в удельных значениях:

plt = df_arrests_2010_2018_agg.loc[:, ['white_arrests_promln', 'black_arrests_promln']].sort_index(ascending=False).plot.barh(color=['g', 'olive'], figsize=(10, 20))
plt.set_ylabel('')
plt.set_xlabel('Среднегодовое кол-во арестов на 1 млн представителей расы (2010-2018 гг.)')
Еще одна длинная картинка

Что можно сказать при взгляде на эти данные?

Во-первых, конечно, количество арестов зависит от количество населения - это заметно по данным для обеих рас.

Во-вторых, в абсолютных показателях белых арестовывают несколько чаще. Говорю "несколько", потому как видно, что эта закономерность соблюдается не во всех штатах (см. например, Северная Каролина, Джорджия, Луизиана и др.) А во-вторых, разница в большинстве штатов не слишком заметна (за исключением, пожалуй, Калифорнии, Техаса, Колорадо, Массачусетса и нескольких других штатов.

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

Давайте проверим наши выводы цифрами.

Разница между средним количеством арестов белых и черных:

df_arrests_2010_2018['white'].mean() / df_arrests_2010_2018['black'].mean()

- получаем 1.56. Т.е. белых за наблюдаемые 9 лет арестовывали в среднем в полтора раза больше, чем черных.

Теперь то же в удельных показателях:

df_arrests_2010_2018['white_arrests_promln'].mean() / df_arrests_2010_2018['black_arrests_promln'].mean()

- получаем 0.183. Т.е. вероятность ареста черных в 5.5 раз выше, чем белых.

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

Чтобы понять, как раса и преступность связаны с гибелью от рук стражей закона, объединим данные по арестам с данными по жертвам полиции.

Подготовим данные по жертвам с расовым признаком с разбивкой по штатам:

df_fenc_agg_states1 = df_fenc.merge(df_state_names, how='inner', left_on='State', right_on='state_abbr')
df_fenc_agg_states1.fillna(0, inplace=True)
df_fenc_agg_states1 = df_fenc_agg_states1.rename(columns={'state_name_x': 'state_name', 'Year': 'year'})
df_fenc_agg_states1 = df_fenc_agg_states1.loc[df_fenc_agg_states1['year'].between(2000, 2018), ['year', 'Race', 'state_name', 'UOF']]
df_fenc_agg_states1 = df_fenc_agg_states1.groupby(['year', 'state_name', 'Race'])['UOF'].count().unstack().reset_index()
df_fenc_agg_states1 = df_fenc_agg_states1.rename(columns={'Black': 'black_uof', 'White': 'white_uof'})
df_fenc_agg_states1 = df_fenc_agg_states1.fillna(0).astype({'black_uof': 'uint32', 'white_uof': 'uint32'})
Полученный датасет

year

state_name

black_uof

white_uof

0

2000

Alabama

4

3

1

2000

Alaska

0

2

2

2000

Arizona

0

11

3

2000

Arkansas

1

3

4

2000

California

19

78

...

...

...

...

...

907

2018

Virginia

11

7

908

2018

Washington

0

24

909

2018

West Virginia

2

5

910

2018

Wisconsin

3

7

911

2018

Wyoming

0

4

Производим объединение:

df_arrests_fenc = df_arrests.merge(df_fenc_agg_states1, on=['state_name', 'year'])
df_arrests_fenc = df_arrests_fenc.rename(columns={'white': 'white_arrests', 'black': 'black_arrests'})
Пример данных за 2017 год

year

state

black_arrests

white_arrests

state_name

black_uof

white_uof

15

2017

AK

266

859

Alaska

2

3

34

2017

AL

3098

2509

Alabama

7

17

53

2017

AR

2092

2674

Arkansas

6

7

72

2017

AZ

2431

7829

Arizona

6

43

91

2017

CA

24937

80367

California

25

137

110

2017

CO

1781

6079

Colorado

2

27

127

2017

CT

1687

2114

Connecticut

1

5

140

2017

DE

1198

782

Delaware

4

3

159

2017

GA

7747

4171

Georgia

15

21

173

2017

HI

88

419

Hawaii

0

1

192

2017

IA

1400

3524

Iowa

1

5

210

2017

ID

61

1423

Idaho

0

6

229

2017

IL

2847

947

Illinois

13

11

248

2017

IN

3565

4300

Indiana

9

13

267

2017

KS

585

1651

Kansas

3

10

286

2017

KY

1481

2035

Kentucky

1

18

305

2017

LA

5875

2284

Louisiana

13

5

324

2017

MA

2953

6089

Massachusetts

1

4

343

2017

MD

6662

3371

Maryland

8

5

361

2017

ME

89

675

Maine

1

8

380

2017

MI

6149

5459

Michigan

6

7

399

2017

MN

2513

2681

Minnesota

1

7

418

2017

MO

4571

5007

Missouri

13

20

437

2017

MS

1266

409

Mississippi

7

10

455

2017

MT

50

915

Montana

0

3

474

2017

NC

8177

5576

North Carolina

9

14

501

2017

NE

80

578

Nebraska

0

1

516

2017

NH

113

817

New Hampshire

0

3

535

2017

NJ

4859

4136

New Jersey

9

6

554

2017

NM

205

2094

New Mexico

0

20

573

2017

NV

2695

4657

Nevada

3

12

592

2017

NY

5923

6633

New York

7

9

611

2017

OH

4472

3882

Ohio

11

23

630

2017

OK

1638

2872

Oklahoma

3

20

649

2017

OR

453

3222

Oregon

2

9

668

2017

PA

10123

10191

Pennsylvania

7

17

681

2017

RI

315

633

Rhode Island

0

1

700

2017

SC

4645

2964

South Carolina

3

10

712

2017

SD

124

537

South Dakota

0

2

731

2017

TN

6654

8496

Tennessee

4

24

750

2017

TX

11493

20911

Texas

18

56

769

2017

UT

199

1964

Utah

1

5

788

2017

VA

4283

3247

Virginia

8

17

804

2017

VT

75

626

Vermont

0

1

823

2017

WA

1890

5804

Washington

8

27

842

2017

WV

350

1705

West Virginia

1

10

856

2017

WY

36

549

Wyoming

0

1

872

2017

DC

135

8

District of Columbia

1

1

890

2017

WI

3604

4106

Wisconsin

6

15

892

2017

FL

12

7

Florida

19

43

ОК, теперь можно вычислить корреляцию между арестами и жертвами полиции, как мы уже делали раньше:

df_corr = df_arrests_fenc.loc[:, ['white_arrests', 'black_arrests', 'white_uof', 'black_uof']].corr(method='pearson').iloc[:2, 2:]
df_corr.style.background_gradient(cmap='PuBu')

white_uof

black_uof

white_arrests

0.872766

0.622167

black_arrests

0.702350

0.766852

Получаем вновь неплохую корреляцию: 0.87 для белых и 0.77 для черных! Здесь интересно отметить, что эти значения очень близки к коэффициентам корреляции, полученным нами на примере данных по преступлениям в предыдущей части статьи (там было 0.88 для белых и 0.72 для черных).

Наконец, давайте посмотрим на наш "индекс стрельбы в преступников", разделив количество жертв полиции на количество арестов по каждой расе:

df_arrests_fenc['white_uof_by_arr'] = df_arrests_fenc['white_uof'] / df_arrests_fenc['white_arrests']
df_arrests_fenc['black_uof_by_arr'] = df_arrests_fenc['black_uof'] / df_arrests_fenc['black_arrests']
df_arrests_fenc.replace([np.inf, -np.inf], np.nan, inplace=True)
df_arrests_fenc.fillna({'white_uof_by_arr': 0, 'black_uof_by_arr': 0}, inplace=True)

Посмотрим на графике, как распределяется этот показатель по штатам (возьмем 2018 год):

plt = df_arrests_fenc.loc[df_arrests_fenc['year'] == 2018, ['state_name', 'white_uof_by_arr', 'black_uof_by_arr']].sort_values(by='state_name', ascending=False).plot.barh(x='state_name', color=['g', 'olive'], figsize=(10, 20))
plt.set_ylabel('')
plt.set_xlabel('Отношение кол-ва жертв к кол-ву арестов (за 2018 г.)')
Опять длинная картинка

Видно, что в большинстве штатов показатель для белых превышает показатель для черных, хотя есть и яркие исключения: Юта, Западная Вирджиния, Канзас, Айдахо и Округ Колумбия.

Но сравним средние показатели по всем штатам:

plt = df_arrests_fenc.loc[:, ['white_uof_by_arr', 'black_uof_by_arr']].mean().plot.bar(color=['g', 'olive'])
plt.set_ylabel('Отношение кол-ва жертв к кол-ву арестов')
plt.set_xticklabels(['Белые', 'Черные'], rotation=0)

Показатель для белых выше в 2.5 раза. То есть, если этот индекс о чем-то говорит, то белый преступник имеет в среднем в 2.5 раза большую вероятность встретить смерть от рук полиции, чем черный преступник. Конечно, этот показатель сильно варьируется по штатам: например, в Айдахо черный преступник погибает в 2 раза чаще белого, а в Миссисипи - в 4 раза реже.

Что же, это исследование подошло к концу. Пора резюмировать.

Выводы

  1. Преступность в штатах прямо зависит от численности населения. Наиболее "преступные" штаты, о которых мы привыкли смотреть криминальные хроники или художественные фильмы, - просто самые густо населенные. При рассмотрении удельных показателей насильственных преступлений (на душу населения) лидерами оказываются совершенно неожиданные штаты - Аляска, Округ Колумбия (со столицей США) и Нью-Мексико.

  2. В целом южные штаты показывают более высокие показатели преступности (в удельном выражении), чем северные штаты.

  3. В США количество совершаемых преступлений и арестов обнаруживает значительную разницу среди белых и среди черных в удельном выражении: черные совершаю в 3 раза больше преступлений и в 5 раз чаще попадают под арест, чем белые.

  4. Черные погибают в 2.5 раза чаще от рук служб правопорядка, чем белые.

  5. Гибель от рук служб правопорядка имеет хорошо прослеживаемую связь с преступностью: чем больше преступлений, тем больше смертельных исходов от встреч с полицией. Эта корреляция подтверждается в целом по штатам и для каждой расы, хотя она немного выше для белых. Это подтверждается и разницей в отношении количества жертв полиции к количеству преступлений и арестов между расами: белые преступники имеют несколько более высокую вероятность встретить смерть, чем черные.

Хочу напоследок выразить благодарность моим читателям, давшим ценные комментарии и советы :)

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

Ссылка на английскую версию статьи (по просьбам трудящихся).

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 42: ↑35 и ↓7+40
Комментарии208

Публикации

Истории

Работа

Python разработчик
121 вакансия
Data Scientist
78 вакансий

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань