2.1 북크로싱 데이터셋

북크로싱(Book-Crossing) 데이터셋은 독일 프라이부르크 대학교(University of Freiburg)의 니콜라스 지글러(Cai Nicolas Ziegler) 교수가 Book-Crossing 사이트에서 2004년 8월에서 9월까지 4주간 수집한 데이터셋입니다.

북크로싱 데이터셋은 278,858명의 익명 사용자가 271,379권의 도서에 대하여 평가한 1부터 10 사이의 평점 1,149,780개가 포함되어 있는 다음의 3개의 파일을 포함하고 있습니다.

  • BX-Books.csv - 도서 데이터
  • BX-Book-Ratings.csv - 도서-평점 데이터

2.1.1 데이터셋 살펴보기

여기에서는 데이터셋을 가져오기 위해 사용하는 각 CSV 파일의 구조 및 속성에 대해 살펴봅니다.

2.1.1.1 도서 데이터

도서 데이터를 포함하는 BX- Books.csv 파일의 구조에 대해 살펴봅니다. BX- Books.csv 파일은 일반적인 CSV 파일과 달리 쉼표(Comma)가 아닌 쌍반점(Semicolon)으로 각 속성을 구분하고 있으며 식별자인 국제표준도서번호(ISBN), 도서명(Book-Title), 저자가 여러 명인 경우에는 첫 번째 저자만 나타내는 저자(Book-Author), 출판 연도(Year-Of-Publication), 출판사(Publisher), 3가지 크기의 도서 이미지 URL(Image-URL-S, Image-URL-M, Image-URL-L)의 8개 속성 정보를 포함하는 271,379행으로 구성되어 있습니다. CSV 파일의 첫 번째 행은 도서 데이터의 속성을 나타내는 헤더 행이고, 헤더 행 다음의 각 행은 한 권의 도서를 나타내고 있습니다.

다음은 BX- Books.csv 파일의 일부를 보여주고 있습니다.

"ISBN";"Book-Title";"Book-Author";"Year-Of-Publication";"Publisher";"Image-URL-S";"Image-URL-M";"Image-URL-L"
"0195153448";"Classical Mythology";"Mark P. O. Morford";"2002";"Oxford University Press";"http://images.amazon.com/images/P/0195153448.01.THUMBZZZ.jpg";"http://images.amazon.com/images/P/0195153448.01.MZZZZZZZ.jpg";"http://images.amazon.com/images/P/0195153448.01.LZZZZZZZ.jpg"
"0002005018";"Clara Callan";"Richard Bruce Wright";"2001";"HarperFlamingo Canada";"http://images.amazon.com/images/P/0002005018.01.THUMBZZZ.jpg";"http://images.amazon.com/images/P/0002005018.01.MZZZZZZZ.jpg";"http://images.amazon.com/images/P/0002005018.01.LZZZZZZZ.jpg"
"0060973129";"Decision in Normandy";"Carlo D'Este";"1991";"HarperPerennial";"http://images.amazon.com/images/P/0060973129.01.THUMBZZZ.jpg";"http://images.amazon.com/images/P/0060973129.01.MZZZZZZZ.jpg";"http://images.amazon.com/images/P/0060973129.01.LZZZZZZZ.jpg"
"0374157065";"Flu: The Story of the Great Influenza Pandemic of 1918 and the Search for the Virus That Caused It";"Gina Bari Kolata";"1999";"Farrar Straus Giroux";"http://images.amazon.com/images/P/0374157065.01.THUMBZZZ.jpg";"http://images.amazon.com/images/P/0374157065.01.MZZZZZZZ.jpg";"http://images.amazon.com/images/P/0374157065.01.LZZZZZZZ.jpg"

도서 데이터의 모든 속성에 대한 품질 진단 결과, 도서명(Book-Title) 속성에 대한 고유 데이터 비율이 89%인 것이 특이 사항으로 파악되며 국제표준도서번호(ISBN)는 고유번호라고 하더라도 같은 도서가 있음을 알 수가 있습니다. 여기에서는 결측치(Missing Value)에 대한 확인만 진행하며 데이터의 품질을 향상하기 위한 데이터 전처리(Data Preprocessing)는 진행하지 않습니다.

도서 데이터의 모든 속성에 대한 품질 진단

명칭 속성 유형 결측치(n) 결측치(%) 고유치(n) 고유치(n/N)
국제표준도서번호 ISBN character 0 0 271,379 1
도서명 Book-Title character 0 0 242,154 0.89
저자 Book-Author character 0 0 102,028 0.38
출판 연도 Year-Of-Publication integer 0 0 116 0.000427
출판사 Publisher character 0 0 16,807 0.06
스몰 이미지 URL Image-URL-S character 0 0 271,063 1
미디엄 이미지 URL Image-URL-M character 0 0 271,063 1
라지 이미지 URL Image-URL-L character 0 0 271,063 1

2.1.1.2 도서-평점 데이터

