데이터를 기반으로

R 스터디 2일차 - 데이터 확인, 데이터 다각도로 보기! 본문

스터디/R 온라인 스터디

R 스터디 2일차 - 데이터 확인, 데이터 다각도로 보기!

이노후 2019. 3. 12. 22:21
728x90
반응형

안녕하세요 여러분~


이번 게시글 부터는 중간 배열로 조금 더 깔끔하게 진행하겠습니다!! ㅎㅎ

1일차에는 R에 내장되어 있는 유명한 iris 데이터로 연습을 해보는 시간을 가졌습니다.



2일차 이번부터는 본격적으로 원래 진행하고자 했던 SK BigData hub에서 가져온 



바로바로!!

.

.

.

.


'19년 1월 서울시 치킨 판매업종 이용 통화량' 


데이터입니다!


데이터 얻은 주소는


https://www.bigdatahub.co.kr/product/view.do?pid=1002028


여기 있습니다!


자 시작해 보겠습니다!!!



역시....처음부터 순탄치 않네요 ㅠㅠ


이 에러가 무엇일까... 검색을 해보니!!!







위 사진의 출처는 이 곳입니다!


https://stackoverflow.com/questions/18444769/error-while-reading-csv-file-in-r






오....영어를 못하지만...해석을 해보니 같은 이름을 가진 열이 2가지가 있을 지도 모른다는 말을 하네요...



하지만!! 저는... 잘못 해석해 열을 행으로 보고 말았죠...



우선 파일을 한번 열어보았습니다.








이렇게 생겼는데 생각해보니 각각의 행 중 하나 정도는 똑같은 값을 가졌을 지도 모른다는 생각을 했습니다.




직접 확인은 귀찮으니 저는 그냥 엑셀 켠김에 고유번호를 부여해줬습니다 ㅎㅎ








위에 한 1,2,3, 만 쓰고 더블클릭 하면 모든 열에 다 부여되는거 아시죠? ㅎㅎㅎ


아무튼....이렇게 잘못된 해석으로 진행을 했습니다...허허ㅓ


근데.....이게 무슨 일이죠...???






어찌하여.....불러와지는 것인가요??


저는 원래 해석대로 라면 고유번호를 주고 R 자체에서 지우면 똑같은 데이터가 되니 그렇게 진행하려 했습니다.


근데...해석을 잘못했음에도 불구하고 어떻게 불러와진 것인지 의문이 드는 부분이네요....


그래서!! 한번 확인을 해봤습니다!!



잘....불러와졌군요...


끝에 고유번호를 지우고 다시 불러와보니!!


이 또한....완벽하네요..ㅎ


혹시나!! 잘못된게 있는지 차원수로 한번 더 확인을 해보니 !!



이상없이 잘 불러와졌습니다....ㅎㅎ


뜻밖의 행운인건가요 ㅎㅎㅎㅎ



이 부분의 원인은 자세히 다시 파악하고 해결되면 올려보도록 하겠습니다...ㅠㅠ



항상 전처리에는 시간이 많이 걸리네요 ㅠㅠ




자!



다시 돌아와서 2일 차 스터디를 진행해보겠습니다 ㅎㅎ 






summary 함수를 돌려보니 기준일은 그냥 하나의 숫자로 인식해서 min 과 max 가 저렇게 나오는 것으로 생각했습니다.


하지만 왜 요일은 저렇게 뒤죽박죽 연관없이 섞여 있는것인지 의문이 들었습니다.






한번 str 로 확인을 해보니!!



기준일은 int ,  요일은 factor 로 인식되어 있었습니다.



as.character() 함수를 사용하여 문자열 형식으로 바꿔주고

as.POSIXct() 함수를 사용하여 날짜 형식으로 바꾸어 주자.







as.POSIXct() 는 이런 형식으로  진행하면 된다.



?factor 를 실행시켜 help 화면에서 예제를 보니








이런 식으로 진행하면 된다.


하여!!! 밑에와 같은 코드로 진행한다!!





aa$기준일<-as.character(aa$기준일)

aa$기준일<-as.POSIXct(aa$기준일,format="%Y%m%d")

aa$요일<-factor(aa$요일,levels=c("월","화","수","목","금","토","일"))






확인하니 제대로 기준일과 요일이 바껴있다.



summary 를 통해 다시한번 확인해보자!!







기준일과 요일 모두 잘 원하는대로 변했다!!


아주 성공적이다!!




마지막 한가지!!!!!


데이터에 NA 값이 있는지 확인해보는 작업이다!!







없다! ㅎㅎ



자~ 이제 전처리는 확실히 끝났다!!




이제 어떤 분석을 해볼지 고민을 해보았다.....



우선 도메인 지식!! 데이터를 보고 어떤 Insight 를 도출할지 고민을 해보았다.





  • 요일에 따라 통화 건수가 달라질까??
    • 보통 금,토에 많이 전화를 하지 않을까?
  • 연령에 따라 통화 건수가 달라질까??
    • 10대, 20대보다는 금전적 여유가 있는 30,40대가 더 많이 전화를 하지 않을까?


우선은 이런식으로 접근해 볼 수 있을 것이다.


자 그럼 첫번째!


연령에 따라 통화 건수가 달라질지 확인하기 위해 연령별 통화량을 보고싶어졌다.


복잡한 코딩보단 aggregate() 함수를 이용해 한줄의 코딩으로 쉽게 볼 수 있다!


?aggregate

라고 입력하고 실행하면 이 함수의 포멧을 확인할 수 있다.







자! 우리는 각각의 연령대별 통화량의 합계를 보고 싶으니!!



aggregate(aa$통화건수, by=list(aa$연령대), FUN=sum)


이렇게 입력하면 될것이다.


그 결과






