셀레나님의 스터디 가이드 일정표에 다음과 같이 되어있다.

  - 8주차: 부족한 부분 복습 또는 배운 내용을 활용해 새로운 캐글 데이터셋 분석

 

제일 어려운 "자율학습" ... 😅

 

 

0. Kaggle Dataset

그래서 찾아본 캐글 데이터는 다음과 같다.

  - https://www.kaggle.com/datasets/undefinenull/million-song-dataset-spotify-lastfm

 

 

너무 흔한 데이터셋 말고 새로운 것으로 해서 결측치 등을 포함한 데이터셋 찾는 것도

막상 찾아보려고 하니 쉽지 않았다 ^^

 

위에 찾은 것은 "음악 추천 시스템 데이터셋"으로

사용자와 음악 트랙 간의 상호작용 데이터를 활용하여 개인화된 음악 추천 시스템을 구축할 수 있는 데이터셋이라고 한다.

 

 

1. 데이터 다운로드

kaggle 데이터 다운로드 받는 것도 해보자.

 

 

 

2. 데이터프레임

다운로드 받은 데이터셋을 가볍게 살펴보자.

 

 

데이터의 실제 모습을 살펴보려 했는데, 컬럼이 많아서 한 눈에 잘 보이지는 않는다 😅

 

 

 

3. 결측치 처리

info() 정보에서 보이는 것처럼 2개 column에만 결측치가 있는 것으로 보이는데,

직접 한 번 확인해보자.

 

 

데이터들이 어떤 모습인지 한 번 살펴보자.

 

 

genre의 경우 50%가 훨씬 넘는 비율을 갖기에 해당 column을 삭제하면 좋겠는데,

정말 삭제해도 되는지를 고민해봐야 하는데...

잘 모르는 상황에서도 가만히 보면 tags를 가지고 genre를 대체할 수 있을 것으로 보인다.

 

반면, tags의 경우에는 2.22% 비율의 결측치만 있으므로, 해당 row에 대해서 drop을 하는 것으로 하자.

 

 

맞겠지만 그래도 혹시 모르니 확인을 해보자.

 

 

4. 컬럼 분리

tags 부분을 보면 여러 데이터가 ", "으로 묶여서 표현되어 있는 것을 볼 수 있다.

이것을 One-Hot-Encoding 방식처럼 분리를 해보자.

 

 

좀 더 분석해보고 했어야 했는데, 그냥 해보다보니 tags 의 개별 아이템 개수가 엄청 많았다.

덕분에(?) 전체 column의 개수가 120개가 되었다.

 

 

5. 통계

도메인 지식이 미천하다보니.... 😥

음악 분류에 따라 뭔가 수치들이 달리 나오지 않을까 추정해본다.

 

 

 

6. 그래프

뭔가 다양하게 분석을 해봐야할 것 같은데,

일단 생각나는대로 하나 집어서 그래프를 그려봤다.

 

 

원하는 그래프는 아니지만, 그래도 ...

 

 

 

음... ChatGPT한테 일을 많이 시켜봐야겠다.

반응형

드디어 마지막 챕터까지 왔다.

힘들었지만, 그래도 주말마다 꼬박 꼬박 해냈다.

 

07장 의료 데이터 분석 프로젝트

 

 

앞서 했던 "넷플릭스 데이터 분석 프로젝트"와 유사한 방식으로 진행하면 될 것 같다.

 

① 의료 데이터 분석 프로젝트 소개

② 의료 데이터셋 파악하기

③ 심부전 데이터셋 필터링하기

④ 심부전 데이터셋 결측치 처리하기

⑤ 심부전 데이터셋 통계 처리하기

⑥ 심부전 데이터셋 시각화하기

 

 

① 의료 데이터 분석 프로젝트 소개

앞서 진행한 넷플릭스 데이터 분석과 대부분 유사하게 진행되고

차이가 있다면 "logical indexing" 부분에 조금 더 중심을 두고 진행하는 것이라고 한다.

 

 

② 의료 데이터셋 파악하기

교재에서는 자세한 설명이 없었지만, 찾아보니 아래 데이터인 것 같다.

- https://www.kaggle.com/datasets/fedesoriano/heart-failure-prediction

 

 

직접 다운로드 받아보자.

 

 

다운로드 받은 CSV 파일을 데이터프레임으로 읽어오자.

 

 

샘플 데이터를 살펴보자.

 

 

