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

  - 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 데이터를 한 번 살펴보자

 

 

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

 

 

 

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

 

 

 

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

 

 

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

 

 

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

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

반응형

"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다."

 

 

AI 관련해서 공부를 한다면 최소한 한 번 이상 마주쳤을 가능성이 농후한,

갖고 있지 않더라도 책 표지를 보면 "아하! 그 책!" 이라고 외칠 그 유명한 책의 "리마스터판"이 나왔다.

벌써 8주년 이라는 것이 더 놀랍다 !!!

 

 

꼼꼼한 책을 보면서 혹시나 했는데, 역시나 일본 특유의 꼼꼼함을 보여주는 "사이토 고키"라는 분의 저서이다.

아쉽게도 어느 회사에서 연구하고 계시는지 등의 추가적인 정보는 찾을 수 없었다.

 

 

오옷! "개앞맵시" !!! 어디서 많이 들어본 닉네임을 갖고 계신 옮긴이.

'구글 엔지니어는 이렇게 일한다'라는 책의 번역도 맡으셔서 익숙한가!?

삼성전자 VD 사업부에서도 근무를 하셨었구나...

인사이트, 골든래빗 등의 출판사를 거쳐 지금은 한빛미디어에서 근무를 하고 계신 것으로 보인다 ^^

 

 

근래 봤던 책 중에서 중학교 2학년생의 리뷰를 책에 담아준 것은 처음 본 것 같다 !!!

김경수 학생도 대단하고, 한빛미디어도 대단하다는 생각을 해본다.

 

 

"밑바닥부터 시작하는 딥러닝 (Deep Learning from Scratch)"은 시리즈로 구성되어

현재 5권까지 출간되었고 6권도 출간 예정이라고 한다.

 

6권이 출간되기에 앞서 1권의 리마스터판이 이번에 다시 출간된 것이다.

 

 

순서에 상관없이 취사선택(?)하여 볼 수 있다지만

책의 챕터 구성을 보면 1권부터 보는 것이 맞을 것 같다.

 

CHAPTER 1     헬로 파이썬
CHAPTER 2     퍼셉트론
CHAPTER 3     신경망
CHAPTER 4     신경망 학습
CHAPTER 5     오차역전파법
CHAPTER 6     학습 관련 기술들
CHAPTER 7     합성곱 신경망(CNN)
CHAPTER 8     딥러닝

 

이 책은 딥러닝을 이해하는 데 필요한 지식을 기초부터 하나하나 차례로 설명해 준다고 한다.

 

정말 그렇다!

심지어 파이썬까지도 챕터를 하나 할당해서 알려주고 있다!!! 와우~!!

 

이 책이 특히 매력적인 것은 특정 라이브러리 사용을 최소화하고,

파이썬 코어 중심으로 실습 코드를 사용하고 있어서 내부적인 구현 사항에 대해 잘 살펴볼 수가 있다.

 

특히 이번 리마스터링을 통해 공부하기에 더더욱 좋아졌다.

 

 

그동안 이 책이 좋다는 것은 알았지만 출간된지 너무 오래되어 아쉬움이 있던 분들은

지금 바로 딥러닝에 대해서 진지하게 공부할 수 있도록 업데이트된 따끈따끈한 책이 등장했으니 지금 당장 구매를 !!!

 

반응형

이번에 공부할 것은 '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해서 인사이트를 살펴보는 과정을 해봤다.

 

반응형

이번에는 웹 데이터를 수집하는 것에 대해서 알아보는 챕터이다.

 

 

1. robots.txt

- 웹 사이트를 크롤링하는 것은 불법의 여지가 있으며, 피해를 줄 수도 있음

- 최소한 해당 사이트의 robots.txt 파일을 참고해서 제약 사항들을 잘 지켜주는 것이 중요함

 

- 이번 실습에서 활용할 야후 파이낸스 사이트의 robots.txt 파일 내용 확인

  . https://finance.yahoo.com/robots.txt

 

 

  . User-agent: 크롤러 식별

  . Disallow: 크롤링 금지 디렉토리/페이지 지정

  . Allow (Disallow 함께 사용): 크롤링 허용 디렉토리/페이지 지정

 

 

  . Sitemap: 사이트 맵 파일의 위치를 지정

 

 

2. BeautifulSoup

- HTML/XML 문서의 구문을 분석하기 위한 파이썬 패키지

