728x90
반응형

1. Hello, Seaborn

패키지 로드

  • register_matplotlib_converters : matplotlib에 pandas 포맷터 및 변환기를 등록한다.
  • %matplotlib inline : IPython 에서 제공하는 Rich output 대한 표현방식으로 도표와 같은 그림, 소리, 애니메이션들을 출력 (Rich output) 하는 것이다.
import pandas as pd
pd.plotting.register_matplotlib_converters()

import matplotlib.pyplot as plt
%matplotlib inline

import seaborn as sns
print(">>> 로드 완료")

데이터 로드

피파 랭킹 데이터를 로드해보자
인덱스 컬럼을 데이터열로 설정하고 형변환 여부를 True로 해준다.

import os

BASE_DIR = os.getcwd()
DATASET_DIR = os.path.join(BASE_DIR, 'datasets')
fifa_filepath = os.path.join(DATASET_DIR, "fifa.csv")
fifa_data = pd.read_csv(fifa_filepath, index_col="Date", parse_dates=True)

데이터 출력

데이터를 출력하여 잘 로드되었는지 head 부분만 출력해보자
Date가 Index 열로 되어있고 각 나라의 피파랭킹 순위가 나열되어 있다.

fifa_data.head()
  ARG BRA ESP FRA GER ITA
Date            
1993-08-08 5.0 8.0 13.0 12.0 1.0 2.0
1993-09-23 12.0 1.0 14.0 7.0 5.0 2.0
1993-10-22 9.0 1.0 7.0 14.0 4.0 3.0
1993-11-19 9.0 4.0 7.0 15.0 3.0 1.0
1993-12-23 8.0 3.0 5.0 15.0 1.0 2.0

Plot를 활용하여 데이터 시각화

그래프 크기를 width x height 설정해주고 라인 차트로 출력해보자

plt.figure(figsize=(16,6))
sns.lineplot(data=fifa_data)

<AxesSubplot:xlabel='Date'>

 

2. 라인차트

데이터 로드 

위에서 하던 방식으로 이번에는 spotify 데이터를 로드해보자

spotify_filepath = os.path.join(DATASET_DIR, "spotify.csv")
spotify_data = pd.read_csv(spotify_filepath, index_col="Date", parse_dates=True)

데이터 출력

상위 (head) 데이터 부분만 출력해본다.

spotify_data.head()
  Shape of You Despacito Something Just Like This HUMBLE. Unforgettable
Date          
2017-01-06 12287078 NaN NaN NaN NaN
2017-01-07 13190270 NaN NaN NaN NaN
2017-01-08 13099919 NaN NaN NaN NaN
2017-01-09 14506351 NaN NaN NaN NaN
2017-01-10 14275628 NaN NaN NaN NaN

이번에는 마지막 (tail) 데이터 부분만 출력해본다.

spotify_data.tail()
  Shape of You Despacito Something Just Like This HUMBLE. Unforgettable
Date          
2018-01-05 4492978 3450315.0 2408365.0 2685857.0 2869783.0
2018-01-06 4416476 3394284.0 2188035.0 2559044.0 2743748.0
2018-01-07 4009104 3020789.0 1908129.0 2350985.0 2441045.0
2018-01-08 4135505 2755266.0 2023251.0 2523265.0 2622693.0
2018-01-09 4168506 2791601.0 2058016.0 2727678.0 2627334.0

Plot를 활용하여 데이터 시각화

그래프 크기를 width x height 설정해주고 라인 차트로 출력해보자

plt.figure(figsize=(14,6))
plt.title("Daily Global Streams of Popular Songs in 2017-2018")
sns.lineplot(data=spotify_data)

<AxesSubplot:title={'center':'Daily Global Streams of Popular Songs in 2017-2018'}, xlabel='Date'>

컬럼만 출력해보자

list(spotify_data.columns)

['Shape of You',
 'Despacito',
 'Something Just Like This',
 'HUMBLE.',
 'Unforgettable']

다음과 같이 두 개의 컬럼에 대해서만 별도로 설정하여 출력할 수 있다.

plt.figure(figsize=(14,6))
plt.title("Daily Global Streams of Popular Songs in 2017-2018")
sns.lineplot(data=spotify_data['Shape of You'], label="Shape of You")
sns.lineplot(data=spotify_data['Despacito'], label="Despacito")
plt.xlabel("Date")

Text(0.5, 0, 'Date')

한 개의 데이터만 출력해보자.

sns.lineplot(data=spotify_data['Shape of You'], label="Shape of You")

 

