| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 데이터분석
- 내일배움캠프#til#파이썬#python#전처리
- 카이제곱검정
- 내일배움캠프#til#sqld#eda#데이터리터러시
- 내일배움캠프#til#파이썬#python
- #내일배움캠프 #사전캠프 #til #sql
- 다중검정
- Ai
- 통계101x데이터분석
- 제2종오류
- 제1종오류
- 이상탐지
- 데이터
- 가설검정
- 책
- 딥러닝
- 통계학
- 이상치 제거
- 통계
- t검정
- 통계학공부
- 내일배움캠프#til#sql
- vscode
- 내일배움캠프#til#파이썬#python#통계학
- 라이브 세션
- 차원축소
- 내일배움캠프#til#sqld
- 내일배움캠프#til#데이터 리터러시
- A/B테스트
- 머신러닝
- Today
- Total
Ming's Life
[내일배움캠프] 9일차 본문
1. 오늘 학습 키워드
- 기초 데이터 분석 팀과제
2. 오늘 학습 한 내용을 나만의 언어로 정리하기
EDA(Exploratory Data Analysis)
1. 아마존 책 리뷰 데이터를 파악
Objective: 아마존 책 정보와 리뷰 데이터를 파악하고 다양한 분석을 해보고 이상치, 결측치 찾아서 해결하기
원본 데이터가 양이 크기 때문에 다음과 같이 샘플을 추출하여 데이터 분석
- sampled_books: 책 4.2만개 정보(3.6MB)
- sampled_ratings: 60만 개의 리뷰(50MB)
sampled_books: 책에 대한 정보가 있는 테이블
| 변수명 | 설명 |
| Title | 책 제목 |
| description | 책 줄거리 |
| authors | 저자명 |
| image | 책 표지 링크 |
| previewLink | google Books에서 책의 링크 |
| publisher | 출판사명 |
| publishedDate | 출판일 |
| infoLink | google Books에서 책의 상세페이지 링크 |
| categories | 책 장르 |
| ratingsCount | 책 평균평점 |
사실상 링크변수는 분석 시 사용하지 않으므로 분석 시 image, previewLink, infoLink 컬럼은 사용하지 않을 것이다.
sampled_ratings: 리뷰에 대한 정보가 있는 테이블
| 변수명 | 설명 |
| id | 책 아이디 |
| Title | 책 제목 |
| Price | 책 가격 |
| User_id | 리뷰를 작성한 사용자 아이디 |
| profileName | 리뷰를 작성한 사용자명 |
| review/helpfulness | 책의 유용함 리뷰(비율로서 평가, 0부터 1 사이의 값) |
| review/score | 리뷰 점수(0부터 5 사이의 값) |
| review/time | 리뷰 작성 시간 |
| review/summary | 리뷰 요약 |
| review/text | 리뷰 원본 |
profileName, review/time도 사용하지 않을 것이다.
limit 이용하여 테이블 컬럼들 확인하기
처음 10개의 row 만 보여줌
books
select *
from sampled_books
limit 10
ratings
select *
from sampled_ratings
limit 10
ratings 테이블의 title컬럼과 books 테이블의 title컬럼을 join
select *
from sampled_books b inner join sampled_ratings r on b.title=r.title
두 테이블의 Title이 같은 변수이므로 inner join을 사용하여 합친다.
두 테이블을 병합하여 하나의 테이블로 merge하려 했으나 데이터 반정규화를 우려하여 병합하지 않을 것이다.
데이터 파악에 image, previewLink, infoLink, profileName, review/time 컬럼은 유용하지 않으므로 나머지 컬럼들만 이용할 것이다.
books테이블에 ratingsCount컬럼은 ratings테이블에 review/score컬럼의 평균일까? 아니면 ratings테이블에 review의 개수일까?
1. ratingsCount컬럼과 ratings테이블에 review/score컬럼의 평균 비교
select r.title, b.ratingsCount, round(avg(r.`review/score`), 1) avg_score
from sampled_ratings r inner join sampled_books b on r.title=b.title
group by 1, 2
limit 100
review/score컬럼의 평균과 일치하지 않는 값이 많다.
따라서 books테이블에 ratingsCount컬럼은 ratings테이블에 review/score컬럼의 평균이라고 볼 수 없다.
2. ratingsCount컬럼과 ratings테이블에 review의 개수 비교
select b.ratingsCount, count(r.title) 'cnt_review'
from sampled_ratings r inner join sampled_books b on r.title=b.title
group by 1
limit 100
review의 개수와 일치하지 않는 값이 많다.
따라서 books테이블에 ratingsCount컬럼은 ratings테이블에 review의 개수라고 볼 수 없다.
3. ratingsCount의 Null값
(books테이블에 있는 row는 대략 4만9천개)
select ratingsCount, count(*)
from sampled_books
where ratingsCount is null
group by 1
(ratingsCount null값은 대략 3만2천개)
ratingsCount의 null 값이 너무 많다.
ratingsCount변수를 파악해봤을 때 명확하지 않다. 또한 Null값이 너무 많다. →ratingsCount컬럼을 분석 시 고려하지 않을 것이다.
2. 생각해볼 수 있는 분석 방향
- 인기가 많은 작가를 찾아서 상위 10위 작가를 도출하고 작가별로 다른 컬럼에서 특징이 있는지
- 인기가 많은 출판사를 찾아서 상위 10위 출판사를 도출하고 출판사별로 다른 컬럼에서 특징이 있는지
- 인기가 많은 책 장르를 찾아서 상위 5위 장르를 도출하고 장르별로 다른 컬럼에서 특징이 있는지
특히 작가별로 리뷰를 분류하고 순위를 매기는 것은 작가를 따라 책을 소비하는 최근 트렌드와 맞는지 확인할 수 있다. 따라서 작가별 분석은 더 깊게 ‘fan’등의 단어가 review/summary나 review/text에 포함되어 있는지 확인할 수 있다.
3. 인기가(리뷰수가) 많은 작가를 찾아서 상위 10위 작가를 도출하고 작가별로 다른 컬럼에서 특징이 있는지
평점 vs. 리뷰수
모든 세부 분석 전에 두 테이블에서 판매량 변수가 없기 때문에 우리는 책의 인기를 평점으로 판단할 것인지, 리뷰수로 판단할 것인지 결정해야 한다.
group by, limit 이용하여 평점이 높은 상위 10위 작가 도출하기(평점 평균이 높은 책 상위 10위을 가져오며, 동점일 경우 리뷰수가 많은 책을 우선 출력)
select b.authors, r.title, b.categories, count(1) cnt_review, round(avg(r.`review/score`), 1) avg_score
from sampled_ratings r inner join sampled_books b on r.title=b.title
group by 1, 2, 3
order by 5 desc, 4 desc
limit 10
작가별 평점순은 비지니스나 논픽션, 종교 등 비소설 분야의 작가가 강세이고 리뷰 수가 비교적 적다.
group by, limit 이용하여 리뷰수가 높은 상위 10위 작가 도출하기(리뷰수가 많은 책 상위 10위을 가져오며, 동점일 경우 평점이 높은 책을 우선 출력)
select b.authors, r.title, b.categories, count(1) cnt_review, round(avg(r.`review/score`), 1) avg_score
from sampled_ratings r inner join sampled_books b on r.title=b.title
group by 1, 2, 3
order by 4 desc, 5 desc
limit 10
작가별 리뷰수순은 소설 분야의 작가(톨킨 만만세)가 강세이고 리뷰수가 압도적으로 많아서 분석하기 좋다.
리뷰수는 얼마나 많은 사람이 읽고 리뷰를 남겼는가, 평점은 독자들이 얼마나 만족했는가를 보여주는 지표이기에 두 개가 모두 높을 수록 인기가 높은 책이다.
평점은 바로 보이는 만족도를 보여주고, 리뷰수는 사회적으로 검증된 효과를 보여준다. 그러나 리뷰수가 적으면 신뢰도가 낮아지며 평점은 양은 많아도 그안에 든 질이 낮을 수 있다.
또한 실제 사용자의 데이터이므로 평점에서의 결측치도 무시할 수 없다.
따라서 인기는 리뷰수로 우선 정렬한 후, 평점으로도 정렬한 순위로 판단한다.
인기가 많은 작가를 찾아서 상위 10위 작가를 도출할 때 작가의 팬이 많을 수록 책을 많이 읽고 리뷰를 많이 남기는지가 궁금하다. 따라서 review/summary나 review/text에서 ‘fan’, ‘into’, ‘interest’, ‘stan’ 등의 표현있는지 찾아본다.
in, like 이용하여 review/summary나 review/text에서 ‘fan’, ‘into’, ‘interest’, ‘stan’ 등의 표현있는지 찾아보기
우선 작가별 리뷰수 순위를 알아보자. (리뷰수 우선 정렬 후, 평균 평점 정렬)
select b.authors, count(1) cnt_review, round(avg(r.`review/score`), 1) avg_score
from sampled_ratings r inner join sampled_books b on r.title=b.title
group by 1
order by 2 desc, 3 desc
limit 20
리뷰수순으로 작가를 정렬했을 때의 결과값이다. 리뷰수: cnt_review
다음은 작가별 ‘fan’, ‘into’, ‘interest’, ‘stan’ 등의 표현을 사용한 리뷰의 개수 순위이다.
select b.authors,
COUNT(*) cnt
from sampled_ratings r INNER JOIN sampled_books b ON TRIM(LOWER(r.title)) = TRIM(LOWER(b.Title))
where `review/text` like "% fan %"
or `review/text` like "% interest %"
or `review/text` like "% into %"
or `review/text` like "% stan %"
or `review/summary` like "% fan %"
or `review/summary` like "% interest %"
or `review/summary` like "% into %"
or `review/summary` like "% stan %"
group by 1
order by 2 desc
작가별 ‘fan’, ‘into’, ‘interest’, ‘stan’ 등의 표현을 사용한 리뷰의 개수순으로 작가를 정렬했을 때의 결과값이다. 리뷰수: cnt
여기서 두 결과값을 join하고 cnt를 cnt_review로 나누면 각 작가별 전체 리뷰수 중 팬과 관련된 용어를 사용한 리뷰수의 비율을 구할 수 있다. 비율이 큰 순서대로 정렬한다.
select ca.authors, cb.cnt/ca.cnt_review
from
(select b.authors, count(1) cnt_review, round(avg(r.`review/score`), 1) avg_score
from sampled_ratings r inner join sampled_books b on r.title=b.title
group by 1
order by 2 desc, 3 desc
limit 20) ca
inner join
(select b.authors,
COUNT(*) cnt
from sampled_ratings r INNER JOIN sampled_books b ON TRIM(LOWER(r.title)) = TRIM(LOWER(b.Title))
where `review/text` like "% fan %"
or `review/text` like "% interest %"
or `review/text` like "% into %"
or `review/text` like "% stan %"
or `review/summary` like "% fan %"
or `review/summary` like "% interest %"
or `review/summary` like "% into %"
or `review/summary` like "% stan %"
group by 1
order by 2 desc) cb
on ca.authors=cb.authors
group by 1
order by 2 desc
상위 10위의 작가들은 팬과 관련된 용어를 사용한 리뷰수가 그 작가의 전체 리뷰수의 20%~35%가 되는 것을 확인할 수 있다.
따라서 사람들은 어떤 작가의 팬일수록 리뷰를 많이 한다는 것을 알 수 있다. 그만큼 판매량이 많은지는 판매량 지표가 없기 때문에 다른 문제이다.
3. 학습하며 겪었던 문제점 & 에러
-
4. 내일 학습 할 것은 무엇인지
SQL 코드카타 ,기초 데이터 분석 팀과제
'내일배움캠프' 카테고리의 다른 글
| [내일배움캠프] 주말 공부 -1 (0) | 2025.05.25 |
|---|---|
| [내일배움캠프] 10일차 (0) | 2025.05.23 |
| [내일배움캠프] 8일차 (0) | 2025.05.21 |
| [내일배움캠프] 7일차 (0) | 2025.05.20 |
| [내일배움캠프] 6일차 (0) | 2025.05.19 |