- 2004년 발표 후 현재(25년 2월 16일) 기준 v4.13.2 버전까지 출시 → bs4

  . https://www.crummy.com/software/BeautifulSoup/

 

 

 

3. CSS Selector

- CSS(Cascading Style Sheets)에서 사용되는 선택자(Selector)를 활용해 HTML 요소를 선택하는 방법

 

 

- 이 때 사용할 수 있는 여러 종류의 Selector가 있다.

 

  ① Class Selector

 

 

  ② Child Selector

 

 

  ③ ID Selector

 

 

- Selector와 별도로 그냥 텍스트만 추출할 수도 있음

  . 자동으로 좌우 공백들은 제외해서 추출함

 

 

4. find() / find_all()

- CSS Selector도 충분히 좋은 방법이지만, find() / find_all() 을 이용해서도 원하는 것을 얻을 수 있다.

 

  ① Class

 

 

  ② Tag

 

 

  ③ ID

 

 

 

5. Web

- 이번 실습에서 사용할 야후 파이넌스 사이트에 접속을 해보자.

  . https://finance.yahoo.com/

 

 

- 'Samsung Enecltronics'를 검색해서 들어가고, 왼쪽 메뉴의 'Historical Data'를 선택하자.

  . https://finance.yahoo.com/quote/005930.KS/history/

 

 

- 그러면, 이제 Python으로 사이트 정보를 읽어와보자.

 

 

- 어?! 읽어오지 못한다. 그런데 왠 "Too Many Requests" ????

  . 책에서는 404 에러가 발생한다고 했는데, 나는 매번 429 에러가 발생을 했다.

 

 

6. Header

- 내가 웹브라우저로 접근하는 것처럼 해야 접속이 될 것 같다.

- F12 눌러서 개발자 도구 열고 → 상단 메뉴 中 '네트워크' 선택 → F5 눌러서 사이트 리프레쉬 → "요청 헤더" 확인

 

 

- 'User-Agent' / 'accept' 2개 정보를 copy해서 넣어보자.

 

 

- 성공적이다 !!!

 

 

7. Parse

- 내가 읽어오기 원하는 정보가 있는 곳에서 마우스 오른쪽 버튼 클릭 → '검사' 선택

 

 

- 그러면, 개발자 모드 화면에 HTML Tag 코드 확인 가능

 

 

- 잘 살펴보면 특정 row를 읽어오면 될텐데, '<tr>' 태그로 되어 있는 것을 볼 수 있다.

 

 

- find_all() 사용하면 상당히 많은 내용이 잡히기 때문에, 출력은 일부분만 하도록 했다.

 

 

- 좀 더 구체적으로 원하는 정보를 찾아내기 위해서, class 값을 얻어오고 활용하는 것을 해보자.

 

 

 

8. Pretty Print

- 하나의 row에는 7개의 column으로 구성되었다는 것을 알고 있으니, 이를 이용해서 예쁘게 출력을 해보자.

 

 

- 사실 이런식으로 처리하는 것은 위험 부담이 크다.

  . 아래와 같은 예외 데이터가 있을 확률이 아주 높기 때문이다.

 

 

 

9. Graph

- Matplotlib을 이용해서 그래프를 그려보자.

  . date는 일반적인 날짜 형태로 바꿔주는 것이 좋다

  . price는 integer 형태로 바꿔줘야 한다.

 

 

 

 

 

10. Pandas

- BeautifulSoup 대신에 pandas를 이용할 수도 있다.

  . 하지만, 내부적으로는 BeautifulSoup 및 lxml 라이브러리를 이용한다.

 

 

 

간만에 다시 한 번 찬찬히 살펴볼 수 있어서 좋았다!

반응형

(우쒸 !!! 포스팅 날짜를 보면 알 수도 있겠지만... 작성하던 내용을 날려먹었다 ㅠㅠ 😢 다시 작성하려니 ㅠㅠ)

 

지난 번에 살펴본 03장 Matplotlib 과 짝꿍으로 사용되는 seaborn 이라는 시각화 라이브러리에 대해 공부해보자.

 

개인적으로는 좀 더 예쁜 그래프가 필요할 때 seaborn을 사용하곤 했다 ^^

- https://seaborn.pydata.org/

 

 

 

1. 내장 데이터셋

pandas처럼 seaborn도 공부를 위한 내장 데이터셋을 제공해준다.

 

 

데이터셋을 불러와보자.

 

 

