반응형

 

[open api]공공데이터 api를 사용한 데이터 추출_태풍정보 조회 서비스(1. open api 자료 검색 및 활용신청)

 

https://beaver-sohyun.tistory.com/62?category=864438

 

[open api]공공데이터 api를 사용한 데이터 추출_태풍정보 조회 서비스(2. 참고문서 확인 및 open api 사용 및 태풍정보 확인)

 

https://beaver-sohyun.tistory.com/63?category=864438

 


 

 

5-3. 태풍정보목록조회

 

태풍정보목록조회_상세기능정보

 

태풍정보목록조회는 발표시각을 이용하여 통보문발표시각, 태풍번호, 통보문발표호수, 제목 정보를 조회하는 기능입니다. 

 

call back url : apis.data.go.kr/1360000/TyphoonInfoService/getTyphoonInfoList

이 링크에 요청 메시지 명세를 넣어 요청하게 되면 원하는 값을 얻을 수 있습니다.

 

요청 메시지 명세

요청 메시지 명세를 넣은 url 예시입니다.

apis.data.go.kr/1360000/TyphoonInfoService/getTyphoonInfoList?serviceKey=인증키&pageNo=페이지 번호&numOfRows=한 페이지 결과수&dataType=응답자료형식(XML/JSON)&tmFc=발표시각&

 

 

call back url에 본인이 얻고자 하는 값들을 넣어 요청하게 된다면 아래와 같은 응답 메시지 명세를 얻을 수 있습니다. 

 

응답 메시지 명세

태풍번호와 통보문 발표 호수 그리고 제목을 알 수 있습니다.

 

이제 이 정보들을 실제로 확인해보기 위해 20.09.02에 태풍을 발령했었는데 그 때 태풍정보목록을 조회해보도록 하겠습니다. 

 

 

# 제공되는 데이터의 범위는 현재일자로부터 3일 이내의 것으로 함

 

요청 메시지 URL

apis.data.go.kr/1360000/TyphoonInfoService/getTyphoonInfoList?serviceKey=인증키&pageNo=1&numOfRows=10&dataType=XML&tmFc=20200902&

 

 

저는 한 페이지의 결과 수를 10으로 설정했기 때문에 한 페이지 내에 총 10개의 결과물이 나와야하지만 9월 2일 날에는 9개의 태풍정보가 있었기 때문에 9개가 출력되었습니다.

 

아래는 9개의 태풍정보 중 일부분입니다.

 

20.09.02의 태풍정보조회

 

위와 같이 9월 2일 당일날 아침부터 자정까지 발령됐던 태풍의 정보와 시간, 태풍번호, 통보문 발표 호수를 알 수 있었습니다.

 

이 날에는 하루종일 태풍 경로가 울렸습니다. 눈으로 직접 확인해보니 정말 하루종일 태풍 알림이 있었다는 것을 알 수 있었습니다.

 


 

 

5-4. 태풍예상정보조회

 

태풍예상정보조회_상세기능정보

태풍예상정보는 통보문 발표 시각, 태풍번호를 이용하여 태풍분석 시각, 위도, 경도, 70% 확률반경, 최대풍속(m/s), 중심기압(hPa), 태풍예상 문구(한글), 15m/s 반경(강풍반경), 진행방향, 진행속도(km/h), 15m/s 예외방향, 15m/s 예외반경, 통보문 발표 시각, 태풍번호 정보를 조회하는 기능입니다.

 

call back url : apis.data.go.kr/1360000/TyphoonInfoService/getTyphoonFcst

url에 요청 메시지 명세에 맞는 값들을 넣어 요청하면 원하는 결과를 얻을 수 있습니다.

 

 

요청 메시지 명세

 

 

요청 메시지 명세를 넣은 url 예시입니다.

apis.data.go.kr/1360000/TyphoonInfoService/getTyphoonFcst?serviceKey=인증키&pageNo=페이지번호&numOfRows=한 페이지 결과 수&dataType=응답자료형식(XML/JSON)&tmFc=발표시각(년월일시분)&typSeq=태풍번호&

 

call back url에 본인이 얻고자 하는 값들을 넣어 요청하게 된다면 아래와 같은 응답 메시지 명세를 얻을 수 있습니다. 

 

 

 

응답 메시지 명세

 

 

# 제공되는 데이터의 범위는 현재일자로부터 3일 이내의 것으로 함

 

요청 메시지 URL

http://apis.data.go.kr/1360000/TyphoonInfoService/getTyphoonFcst?serviceKey=인증키&pageNo=1&numOfRows=10&dataType=XML&tmFc=202009021300&typSeq=9&

 

 

저는 여기서 제가 위에 태풍정보목록조회를 통해 얻은 결과를 참고해 사용했습니다.

 

태풍정보목록조회_20.09.02

 

발표시각에는 20.09.02를 적어 태풍이 실제 발생했던 날을 적었고 시간은 13:00, 태풍번호는 9번을 적었습니다.

 

 

 

저는 한 페이지의 결과 수를 10으로 설정했기 때문에 한 페이지 내에 총 10개의 결과물이 나와야하지만 5개의 태풍예상정보가 나왔습니다.

 

 

 

9월 2일 13시 통보문 발표 시각을 바탕으로 9월 3일 18시에 태풍분석.

 

sq는 이동속도로 59km/h, radPr, rad25, rad15는 79%의 확률반경, 폭풍반경, 강풍반경을 나타냅니다.

fclocko는 태풍예상 문구로 청진 북서쪽 약 300km 부근 육상한다고 태풍을 예상했습니다.

 

 

 

 

이런식으로 9월 2일 13시 통보문 발표 시각을 바탕으로 각 시간에 분석한 결과를 보여줬습니다.

태풍의 예상경로를 알 수 있어 미리 태풍에 대해 대비할 수 있는 것이 좋다고 생각했습니다.

 

추후에는 시골, 바다와 인접, 바람이 많이 부는 곳, 정보를 쉽게 접할 수 없는 지역에 앱을 이용하여 태풍 예상 경보 알람을 만들어 배포하는 것도 좋다고 생각했습니다. 

 

 


 

 

6. open api 에러 코드 정리

 

open api 에러 코드 정리

 

가끔씩 URL을 입력했을 때 에러가 발생하는 경우가 있습니다. 이때는 당황하지마시고 여기 있는 에러 코드들을 한 번 보시고 에러에 해당하는 사항을 확인 후 조치해 주시면 잘 나올겁니다!

 

그래도 안되시면 공공데이터포털에 문의 남기시면 담당자분들이 빠르게 답변해드리니 문의게시판도 활용해보시는걸 추천드립니다!

 

저는 다행이 에러가 나지않아 에러에 대한 실제 자료는 첨부하지 못하고 에러 코드에 대한 내용을 첨부합니다!

 


 

후아 이렇게 확인해보니 신기하기도 하고 재미있기도하네요ㅋㅋㅋ!!

이건 보기만 하는게 아니라 직접 해보시면 더 재미있어요!

한 번쯤 시간 되실 때 해보시는거 추천드려요! 전공자가 아닌 일반인들도 쉽게 하실수있고 첨부문서 확인하면서 하면 괜찮을거에요.

이제는 빅데이터 시대에 본인이 원하는 정보는 스스로 잘 구별하여 찾는게 중요한데 이 자료들은 모두 국가에서 관리하는 데이터이기 때문에 자료도 방대하고 정확해서 좋은 것 같아요!

 

긴글 읽어 주셔서 감사드립니다.

 

오늘도 내일도 매일매일 행복한 하루 보내시길 바래요!

반응형
반응형

[open api]공공데이터 api를 사용한 데이터 추출_태풍정보 조회 서비스(1. open api 자료 검색 및 활용신청)

 

https://beaver-sohyun.tistory.com/62?category=864438

 

 


 

 

이제 api 활용신청도 했고 인증키도 발급받았으니 실전으로 들어가겠습니다!

 

 

 

4. 참고문서 다운받기

그전에 '태풍정보 조회서비스'목록에서 참고문서 보셨나요?

태풍정보 조회서비스

