발전의 의지/R프로그래밍

시간-속도 사고율 표 검토 20180131

OnlyMyStuff 2021. 8. 26. 13:01

# 서론

저번 주에 만들어놓은 표에서 정말로 저 속도, 시간대에 졸음사고 확률이 높은지

아니면 걍 교통량이 많은 건지를 확인해볼 필요를 느낌

표는 사고건수/해당 속성의 콘존 수

집에서 뚝딱해서 만든 표인데 딱히 뭐가 위험한 수준인지 몰라서

내가 결정한 5% 이상의 시간-속도를 골랐다. 이는 아래와 같다.

50km/h - 10시, 11시, 13시
70km/h - 12시
90km/h - 1시, 2시
120km/h - 5시

위에 해당하는 졸음사고 row를 뽑아 특성을 한번 보고

 교통량을 어떻게 적용할지 생각해보자.

# R에 raw 데이터 불러오기

이거 개쉬움

install.packages("readxl")
library(readxl)
rawdata<-read_excel(path="파일이름", sheet="시트이름") 하면 끝

header의 여부는 까먹음 걍 적용하면 header 있게 나옴

다음은 dplyr 패키지를 통하여 filter를 먹여줄 것이다.

dplyr 패키지에서 chain 어쩌고 가 지린다고 하지만 나는 알린이기 때문에

담학기 통자처에서 배우도록 한다.

wantdata<-filter(.data=rawdata, rawdata$원인=="졸음")
rawdata$속도<-10*(ceiling(rawdata$속도/10))

두 번째 줄은 속도를 10단위로 계급을 만드는 것이다. if문을 쓰면 너무 길어져서 걍 올림을 사용하였고
floor에 digit을 결정하는 인자가 없어 10으로 나뉜 뒤 floor를 먹이고 10을 다시 곱하였다. zl존

wantdata가 졸음사고이니 여기서 위에서 말했던 것들을 뽑아낼 것이다.

# 원하는 사고데이터 추출

위와 같이 filter를 사용하여 할 건데 or 연산자 || 와 and 연산자 &&를 적극적으로 사용하여

(원소들의 비교는 |, 벡터자체의 비교는 ||)

지상전의 승리자가 될 것이다.

근데 생각해보니까 pipefunction 도 써야 승리할 수 있을 것 같다.

근데 또 실패했다.

newdata<-rbind(
  wantdata%>%filter(속도==50, 시간==10),
  wantdata%>%filter(속도==50, 시간==11),
  wantdata%>%filter(속도==50, 시간==13),
  wantdata%>%filter(속도==70, 시간==12),
  wantdata%>%filter(속도==90, 시간==1),
  wantdata%>%filter(속도==90, 시간==2),
  wantdata%>%filter(속도==120, 시간==5)
)

나는 허접이라 이렇게 했다. 매우 허접해 보인다.

이럴 거면 wantdata를 안 만들어도 됐을 텐데;;;

근데 만들어보니 데이터가 이상하다 표에는 사고가 있다고 나오는데 raw데이터에는 사고가 없다..

표를 다시 가공한다..

코드... 최초 공개할게요

for (i in 1:13) {
  for (j in 1:24){
    acc[i,j+1]<-nrow(rawdata%>%filter(속도==20+10*i, 시간==j-1))
  }
}

table 형태는 귀차나서 엑셀로 만든 다음에 썼다. 하나의 프로그램에 의존하면 안되? 안돼?

테이블 다시 만듬 ;;



또 나만의 기준으로 3% 이상의 경우만 살필거임

속도가 낮거나 높은 구간은 표본이 적어서  저 확률이 신빙성이 부족

그래도 뭐 해야지 뭐 어쩌겠어 나는 소시민이야

50km/h - 12시, 13시, 15시
70km/h - 11시
90km/h - 3시, 4시, 5시,
140km/h - 1시, 3시

이제 다시 시작이다


# 원하는 사고데이터 추출 (2)

아까와 같은 코드이지만 다른 내용으로 원하는 졸음사고 데이터 추출

newdata<-rbind(
  rawdata%>%filter(속도==50, 시간==12, 원인=="졸음"),
  rawdata%>%filter(속도==50, 시간==13, 원인=="졸음"),
  rawdata%>%filter(속도==50, 시간==15, 원인=="졸음"),
  rawdata%>%filter(속도==70, 시간==11, 원인=="졸음"),
  rawdata%>%filter(속도==90, 시간==3, 원인=="졸음"),
  rawdata%>%filter(속도==90, 시간==4, 원인=="졸음"),
  rawdata%>%filter(속도==90, 시간==5, 원인=="졸음"),
  rawdata%>%filter(속도==140, 시간==1, 원인=="졸음"),
  rawdata%>%filter(속도==140, 시간==3, 원인=="졸음")
)

해당되는 졸음사고건수 149건으로 넘모 많아서 교통량은 평균으로 퉁친다

반박시 통잘알

tapply를 쓰고 싶었지만 인덱스가 두개인 경우 사용법을 몰라서 위에 코드 응용

근데 생각해보니 테이블 또 만들어야함;;

# 원하는 사고데이터 추출 (3)

이번에는 사고건수에다가 해당 특성을 가지는 콘존들의 평균 교통량을 쓸거임

인내를 가지고 시작해보자.

물 한잔을 들이키며 생각해보니

내가 지금 R 위에 올려논 테이블에 교통량을 나누어 주면 될 것 같다.

그리고 다시 csv로 출력해 엑셀로 잡을 하면 끝

for (i in 1:13) {
  for (j in 1:24){
    all[i,j+1]<-nrow(rawcz%>%filter(속도==20+10*i, X__1==j-1))
    k<-rawcz%>%filter(속도==20+10*i, X__1==j-1)
    k<-mean(k$교통량)
    all[i,j+1]<-k*all[i,j+1]
rm(list="k)
  }
}

이걸 활용해 sleep/all 을 해서 1000대당 졸음사고 건수로 바꿨습니다...

마지막 표...


이로써 교통량을 고려했다. 이제 기준이 상당히 선정하기 힘들어졌다.

아마 새벽시간과 낮시간의 갭이 너무 커서 그럴 것이라 생각해서

기존에 선정했던 23~6시를 새벽시간으로 낮과 새벽으로 나눠서 색칠을 다시 해봤다.

오늘의 결론임


# 결론

큰 데이터를 알로 다루고 정리해서 걍 엑셀로 꾸미는 게 더 좋은 거 같은데

ggplot이나 이런거 공부할 필요가 있을까???

글고 오늘 같은 일 3번해서 가성비 넘 구림