불러온 데이터셋은 pandas의 DataFrame 타입이기 때문에,

앞에서 공부한 pandas의 다양한 기능들을 그대로 사용할 수 있다.

 

제공해주는 데이터셋의 종류는 교재에서 너무나 잘 정리해주고 있다.

 

 

 

2. Graph

seaborn에서 제공해주는 그래프 유형은 다음과 같다.

- https://seaborn.pydata.org/examples/

 

 

전부 살펴볼 수는 없으니,

교재에서는 6종 그래프를 기준으로 설명을 해주고 있다.

 

① 범주형 변수 산점도 그래프

② 빈도 그래프

③ 선형 회귀선 있는 산점도

④ 히스토그램과 커널 밀도 추정 그래프

⑤ 조인트 그래프

⑥ 관계 그래프

 

하나씩 살펴보자.

 

① 범주형 변수 산점도 그래프: stripplot() / swarmplot()

연속형(Continuous) 변수가 아닌 범주형(Categorical) 변수를 위한 그래프 유형이다.

 

 

출력되는 그래프는 다음과 같다.

 

 

두 그래프는 거의 유사하지만,

swarmplot()의 경우 데이터 포인트가 겹치지 않도록 적절한 위치에 배치해준다는 차이가 있다.

 

 

② 빈도 그래프: countplot()

이번 그래프 역시 범주형(Categorical) 변수를 위한 것이다.

 

 

 

③ 선형 회귀선 있는 산점도: regplot()

이번에는 연속형(Continuous) 변수를 위한 것이다.

그리고 특히 두 변수 간의 선형 관계를 시각화하는 데 사용하는 그래프이다.

 

 

파악하기 어려운 파라미터가 보인다.

- scatter_kws: 산점도의 점 스타일을 지정

- line_kws: 회귀선의 스타일을 지정

- fit_reg: False로 설정하면 산점도를 그리지 않고 회귀선만 그린다.

 

 

 

④ 히스토그램과 커널 밀도 추정 그래프: histplot()

개인적인 생각이지만, 가장 많이 사용되는 그래프 형태이지 않을까 싶다.

 

이번 그래프 역시 연속형(Continuous) 변수를 위한 것인데,

Histogrm은 일정 간격으로 나누어 각 구간별 데이터 빈도를 막대그래프로 표현하는 그래프이다.

 

'커널 밀도 추정 그래프(Kernel Density Estimate Plot, KDE Plot)'은

막대 그래프 대신 부드러운 곡선을 사용한다는 차이가 있다.

 

 

 

⑤ 조인트 그래프: jointplot()

이번 그래프 역시 연속형(Continuous) 변수를 위한 것이고,

두 연속형 변수 간의 이변량 분포를 표현하며 주로 산점도와 히스토그램으로 함께 시각화하곤 한다.

 

 

파라미터 中 kind 부분에서 사용할 수 있는 결합 플롯의 유형은 다음과 같다.

- scatter: 산점도 플롯(기본값)

- kde: 커널 밀도 추정 그래프

- hex: 육각형 바이닝 플롯

- reg: 회귀선을 포함한 산점도 플롯

- resid: 회귀 분석 잔차 플롯

 

 

⑥ 관계 그래프: pairplot()

데이터셋의 모든 연속형(Continuous) 변수들 간의 산점도와 히스토그램을 한 번에 나타낸다.

 

 

파라미터 中 특이한 것만 알아보자.

- kind: 각 변수 간의 관계를 시각화 하는 방법 선택

  . scatter: 산점도 플롯(기본값)

  . kde: 커널 밀도 추정 그래프

  . hist: 히스토그램

  . reg: 회귀선을 포함한 산점도 플롯

- diag_kind: 대각선에 나타낼 그래프의 종류를 선택

  . hist: 히스토그램(기본값)

  . kde: 커널 밀도 추정 그래프

  . None: 대각선에 아무런 그래프도 표시하지 않음

 

 

Matplotlib에 비하면 분량이 적어서 천만 다행이었다 !!! 😍

반응형

와~ 짝! 짝! 짝! 다시 또 서평단으로 선정되었다 !!!

 

 

작년에 한 번 건너 뛰어서 그런지,

이번에 다시 선정 된 것이 정말 기쁘다 !!!

 

개인적으로 지금까지 살면서 잘한 결정 중 하나가

블로그를 작성하기 시작한 것이라고 생각한다.

 

