初学者,代码较乱,还请见谅。所有数据均来自网络上已发布。
芝加哥犯罪数据与天气数据分析
提交方式:Jupyter notebook .ipynb文件 或.py文件 或 Word/PDF报告 QQ/微信/邮箱: lixiang@xjtu.edu.cn 命名规则:
分析2001-2014年间芝加哥天气与犯罪数据,提示:
1. 分析天气与犯罪数据各自的统计信息
2. 针对天气与犯罪数据分别画出随时间波动的曲线图 (以年、月、日或每小时为度量)
3. 分析犯罪与天气数据的相关性 (不同温度下的犯罪数量、不同湿度下的犯罪信息等)
4. 分析形式不限,数据挖掘角度不限,信息提取方式不限
5. 给出程序代码及相应输出值、结果图,配有简单描
一.最终结果图:
下面是结果图的展示:
其次是犯人的家庭情况与是否被捕的情况,可以看出:伤人犯与杀人犯都有大部分未逮捕, 由此可见该市公共管理与治安非常不到位,但是杀人犯被逮捕的比率远大于伤人犯。其次, 犯人大部分都没有家庭。
此题我们统计了温度等天气情况在 2013 年随事件的变化:
以下是各种犯人在 2001-2014 年之 间数量的变化情况,在 2014 年处我们发现有很大的突变,推测有可能是数据并没有统计到 2014 年末尾,但是从前几年的数据来看,可以发现在 04 年犯罪数量有较为明显的下降,可 以推测有可能是城市治安能力有所提升。
在本题我只统计了 2013 年的杀人案件的相关情况(由于伤人案件 assault 数据太多了,电脑 算不了了,代码也没有优化),在下面第一个画布中,图一是有关于温度的,可以看出,在 20-30 华氏度(-6.7-负 1.1 摄氏度)与 70-80 华氏度(21-27 摄氏度)两种情况下,以及湿 度未 80%情况下,杀人案件发生较多,可多加防范。
在画布 2 中显示的是在特殊天气(雨雪,冰雹等)情况下,平均每天发生案件数量,明显看 出,在特殊天气下,发生杀人案件概率较大,治安部门应多加防范。
二.代码
#-*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
wt = pd.read_csv(r'C:\Users\15645\Desktop\西交\python\芝加哥数据\weather.csv')#weather天气
md = pd.read_csv(r'C:\Users\15645\Desktop\西交\python\芝加哥数据\murder.csv')#谋杀案件
aut =pd.read_csv(r'C:\Users\15645\Desktop\西交\python\芝加哥数据\assault.csv')#伤人案件
pd.set_option('display.max_columns', 100)#显示最大列数
pd.set_option('display.width', 500) # 设置打印宽度(**重要**)
wt.rename(columns={'Unnamed: 0':'Time'},inplace=True)
wt['Time'] = pd.to_datetime(wt['Time'])
# print(wt.info())
# print("\n")
# print(md.head())
# print("\n")
# print(aut.head())
# print("\n")
#第二题,查看2013年内从年初到年尾各种天气数据随到年初的时间变化曲线
wt2013 = wt[wt['Time'].dt.year==2013]#dt是pandas一个库
# 将数据提取出作为坐标,将数值转化为int型,datetime类型转化为string类型
day = wt2013
Temp = day['Mean TemperatureF']
Dew = day['MeanDew PointF']
Vis = day[' Mean VisibilityMiles']
cloud = day[' CloudCover']
# date = np.array(day['Time'].astype(str))
fig11 = plt.figure()
pic1 = fig11.add_subplot()
pic1.plot(range(1,366), Temp, label ='温度')
pic1.plot(range(1,366), Dew,'r', label ='露点')
pic1.plot(range(1,366), Vis,'g', label ='能见度')
pic1.plot(range(1,366), cloud,'y' , label ='云量')
pic1.set_title('各种天气数据在2013.1.1-2013.12.31之间的变化情况')
pic1.set_xlabel('1.1-12.30')
pic1.grid()
pic1.legend()
#print(wt.duplicated().sum())
# a = (wt['Mean TemperatureF']-wt['Mean TemperatureF'].mean())/wt['Mean TemperatureF'].std()
#print(wt[a.abs()>3].index)
print("\n")
#第一题
#案件的大概情况,比如犯人的自身情况,以及各种案件在芝加哥的位置分布
fig0 = plt.figure()#画布1
data1 = aut[aut['Arrest']==True].shape[0]/aut.shape[0]
ax3 = fig0.add_subplot(221)
ax3.pie(x=[1-data1,data1],labels=[ 'No', 'Yes'], autopct='%.2f%%',explode=(0, 0.1))
ax3.set_title('伤人犯是否被逮捕')
data2 = aut[aut['Domestic']==True].shape[0]/aut.shape[0]
ax4 = fig0.add_subplot(222)
ax4.pie(x=[data2,1-data2],labels=['Yes', 'No'], autopct='%.2f%%',explode=(0.1, 0))
ax4.set_title('伤人犯是否有家庭')
data3 = md[md['Arrest']==True].shape[0]/md.shape[0]
ax5 = fig0.add_subplot(223)
ax5.pie(x=[1-data3,data3],labels=[ 'No', 'Yes'], autopct='%.2f%%',explode=(0, 0.1))
ax5.set_title('杀人犯是否被逮捕')
data4 = md[md['Domestic']==True].shape[0]/md.shape[0]
ax6 = fig0.add_subplot(224)
ax6.pie(x=[data4,1-data4],labels=['Yes', 'No'], autopct='%.2f%%',explode=(0.1, 0))
ax6.set_title('杀人犯是否有家庭')
fig = plt.figure(figsize=(5, 8.5))#画布2
ax1=fig.add_subplot(211)
ax2 = fig.add_subplot(212)
ax1.scatter(aut['Longitude'], aut['Latitude'], s = 1, c = 'r', alpha=0.7 )
ax2.scatter(md['Longitude'], md['Latitude'], s = 2, alpha=0.7)
ax1.set_title('伤人案件分布')
ax2.set_title('杀人案件分布')
list1=[]
for i in range(2001,2015):
num = md[md['Year'] == i].shape[0]
list1.append(num)
fig1 = plt.figure(figsize=(6,9))
ax7 = fig1.add_subplot(211)
x1 = range(2001,2015)
ax7.bar(x=x1, height=list1, color='orchid')#柱状图
ax7.set_title('01-14年杀人犯数量')
ax7.set_ylabel('数量/个')
ax7.set_xlabel('年份')
#第二题,案件数量随时间变化情况
list2 = []
for i in range(2001, 2015):
num1 = aut[aut['Year'] == i].shape[0]
list2.append(num1)
ax8 = fig1.add_subplot(212)
ax8.bar(x=x1, height=list2,color='teal') # 柱状图
ax8.set_title('01-14年伤人犯数量')
ax8.set_ylabel('数量/个')
ax8.set_xlabel('年份')
# print(wt.shape)
time = wt[wt.iloc[:,-2].notnull()==True]['Time']
# print(time)
# print('\n')
#第三题,只画出了温度与湿度对杀人案件数量的影响分布
md2013 = md[md['Year']==2013]
md2013 = md2013.sort_values('Updated On')
# print(md2013.head())
# print(wt2013.head())
# print('\n')
md2013['Updated On'] = pd.to_datetime(md2013['Updated On'])
# print(md2013['Updated On'].dt.day.values[0])
md2013['温度']=0
md2013['平均湿度']=0
md2013['事件']='a'
for k in range(0,wt2013.shape[0]):
if wt2013['Events'].values[k] is np.nan:
wt2013['Events'].values[k]=0
for i in range(0,md2013.shape[0]):
mdday = md2013['Updated On'].dt.day.values[i]
mdmonth = md2013['Updated On'].dt.month.values[i]
for j in range(0,wt2013.shape[0]):
wtday = wt2013['Time'].dt.day.values[j]
wtmonth = wt2013['Time'].dt.month.values[j]
if mdday==wtday and mdmonth==wtmonth:
md2013['温度'].values[i] = wt2013['Mean TemperatureF'].values[j]
md2013['平均湿度'].values[i] = wt2013[' Mean Humidity'].values[j]
md2013['事件'].values[i] = wt2013['Events'].values[j]
break
# print(md2013['平均湿度'].max())
# print(md2013['平均湿度'].min())
list=[0]
list1=[0]
for i in range(1,10):
list.append(md2013[md2013['温度']<=10*i].shape[0])
for i in range(4,11):
list1.append(md2013[md2013['平均湿度']<=10*i].shape[0])
m = np.array(list)
mm = m[1:]-m[:-1]
a = np.linspace(10,90,9)
m1 = np.array(list1)
mm1 = m1[1:]-m1[:-1]
a1 = np.linspace(40,100,7)
# print(mm1)
event = md2013[md2013['事件']!=0].shape[0]#在特殊天气作案的总人数
evday = wt2013[wt2013['Events']!=0].shape[0]#特殊天气天数
Noevent = md2013.shape[0]-event
Noevday = wt2013.shape[0]-evday
Yp1 = event/evday
Np1 = Noevent/Noevday
# print(evday)
# print(event)
fig12 = plt.figure(figsize=(5.5,8.5))
pic2 = fig12.add_subplot(211)
pic2.bar(x=a, height=mm, width=5, color='r',edgecolor='b')
pic2.set_title('2013年不同温度下杀人案件数量')
pic2.set_xlabel('华氏度/F')
pic2.set_ylabel('数量/个')
pic3 = fig12.add_subplot(212)
pic3.bar(x=a1,height=mm1,width=5,color='g',edgecolor='k')
pic3.set_title('2013年不同湿度下杀人案件数量')
pic3.set_xlabel('湿度')
pic3.set_ylabel('数量/个')
fig13 = plt.figure()
pic4 =fig13.add_subplot()
pic4.bar(x=['正常天气','特殊天气'],height=[Np1,Yp1],width=0.5,color=['teal','r'])
pic4.set_title('2013年在是否是特殊天气(下雨,雪)的情况下,平均每天发生杀人案件的数量')
# print(md2013.head())
plt.show()#显示