3. 바 차트와  Heatmaps

데이터 로드

위에서 하던 방식으로 이번에는 "비행 지연을 추적하는 미국 교통부의 데이터 세트"로 로드해보자.
열은 월단위로 만들어본다.

flight_filepath = os.path.join(DATASET_DIR, "flight_delays.csv")
flight_data = pd.read_csv(flight_filepath, index_col="Month")

데이터 출력

flight_data
  AA AS B6 DL EV F9 HA MQ NK OO UA US VX WN
Month                            
1 6.955843 -0.320888 7.347281 -2.043847 8.537497 18.357238 3.512640 18.164974 11.398054 10.889894 6.352729 3.107457 1.420702 3.389466
2 7.530204 -0.782923 18.657673 5.614745 10.417236 27.424179 6.029967 21.301627 16.474466 9.588895 7.260662 7.114455 7.784410 3.501363
3 6.693587 -0.544731 10.741317 2.077965 6.730101 20.074855 3.468383 11.018418 10.039118 3.181693 4.892212 3.330787 5.348207 3.263341
4 4.931778 -3.009003 2.780105 0.083343 4.821253 12.640440 0.011022 5.131228 8.766224 3.223796 4.376092 2.660290 0.995507 2.996399
5 5.173878 -1.716398 -0.709019 0.149333 7.724290 13.007554 0.826426 5.466790 22.397347 4.141162 6.827695 0.681605 7.102021 5.680777
6 8.191017 -0.220621 5.047155 4.419594 13.952793 19.712951 0.882786 9.639323 35.561501 8.338477 16.932663 5.766296 5.779415 10.743462
7 3.870440 0.377408 5.841454 1.204862 6.926421 14.464543 2.001586 3.980289 14.352382 6.790333 10.262551 NaN 7.135773 10.504942
8 3.193907 2.503899 9.280950 0.653114 5.154422 9.175737 7.448029 1.896565 20.519018 5.606689 5.014041 NaN 5.106221 5.532108
9 -1.432732 -1.813800 3.539154 -3.703377 0.851062 0.978460 3.696915 -2.167268 8.000101 1.530896 -1.794265 NaN 0.070998 -1.336260
10 -0.580930 -2.993617 3.676787 -5.011516 2.303760 0.082127 0.467074 -3.735054 6.810736 1.750897 -2.456542 NaN 2.254278 -0.688851
11 0.772630 -1.916516 1.418299 -3.175414 4.415930 11.164527 -2.719894 0.220061 7.543881 4.925548 0.281064 NaN 0.116370 0.995684
12 4.149684 -1.846681 13.839290 2.504595 6.685176 9.346221 -1.706475 0.662486 12.733123 10.947612 7.012079 NaN 13.498720 6.720893

바 차트

Spirit Airlines 항공편의 월별 평균 도착 지연을 보여주는 막대 차트로 그려보자.

plt.figure(figsize=(10,6))
plt.title("Average Arrival Delay for Spirit Airlines Flights, by Month")
sns.barplot(x=flight_data.index, y=flight_data['NK'])
plt.ylabel("Arrival delay (in minutes)")

Text(0, 0.5, 'Arrival delay (in minutes)')

Heatmap

Heatmap은 각 셀은 해당 값에 따라 색상으로 구분되어 시각화해주는 유용한 차트이다.

plt.figure(figsize=(14,7))
plt.title("Average Arrival Delay for Each Airline, by Month")
sns.heatmap(data=flight_data, annot=True)
plt.xlabel("Airline")

Text(0.5, 42.0, 'Airline')

 

4. 산점도 그래프 (Scatter plots)

데이터 로드

위에서 하던 방식으로 이번에는 보험 데이터를 로드해보자.

insurance_filepath = os.path.join(DATASET_DIR, "insurance.csv")
insurance_data = pd.read_csv(insurance_filepath)
insurance_data.head()
  age sex bmi children smoker region charges
0 19 female 27.900 0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520

산점도 그래프 (Scatter plots)

체질량지수 (BMI)에 따른 부과되는 보험 비용(charges)을 시각화해보자.

sns.scatterplot(x=insurance_data['bmi'], y=insurance_data['charges'])

<AxesSubplot:xlabel='bmi', ylabel='charges'>

 

위의 산점도는 체질량 지수(BMI)와 보험료가 양의 상관 관계가 있음을 예상할 수 있다.
(BMI가 높은 고객은 일반적으로 보험 비용도 더 많이 지불하는 경향이라는 것을 알 수 있다.)

