TIL 126일차 : 군집개수 확정하기

2024. 4. 24. 14:20회고/TIL(매일)

 

✏️도전한 점


1. 컬럼 다이어트에 대한 감을 잡아가고 있다.

- 수집된 데이터가 극도로 적은 키워드가 전체 군집화 단위로 볼 때 노이즈가 될 수 있음.

- 컬럼의 수를 늘린다면 이것만 모일 수 있을까?

2. 클러스터링의 필요성에 대한 보충 고민, 프로젝트 보완점 고민했다.

- 처음에 피드백 받았던 내용 중에 단순 집계가 아닌 군집화를 한 이유에 대해서 설명하려면 군집수가 적어야? 다양해야? 겠다는 내용이 있었다. 군집을 하는 이유가 29개의 컬럼을 어떤 기준으로 묶어야 할지 모르겠으니까 였다. 9개의 컬럼으로 줄였다면 9개의 버튼을 구현하면 되는데 왜 군집화를 했는가?에 대해 설명할 수 있어야 한다.

- 다음에 고민할 부분은 리뷰별로 여러개의 군집을 띄는 경우의 수를 피할 수 없다면 최빈값으로 보는 게 맞는가에 대한 고민이다.

3. 스트림릿 버튼을 누르면 이동해서 내용물 보여주는 기능 구현했다.

 

01 컬럼 다이어트 실습


1. 특성 컬럼 29개를 모두 사용했을 때는 군집화라고 볼 수 없겠다.

2. 상관도 높은 컬럼 중 하나만 남겨서 3개 삭제, 경사도 삭제 했는데 parking이 껴있었다.

3. 여기에 parking을 삭제하니 다양해 진다. = 상관도 3, 경사도 삭제

1. 리뷰수 삭제

2. 평점 삭제

3. 비건 삭제

1. 노시니어 삭제는 노키즈 존 삭제와 비슷하다.

2. 펫동반 삭제

3. 특선 메뉴 삭제

 

02 버전 4, 버전 5


- 파이차트는 골고루 있어도 내부에 치우쳐진 데이터가 있으면 이게 노이즈가 되는 구나

- 그리고 원래 하던 그래프에 군집을 6>5로 했을 뿐인데 음료 특성 군집이 사라지더라.

 

03 버전 5 그대로, 컬럼 9개에서 인테리어 삭제 전후의 차이


- 총 컬럼 10개를 선정한 기준은 데이터가 한 쪽으로 치우치지 않고 데이터가 골고루 수집된 것.

- 이용자들이 빵집을 고를데 1차적으로 선정할 수 있는 기준과 일치할 수 있다.

- 빵맛과 친절함(+가성비), 음료맛, 뷰와 분위기, 넓고 쾌적한 매장, 아름다운 인테리어로 크게 나뉜다.

- 0군집에 해당하는 '평균 이하 혹은 평균인 매장'에는 어떤 매장이 있는지 확인할 필요가 있다.

 

04 47.4%에 해당하는 군집의 데이터를 확인한다.


 

# 무난한 군집에서 약 0.02%+@가 최악의 점수를 가지고 있는데
1. 불호 리뷰가 제대로 분류되지 못했는지? 그럼 해당 군집만 가지고 2차 클러스터링을 할 수 있는지?
2. 해당 군집은 최빈값이 모두 0이다. 수가 0.02% 정도로 적으니 이 군집의 특정이 0인 거다.
-> 2차 클러스터링도 가능하다. 아이디어가 좋다.
-> 어떻게 해도 안빠지는 값은 어쩔 수 없다고 볼 수 있다.

# 무난하다 판단하고 이 빵집은 추천에서 제외시키고자 한다.
- 모든 빵집의 리뷰를 보여주고 싶은게 아니라.
- 키워드 별로 선별된 내용을 보여주고 싶은 거니까.
-> 굿

# 하나의 가게가 여러가지 2개 이상의 군집을 가지고 갈 수 있다.
- 현재 진행사항은 최빈값으로 가게의 특성을 정해버리는 것이다.
- 나는 여기서 더 그룹화 시키지 않고 그대로 가져가고 싶다.
- 고객이 분위기 좋은 빵집을 찾았을 때, A가게가 나왔어도
가게가 쾌적한 곳을 찾을 때, A가 또 나올 수 있는 것이다.
-> 작업할 때 복잡해질 수 있다. 최반값은 한번만 해도 되니까.
-> 복잡하지만 그럴싸한 서비스를 제공할 수 있다.

# 데이터 수집을 했다. 근데 불호인 애들은 처음부터 완전히 빼고 시작을 했다.도 가능하다.
- 불호를 추천 해줄리 없으니까.
- 이렇게 하면 데이터가 적어지는 문제, 고민, 걱정이 있다.
- 그리고 이 군집은 불호인 클러스터입니다.라고 설명한 점도 사라진다.

# 방법 1: 0번 군집만 가지고 2차 클러스터링을 해본다.
# 방법 2: 빵맛 불호 리뷰를 제거하고 클러스터링을 한다.

 

05 튜터님 피드백


1. 클러스터링 추가 질문

더보기

# 피드백처럼 리뷰수에 로그 씌워보는 것은?
- 씌우는 건 문제가 없다. 두 경우를 모두 비교를 해보면 되겠다.

# 무난무난한 애들 처리하실 때
-  이런 경우는 채택이 되지 않기 때문에 고민해 본 경우는 없지만, 이유는 도메인별로 다르겠다.