도서-평점 데이터를 포함하는 BX-Book-Ratings.csv 파일 구조에 대해 살펴봅니다. BX-Book-Ratings.csv 파일은 일반적인 CSV 파일과 달리 쉼표(Comma)가 아닌 쌍반점( Semicolon)로 각 속성을 구분하고 있으며 식별자인 사용자ID(User-ID), 국제표준도서번호(ISBN), 평점(Book-Rating)의 3개 속성 정보를 포함하는 1,149,780행으로 구성되어 있습니다. CSV 파일의 첫 번째 행은 도서-평점 데이터의 속성을 나타내는 헤더 행이고, 헤더 행 다음의 각 행은 한 명의 사용자가 한 권의 도서에 매긴 평점을 나타내고 있습니다.

다음은 BX-Book-Ratings.csv 파일의 일부를 보여주고 있습니다.

"User-ID";"ISBN";"Book-Rating"
"276725";"034545104X";"0"
"276726";"0155061224";"5"
"276727";"0446520802";"0"
"276729";"052165615X";"3"
"276729";"0521795028";"6"

도서-평점 데이터의 모든 속성에 대한 품질 진단 결과, 평점(Book-Rating) 속성에 대한 평점이 0인 경우가 62.28%으로 희소성(Sparsity)이 높기 때문에 '0이 아닌 값'을 가지는 데이터만 선별하여 사용할 필요가 있습니다. 여기에서는 결측치(Missing Value)에 대한 확인만 진행하며 데이터의 품질을 향상하기 위한 데이터 전처리(Data Preprocessing)는 진행하지 않습니다.

도서-평점 데이터의 모든 속성에 대한 품질 진단

명칭 속성 유형 결측치(n) 결측치(%) 고유치(n) 고유치(n/N)
사용자ID User-ID integer 0 0 105,283 0.09
국제표준도서번호 ISBN character 0 0 340,556 0.3
평점 Book-Rating character 716,109 62.28 11 0

평점 속성은 평점이 0인 경우를 포함한 1,149,780개로 0부터 10까지의 1점 단위로 증가하는 값을 가지나 '0이 아닌 값'을 가지는 데이터만 대상으로 하면 433,671개로 전체의 37.7%입니다.

1부터 10 사이의 평점 비율

범주 빈도 비율(%) 비율(%) * NA제외 순위
NA 716,109 62.3 0 1
8 103,736 9.02 23.92 2
10 78,610 6.84 18.13 3
7 76,457 6.65 17.63 4
9 67,541 5.87 15.57 5
5 50,974 4.43 11.75 6
6 36,924 3.21 8.51 7
4 8,904 0.77 2.05 8
3 5,996 0.52 1.38 9
2 2,759 0.24 0.64 10
1 1,770 0.15 0.41 11
합계 1,149,780 100 100 -

2.1.2 예제 코드 실행해보기

앞서 "데이터셋 살펴보기"에서는 각 데이터 파일의 구조 및 속성에 대해 살펴보았습니다. 이제부터는 데이터 파일과 예제 코드를 사용하여 각 데이터 파일의 구조 및 속성에 대해 한 번 더 확인해 볼 것입니다.

2.1.2.1 예제 코드 살펴보기

여기에서는 데이터 파일을 읽어 들여 확인하기 위해 JUnit으로 작성된 예제 클래스의 소스 코드를 살펴봅니다. 다음은 DatasetPrepareTest 테스트 클래스의 북크로싱 데이터셋과 무비 렌즈 데이터셋을 내려받고 압축을 해제하기 위한 downloadPublicDatasets와 북크로싱 데이터셋을 확인하기 위한 bookCrossingDataset는 테스트 메서드입니다.

DatasetPrepareTest.java

소스 코드에서 볼 수 있듯이 대부분의 코드는 테스트를 처리하기 위한 것으로 기본 흐름은 매우 단순합니다. downloadPublicDatasets 테스트 메서드는 ❶ 데이터셋을 내려받고 압축 해제를 한 번만 실행할 예정으로 실행 후에는 @Disabled 어노테이션을 주석 처리할 것입니다(10행). 먼저 ❷ 매개변수를 바꿔가면서 실행하고 결과를 확인하기 위한 CSV 형식의 인자 목록을 설정합니다(12~16행). ❸ URL을 통해 내려받은 파일을 비교 확인합니다(42~43행). ❹ 내려받은 파일의 압축을 해제합니다.

bookCrossingDataset 테스트 메서드는 먼저 ❺ 매개변수를 바꿔가면서 실행하고 결과를 확인하기 위한 CSV 형식의 인자 목록을 설정합니다(10~14행). 반복 실행되는 r4tingsDataset 메서드에서는 테스트 인자들을 매개변수로 받습니다. 다음으로 ❻ CSV 형식의 파일을 읽어 들이기 위한 옵션을 설정하고(17~23행) ❼ Dataset 유형으로 CSV 파일을 읽어 들입니다(65행).

다음으로 ❽ 읽어 들인 Dataset의 기본 정보들을 출력합니다(67~69행). ❾ parquetSave 매개변수가 true인 경우 읽어 들인 데이터를 Parquet 파일로 저장합니다(73행). 마지막으로 ❿ CSV 파일을 읽어 들인 Dataset과 저장된 Parquet 파일을 읽어 들인 Dataset의 차집합한 결과의 수가 0인지 비교 확인합니다(75행).