이것 저것 나에게 정말 많은 도움을 주고 있다.

 

잊을만 하면 한 번씩 보내주는 100달러의 용돈도 짭짤하고... 😍

 

뭐 여하튼,

올해에도 서평단 생활 재미있게 해보겠다!

반응형

ML / DS 공부를 시작하게 되면 누구나 겪는(?) 자연스러운 스터디 순서,

   - Numpy → Pandas → Matplotlib

 

 

솔직히 전형적인 코더(키보드 워리어) 생활을 하던 사람으로써

이런 Visualization 영역에 대해서는 왠지 모를 거부감가 함께 두려움(?)이 있다.

하지만, 해야하는 것이니 해야겠지만.... 😥

 

지금까지의 공부과정은 다음과 같다.

  - [파이썬 데이터 분석가 되기] 00 - 공부 시작

  - [파이썬 데이터 분석가 되기] 01 - NumPy

  - [파이썬 데이터 분석가 되기] 02 - Pandas

 

 

오늘 공부할 것은 다음과 같다.

 

03장. 데이터 시각화 라이브러리, 맷플롯립

 

① Matplotlib 시작하기

② 그래프 꾸미기

③ 다양한 그래프 그려보기 ⑴

④ 다양한 그래프 그려보기 ⑵

⑤ 그래프 한꺼번에 그려보기

⑥ 그래프 저장하기

 

 

 

① Matplotlib 시작하기

Matplotlib은 이름 그대로 파이썬 환경에서 데이터 시각화를 위한 라이브러리이다.

- https://matplotlib.org/

 

 

 

▷ 일단 한 번 그려보기

- plt.plot()으로 그래프를 그린다고 해서 바로 출력되지 않는다.

- plt.show()를 실행하면 앞에서 그린 그래프를 그려준다.

- [1, 3], [2, 4] 데이터가 어떻게 그래프에 그려졌는지 잘 살펴보기 바란다.

  . [1, 3] 데이터는 X축의 좌표이고, [2, 4] 는 Y출의 좌표이다.

  . (1, 2), (3, 4) 데이터가 출력된 것이다.

  . plt.plot(x, y) 구성이므로, x 부분에 [ ] 형식으로 들어간 것이라고 생각하면 될 것 같다.

 

 

 

② 그래프 꾸미기

▷ 축 레이블 (label) / 범례 (legend) / 제목 (title) - 기본1

간단하게 표시하는 것을 우선 살펴보겠다.

 

 

 

▷ 축 레이블 (label) / 범례 (legend) / 제목 (title) - 기본2

그래프 실습을 위해 데이터들을 샘플로 생성해보자.

 

 

np.linspace(start, stop, num) : Linearly Spaced

  - num 값은 생성할 값의 개수를 의미한다.

 

 

plt.show() 하기 전에는 그래프에 표현하고 싶은 것들을 계속 적어주면 된다.

plt.legend(loc=location, ncol=number of column)

 

 

▷ 축 범위 (limit)

일단 기본적으로 축 범위는 입력 데이터를 기준으로 자동 설정이 된다.

 

 

plt.xlim() / plt.ylim() 을 통해서 표현할 축 범위를 강제할 수 있다.

 

 

▷ 축 스케일 (scale)

⒜ 선형 스케일 (linear scale)

  - 일반적으로 사용되는 스케일

  - 값이 일정 간격으로 증가/감소 하는 경우

 

⒝ 로그 스케일 (logarithmic scale)

  - 값의 크기 차이가 큰 경우

  - 지수적으로 증가하는 데이터나 큰 범위의 데이터

 

⒞ 로그-선형 스케일 (log-linear scale)

  - x축을 로그 스케일, y축을 선형 스케일

  - x축이 시간 또는 크기인 경우 사용

 

⒟ 선형-로그 스케일(linear-logarithmic scale)

   - x축을 선형 스케일, y축을 로그 스케일

  - y축의 값 범위가 큰 경우, 대부분 작은 값 범위이고 일부 값이 매우 큰 경우

 

데이터를 먼저 준비하자. Exponential

 

 

여러 그래프를 묶어서 표시할 때 사용할 수 있는 것이 바로 plt.subplot()이다.

서브 그래프의 간격을 좁게 조절하기 위해서는 plt.tight_layout()을 사용할 수 있다.

 

 

실행 결과는 다음과 같다.

 

 

 

