“도서 판매 데이터”를 이용해 신규 도서 판매량을 예측해보자.
도서 판매 데이터는 어디에서 구할까? 직접 데이터를 만들거나 공공데이터 포털 등에서 공개된 데이터셋을 찾아본다. 여기에서는 도서관 정보나루 사이트에서 ‘서울특별시교육청남산도서관 장서/대출 데이터’ 의 ‘남산도서관 장서 대출목록(2021년 04월)’ 텍스트(CSV) 파일을 이용한다.
CSV 파일은 텍스트와 콤마로 구분되어 사람은 읽기 불편하지만, 파이썬 같은 프로그래밍 언어에서는 사용하기 편하다.
CSV 파일에서 한 줄(행)은 레코드라고 하며 콤마로 구분된 여러 필드로 구성된다.
gdown 패키지를 이용해 필요한 데이터를 자동으로 코랩에 다운로드 받는다. 이 패키지는 구글 드라이브를 포함하여 웹에서 대용량 파일을 다운로드 할 수 있으며 코랩에 이미 설치되어 있다.
파일이 다운로드 받아졌으면 좌측의 ‘파일’ 을 통해 저장된 파일을 볼 수 있다. 이 파일은 코랩에서 런타임이 다시 시작 될 때마다 자동으로 삭제된다.
CSV 파일은 텍스트 파일이기 때문에 파이썬의 open() 함수로 읽을 수 있다. with 문으로 파일을 열고, readline() 매서드로 파일 내용을 한 줄씩 읽어와 출력한다. 파일 내용을 출력하기 전에 먼저 파일의 인코딩 형식을 살펴본다.
파이썬에서 chardet 패키지의 chardet.detect() 함수를 사용하면 문자 인코딩 방식을 알아낼 수 있다.
위 함수를 실행하여 인코딩 형식이 ‘EUC-KR’이라는 것을 알아냈다. 참고로 파이썬의 open() 함수는 기본적으로 텍스트파일이 UTF-8 형식이라고 가정하고 실행된다. 하지만 한글은 대부분 EUC-KR 형식을 사용하기 때문에 파일 내용을 읽기 전에 인코딩 형식을 확인하도록 하자.
open() 함수로 파일을 읽을 때 encoding 매개변수로 인코딩 형식을 위에서 알아낸 형식으로 지정하면 된다.
원본 데이터의 처음 두 줄을 출력해 보았다. 첫 번째 줄은 CSV 파일에 있는 각 항목의 이름이다.
판다스는 파이썬으로 데이터를 분석할 때 사용하는 파이썬 패키지다. 판다스에서는 두 가지 데이터 구조를 제공한다.
CSV 파일을 읽어 데이터프레임이라는 표 형식 데이터로 저장한다. 데이터프레임 형식은 엑셀처럼 행과 열 구조로 이루어져 있다.
데이터프레임은 2차원 배열(리스트)과 비슷하다. 열마다 다른 데이터 타입을 사용할 수 있다. 하지만 같은 열에 있다면 모두 동일한 데이터 타입이어야 한다.
판다스의 시리즈는 1차원 배열과 비슷한 구조이다. 이때 시리즈에 있는 데이터들은 모두 같은 종류여야 한다.
CSV 파일을 데이터프레임으로 읽기
판다스에서 CSV 파일을 읽어올 때는 read_csv() 함수를 사용한다. 판다스를 임포트 후 파일을 읽어오자.
실행창에서 경고가 발생했다. 판다스는 CSV 파일을 읽어올 때 같은 열에 어떤 종류에 데이터가 있는지 자동으로 파악한다. 하지만 동시에 메모리를 효율적으로 사용하기 위해 CSV 파일을 나눠서 읽기 때문에 이때 자동으로 파악한 데이터 타입이 달라져 경고가 발생한 것이다.
해결 방법은 low_memory 매개변수를 False 로 지정해서 파일을 나누어 읽기 않고 한 번에 읽는 것이다.
데이터의 내용을 확인하기 위해서는 head() 메서드를 이용한다.
첫 번째 열은 인덱스라고 한다. 판다스는 행마다 0부터 시작하는 인덱스를 자동으로 붙여준다. 그리고 CSV의 첫 번째 행을 열 이름으로 인식한다.
만약 첫 행이 열 이름이 아니라면 read_csv() 함수를 호출할 때 header 매개변수를 None으로 지정하고, names 매개변수에 열 이름 리스트를 전달한다.
데이터프레임을 CSV 파일로 저장하기
데이터프레임을 CSV로 저장할 때는 to_CSV() 매서드를 사용한다. 기본적으로 utf-8 형식으로 저장하기 떄문에 나중에 open() 함수로 파일을 읽을 때 따로 인코딩 형식을 지정할 필요가 없다.
저장한 파일을 다시 open() 함수로 읽어봤더니 데이터프레임 맨 왼쪽 열에 데이터프레임의 인덱스가 같이 저장되었다. csv 파일에 인덱스가 이미 있다는 것을 알려주기 위해 index_col 매개변수를 사용해서 중복되는 열을 지운다.
또 다른 방법으로는 데이터프레임을 CSV 파일로 저장할 때 처음부터 인덱스를 빼고 저장하는 방법도 있다. 아래처럼 to_csv() 메서드에 index 매개변수를 False로 설정한다.