2.1.2.2 실행 결과 확인하기

여기에서는 앞서 살펴본 테스트 클래스인 DatasetPrepareTest 클래스의 테스트 메서드인 downloadPublicDatasets과 bookCrossingDataset의 실행 결과를 각각 살펴봅니다.

downloadPublicDatasets 테스트 메서드

다음과 같이 명령 줄 인터페이스(CLI, Command line interface)에서 빌드 도구인 Gradle Wrapper로 DatasetPrepareTest 클래스의 테스트 메서드인 downloadPublicDatasets를 실행해 봅니다.

./gradlew :recommender-examples:test --tests com.r4tings.recommender.examples.ch02.DatasetPrepareTest.downloadPublicDatasets

테스트 메서드가 실행되면 직접 계산하기에서 다룬 결과를 확인하기 위해 설정한 테스트 인자 목록을 테스트 메서드의 매개변수에 대입해가며 반복 실행되어 결과가 출력됩니다.

다음은 반복 실행 테스트를 위한 테스트 인자 목록입니다

테스트 인자 목록

URL 경로 파일명
http://www2.informatik.uni-freiburg.de/~cziegler/BX/BX-CSV-Dump.zip /dataset/Book-Crossing/ BX-CSV-Dump.zip
https://files.grouplens.org/datasets/movielens/ml-latest-small.zip /dataset/MovieLens/ ml-latest-samll.zip
https://files.grouplens.org/datasets/movielens/ml-latest.zip /dataset/MovieLens/ ml-latest.zip

예제 코드의 실행 결과는 다음과 같습니다.

예제 코드 실행 결과더보기

이 실행 결과에서 볼 수 있듯이 설정한 테스트 인자 목록에 따라 예상대로 테스트 케이스가 성공적으로 종료(PASSED)되었음을 확인할 수 있습니다.

bookCrossingDataset테스트 메서드

다음과 같이 명령 줄 인터페이스(CLI, Command line interface)에서 빌드 도구인 Gradle Wrapper로 DatasetPrepareTest 클래스의 테스트 메서드인 bookCrossingDataset를 실행해 봅니다.

./gradlew :recommender-examples:test --tests com.r4tings.recommender.examples.ch02.DatasetPrepareTest.bookCrossingDataset

테스트 메서드가 실행되면 직접 계산하기에서 다룬 결과를 확인하기 위해 설정한 테스트 인자 목록을 테스트 메서드의 매개변수에 대입해가며 반복 실행되어 결과가 출력됩니다.

다음은 반복 실행 테스트를 위한 테스트 인자 목록입니다.

테스트 인자 목록

CSV파일 경로 Parquet 저장 여부
dataset/Book-Crossing/BX-Books.csv true
dataset/Book-Crossing/BX-Book-Ratings.csv true

예제 코드의 실행 결과는 다음과 같습니다.

예제 코드 실행 결과더보기

이 실행 결과에서 볼 수 있듯이 설정한 테스트 인자 목록에 따라 예상대로 테스트 케이스가 성공적으로 종료(PASSED)되었음을 확인할 수 있습니다.

2.1.2.3 R 패키지로 확인해보기

다음은 R 패키지를 이용하여 데이터 파일을 읽어 들여 확인하기 위해 작성된 R 스크립트입니다.

DatasetPrepareTest.R

이 R 스크립트는 데이터 파일을 읽어 들이고 데이터를 확인하기 위한 방법을 설명합니다. 소스 코드에서 볼 수 있듯이 기본 흐름은 매우 단순합니다. 먼저 ❶ data.table 패키지의 fread 함수를 이용하여 CSV 유형의 도서 데이터를 읽어 들이고(15행) ❷ 읽어 들인 평점 데이터를 출력합니다(24행). 다음으로 ❸ 도서 데이터를 전달하여 dlookr 패키지의 diagnose 함수를 사용하여 변수의 타입, 결측값, 고유값을 출력합니다(18행). 도서-평점 데이터(❹❺❻)도 같은 방식으로 결과를 확인합니다.

R 스크립트의 실행 결과는 다음과 같습니다.

R 스크립트 실행 결과더보기

이 실행 결과에서 볼 수 있듯이 ❶ CSV 유형의 아이템 데이터를 읽어 들인 경과시간, ❷ 읽어 들인 도서 데이터의 출력 결과, ❸ 도서 데이터의 품질 진단 결과를 확인할 수 있습니다. 도서-평점 데이터도 같은 방식으로 확인합니다.

한글:2443 영어:4738 숫자:906

추천 시스템: 워크북

Comments

Do you have a problem, want to share feedback, or discuss further ideas? Feel free to leave a comment here! Please follow Rust's code of conduct. This comment thread directly maps to a discussion on GitHub, so you can also comment there if you prefer.

Instead of authenticating the giscus application, you can also comment directly on GitHub.