• No results found

6.4 Diskussion

6.4.1 Problem

Problem som uppstod under projektets gång var bland annat vid installationen av RMySQL biblioteket till R, då det var skillnader i programvaruversionen som den utvecklats i och som projektet använde sig av. Problemet löstes med hjälp av en global variabel i operativsystemet Windows8 som pekade på var MySQL servern var installerad på hårddisken. Ett annat problem som uppkom under projektets gång var att komma fram till vad metoderna skulle jämföras med, vad som var den faktiska fördelningen av inbrott, då det vid kort-tids analys inte fanns tillräckligt med brott som hade exakta tidpunkter för tillslag.

Slutsatser och framtida arbete

Slutsatsen som kan dras utifrån utvecklingen av de R-skript som genom tre exper-iment utvärderats, är att den lämpligaste metoden att använda för att analysera temporal data av bostadsinbrott var den Aoristiska-metoden. Brist på antal brott med ett spann på mindre än 30 minuter ledde till att experiment 1 inte gav något tillförlitligt resultat. I framtida arbeten inom temporal analys och framtagandet av metoder nns stor möjlighet för Polisen och forskare att med hjälp av ny data ta fram trender och fördela resurser baserat på dessa.

References

[1] Brottsförebyggande Rådet. Anmälda brott. [Online]. Tillgänglig: https://bra.se/ 2014-01-31.

[2] Polisen. Bostadsinbrott  Lagar och fakta. [Online]. Tillgänglig:

http://polisen.se/Lagar-och-regler/Om-olika-brott/Stold-och-grov-stold/Bostadsinbrott/ 2013-06-27.

[3] Polisen. Ny polisorganisation 2015. [Online]. Tillgänglig: http://polisen.se/Om-polisen/Organisation/Ny-polisorganisation-2015/ 2013-04-16

[4] A. Borg, M. Boldt, N. Lavesson, U. Melander, V. Boeva. Detecting serial residential burglaries using clustering. Elsevier Ltd. 2014.

[5] Jerry H. Ratclie och Michael J. McCullagh. Aoristic Crime Analysis. In-ternetational Journal of Geographical Information Science. 1998.

[6] Rachel B. Santos. Crime Analysis with Crime Mapping, 3 Edition. Sage publications. 2013.

[7] K. Pearson. On the criterion that a given system of deviations from the probable in the case of a correlated system of variables is such that it can be reasonably supposed to have arisen from random sampling. Phil. Mag. (5)50, 157-175. 1900. Reprinted in K. Pearson (1956), pp. 339-357.

[8] Sam K. Kachigan Statistical Analysis: An Interdisciplinary Introduction to Univariate & Multivariate Methods Radius Pr. 1986.

Diagram

Figure A.1: Resultat experiment 1, start-metoden.

Appendix A. Diagram 28

Figure A.2: Resultat experiment 1, slut-metoden.

Figure A.4: Resultat experiment 1, slump-metoden.

Appendix A. Diagram 30

Figure A.6: Resultat experiment 1, delmängd 4 (exakt tid).

Figure A.8: Resultat experiment 2, slut-metoden.

Appendix A. Diagram 32

Figure A.10: Resultat experiment 2, slump-metoden.

Figure A.12: Resultat experiment 2, delmängd 3 (exakt tid).

Appendix A. Diagram 34

Figure A.14: Resultat experiment 3, slut-metoden.

Figure A.16: Resultat experiment 3, slump-metoden.

Appendix A. Diagram 36

Script

B.1 Experiment 1

# Autor : O l l e Svenhag , Student & Martin Boldt , PhD

# Date : 2014−04−20

# E−mail : O l l e . Svenhag@hotmail . com

# A f f i l i a t i o n : Blekinge I n s t i t u t e of Technology , Sweden # Required l i b r a r i e s library (RMySQL) library ( l u b r i d a t e ) library ( ggplot2 ) library ( c i r c u l a r ) #Bin s i z e unit = 1800 ########################## CIRCULAR OBJECT ##########################

# p l o t a v e c t o r of 48 b ins r e p r e s e n t i n g every f u l l and h a l f hours bwteen 00:00 − 23:59

