프로젝트 17

데이터 수집 (웹 크롤링) (3) - 경기 세부 데이터

크롤링을 진행하는 방법은 크롤링(1) 포스트와 크롤링(2) 포스트에서 자세히 다루었다. 크롤링(2) 포스트의 마지막에서 얘기했듯이 이번 포스트에서는 두 번째 크롤링에서 수집한 데이터를 이용해서 세 번째 크롤링을 수행하려고 한다. (1) 수집할 태그 찾기 이번에는 아래의 웹 페이지에서 데이터를 모을 예정이다. url을 보면 "https://m.sports.naver.com/game/20211016018F2/record" 의 형태로, 공통부분 뒤의 '경기날짜(20211016)+018(리그 고유번호이다. 18번째 리그라는 뜻)+F(여자부)+경기번호' 가 경기마다 바뀌는 내용이다. 바로 이것 때문에 이전 포스트에서 데이터를 수집할 때 가공된 새 날짜와 경기 번호 데이터를 저장한 것이다. 한 경기에서의 세부 기록..

데이터 수집 (웹 크롤링) (2) - 경기 데이터

예측 모델을 만들어보려고 하는데 기존에 모았던 데이터로는 모델을 만들기에 적합하지 않다고 판단했다. 그래서 경기 관련 데이터를 추가로 수집했는데 이번 포스트에서는 그 내용을 담아보려고 한다. 자세한 크롤링 방법은 이전 포스트를 참고하면 된다. (1) 수집할 데이터 담은 태그 찾기 저번과 같은 방식으로 크롤링을 할 것이기 때문에 먼저 url과 태그를 살펴보도록 하겠다. 크롤링을 수행할 페이지는 다음과 같다. KOVO 공식 홈페이지의 경기 결과 페이지이다. 페이지를 살펴보면 경기 날짜, 경기 번호(순번), 경기를 치른 두 팀, 경기 결과, 경기가 진행된 라운드(정규리그는 총 6라운드로 구성된다.)의 데이터를 볼 수 있다. url은 "https://www.kovo.co.kr/game/v-league/(생략)s..

[다람쥐 창고] 기능 세부 설명

저번 포스트에 작성했다시피 취미 물품 공유 서비스를 구현하기 위해서는 다양한 기능이 필요하다. 이번 포스트에서는 기획 단계에서 간단하게 얘기했던 서비스의 실제 이용 과정을 담아보았다. 먼저, 앱에 접속하면 스플래시 화면을 거쳐 회원가입/로그인 화면을 띄운다. 회원이 아니라면 회원가입을 하고 회원이라면 로그인을 한 후 본격적으로 서비스를 시작할 수 있다. 가장 처음 보이는 화면은 메인페이지로 최신 업데이트 물품과 추천 물품, 추천 카테고리를 볼 수 있다. 메인페이지에서는 사진을 위주로 보여주고 더보기 버튼을 눌러 해당 물품들을 목록으로 볼 수 있다. 또한 검색을 하거나 지도 창을 열어 주변 물품을 볼 수 있으며 글쓰기 창, 채팅 목록, 마이페이지, 더보기 창으로 이동할 수 있다. 글쓰기 창에서는 카메라나 ..

[다람쥐 창고] 프로젝트 기획

졸업 프로젝트로 진행했던 다람쥐 창고 프로젝트에 관한 내용을 기록으로 남겨두려고 한다. 어떤 의도로 기획하게 되었는지, 어떤 단계로 프로젝트가 진행되었는지가 주 내용이 될 것 같다. (1) 기획 의도 프로젝트 주제를 두고 아이디어 회의를 하다가 P2P 공유 서비스를 기획해보자는 의견이 나왔고 이를 발전시켜서 취미 물품을 지역 기반으로 공유하는 플랫폼을 고안하게 되었다. 여러 취미 활동들 중에 별다른 도구가 필요하지 않은 경우도 있지만 대부분의 경우에는 취미를 위한 도구들이 필요하다. 하지만 어떤 취미를 시작하기 위해 모든 도구를 갖추고 시작하기란 쉽지 않기 때문에 이를 지역 주민들끼리 공유하도록 하는 것이다. 프로젝트 이름은 집 한켠에 잠들어있는 취미 물품을 다람쥐가 겨울을 위해 저장해뒀다가 잊어버린 식..

데이터 전처리 - 결측값 처리

지난 포스트에서는 크롤링으로 수집한 데이터를 통해 선수의 공격과 수비 지표로 쓸 수 있는 공격 성공률, 리시브 효율, 세트당 서브/세트/블로킹/디그 수 등을 구했다. 하지만 공격 지표 중에는 공격 성공률 뿐 아니라 공격이 얼만큼의 효과를 냈는지 보는 '공격 효율' 또한 중요하다. 공격 효율은 (공격 성공-공격 범실)/공격 시도 로 구한다. 그러나 크롤링 당시 전체 범실 개수만 저장하고 공격에서의 범실은 저장하지 않아서 추가로 공격 범실 데이터가 필요했다. ( 데이터 새로 얻는 과정은 생략 ) 새롭게 얻은 데이터이다. 이제 기존에 작성했던 코드 중 공격 효율(at_rate)을 계산하는 부분을 추가한다. 공격 성공률, 공격 효율, 리시브 효율은 모두 백분율이므로 이전에 전처리 할 때 놓쳤던 백분율 변환 부분..

