본문 바로가기
Project

[시각화1] 기초 시각화 개념(라이브러리, 연습데이터셋, 수치형범주형변수 시각화 비교)

by aimaimee 2024. 2. 4.

시각화 총 목차

1. 라이브러리 소개

2. 코드 한 줄로 만드는 시각화 보고서

3. 사용한 데이터셋

4. 가볍게 시작해보는 범주형 변수, 수치형 변수 시각화 예시

5. plot 종류

6. 시각화 시 주의할 점

7. 퀴즈

 

데이터분석 공부를 시작할 시기에, 시각화에 대해 배웠던 내용을 정리 및 공부한 글입니다. 총 목차 중 1~4 / 5 / 6~7로 나눠서 작성할 예정입니다.

 

1. 라이브러리 소개

자주 접하게 되는 시각화 라이브러리는 matplotlib 기반의 '정적 도구', JavaScript 기반의 '동적 도구'로 나뉩니다. 정적 도구는 이미지의 형태로 시각화합니다. 동적 도구는 그래프에 마우스를 올렸을 때 사용자의 목표에 따라 변화하는 데이터 수치를 보여줄 수 있습니다. 따라서, 동적 시각화는 interactive, dynamic visualization이라고도 불립니다.

  • matplotlib 기반 정적 도구 : seaborn, pandas, plotnine 등
  • JavaScript 기반 동적 도구 : plotly, bokeh, altair 등
  라이브러리 로드 API
pandas import pandas as pd df.plot(kind=”bar”)
seaborn import seaborn as sns sns.barplot(data=df)
matplotlib import matplotlib.pyplot as plt plt.bar(df[”x축”], df[”y축”])
plotly import plotly.express as px px.bar(data=df)

 

1.1 Pandas

공식 사이트 : https://pandas.pydata.org/docs/user_guide/visualization.html

공부 사이트 : https://wikidocs.net/159927

Pandas는 matplotlib을 사용하기 쉽게 감싸두었습니다. Pandas 시각화의 특징은, plot을 붙여주는 간단한 방법으로 시각화를 할 수 있다는 것입니다.

df.groupby('origin')['mpg'].mean().plot(kind='bar', title="Pandas 시각화")

 

1.2 matplotlib

공식 사이트 : https://matplotlib.org/

공부 사이트 : https://wikidocs.net/book/5011

matplotlib은 수학적 연산을 그래프로 표현해 준 라이브러리입니다. 데이터셋을 df라는 변수에 할당해서 사용한다고 했을 때, 위의 Pandas 에서 Pandas API 는 df.plot() 형태로 사용한다고 언급하였습니다. matplotlib API는 plt.plot(data=df)라는 형식으로 사용합니다.

(좌) plt.bar(df["origin"], df["mpg"])    (우)  bar_df1 = df.groupby("origin").mean() plt.title("matplotlib bar plot", fontsize=15) plt.bar(bar_df1.index, bar_df1["mpg"])

 

1.3 seaborn

공식 사이트 : https://seaborn.pydata.org/

matplotlib을 기반으로 한 데이터 시각화 라이브러리로, matplotlib을 사용하기 쉽게 만들어줍니다. 기술이 잘 감추어져 있어 사용이 쉽다는 뜻인 ‘high-level interface’는 seaborn을 잘 나타내주는 특징입니다.

(좌)  sns.barplot(data=df, x="origin", y="mpg", ci=None)   (우)  sns.barplot(data=df, x="origin", y="mpg", estimator=np.sum, ci=None)

 

1.4 plotly

공식 사이트 : https://plotly.com/python/

공부 사이트 : https://wikidocs.net/book/8909 또는 https://plotly.com/python/time-series/ 에서 Range Slider, Candlestick, OHLC 예제 연습

plotly는 파이썬에서 제공하는 대표적인 동적 시각화 도구입니다. 동적 도구는 그래프에 마우스를 올렸을 때, 특정 데이터 수치를 확인해볼 수 있는 상호작용이 가능합니다.

(좌)  px.bar(df, x="origin", y="mpg", width=700, title="plotly 시각화")   (우) usa 위에 마우스를 옮기면 해당 위치의 데이터셋 정보를 실시간 출력합니다.

 

1.5 깨알 정보

matplotlib

plt.show()를 출력했을 때, 길게 보이는 로그를 없애고 싶다면 코드 마지막에 / _ = ; 등을 붙여 실행하면 로그가 보이지 않습니다.

 

seaborn

