专栏名称: 表哥有话讲
国内最大的R语言专业学习平台| R官方认证学习实践社区--校企实践交流、名企内推和成果分享,立即关注-掌握R语言全球最新资讯与成果!
目录
相关文章推荐
不正常人类研究中心  ·  考场变操场,智慧与体能的双重考验! ·  3 天前  
不正常人类研究中心  ·  周三真的不能让我们休息一天吗? ·  3 天前  
51好读  ›  专栏  ›  表哥有话讲

Kaggle案例~R可视化分析美国枪击案(附数据集和代码)

表哥有话讲  · 公众号  ·  · 2017-10-25 11:50

正文


作者:邬书豪,车联网数据挖掘工程师 ,R语言中文社区专栏作者。微信ID:wsh137552775

知乎专栏:https://www.zhihu.com/people/wu-shu-hao-67/activities


数据集:自1966~2017年发生在美国的大规模枪击案(死伤人数在三人以上的枪击案)

一、探索数据

#加载此次所要用到的包
library(lubridate)#日期处理
library(data.table)#更改数据框的格式,使之更为易用
library(dplyr)#包含诸多常用函数
library(ggplot2)#绘图
library(stringr)#对文本进行处理
library(tidyr)#对数据分类汇总
library(ggmap)#进行地图绘制
#设置工作路径
setwd("D:/US Mass Shootings")
#导入数据
shoot 
shoot数据集中共有398行,13个变量
  • ID:各案件编号

  • Title:案件名称

  • Location:案件发生所在的州

  • Date:案件发生日期,时间跨度:1966-08-01 ~ 2017-10-01

  • Summary:对案件的概述,如枪手名字,年龄,事件经过等

  • Fatalities:该次案件中死亡人数

  • Injured:该次案件中受伤人数

  • Total:该次案件中总计伤亡人数

  • Mental:枪手是否有精神问题

  • Race:枪手的种族/肤色,有White、Black、Asian等等

  • Gender:枪手性别

  • Latitude:纬度

  • Longitude经度

二、数据整理

由于第一条关于Las vegas枪击案不完善,据最近新闻报道对其进行修改补充

shoot$Injured[shoot$ID==1] 

数据集(Gender、Mental、Race)变量下的观测值命名较为混乱,咱们将它修补统一哈!

shoot$Gender[shoot$Gender=="M"] 

通过浏览对比发现一部分事件存在重复,即Summary不同但所描述事件过程基本一样,经纬度及伤亡人数上区别很小,可能是数据集录入之初产生的错误,故去重!

shoot

三、数据可视化分析

按年份、月份、性别以及精神问题进行可视化分析!

shoot$Date 
按照年份统计枪击频率

枪击案发生频率连年递增,尤其近几年来显著增多

#按照月份统计枪击频率
hist(month(shoot$Date),xlab="Month",ylab="Count",main="the distribution of month")

发生在一月份的枪击案的频率较其它月份相对显著

按照月份统计枪击频率
#将plot()函数绘制的四幅图形组合在一个大的1×2的图中,按照性别及种族统计枪击频率
par(mfrow=c(1,2))
barplot(table(shoot$Gender),xlab = "Gender",ylab="Count",main="the distribution of Gender")
barplot(table(shoot$Mental),xlab = "Mental Health Issue",ylab="Count",main="the distribution of mental")
按照性别及种族统计枪击频率
  • 绝大多数枪手都是男性

  • 在已知的枪手中,过半数人有精神问题

#增加一个Level变量,按照死伤人数多少对案件划分严重程度。
shoot$Level =5 & shoot$Total<=10] 10] 

统计各Level的频次

本数据集只包含死伤三人及以上的数据集,5至10人发生频次较高。然而论死伤总人数,超过10人死伤的案件虽然只占总体案件的约20%,然而累计死伤人数却占了近60%。

#精神问题与伤亡,subset()函数抽取出已知枪手精神问题的部分
mental

从前两个与第三个箱线图的比较来看,被杀死的受害者中,明显被有精神问题杀害的人居多!

#先用tapply()函数计算被是否患有精神问题的枪手导致的伤亡累计,然后绘图!
barplot(tapply(mental$Total,mental$Mental,sum),main="Shooter with mental health issue",col = "lightblue",ylab = "No. of Casualties")

有精神问题的枪手导致的伤亡甚至占到了三分之二。

#分析枪手所属种族所占比例
shooter 

shooter

枪手里面,白人以及黑人占绝大多数!!而亚裔枪手只占一小丢丢!

#cut()函数将变量year按值域切割为多个区间,赋值为新变量yearcut,对年份进行分段
shoot$yearcut 

随年份的改变枪手种族比例的变化

在2012年以前枪手主要是白人,最近5年来黑人以及其它族裔的种族枪手所占比例提升较大!

#年份与死伤人数统计
shoot_year2% summarise(Sum=sum(victim))
ggplot(shoot_year2,aes(yearcut,Sum,fill=type))+geom_bar(stat="identity",position = "dodge")

年份与死伤人数统计

在2012年以前,死亡人数一直保持在与受伤人数相差无几的状态下,而2012年以后受伤人群-大幅增加!~~~~~其主要原因在于2017-10-01日发生的拉斯维加斯露天音乐会枪击案!!!!~~~~死59人,伤527人,实乃美国枪击案件之最也!!!

~~~~看到这幅图,我们无比震惊!!!仿佛可以听到拉斯维加斯露天音乐会枪击案现场“哒哒哒哒哒哒哒哒哒哒哒哒”的子弹声!!!

#各年份中各Level所占比例
ggplot(shoot,aes(yearcut,fill=Level))+geom_bar(position = "fill")+ggtitle("How year impact Level")

各年份中各Level所占比例

综上~虽然近5年来死伤人数远超以往!!

但超过10人死伤的严重枪击案反而只占很小一部分,更反映出小规模枪击案的频繁!

#从文本概述中运用正则表达式抽取出年龄
tem % select(ID,age) %>% mutate(agecut=cut(te$age,breaks = 10*(1:7))) #将年龄分段
shoot_age 

年龄分布
已知年龄的枪手中,50岁以下占主要比例,青年与中年人的比例不相上下!
#绘制出各年龄段中是否有精神问题的比例
ggplot(shoot_age,aes(agecut,fill=Mental))+geom_bar(position = "fill")+ggtitle("The relationship between Age and Mental")

各年龄段中是否有精神问题的比例

已知年龄的犯罪分子中,有精神问题者居多,其中30岁至40岁的人比例略大一些!

#年龄与种族的关系
ggplot(shoot_age,aes(agecut,fill=Race))+geom_bar(position="fill")+ggtitle("the relationhship between Age and Race")

在20岁以下及50岁以上,白人占比都超过六成;黑人枪手则主要集中于20岁至50岁的年龄段



ggplot2包它精致唯美博大精深,万言不如一图!

掌握ggplot2包可视化技巧对于数据分析至关重要!

就像一门顶尖 的厨师,它的厨艺技能绝对不是看来跟师傅看来的,而是十年如一日的孜孜不倦的练习!学习ggplot2可视化也一样,需要孜孜不倦的对大量数据集进行练习!


公众号后台回复“枪击”获取数据集下载链接。


公众号后台回复关键字即可学习

回复 R              R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门