각 columns 의미는 다음과 같다.

 

 

그런데, 교재의 데이터와는 좀 차이가 있는 것 같다.

교재에서 제공하는 데이터를 보면 일부 column에서 결측치 값이 보이는데,

Kaggle에서 내려받은 데이터에서는 결측치 값이 안보인다.

 

아쉽지만, 교재에서 제공받은 파일을 업로드해서 사용해야겠다.

 

 

 

③ 심부전 데이터셋 필터링하기

심장병 여부를 나타내는 'HeartDisease' 컬럼 데이터를 살펴보자.

 

 

결측치 값도 보이고, 0.0/1.0 데이터도 보인다.

값이 '1.0'인 데이터를 True (심장병 맞음) 로 판단하면 된다.

간단히 실습해보자.

 

 

 

④ 심부전 데이터셋 결측치 처리하기

결측치 값들이 얼마나 되는지 살펴보자.

 

 

그다지 큰 비율은 아니지만, 그래도 처리를 해줘야 한다.

책의 저자와는 다른 개인적인 취향으로 별도의 데이터프레임을 만들어서 작업을 진행했다.

 

 

앞서 해봤던 넷플릭스 데이터 분석과 거의 유사한 과정이다.

이렇게 진행한 결과는 다음과 같다.

 

 

 

⑤ 심부전 데이터셋 통계 처리하기

데이터프레임에서는 여러 통계량을 손쉽게 구할 수 있도록 다양한 함수를 제공해준다.

 

 

groupby()를 이용해서 그룹별 통계값들을 구할 수도 있다.

 

 

 

⑥ 심부전 데이터셋 시각화하기

여기에서 사용할 팔레트를 설정해보자.

 

 

흉통 유형을 카테고리화 한 다음 개수를 세고, 이를 파이 차트로 표현해보자.

 

 

심부전 빈도 그래프를 그려보자.

심부전증이 있을 때와 없을 때 ASY(무증상)가 압도적인지 살펴보기 바란다.

 

 

 

나이에 따른 HeartDisease 데이터를 한 번 살펴보자

 

 

이렇게 구한 값을 가지고 나이에 따른 심부전 여부를 살펴볼 수 있는 그래프를 그려보자.

 

 

 

심부전 범주형 산점도 그래프를 그려보자.

 

 

 

워드 클라우드도 하나 만들어보자.

 

 

예쁘게 하트 모양으로 그려졌다.

 

 

여기까지 해서 책을 한 번 살펴봤다.

추후 한 번 다시 복습하면서 곱씹어봐야겠다 ^^

반응형

이번에 공부할 것은 'Netflix Dataset'을 가지고 데이터 전처리 및 시각화를 알아보는 과정이다.

 

 

지난 포스팅에서부터 계속 말하지만,

교재를 기준으로 공부를 하긴 하지만 개인적으로 처음하는 공부는 아니기에

개인적 취향에 맞춰 필요한 부분만 정리하고 있다.

 

이번 스터디는 아래와 같은 순서로 공부해보도록 하겠다.

 

⑴ 넷플릭스 데이터 분석 프로젝트 소개

⑵ 넷플릭스 데이터셋 파악하기

⑶ Missing Value Handling

⑷ Feature Engineering

⑸ Visualization

 

 

⑴ 넷플릭스 데이터 분석 프로젝트 소개

넷플릭스의 데이터를 빠르게 살펴보고, 전처리를 수행한 다음 다양한 시각으로 데이터 분석을 하여

여러 인사이트를 도출해보는 프로젝트를 수행해보겠다.

 

데이터 시각화를 할 때에는 분석하는 데이터와 관련된 색상을 활용하면 완성도를 더 올릴 수 있다.

https://www.color-hex.com/color-palette/22942

 

 

 

⑵ 넷플릭스 데이터셋 다운로드

캐글에 등록되어 있는 넷플릭스의 영화 및 티비쇼 8000편 정보의 데이터셋을 활용하고자 한다.

https://www.kaggle.com/datasets/shivamb/netflix-shows

 

 

캐글에서 공개된 데이터는 Python으로도 다운로드를 받을 수 있다.

 

 

이렇게 내려 받은 파일을 pandas로 간단하게 읽어올 수도 있다.

 

 

실제 데이터를 확인해보면 다음과 같다.

 

 

각 columns 의미는 교재에 너무 잘 정리되어 있다.

 

 

 