맨 하단에 '기상청22 태풍정보 조회서비스 오픈API활용가이드v2.docx'이 참고문서를 다운받아줍니다!

 

한마디로 api를 사용하는 방법과 데이터의 정보에 대해서 알려주는 문서입니다.

 

 


 

5. 참고문서 정보 확인 및 인증키 확인

open api 활용가이드
참고문서 목차

 

파일을 클릭해보시면 'open api 할용가이드'라고 적혀진 파일을 받아보셨을겁니다. 이제 차근차근 내려가면 확인해보도록하죠!

 


5-1. 전체적인 api 서비스 개요

 

 

상세기능정보 선택

저희가 활용신청과정에서 상세기능정보 선택하신게 기억이 나시나요? '태풍정보 조회서비스'가 총 3가지의 데이터를 제공하고있는데 저는 3개 모두 선택을 했기 때문에 발급받은 인증키로 저 세 개의 데이터를 모두 활용할 수 있다는 뜻입니다.

 

 

태풍정보 조회서비스

 

이 자료는 태풍정보 조회서비스로 태풍정보, 태풍정보목록, 태풍예상정보를 조회하는 서비스 입니다.

 

보시면 서비스 인증방법이 '서비스 key'라고 되어있는데 이 말은 서비스 key만 있으면 된다는 표시입니다. 또한 교환 데이터 표준은 XML을 제공한다고 되어있습니다. 인터페이스 표준은 'REST(GET, POST, PUT, DELETE) 방식으로 요청하라고 나와있습니다. 메시지 교환 유형은 Request-Response라는 것을 알 수 있습니다.

 

 

상세기능 목록

 

서비스 URL을 보시면 이렇게 적혀있는데 apis.data.go.kr/1360000/TyphoonInfoServic/정보를 얻고자 하는 상세기능명

typhooninfoservic/여기에 저 3가지 정보들 가운데 본인이 얻고자 하는 데이터의 영문을 넣어서 url을 요청하면됩니다.

 

 


 

5-2. 태풍정보조회

상세기능정보

태풍정보조회 데이터는 통보문 발표 시각을 이용하여 태풍 경로 이미지, 태풍번호, 통보문 발표 호수, 태풍시각, 위도, 경도 등등 정보를 태풍의 정보를 조회하는 url입니다.

 

call back url : apis.data.go.kr/1360000/TyphoonInfoService/getTyphoonInfo

이 링크에 값을 넣어서 요청하면 원하는 자료를 응답받을 수 있습니다. 

 

여기서 gettyphooninfo는 아래 요청 메시지 명세에 대한 정보를 입력해서 넣으면 됩니다.

 

요청 메시지 명세

예시로는 

http://apis.data.go.kr/1360000/TyphoonInfoService/getTyphoonInfo?serviceKey=인증키&numOfRows=한 페이지 결과수&pageNo=페이지 번호&dataType=응답자료형식(XML/JSON)&fromTmFc=통보문발표시각(년월일)&toTmFc=통보문발표시각(년월일)

 

이런식으로 info부분에 요청 메시지 명세에 대한 값들과 함께 적으면 됩니다.

 

그 후에 링크를 검색하면 결과가 나오게되는데 결과를 보기전에 어떤 결과가 나오는지 목록을 확인해봤습니다.

 

응답 메시지 명세

 

 

 

요청 메시지 명세에 대한 응답으로 이렇게나 많은 종류의 메시지들이 출력됩니다.

 

이제 실제로 제가 발급받은 인증키를 해당 값에 응답 메시지 받았봤습니다. 

 

http://apis.data.go.kr/1360000/TyphoonInfoService/getTyphoonInfo?serviceKey=발급받은인증키 &numOfRows=10&pageNo=1&dataType=XML&fromTmFc=20200831&toTmFc=20200903

 

 

# 제공되는 데이터의 범위는 현재일자로부터 3일 이내의 것으로 함

 

저는 태풍이 발령됐던 2020.08.31~2020.09.03까지의 태풍조회를 해봤습니다.

 

 

총 10개의 태풍이 조회가 되었습니다.

 

20.08.31~20.09.03까지의 기간 중 일부 예시
20.08.31~20.09.03까지의 기간 중 일부 예시
20.08.31~20.09.03까지의 기간 중 일부 예시

 

위에서 봤던 응답 메시지의 명세를 포함한 정보가 나왔습니다.

 

통보문 발표 시각을 이용하여 태풍번호, 태풍예상 문구, 위도, 경도, 강풍반경, 폭풍반경, 진행방향, 이동속도 등 태풍의 정보를 조회해 봤습니다. 

 

 


남은 2개도 작성하려고 했지만 내용이 길어지면 보기에 불편하실수도 있기에 다음 포스팅에서 작성하려고합니다. 

 

이제 참고문서의 내용과 방법을 조금 아셨나요? 다음 포스팅에서는 남은 2가지 항목들과 에러사항이 발생했을 때에 대해서 포스팅하겠습니다.

 

긴글 읽어 주셔서 감사드립니다.

 

오늘도 내일도 매일매일 행복한 하루 보내시길 바래요!

 

 

 

[open api]공공데이터 api를 사용한 데이터 추출_태풍정보 조회 서비스(3. 태풍정보목록조회, 태풍예상정보조회, 에러사항 발생시)

 

https://beaver-sohyun.tistory.com/65?category=864438

 

반응형
반응형

안녕하세요~ 활발하게 활동중인 작은 비버입니다.

 

오늘은 공공데이터 포털을 이용한 open api사용법에 대해 포스팅 하려고 합니다!

 

점점 아이디어가 고갈 중입니다.. 다음엔 뭘 올려야하지..? 정처기 공부 중인데 그 내용을 올려야 하나..?

근데 사실 저 아직까지 공부 1도 안하고 있습니다ㅋ

 

어쨌든 오늘은 공공데이터포털에서 open api를 사용한 데이터 추출입니다.

 

저는 공공데이터포털을 참 좋아합니다. 제가 필요한 데이터들이 거의 다 있기때문이죠! 그리고 찾아보면 신기한 데이터도 많아요!!

 

오늘은 open api를 사용해서 태풍 정보를 조회해보려고 합니다. 요즘 태풍때문에 많은 분들이 피해를 보고있는데요. 정말 자연앞에서는 아무것도 할 수 없는게 참 무력합니다...

 

 

이 포스팅은 제가 예전에 공공데이터포털을 이용해 처음으로 opne api를 사용한 포스팅입니다.

https://beaver-sohyun.tistory.com/38

 

공공데이터 API를 사용한 데이터 추출

안녕하세요, 작은 비버입니다! 오늘은 새로운 카테고리인 '작은 비버의 과제 수행'으로 찾아뵙게 되었습니다. 이 카테고리에서는 제가 개인적으로 공부한 내용이나 과제로 수행했던 내용에 대��

beaver-sohyun.tistory.com

 

 


 

 

1. 공공데이터 포털에 접속하기

https://www.data.go.kr/index.do

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr


공공데이터 포털에 접속하니 메인에 프로젝트 광고가 있네요!

관련 전공자 분들은 한 번 참여해 보시면 좋을 것 같아요!

https://www.data.go.kr/bbs/ntc/selectNotice.do?pageIndex=1&originId=NOTICE_0000000001781&atchFileId=FILE_000000002286267&searchCondition2=2&searchKeyword1=

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

 

2020년 하반기 공공데이터 활용 창업 지원 협업 프로젝트

 


 

 

공공데이터포털 메인은 진짜 봐도봐도 좋아요. 제가 파란색을 좋아해서 그런가? 전 이렇게 깔끔하게 딱 보기 쉽게 정리된 것을 좋아합니다.

 

공공데이터포털 메인

 

 


 

 

2. 검색창에 검색으로 본인이 찾고자 하는 데이터 검색

저는 '태풍'이라고 검색했습니다.

 

 

검색창에 '태풍'검색

- 검색창에 검색하면 태풍과 과련된 내용이 총 21개 검색되었다고 알려주고 그 밑에 카테고리별로 몇개가 검색됬는지도 자세히 나옵니다!

 

