데이터 분석은 올바른 의사 결정을 돕기 위한 통찰을 제공하는 데 초점을 맞추고, 데이터 과학은 문제 해결을 위한 최선의 솔루션을 만드는 데 초점을 맞춘다고 생각하면 된다.
데이터에서 패턴 혹은 지식을 추출하는 작업
데이터를 분석하여 모델(머신러닝으로 학습한 소프트웨어 객체)을 만드는 일을 한다. 데이터를 모으고 분석하는 일이 더 중요하기 때문에 모델 과학자가 아닌 데이터 과학자라고 부른다.
구글 코랩은 주피터 노트북을 구글이 커스터마이징한 것이다.
문제에 맞는 데이터가 있으면 좋지만, 없는 상황도 종종 발생한다. 그렇게 되면 공개 데이터 세트를 찾아보아야 한다. 공공데이터포털 홈페이지 (https://www.data.go.kr/)에 접속해 [도서 판매 데이터] 를 검색한 후, [도서관 대출 데이터] 를 가져오는 방향으로 바꾼다.
국립중앙도서관이 운영하고 있는 <도서관 정보나루> 웹사이트에 접속하여 도서관 별 대출 데이터를 확인한다. 그 중 보유 도서가 많은 남산 도서관의 대출 데이터를 사용한다. (https://www.data4library.kr/openDataV?libcode=4707)
코드 출처 : https://github.com/rickiepark/hg-da
import gdown
gdown.download('https://bit.ly/3eecMKZ',
'남산도서관 장서 대출목록 (2021년 04월).csv', quiet=False)
위의 코드를 사용해 코랩에서 데이터 파일을 다운로드한다.
그리고 아래의 코드를 사용해 파일을 연다. encoding이 UTF-8이 아닌 EUC-KR 이므로 [chardet.detect] 함수를 사용하여 확인 과정 또한 거쳐야 한다.
with open('남산도서관 장서 대출목록 (2021년 04월).csv', encoding='euc-kr') as f:
print(f.readline())
print(f.readline())
판다스는 CSV 파일을 읽어 데이터프레임이라는 표 형식 데이터(tabular data)로 저장한다. 판다스에는 데이터프레임 외에 시리즈라는 데이터 구조 또한 존재한다.
시리즈는 1차원 배열, 데이터프레임은 2차원 배열로 생각하면 된다. 데이터프레임의 한 열을 선택한 경우 시리즈 객체이다.
판다스에서 CSV 파일을 읽는 경우 read_csv() 함수를 사용한다.
판다스는 CSV 파일을 읽을 때 각 열에 어떤 종류의 데이터가 저장되어 있는지를 자동으로 파악한다. 근데 메모리를 효율적으로 사용하기 위해 CSV 파일을 조금씩 나누어 읽는데, 이 때 자동으로 파악한 데이터 타입이 달라지면 경고가 발생한다. low_memory 매개변수를 False로 지정한다면 파일을 나누어 읽지 않고 한 번에 읽어 이러한 문제가 발생하지 않게 된다.
import pandas as pd
df = pd.read_csv('남산도서관 장서 대출목록 (2021년 04월).csv', encoding='euc-kr',
low_memory=False)
+) 혹은 각 열의 데이터 타입을 자동으로 파악하지 않도록 dtype 매개변수로 데이터 타입을 지정할 수도 있다.
df = pd.read_csv('남산도서관 장서 대출목록 (2021년 04월).csv', encoding='euc-kr',
dtype={'ISBN': str, '세트 ISBN': str, '주제분류번호': str})
df.head() 함수를 사용하면 데이터프레임의 처음 다섯 개의 행 확인이 가능하다.
첫 번째 열은 데이터 프레임의 인덱스이다. 판다스는 행마다 0부터 시작하는 인덱스 번호를 자동으로 붙여준다.
CSV의 첫 번째 행은 열 이름으로 인식한다. 만약 열 이름이 중복해서 등장한다면 자동으로 이름 뒤에 숫자를 붙여 고유한 이름으로 만든다.
만약 첫 행이 열 이름이 아니라면 read_csv() 함수 호출 시 header 매개변수를 None으로 지정해 열 이름이 없다는 사실을 알리고, names 매개변수를 사용해 열 이름 리스트를 따로 전달해 주어야 한다. 이 때는 열 이름에 중복된 이름이 있으면 안된다!
위에서 read_csv()를 사용해 데이터를 읽어온 것과 반대로, 판다스의 데이터프레임을 CSV 파일로 to_csv() 함수를 사용해 저장할 수도 있다. 이 함수는 기본적으로 UTF-8 방식으로 저장하기 때문에 다시 열 때 매개변수 설정이 필요가 없다.
df.to_csv('ns_202104.csv')
ns_df = pd.read_csv('ns_202104.csv', low_memory=False)
ns_df.head()
위의 코드를 실행해 데이터 프레임을 ns_202104.csv 파일로 저장한 후 다시 데이터프레임으로 출력하였다.
근데 원래 데이터의 일부가 아니었던, 행 인덱스가 함께 저장되었다.
파일에 이미 인덱스가 붙어있다는 것을 알려주려면 index_col 매개변수를 사용하면 된다. 몇 번째 열에 인덱스가 있는지를 알려주면 된다.
ns_df = pd.read_csv('ns_202104.csv', index_col=0, low_memory=False)
ns_df.head()
+) 아니면 애초에 데이터프레임을 CSV 파일로 저장 시 인덱스를 빼고 저장하는 것도 가능하다! 아래의 코드를 실행하면 된다.
df.to_csv('ns_202104.csv', index=False)
답 -> 3. encoding 매개변수에 CSV 파일의 인코딩 방식을 지정할 수 있습니다.