# 튜터님 파일 실루엣 계수
- 데이터가 얼마나 분산되어 있는지도 보고.. 참고자료 정도 저렇게 넓으면 몰려있는게 맞음.

# 초기 컬럼삭제의 기준
- 데이터가 한쪽으로 치우쳐져 있을 때 95퍼가 0이고 5퍼가 1일때 우선적으로 지울 수 있음.
- 근데 이게 영향을 줄 수 있으니 두가지 로우 데이터를 비교해본다. 맞다.
- 그리고 다른 기준이 있다면? 도메인 별로 이게 좀 달라진다.
- 지금처럼 <평균값>을 보는 게 맞고, <중앙값>도 봐주면 좋다.
- 무난 무난한 애들에 많은 데이터가 치우쳐져 있다면 컬럼, 군집 수를 변경해본다.

# 라인그래프로 로우단위 보기
- 라인그래프는 특성컬럼의 평균으로 확인하는게 맞다. 얘네가 비슷한 애들끼리 모여있다 가정했음.
- 로우 데이터를 볼때 박스플롯으로 컬럼별 분포를 확인하는 건 수준별 튜터님의 추천 방법!

# 현업에서는?
- 튜터님은 군집에 영향을 주지 않는 컬럼을 삭제하고, 파일을 보니 pca는 2차원으로 볼때만 쓰시네
- 컬럼은 직접 삭제하고 pca로 한번에 압축시키는 방법은 하지 않음. (헉)

# 클러스터링이란
- 처음이 어렵다. 적응되면 괜찮음.

 

2. 클러스터링, API 등

더보기

# 데분 성격이 강할 때, **홈쇼핑에서 크롤링
- 타사 가격을 변수로 넣어보자
- 업체 가격이 비싸다 크롤링
- 결제하기 전에 너네가 해봐라
- 쿠팡은 어려워서 못했고
- ssg, 컬리 가격을 크롤링
- 법적으로 안되는 부분이 있으니 주의
- 셀레니움으로 틀을 만들고 뷰숲도 썼음.

# API는 구글링으로 배움.
- 쉬운 거부터 해본다.
- 네이버 개발자 센터 한창 핫할 때가 있었음.
- 금시세 정보를 제공했거든
- 지금도 네이버 개발자 센터, api 가능

# 공공데이터포털도 api 연습
- 쓰다보면 어떻게 작동되는지 아니까 괜찮아짐.
- pymysql로 먼저 배워서 섞어서 쓰게 된다.

# 기타

- key를 지금은 잘 안써서 찾아봐야 한다.

- streamlit은 CSS까지 써서 구현하진 않음.

 

3. 클러스터링의 필요성

더보기

# 각 가게의 리뷰마다 카운팅을 한다.
- 벡터치가 있을거니까
- 군집을 돌린다.

- 클러스터링을 왜 하는지 의문이 든다.

# 가중치

- 마이너스를 더 곱해서 끌어내리고,
- 리뷰 수에 대한 보상 지표 더 점수를 줄 수 있다.

- 분석가의 주관이 들어가는 부분!

 

# Gpt가 중립을 0점으로 줬다면 이해가 간다.
- 중립, 특성이 없었을 때 0점이라 nan값으로 넘어가는게 맞음.
- 제생각은 -100에서 +100 0부터 200으로 만들고 나누기 2한다.

 

# 파이썬 공부
- 크롤링은 한달 내의 유튜브 영상을 봐야한다.
- 오래된 코드는 실습하기 어렵다.

- 개인적으로 유튜브 잘되어 있다고 생각함.

 

# 유튜브 키워드 추천
- 파이썬 크롤링 프로젝트
- 크롤링 프로젝트 
- 파이썬 api 프로젝트
- 파이선 자동화 프로젝트

 

# 책으로는 기술보다
- 언어 공부하기 좋음. 파이썬 같은.

 

4. 팀원의 고민 해결하기

더보기

- 스트림릿 변수 하나가 안된다.
- 스트림릿 자체가 페이지로 넘어가잖아.
- 랜덤으로 가게 보고 뒤로가서 같은거 보려면 세션 스테이트를 준다.
- 130~159까지가 튜터님 함수다. 추가해서 넣은 부분 해결하기!

 

06 stramlit, 버튼의 on_click


tip) 항상 알고 있길: 스트림릿은 우리 생각과 다르게 매번 첫번째 코드부터 돌아간다.

tip) 첫버튼 씹힘: 버튼 액션을 st버튼 안에 아래의 함수를 실행해라고 내장시켜버린다.

 

tip) 해결방법

1. 세션 스테이트는 변수 값의 영구 저장을 도와준다. tmp=None을 변형한다.

if 'tmp' not in st.session_state:
    st.session_state.tmp = None

- 아래는 원래 사용했던 코드에서 2번으로 수정했다.

if b1.button('맛있는 빵과 친절함', type="primary"):
    st.session_state.page = 'breadmap'
    st.session_state.tmp = '0'

 

2. 버튼이 씹히는 문제는 클릭 함수를 추가해서 해결한다.

def button_click(page):
    st.session_state.page = page

- 이렇게 하면 args로 받은 입력 값이 button_click함수의 page로 받는다.

if b1.button('맛있는 빵과 친절함', type="primary", on_click=button_click, args=("cluster_0",)):

- 버튼을 클릭하면 st.session_state.page라는 변수는 cluster_0을 담는다.

elif st.session_state.page == "cluster_0":
    print(st.session_state.page)
    cluster_0()

- st.session_state.page가 클러스터0이 되면 cluster_0()함수가 실행된다.