데이터 전처리 - PySpark에서 SQL 사용하기

저번 포스트에서 설명했듯이 이번 프로젝트에서는 배구 선수들의 능력치를 통해 팀 별 경기에서 어떤 팀이 승리할지를 예측하는 모델을 만들 것이다. 그러기 위해서는 선수 능력치를 판단할 수 있는 지표가 필요한데, 이전에 모았던 단순 데이터로는 한 눈에 파악하기 어렵다. 현재 데이터의 컬럼에는 이름, 소속 팀, 포지션, 총 점수 외에도 공격 시도, 공격 성공, 리시브 시도, 리시브 정확, 리시브 실패, 서브 성공, 세트 성공, 블로킹 성공, 디그 성공 이 있다. 이 중 공격 지표로 사용할 수 있는 공격 성공률과 수비 지표로 사용할 수 있는 리시브 효율을 구하고, 참여한 세트 수를 통해 세트당 서브, 세트, 블로킹, 디그 개수를 구해서 새롭게 데이터를 만들 것이다. 위의 내용으로 데이터 전처리를 해 볼 텐데, 어..

프로젝트 설명 & 데이터 수집 (웹 크롤링), 저장 - 선수 데이터

새롭게 시작하는 프로젝트는 스포츠 데이터 분석 프로젝트로, 스포츠 중 여자배구의 데이터를 분석해보려고 한다. 프로젝트의 큰 목표는 선수들의 경기 기록 데이터를 통해 능력치를 구하고, 어떤 두 팀이 경기를 치른다고 가정할 때 포지션 별로 선수를 지정하면 어느 팀이 승리할지 예측하는 것이다. 프로젝트의 진행 과정을 담을 것이기 때문에 배구의 자세한 룰 설명은 생략하도록 하겠다. 선수의 경기 기록 데이터에는 크게 공격, 서브, 세트, 블로킹, 리시브, 디그 내용이 포함되어 있다. 각 포지션 별로 중요하게 여겨지는 항목이 조금씩은 다르지만 위 항목들을 토대로 선수의 역량을 측정한다. 데이터를 분석하기 위해서 가장 먼저 해야 할 일은 분석할 데이터를 마련하는 일이다. 데이터를 마련하려면 여러 방법이 있겠지만 이미..

프론트와 연결하기 (3) - 이미지 로드 시 404 에러 해결

프론트엔드인 리액트와 백엔드인 장고를 연동할 때 리액트의 build 배포 파일들을 이용해보려고 프로젝트 초기부터 여러 문서들을 찾아보며 고군분투 했었다. 그랬다가 결국 그 방법을 사용하는 것은 멈춰두고 기능들을 먼저 구현하다가 얼마 전에 프로젝트를 모두 끝내고 서버에 등록하려고 다시 시도해보던 상황이었다. ( 자세한 과정은 이전 글 참고 > https://edorrr.tistory.com/18 ) 프로젝트 완성 당시에 배포 버전에서 발생하던 오류는 크게 두 가지였다. [1] 글쓰기를 마친 후 띄우는 서평 확인 페이지와 서평 목록을 볼 수 있는 서평 공간 페이지가 흰 창으로 뜨는 오류 [2] 웹페이지에서 사용하는 이미지 파일들의 404 not found 오류 먼저 첫 번째 오류는 프론트엔드 담당 팀원이 해..

서평 작성 기능을 마치며

오늘로서 '고양이와 책을' 프로젝트의 서평 작성 관련 기능을 모두 마쳤다! 로그인, 회원 정보, 검색, 서평 작성 의 기능들을 가진 프로젝트였는데 그 중 나는 서평 작성 기능을 맡았고 서평의 CRUD, 즉 작성하고(Create) 불러오고(Read) 수정하고(Update) 삭제하는(Delete) 기능을 모두 구현했다. 장고 프레임워크를 처음 사용해보는거라 잘 할 수 있을까 하는 마음도 들었지만 모르는만큼 열심히 공부하며 프로젝트를 진행하고 나니 끝내고 나서는 뿌듯한 마음이 남는다. 한 달 반의 길다면 길고, 짧다면 짧은 시간동안 프로젝트를 진행하면서 (글은 성공한 경우만 작성하다보니 내용이 많지는 않지만) 각종 시행착오와 오류들을 겪으면서 장고와 리액트에 관해 한 발짝 나아갈 수 있었다. 프론트엔드 툴인 ..

서평 작성 (5) - 서평 수정하고 삭제하기 (PUT, DELETE)

저번 포스트에서는 서평을 작성하고 불러오는(조회하는) 함수를 작성했다. 이번에는 CRUD 중 Update, Delete 기능을 구현하는 PUT, DELETE 함수를 작성해보려고 한다. 기본 구조는 이전에 작성한 포스트에서 확인할 수 있다. (1) app/urls.py 수정 post, get 과 마찬가지로 호출되는 url 을 함수와 연결한다. path('edit/', views.ReviewView.as_view()), path('delete/', views.ReviewView.as_view()) (2) app/views.py 파일에 함수 작성 APIView 클래스를 상속받아 작성한 클래스 안에 put, delete 함수를 작성한다. ... def put(self, request): data = reques..