이 관계의 강도를 다시 확인하기 위해 회귀선 또는 데이터에 가장 적합한 선을 추가할 수 있다.
regplot 함수를 통하여 확인해보자.

sns.regplot(x=insurance_data['bmi'], y=insurance_data['charges'])

<AxesSubplot:xlabel='bmi', ylabel='charges'>

Color-coded scatter plots

세 변수 간의 관계를 표시할 수 있다. 이를 수행하기 위해 포인트를 색상으로 구분해본다.
흡연이 BMI와 보험 비용 간의 관계에 어떤 영향을 미치는지 표현하기 위해 다음과 같이 설정하여 시각해 볼 수 있다.

sns.scatterplot(x=insurance_data['bmi'], y=insurance_data['charges'], hue=insurance_data['smoker'])

<AxesSubplot:xlabel='bmi', ylabel='charges'>

위와 했던 동일한 방식으로 적합한 선을 추가하여 확인해 볼 수 있다.

sns.lmplot(x="bmi", y="charges", hue="smoker", data=insurance_data)

<seaborn.axisgrid.FacetGrid at 0x21393f51f48>

swarmplot을 활용하여 범주형 그래프로 표현해보자.

sns.swarmplot(x=insurance_data['smoker'],
              y=insurance_data['charges'])

<AxesSubplot:xlabel='smoker', ylabel='charges'>

 

5. 분포 (Distributions)

데이터 로드

위에서 하던 방식으로 이번에는 붓꽃 데이터를 로드해보자.

iris_filepath = os.path.join(DATASET_DIR, "iris.csv")
iris_data = pd.read_csv(iris_filepath, index_col="Id")
iris_data.head()

Histograms

붓꽃의 꽃잎 길이가 어떻게 변하는지 보기 위해 히스토그램을 만들어보자.

sns.distplot(a=iris_data['Petal Length (cm)'], kde=False)

<AxesSubplot:xlabel='Petal Length (cm)'>

밀도 그래프 (Density plots)

밀도 그래프를 그려보자. shade 라는 옵션을 설정하여 색을 채워주도록 한다.

sns.kdeplot(data=iris_data['Petal Length (cm)'], shade=True)

<AxesSubplot:xlabel='Petal Length (cm)', ylabel='Density'>

2D KDE plots

2차원으로 그려보자.

sns.jointplot(x=iris_data['Petal Length (cm)'], y=iris_data['Sepal Width (cm)'], kind="kde")

<seaborn.axisgrid.JointGrid at 0x21396539048>

Color-coded plots

3개의 데이터셋을 하나의 차트로 그려보자.

iris_set_filepath = os.path.join(DATASET_DIR, "iris_setosa.csv")
iris_ver_filepath = os.path.join(DATASET_DIR, "iris_versicolor.csv")
iris_vir_filepath = os.path.join(DATASET_DIR, "iris_virginica.csv")

iris_set_data = pd.read_csv(iris_set_filepath, index_col="Id")
iris_ver_data = pd.read_csv(iris_ver_filepath, index_col="Id")
iris_vir_data = pd.read_csv(iris_vir_filepath, index_col="Id")

iris_ver_data.head()
sns.distplot(a=iris_set_data['Petal Length (cm)'], label="Iris-setosa", kde=False)
sns.distplot(a=iris_ver_data['Petal Length (cm)'], label="Iris-versicolor", kde=False)
sns.distplot(a=iris_vir_data['Petal Length (cm)'], label="Iris-virginica", kde=False)

plt.title("Histogram of Petal Lengths, by Species")

plt.legend()

<matplotlib.legend.Legend at 0x213969c1a08>

sns.kdeplot(data=iris_set_data['Petal Length (cm)'], label="Iris-setosa", shade=True)
sns.kdeplot(data=iris_ver_data['Petal Length (cm)'], label="Iris-versicolor", shade=True)
sns.kdeplot(data=iris_vir_data['Petal Length (cm)'], label="Iris-virginica", shade=True)

plt.title("Distribution of Petal Lengths, by Species")

Text(0.5, 1.0, 'Distribution of Petal Lengths, by Species')

 

6. Plot 타입 스타일 변경

seabor 스타일 변경

spotify_filepath = os.path.join(DATASET_DIR, "spotify.csv")
spotify_data = pd.read_csv(spotify_filepath, index_col="Date", parse_dates=True)
plt.figure(figsize=(12,6))
sns.lineplot(data=spotify_data)

<AxesSubplot:xlabel='Date'>

 

728x90
반응형