저는 여기서 opne api를 사용하려고 하기 때문에 오픈api 클릭!

 

 

 

open api의 태풍 데이터

 

open api의 태풍 자료에는 제가 보려고 하는 '태풍정보 조회서비스'가 있습니다.

저는 이것을 클릭클릭

 

 


 

 

3. 활용 신청 및 참고 자료 확인

open api상세

 

태풍정보 조회서비스를 클릭하면 위와 같이 해당 자료의 정보가 나옵니다.

분류체계, 제공기관, 관리부서명, 관리부서 전화번호 등등

 

더 궁금하신 점은 직접 문의하시면 될 것 같아요!

 

저는 이렇게 정보를 확인하고 open api를 사용하기 위해 우측 상단에 있는 '활용신청'버튼을 눌렀습니다.

 

 

 

3-1. 활용신청 방법

 

버튼을 누르면 이와 같은 화면이 나옵니다. 본인이 이 데이터를 어디에 사용할지 활용목적 선택을 하시면 됩니다.

open api 개발계정 신청

 

저는 '참고자료'를 선택했습니다. 첨부파일은 본인이 연구, 앱개발, 웹 사이트 개발이라면 그에 따른 증빙자료를 첨부하시면 될 것 같아요.

 

시스템유형 선택

 

그 밑에 시스템유형 선택! 저는 '일반'선택을 했습니다. 서버구축이시면 그에 따른 IP주소를 작성하셔야 해요~

 

 

상세기능정보 선택

 

밑에는 상세기능정보 선택란이 있습니다. 본인이 보고싶은 정보만 클릭하여 보실 수 있습니다. 저는 다 보고 싶기 때문에 모두 클릭! 후에 이용허락 범위를 클릭하고 활용신청 버튼을 눌렀습니다.

 

 

개발계정

 

마이페이지 -> 오픈api -> 개발계정으로 들어가시면 본인이 활용신청하신 자료들을 볼 수 있습니다.

 

해당 목록을 눌러보시면 아래와 같은 내용들이 나옵니다.

개발계정 상세보기

 

활용기간은 2020.09.02~2022.09.02로 2년동안 사용할 수 있습니다. 저기 일반 인증키는 본인이 이 데이터를 사용하기 위해 key라고 보시면 됩니다!

 

++ open api마다 활용신청을 하는데에 있어서 승인이 필요한 경우도 있습니다. 승인 필요하지 않은 api는 활용신청만 하시면 바로 승인 가능합니다. 제가 신청한 api는 따로 승인절차가 필요없어 바로 승인이 됐습니다.

 

 

 

활용신청 상세기능정보

 

그 밑에는 제가 신청한 내용들에 대한 설명과 미리보기 버튼이 있습니다.

 

정해진 기간보다 더 사용하시려면 연장 신청을 이제 이 api를 사용하지 않으시려면 중지 신청을 하시면 됩니다.

 

 


 

이 다음 포스팅은 활용 신청한 api를 사용하는 방법과 태풍 정보 조회 시스템에는 무엇이 있는지 확인하는 포스팅을 들고오겠습니다.

 

긴 글 읽어주셔서 감사드립니다.

 

다음 포스팅으로 ㄱㄱ!

 

 


 

[open api]공공데이터 api를 사용한 데이터 추출_태풍정보 조회 서비스(2. 참고문서 확인 및 open api 사용 및 태풍정보 확인)

 

https://beaver-sohyun.tistory.com/63?category=864438

 

[open api]공공데이터 api를 사용한 데이터 추출_태풍정보 조회(3. 태풍정보목록조회, 태풍예상정보조회, 에러사항 발생시)

 

https://beaver-sohyun.tistory.com/65?category=864438

 

 

 

 

 

 

 

 

반응형
반응형

