Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
Tags
- 데이터분석
- 데이터리안
- 누적합
- pandas
- funnel
- row_number
- dense_rank
- SolveSQL
- python
- Datarian
- Retention
- 서브쿼리
- 독서
- 순위함수
- SQL
- regexp
- advent of sql
- MYSQL
- 린분석
- 퍼널분석
- 윈도우함수
- 신입 데이터분석가
- 그로스해킹
- LEFTJOIN
- 취준
- 리텐션
- rank
- leetcode
- 프로그래머스
- 윈도우 함수
Archives
- Today
- Total
데이터 분석
[Day 9] solvesql | Advent of SQL 2024 | 게임 평점 예측하기 1💡 본문
게임 평점 예측하기 1
문제 조건
1. 2015년 이후에 발매한 게임 중 누락된 평점 데이터를 대체
2. 같은 장르를 가진 전체 게임의 평균 평점과 평점을 남긴 평균 평론가/사용자 수를 사용해 누락된 정보를 대체할 것
3. 평균 평점은 반올림하여 셋째 자리까지, 평론가/사용자 수는 올림 하여 자연수로 표현
Solution
✅ MySQL
/*
1) 2015년 이후 발매한 게임 >> 출시 연도 >= 2015
2) 누락된 평점 정보가 있는 게임만을 출력
3) 평점 평균은 셋째 자리까지 표현, 사용자 수는 올림하여 자연수 표현
*/
WITH sub AS ( -- 대체값은 전체 게임 대상
SELECT genre_id
, ROUND(AVG(critic_score), 3) AS critic_score
, CEIL(AVG(critic_count)) AS critic_count
, ROUND(AVG(user_score), 3) AS user_score
, CEIL(AVG(user_count)) AS user_count
FROM games
GROUP BY genre_id
)
-- 누락된 평점 정보만 대체할 것, 누락되지 않은 값은 그대로 출력
SELECT g.game_id
, g.name
, IFNULL(g.critic_score, s.critic_score) AS critic_score
, IFNULL(g.critic_count, s.critic_count) AS critic_count
, IFNULL(g.user_score, s.user_score) AS user_score
, IFNULL(g.user_count, s.user_count) AS user_count
FROM games g
JOIN sub s ON g.genre_id = s.genre_id
WHERE g.year >= 2015
AND (g.critic_score IS NULL
OR g.critic_count IS NULL
OR g.user_score IS NULL
OR g.user_count IS NULL)
CEIL() : 값보다 큰 정수 중 가장 작은 정수 반환, 즉 올림을 의미함
IFNULL(A, B) : 컬럼 A가 null인 경우 값 B로 대체
✅ SQLite
WITH avg_ratings_by_genre AS (
SELECT
genre_id,
ROUND(AVG(critic_score), 3) AS avg_critic_score,
CAST(AVG(critic_count) + 0.99999 AS INTEGER) AS avg_critic_count,
ROUND(AVG(user_score), 3) AS avg_user_score,
CAST(AVG(user_count) + 0.99999 AS INTEGER) AS avg_user_count
FROM games
GROUP BY genre_id
),
missing_ratings_games AS (
SELECT
game_id,
name,
genre_id,
critic_score,
critic_count,
user_score,
user_count
FROM games
WHERE year >= 2015
AND (critic_score IS NULL
OR critic_count IS NULL
OR user_score IS NULL
OR user_count IS NULL)
)
SELECT
g.game_id,
g.name,
COALESCE(g.critic_score, r.avg_critic_score) AS critic_score,
COALESCE(g.critic_count, r.avg_critic_count) AS critic_count,
COALESCE(g.user_score, r.avg_user_score) AS user_score,
COALESCE(g.user_count, r.avg_user_count) AS user_count
FROM missing_ratings_games g
JOIN avg_ratings_by_genre r ON g.genre_id = r.genre_id
▶ Step 1: 장르별 평균 평점 계산
먼저, genre_id별로 critic_score, critic_count, user_score, user_count의 평균값을 구한다. 이때 사용자/평론가 수는 CAST 함수를 사용해 자연수로 변환한다.
▶ Step 2: 누락된 평점 데이터를 가진 게임 필터링
critic_score, critic_count, user_score, user_count 중 하나라도 NULL 값을 가진 게임을 필터링한다. 단, 조건으로 2015년 이후 발매된 게임만 포함한다.
▶ Step 3: 누락된 데이터를 평균값으로 채우기
COALESCE 함수는 인수를 2개로 한 경우 IFNULL 함수와 동일한 역할을 수행한다.
✔️ 0209 0819 복습
'SQL > solvesql' 카테고리의 다른 글
| [Day 11] solvesql | Advent of SQL 2024 | 서울숲 요일별 대기오염도 계산💡 (1) | 2024.12.11 |
|---|---|
| [Day 10] solvesql | Advent of SQL 2024 | 최대값을 가진 행 찾기 (0) | 2024.12.10 |
| [Day 8] solvesql | Advent of SQL 2024 | 온라인 쇼핑몰의 월 별 매출액 집계 (0) | 2024.12.10 |
| [Day 7] solvesql | Advent of SQL 2024 | 기증품 비율 계산하기💡 (1) | 2024.12.07 |
| [Day 6] solvesql | Advent of SQL 2024 | 게임을 10개 이상 발매한 퍼블리셔 찾기 (0) | 2024.12.06 |