데이터 로드, 가공, 그래프 그리기에 관한 포스트다. 분석에 관한 내용은 이후 포스트에서 올릴 예정이다. 이 포스트에서 유의미한 통계는 아니지만 어떻게 한글 데이터를 불러오고 가공하고 그래프를 그리는지 확인할 수 있다.

chicken 데이터 불러오기

SK의 빅데이터 허브에 가면 이런 자료들이 많다. 서울시 치킨집 또는 배달 통화건수 데이터들은 달마다 올라온다. 하지만 이 데이터만으로는 부족하고 다른 인구통계학적 데이터가 같이 가미되면 좋을 것 같다.

이전에 R로 랜덤 팀 배정하는 프로그램을 만들 때 csv 파일 한글이 계속 깨져서 포기하고 엑셀 포맷만 다뤘는데, 드디어 방법을 찾아냈다. (보통 원인은 MAC과 윈도우에서 파일을 주고 받을 때 생긴다. 인코딩 방법이 달라서.)


library(tidyverse)
library(plotly)
library(COUNT)

df <- read.csv('dataset/chicken.csv', 
               header=T,
               fileEncoding = 'euc-kr',
               encoding = 'utf-8') 



  1. Error1

read.csv() 함수를 쓰면서 겪었던 에러 문제를 먼저 말해보겠다.



'dataset/chicken.csv 에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다

해결

파일 마지막 셀에 스페이스를 넣어 마지막 라인을 넣어준다.

이때 주의할 게 그냥 저장하면 유니코드 텍스트로 저장되어서 다시 csv 파일을 열 때 모든 컬럼 내용이 하나의 컬럼으로 합쳐지는 경우가 있다. 그럴 때는 다른 이름으로 저장해서 csv(쉼표로 분리, utf-8)로 저장한다.

  1. Error2


Error in make.names(col.names, unique = TRUE) :
  invalid multibyte string at '~'

해결

맨 위 코드처럼 read.csv에 아래 옵션을 추가한다.



fileEncoding = "euc-kr",
encoding = 'utf-8' 

chicken 데이터 가공하기

컬럼 이름

가공할 필요성을 못느껴 일단 놔두었다.


names(df) # 컬럼 이름들 확인



기준일 -> ‘연, 월, 일’로 바꾸기

2019년 1월 한 달 데이터라 연과 월은 모두 같다. 연, 월, 일로 분리시키고 싶었는데 이 데이터의 기준일 같은 경우 ‘-‘나 ‘/’처럼 구분자가 없어서(ex. 190101) 어떻게 분리해야 하나 싶었다. 고민하다가 스택오버플로우에서 좋은 방법을 발견 했다.


date <- as.Date(as.character(df$기준일), format = "%Y%m%d")
lt <- unclass(as.POSIXlt(date))
df[, c("날짜", "연", "월", "일")] <- with(lt, 
                                data.frame(날짜 = date
                                ,  = year + 1900
                                ,  = mon + 1
                                ,  = mday))

또 다른 방법 : 기준일을 주별로 나누기

조교님이 알려주신 방법인데, gapminder 데이터셋처럼 3일 ~ 4일 별로 날짜 데이터를 다시 가공하고 싶다면 아래 코드처럼 하면 된다.

myTable() 함수를 쓰려면 library(COUNT)를 import 해야한다. 아마 빌트인 라이브러리라 설치는 따로 필요없을 것이다.


df$date <- cut(df$기준일, seq(20190101,20190131,7),right = F)

levels(df$date) <- c("w1","w2","w3","w4")
myTable(df$date)

df$re.date <- cut(df$기준일, 
                  br=c(20190100,20190106,20190113,20190120,20190127,20190132),
                  labels=c("w1","w2","w3","w4","w5"))

myTable(df$re.date)
df$re.date

head(df)



컬럼 인덱싱

이 데이터는 모두 서울시의 치킨집 통화건에 관한 데이터이다. 따라서 ‘업종’ 컬럼의 ‘치킨’, 도시 컬럼의 ‘서울’ 데이터 같은 경우는 필요가 없다. 필요한 데이터만 골라내기 위해 cbind()컬럼을 선택해 묶어주었다. cbind를 쓰면 컬럼 순서도 바꿀 수 있다.


df2 <- cbind(df[,11:13], df[,2:4], df[,6:7], df[9])

head(df)
head(df2)


남녀 -> 숫자로

str(df)로 확인해보면 데이터 타입이 factor로 되어있는 컬럼들이 있다. 이런 컬럼들은 factor() 함수로 레벨을 새로 지정해줄 필요없이 levels를 다시 지정해주면 된다.


levels(df2$성별) <- c(1, 0)



gapminder

데이터를 새로 추가해야하지만, 움직이는 그래프가 보고 싶어서 gapminder 데이터셋 예시를 보고 그려봤다.

움직이는 그래프 확인



p <- df2 %>%
  plot_ly(
    x = ~연령대, 
    y = ~통화건수, 
    color = ~시군구, 
    frame = ~, 
    type = 'scatter',
    mode = 'markers'
  ) 

ggplotly(p)