https://beaver-sohyun.tistory.com/54

 

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(3. Decision tree를 이용한 데이터

https://beaver-sohyun.tistory.com/52?category=864438 [빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(2. 전체 feature 수집 및 특정 fea https://beaver-sohyun.tistory.com/53?cate..

beaver-sohyun.tistory.com

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(3. Decision tree를 이용한 데이터 분석)

 


 

이번 포스팅의 'kickstarter project'의 마지막 단계인 결과 분석입니다.

 

분석은 Decision tree를 이용했습니다.

 

아직 부족한 점이 많은 성장중인 비버지만 열심히 해보았으니 잘 봐주세요..ㅎ

 


7. 결과분석

 

  • 정확도 확인하기 
y_pred = clf.predict(x_test)
print("accuracy:",metrics.accuracy_score(y_test,y_pred))

print(classification_report(y_test, y_pred))

 

정확도 약 95%

 

총 학습의 정확도는 95%가 나왔습니다.

-정밀도(precision)는 실패와 성공을 예측해서 실제 자료 값과 일치하는지에 대한 비율입니다. 실패에서는 100%, 성공에서는 93%입니다

-재현율(recall)은 실제 자료 값 중에 예측한 표본 수 비율입니다. 실패는 91%, 성공은 100%가 나왔습니다.

-f1-score는 정밀도(precision)와 재현율(recall) (가중조화) 평균입니다. 실패는 0.95, 성공은 0.96이 나왔습니다.

-support는 각 클래스에 있는 실제 응답 샘플 수입니다. 실패는 22, 성공은 26개입니다. -

각 정밀도, 재현율 에프원 점수 서포트의 단순평균과 가중평균은 다음과 같습니다.

 

 

 


 

  • Decision tree 확인하기
# 트리를 확인하기 위한 함수
def draw_decision_tree(model):
    dot_buf = io.StringIO()
    export_graphviz(clf, out_file=dot_buf, feature_names=df.feature_names,
                    class_names=df.target_names, filled=True,rounded=True)
    graph = pydot.graph_from_dot_data(dot_buf.getvalue())[0]
    image = graph.create_png()
    return Image(image)

draw_decision_tree(clf)

 

Decision tree확인하기

 

- Decision tree를 통해 분류한 결과입니다.

- 왼쪽 트리를 보시면, 후원자 수가 74명보다 적고 최대 금액 후원자 수가 5명보다 적을 경우 실패한 프로젝트로 분류됩니다. 또한 서포트 단계 수가 5보다 작을 경우 실패한 프로젝트로 분류됩니다.

- 최소 금액 후원자 수가 1명보다 적으면 실패한 프로젝트로 분류됩니다. 여기서 최소 금액 후원자 수가 1명보다 많을 경우는 성공한 프로젝트로 분류됩니다.

- 오른쪽 트리를 보시면 후원자 수가 195명보다 많은 경우는 성공한 프로젝트를 분류됩니다. 또한 최대 금액 후원자 수가 6명보다 적을 경우는 성공한 프로젝트로 분류됩니다. 최소 금액 후원자 수가 1명보다 적을 경우 성공한 프로젝트로 분류되는 것을 볼 수 있었습니다.

 

entropy값은 0과 1사이의 값을 가지며 0.5에서 멀어질수록 잘 분류된 노드라고 할 수 있습니다.

 

 

 


 

 

  • feature importance 특성 중요도 확인하기
# 트리를 결정하는데 각 Feature의 중요도를 확인하기 위해 Feature importance를 이용
def plot_feature_importances(model):
    n_features=df.data.shape[1]
    plt.barh(range(n_features),model.feature_importances_,align='center')
    plt.yticks(np.arange(n_features),df.feature_names)
    plt.xlabel('importance_value')
    plt.ylabel('feature')
    plt.ylim(-1,n_features)
    
    

# 시각화하여 보기 쉽게 표현
#프로젝트의 성공여부에 크게 영향을 끼치는 Feature 확인
feature_importance_values = best_df_clf.feature_importances_
plot_feature_importances(clf)



#Feature importance 함수를 이용해 특성 중요도 확인
importance = clf.feature_importances_
#0은 전혀 사용되지 않았다는 뜻이고 1은 완벽하게 예측했다는 뜻
#backers, Maximum amount of sponsors, Minimum amount of sponsors, Number of projects opened 순으로 중요도 확인

importance_list = list(zip(x_train.columns,importance))
sorted(importance_list, key=lambda x:x[1],reverse=True)

feature importance 시각화 하여 확인

 

 

feature importance 값 확인

feature importance 특성 중요도를 이용해. Tree를 만드는 데 각 특성이 얼마나 중요한지 확인해보았습니다.

- x축에는 중요도의 값, y축에는 feature들의 이름을 나타냅니다.

- 시각화 결과, 후원자 수가 다른 feature들보다 월등히 높은 중요도를 보였습니다.

- 0은 전혀 사용되지 않았다는 뜻이고 1에 가까운 값일수록 완벽하게 예측했다는 뜻입니다.

- 프로젝트 제작자의 개설 횟수는 전혀 사용되지 않았고, 후원자 수가 tree를 만드는 과정에서 가장 크게 영향을 끼쳤다는 것을 볼 수 있었습니다.

 

 

- 5개의 feature 중 후원자 수, 최대, 최소 금액 후원자, 서포트 금액별 단계 개수 순으로 프로젝트의 성공과 실패에 중요했으며, 가장 큰 영향을 미친 feature는 후원자 수임을 알 수 있었습니다.

- 프로젝트의 개설 횟수는 프로젝의 성공실패여부에 영향을 끼치지 않았다는 것을 볼 수 있었습니다.

 

1. Backers(약 94%)

2. Maximum amount of sponsors(약 0.35%)

3. Minimum amount of sponsors(약 0.02%)

4. Total number of support steps(약 0.01%)

5. Number of projects opended(0%)

 

 

 



학교 과제로써 프로젝트를 진행했지만 과제를 하면서 아주 살-짝 재미있기도 했고 신기하기도했고..!

다음에도 종종 이런식으로 빅데이터 분석을 통해 의미있는 결과를 가져오겠습니다!

이번에는 첫 분석이라서 그런지 정확하지 않지만 그래도 ... 처음이니깐... 그냥 작은 비버가 한 단계 더 성장했구나! 라고 봐주세요.. 헿

긴 글 봐주셔서 감사드립니다

다들 행복한 하루 보내시길 바랄께요!

 

 

다음에는 좀 더 성장된 작은 비버의 과제 수행기를 들고오겠습니다!

반응형
반응형

https://beaver-sohyun.tistory.com/52?category=864438

 

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(2. 전체 feature 수집 및 특정 fea

https://beaver-sohyun.tistory.com/53?category=864438 5. 수집된 링크에서 feature 수집 상세 사이트에서 프로젝트 링크, 실제로 모인 금액, 목표 금액, 제작자 이름 등등 프로젝트 성공 여부에 영향을 미쳤을..

beaver-sohyun.tistory.com

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(2. 전체 feature 수집 및 특정 feature 추출)

 

 


이번 포스팅은 저번 시간에 수집한 데이터들을 가지고 decision tree를 이용한 데이터 분석입니다.

 

수집한 데이터에서 분석에 유용하게 쓰일만한 특정 feature를 추출한 후 데이터 분석을 진행했습니다.

 

 


 

6. 분석 방법

6-1-1. 패키지 및 데이터 로드

첫 번째로 분석에 사용될 패키지를 로드하였습니다.

- 또 각 프로젝트의 상세 URL을 통해 수집한 feature 데이터를 로드했습니다.

 

#패키지 로드

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from IPython.core.display import Image
from sklearn.tree import export_graphviz
from sklearn import tree
from sklearn import metrics
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import graphviz
import pydot
import io

 

수집한 모든 featurer 가운데 특정 feature 추출

#수집한 모든 feature 불러오기
success_feature= pd.read_csv('./success_link_feature.csv',index_col=0)
fail_feature = pd.read_csv('./fail_link_feature.csv',index_col=0)
success_feature

#성공, 실패한 Feature들을 concat으로 붙이기
#성공(120개), 실패(117개), 총 237개의 데이터 수집 
df = pd.concat([success_feature, fail_feature],ignore_index=True)

# 모든 Feature 중에서 수치화 할 수 있는 Feature 추출하기
df = df[['backers','Number of projects opened','Total number of support steps','Maximum amount of sponsors','Minimum amount of sponsors','label']]

 

 


 

6-1-2. 속성과 클래스 분리

 

두 번째로는 속성과 클래스를 분리했습니다.

- DF_label로 프로젝트의 성공 여부 라벨을 변수에 넣고, 수집된 feature들 중 선별한 5feature DF 변수에 넣었습니다.

 

# df_label에는 label(성공, 실패)값을, df에는 나머지 수치화 값들을 넣어준다

df_label= df[['label']]
df = df[['backers','Number of projects opened','Total number of support steps'
         ,'Maximum amount of sponsors','Minimum amount of sponsors']]


# 분석에 사용하기 위해서 데이터의 형태를 바꿔주는 작업을 진행
# 데이터의 수치 값들을 float형으로 변환시킨 후, int형으로 변환시킨다.
df_label['label'] = df_label['label'].astype(str)
df=df.replace(',','',regex=True).astype(float)
df = df.astype(int)
df         

int형으로 변환된 df

 

후에 Decision tree에 해당 변수들을 넣기위해 변수 이름 다시 정의해서 값 넣기

# 데이터들을 쉽게 확인하기 위해 데이터 정리
df.feature_names = df.columns
df.target_names = np.array(['fail', 'success'])
df.data = df.values
df.target = df_label.label


#학습과 테스트 데이터 세트로 분리
# trian data 189개, test data 48개
x_train, x_test, y_train,y_test = train_test_split(df,df_label,train_size = 0.8)
x_train

x_train 데이터

 


 

 

6-1-3. 데이터 학습

세 번째로 데이터를 학습시켰습니다.

- 로드된 의사결정 트리 분류 모듈을 변수 clf에 저장했습니다.

- 오버피팅을 방지하기 위해 깊이는 5로 설정했습니다.

- clf의 함수 fit 함수에 변수 x_train, y_train을 입력해 의사결정 트리 분류 모델을 생성, 학습시켰습니다.

 

# DecicionTreeClassifier 생성(max_depth = 5 으로 제한) - 오버피팅 방지
clf=tree.DecisionTreeClassifier(max_depth=5,criterion='entropy',random_state=0)

# DecisionTreeClassifier 학습
clf.fit(x_train,y_train)

Decisiontreeclassifier생성

 

 


 

 

6-1-4. Decision tree 그래프 표현 및 Feature importance 시각화

네 번째로 의사결정 트리와 feature importance를 시각화시켰습니다.

- Tree 패키지 중 의사결정 트리를 dot 형식으로 내보내는 함수인 export_graphviz() 를 이용해 트리 표현을 함수로 만들었습니다.

 

# 트리를 결정하는데 각 Feature의 중요도를 확인하기 위해 Feature importance를 이용
def plot_feature_importances(model):
    n_features=df.data.shape[1]
    plt.barh(range(n_features),model.feature_importances_,align='center')
    plt.yticks(np.arange(n_features),df.feature_names)
    plt.xlabel('importance_value')
    plt.ylabel('feature')
    plt.ylim(-1,n_features
    
    
# 트리를 확인하기 위한 함수
def draw_decision_tree(model):
    dot_buf = io.StringIO()
    export_graphviz(clf, out_file=dot_buf, feature_names=df.feature_names,
                    class_names=df.target_names, filled=True,rounded=True)
    graph = pydot.graph_from_dot_data(dot_buf.getvalue())[0]
    image = graph.create_png()
    return Image(image)    

- feature_names는 각 features의 이름, class_names는 각 대상 class의 이름을 오름차순으로 정렬, filledTrue일 경우 분류를 위한 다수 클래스, 회귀 값의 극한 또는 다중 출력의 노드 순도를 나타내기 위해 노드를 색칠한다.

 

 

 


여기서는 함수에 대한 자세한 내용은 적지 않았습니다. 관심있으신 분들은 검색해보면서 실습해보시는거 추천드려요!!

 

참 분석이라는건 방대한 것 같아요.. 하면서 새로운 내용 발견하고,,, 하다가 또 다른 방법들도 보이고,, 다른 결과들도 나오고,,, 그만큼 많은 지식을 요하는 부분이라는 거겠죠..!!

 

다음시간에는 Decision tree를 이용해서 데이터 분석한 결과에 대해서 포스팅 하겠습니다.

 

오늘도 긴 글 읽어주셔서 감사드립니다.

 

행복한 하루 보내시길 바랄께요~

 

 

 


 

 

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(4. Decision tree 결과 분석)

 

https://beaver-sohyun.tistory.com/55

 

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(4. Decision tree 결과 분석)

https://beaver-sohyun.tistory.com/54 [빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(3. Decision tree를 이용한 데이터 https://beaver-sohyun.tistory.com/52?category=864438 [빅..

beaver-sohyun.tistory.com

 

 

반응형
반응형

https://beaver-sohyun.tistory.com/53?category=864438

 

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(1. 상세사이트 링크 수집)

홍홍홍 하하하 안녕하세요 작은 비버 입니다. 요즘들어 왜이렇게 활발하게 운영하냐고요? 왜냐하면 제가 '구글 애드센스'를 신청했기 때문입니다.. - 사실 구글 애드센스 신청이 승인 될 가능성�

beaver-sohyun.tistory.com

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(1. 상세사이트 링크 수집)


 

 

5. 수집된 링크에서 feature 수집 

상세 사이트에서 프로젝트 링크, 실제로 모인 금액, 목표 금액, 제작자 이름 등등 프로젝트 성공 여부에 영향을 미쳤을 만한 모든 feature를 수집하였습니다.

- 이 중에서 수치화를 통해 영향을 측정할 수 있는 feature 5개로 추려내어 학습을 진행하였습니다.

- 이번 포스팅에서는 모든 feature를 수집하는 것에 대해 설명드리겠습니다.

 

 

 

1) 수집한 feature : 프로젝트 링크 , 실제로 모인 금액 , 목표 금액 , 제작자 이름 , 제작자 지역 , 프로젝트 장르 , 서포트 단계별 금액 리스트 , 서포트 최고, 최소 금액 , 서포트 단계별 금액 후원자 수

 

2) 추려낸 5개의 feature : 총 후원자수 , 제작자 프로젝트 개설횟수 , 서포트 금액 단계별 총 개수 , 서포트 최고 금액 후원자 수 , 서포트 최소 금액 후원자 수 (3번째 포스팅 참고)

 

 

프로젝트의 크라우드 펀딩 페이지

 

 


 

 

5-1. 성공한 프로젝트의 상세 사이트에서 feature수집

 

5-1-1. 전체 feature 수집

# 수집되는 Featrue들을 넣기 위해 각 Feature별로 리스트 생성

money_list=[]
pledged_money_list=[]
creator_list=[]
backers_list=[]
final_created_list=[]
city_list=[]
category_list=[]
support_bankroll_list=[]
support_max_money_list=[]
support_min_money_list=[]
support_max_backers_list=[]
support_min_backers_list=[]
level_num_list=[]
support_backers_list=[]

 

for i in range(len(success_link_list)):
    url = success_link_list[i]
    driver.get(url)
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    print("링크",url)

    #실제로모인금액
    money = soup.select('span.money')[0].text
    money = re.findall('\d+',money)
    money = "".join(money)
    money_list.append(money)
    print("모인금액",money)

    #목표금액
    pledged_money = soup.select('span.money')[2].text
    pledged_money = re.findall('\d+',pledged_money)
    pledged_money = "".join(pledged_money)   
    pledged_money_list.append(pledged_money)
    print("목표금액",pledged_money)

    #만든사람
    creator = soup.select('a.hero__link')[1].text
    creator = creator.strip()
    creator_list.append(creator)
    print("만든사람",creator)

    #후원자수
    backers = soup.select('h3.mb0')[1].text
    backers = backers.strip()
    backers_list.append(backers)
    print("총 후원자수",backers)

    #제작자의프로젝트개설횟수
    a_tags = soup.find_all("a", {'class':"hero__link remote_modal_dialog js-update-text-color"}) 
    
    for created in a_tags :
        print(created["href"]) # 찾은 a태그의 href 값 크롤링
    url = "https://www.kickstarter.com" + created["href"]
    driver.get(url)     
    html_s = driver.page_source
    soup_s = BeautifulSoup(html_s, 'html.parser')

    created_dummy = driver.find_element_by_class_name("created-projects.py2.f5.mb3")
    final_created = re.findall('\d+',created_dummy.text)

    for i in range(len(final_created)):
        final_created[i] = int(final_created[i])
    if len(final_created) == 1:
        created_num = 0
    else:
        created_num = final_created[0]
    final_created_list.append(created_num)
    
    print("개설횟수",final_created_list)

    #제작자지역
    city = soup.select('a.grey-dark')[4].text
    city = city.strip()
    city_list.append(city)
    print("제작자지역",city)

    #프로젝트장르
    category = soup.select('a.grey-dark')[5].text
    category = category.strip()
    category_list.append(category)
    print("장르",category)

    #서포트금액
    support_money = soup.select('span.money')
    support_bankroll = []
    for line in support_money:
        line = line.get_text()         
        line = re.findall('\d+',line)
        line = "".join(line)
        support_bankroll.append(int(line))       
    for i in range(3):
        support_bankroll.pop(0)

    support_bankroll_list.append(support_bankroll)
    print("서포트금액",support_bankroll)

    #서포트금액 최소/최대
    support_max_idx = 0
    support_min_idx = 0
    max = support_bankroll[0]
    min = support_bankroll[0]
    
    for i in range(len(support_bankroll)):  
        if max < support_bankroll[i]:
            max = support_bankroll[i]
            support_max_idx = i
        if min > support_bankroll[i]:
            min = support_bankroll[i]
            support_min_idx = i
    print("최대금액",max)
    print("최소금액",min)
    support_max_money_list.append(max)
    support_min_money_list.append(min)

    #단계개수
    level_num = len(support_bankroll)
    level_num_list.append(level_num)
    print("서포트 단계",level_num)

    #서포트후원자수
    support_backer = soup.select(' div > div > div > div > div > div > div > ol > li > div > div > span')
    support_backers = []
    for line in support_backer:
        line = line.get_text() 
        if line == 'Includes:':
            continue
        line = line.replace('\n','')
        if line == 'Limited':
            continue
        if line == 'Reward no longer available':
            continue
        line = line.replace(' backers','')
        line = line.replace(' backer','')
        support_backers.append(line)
    support_backers_list.append(support_backers)
    print("서포트 금액별 후원자수",support_backers)

    #서포트최소/최대후원자수
    a_ar = np.array(support_bankroll)
    max_money_index = np.argmax(support_bankroll)
    min_money_index = np.argmin(support_bankroll)
    max_money_backers = support_backers[max_money_index]
    min_money_backers = support_backers[min_money_index]
    support_max_backers_list.append(max_money_backers)
    support_min_backers_list.append(min_money_backers)
    print("최대 금액 후원자수",max_money_backers)
    print("최소 금액 후원자수",min_money_backers)
    print("\n")

 

  • 전체 feature 수집되는 형식

성공한 프로젝트 모든 feature 수집 코드를 돌린 후 나오는 결과

 

5-1-2. csv파일로 수집한 모든 featrue 저장

import pandas as pd

success_list = []
result = []

for money_list,pledged_money_list,creator_list,backers_list,final_created_list,city_list,category_list,support_bankroll_list,support_max_money_list,support_min_money_list,level_num_list,support_backers_list,support_max_backers_list,support_min_backers_list in zip(money_list,pledged_money_list,creator_list,backers_list,final_created_list,city_list,category_list,support_bankroll_list,support_max_money_list,support_min_money_list,level_num_list,support_backers_list,support_max_backers_list,support_min_backers_list):       
    success_list = [money_list,pledged_money_list,creator_list,backers_list,final_created_list,city_list,category_list,support_bankroll_list,support_max_money_list,support_min_money_list,level_num_list,support_backers_list,support_max_backers_list,support_min_backers_list]
    result.append(success_list)
    
df = pd.DataFrame(result, columns = ['money','pledged_money','creator','backers','Number of projects opened','Producer area','genre','Support amount list','The highest amount of support','The minimum amount of support','Total number of support steps','List of supporters','Maximum amount of sponsors','Minimum amount of sponsors'])
df.to_csv('success_link_feature.csv',encoding = 'utf-8-sig')




 


 

 

5-2. 실패한 프로젝트의 상세 사이트에서 feature수집 후 추려내기

5-1-1. 전체 feature 수집

 

# 수집되는 Featrue들을 넣기 위해 각 Feature별로 리스트 생성

money_list=[]
pledged_money_list=[]
creator_list=[]
backer_list=[]
created_list=[]
city_list=[]
category_list=[]
support_bankroll_list=[]
support_backers_list = []
level_num_list=[]
support_max_money_list = []
support_min_money_list = []
support_max_backers_list = []
support_min_backers_list = []

 

for i in range(len(fail_link_list)):
    url = fail_link_list[i]
    driver.get(url)
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    print('링크',url)
    time.sleep(8)
      
    #실제로모인금액
    money = soup.select('span.soft-black')[1].text     
    money= re.findall('\d+',money)
    money= "".join(money)
    money_list.append(money)
    print('실제로 모인 금액',money)
    time.sleep(0.2)
    
    #목표금액
    pledged_money = soup.find('span',{'class':'inline-block hide-sm'}).text
    pledged_money= re.findall('\d+',pledged_money)
    pledged_money= "".join(pledged_money)
    pledged_money_list.append(pledged_money)
    print('목표금액',pledged_money)
    time.sleep(0.2)
    
    #제작자이름
    creator = soup.select('div.text-left')[1].text
    creator_list.append(creator)
    print('제작자이름',creator)
    
    #후원자수
    time.sleep(0.2)
    backers = soup.select(' div > div > div > div > div.flex.flex-column-lg.mb4.mb5-sm > div.ml5.ml0-lg.mb4-lg > div > span')[0].text
    backer_list.append(backers)    
    print('후원자수',backers)
    time.sleep(0.2)
    
    #제작자의프로젝트개설횟수
    created= soup.select('div.text-left')[2].text
    final_created= re.findall('\d+',created)
    for i in range(len(final_created)):
        final_created[i]=int(final_created[i])
    if len(final_created)==1:
        created_num=0
    else:
        created_num=final_created[0]
    created_list.append(created_num)
    print('제작개설횟수',created_num)   
    #time.sleep(0.2)
    
    #제작자지역
    city = soup.select('span.ml1')[1].text
    city_list.append(city)
    print('제작자지역',city)
    time.sleep(0.2)
    
    #프로젝트장르
    category = soup.select('span.ml1')[0].text
    category_list.append(category)
    print('프로젝트 장르',category)
    time.sleep(0.2)

    #서포트금액
    support_money = soup.select('div.NS_projects__content > section.js-project-content.js-project-description-content.project-content > div > div > div > div.col.col-4.max-w62.sticky-rewards.z10 > div > div.mobile-hide > div > ol > li > div.pledge__info > h2 > span.money')
    support_bankroll=[]
    for line in support_money:
        line=line.get_text()         
        line= re.findall('\d+',line)
        line = "".join(line)
        support_bankroll.append(int(line)) 

    support_bankroll_list.append(support_bankroll)
    print('서포트금액', support_bankroll)
    time.sleep(0.2)
    
    #서포트후원자수
    support_backer = soup.select('div.NS_projects__content > section.js-project-content.js-project-description-content.project-content > div > div > div > div.col.col-4.max-w62.sticky-rewards.z10 > div > div.mobile-hide > div > ol > li > div.pledge__info > div.pledge__backer-stats > span')
    support_backers = []
    for line in support_backer:
        line = line.get_text() 
        if line == 'Includes:':
            continue
        line = line.replace('\n','')
        if line == 'Limited':
            continue
        if line == 'Reward no longer available':
            continue
        line = line.replace(' backers','')
        line = line.replace(' backer','')
        support_backers.append(line)
    support_backers_list.append(support_backers)
    print("서포트 금액별 후원자수",support_backers)   
    time.sleep(0.2)
    
    #단계개수
    level_num=len(support_bankroll)
    level_num_list.append(level_num)
    print('단계',level_num)
    time.sleep(0.2)
    
    
    #서포트금액 최소/최대
    support_max_idx = 0
    support_min_idx = 0
    max = support_bankroll[0]
    min = support_bankroll[0]
    
    for i in range(len(support_bankroll)):  
        if max < support_bankroll[i]:
            max = support_bankroll[i]
            support_max_idx = i
        if min > support_bankroll[i]:
            min = support_bankroll[i]
            support_min_idx = i
    print("최대금액",max)
    print("최소금액",min)
    support_max_money_list.append(max)
    support_min_money_list.append(min)
    time.sleep(0.2)
    
    #서포트최소/최대후원자수
    a_ar = np.array(support_bankroll)
    max_money_index = np.argmax(support_bankroll)
    min_money_index = np.argmin(support_bankroll)
    max_money_backers = support_backers[max_money_index]
    min_money_backers = support_backers[min_money_index]
    support_max_backers_list.append(max_money_backers)
    support_min_backers_list.append(min_money_backers)
    print("최대 금액 후원자수",max_money_backers)
    print("최소 금액 후원자수",min_money_backers)
    print('\n')
    time.sleep(0.2)

 

 

  • 전체 feature 수집되는 형식

실패한 프로젝트 모든 feature 수집 코드를 돌린 후 나오는 결과

 

 

5-1-2. csv파일로 수집한 모든 featrue 저장

import pandas as pd

fail_list = []
result_fail = []

for money_list,pledged_money_list,creator_list,backer_list,created_list,city_list,category_list,support_bankroll_list,support_max_money_list,support_min_money_list,level_num_list,support_backers_list,support_max_backers_list,support_min_backers_list in zip(money_list,pledged_money_list,creator_list,backer_list,created_list,city_list,category_list,support_bankroll_list,support_max_money_list,support_min_money_list,level_num_list,support_backers_list,support_max_backers_list,support_min_backers_list):       
    fail_list = [money_list,pledged_money_list,creator_list,backer_list,created_list,city_list,category_list,support_bankroll_list,support_max_money_list,support_min_money_list,level_num_list,support_backers_list,support_max_backers_list,support_min_backers_list]
    result_fail.append(fail_list)
    
df_fail = pd.DataFrame(result_fail, columns = ['money','pledged_money','creator','backers','Number of projects opened','Producer area','genre','Support amount list','The highest amount of support','The minimum amount of support','Total number of support steps','List of supporters','Maximum amount of sponsors','Minimum amount of sponsors'])
df_fail.to_csv('fail_link_feature.csv',encoding = 'utf-8-sig')

 

 


 

 

이번 포스팅에서는 수집한 link에서 개발자도구와 python을 이용해 모든 feature 추출을 해보았습니다.

 

이 글을 보시는 분들은 이 내용에 대한 정보가 필요해서 들어오셨겠죠?

 

본인이 직접 스스로 해보시면 살-짝 재미를 느끼실수도있어요!!!

 

다음시간에는 수집한 데이터들을 가지고 decision tree를 이용해 데이터 분석을 해보겠습니다.

 

긴 글 봐주셔서 감사드립니다

 

다들 행복한 하루 보내시길 바랄께요!

 

 

 


[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(3. Decision tree를 이용한 데이터 분석)

https://beaver-sohyun.tistory.com/54?category=864438

 

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(3. Decision tree를 이용한 데이터

https://beaver-sohyun.tistory.com/52?category=864438 [빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(2. 전체 feature 수집 및 특정 fea https://beaver-sohyun.tistory.com/53?cate..

beaver-sohyun.tistory.com

 

반응형
반응형

홍홍홍 하하하 안녕하세요 작은 비버 입니다.

 

요즘들어 왜이렇게 활발하게 운영하냐고요?

 

왜냐하면 제가 '구글 애드센스'를 신청했기 때문입니다..

- 사실 구글 애드센스 신청이 승인 될 가능성이 적은데 그래도 한 번......혹시나 해서................ 그냥 경험삼아......... 신청해봤습니다.................

- 구글 애드센스 신청하고 2주간 승인 검토가 진행되는데 그 때 동안 1000~1200자 정도의 글을 매일 작성하면 가능성이 쪼콤 높아진다해서 부지런히 쓰는 중입니다...^^

 

오늘은 작은비버가 학교에서 프로젝트 겸 공부한 내용 'kickstarter'사이트를 이용한 빅데이터 분석에 대해 설명드리려고 합니다.

 

이번 프로젝트는 저번 사랑스러운 제 팀원들과는 다른 사랑스러운 팀원들과 함께 했습니다.


<하고픈 프로젝트 제안서>

저희는 kickstarter에서 성공한 프로젝트, 실패한 프로젝트의 데이터를 수집해서 어떠한 Feature가 프로젝트 성공여부에 크게 영향을 끼치는지 Decision tree를 이용해 분석해 볼려고 합니다.

 

분석하고자 하는 데이터는 상품명, 후원자수, 제작자 이름, 목표금액, 실제로 모인 금액, 성공여부(성공 : 1, 실패 : 0), 제작자의 프로젝트 개설횟수, 제작자 지역, 프로젝트 장르, 서포트 금액, 서포트 금액에 따른 구성품을 추출해서 분석하려고 합니다.

킥스타터 프로젝트 메인

 

자 이제 시작해보자!!!!!!!!!!!!

 


킥스타터(kickstarter)란?

그 전에 kickstarter를 모르시는 분들이 있을것같아서 설명드리자면 킥스타터는 미국의 크라우드 펀딩 사이트입니다. 

우리나라의 텀블벅을 떠올리면 쉽게 이해할 수 있으실 텐데요. 투자자는 관심 있는 프로젝트에 돈을 제공하고 펀딩진행자는 그 금액에 따른 보상을 제공하는 형태입니다. 돈이 아닌 해당 시제품, 감사 인사, 작가와의 식사 등 유무형 형태의 보상을 받는 것이 이 킥스타터의 가장 큰 특징입니다.

 

킥스타터 메인
텀블벅과 비슷한 크라우드 펀딩 형식

 

 


 

1. 분석방법 

저희는 크라우드 펀딩 데이터를 수집하여 ‘Decision tree 어떤 feature가 프로젝트 성공 여부에 가장 큰 영향을 끼치는지 확인해볼 계획입니다. 또한, tree를 만드는 결정에 각 특성이 얼마나 중요한지 평가하는’ feature importance 특성 중요도를 이용해 각 특성의 중요도를 확인해볼 계획입니다.

 


2. 수집방법

1. 성공, 실패한 프로젝트 상세사이트 LINK 수집 
각 프로젝트의 상세 페이지로 접근하기 위해 URL수집

 

상세사이트 link수집

  • 성공한 프로젝트는 단순 URL 접근으로 링크 크롤링 진행
  • 실패한 프로젝트는 로그인한 후, 프로젝트를 saved해야함
  • Saved한 프로젝트에서 프로젝트의 실패 여부를 확인할 수 있음

- 모금액이 75% 이하이고 마감기한이 3일 이내인 프로젝트를 saved 하여 그 중 실패한 프로젝트를 수집하였습니다

- 셀레니움에서 자동 로그인을 하여 saved 된 프로젝트 중 실패한 프로젝트를 가지고 URL 상세 페이지를 크롤링하였습니다.

카테고리 검색을 통해 successful project 검색 및 link 수집 진행
saved한 프로젝트, 성공 실패 여부 확인 가능

 

 


 

3. 수집 진행 코드 및 수집 데이터

 

개발자도구에서 link를 나타내는 a태그 확인

 

python코드로 a 태그 link 수집

 

3-1. 수집하는 코드 일부분(성공한 프로젝트 링크 수집)

number = [1,2,3,4,5,6,7,8,9,10]   #세부 사이트 들어가는 링크 크롤링
success_link_list = list()

for i in number:
    url="https://www.kickstarter.com/discover/advanced?state=successful&woe_id=0&sort=magic&seed=2653556&page="+str(i)
    driver.get(url)
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')

    a_tags = soup.find_all("a", {'class':"block img-placeholder w100p"}) 
    
    for line in a_tags :
        title=line["href"]
        success_link_list.append(title)
        
print(success_link_list)

 

 

3-2. 수집하는 코드 일부분(실패한 프로젝트 링크 수집)

fail_link_list = list()

driver.get('https://www.kickstarter.com/login?ref=nav')

driver.find_element_by_id('user_session_email').send_keys('본인 이메일 아이디')
driver.find_element_by_id('user_session_password').send_keys('비밀번호')
xpath = """//*[@id="new_user_session"]/fieldset/ol/li[3]/input"""
driver.find_element_by_xpath(xpath).click()

url="https://www.kickstarter.com/profile/saved_projects?ref=user_menu"

driver.get(url)
time.sleep(0.2)
body = driver.find_element_by_tag_name("body")
num = 100

while num:
    body.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.1)
    num -= 1
    try:
        driver.find_element_by_xpath("""//*[@id="react-container"]/div[2]/div[3]/div/button""").click()
    except:
        None
        
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

a_tags = soup.find_all("a", {'class':"block img-placeholder w100p"}) 

for line in a_tags :
    title = line["href"]
    print(title)
    fail_link_list.append(title)

- 로그인을 통해 제가 saved한 프로젝트에서 링크를 수집해야해서 자동로그인을 통해 로그인을 한 후 데이터를 수집하였습니다.

- 저기 로그인 하는 부분에는 본인의 kickstarter의 id 및 비밀번호를 입력하시고 코드 돌리시면 됩니다.

 

 

4. 수집된 데이터

successful project link(120개 수집)
fail project link(117개 수집)

 

  • 성공한 프로젝트는 120, 실패한 프로젝트는 117개 총 237개의 링크를 수집하였습니다.

 

 


 

오늘은 상세사이트 링크를 수집하는 부분에 대해서 적어봤습니다.

 

내용이 길어 나눠서 설명하려고 합니다..!!

 

오늘은 이만 작은 비버는 물러나겠습니다!

 

긴글 읽어주셔서 감사드려요~

 

 


 

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(2. 전체 feature 수집 및 특정 feature 추출)

https://beaver-sohyun.tistory.com/52?category=864438

 

[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(2. 전체 feature 수집 및 특정 fea

https://beaver-sohyun.tistory.com/53?category=864438 5. 수집된 링크에서 feature 수집 상세 사이트에서 프로젝트 링크, 실제로 모인 금액, 목표 금액, 제작자 이름 등등 프로젝트 성공 여부에 영향을 미쳤을..

beaver-sohyun.tistory.com

 

반응형
반응형

 

 

 

2019년 Hate Speech Detection 글 보기!

https://beaver-sohyun.tistory.com/6?category=830784

 

주제 Hate Speech Detection & Hate Map

안녕하세요. 오늘은 저희 팀이 구현할 주제에 대한 정리? 요약? 에 대해 말씀드리려고 합니다. 저희 팀은 총 4명으로 구성된 열정 가득한 작은 비버들로 구성되어있습니다. 처음에는 같은 학과 ��

beaver-sohyun.tistory.com

 

 

2020년 Hate Speech Detection(주제 소개, 관련 연구, 데이터 셋, HAN 모델 설명)

https://beaver-sohyun.tistory.com/40

 

주제 Hate Speech Detection_2020(++ 주제 소개, 관련 연구, 데이터 셋, HAN 모델 설명)

안녕하세요, 작은비버가 작년에 진행했던 Hate Speech Detection 프로젝트를 들고 왔습니다. 이번 연도에는 작년에 진행했던 Hate Speech Detection 연구에 추가로 연구를 진행했습니다. 오늘은 2020년 version,

beaver-sohyun.tistory.com

 

 


실험에 사용된 데이터 셋

Datasets

Source

Class

Count

Hatebase [1]

Twitter

Hate

Offensive

Neither

1,430(5%)

19,190(76%)

4,163(17%)

WaseemA [2]

Twitter

Sexism

Racism

Neither

3,383(20%)

1,972(12%)

11,559(68%)

Stormfront [3]

Online Forum

Hate

Not Hate

Relation

Skip

1,196(11%)

9,507(86%)

168(2%)

73(1%)

Wikipedia Detox [4]

Wikipedia

discussions

Non-attacking

Attacking

102,274(87%)

13,590(13%)

Kaggle [5]

Twitter

Not Insulting

Insulting

1,742(26%)

4,852(74%)

 

[1] https://github.com/t-davidson/hate-speech-and-offensive-language

[2] https://github.com/ZeerakW/hatespeech

[3] https://github.com/Zeerak/hatespeech

[4] https://github.com/ewulczyn/wiki-detox

[5] https://www.kaggle.com/c/detecting-insults-in-social-commentary

 

 

 

연구 방법

딥러닝 알고리즘

  • 알고리즘 : Hierarchical Attention Network
  • 데 이 터 : Hate Speech Datasets
  • 파라미터
    • learning rate : 0.001
    • loss function : Categorical Cross-Entropy
    • optimizer : Adam
    • batch size : 128
    • epoch : early - stopping

 

데이터 셋 비율

  • Training : 80%
  • Validation : 10%
  • Test : 10%

 

 

실험 결과(1)

연구는 HAN 알고리즘을 사용하여 실험을 했고, 데이터는 위에 작성된 Hate Speech Dataset, 파라미터는 위에 작성된 것으로 진행했습니다.

 

데이터셋 별로 SOTA 모델의 train, validation, test 비율이 달랐는데 저희 실험에서는 80, 10, 10로 나누어 진행했습니다.

 

워드 임베딩은 사전 훈련된 Word2vec을 사용합니다.

Hate Speech Dataset을 사용한 HAN 모델의 성능

B : undersampling 기법을 이용 더 많은 데이터를 가진 클래스의 데이터를 제거하여 균형을 맞춘 Balanced Data

ImB : 주어진 데이터셋 그대로 클래스들이 불균형한 Imbalanced Data

Accuracy : 전체 데이터 중에서, 제대로 분류된 데이터의 비율

F1 : PrecisionRecall의 조화 평균,, 데이터 label이 불균형 구조일 때, 모델의 성능을 정확하게 평가 가능

 

 

 

5개의 Hate Speech Dataset을 사용하여 총 두 번의 실험을 진행했습니다.

 

첫 번째 실험은 주어진 데이터셋 그대로 클래스들이 불균형한 Imbalanced Data를 사용합니다.

 

두 번째 실험은 sampling 기법 중 under-sampling 기법을 이용해서 더 많은 데이터를 가진 클래스의 데이터를 제거하여 균형을 맞춘 Balanced Data를 사용하여 실험합니다.

 

imbalance data로 모델을 학습할 경우 accuracy를 통해 모델 성능을 확인할 수 없습니다.

 

모델이 잘못된 분류하는 경우에도 높은 정확도가 계산되기 때문에 성능 평가 지표로 F1을 사용해야 합니다.

 

그래프는 각각의 데이터셋을 Balanced 또는 Imbalacend 하게 실험한 뒤 accuracy F1을 통해 성능을 확인한 그래프입니다.

 

그래프를 보면 Wikipedia data가 Balanced의 Accuracy와 Imbalanced의 F1에서 가장 높은 성능을 보인 것을 볼 수 있습니다. 

 

 

 

실험 결과(2)

Dataset

Models(others) - SOTA

HAN(ours)

Balanced

/Imbalanced

 

Accuracy

F1

Accuracy

F1

Hatebase¹

Neural Ensemble

0.92

0.91

0.9

0.70

Imbalanced

WaseemA²

LSTM+Random Embedding+GBDT

-

0.93

0.84

0.79

Imbalanced

Stormfront³

BERT

0.82

0.82

0.79

0.79

Balanced

Wikipedia Detox⁴

Context hidden-state + char n-grams

-

0.87

0.95

0.88

Imbalanced

Kaggle5

Stemming + Uni + Bigrams

0.82

0.67

0.81

0.81

Balanced

 

이 표는 각각의 데이터셋에서 최고의 성능을 보인 모델들을 정리하고 그 모델의 실험 조건에 따라서 HAN의 성능을 정리한 표입니다.

 

그 결과 HAN모델이 Wikipedia와 Kaggle Data에서 이전의 SOTA 모델보다 높은 성능을 보였습니다.

 

 

 

실험 결과(3)

데이터 셋

Source

클래스

데이터 수

평균 문장 수

평균 문장 단어 개수

Hatebase¹

Twitter

3

24,783

1.39

10.13

WaseemA²

Twitter

3

16,135

1.80

8.50

Stormfront³

Online Forum

2

10,703

1.11

16.32

Wikipedia Detox⁴

Wikipedia

discussions

2

115,864

4.55

16.00

Kaggle5

Twitter

2

6,594

2.21

15.02

 

[1] https://github.com/t-davidson/hate-speech-and-offensive-language

[2] https://github.com/ZeerakW/hatespeech

[3] https://github.com/Zeerak/hatespeech

[4] https://github.com/ewulczyn/wiki-detox

[5] https://www.kaggle.com/c/detecting-insults-in-social-commentary

 

 

 

데이터들에 대해 데이터 수, 평균 문장 수, 평균 문장 단어 개수 등을 정리해 본 표입니다.

 

그 결과, Wikipedia와 Kaggle Data가 다른 데이터들에 비해 평균 문장 수, 평균 문장 단어의 개수가 많았고, Class가 2개인 데이터로 구성되어있었습니다. 

 

이 말은 평균 문장의 수가 많고, Class가 적을수록 HAN에서 높은 성능을 보인다고 추측할 수 있습니다.

 

동일한 Hatebase와 Waseem에서는 왜 성능이 높게 안 나왔는지 궁금해하실 수도 있습니다.

 

제 추측으로는 Kaggle data가 다른 Twitter으로 구성된 데이터보다 더 긴 tweet으로 구성되어 있어 HAN모델에서 높은 성능을 보인 것으로 생각됩니다. 

 

이렇게 HAN은 짧은 문장보다는 문서 단위 알고리즘에 적합한 모델이라는 것을 알게 되었습니다.

 

 

 

Waseem Word attention visualization

 

<Sexism tweet example>

Sexism tweet example

트윗을 분류하는데 어떤 단어들이 얼마큼의 영향을 주는지에 대해 색의 진함으로 표현

(색이 진할수록 문서를 분류하는데 큰 영향을 준 단어)

 

 

다음은 저희가 실험했던 데이터 셋 중 Waseem data 일부에 대한 시각화 결과입니다.

 

HAN 모델이 Waseem data를 학습하여 트윗을 Sexism, Racism으로 분류할 때, 어떤 단어가 얼마큼 크게 영향을 미쳤는지 시각화해서 볼 수 있습니다.

 

HAN 모델이 Sexism tweet으로 분류한 tweet 중 실제 Class가 Sexism tweet인 Example입니다.

 

"Sexist" 와 같은 단어들이 문장을 Sexism 이라고 판단하는데 큰 영향을 주웠음을 확인할 수 있습니다.

 

 

 

<Racism tweet example>

 

Racism tweet example

 

다음은 Racism tweet으로 분류된 tweet 중 실제 class가 Racism tweet인 예시입니다.

"Muslim, Islam, religion(종교), jewish (유대인), prophet(선지자)" 같은 단어들이 tweet이 Racism이라고 판단하는데 영향을 주웠음을 확인할 수 있습니다.

 

현재까지의 인공지능이 결과만 있고 도출한 결과의 근거를 없었다면 HAN 모델의 attention mechanism 이러한 시각화를 통해 특정 문서가 특정 라벨로 분류되었을 , 근거가 되는 단어나 문장들을 있습니다.

 

이는 explainable AI, 설명 가능한 인공지능 형태입니다.

 

이번 연구를 통해 저희는 HAN모델이 문서 분류뿐만 아니라 혐오 표현 탐지에도 효과가 있다는 것을 확인했습니다.

 

반응형

+ Recent posts