{"cells":[{"metadata":{},"cell_type":"markdown","source":"

POLICE KILLINGS IN THE USA
2015 to 2019

\n\n\"Don't \n\n\n## **INTRODUCTION**\n\nSince its inception, police in America have continued to have a tenuous and volatile relationship with many of its citizens, especially those of lower economic status and those whose race is not classified as White. \n\nIn this notebook I will perform a exploratory data analysis on a dataset that consists of people killed by police throughout the United States. I have also added US census data to get a clearer picture of how the racial statistics compare to those of the United States as a whole. \n\nI hope this notebook provides you with insights and I hope that we can work toward rectifying the racial and economic disparity that continues to fuel police brutality in these United States of America. "},{"metadata":{},"cell_type":"markdown","source":"\n\n

Table of Contents

\n\n* I. LOAD LIBRARIES & PACKAGES\n* II. DATA OVERVIEW & INSIGHTS\n* III. MISSING VALUES\n* IV. FEATURE ENGINEERING\n* V. EXPLORATORY DATA ANALYSIS \n * [Univariate Data Exploration](#univariate)\n * [Timewise Data Exploration](#timewise)\n * [Bivariate Data Exploration](#bivariate)\n* VI. CONCLUSION"},{"metadata":{},"cell_type":"markdown","source":"# I. LOAD PACKAGES & LIBRARIES"},{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np \nimport pandas as pd \nimport os\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport plotly.express as px\nimport missingno as msno\nimport plotly.graph_objects as go\nimport plotly.figure_factory as ff\nfrom plotly.subplots import make_subplots\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n for filename in filenames:\n print(os.path.join(dirname, filename))\n\n# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":505,"outputs":[{"output_type":"stream","text":"/kaggle/input/state-census-quickfacts/Missouri QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Montana QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Kansas QuickFacts.csv\n/kaggle/input/state-census-quickfacts/West Virginia QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Arizona QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Connecticut QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Virginia QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Massachusetts QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Oregon QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Maryland QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Delaware QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Utah QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Vermont QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Oklahoma QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Kentucky QuickFacts.csv\n/kaggle/input/state-census-quickfacts/California quickfacts.csv\n/kaggle/input/state-census-quickfacts/North Dakota QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Idaho QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Minnesota QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Texas QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Wisconsin QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Rhode Island QuickFacts.csv\n/kaggle/input/state-census-quickfacts/New Mexico QuickFacts .csv\n/kaggle/input/state-census-quickfacts/South Dakota QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Indiana QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Pennsylvania QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Mississippi QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Maine QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Hawaii QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Wyoming QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Ohio QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Unted States QuickFacts.csv\n/kaggle/input/state-census-quickfacts/New Jersey QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Washington QuickFacts.csv\n/kaggle/input/state-census-quickfacts/North Carolina QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Florida QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Georga QuickFacts.csv\n/kaggle/input/state-census-quickfacts/New Hampshire QuickFacts.csv\n/kaggle/input/state-census-quickfacts/New York QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Michigan QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Alabama QuickFacts.csv\n/kaggle/input/state-census-quickfacts/South Carolina QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Louisiana QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Arkansas QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Colorado QuickFacts .csv\n/kaggle/input/state-census-quickfacts/Alaska QuickFacts .csv\n/kaggle/input/state-census-quickfacts/Nevada QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Nebraska QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Tennessee QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Iowa QuickFacts.csv\n/kaggle/input/state-census-quickfacts/Illinois QuickFacts.csv\n/kaggle/input/data-police-shootings/fatal-police-shootings-data.csv\n/kaggle/input/us-census-2019-population-est/US_census_2019_quickfacts.csv\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"# II. DATA OVERVIEW & INSIGHTS"},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/data-police-shootings/fatal-police-shootings-data.csv')\ndf.columns","execution_count":506,"outputs":[{"output_type":"execute_result","execution_count":506,"data":{"text/plain":"Index(['id', 'name', 'date', 'manner_of_death', 'armed', 'age', 'gender',\n 'race', 'city', 'state', 'signs_of_mental_illness', 'threat_level',\n 'flee', 'body_camera'],\n dtype='object')"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_population = pd.read_csv('../input/us-census-2019-population-est/US_census_2019_quickfacts.csv')\ndf_population.head(25)","execution_count":507,"outputs":[{"output_type":"execute_result","execution_count":507,"data":{"text/plain":" Fact United States Alabama \\\n0 Population estimates July 1 2019 (V2019) 328239523 4903185 \n1 Population estimates base April 1 2010 (V2019) 308758105 4780125 \n2 Population change - April 1 2010 (estimates b... 6.3 2.6 \n3 Population Census April 1 2010 308745538 4779736 \n4 Persons under 5 years 6.0 6.0 \n5 Persons under 18 years 22.3 22.2 \n6 Persons 65 years and over 16.5 17.3 \n7 Female persons 50.8 51.7 \n8 White alone 76.3 69.1 \n9 Black or African American alone 13.4 26.8 \n10 American Indian and Alaska Native alone 1.3 0.7 \n11 Asian alone 5.9 1.5 \n12 Native Hawaiian and Other Pacific Islander alone 0.2 0.1 \n13 Two or More Races 2.8 1.8 \n14 Hispanic or Latino 18.5 4.6 \n15 White alone not Hispanic or Latino 60.1 65.3 \n16 Veterans 2015-2019 18230322 330207 \n17 Foreign born persons 2015-2019 13.6 3.5 \n18 Housing units July 1 2019 (V2019) 139684244 2284847 \n19 Owner-occupied housing unit rate 2015-2019 64.0 68.8 \n20 Median value of owner-occupied housing units 2... $217500 $142700 \n21 Median selected monthly owner costs -with a mo... $1595 $1186 \n22 Median selected monthly owner costs -without a... $500 $363 \n23 Median gross rent 2015-2019 $1062 $792 \n24 Building permits 2019 1386048 17748 \n\n Alaska Arizona Arkansas California Colorado Connecticut Delaware ... \\\n0 731545 7278717 3017804 39512223 5758736 3565287 973764 ... \n1 710249 6392288 2916031 37254519 5029319 3574147 897937 ... \n2 3.0 13.9 3.5 6.1 14.5 -0.2 8.4 ... \n3 710231 6392017 2915918 37253956 5029196 3574097 897934 ... \n4 7.0 5.9 6.2 6.0 5.8 5.1 5.6 ... \n5 24.6 22.5 23.2 22.5 21.9 20.4 20.9 ... \n6 12.5 18.0 17.4 14.8 14.6 17.7 19.4 ... \n7 47.9 50.3 50.9 50.3 49.6 51.2 51.7 ... \n8 65.3 82.6 79.0 71.9 86.9 79.7 69.2 ... \n9 3.7 5.2 15.7 6.5 4.6 12.2 23.2 ... \n10 15.6 5.3 1.0 1.6 1.6 0.6 0.7 ... \n11 6.5 3.7 1.7 15.5 3.5 5.0 4.1 ... \n12 1.4 0.3 0.4 0.5 0.2 0.1 0.1 ... \n13 7.5 2.9 2.2 4.0 3.1 2.5 2.7 ... \n14 7.3 31.7 7.8 39.4 21.8 16.9 9.6 ... \n15 60.2 54.1 72.0 36.5 67.7 65.9 61.7 ... \n16 65186 488061 197138 1574531 373795 167521 65438 ... \n17 7.8 13.3 4.8 26.8 9.7 14.6 9.6 ... \n18 319854 3075981 1389129 14366336 2464164 1524992 443781 ... \n19 64.3 64.4 65.6 54.8 65.2 66.1 71.2 ... \n20 $270400 $225500 $127800 $505000 $343300 $275400 $251100 ... \n21 $1933 $1434 $1089 $2357 $1744 $2119 $1587 ... \n22 $582 $419 $353 $594 $474 $894 $470 ... \n23 $1244 $1052 $745 $1503 $1271 $1180 $1130 ... \n24 1680 46580 12723 110197 38633 5854 6539 ... \n\n South Dakota Tennessee Texas Utah Vermont Virginia Washington \\\n0 884659 6829174 28995881 3205958 623989 8535519 7614893 \n1 814198 6346276 25146091 2763891 625737 8001049 6724540 \n2 8.7 7.6 15.3 16.0 -0.3 6.7 13.2 \n3 814180 6346105 25145561 2763885 625741 8001024 6724540 \n4 6.9 6.0 6.9 7.7 4.7 5.9 6.0 \n5 24.5 22.1 25.5 29.0 18.3 21.8 21.8 \n6 17.2 16.7 12.9 11.4 20.0 15.9 15.9 \n7 49.5 51.2 50.3 49.6 50.6 50.8 49.9 \n8 84.6 78.4 78.7 90.6 94.2 69.4 78.5 \n9 2.3 17.1 12.9 1.5 1.4 19.9 4.4 \n10 9.0 0.5 1.0 1.6 0.4 0.5 1.9 \n11 1.5 2.0 5.2 2.7 1.9 6.9 9.6 \n12 0.1 0.1 0.1 1.1 Z 0.1 0.8 \n13 2.5 2.0 2.1 2.6 2.0 3.2 4.9 \n14 4.2 5.7 39.7 14.4 2.0 9.8 13.0 \n15 81.5 73.5 41.2 77.8 92.6 61.2 67.5 \n16 57550 431274 1453450 120447 36988 677533 529784 \n17 3.7 5.1 17.0 8.5 4.7 12.4 14.3 \n18 401862 3028213 11283353 1133521 339439 3562143 3195004 \n19 67.8 66.3 62.0 70.2 70.8 66.3 63.0 \n20 $167100 $167200 $172500 $279100 $227700 $273100 $339000 \n21 $1340 $1244 $1606 $1551 $1621 $1799 $1886 \n22 $483 $388 $514 $430 $677 $479 $583 \n23 $747 $869 $1045 $1037 $985 $1234 $1258 \n24 4415 41361 209895 28779 1801 32418 48424 \n\n West Virginia Wisconsin Wyoming \n0 1792147 5822434 578759 \n1 1853018 5687285 563775 \n2 -3.3 2.4 2.7 \n3 1852994 5686986 563626 \n4 5.2 5.7 6.0 \n5 20.1 21.8 23.1 \n6 20.5 17.5 17.1 \n7 50.5 50.2 49.1 \n8 93.5 87.0 92.5 \n9 3.6 6.7 1.3 \n10 0.3 1.2 2.7 \n11 0.8 3.0 1.1 \n12 Z 0.1 0.1 \n13 1.8 2.0 2.2 \n14 1.7 7.1 10.1 \n15 92.0 80.9 83.7 \n16 130536 331340 44999 \n17 1.7 5.0 3.4 \n18 894956 2725296 280291 \n19 73.2 67.0 70.4 \n20 $119600 $180600 $220500 \n21 $1050 $1430 $1459 \n22 $326 $553 $420 \n23 $725 $856 $855 \n24 3010 17480 1708 \n\n[25 rows x 52 columns]","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FactUnited StatesAlabamaAlaskaArizonaArkansasCaliforniaColoradoConnecticutDelaware...South DakotaTennesseeTexasUtahVermontVirginiaWashingtonWest VirginiaWisconsinWyoming
0Population estimates July 1 2019 (V2019)3282395234903185731545727871730178043951222357587363565287973764...88465968291742899588132059586239898535519761489317921475822434578759
1Population estimates base April 1 2010 (V2019)3087581054780125710249639228829160313725451950293193574147897937...81419863462762514609127638916257378001049672454018530185687285563775
2Population change - April 1 2010 (estimates b...6.32.63.013.93.56.114.5-0.28.4...8.77.615.316.0-0.36.713.2-3.32.42.7
3Population Census April 1 20103087455384779736710231639201729159183725395650291963574097897934...81418063461052514556127638856257418001024672454018529945686986563626
4Persons under 5 years6.06.07.05.96.26.05.85.15.6...6.96.06.97.74.75.96.05.25.76.0
5Persons under 18 years22.322.224.622.523.222.521.920.420.9...24.522.125.529.018.321.821.820.121.823.1
6Persons 65 years and over16.517.312.518.017.414.814.617.719.4...17.216.712.911.420.015.915.920.517.517.1
7Female persons50.851.747.950.350.950.349.651.251.7...49.551.250.349.650.650.849.950.550.249.1
8White alone76.369.165.382.679.071.986.979.769.2...84.678.478.790.694.269.478.593.587.092.5
9Black or African American alone13.426.83.75.215.76.54.612.223.2...2.317.112.91.51.419.94.43.66.71.3
10American Indian and Alaska Native alone1.30.715.65.31.01.61.60.60.7...9.00.51.01.60.40.51.90.31.22.7
11Asian alone5.91.56.53.71.715.53.55.04.1...1.52.05.22.71.96.99.60.83.01.1
12Native Hawaiian and Other Pacific Islander alone0.20.11.40.30.40.50.20.10.1...0.10.10.11.1Z0.10.8Z0.10.1
13Two or More Races2.81.87.52.92.24.03.12.52.7...2.52.02.12.62.03.24.91.82.02.2
14Hispanic or Latino18.54.67.331.77.839.421.816.99.6...4.25.739.714.42.09.813.01.77.110.1
15White alone not Hispanic or Latino60.165.360.254.172.036.567.765.961.7...81.573.541.277.892.661.267.592.080.983.7
16Veterans 2015-20191823032233020765186488061197138157453137379516752165438...5755043127414534501204473698867753352978413053633134044999
17Foreign born persons 2015-201913.63.57.813.34.826.89.714.69.6...3.75.117.08.54.712.414.31.75.03.4
18Housing units July 1 2019 (V2019)1396842442284847319854307598113891291436633624641641524992443781...4018623028213112833531133521339439356214331950048949562725296280291
19Owner-occupied housing unit rate 2015-201964.068.864.364.465.654.865.266.171.2...67.866.362.070.270.866.363.073.267.070.4
20Median value of owner-occupied housing units 2...$217500$142700$270400$225500$127800$505000$343300$275400$251100...$167100$167200$172500$279100$227700$273100$339000$119600$180600$220500
21Median selected monthly owner costs -with a mo...$1595$1186$1933$1434$1089$2357$1744$2119$1587...$1340$1244$1606$1551$1621$1799$1886$1050$1430$1459
22Median selected monthly owner costs -without a...$500$363$582$419$353$594$474$894$470...$483$388$514$430$677$479$583$326$553$420
23Median gross rent 2015-2019$1062$792$1244$1052$745$1503$1271$1180$1130...$747$869$1045$1037$985$1234$1258$725$856$855
24Building permits 2019138604817748168046580127231101973863358546539...44154136120989528779180132418484243010174801708
\n

25 rows × 52 columns

\n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.head()","execution_count":508,"outputs":[{"output_type":"execute_result","execution_count":508,"data":{"text/plain":" id name date manner_of_death armed age \\\n0 3 Tim Elliot 2015-01-02 shot gun 53.0 \n1 4 Lewis Lee Lembke 2015-01-02 shot gun 47.0 \n2 5 John Paul Quintero 2015-01-03 shot and Tasered unarmed 23.0 \n3 8 Matthew Hoffman 2015-01-04 shot toy weapon 32.0 \n4 9 Michael Rodriguez 2015-01-04 shot nail gun 39.0 \n\n gender race city state signs_of_mental_illness threat_level \\\n0 M A Shelton WA True attack \n1 M W Aloha OR False attack \n2 M H Wichita KS False other \n3 M W San Francisco CA True attack \n4 M H Evans CO False attack \n\n flee body_camera \n0 Not fleeing False \n1 Not fleeing False \n2 Not fleeing False \n3 Not fleeing False \n4 Not fleeing False ","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idnamedatemanner_of_deatharmedagegenderracecitystatesigns_of_mental_illnessthreat_levelfleebody_camera
03Tim Elliot2015-01-02shotgun53.0MASheltonWATrueattackNot fleeingFalse
14Lewis Lee Lembke2015-01-02shotgun47.0MWAlohaORFalseattackNot fleeingFalse
25John Paul Quintero2015-01-03shot and Taseredunarmed23.0MHWichitaKSFalseotherNot fleeingFalse
38Matthew Hoffman2015-01-04shottoy weapon32.0MWSan FranciscoCATrueattackNot fleeingFalse
49Michael Rodriguez2015-01-04shotnail gun39.0MHEvansCOFalseattackNot fleeingFalse
\n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.info()","execution_count":509,"outputs":[{"output_type":"stream","text":"\nRangeIndex: 5416 entries, 0 to 5415\nData columns (total 14 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 id 5416 non-null int64 \n 1 name 5416 non-null object \n 2 date 5416 non-null object \n 3 manner_of_death 5416 non-null object \n 4 armed 5189 non-null object \n 5 age 5181 non-null float64\n 6 gender 5414 non-null object \n 7 race 4895 non-null object \n 8 city 5416 non-null object \n 9 state 5416 non-null object \n 10 signs_of_mental_illness 5416 non-null bool \n 11 threat_level 5416 non-null object \n 12 flee 5167 non-null object \n 13 body_camera 5416 non-null bool \ndtypes: bool(2), float64(1), int64(1), object(10)\nmemory usage: 518.5+ KB\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.describe(include='all')","execution_count":510,"outputs":[{"output_type":"execute_result","execution_count":510,"data":{"text/plain":" id name date manner_of_death armed age \\\ncount 5416.000000 5416 5416 5416 5189 5181.000000 \nunique NaN 5206 1844 2 93 NaN \ntop NaN TK TK 2018-01-06 shot gun NaN \nfreq NaN 187 9 5146 3060 NaN \nmean 3010.398264 NaN NaN NaN NaN 37.117931 \nstd 1695.786456 NaN NaN NaN NaN 13.116135 \nmin 3.000000 NaN NaN NaN NaN 6.000000 \n25% 1545.750000 NaN NaN NaN NaN 27.000000 \n50% 3009.500000 NaN NaN NaN NaN 35.000000 \n75% 4486.250000 NaN NaN NaN NaN 46.000000 \nmax 5927.000000 NaN NaN NaN NaN 91.000000 \n\n gender race city state signs_of_mental_illness threat_level \\\ncount 5414 4895 5416 5416 5416 5416 \nunique 2 6 2470 51 2 3 \ntop M W Los Angeles CA False attack \nfreq 5176 2476 85 799 4200 3495 \nmean NaN NaN NaN NaN NaN NaN \nstd NaN NaN NaN NaN NaN NaN \nmin NaN NaN NaN NaN NaN NaN \n25% NaN NaN NaN NaN NaN NaN \n50% NaN NaN NaN NaN NaN NaN \n75% NaN NaN NaN NaN NaN NaN \nmax NaN NaN NaN NaN NaN NaN \n\n flee body_camera \ncount 5167 5416 \nunique 4 2 \ntop Not fleeing False \nfreq 3411 4798 \nmean NaN NaN \nstd NaN NaN \nmin NaN NaN \n25% NaN NaN \n50% NaN NaN \n75% NaN NaN \nmax NaN NaN ","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idnamedatemanner_of_deatharmedagegenderracecitystatesigns_of_mental_illnessthreat_levelfleebody_camera
count5416.00000054165416541651895181.00000054144895541654165416541651675416
uniqueNaN52061844293NaN262470512342
topNaNTK TK2018-01-06shotgunNaNMWLos AngelesCAFalseattackNot fleeingFalse
freqNaN187951463060NaN51762476857994200349534114798
mean3010.398264NaNNaNNaNNaN37.117931NaNNaNNaNNaNNaNNaNNaNNaN
std1695.786456NaNNaNNaNNaN13.116135NaNNaNNaNNaNNaNNaNNaNNaN
min3.000000NaNNaNNaNNaN6.000000NaNNaNNaNNaNNaNNaNNaNNaN
25%1545.750000NaNNaNNaNNaN27.000000NaNNaNNaNNaNNaNNaNNaNNaN
50%3009.500000NaNNaNNaNNaN35.000000NaNNaNNaNNaNNaNNaNNaNNaN
75%4486.250000NaNNaNNaNNaN46.000000NaNNaNNaNNaNNaNNaNNaNNaN
max5927.000000NaNNaNNaNNaN91.000000NaNNaNNaNNaNNaNNaNNaNNaN
\n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **CARDINALITY**"},{"metadata":{"trusted":true},"cell_type":"code","source":"cardinality={}\nfor col in df.columns:\n cardinality[col] = df[col].nunique()\n\ncardinality","execution_count":511,"outputs":[{"output_type":"execute_result","execution_count":511,"data":{"text/plain":"{'id': 5416,\n 'name': 5206,\n 'date': 1844,\n 'manner_of_death': 2,\n 'armed': 93,\n 'age': 77,\n 'gender': 2,\n 'race': 6,\n 'city': 2470,\n 'state': 51,\n 'signs_of_mental_illness': 2,\n 'threat_level': 3,\n 'flee': 4,\n 'body_camera': 2}"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('MANNER OF DEATH')\nprint(df['manner_of_death'].unique())\nprint('-'*40)\nprint('RACE')\nprint(df['race'].unique())\nprint('-'*40)\nprint('THREAT LEVEL')\nprint(df['threat_level'].unique())\nprint('-'*40)\nprint('FLEE')\nprint(df['flee'].unique())\n","execution_count":512,"outputs":[{"output_type":"stream","text":"MANNER OF DEATH\n['shot' 'shot and Tasered']\n----------------------------------------\nRACE\n['A' 'W' 'H' 'B' 'O' nan 'N']\n----------------------------------------\nTHREAT LEVEL\n['attack' 'other' 'undetermined']\n----------------------------------------\nFLEE\n['Not fleeing' 'Car' 'Foot' 'Other' nan]\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"# III. MISSING VALUES\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"missing_values = df.isnull()\nmissing_values.head()","execution_count":513,"outputs":[{"output_type":"execute_result","execution_count":513,"data":{"text/plain":" id name date manner_of_death armed age gender race city \\\n0 False False False False False False False False False \n1 False False False False False False False False False \n2 False False False False False False False False False \n3 False False False False False False False False False \n4 False False False False False False False False False \n\n state signs_of_mental_illness threat_level flee body_camera \n0 False False False False False \n1 False False False False False \n2 False False False False False \n3 False False False False False \n4 False False False False False ","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idnamedatemanner_of_deatharmedagegenderracecitystatesigns_of_mental_illnessthreat_levelfleebody_camera
0FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
1FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
2FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
3FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
4FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"for column in missing_values.columns.tolist():\n print(column)\n print(missing_values[column].value_counts())\n print('')","execution_count":514,"outputs":[{"output_type":"stream","text":"id\nFalse 5416\nName: id, dtype: int64\n\nname\nFalse 5416\nName: name, dtype: int64\n\ndate\nFalse 5416\nName: date, dtype: int64\n\nmanner_of_death\nFalse 5416\nName: manner_of_death, dtype: int64\n\narmed\nFalse 5189\nTrue 227\nName: armed, dtype: int64\n\nage\nFalse 5181\nTrue 235\nName: age, dtype: int64\n\ngender\nFalse 5414\nTrue 2\nName: gender, dtype: int64\n\nrace\nFalse 4895\nTrue 521\nName: race, dtype: int64\n\ncity\nFalse 5416\nName: city, dtype: int64\n\nstate\nFalse 5416\nName: state, dtype: int64\n\nsigns_of_mental_illness\nFalse 5416\nName: signs_of_mental_illness, dtype: int64\n\nthreat_level\nFalse 5416\nName: threat_level, dtype: int64\n\nflee\nFalse 5167\nTrue 249\nName: flee, dtype: int64\n\nbody_camera\nFalse 5416\nName: body_camera, dtype: int64\n\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"missing_percentage = (missing_values.sum()*100)/df.shape[0]\nmissing_percentage","execution_count":515,"outputs":[{"output_type":"execute_result","execution_count":515,"data":{"text/plain":"id 0.000000\nname 0.000000\ndate 0.000000\nmanner_of_death 0.000000\narmed 4.191285\nage 4.338996\ngender 0.036928\nrace 9.619645\ncity 0.000000\nstate 0.000000\nsigns_of_mental_illness 0.000000\nthreat_level 0.000000\nflee 4.597489\nbody_camera 0.000000\ndtype: float64"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"msno.matrix(df)","execution_count":516,"outputs":[{"output_type":"execute_result","execution_count":516,"data":{"text/plain":""},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"#DROP NULL VALUES\n\ndf.dropna(inplace=True)","execution_count":517,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# IV. FEATURE ENGINEERING"},{"metadata":{"trusted":true},"cell_type":"code","source":"# SEPARATE DAY, MONTH, YEAR INTO INDIVIDUAL COLUMNS\ndf['date']=pd.to_datetime(df['date'])\ndf['year']=pd.to_datetime(df['date']).dt.year\ndf['month']=pd.to_datetime(df['date']).dt.month\ndf['month_name']=df['date'].dt.strftime('%B')\ndf['month_num']=df['date'].dt.strftime('%m')\ndf['weekday']=df['date'].dt.strftime('%A') \ndf['date_num']=df['date'].dt.strftime('%d').astype(int)\ndf['year_month']=df.date.dt.to_period(\"M\")\n\n# CLASSIFY VICTIM AGES INTO AGE RANGE GROUPS\ndf['age_range']=np.where(df['age']<18,'<18',np.where((df['age']>=18)&(df['age']<=35),'18-35',\nnp.where((df['age']>=36)&(df['age']<=50),'36-50', np.where(df['age']>65,'65+',\nnp.where((df['age']>=51)&(df['age']<=65),'51-65',\"Not Specified\")))))\n\n# CHANGE ORDER OF COLUMNS\ncols = ['id', 'name', 'age', 'age_range', 'gender', 'race', 'manner_of_death', 'armed', 'flee', \n 'signs_of_mental_illness', 'threat_level', 'body_camera', 'city', 'state',\n 'date', 'date_num', 'year', 'year_month', 'month', 'month_name', 'month_num', 'weekday']\ndf=df[cols]\n\n#REPLACE VALUES OF RACE COLUMN WITH FULL NAME\nfor i in df['race']:\n df['race'].replace({'A':'Asian', 'W':'White', 'H':'Hispanic', 'B':'Black', 'O':'Other', 'N':'Native'}, inplace=True)\n\n# DROP YEAR 2020 From dataset\n\ndf = df[df['year'] != 2020]\n\ndf.head(3)","execution_count":518,"outputs":[{"output_type":"execute_result","execution_count":518,"data":{"text/plain":" id name age age_range gender race manner_of_death \\\n0 3 Tim Elliot 53.0 51-65 M Asian shot \n1 4 Lewis Lee Lembke 47.0 36-50 M White shot \n2 5 John Paul Quintero 23.0 18-35 M Hispanic shot and Tasered \n\n armed flee signs_of_mental_illness ... city state \\\n0 gun Not fleeing True ... Shelton WA \n1 gun Not fleeing False ... Aloha OR \n2 unarmed Not fleeing False ... Wichita KS \n\n date date_num year year_month month month_name month_num weekday \n0 2015-01-02 2 2015 2015-01 1 January 01 Friday \n1 2015-01-02 2 2015 2015-01 1 January 01 Friday \n2 2015-01-03 3 2015 2015-01 1 January 01 Saturday \n\n[3 rows x 22 columns]","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idnameageage_rangegenderracemanner_of_deatharmedfleesigns_of_mental_illness...citystatedatedate_numyearyear_monthmonthmonth_namemonth_numweekday
03Tim Elliot53.051-65MAsianshotgunNot fleeingTrue...SheltonWA2015-01-02220152015-011January01Friday
14Lewis Lee Lembke47.036-50MWhiteshotgunNot fleeingFalse...AlohaOR2015-01-02220152015-011January01Friday
25John Paul Quintero23.018-35MHispanicshot and TaseredunarmedNot fleeingFalse...WichitaKS2015-01-03320152015-011January01Saturday
\n

3 rows × 22 columns

\n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"# DROP UNNECESSARY ROWS AND COLUMNS\npopulation1 = df_population\npopulation1.drop(population1.index[1:7], inplace=True)\npopulation1.reset_index(inplace=True)\npopulation1 = population1[0:10]\npopulation1.drop(columns=['index'], inplace=True)\n\n# REMOVE UNNECESSARY WORDS AND REPLACE NONSENSICAL VALUES\npopulation1 = population1.replace({'alone':''}, regex=True)\npopulation1.replace('Z', 0, inplace=True) #Replace values Z with number 0 so we can convert columns to float\n\n# CONVERT NUMBERS FROM STRING TO FLOAT\nfor col in population1.columns[1:52]:\n population1[col] = pd.to_numeric(population1[col])","execution_count":519,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.info()","execution_count":520,"outputs":[{"output_type":"stream","text":"\nInt64Index: 4063 entries, 0 to 4934\nData columns (total 22 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 id 4063 non-null int64 \n 1 name 4063 non-null object \n 2 age 4063 non-null float64 \n 3 age_range 4063 non-null object \n 4 gender 4063 non-null object \n 5 race 4063 non-null object \n 6 manner_of_death 4063 non-null object \n 7 armed 4063 non-null object \n 8 flee 4063 non-null object \n 9 signs_of_mental_illness 4063 non-null bool \n 10 threat_level 4063 non-null object \n 11 body_camera 4063 non-null bool \n 12 city 4063 non-null object \n 13 state 4063 non-null object \n 14 date 4063 non-null datetime64[ns]\n 15 date_num 4063 non-null int64 \n 16 year 4063 non-null int64 \n 17 year_month 4063 non-null period[M] \n 18 month 4063 non-null int64 \n 19 month_name 4063 non-null object \n 20 month_num 4063 non-null object \n 21 weekday 4063 non-null object \ndtypes: bool(2), datetime64[ns](1), float64(1), int64(4), object(13), period[M](1)\nmemory usage: 674.5+ KB\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"# V. EXPLORATORY DATA ANALYSIS"},{"metadata":{},"cell_type":"markdown","source":"\n## **UNIVARIATE DATA EXPLORATION & VISUALIZATION**\n\nIn this section we'll create visualizations for numeric and categorical data on an individual basis. "},{"metadata":{},"cell_type":"markdown","source":"### **AGE AND AGE RANGES**"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = ff.create_distplot([df['age']], ['age'], bin_size=5, colors=['blue'])\nfig.update_layout(title_text=\"Distribution of Age\", title_x=0.5)\nfig.show()","execution_count":521,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **AGE RANGE DISTRIBUTION**"},{"metadata":{"trusted":true},"cell_type":"code","source":"age_count = df['age_range'].value_counts().to_frame().reset_index()\nage_count.rename(columns={'index':'age_range', 'age_range':'count'}, inplace=True)\n\nfig = make_subplots(rows=1, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Age Range Count\", \"Age Range Percentages\"))\n\ncolors=['#3ad0e0', '#20bd79', '#519c5c', '#718752', '#38e0a5']\n\nfig.add_trace(go.Bar(x=age_count['age_range'], \n y=age_count['count'],\n text=age_count['count'],\n textposition = 'auto',\n name='Age Range Count',\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=age_count['age_range'], \n values=age_count['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Age Range Percent\",\n marker = dict(colors=colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":522,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **GENDER DISTRIBUTION**"},{"metadata":{"trusted":true},"cell_type":"code","source":"gender_count = df['gender'].value_counts().to_frame().reset_index()\ngender_count.rename(columns={'index':'gender', 'gender':'count'}, inplace=True)\n\nfig = make_subplots(rows=1, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Gender Count\", \"Gender Percentages\"))\n\n# bar_colors=['#3b76a3', '#3ba372', '#a3873b', '#a33b3b', '#863ba3', '#3ba3a1']\n\nfig.add_trace(go.Bar(x=gender_count['gender'], \n y=gender_count['count'],\n text=gender_count['count'],\n textposition = 'auto',\n name='Gender Count',\n opacity = 0.8, \n marker=dict(color= ['#398fcc','#cf4485'], line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=gender_count['gender'], \n values=gender_count['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Gender Percent\",\n marker = dict(colors = ['#398fcc','#cf4485'], line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":523,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **RACE DISTRIBUTION**"},{"metadata":{"trusted":true},"cell_type":"code","source":" race_percent = population1[2:10]\n race_percent.sort_values(by='United States', ascending=False, inplace=True)\n \n colors=['#c44560', '#3b76a3', '#3ba372', '#a3873b', '#a33b3b', '#863ba3', '#3ba3a1']\n\n# labels=['White', 'Black', 'Native', 'Asian', 'Hispanic']\n# values=population['California'][2:4]\n \n fig = go.Figure(data=(go.Bar(x=race_percent['Fact'], \n y=race_percent['United States'],\n text=race_percent['United States'],\n textposition = 'auto',\n name=('Percentage of Population'),\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1)))))\n\n \n fig.update_layout(height=500,\n yaxis_title=\"% of Total Population\",\n title_text=('United States Total Population: ' + df_population['United States'][0]),\n showlegend=False)\n fig.show()\n\n","execution_count":524,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_count = df['race'].value_counts().to_frame().reset_index()\nrace_count.rename(columns={'index':'race', 'race':'count'}, inplace=True)\n\nfig = make_subplots(rows=1, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Race Count\", \"Race Percentages\"))\n\ncolors=['#f299ac', '#1c1811', '#a3873b', '#f7ea72', '#c95742', '#3ba3a1']\n\nfig.add_trace(go.Bar(x=race_count['race'], \n y=race_count['count'],\n text=race_count['count'],\n textposition = 'auto',\n name='Race Count',\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=race_count['race'], \n values=race_count['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Race Percent\",\n marker = dict(colors=colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":525,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **MANNER OF DEATH DISTRIBUTION**"},{"metadata":{"trusted":true},"cell_type":"code","source":"manner_count = df['manner_of_death'].value_counts().to_frame().reset_index()\nmanner_count.rename(columns={'index':'manner_of_death', 'manner_of_death':'count'}, inplace=True)\n\nfig = make_subplots(rows=1, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Manner of Death Count\", \"Manner of Death Percentages\"))\n\nfig.add_trace(go.Bar(x=manner_count['manner_of_death'], \n y=manner_count['count'],\n text=manner_count['count'],\n textposition = 'auto',\n name='Manner of Death Count',\n opacity = 0.8, \n marker=dict(color= ['#ad3131','#089ebf'], line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=manner_count['manner_of_death'], \n values=gender_count['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Manner of Death Percent\",\n marker = dict(colors = ['#ad3131','#089ebf'], line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":526,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **TOP 15 WEAPONS**"},{"metadata":{"trusted":true},"cell_type":"code","source":"top_armed = df['armed'].value_counts().to_frame()\ntop_armed.reset_index(inplace=True)\ntop_armed = top_armed.rename(columns={'index':'armed', 'armed':'count'})\n\nfig = px.histogram(top_armed[0:15], x='armed', y='count', color='armed')\n\nfig.update_layout(title_text='Weapon of Victim', title_x=0.5)\nfig.show()","execution_count":527,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **WAS VICTIM FLEEING?**"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = px.histogram(df, x='flee', color='flee')\nfig.update_layout(title_text='Was Victim Fleeing?', title_x=0.5)\nfig.show()","execution_count":528,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **MENTAL ILLNESS DISTRIBUTION**"},{"metadata":{"trusted":true},"cell_type":"code","source":"mental_illness = df['signs_of_mental_illness'].value_counts().to_frame().reset_index()\nmental_illness.rename(columns={'index':'signs_of_mental_illness', 'signs_of_mental_illness':'count'}, inplace=True)\n\nfig = make_subplots(rows=1, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Mental Illness Count\", \"Mental Illness Percentages\"))\n\nfig.add_trace(go.Bar(x=mental_illness['signs_of_mental_illness'], \n y=mental_illness['count'],\n text=mental_illness['count'],\n textposition = 'auto',\n name='Mental Illness Count',\n opacity = 0.8, \n marker=dict(color=['#089ebf','#ad3131'], line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=mental_illness['signs_of_mental_illness'], \n values=mental_illness['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Mental Illness Percent\",\n marker = dict(colors = ['#089ebf','#ad3131'], line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":529,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **THREAT LEVEL DISTRIBUTION**"},{"metadata":{"trusted":true},"cell_type":"code","source":"threat = df['threat_level'].value_counts().to_frame().reset_index()\nthreat.rename(columns={'index':'threat_level', 'threat_level':'count'}, inplace=True)\n\nfig = make_subplots(rows=1, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Threat Level Count\", \"Threat Level Percentages\"))\n\nfig.add_trace(go.Bar(x=threat['threat_level'], \n y=threat['count'],\n text=threat['count'],\n textposition = 'auto',\n name='Threat Level Count',\n opacity = 0.8, \n marker=dict(color=['#ba2d2d','#2d97ba', '#5c663f'], line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=threat['threat_level'], \n values=threat['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Threat Level Percent\",\n marker = dict(colors = ['#ba2d2d','#2d97ba', '#5c663f'], line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":530,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **WAS OFFICER'S BODY CAMERA ON?**"},{"metadata":{"trusted":true},"cell_type":"code","source":"body_cam = df['body_camera'].value_counts().to_frame().reset_index()\nbody_cam.rename(columns={'index':'body_camera', 'body_camera':'count'}, inplace=True)\n\nfig = make_subplots(rows=1, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Body Camera Count\", \"Body Camera Percentages\"))\n\nfig.add_trace(go.Bar(x=body_cam['body_camera'], \n y=body_cam['count'],\n text=body_cam['count'],\n textposition = 'auto',\n name='Body Camera Count',\n opacity = 0.8, \n marker=dict(color=['#ad3131', '#089ebf'], line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=body_cam['body_camera'], \n values=body_cam['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Body Camera Percent\",\n marker = dict(colors = ['#ad3131', '#089ebf'], line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500,\n title_text=\"Was the Officer's Body Camera On?\",\n showlegend=True)\n\nfig.show()","execution_count":531,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **NUMBER OF KILLINGS PER STATE**"},{"metadata":{"trusted":true},"cell_type":"code","source":"#STATE WHERE SHOOTINGS TOOK PLACE\nstate_pop = population1.iloc[:1,2:52]\nstate_pop = state_pop.melt(var_name='state', value_name='population')\nstate_pop.sort_values(by='population', ascending=False, inplace=True)\n\nfig = go.Figure(go.Bar(x=state_pop['state'],\n y=state_pop['population'],\n text=state_pop['population'],\n textposition='outside', marker_color=state_pop['population']))\n\n\nfig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_layout(title_text='State Populations', yaxis_title='Population',\n xaxis_title='States', title_x=0.5, height=600)\n\nfig.show()","execution_count":532,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"#STATE WHERE SHOOTINGS TOOK PLACE\nstates = df['state'].value_counts().to_frame().reset_index()\nstates.rename(columns={'index':'state', 'state':'count'}, inplace=True)\n# states = states.sort_values(by='count', ascending=False)\nstates\n\n\nfig = go.Figure(go.Bar(x=states['state'].sort_index(ascending=True), \n y=states['count'].sort_index(ascending=True),\n text=states['count'].sort_index(ascending=True),\n textposition='outside', marker_color=states['count'].sort_index(ascending=True)))\n\n\nfig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_layout(title_text='Police Killings, Organized by States',yaxis_title='States',\n xaxis_title='Total number of victims', title_x=0.5, height=600)\n\nfig.show()","execution_count":533,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **OBSERVATIONS:**\n* Suprisingly, not all of the most populated states have the highest number of killings. "},{"metadata":{"trusted":true},"cell_type":"code","source":"#STATE WHERE SHOOTINGS TOOK PLACE\ncities = df['city'].value_counts().to_frame().reset_index()\ncities.rename(columns={'index':'city', 'city':'count'}, inplace=True)\n# states = states.sort_values(by='count', ascending=False)\ncities = cities[:25]\n\n\nfig = go.Figure(go.Bar(x=cities['city'].sort_index(ascending=True), \n y=cities['count'].sort_index(ascending=True),\n text=cities['count'].sort_index(ascending=True),\n textposition='outside', marker_color=cities['count'].sort_index(ascending=True)))\n\n\nfig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_layout(title_text='Police Killings, Organized by Cities',yaxis_title='Cities',\n xaxis_title='Total number of victims', title_x=0.5, height=600)\n\nfig.show()","execution_count":534,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"\n## **TIMEWISE DATA EXPLORATION**\n\nIn this section we'll get an idea of how the killings are distributed throughout the years, months, and days. We'll look at averages and totals to determine which years, months, and days have the most and least number of deaths. "},{"metadata":{},"cell_type":"markdown","source":"### **POLICE KILLINGS BY YEAR**"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_years = df['year'].value_counts().to_frame().reset_index()\ndf_years.rename(columns={'index':'year', 'year':'count'}, inplace=True)\ndf_years = df_years.sort_values(by='year')\n\nfig = go.Figure()\n\nfig.add_trace(go.Scatter(x=df_years['year'], \n y=df_years['count'], \n mode='lines+markers', \n marker_color=\"red\"))\n\nfig.update_layout(title_text='Police Killings by Year',\n xaxis_title='Years',\n yaxis_title='Total number of kills', \n title_x=0.5)\n\nfig.show()\n","execution_count":535,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **MONTHLY DEATHS BY YEAR**\n\nLet's visualize how many police killings occurred each month from 2015 to 2020"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_monthly = df['date'].groupby(df.date.dt.to_period(\"M\")).agg('count').to_frame(name=\"count\").reset_index()\ndf_monthly = df_monthly.sort_values(by='date')\n\nyear_month=[]\nfor i in df_monthly['date']:\n year_month.append(str(i))\n \ndf_monthly.head()","execution_count":536,"outputs":[{"output_type":"execute_result","execution_count":536,"data":{"text/plain":" date count\n0 2015-01 68\n1 2015-02 73\n2 2015-03 84\n3 2015-04 80\n4 2015-05 65","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
datecount
02015-0168
12015-0273
22015-0384
32015-0480
42015-0565
\n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = make_subplots(rows=2, cols=1, subplot_titles=(\"Monthly series\", \"Distribution of monthly count\"))\n\nfig.add_trace(go.Scatter(x=year_month, y=df_monthly['count'], \n name=\"Monthly Deaths\", mode='lines+markers'),row=1,col=1)\n\nfig.add_trace(go.Box(y=df_monthly['count'], name='Count',\n marker_color = 'indianred',boxmean='sd'),row=2,col=1)\n\nfig.update_xaxes(title_text=\"Year\", row=1, col=1,showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_xaxes(title_text=\" \", row=2, col=1,showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_yaxes(title_text=\"Number of Victims\", row=1, col=1,showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_yaxes(title_text=\"Number of Victims\", row=2, col=1,showline=True, linewidth=2, linecolor='black', mirror=True)\n\nfig.update_layout(title_text='Fatal Killing Monthly Count 2015 - 2019', title_x=0.5,showlegend=False,height=1000)\nfig.show()","execution_count":537,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **MONTHLY DEATHS ORGANIZED BY YEAR**\nFor a better comparison, let's visualize the number of killings each month for every year. "},{"metadata":{"trusted":true},"cell_type":"code","source":"df_monthly['year'] = df_monthly['date'].dt.strftime('%Y')\n\ndef plot_month(year, color):\n temp_month = []\n for i in df_monthly.loc[df_monthly['year']==year]['date']:\n temp_month.append(str(i))\n trace=go.Bar(x=temp_month, y=df_monthly.loc[df_monthly['year']==year]['count'], \n name=year, marker_color=color)\n return trace","execution_count":538,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = make_subplots(rows=3, cols=2, subplot_titles=('2015', '2016', '2017', '2018', '2019'))\n\nfig.add_trace(plot_month('2015', 'blue'), row=1, col=1)\nfig.add_trace(plot_month('2016', 'red'), row=1, col=2)\nfig.add_trace(plot_month('2017', 'green'), row=2, col=1)\nfig.add_trace(plot_month('2018', 'orange'), row=2, col=2)\nfig.add_trace(plot_month('2019', 'purple'), row=3, col=1)\n\nfig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_layout(title_text='Distribution of Monthly Killings by Year', title_x=0.5, showlegend=False)\nfig.show()","execution_count":539,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **MONTHS WITH THE HIGHEST AVERAGE KILLINGS**"},{"metadata":{"trusted":true},"cell_type":"code","source":"only_month = df.groupby(['year','month_name', 'month'])[['month_name']].count()\nonly_month.rename(columns={'month_name':'count'}, inplace=True)\nonly_month.reset_index(inplace=True)\nonly_month = only_month.groupby(['month_name', 'month'])[['count']].mean()\nonly_month.sort_values(by='month', inplace=True)\nonly_month = only_month.round(2)\nonly_month.reset_index(inplace=True)\n\nfig = go.Figure(data=[go.Bar(x=only_month['month_name'], \n y=only_month['count'], \n name='Months', \n marker_color='blue', \n text=only_month['count'],\n textposition='auto')])\n\nfig.update_xaxes(showline=True, linewidth=1, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=1, linecolor='black', mirror=True)\nfig.update_layout(title_text='Average Deaths - All Months', xaxis_title='Months',\n yaxis_title='Average Number of Killings', title_x=0.5,barmode='stack')\n\nfig.show()","execution_count":540,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **YEARS WITH MOST KILLINGS**"},{"metadata":{"trusted":true},"cell_type":"code","source":"year_count = df.groupby(['year'])[['id']].agg('count')\nyear_count.reset_index(inplace=True)\nyear_count.rename(columns={'id':'count'}, inplace=True)\n\nfig = go.Figure(data=[go.Bar(x=year_count['year'], \n y=year_count['count'], \n name='Years', \n marker_color='blue',\n text=year_count['count'],\n textposition='auto')])\n\nfig.update_xaxes(showline=True, linewidth=1, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=1, linecolor='black', mirror=True)\nfig.update_layout(title_text='Deaths - All Years',xaxis_title='Years',\n yaxis_title='Total number of kills', title_x=0.5,barmode='stack')\nfig.show()","execution_count":541,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **MOST KILLINGS BY DAY**"},{"metadata":{"trusted":true},"cell_type":"code","source":"weekday_count = df.groupby(['weekday'])[['id']].agg('count')\nweekday_count = weekday_count.reindex(['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'])\nweekday_count.reset_index(inplace=True)\nweekday_count.rename(columns={'id':'count'}, inplace=True)\n\nfig = go.Figure(data=[go.Bar(x=weekday_count['weekday'], \n y=weekday_count['count'],\n name='Weekdays', \n marker_color='blue',\n text=weekday_count['count'],\n textposition='auto')])\n\nfig.update_xaxes(showline=True, linewidth=1, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=1, linecolor='black', mirror=True)\nfig.update_layout(title_text='Deaths - Days of the Week',xaxis_title='Weekdays',\n yaxis_title='Total Number of Killings', title_x=0.5,barmode='stack')\nfig.show()","execution_count":542,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"\n## **BIVARIATE DATA EXPLORATION & VISUALIZATION**"},{"metadata":{},"cell_type":"markdown","source":"### RACE & WEAPON TYPE"},{"metadata":{"trusted":true},"cell_type":"code","source":"race_armed = df.loc[(df['armed'] == 'gun') | (df['armed'] == 'knife') | (df['armed'] == 'unarmed')]\nrace_armed = race_armed.groupby(['race','armed'])[['armed']].count()\nrace_armed.rename(columns={race_armed.columns[0] : 'count'}, inplace=True)\nrace_armed.reset_index(inplace=True)\nrace_armed.sort_values(by='count', ascending=False, inplace=True)","execution_count":543,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_gun = race_armed.loc[race_armed['armed'] == 'gun']\nrace_knife = race_armed.loc[race_armed['armed'] == 'knife']\nrace_unarmed = race_armed.loc[race_armed['armed'] == 'unarmed']\n\nfig = make_subplots(rows=3, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}], \n [{\"type\": \"xy\"}, {\"type\": \"domain\"}],\n [{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Gun Count\", \"Gun Percentages\",\n \"Knife Count\", \"Knife Percentages\",\n \"Unarmed Count\", 'Unarmed Percentages'))\n\ncolors=['#f299ac', '#1c1811', '#a3873b', '#f7ea72', '#c95742', '#3ba3a1']\n\n\nfig.add_trace(go.Bar(x=race_gun['race'], \n y=race_gun['count'],\n text=race_gun['count'],\n textposition = 'auto',\n name='Gun Count',\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Bar(x=race_knife['race'], \n y=race_knife['count'],\n text=race_knife['count'],\n textposition = 'auto',\n name='Knife Count',\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1))), row=2, col=1)\n\nfig.add_trace(go.Bar(x=race_unarmed['race'], \n y=race_unarmed['count'],\n text=race_unarmed['count'],\n textposition = 'auto',\n name='Unarmed Count',\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1))), row=3, col=1)\n\n\nfig.add_trace(go.Pie(labels=race_gun['race'], \n values=race_gun['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Gun Percent\",\n marker = dict(colors = colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.add_trace(go.Pie(labels=race_knife['race'], \n values=race_knife['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Knife Percent\",\n marker = dict(colors = colors, line = dict(width = 1.5))), \n row=2, col=2)\n\nfig.add_trace(go.Pie(labels=race_gun['race'], \n values=race_unarmed['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Unarmed Percent\",\n marker = dict(colors = colors, line = dict(width = 1.5))), \n row=3, col=2)\n\nfig.update_layout(height=1000, showlegend=True)\n\nfig.show()","execution_count":544,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **RACE AND AGE GROUP**"},{"metadata":{"trusted":true},"cell_type":"code","source":"pd.pivot_table(df, index = 'race', columns = 'age_range', values = 'id',aggfunc ='count')","execution_count":545,"outputs":[{"output_type":"execute_result","execution_count":545,"data":{"text/plain":"age_range 18-35 36-50 51-65 65+ <18\nrace \nAsian 36.0 25.0 13.0 NaN 2.0\nBlack 685.0 268.0 69.0 15.0 31.0\nHispanic 431.0 228.0 48.0 6.0 19.0\nNative 45.0 19.0 2.0 NaN 1.0\nOther 25.0 11.0 4.0 NaN NaN\nWhite 867.0 703.0 406.0 76.0 28.0","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
age_range18-3536-5051-6565+<18
race
Asian36.025.013.0NaN2.0
Black685.0268.069.015.031.0
Hispanic431.0228.048.06.019.0
Native45.019.02.0NaN1.0
Other25.011.04.0NaNNaN
White867.0703.0406.076.028.0
\n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_race_age = df.groupby(['race', 'age_range']).agg('count')['id'].to_frame('count').reset_index()\ndf_black = df_race_age.loc[df_race_age['race'] == 'Black']\ndf_white = df_race_age.loc[df_race_age['race'] == 'White']\ndf_hispanic = df_race_age.loc[df_race_age['race'] == 'Hispanic']\ndf_native = df_race_age.loc[df_race_age['race'] == 'Native']\ndf_asian = df_race_age.loc[df_race_age['race'] == 'Asian']\ndf_other = df_race_age.loc[df_race_age['race'] == 'Other']","execution_count":546,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"black = go.Bar(x = df_black['age_range'], y = df_black['count'], \n marker=dict(color='black'),name=\"black\")\n\nwhite = go.Bar(x=df_white['age_range'],y=df_white['count'],\n marker=dict(color='pink'),name=\"white\")\n\nhispanic = go.Bar(x=df_hispanic['age_range'],y=df_hispanic['count'],\n marker=dict(color='tan'),name=\"hispanic\")\n\nasian = go.Bar(x=df_asian['age_range'],y=df_asian['count'],\n marker=dict(color='yellow'),name=\"asian\")\n\nnative = go.Bar(x=df_native['age_range'],y=df_native['count'],\n marker=dict(color='red'),name=\"native\")\n\nother = go.Bar(x=df_other['age_range'],y=df_other['count'],\n marker=dict(color='teal'),name=\"other\")\n\ndata=[white,black,hispanic,asian,native,other]\n\nfig = go.Figure(data)\nfig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_layout(title=\"Race & Age Range\",title_x=0.5,xaxis=dict(title=\"Age Range\"),yaxis=dict(title=\"Number of Victims\"),\n barmode=\"group\")\nfig.show()","execution_count":547,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_age = df.loc[(df['age_range'] == '<18') | (df['age_range'] == '18-35') | (df['age_range'] == '36-50') | (df['age_range'] == '51-65') | (df['age_range'] == '65+') ]\nrace_age = race_age.groupby(['race','age_range'])[['age_range']].count()\nrace_age.rename(columns={race_age.columns[0] : 'count'}, inplace=True)\nrace_age.reset_index(inplace=True)\nrace_age.sort_values(by='count', ascending=False, inplace=True)\n\nrace_age1 = race_age.loc[race_age['age_range'] == '<18']\nrace_age2 = race_age.loc[race_age['age_range'] == '18-35']\nrace_age3 = race_age.loc[race_age['age_range'] == '36-50']\nrace_age4 = race_age.loc[race_age['age_range'] == '51-65']\nrace_age5 = race_age.loc[race_age['age_range'] == '65+']","execution_count":548,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = make_subplots(rows=2, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}], \n [{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"18-35 Count\", \"8-35 Percentages\",\n \"36-50 Count\", \"36-50 Percentages\"))\n\ncolors=['#f299ac', '#1c1811', '#a3873b', '#f7ea72', '#c95742', '#3ba3a1']\n\n\nfig.add_trace(go.Bar(x=race_age2['race'], \n y=race_age2['count'],\n text=race_age2['count'],\n textposition = 'auto',\n name='18-35 Count',\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Bar(x=race_age3['race'], \n y=race_age3['count'],\n text=race_age3['count'],\n textposition = 'auto',\n name='36-50 Count',\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1))), row=2, col=1)\n\nfig.add_trace(go.Pie(labels=race_age2['race'], \n values=race_age2['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"18-35 Percent\",\n marker = dict(colors = colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.add_trace(go.Pie(labels=race_age3['race'], \n values=race_age3['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"36-50 Percent\",\n marker = dict(colors = colors, line = dict(width = 1.5))), \n row=2, col=2)\n\nfig.update_layout(height=1000, showlegend=True)\n\nfig.show()","execution_count":549,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **RACE & GENDER**"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_race_gender = df.groupby(['race', 'gender']).agg('count')['id'].to_frame('count').reset_index()\n\ndf_black_gender = df_race_gender.loc[df_race_gender['race'] == 'Black']\ndf_black_gender = df_black_gender.sort_values(by='count', ascending=False)\n\ndf_white_gender = df_race_gender.loc[df_race_gender['race'] == 'White']\ndf_white_gender = df_white_gender.sort_values(by='count', ascending=False)\n\ndf_hispanic_gender = df_race_gender.loc[df_race_gender['race'] == 'Hispanic']\ndf_hispanic_gender = df_hispanic_gender.sort_values(by='count', ascending=False)\n\ndf_asian_gender = df_race_gender.loc[df_race_gender['race'] == 'Asian']\ndf_asian_gender = df_asian_gender.sort_values(by='count', ascending=False)\n\ndf_native_gender = df_race_gender.loc[df_race_gender['race'] == 'Native']\ndf_native_gender = df_native_gender.sort_values(by='count', ascending=False)\n\ndf_other_gender = df_race_gender.loc[df_race_gender['race'] == 'Other']\ndf_other_gender = df_other_gender.sort_values(by='count', ascending=False)","execution_count":550,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"black = go.Bar(x=df_black_gender['gender'], y=df_black_gender['count'], \n marker=dict(color='black'),name=\"black\", \n text=df_black_gender['count'], textposition='auto')\n\nwhite = go.Bar(x=df_white_gender['gender'], y=df_white_gender['count'], \n marker=dict(color='pink'),name=\"white\",\n text=df_white_gender['count'], textposition='auto')\n\nhispanic = go.Bar(x=df_hispanic_gender['gender'], y=df_hispanic_gender['count'], \n marker=dict(color='tan'),name=\"hispanic\",\n text=df_hispanic_gender['count'], textposition='auto')\n\nasian = go.Bar(x=df_asian_gender['gender'], y=df_asian_gender['count'], \n marker=dict(color='yellow'),name=\"asian\",\n text=df_asian_gender['count'], textposition='auto')\n\nnative = go.Bar(x=df_native_gender['gender'], y=df_native_gender['count'], \n marker=dict(color='red'),name=\"native\",\n text=df_native_gender['count'], textposition='auto')\n\nother = go.Bar(x=df_other_gender['gender'], y=df_other_gender['count'], \n marker=dict(color='teal'),name=\"other\",\n text=df_other_gender['count'], textposition='auto')\n\ndata=[white, black, hispanic, asian, native, other]\n\nfig = go.Figure(data)\nfig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_layout(title=\"Race & Gender\", \n title_x=0.5, \n xaxis=dict(title=\"Gender\"), \n yaxis=dict(title=\"Number of Victims\"),\n barmode=\"group\")\nfig.show()","execution_count":551,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **RACE & LOCATION**\n\nLet's take a look at the racial distribution of the 7 states with the most deaths.\n\nFirst lets create some plotting functions to vizualize data from the census and our original dataset."},{"metadata":{"trusted":true},"cell_type":"code","source":"def pop_plot(state):\n \n state_pop = population1[['Fact',state]][2:9]\n state_pop.sort_values(by=state, ascending=False, inplace=True)\n \n colors=['#3b76a3', '#3ba372', '#a3873b', '#a33b3b', '#863ba3', '#3ba3a1']\n\n# labels=['White', 'Black', 'Native', 'Asian', 'Hispanic']\n# values=population['California'][2:4]\n \n fig = go.Figure(data=(go.Bar(x=state_pop['Fact'], \n y=state_pop[state],\n text=state_pop[state],\n textposition = 'auto',\n name=('Percentage of Population'),\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1)))))\n \n fig.update_layout(height=500,\n yaxis_title=\"% of Total Population\",\n title_text=(state + ' Total Population: ' + df_population[state][0]),\n showlegend=False)\n fig.show()\n\n","execution_count":552,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"state_count = df['state'].value_counts().to_frame()[:10]\nstate_count.reset_index(inplace=True)\nstate_count.rename(columns={'index':'state', 'state':'count'}, inplace=True)\n\nrace_state = df.groupby(['race','state'])[['state']].count()\nrace_state.rename(columns={'state':'count'}, inplace=True)\nrace_state.reset_index(inplace=True)\nrace_state = race_state.loc[race_state['state'].isin(state_count['state'])]\nrace_state.sort_values(by='count', ascending=False, inplace=True)","execution_count":553,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def race_state_count(state):\n\n fig = make_subplots(rows=1, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]] ,\n subplot_titles=((state + \" Race Count\"), (state +\" Race Percentages\")))\n\n colors=['#3b76a3', '#3ba372', '#a3873b', '#a33b3b', '#863ba3', '#3ba3a1']\n\n fig.add_trace(go.Bar(x=race_state['race'].loc[race_state['state'] == state], \n y=race_state['count'].loc[race_state['state'] == state],\n text=race_state['count'].loc[race_state['state'] == state],\n textposition = 'auto',\n name=(state +' Race Count'),\n opacity = 0.8, \n marker=dict(color=colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\n fig.add_trace(go.Pie(labels=race_state['race'].loc[race_state['state'] == state], \n values=race_state['count'].loc[race_state['state'] == state],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = (state + \" Race Percent\"),\n marker = dict(colors = colors, line = dict(width = 1.5))), \n row=1, col=2)\n\n fig.update_layout(height=500, showlegend=True)\n\n fig.show()","execution_count":554,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### **CALIFORNIA**"},{"metadata":{"trusted":true},"cell_type":"code","source":"pop_plot('California')","execution_count":555,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_state_count('CA')","execution_count":556,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### OBSERVATIONS: \n* Although Hispanic/Latino people make up 39.4% of California's population, they are killed by police at a rate of 43.6%. \n* Black people are killed at a rate three times higher than their actual population number in California.\n* White people are killed at a rate less than half of their population number. "},{"metadata":{},"cell_type":"markdown","source":"### **TEXAS**"},{"metadata":{"trusted":true},"cell_type":"code","source":"pop_plot('Texas')","execution_count":557,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_state_count('TX')","execution_count":558,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **FLORIDA**"},{"metadata":{"trusted":true},"cell_type":"code","source":"pop_plot('Florida')","execution_count":559,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_state_count('FL')","execution_count":560,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **COLORADO**"},{"metadata":{"trusted":true},"cell_type":"code","source":"pop_plot('Colorado')","execution_count":561,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_state_count('CO')","execution_count":562,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **ARIZONA**"},{"metadata":{"trusted":true},"cell_type":"code","source":"pop_plot('Arizona')","execution_count":563,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_state_count('AZ')","execution_count":564,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **GEORGIA**"},{"metadata":{"trusted":true},"cell_type":"code","source":"pop_plot('Georgia')","execution_count":565,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_state_count('GA')","execution_count":566,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **OKLAHOMA**"},{"metadata":{"trusted":true},"cell_type":"code","source":"pop_plot('Oklahoma')","execution_count":567,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"race_state_count('OK')","execution_count":568,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **RACE AND MENTAL ILLNESS**"},{"metadata":{"trusted":true},"cell_type":"code","source":"race_mental = df.groupby(['race','signs_of_mental_illness']).agg('count')['id'].to_frame('count').reset_index()\n\nblack_mental = race_mental.loc[race_mental['race'] == 'Black']\nblack_mental = black_mental.sort_values(by='count', ascending=False)\n\nwhite_mental = race_mental.loc[race_mental['race'] == 'White']\nwhite_mental = white_mental.sort_values(by='count', ascending=False)\n\nhispanic_mental = race_mental.loc[race_mental['race'] == 'Hispanic']\nhispanic_mental = hispanic_mental.sort_values(by='count', ascending=False)\n\nasian_mental = race_mental.loc[race_mental['race'] == 'Asian']\nasian_mental = asian_mental.sort_values(by='count', ascending=False)\n\nnative_mental = race_mental.loc[race_mental['race'] == 'Native']\nnative_mental = native_mental.sort_values(by='count', ascending=False)\n\nother_mental = race_mental.loc[race_mental['race'] == 'Other']\nother_mental = other_mental.sort_values(by='count', ascending=False)","execution_count":569,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"black = go.Bar(x=black_mental['signs_of_mental_illness'], y=black_mental['count'],\n marker=dict(color='black'),name=\"black\")\n\nwhite = go.Bar(x=white_mental['signs_of_mental_illness'], y=white_mental['count'],\n marker=dict(color='pink'),name=\"white\")\n\nhispanic = go.Bar(x=hispanic_mental['signs_of_mental_illness'], y=hispanic_mental['count'],\n marker=dict(color='tan'),name=\"hispanic\")\n\nasian = go.Bar(x=asian_mental['signs_of_mental_illness'], y=asian_mental['count'],\n marker=dict(color='yellow'),name=\"asian\")\n\nnative = go.Bar(x=native_mental['signs_of_mental_illness'], y=native_mental['count'],\n marker=dict(color='red'),name=\"native\")\n\nother = go.Bar(x=other_mental['signs_of_mental_illness'], y=other_mental['count'],\n marker=dict(color='teal'),name=\"other\")\n\ndata = [white,black,hispanic,asian,native,other]\n\nfig = go.Figure(data)\nfig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\nfig.update_layout(title=\"Death Toll - Race & Mental Illness\", title_x=0.5,\n xaxis=dict(title=\"Signs of Mental Illness\"),\n yaxis=dict(title=\"Number of Victims\"),\n barmode=\"group\")\nfig.show()","execution_count":570,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### **RACE & THREAT LEVEL**"},{"metadata":{"trusted":true},"cell_type":"code","source":"threat_count = df['threat_level'].value_counts().to_frame()[:10]\nthreat_count.reset_index(inplace=True)\nthreat_count.rename(columns={'index':'threat_level', 'threat_level':'count'}, inplace=True)\n\nrace_threat = df.groupby(['race','threat_level'])[['threat_level']].count()\nrace_threat.rename(columns={'threat_level':'count'}, inplace=True)\nrace_threat.reset_index(inplace=True)\nrace_threat = race_threat.loc[race_threat['threat_level'].isin(threat_count['threat_level'])]\nrace_threat.sort_values(by='count', ascending=False, inplace=True)","execution_count":571,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"attack = race_threat.loc[race_threat['threat_level'] == 'attack']\nundetermined = race_threat.loc[race_threat['threat_level'] == 'undetermined']\nother = race_threat.loc[race_threat['threat_level'] == 'other']\n\nfig = make_subplots(rows=3, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}], \n [{\"type\": \"xy\"}, {\"type\": \"domain\"}],\n [{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Attack Count\", \"Attack Percentages\",\n \"Other Count\", \"Other Percentages\",\n \"Undetermined Count\", 'Undetermined Percentages'))\n\nbar_colors=['#3b76a3', '#3ba372', '#a3873b', '#a33b3b', '#863ba3', '#3ba3a1']\npie_colors=['#3b76a3', '#3ba372', '#a3873b', '#a33b3b', '#863ba3', '#3ba3a1']\n\nfig.add_trace(go.Bar(x=attack['race'], \n y=attack['count'],\n text=attack['count'],\n textposition = 'auto',\n name='Attack Count',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Bar(x=undetermined['race'], \n y=undetermined['count'],\n text=undetermined['count'],\n textposition = 'auto',\n name='Undetermined Count',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=2, col=1)\n\nfig.add_trace(go.Bar(x=other['race'], \n y=other['count'],\n text=other['count'],\n textposition = 'auto',\n name='Unarmed Count',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=3, col=1)\n\n\nfig.add_trace(go.Pie(labels=attack['race'], \n values=attack['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Attack Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.add_trace(go.Pie(labels=undetermined['race'], \n values=undetermined['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Undetermined Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=2, col=2)\n\nfig.add_trace(go.Pie(labels=other['race'], \n values=other['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Other Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=3, col=2)\n\nfig.update_layout(height=1000, showlegend=True)\n\nfig.show()","execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/html":"
\n \n \n
\n \n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"# VI. CONCLUSION"},{"metadata":{},"cell_type":"markdown","source":"I consider the above analysis to be only partially complete as there are many other aspects of the data to explore. But it is certainly a good start! I will continue to revisit the data and create new visualizations to gain further insight into the data.\n\nThe data set does not include population information, so the numbers of killings by race does not reflect any disparities or biases that may be present. However, census data reveals that Black and Hispanic people make up about 13% & 16% of the United States population respectively and White people make up about 70%; each are killed disproportionately to their population. Of the people listed in the data set, 51% are White, 26% are Black (twice the population!) and 18% are Hispanic.\n\nIt would also be very interesting to have knowledge of the economic status of each of the victims, although that is far outside the scope of this dataset. \n\nThanks for stopping by!"}],"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.7.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":4}