c i r c u l a r . cime . plot <− function (p , plot . bins =48, plot . bw =30, plot . axis=seq (0 , 23 , by=1) , plot . t i t l e=NULL, zero =0) {

# make a c i r c u l a r c l a s s o b j e c t : using n a t i v e degrees and clock24 template t h a t s e t s zero and d i r e c t i o n

c i r c . p <− c i r c u l a r (p , u n i t s=' hours ' , template=" clock24 " , r o t a t i o n=c ( " c l o c k " ) )

mean. p <− mean( c i r c . p)

# compute mean arrow l e n g t h rho . p <− rho . c i r c u l a r ( c i r c . p) # setup custom a x i s

Appendix B. Script 38 axis . p <− c i r c u l a r ( plot . axis , u n i t s=' hour ' , template="

clock24 " )

# p l o t c i r c u l a r histogram

plot ( c i r c . p , axes=FALSE, stack=TRUE, bins=plot . bins , shrink =2, cex =1.3 , sep =0.024 , pch=21, col =1, bg='Red ' )

# paint d e n s i t y where bw i s the smoothness

lines ( density ( c i r c . p , bw=plot . bw) , col=' Black ' , l t y =2) # draw axes

axis . c i r c u l a r ( at=(axis . p) , labels=axis . p , cex =0.6) # draw arrow showing mean d i r e c t i o n and confidence

arrows . c i r c u l a r (mean. p , shrink=rho . p , length =0.15 , col=' Red ' )

# draw the t i t l e in histogram

text (0 , −0.25 , plot . t i t l e , cex =1, font =2.5) }

########################## FUNCTIONS ##########################

get . bin . number <− function ( p . in ) {

#p r i n t ( paste ( "[" , p . in , " , " , abs ( p . in − f l o o r ( p . in ) ) , "]" , sep ="") ) i f ( abs ( p . in − floor ( p . in ) ) >= 0.5 ) { r e s u l t = 1 + floor ( p . in ) * 2 } else { r e s u l t = floor ( p . in ) * 2 } i f ( p . in > 48 ) {

print ( paste ( "Bin number l a r g e r than 48 ( " , p . in , " ) . Aborting . " ) ) } r e s u l t=r e s u l t +1 return ( r e s u l t ) } c a l c u l a t e . a o r i s i c . f r a c t i o n s <− function ( p . s t a r t b i n , p . endbin ) {

i f (p . s t a r t b i n != p . endbin && p . endbin == 0 ) { r e s = 1

} else i f ( p . s t a r t b i n == p . endbin ) { r e s = 1 } else i f ( p . s t a r t b i n > p . endbin ) { bincount = ( 48 − p . s t a r t b i n + 1) + ( p . endbin ) r e s = 1 / bincount } else { r e s = 1 / (p . endbin − p . s t a r t b i n + 1) } return ( r e s ) } a s s i g n . a o r i s i c . f r a c t i o n s <− function ( a o r i s t i c . array , p . s t a r t b i n , p . endbin , a o r i s t i c . f r a c t i o n ) { i f ( p . s t a r t b i n > p . endbin ) { # p r i n t ( paste ( "=>s t a r t b i n =", p . s t a r t b i n , " : endbin =", p . endbin , " : a o r i s t i c . f r a c t i o n =", a o r i s t i c . f r a c t i o n , sep="" ) ) } else { #p r i n t ( paste ( " s t a r t b i n =", p . s t a r t b i n , " : endbin =", p . endbin , " : a o r i s t i c . f r a c t i o n =", a o r i s t i c . f r a c t i o n , sep="" ) )

a o r i s t i c . array [ p . s t a r t b i n : p . endbin ] = a o r i s t i c . array [ p . s t a r t b i n : p . endbin ] + a o r i s t i c . f r a c t i o n

}

return ( a o r i s t i c . array ) }

randomize . bin . number <− function (p . s t a r t b i n , p . endbin ) { i f (p . s t a r t b i n > p . endbin )

{

nr . of . bins <− ((48 − p . s t a r t b i n ) + p . endbin )

random . bin . nr <− p . s t a r t b i n + sample ( 0 : nr . of . bins , 1) i f ( random . bin . nr > 48) { r e s <− ( random . bin . nr − 48) } else { r e s <− ( random . bin . nr ) } } else i f (p . s t a r t b i n < p . endbin ) { r e s <− sample(p . s t a r t b i n : p . endbin , 1)

Appendix B. Script 40 } else i f (p . s t a r t b i n == p . endbin ) { r e s <− p . s t a r t b i n } else { eexxxxxxxxxxxxxxit } return ( r e s ) } ########################## DATABASE ( g e t data ) ##########################

# Grab b u r g l a r y dates and times from burgleform t a b l e #Connect to MySQL

