본문 바로가기
R

빈도 분석 실습(지역 별 교통사고 사건 데이터)

by jun_code 2021. 7. 25.

지역 별 교통사고 사건 데이터를 가지고 막대그래프도 그려보고 지역별, 주/야간별 교통사고 사건 수와 사상자의 수에 대해 분석해 보고자 한다. 데이터를 불러와 분석에 맞게 구조를 변경하는 것이 중요하므로 이 포인트에 중점을 두고 보면 좋을 것이다.

 


1. 지역별 교통사고 사상자수 분석

 

setwd("") # 디렉토리 설정(파일의 위치 경로를 확인하여 기입한다
acc_data <- read.csv("accdata2.csv", header = T)
head(acc_data, 4)
'''
  발생년 주야 요일 사망자수 사상자수 발생지시도 발생지시군구 사고유형_대분류 사고유형_중분류      사고유형 법규위반_대분류
1   2012 야간   수        1        1       경남       거창군          차대차            추돌   진행중 추돌  운전자법규위반
2   2012 주간   금        1        1       경기       용인시          차대차            추돌 주정차중 추돌  운전자법규위반
3   2012 야간   금        1        2       경북       김천시          차대차    측면직각충돌  측면직각충돌  운전자법규위반
4   2012 주간   목        1        1       경기       이천시          차대차            추돌 주정차중 추돌  운전자법규위반
              법규위반     경도     위도
1 안전운전 의무 불이행 127.8532 35.58072
2 안전운전 의무 불이행 127.0529 37.31761
3 안전운전 의무 불이행 128.0032 36.19092
4 안전운전 의무 불이행 127.4204 37.23896  '''

table(acc_data$발생지시도)
'''
강원 경기 경남 경북 광주 대구 대전 부산 서울 세종 울산 인천 전남 전북 제주 충남 충북 
 703 2777 1302 1511  311  545  310  596 1173   53  330  486 1274 1007  275 1188  783  '''

tapply() 함수로 지역별 사상자 수를 더하여 나타낸다

 

info <- tapply(acc_data$사상자수, acc_data$발생지시도, sum)
# tapply(data, index, function) 
info
'''
강원 경기 경남 경북 광주 대구 대전 부산 서울 세종 울산 인천 전남 전북 제주 충남 충북 
1339 4642 2035 2560  480  861  426  876 1781   83  493  781 2074 1707  513 2024 1280  '''

class(info)
'''
[1] "array"  '''

위에서 info의 데이터 구조를 보면 array인데 추후 그래프에 활용하기 위해 데이터프레임으로 구조를 변경한다.

 

df <- data.frame(지역=names(info), 사상자총계=info)
df
'''
     지역 사상자총계
강원 강원       1339
경기 경기       4642
경남 경남       2035
경북 경북       2560
광주 광주        480
대구 대구        861
대전 대전        426
부산 부산        876
서울 서울       1781
세종 세종         83
울산 울산        493
인천 인천        781
전남 전남       2074
전북 전북       1707
제주 제주        513
충남 충남       2024
충북 충북       1280 '''

데이터 프레임으로 구조를 변경하고 막대그래프로 데이터를 파악한다.

 

# 정렬
df1 <- df[order(df$사상자총계, decreasing=T), ]
df1
'''
     지역 사상자총계
경기 경기       4642
경북 경북       2560
전남 전남       2074
경남 경남       2035
충남 충남       2024
서울 서울       1781
전북 전북       1707
강원 강원       1339
충북 충북       1280
부산 부산        876
대구 대구        861
인천 인천        781
제주 제주        513
울산 울산        493
광주 광주        480
대전 대전        426
세종 세종         83  '''

# 막대그래프
vcol1 <- as.vector(df1[,1]) # plot에 넣기 위해 각 열을 벡터로 추출
vcol2 <- as.vector(df1[,2])
vcol1
'''
[1] "경기" "경북" "전남" "경남" "충남" "서울" "전북" "강원" "충북" "부산" "대구" "인천" "제주" "울산" "광주" "대전" "세종"  '''
vcol2
'''
[1] 4642 2560 2074 2035 2024 1781 1707 1339 1280  876  861  781  513  493  480  426   83  '''

barplot(vcol2, beside = T, names= vcol1, col=rainbow(length(vcol1)), ylim=c(0,5000), main = '지역별 교통사고 사상자 수')

<그림1>

 

 

2. 지역별 교통사고 사상자를 주/야간으로 분석