▷ 선 종류 (linestyle)

선 종류도 다양하게 할 수 있다.

 

 

 

▷ 마커 (marker)

그래프의 선 색깔을 정해줄 수도 있고,

값을 표시하는 marker도 다양하게 정해줄 수 있다.

 

 

참고로

교재에서는 plt.plot([3, 4, 5], "ro")로 제시했지만 그렇게 하면 선(line)은 표시가 안된다.

본래 "색깔-선-마커"의 순서대로 모두 정해줘야 하는데, 선 부분을 생략해서 나오지 않는 것이다.

 

값 위치를 표현할 여러 표식들은 다음 링크를 통해 확인할 수 있다.

  - https://matplotlib.org/stable/api/markers_api.html

 

 

 

▷ 선 색 (color)

선의 색상을 설정하는 방법도 여러가지로 제공해준다.

 

⑴ 이름 (예: 'violet')

⑵ 약자 (예: 'g')

⑶ RGB (예: (0.1, 0.2, 0.3))

⑷ 16진수 (예: '#FF0000')

 

 

색상으로 사용할 수 있는 값들은 다음 링크를 통해 확인할 수 있다.

  - https://matplotlib.org/stable/gallery/color/named_colors.html

 

 

 

▷ 제목 (title)

결국은 문자열(string)이기 때문에, 이와 관련한 설정들을 제공해준다.

 

 

다른 설정들은 익숙할 수 있는데, 조금 특이한 옵션이 바로 pad 이다.

그래프와 제목 사이의 거리인데, 이걸 잘 조절하면 예쁜 배치를 할 수 있을 것이다.

 

 

▷ 대제목 (super-title)

여러 개의 그래프를 묶어서 출력하는 경우,

전체를 대표하는 제목을 추가로 붙여줄 수 있다.

 

 

 

▷ 눈금 (ticks)

plot() 형식이 아니라 bar() 형식이 새롭게 등장했지만, 찬찬히 살펴보면 어렵지 않을 것이다.

xticks(눈금이 표시될 좌표, 표시할 텍스트 레이블) 형식이다.

 

 

 

▷ 그리드 (grid)

격자 모양의 선도 예쁘게 표시할 수 있다.

 

 

★ Helper

그런데, 지금 계속 간단하게 이런 것이 있다라는 것만 집어주고,

세부 옵션들에 대해서는 너무 안 살펴봐서 당황할 수도 있다.

 

이러한 옵션은 직접 보면서 필요에 따라 공부하면 충분하다.

 

함수 이름을 타이핑하고 "Shift + Tab" 키를 눌러주면 친절한 Docstring을 확인할 수 있다.

 

 

 

▷ 텍스트 (text)

굳이 이 정도까지 해야하나?! 할 수도 있지만... 그래프의 원하는 곳에 텍스트를 찍어줄 수도 있다.

 

 

옵션 중에 ha / va 부분이 낯설 수 있는데,

horizontal axis / vertical axis 즉, 수평 / 수직 정렬을 위한 옵션이라고 생각하면 된다.

 

 

 

③ 다양한 그래프 그려보기 ⑴

▷ 타이타닉 데이터셋 (titanic dataset)

MachineLearning 특히 Kaggle 공부를 하게 되면

누구나 만나는 아주 친숙한 타이타닉 데이터셋~!!

 

 

 

Pclass 기준으로 그룹화 해서 Survived 의 평균을 계산하고,

그룹화로 인해 제거된 기존 index를 대체해서 새롭게 index를 생성까지 해보자.

 

 

이 데이터들을 가지고 그래프를 그려보자.

 

 

이번에는 생존자들이 어느 항구에서 승선을 했는지를 살펴보자

 

 

이런 저런 내역들을 포함해서 그래프를 그려보자.

 

 

 

비슷한 방식인데, 이번에는 성별을 기준으로 데이터를 정리해보자.

 

 

이번에는 수평 막대 그래프로 그려보자.

 

그려보면 다음과 같다.

 

 

 

▷ 산점도 그래프

여러모로 자주 사용하는 산점도 그래프에 대해서 알아보자.

우선 가볍게 결측치 데이터를 살짝 걷어낸 데이터를 준비해보자.

 

 

scatter 그래프를 그려보자.

 

 

못보던 것들이 많이 보일텐데, 찬찬히 살펴보면 이해할 수 있을 것이다.

 