mydb = dbConnect (MySQL( ) , user=' root ' , password=' ' , dbname =' burglary ' , host=' 1 2 7 . 0 . 0 . 1 ' , port =3306 , unix . socket='

/tmp/mysql . sock ' )

#Send Query and save r e s u l t to " data "

r s = dbSendQuery (mydb , " s e l e c t datestart , timestart , dateend , timeend from burgleform where d a t e s t a r t > '2013−05−01' && dateend < '2014−05−01'" )

data = f e t c h ( rs , n=−1 ) # Close db connection

dbClearResult ( r s ) dbDisconnect ( mydb )

# Setup crime . time dataframe

from <− ymd_hms( paste ( data$ datestart , data$ timestart , sep=" " ) )

to <− ymd_hms( paste ( data$dateend , data$timeend , sep =" " ) )

range <− as . double ( d i f f t i m e ( to , from , u n i t s=" s e c s " ) ) average <− from + range/2

#random <− r u n i f ( l e n g t h ( average ) , from , ( from+range ) ) %% 86400

########################## AORISTIC ##########################

a o r i s t i c . dataset = subset ( crime . time , crime . time$range <= unit *47 )

a o r i s t i c . array <− array ( 0 , dim=c (1 ,48) )

for ( counter in 1 :nrow( a o r i s t i c . dataset ) ) { tmp . from <− a o r i s t i c . dataset [ counter , 1 ] tmp . to <− a o r i s t i c . dataset [ counter , 2 ]

tmp . from . binnumber <− get . bin . number ( hour ( tmp . from ) + ( minute ( tmp . from ) / 60 ) )

tmp . to . binnumber <− get . bin . number ( hour ( tmp . to ) + ( minute ( tmp . to ) / 60 ) )

tmp . f r a c t i o n <− c a l c u l a t e . a o r i s i c . f r a c t i o n s ( tmp . from . binnumber , tmp . to . binnumber )

a o r i s t i c . array <− a s s i g n . a o r i s i c . f r a c t i o n s ( a o r i s t i c . array , tmp . from . binnumber , tmp . to . binnumber , tmp .

f r a c t i o n ) }

print ( a o r i s t i c . array )

#p r i n t ( round ( a o r i s t i c . array ) ) a o r i s t i c . data . array <− array ( ) #p r i n t ( a o r i s t i c . data . array )

count=1

#p r i n t out a l l the v a l u e s given from a o r i s t i c . arra for ( counterBins in 1 : 4 8 ) {

while ( a o r i s t i c . array [ counterBins ] >= 1) {

a o r i s t i c . data . array [ count ] <−( ( counterBins/2) −0.25) a o r i s t i c . array [ counterBins ] <−( a o r i s t i c . array [

counterBins ] −1) count<−( count+1) }

}

Appendix B. Script 42 ########################## RANDOM

##########################

random . dataset = subset ( crime . time , crime . time$range <= unit *47 )

random . array <− array ( 0 , dim=c (1 ,48) )

for ( counter in 1 :nrow( random . dataset ) ) { tmp . from <− random . dataset [ counter , 1 ] tmp . to <− random . dataset [ counter , 2 ]

tmp . from . binnumber <− get . bin . number ( hour ( tmp . from ) + ( minute ( tmp . from ) / 60 ) )

tmp . to . binnumber <− get . bin . number ( hour ( tmp . to ) + ( minute ( tmp . to ) / 60 ) )

tmp . random . binnumber <− randomize . bin . number ( tmp . from . binnumber , tmp . to . binnumber )

random . array [ tmp . random . binnumber ] <− ( random . array [ tmp . random . binnumber ] + 1)

}

print ( random . array )

random . data . array <− array ( ) #p r i n t ( random . data . array )

count=1

#p r i n t out a l l the v a l u e s given from random . array for ( counterBins in 1 : 4 8 ) {

while ( random . array [ counterBins ] >= 1) {

random . data . array [ count ] <−( ( counterBins/2) −0.25) random . array [ counterBins ] <−( random . array [ counterBins

] −1)

count<−( count+1) }

}

########################## ACTUAL TIME, AVERAGE, START and END ##########################

## Dataset 4 ##

time . within . unit = subset ( crime . time , crime . time$range <= unit )

time . within . unit . count = nrow( time . within . unit ) ## Dataset 1 ##

time . o u t s i d e . unit = subset ( crime . time , crime . time$range <= ( unit *47) )

time . o u t s i d e . unit . count = nrow( time . o u t s i d e . unit ) ## Prepairing Datasets f o r P l o t t i n g ##

#Hour of the day crime took p l a c e using Average−method #Actual time of crime

time . 1 8 0 0 . events . within . unit . average = hour ( time . within . unit $average ) + ( minute ( time . within . unit $average )/ 60 )

#Average

time . 1 8 0 0 . events . o u t s i d e . unit . average = hour ( time . o u t s i d e . unit $average ) + ( minute ( time . o u t s i d e . unit $average ) /60 )

#p r i n t ( time . 1 8 0 0 . events . within . un it . average )

#Hour of the day crime took p l a c e using Start −method

time . 1 8 0 0 . events . o u t s i d e . unit . start = hour ( time . o u t s i d e . unit $from ) + ( minute ( time . o u t s i d e . unit $from )/60 ) #Hour of the day crime took p l a c e using End−method

time . 1 8 0 0 . events . o u t s i d e . unit . end = hour ( time . o u t s i d e . unit $to ) + ( minute ( time . o u t s i d e . unit $to )/60 )