앞서는 지역별 교통사고 사상자수를 분석하였지만 아래에서는 더 나아가 지역별 주간과 야간에 사상자수를 분석하고자 한다. 

info1 <- tapply(acc_data$사상자수, list(acc_data$발생지시도, acc_data$주야), sum)
info1
'''
     야간 주간
강원  500  839
경기 2492 2150
경남  941 1094
경북 1193 1367
광주  283  197
대구  501  360
대전  245  181
부산  484  392
서울 1047  734
세종   36   47
울산  269  224
인천  450  331
전남  911 1163
전북  780  927
제주  197  316
충남  996 1028
충북  631  649  '''

# factor를 이용해 인덱스 목록 지정
info1 <- tapply(acc_data$사상자수, list(acc_data$발생지시도, factor(acc_data$주야, level=c('주간','야간'))), sum) # 인덱스 목록을 정렬하기 위해 level사용
info1
'''
     주간 야간
강원  839  500
경기 2150 2492
경남 1094  941
경북 1367 1193
광주  197  283
대구  360  501
대전  181  245
부산  392  484
서울  734 1047
세종   47   36
울산  224  269
인천  331  450
전남 1163  911
전북  927  780
제주  316  197
충남 1028  996
충북  649  631  '''

class(info1)
'''
[1] "matrix" "array"  '''

info2 <- data.frame(info1) # 구조 변경
class(info2)
'''
[1] "data.frame"  '''

데이터의 행과 열의 구조를 변경하는 경우 data.table 패키지를 사용한다. 구조를 변경하는 경우 컬럼명을 따로 지정하지 않는 경우 기본적으로 V가 들어간다. 

 

install.packages('data.table')
library(data.table)

t_1 <- transpose(info2) # 행과 열 변형, 컬럼명 지정이 되지 않음
t_1
'''
   V1   V2   V3   V4  V5  V6  V7  V8   V9 V10 V11 V12  V13 V14 V15  V16 V17
1 839 2150 1094 1367 197 360 181 392  734  47 224 331 1163 927 316 1028 649
2 500 2492  941 1193 283 501 245 484 1047  36 269 450  911 780 197  996 631 '''

rownames(t_1) <- colnames(info2)
colnames(t_1) <- rownames(info2)
t_1
'''
     강원 경기 경남 경북 광주 대구 대전 부산 서울 세종 울산 인천 전남 전북 제주 충남 충북
주간  839 2150 1094 1367  197  360  181  392  734   47  224  331 1163  927  316 1028  649
야간  500 2492  941 1193  283  501  245  484 1047   36  269  450  911  780  197  996  631  '''

행과 열만 변경하였고 주/야간의 총 사상자 수를 알아보기위해 rbind() 함수를 통해 행을 추가한다. 행간 값을 합치기 위해 colSums() 함수를 사용한다.

 

t_2 <- rbind(t_1, total=colSums(t_1))
t_2
'''
      강원 경기 경남 경북 광주 대구 대전 부산 서울 세종 울산 인천 전남 전북 제주 충남 충북
주간   839 2150 1094 1367  197  360  181  392  734   47  224  331 1163  927  316 1028  649
야간   500 2492  941 1193  283  501  245  484 1047   36  269  450  911  780  197  996  631
total 1339 4642 2035 2560  480  861  426  876 1781   83  493  781 2074 1707  513 2024 1280
'''

지역별 주/야간 교통사고 사상자수를 시각화 하기 위해 boxplot()을 사용한다. 시각화를 위해서 데이터는 벡터, 배열, 행렬 형태로 되어야 한다.

아래에 두가지 코드를 작성하였다. 하나의 막대에 주/야간 사상자수를 함께 넣은 막대그래프와 따로 넣은 그래프 두개를 그려넣었다. 이는 beside() 함수에 따라 다름을 알 수 있다.

 

barplot(as.matrix(t_1[,]), beside=T, col=c('pink','darkblue'), main= '지역별 주/야간 교통 사상사고 통계', legend=c('주간','야간')) # beside =T : 같은 지역별로 묶기
axis(2, seq(0, 3000, 500)) # 2: y축

<그림2>

 

barplot(as.matrix(t_1[,]), beside=F, col=c('pink','darkblue'), main= '지역별 주/야간 교통 사상사고 통계', legend=c('주간','야간')) # beside =F : 하나의 막대에 표현
axis(2, seq(0, 3000, 500))

<그림3>