이번에는 seaborn라이브러리를 좀 더 폭 넓게 활용해 보자. seaborn라이브러리도 그래프를 그릴 수 있는 라이브러리인데, seaborn라이브러리를 활용하면 matplotlib보다 더 화려하고 실용적인 그래프를 그릴 수 있다. 우선 라이브러리 호출을 해보자.
matplotlib라이브러리를 활용했을 때와 동일하게 히스토그램부터 작성해 보자. seaborn라이브러리로 히스토그램 작성을 위해서는 matplotlib라이브러리와는 다르게, figure()객체 선언을 해줄 필요없이 subplot()메소드로 기본 틀만 만들어 주면된다.
subplot()을 통해 기본틀을 만들어주면 다음과 같이 그래프의 기본 틀이 생성되는것을 볼 수 있다. seaborn 라이브러리 상에서 히스토그램을 그려주기 위해서는 distplot()메소드를 이용해 주어야 한다. distplot()메소드에는 기본적으로 히스토그램에 사용될 변수 하나를 넣어주면 된다.
기본적인 distplot()메소드를 이용한 히스토그램은 히스토 그램과 함께 밀집도 그래프(선부분)을 같이 표현한다. 만약 여기서 히스토그램만 표현하고 싶다면 distplot()메소드의 kde값을 False로 해주면 되고, 반대로 히스토그램을 표현하지 않고 밀집도 그래프만 표현하고 싶다면 distplot()메소드의 hist값을 False로 넣어주면 된다.
1 . 히스토 그램만 표현하고 싶은 경우
2 . 밀집도 그래프만 표현하고 싶을때
실무에서는 데이터의 효율성을 위해서는 여러 가지 그래프를 한번에 출력하기도 하는데, distplot()메소드에 rug의 값을 True로 넣어주면 양탄자 그래프까지 그려진다.
양탄자 그래프란 단일 변수에 대한 데이터를 축에 따라 표시되는 그래프를 의미한다.
이제 이변량 데이터에 대한 그래프를 그려보자.
seaborn라이브러리에는 countplot()이라는 메소드가 있다. 이는 count그래프를 그릴때 사용하는데, count그래프 자체는 히스토그램과 매우 유사한 형태를 띄고 있다. count그래프에는 이산값을 나타내는 그래프이다. 한번 이번에는 tips데이터 프레임에서 day값만 뽑아서 countplot을 작성해 보자.
이번에는 matplotlib라이브러리에서 만들어 보았던 이변량 그래프에 해당하는 산점도 그래프를 그려보자. seaborn라이브러리에서 산점도 그래프를 그려주기 위해서는 regplot()메소드를 이용해 주면 된다.
regplot()메소드를 이용해서 산점도 그래프를 그리게 되면 다음과 같이 산점도 그래프와 동시에 회귀선이 나오는것을 알 수 있다. 만약 여기서 회귀선을 없애고 싶다면 regplot()메소드의 fit_reg인자값을 False로 넣어주면 된다.
regplot()메소드의 fit_reg속성값을 False로 하였더니 다음과 같이 회귀선이 없어지는 것을 볼 수 있다.
앞에서도 말했듯이 실무에서는 그래프의 효율성을 위해서 여러 그래프를 한번에 그리는 경우가 많다고 했다. seaborn라이브러리에는 산점도 그래프와 히스토그램을 한 그래프에 표현하게해주는 메소드를 지원한다. 히스토그램과 산점도 그래프가 같이 있는 그래프를 그리기 위해서는 jointplot()이라는 메소드를 사용해 주어야 한다.
jointplot()의 특징중 하나는 일반적인 seaborn라이브러리의 그래프들 처럼 subplot()선언을 해주지 않고 바로 jointplot()에 대한 값을 작성해 주면 된다는 것이다. 또한 x,y축에 이름을 붙여줄때 set_axis_labels()메소드를 사용해서 x,y축에 이름을 붙여주어야 하고 제목 또한 fig.suptitle()메소드를 이용해 주어야 한다. 필자도 혹시나 하는 마음에 set_xlabel, set_ylabel 메소드를 이용한 x,y축 이름을 붙여주려 하였지만 지원하지 않는 메소드라는 오류가 나왔다. 산점도 그래프의 단점 중 하나는 점이 겹치게 되면 점을 구별할 수 없다는 단점이 있다. seaborn라이브러리의 jointplot은 이 부분을 해결해 주기 위해서 육각형 그래프를 지원한다. 육각형으로 그래프를 작성하게 되면 데이터의 개수가 많아질수록 해당 부분의 색이 점점 진해지는 원리이다. 육각형 그래프를 그리기 위해서는 kind 값을 hex로 설정해 주면 된다. 한가지 주의해야 할 점은 육각형 그래프는 회귀산점도 그래프를 그리는 distplot()메소드는 지원하지 않고 jointplot()에서만 지원한다.
위의 기본적인 산점도 그래프와 비교해보면 점들이 몰려있는 부분에 대한 육각형의 색깔이 매우 진한것을 볼 수 있다.
이번에는 2차원 밀집도 그래프를 그려보자. 2차원 밀집도는 kdeplot() 메소드를 통해 작성해 줄 수 있다. 그라데이션 효과를 주기 위해서는 shade값을 True로 설정해 주면 된다.
seaborn패키지 안에는 barplot()이라는 메소드가 있다. 한글로 해석하면 바 그래프인데, 바 그래프는 지정한 변수에 대한 평균 값을 계산해서 그래프를 그린다.
해당 그래프를 보면 우선 x축의 데이터로 Lunch 혹은 Dinner이라는 값을 가지는 time 이라는 변수 값을 넣어주었고, y축 데이터로는 total_bill에 대한 값을 넣어주었다. 이 그래프에서는 전체 데이터에서 Lunch값을 가진 행에 대한 total_bill의 평균, Dinner값을 가진 행에 대한 total_bill의 평균을 구해서 그래프로나타내주고 있는 것이다.
matplotlib라이브러리에도 있었듯이 seaborn라이브러리에서도 박스 그래프를 작성해 줄 수 있다. 박스 그래프를 그려주기 위해서는 boxplot()메소드를 이용해 주면 된다. boxplot()의 기본적인 형태는 matplotlib패키지의 boxplot()메소드와 다른점은 크게 없다.
박스 그래프의 단점은 데이터 분산에 대한 것이 애매하게 출력된다. 좀더 데이터 분산이 확실하고 커널 밀도를 추정하기 쉽게 하기 위해서 바이올린 그래프를 그리기도 한다. 바이올린 그래프를 그리기 위해서는 violinplot()메소드를 이용해 주면 된다.
박스 그래프와 비교해보면 확실히 바이올린 그래프가 밀도에 대한 점이 확실히 구분되는것을 볼 수 있다.
지금까지 그린 그래프를 총합해서 볼 수 있는 그래프가 있다. 바로 관계 그래프라는 것인데, 관계 그래프를 그리기 위해서는 PairGrid()이라는 메소드를 이용하고 데이터 프레임만 넣음으로서 작성해 줄 수 있다.
기본적인 PairGrid()의 형태는 다음과 같이 생겼다. PairGrid()의 특징이라면 왼쪽에서 오른쪽으로의 대각선을 기준으로 데이터가 동일한것이 나온다는 것이다. 중복 되는 그래프의 위치를 설정해 줄 수 도 있다. map_upper,map_lower,map_diag메소드를 이용해 주면 된다. 매개변수로는 각각의 seaborn패키지 안에 있는 그래프 메소드를 작성해서 넣어주면 된다.
필자가 아직 이 PairGrid()메소드에 대한 공부를 모두 마치진않았다. 하지만 확실한것은 히스토그램과 밀집도(distplot()메소드)그래프가 중점이 되어야 한다는것은 확실하였다. 필자가 이 이외에 boxplot()을 추가시켜보려 하였지만 'boxplot() got an unexpected keyword argument 'label'' 이라는 문구와 함께 오류가 나면서 출력되지 않았다. 해당 PairGrid()메소드에 대한 공부가 좀더 되면 심화적으로 올리겠다.
matplotlib 라이브러리를 활용할 때도 해봤듯이 변수 양이 3개 이상인 경우인 다변량 그래프를 작성해 보자. 기본적인 바이올린 그래프는 다음과 같이 형태를 띄고 있다. 만약 여기서 내가 Lunch 와 Dinner 시간에서 성별에 따른 밀도 까지 넣고 싶다고 하자. 이렇게 되면 성별에 따른(변수1) 시간별(변수 2) 전체 비용(변수3) 에 대한 밀도를 구하는 것이기에 전체 변수는 3개가 되고, 이는 즉 다변량 그래프가 되는 것이다. 다변량 그래프를 작성해 보면 다음과 같이 2가지 형태가 존재하는것을 볼 수 있다.
여기서 주목해야할 매개변수는 hue매개변수와 split매개변수이다. hue매개변수는 어떤 상황에 대해서 그래프 안에서 나눌 변수의 값을 넣어주면 된다. 기본적으로 hue의 값만 넣고 그래프를그리면 다음과 같이 출력된다.
'time'의 값이 'Lunch'인 경우와 'Dinner'인 경우에 대해서 'Male'과 'Female'값에 대한 밀도표가 따로 나오는 것을 볼 수 있다. 여기서 만약 split매개변수를 True로 설정해서 대입해주면 Male과 Female값이 합쳐저서 나오는것을 볼 수 있다.
hue 매개변수를 이용하면 산점도 그래프나 관계그래프를 그리는데에 있어서도 색을 구분하여 변수값에 따른 그래프를 그릴 수 있다. 산점도 그래프에서 성별에 따른 전체 금액 비례 팁 금액을 산점도 그래프를 그리려면 다음과 같이 그릴 수 있다.
lmplot()도 회귀 산점도 그래프를 출력하는 메소드이다. 하지만 또다른 회귀 산점도를 그리는 메소드인 distplot()메소드와 다른점이라면 distplot()메소드는 hue매개변수 값을 이용한 색상 구분을 지원하지 않는다. 그래서 좀 더 구체적인 회귀 산점도 그래프를 그리려면 lmplot()메소드를 이용해 주는것이 맞다. 또한 lmplot()는 jointplot()메소드의 히스토 그램에서 그렸었던 육각형 그래프를 그릴 수 없다.
관계 그래프에 대해 성별에 따른 구분은 다음과 같이 작성해 주면 된다. PairGrid혹은 pairplot() 메소드의 매개변수 값으로 데이터 프레임과 hue값을 설정해 주면 된다.
'DataAnalysis > Python Pandas' 카테고리의 다른 글
read_csv utf-8 관련 오류 : UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byte (0) | 2019.03.20 |
---|---|
데이터 시각화 : Seaborn 라이브러리 폭넓게 활용해 보기 2 (0) | 2019.03.12 |
데이터 시각화 : Matplotlb 라이브러리 폭넓게 활용해보기 (0) | 2019.03.10 |
판다스 데이터 시각화 - 그래프 그리기, matplotlib : 2 (0) | 2019.03.09 |
판다스 데이터 시각화 - 그래프 그리기, matplotlib : 1 (0) | 2019.03.09 |