새로운 프로젝트를 시작하면서 머신러닝 기능을 구현해야 했습니다. 정확한 결과를 도출하기 위해 데이터 분석과 가공이 필수적이었고, 이를 위해 데이터 분석 기초와 Pandas 사용법을 정리했다.
'혼자 공부하는 데이터분석 with 파이썬'과 코랩을 사용해서 공부했습니다.
데이터분석
유용한 정보를 발견하고 결론을 유추하거나, 의사 결정을 돕기 위해 데이터를 조사, 정제, 변환, 모델링하는 과정으로 비즈니스 결정을 과학적으로 내리기 위한 도구로 사용된다.
CSV
한 줄이 레코드이며, 콤마(,)로 구분된 텍스트 파일이다.
CSV 파일 읽기
한글로 된 CSV파일일 경우 글자가 깨져서 나오는 경우가 있다. 이 경우는 인코딩이 비트값으로 16진수로 되어 있어 발생하는 문제이다.
해당 파일의 인코딩 형식을 확인하고 출력하는 것이 좋다.
import chardet
with open('파일이름.csv', mode='rb') as f:
d = f.readline()
print(chardet.detect(d))
#출력 : {'encoding': 'EUC-KR', 'confidence': 0.99, 'language': 'Korean'}
chardet 패키지는 파일의 인코딩 방식을 감지하는 데 유용하다. 특히 한글 파일에서 자주 발생하는 깨짐 문제를 해결하는 데 사용된다.
with open('파일이름.csv', encoding='EUC-KR') as f:
print(f.readline())
한 줄씩 출력이 가능하며 데이터가 많을 경우 사용한다.
Pandas
주로 데이터 분석에서 사용하는 패키지로, 표 형식 데이터를 위한 편리한 도구를 제공하는 파이썬의 데이터분석 패키지이다.
pd로 줄여서 많이 사용한다.
- 데이터프레임 : 엑셀과 같은 구조로 행 row, 열 column 구조로 이루어져 있다.
- 시리즈 : 1차원 배열구조로 열과 같인 같은 데이터타입을 가진다.
사용하기
read_csv()
csv를 읽을 때 사용하며,
import pandas as pd
# 데이터프레임을 만든다.
df = pd.read_csv('파일이름.csv', encoding='EUC-KR', low_memory=False)
# 데이터프레임의 처음 다섯 개의 행을 반환한다.
df.head()
- encoding 메서드를 이용해 한글로 된 파일이라고 명시해 준다.
- low_memory 메서드를 통해 column에서 발생한 문제를 해결이 가능하며 dtype 메서드를 통해서도 변경이 가능하다.
- heder 메서드를 통해 첫 줄의 ‘열 이름’이 없다는 것을 알려줄 수 도있고, names 메서드를 통해 추가도 가능하다.
이미 인덱스 번호가 있는 경우에는 index_col 매서드를 이용하면 된다. 몇 번째 열이 인덱스인지 설정해 주면 된다.
pd.read_csv('파일이름.csv', low_memory=False, index_col=0)
데이터프레임 저장하기
df.to_csv('파일이름.csv',index=False)
index 매써드 없이 저장할 경우 기존의 인덱스 번호까지 저장이 된다.
데이터 호출하기 : API
API는 프로그램 간 데이터를 전달하기 위해 정해진 규칙으로 공개 API를 사용하여 데이터 수집과정을 자동화가 가능하다.
requests 패키지를 이용해서 데이터를 가져오며, 직접 URL에 쿼리 스트링을 이용해 넣는 방법도 있지만 Params를 통해 추가해도 된다.
- 일단 "도서관 정보나루"에서 2024년 5월에 20대 인기 대출도서를 JSON 타입으로 가져왔다.(XML 형식도 있다)
url = "http://data4library.kr/api/loanItemSrch"
params ={
"format":"json",
"startDt":"2024-05-01",
"endDt":"2024-05-30",
"age":"20",
"authKey":"인증키"
}
r = requests.get(url, params=params)
r.json()
"""
출력
{'response': {'request': {'startDt': '2024-05-01',
'endDt': '2024-05-30',
'age': '20',
'pageNo': 1,
'pageSize': 200},
'resultNum': 200,
'numFound': 5000,
'docs': [{'doc': {'no': 1,
'ranking': '1',
'bookname': '물고기는 존재하지 않는다 :상실, 사랑 그리고 숨어 있는 삶의 질서에 관한 이야기 ',
'authors': '룰루 밀러 지음 ;정지인 옮김',
'publisher': '곰출판',
'publication_year': '2021',
'isbn13': '9791189327156',
'addition_symbol': '03400',
'vol': '',
'class_no': '490.99',
'class_nm': '자연과학 > 동물학 > 동물학',
'loan_count': '467',
'bookImageURL': 'https://image.aladin.co.kr/product/28465/73/cover/k092835920_1.jpg',
'bookDtlUrl': 'https://data4library.kr/bookV?seq=6360937'}},
{'doc': {'no': 2,
...
"""
JSON 형태로 출력되며 'response'에 'docs'에서 책 목록을 가져올 수 있다.
가져온 데이터 Pandas의 DataFrame으로 변경
가져온 json 데이터를 DataFrame으로 변경하기 위해 리스트형식으로 변경해 준다.
books = []
for doc in data['response']['docs']:
books.append(doc['doc'])
그리고 판다스의 데이터프레임으로 변경해 주고 json 파일로 저장해 준다.
import pandas as pd
books_df = pd.DataFrames(books)
books_df.to_json('20s_best_book.json', force_ascii=False)
force_ascii를 False로 설정하여 한글문자 그대로 저장하게 하는 설정값이다.
데이터프레임 행과 열 선택하기
데이터프레임에서 원하는 열을 선택해서 특정 열의 데이터만 출력이 가능하다.
books = books_df[['no','ranking','bookname','authors','isbn13']]
books.head()
이런 식으로 원하는 열의 데이터만 선택해서 추출이 가능하다.
loc 메서드를 이용하는 방법
loc 메서드를 사용해 원하는 행과 열을 선택할 수도 있다.
- 첫 번째 매개변수 : 행 인덱스
- 두 번째 매개변수 : 열 이름을 리스트로 전달한다.
books = books_df.loc[[0,1],['no','ranking']]
위와 같은 방법으로도 출력이 가능 하지만 슬라이스 연산자(:)를 통해서도 추려이 가능하며, 스탭 지정도 가능하다.
books = books_df.loc[0:5, 'no':'isbn13']
books = books_df.loc[:5:2, 'no':'isbn13':2] # 스탭지정으로 하나씩 건너뛰면서 행을 선택
열의 경우 iloc 매서들를 사용해 인덱스로도 출력이 가능하다.
마무리
데이터 분석을 공부하며 데이터를 가공하고 분석하는 기초를 다질 수 있었다. 이를 통해 가공된 데이터를 백엔드에서 효율적으로 활용할 수 있는 방안을 모색하고, 데이터를 효과적으로 활용하는 경험은 나의 역량을 더욱 키우는 데 큰 도움이 될 것이라 생각한다.