처음 seaborn을 배울 때 흥미로웠던 이야기는 두 가지가 있었습니다. 첫 번째는, 왜 유난히 42란 숫자가 많이 보일까요? 파라미터 중 random_state = 42 로 설정하는 것은 랜덤의 seed 값을 고정시키는 역할을 합니다. 이 숫자는 더글라스 애덤스의 '은하수를 여행하는 히치하이커를 위한 안내서'에서 나왔습니다. 책에서 컴퓨터에게 묻는 인생의 본질에 대한 정답이 42였거든요!

두 번째는, pie chart에 대한 seaborn 라이브러리의 소신입니다. seaborn에서는 pie chart를 제공하지 않습니다. pie가 잘게 쪼개지면 값 차이를 시각적으로 보기 어렵고, seaborn에서는 다른 그래프로 대체될 수 있기 때문에 앞으로도 계획이 없을 것이라고 합니다. pie 차트가 너무 사용하고 싶다면, Pandas에서 df["dataset"].value_counts().plot(kind="pie") 방법을 사용하거나, 다른 시각화로 변형하면 됩니다.

 

plotly

seaborn과 비슷한 사용법이지만, 파라미터에서 hue 대신 color를 사용하는 것 잊지 맙시다!

 

2. 코드 한줄로 만드는 시각화 보고서

추상성이 있다는 것은 파이썬으로 감싸서 간단하게 만들어줬다는 뜻입니다. Pandas-profiling, sweetviz, autoviz 는 모두 짧은 코드로 기본적으로 봐야 하는 기술통계 값을 시각화합니다. 이렇게 편리한 추상화 도구들이 있지만, 직접 시각화를 하고 기술통계를 구하는 이유는, 대용량 데이터에 사용하기 어렵다는 단점 때문입니다. 아래는 df=sns.load_dataset("mpg")코드로 mpg 데이터셋을 df라는 변수에 담아 시각화 보고서를 만든 예시들입니다.

2.1 Pandas-profiling

Pandas-profiling !pip install pandas-profiling==3.1.0
from pandas_profiling import ProfileReport
profile = ProfileReport(df, title="Profiling Report")
profile.to_file("pandas_profile_report.html")
https://github.com/ydataai/pandas-profiling

 

2.2 Sweetviz

Sweetviz !pip install sweetviz
import sweetviz as sv
my_report = sv.analyze(df)
my_report.show_html()
https://github.com/fbdesignpro/sweetviz

 

2.3 autoviz

autoviz !pip install autoviz
from autoviz.AutoViz_Class import AutoViz_Class
AV = AutoViz_Class()
https://github.com/AutoViML/AutoViz

 

3. 사용한 데이터셋

시각화를 그려보는 처음 단계에서는 앤스컴콰르텟 데이터셋, mpg 데이터셋을 추천합니다. 그 후 타이타닉, 피마인디언 데이터셋으로 많이 연습해봅니다.

 