⑶ Missing Value Handling

▷ 결측치 비율 別 처리 가이드

- 결측치가 데이터의 5% 미만이라면 → 행 삭제

- 결측치가 데이터의 5~20% 사이라면 → 대체

- 결측치가 데이터의 20% 이상이라면 → 열 삭제 권장

 

".info()"를 통해 간략하게 결측치 현황을 파악할 수 있긴 하지만, 정확한 비율을 다시 한 번 확인해보자.

 

 

교재에서는 원본 데이터(df)를 직접 수정하는 것을 권고하지만, 개인적인 취향으로 .copy()하여 작업하도록 하겠다.

 

 

값 대체할 것 대체하고, 행 삭제할 것 삭제한 뒤의 현황을 보면 다음과 같다.

 

 

8807개였던 데이터가 8790개로 변한 것을 확인할 수 있다.

그리고, 결측치도 모두 처리된 것을 볼 수 있다.

 

 

 

⑷ Feature Engineering

'rating' column은 '넷플릭스 등급 표시'를 해주고 있다.

즉, 일반적인 string 데이터가 아니라 category 형태로 그룹핑을 할 수가 있는 것이다.

- https://www.primevideo.com/help/ref=atv_hp_nd_cnt?nodeId=GFGQU3WYEG6FSJFJ

 

 

미국의 등급 시스템을 기준으로 묶어주면 되는데, 'age_group' 명칭의 column으로 생성해보도록 하겠다.

 

 

매핑하기 위한 딕셔너리를 작성하고, map()을 돌리면 잘 분류되어 값이 추가된 것을 볼 수 있다.

 

지금까지 작업한 내역들을 CSV 파일로 저장까지 하면서 일단 마무리 해보자.

 

 

 

⑸ Visualization

Graph를 그릴 기본 준비를 해보자.

 

 

원하는 정보를 검색하는 것을 해보자.

 

 

이번에는 'type' column의 내역을 한 번 살펴보자.

 

 

해당 데이터를 가지고 파이 차트를 그려보자.

 

 

이번에는 장르 정보를 담고 있는 'listed_in' column을 살펴보자.

 

 

여러 장르에 속하는 경우 ", "로 여러 항목이 나열되어 있는 것을 볼 수 있다.

", "로 split을 하는데 'expand=True' 옵션이기에 column을 확장한다.

 

 

그런다음 다시 'stack()'으로 세로 방향으로 변환(column 하나로 합치기)해서 value_counts() 한다.

이제 막대 그래프로 그려보자.

 

 

이 그래프를 보고 얻을 수 있는 인사이트는 다음과 같다고 한다.

 

"넷플릭스는 드라마와 국제 영화에 집중하고 있습니다. 글로벌한 콘텐츠 제공과 깊이 있는 스토리 라인으로 시청자들의 다양한 취향을 만족시키려 하려는  것 같습니다. 또한, 다양한 영화 장르의 제공을 통해 시청자들에게 보다 풍부한 선택지를 제공합니다. 정리하자면, 넷플릭스의 전략은 장르 다양성과 글로벌 사용자들의 요구를 동시에 충족시키기 위한 방향으로 나아가고 있음을 알 수 있습니다."

 

이번에는 나이 그룹별 국가별 콘텐츠를 살펴보자.

 

 

'country' column의 경우에도 ', '로 구분된 여러 나라가 입력되어 있음을 알 수 있다.

일단, split() 해보자.

 

 

pandas의 옵션을 설정하는 기능을 활용해서 출력 값의 개수 제한을 풀어봤다. (유용해 보이지는 않는다)

 

list 형태로 되어있는 'country' column을 기준으로 row를 분리해보자.

 

 

7번 index를 보면 row가 분리된 것을 확인할 수 있다.

 

 

더 자세히 살펴보자.

 

 

각 연령대별로 국가의 개수를 count하고 이를 표 형태로 살펴보자.

 

 

'.groupby('age_group')' 연령대로 그룹핑을 하고, '['country'].value_counts()' 국가의 개수를 센 뒤, '.unstack()'를 통해 세로로 정리된 데이터를 가로 형태로 변환을 했다.

 

우리가 사용할 항목들만 선별해서 정리해보자.

 

 

결측치 값이 보인다. 0으로 채우자.

 

 

지금 보이는 값으로는 서로간의 값 비교를 하기가 쉽지 않다.

