@senspond
>
이번 글은 seabon을 통해 파이썬 데이터분석 시각화 연습을 하는 방법을 소개해보고 시각화 하는 몇가지 방법들에 대해서 간략하게 정리해봅니다.
안녕하세요. 이번 글은 seabon을 통해 파이썬 데이터분석 시각화 연습을 하는 방법을 소개해보고 시각화 하는 몇가지 방법들에 대해서 간략하게 정리해봅니다.
pip install numpy
pip install pandas
pip install matplotlib
pip install seaborn
numpy, pandas, matplotlib 가 설치된 상태에서 seabon 을 설치해주세요
데이터 분석 및 시각화를 하려면 데이터가 있어야 하는데요. seabon 패키지 모듈을 사용하게 되면 matplotlib 을 좀더 손쉽게 다룰 수 있게 됩니다.
seabon 에는 다음과 같은 내장 샘플들을 가지고 있습니다.
anagrams
: https://psych252.github.io/
anscombe
: https://en.wikipedia.org/wiki/Anscombe%27s_quartet
attention
: https://psych252.github.io/
car_crashes
: https://www.kaggle.com/fivethirtyeight/fivethirtyeight-bad-drivers-dataset
diamonds
: https://ggplot2.tidyverse.org/reference/diamonds.html
dots
: https://shadlenlab.columbia.edu/resources/RoitmanDataCode.html
dowjones
: https://fred.stlouisfed.org/series/M1109BUSM293NNBR
exercise
: https://psych252.github.io
geyser
: https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/faithful.html
healthexp
: https://ourworldindata.org/grapher/life-expectancy-vs-health-expenditure
penguins
: https://github.com/allisonhorst/penguins
taxis
: https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page
아이리스(붓꽃) 에 대한 데이터입니다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
iris_df = sns.load_dataset('iris') # 불러올 데이터셋 ('iris')
iris_df # 아이리스 붓꽃
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
... | ... | ... | ... | ... | ... |
145 | 6.7 | 3.0 | 5.2 | 2.3 | virginica |
146 | 6.3 | 2.5 | 5.0 | 1.9 | virginica |
147 | 6.5 | 3.0 | 5.2 | 2.0 | virginica |
148 | 6.2 | 3.4 | 5.4 | 2.3 | virginica |
149 | 5.9 | 3.0 | 5.1 | 1.8 | virginica |
데이터를 보게 되면 각 컬럼의 무엇을 의미하는지를 먼저 알아야 하는데요.
sepal_length : 꽃받침의 길이
sepal_width : 꽃받침의 너비
petal_length : 꽃잎의 길이
petal_width : 꽃잎의 너비
species : 품종
어떤 데이터를 불러오든지 먼저 확인해봐야하는 것인데요.
iris_df.info()
iris_df.isnull().sum() # 결측치 개수 확인
결측치는 한건도 없다.
species 는 카테고리 성격의 범주형 데이터, 나머지는 전부 수치형 데이터
총 150건의 레코드
기업현장에서는 지금 현재 우리가 다루고 있는 교과서적인 데이터보다는 그냥 엉망인 데이터를 통으로 던져주고 구체적으로 뭘 해야할지도 알려주지도 않고 알아서 분석가에게 알아서 보고서를 써오라는 일이 생길 수도 있습니다. 그래서 그냥 데이터를 보고 생각해보는 연습이 많이 필요합니다.
먼저 생각해 볼 수 있는 것은 주어진 데이터에 품종의 개수가 몇개나 있을까? 하는 것입니다.
set(iris_df['species'])
{'setosa', 'versicolor', 'virginica'}
pandas DataFrame 객체에서 특정 필드를 선택해 가져온 Series 객체를 set 으로 담게 되면 중복이 제거된 목록만 남게 됩니다. 그리고 길이를 세어보면 3개임을 알 수가 있습니다.
len(set(iris_df['species']))
3
iris_df['species'].value_counts()
species
setosa 50
versicolor 50
virginica 50
Name: count, dtype: int64
각 품종별로 50개씩의 데이터가 있다고 합니다.
sns.countplot(data=iris_df,x='species')
plt.show()
countplot 대신에 barplot 으로 그릴 수도 있습니다. 그룹으로 묶을 수 있는 범주형 데이터를 x축으로, 단순 카운트를 y축으로 시각화 할때는 countplot 을 쓰면 좀더 간단하게 그릴 수 있습니다.
데이터 분석이나 머신러닝을 할때 각 변수들이 어떤 상관관계가 있는지 알아보게 되는데요. 인과관계, 상관관계 에 대한 개념을 간략히 정리해보면 다음과 같습니다.
인과관계 : 어떤 사람우니 상태를 변화시키는 근본이 되는 원인과 결과
상관관계 : x의 변화에 따라 y가 증가하거나 감소하는 등의 관계를 말함.
그럼 변수들간의 상관관계를 파악해 볼 수 있는 시각화 방법들을 간단하게 정리해보겠습니다.
ex) 품종별 꽃잎의 길이, 꽃잎의 너비 산점도 그래프
sns.scatterplot(data = iris_df, x='petal_length',y='petal_width',hue = 'species')
plt.show()
hue 에 범주형 데이터를 넣고 품종(species) 마다 x축은 꽃잎의 길이(petal_length), y축은 꽃잎의 너비(petal_width) 의 산점도 그래프를 그려봅니다. hue 매개변수에 값을 주지 않으면 품종별이 아닌 전체를 가지고 한 색상으로 그립니다.
setosa 는 대체로 (길이x 너비) 크기가 작은 품종이고, virginica는 대체로 크기가 큰 품종이라는 것을 알수가 있고 길이가 커지면 너비도 커지는 양의 상관관계가 있음을 알 수 있습니다.
seabon 의 scatterplot 에는 hue 매개변수가 있는데요. 아쉽게도 regplot 에는 hue 매개변수가 없습니다. 대신 matplotlib 으로 직접 그리게 되면 산점도, 선형회귀선, 95%신뢰구간을 동시에 간단하게 그려줄 수가 있습니다.
꽃잎의 길이와 너비
sns.regplot(data=iris_df, x='petal_length', y='petal_width')
plt.show()
꽃잎의 길이와 너비는 양의 상관관계를 보이고 있습니다.
꽃받침의 길이와 너비
sns.regplot(data=iris_df, x='sepal_length', y='sepal_width')
plt.show()
주어진 데이터로만 봐서는 꽃밤침의 길이와 너비는 어떠한 상관관계가 있다고 보기는 힘드네요.
regplot 으로 그릴때 hue 매개변수가 없어서 그룹별로 그릴 수가 없었는데요. lmplot을 쓰게 되면 가능해집니다.
품종별 꽃잎의 길이와 너비간의 산점도, 선형회귀선, 신뢰구간
sns.lmplot(x="petal_length", y="petal_width", data=iris_df, hue="species")
plt.show()
1:1로 가능한 모든 변수들의 관계를 보기좋게 그래프로 한눈에 보기좋게 그려줍니다.
지금은 데이터 사이즈가 얼마 되지 않아서 금방 나오지만 수백만건의 데이터를 가지고 호출하게 되면 좀 오래걸립니다.
sns.pairplot(data=iris_df, hue='species')
plt.show()
수치형 변수들 간의 상관 관계를 분석할때 쓰는 또다른 플롯입니다.
sns.jointplot(data=iris_df, x="petal_length", y="petal_width")
plt.show()
그래프 모양. 디폴트 값은 scatter 인데요. kind 매개 변수를 주어 "scatter" , "reg", "resid", "kde", "hex" 다른 형태로 바꿀 수도 있습니다.
sns.jointplot(data=iris_df, x="petal_length", y="petal_width", kind="kde")
plt.show()
히트맵은 열을 의미하는 heat와 지도를 의미하는 map 의 합성어인데요. 데이터들의 상관도를 시각화 할때 주로 사용하며 상관도가 높을수록 짙은 색상으로 표현해줍니다. 먼저 히트맵으로 시각화 하기 위해서는 약간의 가공이 필요한데요. 여러가지 방법이 있을 수 있지만 아래처럼 해보겠습니다.
원핫 인코딩(one-hot encoding)
원핫 인코딩이란 단어집합의 크기를 벡터의 차원으로 바꿔주는 것입니다. 쉽게 설명하자면 현재 품종(species)은 범주형 데이터로 수치로 나타낼 수 없는데요. 이것을 머신러닝 등에서 활용하기 위해서 수치형 데이터로 바꿔주는 작업입니다.
pd.get_dummies(iris_df)
그냥 코드 한줄이면 됩니다.
그리고 판다스의 corr()은 사용해 각 변수들의 상관도를 계산하여 ( -1 ~ 1
) 범위안으로 들어오도록 만듭니다.
- 1은 음의 상관관계, 1은 양의 상관관계. 0은 아무관계 없음이라고 받아들이면 됩니다.
edf = pd.get_dummies(iris_df)
edf = edf.corr()
edf
그리고 이 데이터프레임을 가지고 히스맵을 그려보겠습니다.
sns.heatmap(data=edf, annot=True, linewidths=.5)
plt.show()
지금까지 seabon iris 샘플 데이터로 시각화를 해봤는데요. 세계최대 데이터사이언스 커뮤니티인 캐글에서 사람들이 데이터를 어떻게 활용해봤는지 등을 공유하고 토론할 수 있습니다.
https://www.kaggle.com/code/benhamner/python-data-visualizations
https://www.kaggle.com/code/anshigupta01/iris-flower-classification
캐글에서 찾은 아이디어를 지금 하고있는 것에 맞춰서 사용해봅니다.
plt.figure(figsize=(8,4))
sns.boxplot(x='species',y='sepal_length',data=iris_df.sort_values('sepal_length',ascending=False))
plt.show()
boxplot 은 데이터의 분포와 이상치를 동시에 보여주면서 다른 데이터 군과 비교할때 많이 사용되는데요. 꽃받침의 길이(sepal_length) 순으로 내림차순 정렬해서 각 품종(species) 마다 꽃받침의 길이(sepal_length) 를 boxplot 으로 시각화하였네요.
이상으로 파이썬 seabon 을 다루는 튜토리얼을 정리해봤습니다. 그런데 데이터 시각화에 쓰이는 plot 들 종류도 많고 매개변수들도 다양해서 사실 plot 하나당 글로 정리해야 하는 분량이 나오는데요. 이번글에서 언급 되지 않은 plot 들도 있고.. 세부적으로는 조금씩 따로따로 글을 써보도록 하겠습니다.
안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.
현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다
@senspond
>