40대와 30대가 가장 많은 통화량을 갖고(?) 있었다!!!




그 다음은 요일별 통화량을 보고싶었다.


aggregate(aa$통화건수, by=list(aa$요일), FUN=sum)


이렇게 코드를 입력 후 보면!!







금요일과 토요일이 통화량이 많았다!



자!! 우리는 더 강력한 패키지인 dplyr 이라는 것을 이용할 것이다!!

R에서는 굉장히~~~~ 유명한 패키지이다.

글쓴이인 저도 스터디 이전 부터 알고 있던 유명한 패키지여서 이미 설치가 되어 있었다!


dplyr 패키지에 내장되어있는 group_by() 함수를 이용해 보고싶은 변수를 그룹화 시키고

통화건수를 sum 하여 만들어준다!!!

그 다음 data.frame 으로 변경해주는 작업을 할 것이다!!


참고로 dplyr 에서는 각각의 연결은 %>% 이것을 이용해 진행한다 


저는 계속  %>% 이것을 치기가 귀찮아서 알아보니!!!!


R에서는 Ctrl + Shift + M 을 누르면 %>% 이것이 입력된다!!!!


알고나면 편합니다 ㅎㅎㅎㅎ


자 그럼 요일별 통화건수를 확인해 보겠습니다 dplyr을 이용해서!!!







이런식으로 dbd 라는 데이터 프레임을 만들어줬습니다.



이것을 좀 더 활용하여 요일과 연령대 별 통화량을 한번에 보고싶었다!








이런 식으로 진행해보니 요일을 첫번째 기준으로 하고 두번째는 연령대로 출력되는 것을 확인할 수 있었다.



group_by() 에서 순서를 바꿔보니!!!








정렬되는 기준이 바뀌었다~~~!!!!! 앞에 오는 것을 먼저 정렬하는 것을 확인할 수 있었다.



자 통화량으로 적은 것부터 정렬해보니!!!



.

.

.

.





40대가 가장 많고 10대 가장 적었다.

그리고 40대는 토요일과 금요일에 가장 많이 전화를 했다는 것을 확인할 수 있다!



1. 10대에 비해 40대가 금전적으로 여유가 있다.
– 그러나 이는 30대 역시 치킨을 시켜먹을만한 충분한 금전적 여유가 있으나 30대와 5천건이나 차이가 나는것이 이상하게 생각이 될 수도 있다.
2. 40대면 보통 가정을 갖고 있을수 있고, 자녀도 역시 10대 일 수 있다.
– 이러면 30대와 차이를 생각해 볼 수 있는게, 40대의 10대 자녀가 부모님을 통해 전화를 할 수가 있을 수 있다고 해석해 볼 수 있다.



스터디 블로그에서의 결론이다.

본인도 똑같이 생각한다.


추가적으로 50대와 20대는 비슷한 통화량을 보인다.


이것은 치킨에 대한 선호도와 금전적 여유를 뜻하는 것으로 보인다.


20대 : 금전적 여유 ↓ , 치킨선호도 ↑

50대 : 금전적 여유 ↑ , 치킨선호도 ↓


이기에 중간 값을 20대 와 50대가 채우는 것으로 생각된다. 물론 개인적인...ㅎㅎ


자! 이렇게 2번째 스터디 과제를 마무리 하겠다.


처음 데이터를 불러오는 과정에서 확실한 오류해결법을 들고 다음에는 찾아뵙겠습니다 ㅠㅠ


그리고 이번주는 SQLD 시험과....저는 취준생이므로 이번주 다음주 공채 시즌이 시작되어 

너무나 바쁜 일상을 보내고 있습니다ㅠ

그래도 다음주는 시험은 없으니 좀 더 스터디에 대한 개인적인 고찰을 포함하여 

더 많은 양의 결과물을 제출할 수 있도록 하겠습니다.


그럼 이만!!!


감사합니다!!!




------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
원본 코드 입니다!!




#과제 2일차

rm(list=ls())

a<-read.csv("CALL_CHICKEN_01MONTH_nn.csv",header=TRUE,encoding = "utf-8")
#이상하게 불러와진 것을 해결해야한다...ㅠㅠ

str(a)

aa<-a[,-10] #고유번호 csv 파일 자체에서 부여했기에 삭제!

head(aa)

dim(aa)
#총 29850개 행인 데이터

summary(aa)
#일수는 한달, 서울, 치킨, 구 및 읍면동, 통화건수, 성별, 연령대, 요일



summary(aa) #요일과 기준일의 이상함을 느낌
str(aa)

#int 와 factor의 정렬기준은?

aa$기준일<-as.character(aa$기준일)
?as.POSIXct
#as.POSIXct(z, origin = "1960-01-01")                # local
?as.POSIXct
aa$기준일<-as.POSIXct(aa$기준일,format="%Y%m%d")
?factor
aa$요일<-factor(aa$요일,levels=c("월","화","수","목","금","토","일"))
str(aa)
summary(aa)

sum(is.na(aa)) #NA 값 있는지 확인

?aggregate

aggregate(aa$통화건수, by=list(aa$연령대), FUN=sum)

aggregate(aa$통화건수, by=list(aa$요일), FUN=sum)

library(dplyr)

dbd<-aa %>% 
  group_by(요일) %>% 
  summarise(통화건수=sum(통화건수)) %>% as.data.frame()
dbd

dbdy<-aa %>% 
  group_by(연령대, 요일) %>% 
  summarise(통화건수=sum(통화건수)) %>% as.data.frame()
dbdy

dbdy2<-aa %>% 
  group_by(요일, 연령대) %>% 
  summarise(통화건수=sum(통화건수)) %>% as.data.frame()
dbdy2

dbdy %>% arrange(통화건수)


728x90
반응형