비율로 값들을 변경해보자.

 

 

'.sum(axis=0)'을 통해 각 열의 합을 계산함 → 국가별 sum() 값을 구함

 

 

'.div(..., axis=1)'을 통해 각 연령대듸 값들을 국가(column)의 총합으로 나누어 비율을 계산

 

지금까지 진행한 내용을 가지고 히트맵을 그려보자.

 

 

 

위 그래프를 보고 얻을 수 있는 인사트는 다음과 같다고 한다.

 

"United States/Canada는 모든 나이 그룹에서 골고루 이용자를 가지고 있기에 넷플릭스가 다양한 연령층에 걸쳐 널리 사용되고 있음을 나타내고 있다. 그리고 모든 국가에서 성인 이용자가 가장 많은데, 이는 넷플릭스의 콘텐츠가 성인들의 관심사와 취향을 충족시키는 데 중점을 두고 있다는 것을 보여준다. 성인층의 높은 비율은 넷플릭스의 다양한 장르와 깊이 있는 콘텐츠가 성인 이용자들에게 특히 매력적임을 시사한다. 한편 India/Japan은 Older Kids의 비율이 꽤 높은데 이는 해당 국가들에서 넷플릭스가 어린이와 가족 단위의 콘텐츠를 많이 제공하고 있음을 나타낸다. 이러한 결과는 각국의 문화적 특성과 콘텐츠 선호도가 넷플릭스 이용 패턴에 영향을 미친다는 것을 시사한다. 이러한 분석을 통해 넷플릭스는 각 국가별로 이용자의 연령대에 맞춘 컨텐츠와 교육적인 프로그램을 강화할 수 있으며, 성인 비율이 높은 국가에서는 성인 대상의 드라마/영화/다큐멘터리 등을 더욱 강조할 수 있다."

 

이번에는 워드 클라우드를 한 번 그려보도록 하자.

일단 넷플릭스 로그 이미지를 확보하자.

- https://en.m.wikipedia.org/wiki/File:Netflix_2015_logo.svg

 

 

사이트에서 보이는 저 로고를 다운로드 받아봤다.

 

 

PNG 파일을 JPG 파일로 변환을 했고,

투명한 배경을 검은색이 아닌 하얀색으로 나오도록 하기 위해서 중간에 하얀색 그림을 그려서 합치도록 했다.

 

 

저 글씨 모양으로 wordcloud가 나오도록 하려는 것이다.

이제 본격적으로 wordcloud를 그려보자.

 

 

정보를 보기에 좋은 방식은 아니지만, 재미있게 표현한 결과는 다음과 같다.

 

 

 

지금까지 CSV 데이터 파일을 읽어들여서 결측치 값들을 적절히 처리하고

category화 할 수 있는 것들을 가공하면서 feature engineering을 한 뒤에

이를 여러 Graph로 visualization해서 인사이트를 살펴보는 과정을 해봤다.

 

반응형

Docker Compose를 이용한 설치를 한 상황을 기준으로 하겠다.

  - https://www.whatwant.com/entry/Apache-Airflow-install

 

[ Status ]

    - Docker Compose를 이용해서 Apache Airflow를 설치한 상태이다.

 

> docker ps

 

    - 하지만, example들이 엄청 많이 보인다.

        . 공부하기 위해 참조할 수는 있지만, 삭제해도 다시 살아나고..... 지워버리고 싶은 상황이다.

 

http://localhost:8090/home

 

[ Docker Compose Down ]

    - 현재 설치된 것을 모두 지워버려야 한다.

 

> docker compose down

 

> docker compose down

 

[ Edit docker-compose.yaml ]

    - YAML 파일의 내용을 살짝 바꿔줘야 한다.

 

> nano docker-compose.yaml

 

> nano docker-compose.yaml

 

    - 빨간 박스에 있는 것 처럼, 해당 값을 false로 변경해주면 된다.

 

[ Re-install ]

    - 이제 설치/실행 진행하면 된다.

 

❯ docker compose up airflow-init


❯ docker compose up

 

    - 그리고 웹브라우저 다시 열고 접속하고 로그인 하면... 깨끗한 화면을 볼 수 있다!

 

http://localhost:8090/home

 

깔끔!

반응형

'AI_ML > MLOps' 카테고리의 다른 글

Apache Airflow install (아파치 에어플로우 설치)  (1) 2024.05.04

+ Recent posts