웅진X유데미 STARTERS/TIL (Today I Learned)

[스타터스 TIL] 39일차.태블로 실전 트레이닝 (15) - 팀 프로젝트

라밍쏭 2023. 4. 1. 23:20
728x90

 

팀 프로젝트를 하루종일 진행하였다.

오늘은 데이터를 정제하고, 레이아웃을 정하니 하루가 금방 지나갔다..!😂


1. 데이터 전처리

1.1 ⛑ Troubleshooting

1. MySQL로 import했을 때 8717개 데이터만 나오는 현상 발견

2. NaN값 모두 제거되고 $를 인식하지 못해 Paid 데이터도 모두 제거되어서 발생함

3. [해결방안] json 파일로 변환하여 import하기

 

1.2 MySQL로 전처리

- googleplaystore.csv : 10,841개
- MySQL에 import한 전체 데이터 : 10,778개 (-63)
  → Category = ‘1.9’ 데이터 자동 삭제됨

  → 그 외의 자동 삭제된 데이터가 있지만 일일이 확인이 어려움 ㅠㅠ

 

✅ 전처리할 사항
1. 빈 값 제거 (import 시 제거됨)

-- 데이터베이스 불러오기
USE GOOGLE_PLAYSTORE;

-- 데이터 확인 
SELECT *
FROM googleplaystore_re;

-- 전체 데이터 갯수 : 10778
SELECT COUNT(*)
FROM googleplaystore_re;


2. 중복 행 제거 (모든 열의 값이 다 똑같은 경우)

-- 1. 중복 행 제거
CREATE TABLE googleplaystore_re2
(SELECT DISTINCT * FROM googleplaystore_re);

SELECT *
FROM googleplaystore_re2;

-- 데이터 갯수 : 10296
SELECT COUNT(*)
FROM googleplaystore_re2;


3. 동일 앱인 중복 행 제거 (Reviews만 다른 경우)

-- WITH 절 사용 (내가 작성한 쿼리)
WITH max_reviews AS (
	SELECT App
		 , Category
		 , MAX(Reviews) as reviews_2
	FROM googleplaystore_re2
	GROUP BY 1, 2
    )

SELECT g.App, g.Category, g.Rating, Reviews, Size, Installs, Type, Price, Content_Rating, Genres, Last_Updated, Current_Ver, Android_Ver
FROM googleplaystore_re2 AS g
	INNER JOIN max_reviews AS m
		ON g.reviews = m.reviews_2;
-- 서브쿼리 활용 (팀원이 작성한 쿼리)
SELECT g1.App, g1.Category, g1.Rating, g1.Reviews, Size, Installs, Type, Price, Content_Rating, Genres, Last_Updated, Current_Ver, Android_Ver
FROM googleplaystore_re2 AS g1
	 INNER JOIN (SELECT App
					  , Category
					  , MAX(Reviews) AS Reviews
				 FROM googleplaystore_re2
				 GROUP BY 1,2) g2 ON g1.App = g2.App
								  AND g1.Category = g2.Category
                                  AND g1.Reviews = g2.Reviews;

 

-- 3. 중복 제거한 데이터를 테이블로 생성
CREATE TABLE googleplaystore_3
(SELECT g1.App, g1.Category, g1.Rating, g1.Reviews, Size, Installs, Type, Price, Content_Rating, Genres, Last_Updated, Current_Ver, Android_Ver
FROM googleplaystore_re2 AS g1
	 INNER JOIN (SELECT App
					  , Category
					  , MAX(Reviews) AS Reviews
				 FROM googleplaystore_re2
				 GROUP BY 1,2) g2 ON g1.App = g2.App
								  AND g1.Category = g2.Category
                                  AND g1.Reviews = g2.Reviews);


4. Installs에 + 지우기

UPDATE googleplaystore_3
SET Installs = replace(Installs, '+', '');

 

5. Genres에 ';' → ':'로 변경

UPDATE googleplaystore_3
SET Genres = replace(Genres, ';', ':');

 

6. CSV 파일로 내보내기

SELECT *
FROM googleplaystore_3
LIMIT 10000;

2. 레이아웃 짜기

어제 아프셔서 조퇴하신 팀원이 오늘은 쾌차까진 아니지만 많이 나으신 상태로 오셔서 다시 같이 이야기를 나눠보았다.

이를 기반으로 대시보드 레이아웃에 대한 의견을 말해주셨는데, 좀 더 이해가 되어서 이 분의 의견을 바탕으로 레이아웃을 다시 짜보았다.

 

대시보드가 2개에서 3개로 변경이 되었고, 각각에 대한 대시보드 레이아웃을 팀원들이 하나씩 맡아서 짰다.

(나는 데이터 정제함!)

 

2.1 레이아웃

✅ 구상한 레이아웃

1) 전체적인 Google Playstore의 현황 대시보드

2) 카테고리에 따른 Google Playstore의 현황 대시보드

3) 카테고리, 장르 별로 2차 창작물을 제작 시 참고할 앱 리스트 제공 대시보드

 

 

2.2 레이아웃에 대한 피드백

- 워드클라우드를 레이아웃에 굳이 사용할 필요는 없음 (대부분 자료에 캡쳐해서 넣음)

- 워드클라우드가 2개 쓰이는 것 살짝 주의할 필요 있음! (적절히 사용하기)

- 2번, 3번 대시보드가 이어져야 하기 때문에 2번에서 3번 대시보드로 넘어갈 때 매끄럽게 설명할 수 있도록 만들기

 


💡 회고

데이터 전처리를 한다고 오랜만에 SQL을 했는데, 바보가 된 기분이었다....ㅇㅂㅇ

예전에는 나름 쿼리를 잘 짰다고 생각했는데, 오늘 쿼리를 짜는데 쉽지 않았다. 그새 많이 까먹었나보다.

쿼리 짜는 것, 그리고 MySQL에 파일을 임포트할 때, 데이터가 손실된 데이터를 확인하는 것, 마지막으로 쿼리로 정제한 데이터가 잘 정제가 되었는가에 대해 확인하는 것이 어려웠다.

데이터 전처리도 역시나 쉽지 않은 것을 오늘 다시 느꼈다. 하지만 해커톤에서도 SQL을 활용해서 전처리를 해야 하기 때문에 열심히 했다! 그리고 팀원 중 예전에 나와 같은 교육을 듣고 오늘 많이많이 도와준 SQL 메이트가 있어서 훨씬 쉽게 했다.

 

대시보드 레이아웃을 대략적으로 짰고 대시보드에 들어갈 그래프를 주말동안 만들어오기로 했다.

주말동안 최대한 할 수 있는 한 열심히 해봐야겠다!!!!!!!!!!!!!!아좌아좌~~~~~~~~~~~~~~~~~💪💪💪

728x90