plt.figure(figsize=(12, 8)) : 12인치, 8인치 정도의 크기의 그래프로 셋팅

plt.scatter() : 산점도 그래프를 그린다.

  . c : 각 데이터 포인트의 색상을 지정

  . cmap : 컬러맵 지정

plt.legend() : 범례를 추가한다.

  . handles : 범례 핸들을 설정하는 것인데, 

                     scatter.legend_elements() 는 산점도 그래프에서 사용된 생상에 대한 핸들을 반환해준다.

 

 

 

▷ 파이 차트 (Pie Chart)

생존 여부를 가지고 간단하게 파이 차트를 그려보자.

 

 

 

 

 

▷ 히스토그램 (Histogram)

연속된 데이터를 구간으로 나누어 각 구간에 속하는 데이터의 빈도를 표현하는 그래프를 그려보자.

 

 

plt.hist() : 히스토그램을 그려준다.

  . bins : 구간 개수, 현재는 20개로 설정

  . edgecolor : 테두리 색상

 

 

 

 

④ 다양한 그래프 그려보기 ⑵

▷ 히트맵 (Heatmap)

히트맵은 2차원 데이터를 색상으로 표현하는 그래프인데, 2가지 방식의 그래프가 존재한다.

- matshow() : 정보를 명확하게 표시하고, 행/열 레이블을 추가하여 표시

- imshow() : 이미지만 표시, 행/열도 추가하지 않으며 색상도 표시하지 않음

 

 

plt.colorbar() : 오른쪽에 색상 참고를 위한 bar 표시

 

 

 

▷ 영역 채우기 그래프 (fill between)

데이터셋 간의 데이터 분포와 차이를 명확하게 시각화하는 데 유용하다.

 

일단 데이터를 준비해보자.

cut() : 연속형 변수를 구간별로 나누어 범주형 변수로 변환

(observed=False) : 데이터가 없더라도 모든 가능한 조합을 결과에 포함

.size() : 각 그룹의 빈도(크기)

.unstack() : 그룹화된 결과를 피벗 테이블 형태로 변환하여 index를 열로 포함

 

 

(0, 5] : 0 초과 5 이하

 

 

잘 활용하기 위해서는 alpha 값 등에 신경을 써야 겹치는 부분들에 대한 표현을 잘 할 수 있을 것 같다.

 

 

 

▷ 박스 플롯 (Box Plot)

그래프를 그리기 보다는 그냥 계산으로 사분위수를 계산하는 경우가 더 많지 않나 싶긴 하지만...

 

 

2등급/3등급 승객들은 이상치들이 보인다.

 

 

 

▷ 바이올린 플롯 (Violin Plot)

각 데이터 포인트의 밀도를 시각적으로 보여주는 특징

 

 

 

 

 

▷ 에러 바 (Error Bar)

개인적으로 처음 본 그래프 형태이다.

평균과 표준 편차를 구해서 이를 그래프로 표현하는 것이다.

 

 

 

Parch가 4일 때 평균 요금이 가장 높고, 길이가 긴 것으로 보아 해당 그룹의 요금이 크게 퍼져 있음을 표현한다.

Parch가 3일 때 평균 요금이 높지 않고, 에러바의 길이도 비교적 짧다.

 

 

 

⑤ 그래프 한꺼번에 그려보기

그래프를 표현한 결과물을 figure라고 한다.

1개의 그래프일 수도 있고, 여러 그래프일 수도 있다.

 

이미 앞에서 subplot()을 살짝 맛을 보긴 했는데,

실제로 여러 그래프를 한꺼번에 그리는 방법은 2가지가 있다.

 

⑴ .subplot()

  : 개별 서브플롯을 하나씩 추가하기

 

 

 

⑵ .subplots()

  : 개별 서브플롯을 동시에 생성하기

 

 

 

▷ 하나의 서브플롯에 여러 그래프 그리기 (twinx)

2개의 그래프를 그리기 위해 2개의 데이터를 준비했다.

 

 

.twinx() : X 축을 공유하는 새로운 axes 객체 생성

 

 

 

 

 

⑥ 그래프 저장하기

plt.savefig()를 사용해서 그림파일로 저장을 할 수 있다.

별도로 plt.show()를 실행하지 않아도 그래프가 출력된다.

 

 

그림 파일이 잘 생성되었음을 볼 수 있다.

 

 

와우... 힘들다.

반응형

+ Recent posts