一、研究背景
旧金山是一个人口稠密、旅游业发达的城市,同时也是美国犯罪率较高的城市之一。随着城市的不断发展,犯罪行为的类型和频率也在不断变化,这对城市的治安管理和社会稳定构成了巨大的挑战。近年来,数据科学技术的迅猛发展为犯罪行为的预测和预防提供了新的思路和工具。通过对大量历史犯罪数据的分析,可以发现潜在的犯罪模式和趋势,从而为警察部门和相关决策机构提供有价值的参考。旧金山犯罪分类研究的目标是利用机器学习和数据挖掘技术,对犯罪数据进行系统的分析和分类,以期能够更准确地预测未来的犯罪行为,并制定更有效的防范措施。
二、研究意义
-
社会治安管理:通过对旧金山犯罪数据的深入分析,可以帮助警察部门更好地理解犯罪行为的分布和特点,从而优化警力配置,提高犯罪预防和打击的效率。
-
公共安全保障:准确的犯罪预测可以为居民和游客提供更安全的生活和旅游环境,增强公众的安全感和幸福感。
-
数据科学应用:该研究是数据科学在社会治理领域的一次重要尝试,能够展示机器学习和数据挖掘技术在实际应用中的巨大潜力,并为其他城市的犯罪预防提供借鉴和参考。
-
政策制定支持:通过对犯罪数据的分析,可以为政府和相关决策机构提供数据支持,帮助其制定更加科学和合理的治安管理政策。
三、实证分析
首先导入包 读取数据集
代码和数据
#imports
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time as systime
import datetime as dt
import string
import seaborn as sns
import matplotlib.colors as colors
%matplotlib inline
train=pd.read_csv('train.csv')
test=pd.read_csv('test.csv')
查看数据集类型
查看数据集的形状和具体的前4行
查看其缺失情况
train.isnull().sum()
发现不存在缺失值
通过groupby().size()方法返回分组后的统计结果
cate_group = train.groupby(by='Category').size()
cate_group
分析一下目标分类共有多少种类型
cat_num = len(cate_group.index)
cat_num
还挺多
接下来可视化特征
cate_group.index = cate_group.index.map(string.capwords)
cate_group.sort_values(ascending=False,inplace=True)
cate_group.plot(kind='bar',logy=True,figsize=(15,10),color=sns.color_palette('coolwarm',cat_num))
plt.title('No. of Crime types',fontsize=20)
plt.show()
接下来查看各区犯罪率
dis_group.index = dis_group.index.map(string.capwords)
dis_group.sort_values(ascending=True,inplace=True)
dis_group.plot(kind='barh',figsize=(15,10),fontsize=10,color=sns.color_palette('coolwarm',10))
plt.title('Frequncy. of crimes by district',fontsize=20)
plt.show()
接下来将犯罪情况用时间来分别展示
plt.figure(figsize=(8,19))year_group = train.groupby('year').size()
plt.subplot(311)
plt.plot(year_group.index[:-1],year_group[:-1],'ks-')
plt.xlabel('year')month_group = train.groupby('month').size()
plt.subplot(312)
plt.plot(month_group,'ks-')
plt.xlabel('month')day_group = train.groupby('day').size()
plt.subplot(313)
plt.plot(day_group,'ks-')
plt.xlabel('day')plt.show()
接下来展示每周的犯罪情况
week_group.T.plot(figsize=(12,8))#行列互换后画图
plt.xlabel('hour of day',size=15)
plt.ylabel('Number of crimes',size=15)
plt.show()
接下来查看犯罪种类
tmp = train[train['Category'].map(string.capwords).isin(top6)]
tmp_group = tmp.groupby(['Category','hour']).size()
tmp_group = tmp_group.unstack()
tmp_group.T.plot(figsize=(12,6),style='o-')
plt.show()
接下来对测试集的Dates做同样的处理
test['date'] = pd.to_datetime(test['Dates'])
test['year'] = test.date.dt.year
test['month'] = test.date.dt.month
test['day'] = test.date.dt.day
test['hour'] = test.date.dt.hour
test.info()
准备开始机器学习
#加入所有特征
training,valid,y_train,y_valid = train_test_split(full[:train.shape[0]],target,train_size=0.7,random_state=0)
分别使用三种机器学习模型
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss
from sklearn.naive_bayes import BernoulliNB
import time
LR = LogisticRegression(C=0.1)
lrstart = time.time()
LR.fit(training, y_train)
lrcost_time = time.time()-lrstart
predicted = np.array(LR.predict_proba(valid))
print("逻辑回归log损失为 %f" %(log_loss(y_valid, predicted)))
print('逻辑回归建模耗时 %f 秒' %(lrcost_time))
params = [12, 13, 14, 15, 16]
clf = RandomForestClassifier(n_estimators=30)start_time = time.time()for par in params:clf.set_params(max_depth=par)clf.fit(training, y_train)predicted = clf.predict_proba(valid)loss = log_loss(y_valid, predicted)print("随机森林 log 损失为 %.4f" % loss)
NB = BernoulliNB()
nbstart = time.time()
NB.fit(training,y_train)
nbcost_time = time.time()-nbstart
predicted = np.array(NB.predict_proba(valid))
四、结论
本研究通过对旧金山的犯罪数据进行分析和分类,展示了数据科学技术在犯罪预防和社会治理中的应用潜力。研究结果表明,犯罪行为具有一定的时空分布规律,可以通过历史数据进行有效预测。这不仅为警察部门的日常工作提供了有力支持,也为公众安全提供了保障。此外,该研究还进一步证明了数据科学在解决实际问题中的重要作用和广泛前景。未来,随着技术的不断进步和数据的进一步积累,犯罪预测的精度和实用性将会不断提高,从而为建设更加安全和谐的社会贡献力量