18. Matplotlib - 기타 데이터 시각화 라이브러리(Seaborn, Bokeh, Folium)
1. Seaborn
matplotlib을 기반으로 만들어진 시각화 라이브러리로 사용방법이 아주 유사하다.
공식사이트 갤러리로 가서 살펴보면 된다.
(https://seaborn.pydata.org/examples/index.html)
2. Bokeh
웹 브라우저 상에서의 시각화에 효과적인, Python 인터랙티브 시각화 라이브러리로,
플롯을 html 파일로 export하여, 웹브라우저 상에서 확인할 수 있고, interactive하게 조작이 가능하다.
예를 들어, 선택한 부분만 히스토그램이 활성화되는 기능도 있다.
마찬가지로 matplotlib과 사용방식이 유사하다. 공식사이트의 갤러리에서 살펴보자.
(https://bokeh.pydata.org/en/latest/)
3. Folium
지리적 데이터 시각화에 특화된 라이브러리로, 자바스크립트 라이브러리인 leaflet.js기반이다.
지도 데이터 사용을 위해 선행되어야 하는 적으며, 설치와 사용법이 간단하다.
'빅데이터 관련 프로그래밍 > Python - bigdata(pandas 기초)' 카테고리의 다른 글
20. pandas 추가 – 계층적 인덱싱(정렬함수, 통계함수적용, 인덱스와 칼럼 전환(stack,unstack)) (3) | 2018.03.02 |
---|---|
19. pandas 추가 – 데이터 합치기 2가지 방식(merging, concatenating) (1) | 2018.03.01 |
참고 : matplotlib 분석 정리 (0) | 2018.02.28 |
17. Matplotlib – 데이터 분석하기(3개) (4) | 2018.02.28 |
16. Matplotlib - figure, subplot-axes/ Plot모양 변형/ 눈금,레이블,범례 / 축의 범위 확인 및 변경 (1) | 2018.02.27 |
참고 : matplotlib 분석 정리
1. 전체기준열의 각 values값이 포함된 행수의 세기(분포) => 라인플롯 그리기
파읽 읽기 –> shape / head() / columns(칼럼명들만 리스트로 반환) 보기 –> 전체 기준열을 인덱싱한 뒤, .value_counts()로 포함된 행수를 Series로 받기 –> 그 Series의 분포에, .sort_index()를 통해 오름차순 정리하기 –> 새로운 변수에 담아서, 변수.plot()그리기 –> plot그릴 때 반환 받은 axes변수로 xticks(yticks) 정수로 바꿔주기 –> xlim(ylim)으로 범위 늘려주기
2. index를 name열로 바꾼 뒤, 각 name행에 따른 조건을 만족하는 특정열 1,2를 뽑고-> 특정열 1,2의 비율 비교하기
name열을 데이터프레임.set_index( [칼럼명] )을 통해 새로운index 만들기 –> 특정열1과 특정열2를 인덱싱하여 합이 10000이 넘도록 조건문을 달아 새로운 boolean마스크 변수 생성-> 마스크변수를 행인덱스에 집어넣고, 뽑아낼 특정열1,2를 열인덱싱에 넣어, 해당조건을 만족하는 행 뽑아낸 뒤 새로운 DataFrame변수에 집어넣기 –> 새로운 DataFrame으로 plot()을 stacked옵션을 주어서 만들기 –> 각 비율을 계산한 열을 추가로 생성하여, 비율 열1,2로 효과적인 비율 비교의 bar플롯 그리기
3. 여러개의 특정열의 values를 Series의 index로 만들고, 그 각각의 values가 여러개의 특정열에 포함된 행의 수를 뽑아내서 히스토그램 만들기
여러개의 특정열을 관리하기 쉽게 칼럼명만 칼럼인덱싱으로 뽑아내서 변수에 담기 –> 여러개의 특정열에 나타는 values중에 NaN이 포함된 것을 none문자열으로 치환한 뒤, np.unique()로 중복없는 values리스트들을 새로운 변수에 담기-> 중복없는 values리스트를 index로 준 빈 Series 만들기 –> for문을 통해, 여러개의 특정열 칼럼명 변수를 통해 하나씩 순회하면서, 각 열에 value_counts()를 통해 각 value가 포함된 행수를 빈 Series에 .add()하기 + fill_value = 0 으로 특정열 속의 NaN은 0으로 계산해서 더하기 –> 히스토그램 그리기
'빅데이터 관련 프로그래밍 > Python - bigdata(pandas 기초)' 카테고리의 다른 글
19. pandas 추가 – 데이터 합치기 2가지 방식(merging, concatenating) (1) | 2018.03.01 |
---|---|
18. Matplotlib - 기타 데이터 시각화 라이브러리(Seaborn, Bokeh, Folium) (0) | 2018.02.28 |
17. Matplotlib – 데이터 분석하기(3개) (4) | 2018.02.28 |
16. Matplotlib - figure, subplot-axes/ Plot모양 변형/ 눈금,레이블,범례 / 축의 범위 확인 및 변경 (1) | 2018.02.27 |
15. Matplotlib 사용하기 –라인 플롯, 바 플롯, 히스토그램, 산점도 (1) | 2018.02.25 |
17. Matplotlib – 데이터 분석하기(3개)
필요한 패키지 import
%matplotlib nbagg
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
csv 파일 읽어오기 by Pandas
battles = pd.read_csv( "data/game-of-thrones/battles.csv", sep=",")
death = pd.read_csv( "data/game-of-thrones/character-deaths.csv", sep=",")
battles라는 DataFrame 에는 전투 데이터 관련이,
deaths 에는 모든 등장인물의 등장정보와 사망년도/사망장소에 관련 정보가 있다.
데이터 확인하기
battles.shape
battles.head()
battles.columns
* 데이터.columns를 하면 컬럼명들이 리스트형식으로 반환된다.
데이터 분석하기(1)
1. 전체기준열의 각 values값이 포함된 행수의 세기(분포) => 라인플롯 그리기
파읽 읽기 –> shape / head() / columns(칼럼명들만 리스트로 반환) 보기 –> 전체 기준열을 인덱싱한 뒤, .value_counts()로 포함된 행수를 Series로 받기 –> 그 Series의 분포에, .sort_index()를 통해 오름차순 정리하기 –> 새로운 변수에 담아서, 변수.plot()그리기 –> plot그릴 때 반환 받은 axes변수로 xticks(yticks) 정수로 바꿔주기 –> xlim(ylim)으로 범위 늘려주기
첫 번째로, deaths라는 데이터프레임에서 죽은 책의 이름을 의미하는 [ 죽은책 번호(Book of Death)에 따른 –> 죽은사람의 명수(행의 수=사람의 수)를 ] 시각화해보자. 즉, 전체기준열의 각 values값이 포함된 행수의 분포를 보면 된다.
- 각 행이 한 사람을 의미하므로, value_counts()로 세어진 행수 = 사람의 수를 의미하게 된다.
- book_nums_to_death_count = deaths["Book of Death"].value_counts().sort_index() 를 통해
기준열(책 번호-Book of Death)에 따른 죽은 인물들의 명수를 구하여 –> book_nums_to_death_count 변수에 담는다.
(13강. sort_index()는 열인덱싱을 통해 시리즈로 나타날 데이터의 index를 오름차순으로 만들어준다)
1편에서는 49명이 죽었고, 2편에서는 73명이 죽었고… 를 한눈에 알 수 있다.
라인플롯 그리고 보기 편하게 변형하기
- fig없이 바로 데이터.plot()함수를 이용해, 해당 데이터로 라인플롯을 그린다.
color, marker, linestyle을 인자로 함께 주면서, 데이터.plot()으로 그린 좌표평면을 반환 받는다.
ax1 = book_nums_to_death_count.plot( color ="k", marker = "o", linestyle = "—") - 1.0부터 5.0로 소수점까지 포함된 xtick을, 정수로 바꿔주기 위해서 좌표평면.set_xticks()함수에 np.arange(1,6)을 이용한다
ax1.set_xticks(np.arange(1,6)) - x축의 범위를 조금 늘려 0부터 6까지 나타내기 위해서
ax1.set_xlim( [0,6] ) - y축은 정수니까, 범위만 조금 늘려준다.
데이터를 시각화해서 보니, 3권에서 가장 많은 사람이 죽었다는 것을 알 수 있다.
데이터 분석(2)
2. index를 name열로 바꾼 뒤, 각 name행에 따른 조건을 만족하는 특정열 1,2를 뽑고-> 특정열 1,2의 비율 비교하기
name열을 데이터프레임.set_index( [칼럼명] )을 통해 새로운index 만들기 –> 특정열1과 특정열2를 인덱싱하여 합이 10000이 넘도록 조건문을 달아 새로운 boolean마스크 변수 생성-> 마스크변수를 행인덱스에 집어넣고, 뽑아낼 특정열1,2를 열인덱싱에 넣어, 해당조건을 만족하는 행 뽑아낸 뒤 새로운 DataFrame변수에 집어넣기 –> 새로운 DataFrame으로 plot()을 stacked옵션을 주어서 만들기 –> 각 비율을 계산한 열을 추가로 생성하여, 비율 열1,2로 효과적인 비율 비교의 bar플롯 그리기
battles에 대한 데이터를 다시 한번 확인하기 위해 .head()를 확인한다.
battles 데이터에서는 전투군과 수비군에 대한 정보가 서술되어있다.
공격군과 수비군의 수(attacker_size, defender_size)의 합이 10,000이상되는 대규모 전투를 뽑은 뒤,
대규모 전투 별로 병력차이를 비교해보고 Boxplot(수평barh+stacked)으로 시각화 해보자.
- 단순히 0부터 정수로 되어있는 index를 전투의 이름(name)으로 바꾼 뒤, battels에 대입하여 덮어씌우자.
battles = battles.set_index(["name"])
battles.head() - 공격군과 수비군의 합이 10000만 이상 되는 것을 뽑기 위해, 해당조건으로 boolean마스크를 생성한 뒤 변수에 담아준다.
large_battles_mask = battles["attacker_size"] + battles["defender_size"] > 10000 - 마스크로 행인덱싱 하고, 확보할 열 2개(공격군, 수비군 수)을 열인덱싱하여, 조건에 맞는 행만 뽑아낸 뒤, 새로운 데이터프레임에 담는다.
large_battles = battles.loc[large_battles_mask, ["attacker_size", "defender_size"]]
large_battles.head() - 이제 대규모전투만 뽑은 DataFrame에 대해, 각 군의 상대적인 비율을 확인하기위해 bar플롯(수평barh + stacked)을 그려보자.
large_battles.plot(kind="barh", stacked=True , fontsize = 8)
공격군+수비군의 합이 만명이 넘어가는 대규모 전투는 총 10개가 있었고,
bar플롯(stacked)을 통해 병력차이를 확인할 수 있다. - 공격군과 수비군의 효과적인 비율비교를 위해서, 비율을 먼저 계산하여 새로운 열로 추가하고, bar플롯으로 그려보자.
비율로 계산하면,, 수평bar+stacked로 바플롯을 그리면, 수평막대를 완전히 채울 수 있다.(2개의 합 = 1)
large_battles["attacker_pcts"] = large_battles["attacker_size"] / ( large_battles["attacker_size"] + large_battles["defender_size"] )
새로운 열은 공격군 / (공격군 + 수비군의 합) 으로 계산된 공격군의 비율이다. 수비군의 비율도 유사하게 추가해준다.
large_battles["defender_pcts"] = large_battles["defender_size"] / ( large_battles["attacker_size"] + large_battles["defender_size"] ) - 각 비율 열 2개만 인덱싱하여 barplot을 그려보자.
ax3 = large_battles[ ["attacker_pcts" , "defender_pcts"] ].plot( kind = "barh", stacked = True, fontsize = 8)
데이터 분석(3)
3. 여러개의 특정열의 values를 Series의 index로 만들고, 그 각각의 values가 여러개의 특정열에 포함된 행의 수를 뽑아내서 히스토그램 만들기
여러개의 특정열을 관리하기 쉽게 칼럼명만 칼럼인덱싱으로 뽑아내서 변수에 담기 –> 여러개의 특정열에 나타는 values중에 NaN이 포함된 것을 none문자열으로 치환한 뒤, np.unique()로 중복없는 values리스트들을 새로운 변수에 담기-> 중복없는 values리스트를 index로 준 빈 Series 만들기 –> for문을 통해, 여러개의 특정열 칼럼명 변수를 통해 하나씩 순회하면서, 각 열에 value_counts()를 통해 각 value가 포함된 행수를 빈 Series에 .add()하기 + fill_value = 0 으로 특정열 속의 NaN은 0으로 계산해서 더하기 –> 히스토그램 그리기
- 컬럼 중에 전투에 참여한 가문들이 나와있는 <컬럼명>만 발췌해보자. ( .columns –>칼럼명 리스트 / .columns[ a:b] –> 일부 칼럼명 리스트)
*** 칼럼명들만 모아서 가지고 열인덱싱[칼럼명들 변수]로 손쉽게 인덱싱할 수 있다. 원래는 필요한 열들만 발췌해야하나, NaN이 껴있기때문에, 필요한 열들의 칼럼명을 뽑아서 다른 처리를 먼저 해줘야하기 때문이다.
이 때, 컬럼들이 붙어 있으므로 <컬럼명>열 번호로 인덱싱한 뒤, 컬럼 명 변수에 담아서 확인해보자.(5번째 열부터 12번째 열까지 총 8개)
(cf. battles[4:12]면 열 인덱싱이고 , battles.columns[4:12]는 컬럼명만 가져온다.
col_names = battles.columns[4:12]
col_names - 참여가문들이 나와있는 8개 열에 대한 중복없는 <unique한 가문의 이름=value>들만 뽑아야한다. 하지만 데이터를 보면, NaN 값이 있다.
NaN을 포함하고 있을 때에는 unique()로 뽑을 때 오류가 나므로, 먼저 NaN부터 다른 문자열(“none”)으로 채운 뒤, none을 제거하는 방식으로 가야한다.
열인덱싱 할 때, 뽑아놓은 컬럼명을 대입하여, 그것만 열인덱싱한 상태에서, NaN값을 “None”으로 채운 뒤, value(값)들만 새로운 변수에 담자. 그러면 8개열의 모든 value들(중복포함)이 각 열별로 NaN없이 담길 것이다.
(여러개의 열인덱싱.values를 하면, 각 열별로 values들이 담긴다)
열별로, 각 values들이 담긴 것을, [:5]를 통해, 5열만 살펴보자.
house_names = battles[col_names].fillna("None").values
house_names[:5]
여러개의 열들을 인덱싱한 뒤, .vaules로 값들을 넣으면 각 열에 대한 values들이 2차원 array로 얻어지는 것을 확인할 수 있다.
각 열에 대한 values들만 각 열별로 나누어 담기 때문에, index같은 것은 없다. - numpy에서 제공하는 unique()함수를 적용해서, 다시 담아넣자.
np.unique()함수를 쓰면, 각 열별로 value값들이 2차원 array형태를 가졌는데, 1xn의 1차원 array로 중복없이 싹다 모아버린다.
house_names = np.unique(house_names)
house_names - 간편하게 none을 제거하기 위해서, 열인덱싱(1차원에서는 n번째 성분을 의미!)으로 boolean마스크를 이용해서,
성분들 중에 None이 아닌 것만 담도록 인덱싱해서 다시 담아준다. 즉, 성분(각 열로 취급)들 중에 None이 아닌 모든 것들을 인덱싱하는 것이다.
house_names = house_names[house_names != "None"]
house_names
NaN이 제거된 순수한 가문들(8개열의 values)들을 얻을 수 있다.
해석하자면, 최소 1회 전투에 참여한 모든 가문들의 이름을 모은 것이다. - 이제 위의 가문들을 index로 하고, 성분은 0으로 하는 Series를 하나 정의하자.
최종 목표인 <가문을 index로 하여, 각 가문에 따른 전투 참여 횟수>의 Series를 만들기 위한 준비이다.
( data에 0만 넣으면 모든 index에 대해서 0으로 찍히는 Series가 만들어진다)
house_to_battle_counts = pd.Series(0, index = house_names)
house_to_battle_counts
여기에, 각 열을 기준으로 index에 합산되도록 해서, 전투 참여횟수를 구할 수 있다. - 만들어진 가문이름을 index로 한 Series에다가,
battles의 열인 attacker_1부터 4까지, defender_1부터 4까지 순회하면서 등장하는 가문이름이 포함된 행의 수를 .value_counts()를 통해 Series형태로 얻은 다음 대입해준다. 이렇게 Series로 계산하는 이유는, 열을 인덱싱해서 얻어지는 Series의 경우 .value_counts()를 하게 되면, 각 가문을 의미하는 value값을 가지는 행들의 갯수가 [values값(가문이름) – 해당 횟수]의 Series형태로 뽑히기 때문이다.
그래서 만들어둔 빈 Series인 house_to_battles_counts에 .add( Series형태 ) 하게 되면, 더해질 value값과 가문이름이 동일한 곳에 해당 횟수가 더해지진다.
순회는 for문을 통해서 이미 만들어둔, col_names를 가지고 하나씩 대입해서 순회한다.
이 때, Series.add ( Series )의 인자에 추가로, fill_value=0를 넣어 순회하는 8개의 특정열에 포함된 NaN은 0으로 치환해서 add해주게 한다.
참고) battles["attacker_1"].value_counts()
for col in col_names :
house_to_battle_counts = house_to_battle_counts.add( battles[col].value_counts() , fill_value = 0)
총 8개의 열에서, 각 가문이 몇번 등장했는지, 데이터가 나오게 된다.
해석해보자면, Lannister가문과 Stark가문이 다른가문에 비해 압도적으로 많이 전투에 참여했다는 것을 알 수 있다. - 이제 이 데이터로 히스토그램을 그려보자.
ax4 = house_to_battle_counts.hist(bins=10)
해석)
대체로 1회~ 3회 정도까지 전투에 개입한 가문이 제일 많고 , 15~18회 전투를 참여한 가문은 1번으로 드물다.
'빅데이터 관련 프로그래밍 > Python - bigdata(pandas 기초)' 카테고리의 다른 글
18. Matplotlib - 기타 데이터 시각화 라이브러리(Seaborn, Bokeh, Folium) (0) | 2018.02.28 |
---|---|
참고 : matplotlib 분석 정리 (0) | 2018.02.28 |
16. Matplotlib - figure, subplot-axes/ Plot모양 변형/ 눈금,레이블,범례 / 축의 범위 확인 및 변경 (1) | 2018.02.27 |
15. Matplotlib 사용하기 –라인 플롯, 바 플롯, 히스토그램, 산점도 (1) | 2018.02.25 |
참고 : pandas 분석 정리 (0) | 2018.02.25 |
16. Matplotlib - figure, subplot-axes/ Plot모양 변형/ 눈금,레이블,범례 / 축의 범위 확인 및 변경
Matplotlib에서는 figure라는 그림단위를 사용하여, 이 안에서 한개 혹은 여러개의 plot을 그리고 관리하도록 지원을 한다.
이 때, figure안에 들어가는 plot하나를 subplot이라 부른다.
figure에 알아보기 앞서 필요한 패키지들과 매직명령어를 import하자
%matplotlib nbagg
import matplotlib.pyplot as plt
import matplotlib
figure –> subplot 으로 세분화해서 그릴 준비하기
- pyplot에서 제공하는 .figure()함수를 호출해서, 내부가 텅빈 초기 figure를 만들 수 있다.
- 이제 생성한 피규어 fig 에 subplot을 추가해야한다. add_subplot( , , )을 호출하여 좌표평면을 나타내는 변수(axes)에 받아줘야한다.
앞에 2개인자는 fig 내에 몇행x몇렬로 subplot을 가질 것인지 지정한다.
마지막 인자는, 행렬의 몇번째 성분에 그릴 것인지를 지정하는 것이다. 2x2라면 1,2/3,4 시작위치를 지정할 수 있다.
ax1 = fig.add_subplot(2,2,1) 라는 명령어를 입력하면, 만들었던 피규어의 2x2 중 1번째 위치에서 빈 좌표평면(ax1)이 그려지는 것을 확인할 수 있다.
마찬가지로 2, 3번째 위치에서 시작하는 subplot의 좌표평면도 나타내자
이렇게 인터렉티브하게 조작할 수 있는 것은 매직명령어로 옵션을 줘놨기 때문에 가능하다.
numpy, pandas로 데이터 생성 후 figure의 subplot마다 그려보기
패키지를 먼저 import한다.
import numpy as np
import pandas as pd
- plt.figure()로 생성한 fig에 .add_subplot()를 통해 생성한 좌표평면 ax1, ax2, ax3가 있다.
pyplot에서 제공하는 plt.plot()함수의 인자에, 1차원 랜덤데이터 50개의 누적합 데이터를 주고, 좌표평면(ax1, ax2, ax3)을 지정하지 않고 그려보자.
아래와 같이, 맨 마지막에 위치한 좌표평면(ax3)에 plot이 그려진다.
만약, 또 좌표평면을 지정하지 않고 그린다면, 그 전인 2번째 좌표평면(ax2)에, 그리고 그다음에는 1번재 좌표평면(ax1)에 그려지게 된다.
즉, 좌표평면을 지정하지 않고 figure의 subplot에 그림을 그리면, 마지막부터 역순으로 plot이 채워진다.
* 해당 subplot에 그림을 그릴려면, subplot생성할 때 마다 지정해준 좌표평면을 선택해줘야하구나! (plt.plot() (x)- > ax.plot() ) - axes를 지정해줘서 plot을 그려주자. 첫번 째로, ax1에다가 히스토그램(x값만 있으면 그려지는) 을 한번 그려보자.
ax1.hist( np.random.randn(100), bins = 20) - 랜덤정수100개가 속하는 구간을 20개의 구간으로로 나타낸다.
아래와 같이 첫번째 좌표평면에 그려지게 된다.(fig-subplot-ax가 없었을 땐, Series.hist(bins=,normed=) ) - ax2 좌표평면에다가는 산점도를 그려보자(산점도는 독립변수 2개가 필요함)
비교하는 독립변수에는 0부터 30전까지 1차원array와 동일한array+3*30개 랜덤수 데이터를 대입하자.
ax2.scatter(np.arange(30), np.arange(30) + 3*np.random.rand(30))
(fig-subplot-ax 없었을 땐, plt.scatter(열인덱싱, 열인덱싱) )
특정axes를 나타내는 변수에 .plot(), .hist(), .scatter( ) 함수를 사용해서 fig > subplot > axes좌표평면에다가 그릴 수 있었다.
figure와 subplot을 좀 더 직관적으로 그리기
pyplot에서 제공하는 plt.subplots (m ,n ) or (m) 을 통해서 fig와 axes를 2개 동시에 반환 받을 수 있다.
fig, axes = plt.subplots(2,3) 를 통해, 2x3 subplot들을 한꺼번에 만들고, fig와 axes도 반환받자.
반환받은 axes에는 2x3짜리 array가 들어가 있으며, 각 성분은 그 위치의 axes에 해당한다. ax1, ax2방식이 아니라, 인덱스로 지정해준 다음 .plot()을 통해 해당 위치에 plot을 그릴 수 있다.
plot 모양 변형하기
라인플롯의 경우, 색/마킹기호/라인스타일 등을 지정할 수 있다. plt.plot()으로 라인플롯을 그리면서,
인자로 color, marker, linestyle이라는 값을 줘보자.
- plt.plot(np.random.randn(30), color="g", marker="o", linestyle="—")
- 인자를 “” 문자열 안에 한번에 줄 수 도 있다.
plt.plot(np.random.randn(30), "k.-") : 검은색, 점모양, 일반라인 - 각종 인자color, marker, linestyle값 목록
라인플롯 이외에, 바 플롯, 히스토그램, 산점도 에는 color과 alpha값을 지정할 수 있다. 그리고 좌표평면axes도 ax 인자로 지정해주자.
subplots를 생성해서 그리면서 채워보자. alpha는 투명도를 의미한다.
fig, axes = plt.subplots(2,1)
- 먼저, 데이터를 만들자, pd.씨리즈인데, 16개 랜덤수이며, index는 list함수로 문자열 16개를 쪼개서 대입한다.
data = pd.Series(np.random.randn(16), index = list("abcdefghijklmnop"))
그리고 이 dataFrame 혹은 Series를 plot으로 그릴 때는, data.plot( )의 인자에, 플롯의종류kind 이외에 ax=라는 인자를 주어,
subplot만들 때 반환받은 axes array를 인덱싱해주면된다. ( 걍 바로 그릴 때는 plt.plot(data직접 생성)으로 그렸었음 )
여기서는 2 x 1 axes가 생성되었으므로, 그것의 첫번째 성분인 axes[0]을 ax=인자에 명시해주자.
* 2x1행렬에서는,,, axes[0]이 1열이 아니라 1행의 성분이 되는구나… axes[1]은 2번째 열이 아니라 2행의 성분.
* 만약, 1x2 행렬이라면 , axes[0]은 1열, axes[1]는 2열이 된다.
*** series 뿐만 아니라, 1x n / n x 1 도 1차원이다!!!!!!! ==> array[n] 열인덱싱이 ~번째 성분만 의미하게 된다.
이어서 그릴axes뿐만 아니라, color와 alpha인자도 주자(라인플롯은 color, marker, linestyle)
data.plot(kind="bar", ax=axes[0], color="k", alpha=0.7) - 마찬가지로, 수평 바플롯을 그리고 색과 투명도를 주자.
data.plot(kind="barh", ax=axes[1], color="g", alpha=0.3)
마찬가지로, 히스토그램이나 산점도도 마찬가지로 입력하면된다.
눈금 및 눈금의 레이블 조작하기
눈금, 레이블, 범례를 조작하기 위해서는 먼저 figure를 만들어야한다.
fig = plt.figure()
만든 fig에 대해서 subplot을 만든다. 간단하게 1x1 서브플롯의 1번째 axes를 지정해주자.
ax3 = fig.add_subplot(1,1,1)
여기에 랜덤한 수 1000개들의 누적합으로, 라인플롯을 하나 그려주자.
ax3.plot(np.random.randn(1000).cumsum())
수평축은 0부터 1000까지 나타나있으며, 기본눈금이 200단위로 되어있는 1000개 랜덤수의 누적합을 라인플롯으로 확인할 수 있다.
수학적으로 이러한 결과물을 random walk라고 부른다.
그리고 이렇게 200단위로 나타나는 x축의 눈금을 matplotlib에서는 x tick , y축의 눈금을 y tick이라 부른다.
- x축의 눈금(tick)을 변형하기 위해서는 해당 좌표평면.set_xticks( [0, 250, 500, 750, 1000] ) 식으로 인자에 리스트형식으로 넣어준다.
ax3.set_xticks( [0, 250, 500, 750, 1000] ) - 이제 x축의 눈금을 –> label(문자열)로 바꿔보자.
원래 x의 눈금(ticks)가 5개 였으므로, tick의 수와 동일한 갯수로 좌표평면.set_xticklabels( [ "문자열1”, "문자열2” , ,,, , "문자열5” ] 로 바꿔주면된다.
이 때, 추가적으로 회전도와 폰트사이즈 등을 줄 수도 있다.
ax3.set_xticklabels( ["one", "two", "three", "four", "five"],
rotation = 20, fontsize = "small") - y축 눈금도 마찬가지로 set_yticklabes ()를 이용하면된다.
다음으로, 현재 띄워놓은 axes의 제목을 변경해보자.
각각 축의 눈금(tick)의 이름(label)도 넣어줄 수 있다.
범례 조작하기
하나의 axes(좌표평면)안에 여러개의 plot들이 들어갔을 때는, 범례가 필요하다. 이를 legend라 한다.
먼저 새로운 figure와 subplot-axes를 만든 뒤 , 3개의 plot을 입혀보자.
fig = plt.figure()
ax = fig.add_subplot(1,1 ,1) : 1행1열의 subplot 1번째 좌표평면ax
라인플롯을 3개 추가하는데, 인자에 바로 데이터를 만들어서 주고, color/marker/linestyle
+ 범례에 들어갈 각 lineplot의 제목을 의미하는label 인자를 다르게 주자.
(아까는 하나의 좌표평면을 지정해서, axes.set_title로 좌표평면의 label을 )
ax.plot(np.random.randn(1000).cumsum(), 'k', label = "one" )
ax.plot(np.random.randn(1000).cumsum(), 'b--', label = "two" )
ax.plot(np.random.randn(1000).cumsum(), 'r.', label = "three" )
.plot()안에 들어가는 label 인자는 범례에서 나타나는 이름이다!
label이라는 인자로 입력된 값은, axes상에 범례를 표시할 때, 각 플롯의 이름이 된다.
- 범례를 표시하려면, 좌표평면.legend()함수를 사용해야하며, 인자로는 loc=”best”를 주면, 최적의 위치에 범폐를 표시한다.
ax.legend(loc="best")
loc의 인자에 따라 범례 위치를 조작할 수 있으나 생략한다.
수직, 수평 축의 범위 확인
현재 표시된 좌표평면 ax.에 get_xlim()이라는 함수를 실행하게 되면, x축 눈금의 범위가 표시된다.
범위를 변경하고 싶다면 set_xlim()함수를 사용한 뒤, 인자로는 리스트형태로 범위를 시작,끝 을 넣어준다.
ax.set_xlim( [ 100,900 ])
수칙축(y)도 마찬가지다.
ax.set_ylim( [-100,100])
다 외울 수 없으니, api나 구글링 하면서 사용하는 것이 좋다.
'빅데이터 관련 프로그래밍 > Python - bigdata(pandas 기초)' 카테고리의 다른 글
참고 : matplotlib 분석 정리 (0) | 2018.02.28 |
---|---|
17. Matplotlib – 데이터 분석하기(3개) (4) | 2018.02.28 |
15. Matplotlib 사용하기 –라인 플롯, 바 플롯, 히스토그램, 산점도 (1) | 2018.02.25 |
참고 : pandas 분석 정리 (0) | 2018.02.25 |
14. pandas 데이터분석 해보기(파일읽기, 분석 3가지(고난도), 파일쓰기) (4) | 2018.02.25 |
15. Matplotlib 사용하기 –라인 플롯, 바 플롯, 히스토그램, 산점도
Matplotlib 라이브러리 사용하기
Series나 DataFrame을 plot을 만들 수 있다. 가장 많이 사용하는 것이 라인 플롯, 바 플롯, 히스토그램, 산점도 가 있다.
사용하기 앞서 %매직명령어를 사용하여 플롯 조작활성화에 대한 옵션을 주어야한다.
옵션 인자로서는 nbagg를 입력하면 plot들을 조작할 수 있는 인터렉티브한 상태가 된다. inline으로 주게 되면, 셀에서 생성된 plot에 대해 조작할 수 없다.
두번 째로, 필요한 패키지(라이브러리)들을 impot해야한다. matplotblit은 총 2개의 패키지를 importing한다(2번째 패키지는 산점도에 사용된다)
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
사용할 데이터를 생성한다. 여기서는 random한 수로 이루어진 Series에 인덱스를 주어 생성한다.
s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
이 시리즈(nx1)의 인덱스는 np에서 제공하는 리스트의 성분이 랜덤한 수 10개를 , index가 0부터 100보다 작은 수이면서 간격이 10이므로, 0 , 10, 20부터 90까지이다.
(이 때, cumsum은 cumulative sum 누적합계의 뜻으로,각 성분에 대해 0,1,2,3,4,5,6,7,8,9가 있다면 0, 0+1, 0+1+2, 순으로 10개가 출력되어,
각 성분을 더해가는 series를 뱉어놓는다. 만약, 2d array라면 설정한 축(cumsum(0)) = 열에 따라 계산되어 [1,2,3],[4,5,6],[7,8,9]였으면 [1,2,3], [1+4, 2+5, 3+6], [1+4+7 , , ] 이러한 방식으로 계산되어 열의 같은위치의 성분끼리 점점 누적되면서 더해져서 나온다.)
라인 플롯 사용하기
라인 플롯 : 독립변수x가 변함에 따라 종속변수y가 어떻게 변화하는지를 나타낸다.
특히 라인플롯은, [연속적인 x]에 따른 y의 변화를 살펴보는데 효과적이다.( 0, 10, 20, … , 90 : 인덱스로 주었다.)
앞에서 만든 series 변수 s를 이용해서 .plot()을 이용해 라인플롯을 그려보자.
series s의 인덱스가 x축 / 각 성분이 y축을 구성한다. 2번째 import한 pyplot의 명령어 plt.plot (s)를 이용해도 똑같은 라인 플롯을 얻을 수 있다.
다음 plot를 생성할 때는, 그전에 만든 plot을 파란색 전원버튼으로 꺼야한다.- 라인플롯을 부분 별로 살펴보자.
x축이 인덱스/y축은 성분값을 나타낸다.우측 상단의 파란색전원버튼을 누르기전까지는 마음대로 조절할 수 있다. 그리고 다음 플롯을 생성할 때는 꺼야한다.
4번째 사각형을 클릭한 뒤, plot에 범위를 지정하면 확대할 수 있따.
디스켓을 누르면 그림형태로 저장할 수 있다.
이제 DataFrame을 만들고, 라인플롯을 생성해보자.
- 랜덤한 10행 4열 array를 만들고, 누적합계를 열로 주면서, 칼럼과 인덱스를 주자.
이 때, 10x4 array에 .cumsum(axis=0)을 줘서 열=행방향↓으로는 누적합계가 되도록 한다. Series일때는 축을 안정해줘도 된다.1차원..
df = pd.DataFrame(np.random.randn(10, 4).cumsum(axis=0),
columns=["A", "B", "C", "D"],
index=np.arange(0, 100, 10))
DataFrame의 인덱스가 x축을, 각 성분들이 y축을 담당하는 것은 Series와 같으나, 칼럼(열)들이 4개의 라인플롯을 만들어냈다.
즉, 칼럼수(열 수) = 라인 플롯의 갯수다. - 만약 여러개의 열을 가진 df에서 특정열에 대한 1개의 라인플롯을 그리고 싶다면, 원하는 열을 Series의 형태로 뽑아지는 열 인덱싱하여서 .plot()을 호출하면된다.
df["B"].plot()
바 플롯(Bar plot) 사용하기
라인플롯은, [연속적인 x]에 따른 y의 변화를 살펴보는데 효과적이다.( 0, 10, 20, … , 90 이 인덱스였다.)
바 플롯은 [숫자상으로 연속적이지 않은 x]에 따른 y의 변화를 살펴본다.
Series데이터를 사용해서 바플롯을 사용해보자.
- 먼저 데이터를 만드는데, 시리즈의 인덱스에 들어간 list( “ 연속된 문자열 “)함수는 연속되어 붙어 있는 문자열들을 하나씩 분리해서 리스트로 만들어준다. 그 리스트 성분들이 index로 들어가 a,b,c,d,..,p까지 되는 것이다. Series에 들어가는 1차원 array가 16개 이므로, 문자열도 연속해서 16개를 적었다.
s2 = pd.Series(np.random.rand(16), index=list("abcdefghijklmnop")) - 바 플롯은 라인 플롯과 동일 함수 .plot()을 호출하는데, 인자에 kind=”bar”를 주어 종류를 바꿔주면 된다.
s2.plot(kind="bar") - 바 플롯을 수평방향으로 줘보자. kind에 “barh”를 주면 된다.
s2.plot(kind="barh")
이제 DataFrame을 만들고, bar plot을 만들어보자.
df2 = pd.DataFrame(np.random.rand(6, 4),
index=["one", "two", "three", "four", "five", "six"],
columns=pd.Index(["A", "B", "C", "D"], name="Genus"))
랜덤한 6x4행렬의 DataFrame을 만들고, 인덱스와 칼럼명을 입력하자.
이 때, 칼럼명에는 coloumns = pd.Index()함수를 이용해 –> 인자로서 각 칼럼명과 함께 name(칼럼이름만)을 입력하는 것을 가능하게 했다.
- df2.bar( kind = “bar”)를 호출해보자. x축에는 인덱스가 있고, y축에는 값이 있고, 칼럼(열) 수 = bar plot의 수가 된다.
- DataFrame의 수평 바 플롯(kind=”barh”)를 호출하면서 추가로, 인자에 stacked=True 로 주게 되면,
인덱스(x축)에 대한 바 플롯이 여러개 나타나는 것이 아니라
[한 인덱스에 모든 바 플롯이 한줄로 나타나게 되어 –> 하나의 index에 대한 각 플롯들(열들)의 성분 비율 ]을 확인할 수 있게 된다.
히스토그램 사용하기
히스토그램의 경우, 라인 플롯, 바 플롯과 다르게, 하나의 변수x만을 가지고 그릴 수 있다. 그 x축-> x가 속하는 구간과 y축->구간에 속한 x의 갯수를 나타내는 것이다. 이 x가 가질 수 있는 값의 구간(bin)의 갯수를 인자로 지정한 뒤, 그 각각의 구간에 속하는 갯수를 막대형태로 그려보자.
히스토그램을 그릴 경우, index가 따로 필요하지 않으며 값들만으로 Series로 구성한다.
히스토그램의 x축에는 bin이라고 하는 구간이, y축에는 그 구간(bin)에 해당하는 x의 갯수가 찍힌다.
s3 = pd.Series(np.random.normal(0, 1, size=200))
인덱스 없는 시리즈를 만들 때, numpy에서 제공하는 정규분포를 의미하는 normal()함수를 사용하였다. 이 normal()함수는 평균과 표준편차를 지정하고, 거기서 추출한 샘플 갯수를 지정해서 뽑아낼 수 있다. 그 결과 평균이 0, 표준편차가 1인 200개의 정규분포를 만들어 낼 수 있다.
만약 2차원으로 만들고 싶다면 size=(200,1) 형식으로 주면 된다.
- 만든 Series를 이용해서 히스토그램을 만들기 위해서는 s3.hist()를 호출하면 된다.
이 때, x축을 matplotlib에서는 bin이라 부르며 인자로 줄 수 있다. 기본적으로 10칸의 bin을 히스토그램이 차지하고 있다.
그래프를 보면 -0.5bin에 해당하는 값의 갯수는 50개가 약간 안되는 것을 알 수 있다. - bin의 갯수를 s3.hist(bins=50) 처럼 bins=구간의 갯수로 직접 지정해줄 수 있다.=> 갯수가 많아지면, 그만큼x가 들어있는 구간도 좁아지면서, 더 세밀하게 관찰 할 수 있다. 히스토그램의 막대 하나하나의 폭이 좋아진 것을 확인할 수 있다.
- 또, bins의 갯수뿐만 아니라, normed인자 = True로 주면, 이전까진 구간에 속한 x의 개수였지만, <각 bin에 속하는 갯수를 전체개수로 나눈 비율, 즉, 정규화된 값>을 bar의 높이로 사용하게 된다. 애초에 200개 샘플을 정규분포에 추출하였기 때문에, 정규화된 결과는 정규분포를 의미하는 종모양과 유사하게 나타난다.
s3.hist(bins=100, normed=True)
산점도(시각적인 상관관계) 사용하기
라인 플롯이나 바 플롯의 목적은 x에 대한 y의 변화를 나타내는 것이 목적이 었다면,
산점도는 서로다른 2개의 독립변수 x1 과 x2와의 관계를 알아볼 때 사용하는 플롯이다.
x1의 값과 x2의 값을 각각의 x/y축으로 하여 2차원 평면상에 점 형태로 나타내는 것이 산점도이다.
데이터로는 np에서 제공하는 지정된 평균/표준편차의 정규분포에서 각각 100개를 2차원형태인 100x1로 추출하여 x1, x2의 array를 만들고,
두 독립변수(100x1, 100x1)를 np에서 제공하는 concatenate()함수를 두 독립변수를 열 방향(axis=1)으로 붙혀서 연결한다
(100x 1 , 100x1 ) = (100 x 2)
이 때, 각 array를 만들 때, Series=1차원이 size=100 이 아니라 (100,1)의 2차원 array로 만들어서-> concatenate()로 연결 할 수 있게 한다.
이제, 각 정규분포에서 뽑아낸 100x1 array 2개를 concatenate()로 붙힌,
100x2 array를 DataFrame으로 만들고, 각 컬럼명을 x1, x2로 준다.
- 이제 df3라는 DataFrame 의 두 칼럼 x1과 x2의 시각적인 상관관계(산점도)를 알아보기 위해, pyplot에서 제공하는 plt.scatter()함수를 호출해야한다. 이 때, 인자로 DataFrame의 각 열을 인덱싱해서 넣어주면 된다.
plt.scatter( df3["x1"], df3["x2"])
산점도 상의 각 점들은, DataFrame의 각 행에 있는 x1, x2성분의 상관관계를 의미한다. 즉, x축이 x1 y축이 x2의 값이다.
만약 x1과 x2의 상관관계가 양의 상관관계면 / 방향으로, 음의 상관관계면 \ 방향으로 점들이 나타날 것이다.
위의 그림은 큰 상관관계가 없다고 볼 수 있다.
'빅데이터 관련 프로그래밍 > Python - bigdata(pandas 기초)' 카테고리의 다른 글
17. Matplotlib – 데이터 분석하기(3개) (4) | 2018.02.28 |
---|---|
16. Matplotlib - figure, subplot-axes/ Plot모양 변형/ 눈금,레이블,범례 / 축의 범위 확인 및 변경 (1) | 2018.02.27 |
참고 : pandas 분석 정리 (0) | 2018.02.25 |
14. pandas 데이터분석 해보기(파일읽기, 분석 3가지(고난도), 파일쓰기) (4) | 2018.02.25 |
13.Pandas DataFrame 데이터분석용 함수(통계함수, 정렬함수, 유용한 함수, 사용자정의함수 적용) (2) | 2018.02.24 |