3.1 앤스컴콰르텟(Anscombe's quartet)

앤스컴콰르텟은 shape값이 (44,3)인 데이터셋입니다. 불러오는 방법은 seaborn 라이브러리를 import하여 내장된 데이터셋을 불러오는 방법과, read_csv를 사용해서 불러오는 방법입니다. 해당 데이터셋에 관한 자세한 설명은 아래 두 링크를 통해 배경지식을 얻는 것을 추천합니다.

앤스컴콰르텟 데이터셋을 이용하여 seaborn 시각화(countplot, barplot, boxplot, violinplot, scatterplot, regplot, lmplot)을 연습했었습니다.

링크 1 : seaborn 활용 코드 예시 https://seaborn.pydata.org/examples/anscombes_quartet.html

링크 2 : 앤스컴콰르텟 데이터셋에 관한 설명 https://ko.wikipedia.org/wiki/앤스컴_콰르텟

# df = sns.load_dataset("anscombe")
df = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/anscombe.csv")
df.shape

 

3.2 mpg

mpg는 mile per gallon, 즉 자동차 연비에 관한 데이터셋입니다. shape 값이 (398, 9)로 앤스컴콰르텟 연습 후, 조금 더 큰 데이터셋을 연습하고 싶을 때 좋습니다. 아래 시각화 예시들은 모두 mpg 데이터셋으로 진행 예정이기 때문에, 컬럼에 대한 설명을 남깁니다.

mpg : 연비 / cylinders : 실린더 개수 / displacement : 배기량 / horsepower : 마력 / weight : 무게 / acceleration : 엔진이 초당 얻을 수 있는 가속력 / model_year : 출시 년도 / origin : 제조 장소(미국USA, 유럽EU, 일본JPN), name : 자동차 이름

df = sns.load_dataset("mpg")

 

 

4. 가볍게 시작해보는 범주형 변수, 수치형 변수 시각화 예시

시각화를 할 때, 범주형 변수와 수치형 변수에 따라서 어느 plot이 적합할 지는 시각화를 처음 해본다면 모두 고민해보는 부분입니다. mpg 데이터셋으로 연습을 해보겠습니다.

변수를 알아보기 위해서는 두 가지 과정을 거칩니다. 먼저, df.info()로 각 변수의 타입을 알아봅니다. 다음으로, df.describe(include=”object”)와 같이 include나 exclude를 사용해서 어떤 컬럼이 범주형과 수치형에 해당하는지 알아봅니다. 보통 float와 int는 수치형 데이터, object 타입은 범주형 데이터로 판단을 하고 시각화를 진행합니다.

 

 

하지만, mpg 데이터셋은 cylinders와 model_year라는 우리를 헷갈리게 하는 변수가 있습니다. df.hist()로 전체 수치변수에 대한 히스토그램을 그렸는데, cylinders와 model_year는 다른 수치형 변수들과는 다르게 이가 빠져있는 듯이 그래프가 그려집니다.

이유는, 두 컬럼 모두 양적인 개념이 아니고, 연산이 의미가 없는 데이터이기 때문입니다. 이처럼, 수치형인지 범주형인지 헷갈린다면 전체 히스토그램을 그려서 시각화 해보거나, 유니크 값이 몇 개(cylinders는 유일값이 5개인 변수)가 되는지 확인하는 방법으로 범주형인지 수치형인지를 확인합니다.

 

시각화를 할 때, 범주형과 수치형 데이터를 구분해야 하는 이유는, 아래 Tip들처럼 범주형과 수치형에 따라 적합한 plot 달라지기 때문입니다. 아래 예를 제외하고도, 분석을 하면서 각 데이터 타입에 따라서 어떤 plot을 적용할지는 많이 연습해보면서 풀어야 할 과제입니다.

 

Tip 1

countplot을 그릴 때는 변수를 하나로, x는 범주형 데이터여야 합니다. 수치형 데이터의 분포를 보고 싶다면 displot, 범주형 데이터의 분포를 보고 싶다면 countplot을 사용합니다.

 

(좌) sns.displot(data=df, x='mpg', kde=True). 수치형 변수인 mpg에 displot을 알맞게 사용한 경우입니다.   (우)  sns.displot(data=df, x='origin', kde=True). 범주형변수의 분포를 displot으로 보고자 한 경우입니다.
(좌)  sns.countplot(data=df, x="origin"). x축에 설정한 범주형 변수인 origin 별 데이터의 빈도수를 y축에 표시해줘야 하기 때문에 변수를 하나로 설정합니다. (우) 수치형 변수인 mpg를 x축에 설정할 시, 그려지는 그래프입니다.

 

Tip 2

범주형 데이터일 때는 pointplot, 수치형 데이터의 경향성을 보고 싶을 때는 lineplot이 적절합니다.

(좌)  sns.pointplot(data=df, x="origin", y='mpg'). 범주형 변수인 origin별로 다른 변수가 어떤 특징을 가지고 있는지 보고 싶을 때 pointplot을 활용     (우)  sns.lineplot(data=df, x="model_year", y="mpg"). 수치형 데이터인 mpg의 경향성을 파악하고 싶을 때 lineplot을 활용

 

Tip 3

범주형 변수를 scatterplot으로 표현할 때는 점이 겹쳐서 빈도수와 변수 간 상관관계를 알기 어렵기 때문에, stipplot이나 swarmplot을 활용하여 빈도를 확인합니다.

(좌)  sns.scatterplot(data=df, x="origin", y="mpg")    (우) sns.stripplot(data=df, x="origin", y="mpg")
sns.stripplot(data=df, x="origin", y="mpg")

 

Reference

1. AIS7 박조은 강사님 강의

2. 시각화 라이브러리

라이브러리 종류별 시각화 : https://zzsza.github.io/development/2018/08/24/data-visualization-in-python/

판다스 시각화 : https://wikidocs.net/159927

3. 라이브러리 개념 및 API 공식 사이트

https://matplotlib.org/

https://seaborn.pydata.org/

https://plotly.com/python/

4. 시각화 보고서

https://github.com/ydataai/pandas-profiling

https://github.com/fbdesignpro/sweetviz

https://github.com/AutoViML/AutoViz

5. 데이터셋 설명

앤스컴콰르텟1 : https://seaborn.pydata.org/examples/anscombes_quartet.html

앤스컴콰르텟2 : https://ko.wikipedia.org/wiki/앤스컴_콰르텟

6. 시각화 parameter

barplot : https://seaborn.pydata.org/generated/seaborn.barplot.html

errorbar : https://seaborn.pydata.org/tutorial/error_bars.html

댓글