Kakao API로 수집한 데이터를 정제하기 [데이터 분석 with R]

안녕하세요. 언제나 휴일에 언휴예요.

이전 강의에서 카카오 API를 이용하여 도서 데이터를 검색한 후 CSV 파일로 저장하였습니다.

data.csv 파일 로딩 오류
data.frame 항목 list의 문자열을 합치기(paste) , 콤마 제거하기(str_replace_all)
    data.frame의 행 개수(nrow), 열 개수(ncol)
저장하고 로딩하여 확인하기

data.csv 파일 로딩 오류

그런데 분석하기 위해 로딩을 시도하니 오류가 나네요.

파일 내용을 보내 테이블 구조가 들쑥날쑥 하네요.

그림 1. data.csv 파일 내용 캡쳐

아무래도 data.csv 파일은 애물단지인 것 같군요.

너무 고민하지 마시고 가감히 영구 삭제하세요.

이번에는 이전 강의에 이어 정제화 작업을 수행하기로 합시다.

다음은 이전 강의 내용에 data.csv 파일 내용을 로딩하기 위해 실패하는 부분까지 입력한 전체 내용입니다.

> site_url = "https://dapi.kakao.com/v3/search/book"
> query = "R언어"
> query = URLencode(iconv(query,to="UTF-8"))
> query_str = sprintf("%s?target=title&query=%s",site_url,query)
> query_str
[1] "https://dapi.kakao.com/v3/search/book?target=title&query=R언어"

> kakao_api_key = "발급받은 REST API 키"
> auth_key = sprintf("KakaoAK %s",kakao_api_key)

> library(httr)
> resp = GET(query_str,add_headers("Authorization"=auth_key))
> resp
> resp
Response [https://dapi.kakao.com/v3/search/book?target=title&query=R%EC%96%B8%EC%96%B4]
  Date: 2020-05-16 03:05
  Status: 200
  Content-Type: application/json;charset=UTF-8
  Size: 8.7 kB
{"documents":[{"authors":["장기천","강병진"],"contents":"▶ 이 책은R언어로 짜는 금융프로그래밍 ...

> class(resp)
[1] "response"
> resp.str = as.character(resp)

> library(jsonlite)
> d= fromJSON(resp.str)
> class(d)
[1] "list"
> df = data.frame(d)

> write.csv(df,"data.csv")
Error in write.table(df, "data.csv", col.names = NA, sep = ",", dec = ".",  : 
  'list'은 'EncodeElement'에서 구현되지 않은 유형입니다

> df2 = as.matrix(df)
> write.csv(df2,'data.csv')

> read.csv("data.csv")
Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  열의 개수가 열의 이름들보다 많습니다

data.frame 항목 list의 문자열을 합치기 , 콤마 제거하기

“data.csv” 파일을 관찰해 보면 저자가 여러 명 있을 때 여러 열을 차지하네요.

콤마가 들어가 있는 내용도 여러 열을 차지하고 있습니다.

이제 저자 여러 명 있을 때 하나로 합치는 작업과 콤마를 제거합시다.

문자열을 하나로 합칠 때는 paste 함수를 호출합니다.

paste (…, sep = ” “, collapse = NULL)

특정 문자를 제거할 때 str_replace_all 함수를 호출합니다. (stringr 라이브러리 사용)

str_replace_all(string, pattern, replacement)

data.frame에 전체 항목을 방문하면서 변경할 거예요. 이를 위해 행과 열의 개수를 알아야겠죠. 이 때 nrow 함수와 ncol 함수를 호출합니다.

행 개수: nrow(df)

열 개수: ncol(df)

> library(stringr)
> for(r in 1:nrow(df)){
+     for(c in 1:ncol(df)){
+         df[r,c] = paste(df[r,c])
+         df[r,c] = str_replace_all(df[r,c],",",":")
+     }
+ }

저장하고 로딩하여 확인하기

matix로 변환한 후 저장하는 것은 이전 강의에서 얘기했죠.

그리고 csv 파일에 저장할 때 row.names 를 FALSE로 지정하여 저장하세요.

> dm = as.matrix(df)
> write.csv(dm,"data2.csv",row.names = FALSE)
> df3 = read.csv("data2.csv")
> df3
                  documents.authors
1                 c(장기천: 강병진)
2 c(박성호: 문경희: 이호창: 조미숙)
3                     마이클 크롤리
4                   제임스 W 파팅턴
5                     가렛 그롤먼드
6                         켈리 블랙
7                   제임스 W 파팅턴
                                   
== 이하 생략 ===

이제 데이터 분석을 위한 준비가 어느 정도 된 것 같네요.