Appendix B. Script 44 ########################## PLOTTING

########################## par (mar=c ( 0 , 0 , 0 , 0 ) , mfcol=c ( 3 , 2 ) )

a o r i s t i c <− c i r c u l a r ( a o r i s t i c . array , u n i t s=' hours ' , template=" clock24 " , r o t a t i o n=c ( " c l o c k " ) )

c i r c u l a r . cime . plot ( a o r i s t i c . data . array , plot . bw=30, plot . t i t l e=paste ( "\ n A o r i s t i c " , sep="" ) )

random <− c i r c u l a r ( random . array , u n i t s=' hours ' , template= " clock24 " , r o t a t i o n=c ( " c l o c k " ) )

c i r c u l a r . cime . plot ( random . data . array , plot . bw=30, plot . t i t l e=paste ( "\nSlump" , sep="" ) )

# Plot [ Exact time ]

c i r c u l a r . cime . plot ( time . 1 8 0 0 . events . within . unit . average , plot . bw=30, plot . t i t l e=paste ( "\nExakt t i d " , sep="" ) ) # Plot [ Average ]

c i r c u l a r . cime . plot ( time . 1 8 0 0 . events . o u t s i d e . unit . average , plot . bw=30, plot . t i t l e=paste ( "\nMedel" , sep="" ) ) # Plot [ S t a r t ]

c i r c u l a r . cime . plot ( time . 1 8 0 0 . events . o u t s i d e . unit . start , plot . bw=30, plot . t i t l e=paste ( "\ nStart " , sep="" ) ) # Plot [ End ]

c i r c u l a r . cime . plot ( time . 1 8 0 0 . events . o u t s i d e . unit . end , plot . bw=30, plot . t i t l e=paste ( "\ nSlut " , sep="" ) )

########################## Chi Square (DAY) ##########################

#Actual Time ( v e c t o r )

day . a c t u a l . time <− append( day . a c tu al . time , floor (1 + time . 1 8 0 0 . events . within . unit . average*2) )

#Count t o t a l number of data length ( day . a c t u a l . time ) −48 #Make frequency t a b l e

day . a ct u a l . time . f r e q <− as . data . frame( table ( day . a c t u al . time ) )

#I n s e r t another colom with percentage value ( p r o b a b i l i t y ) day . a ct u a l . time . f r e q $ p r o b a b i l i t y <− ( day . a c t u al . time . f r e q $

Freq −1) / ( length ( day . a ct u al . time ) −48)

#Sum of the p r o b a b i l i t y should always be 1 ( confirmed below )

#sum( day . a c t u a l . time . f r e q $ p r o b a b i l i t y )

#Now we have the expected value to use in our Chi square t e s t .

day . expected <− c ( +day . ac tu al . time . f r e q $ p r o b a b i l i t y ) # − FROM −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−#

dfrom . df <− as . data . frame( table ( floor (1 + time . 1 8 0 0 . events . o u t s i d e . unit . start*2) ) )

c h i s q . t e s t . dfrom <− c h i s q . t e s t ( dfrom . df$Freq , p=day . expected )

#X−squared = Inf , df = 47 , p−value < 2.2 e−16 # − TO −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−#

dto . df <− as . data . frame( table ( floor (1 + time . 1 8 0 0 . events . o u t s i d e . unit . end*2) ) )

c h i s q . t e s t . dto <− c hi s q . t e s t ( dto . df$Freq , p=day . expected ) #X−squared = Inf , df = 47 , p−value < 2.2 e−16

# − AVERAGE −−−−−−−−−−−−−−−−−−−−−−−−−−−−# daverage<− array ( 1:48 )

daverage <− append( daverage , ( floor (1 + time . 1 8 0 0 . events . o u t s i d e . unit . average*2) ) )

Appendix B. Script 46 c h i s q . t e s t . daverage <− c h i s q . t e s t ( daverage . df$Freq , p=day .

expected )

#X−squared = Inf , df = 47 , p−value < 2.2 e−16 # − AORISTIC −−−−−−−−−−−−−−−−−−−−−−−−−−−#

d a o r i s t i c . df <− as . data . frame( table ( floor (1 + ( a o r i s t i c . data . array )*2) ) )

c h i s q . t e s t . d a o r i s t i c <− c h i s q . t e s t ( d a o r i s t i c . df$Freq , p= day . expected )

#X−squared = Inf , df = 47 , p−value < 2.2 e−16 # − RANDOM −−−−−−−−−−−−−−−−−−−−−−−−−−−−−#

drandom . df <− as . data . frame( table ( floor (1 + ( random . data . array )*2) ) )

c h i s q . t e s t . drandom <− c hi s q . t e s t ( drandom . df$Freq , p=day . expected )

Related documents