본문 바로가기
국비 교육/데이터

[데이터 시각화] matplotlib - 2

by 육츠 2023. 11. 4.
Contents 접기

막대 그래프 그리기

bar() 함수를 이용해서 막대 그래프를 그릴 수 있다.
# barh() 함수를 이용해 수평 막대 그래프 그리기도 가능하다.

x1 = np.arange(0,20) # 0-19 까지 연속된 값 20 개
y1 = x1*2 

x_ticks = np.arange(len(x1)) # 눈금지정(위치값)

plt.bar(x1,y1, label = 'Blue bar', color = 'blue' , edgecolor = 'yellow', linewidth = 3)
# plt.barh(x1,y1, label = 'Blue bar', color = 'blue' , edgecolor = 'yellow', linewidth = 3)

plt.xlabel('bar number')
plt.ylabel('bar height')
plt.title('Bar Chart Example')
plt.xticks(x_ticks,x_ticks+1) # x_ticks+1 눈금의 새로운 값
plt.legend()
plt.show()

matplotlib 색상표 

두가지 막대그래프 결과를 한 그래프 안에 넣기

labels = ['Seoul','Busan','Incheon','Gwangju','Jeju']
men_means = [20,34,30,35,27]
women_means = [25,32,34,20,25]

x_ticks = np.arange(len(men_means))
width = 0.35 # 막대그래프의 폭 크기

# x_ticks-width/2 : 한 그래프의 중간에서 원래 중간까지의 값을 뺀 값
# x_ticks-width/2 : 한 x 축에 두가지 막대를 그리기 위함
plt.bar(x_ticks-width/2, men_means, width = width, color = 'dodgerblue', label = 'Men')
plt.bar(x_ticks+width/2, women_means, width = width, color = 'violet', label = 'Women')

plt.xlabel('City')
plt.ylabel('Score')
plt.xticks(x_ticks,labels)
plt.title('Score by group and gender')
plt.legend()
plt.show()

왼: x_ticks-width/2, 오: x_ticks-width/2

 

산점도 그리기

산점도 scatter plot 은 직교 좌표계를 이용해서 두 변수간의 상관관계를 나타내는 plot 이며 scatter() 함수를 이용해서 산점도를 그릴 수 있다.

np.random.seed(0)
for color in ['blue','orange','green']:
    n = 50
    # rand 균등 분포
    x, y = np.random.rand(2,n) # random.rand : 0 <= n < 1 [0,1) 사이의 난수 2행 50열 모양으로 생성 (2차원)
    # 데이터 마커의 크기 지정
    scale = 190 * np.random.rand(n) + 10 # 10 <= n < 200 [10,200) 난수 50개
    plt.scatter(x,y, color = color, s = scale, label = color , alpha = 0.3, edgecolors = 'none') 
    # edgecolors = 'none' 테두리가 없는

plt.legend() # 디폴트 값이 best
plt.grid(True)
plt.show()

히스토그램 그리기
hist() 함수를 이용해서 히스토그램을 그릴 수 있다.
자료의 분포를 몇 개의 구간으로 나눈 후에 각 구간에 해당하는 데이터의 빈도수를 표로 나타낸 것을 도수분포표 frequency table 이라고 한다.
히스토그램은 도수분포표에서 구간별 빈도수를 막대그래프로 나타낸 것이다.

y = np.random.randn(1000)
# randn 표준정규분표 : 평균 = 0 , 표준편차 = 1 난수 1000개 생성
x = np.arange(len(y))

# 막대그래프로 구성
plt.bar(x,y)
plt.title('Raw Data <Bar Chart>')
plt.show() # x축의 값이 1000이 됨 1000 개 하나의 높이를 나타냄

# 히스토그램으로 구성
plt.hist(y, bins = 50) # 표현할 데이터 50 개의 구간으로 나눈다.
plt.title('Histogram')
plt.show()

# 누적 히스토그램(도수분포표)
plt.hist(y,cumulative= True, bins =20)
plt.title('Cumulative Histogram')
plt.show()

대표적으로 두 번째에 그린 히스토그램 예시

원 그래프 그리기
pie() 함수를 이용해서 원 그래프를 그릴 수 있다.

## 기본 원 그래프
labels = ['Python', 'Java','C']
# autopct : wedge 위에 표시할 레이블 지정 (default : None)
# pie() 함수의 전달하는 값은 굳이 비율값을 전달하진 않고 일반적인 값을 전달하더라도 값들의 총합에 대한 비율을 알아서 계산해서 표시
# => 자동으로 비율을 계산해서 표시를 한다.
plt.pie([0.3, 0.35, 0.4], labels= labels, autopct ='%.1f%%' ) # 비율값
plt.title('Popular Language Ranking')
plt.show()

# 조각의 시작= 3시방향 ->  시계 반시계방향으로 그림


## 스타일 활용편
sections = [0.3,0.35,0.4]
labels = ['Python', 'Java','C']
colors = ['navy', 'olive', 'maroon']

plt.pie(
    sections, # 조각의 크기를 설정하는 기본 값
    explode = (0.1, 0, 0), # 조각을 중심으로부터 얼마나 떨어지게 할것인지 설정(0.1 = 반지름의 10% 벗어난 것을 의미)
    # 조각의 개수 만큼 지정
    colors= colors, # 조각의 색을 결정
    labels = labels, # 조각의 이름을 표시
    autopct = '%.2f%%', # %소수점 이하 2자리 % '%' 를 다루기 위함 : 비율을 표시하는 문자열 형식 지정
    shadow = True, # 그림자를 표시
    startangle = 90, # 첫번째 조각(원형의 시작 부분)을 각도로 표시 : 기본값 = 3시방향(0도)
    counterclock = False, # 반시계방향으로 표시할지를 결정 : 기본값 = True
    rotatelabels = True # 조각의 이름을 회전 : 기본값 = False
)
plt.title('Pie Chart example 2')
plt.show()

다양한 스타일을 적용한 코드의 예시

박스 플롯 그리기

데이터의 분포와 이상치 확인
boxplot 은 데이터 집합의 범위와 중앙값 등 통계 수치를 확인하고 데이터의 이상치를 확인하고자 하는 목적으로 사용

최소값: 제 1사분윙에서 1.5IQR(interquartile range: 사분위수 범위, Q3-Q1)을 뺀 위치
제 1사분위(Q1) : 중앙값 기준 하위 50% 중의 중앙값, 전체 데이터 중 하위 25%에 해당하는 값
제 2사분위(Q2) : 50%의 위치로 중앙값(median)을 의미, 데이터의 정 가운데 순위에 해당하는 값
제 3사분위(Q3) : 중앙값 기준 상위 50% 중의 중앙값, 전체 데이터 중 상위 25%에 해당하는 값
최대값: 제 3사 분위에서 1.5IQR을 더한 위치
IQR interquartile range, 사분위수 분위: Q3 - Q1
최대값과 최소값 범위를 벗어나는 값을 이상치 데이터로 간주한다.

np.random.seed(0)

data_a = np.random.normal(0, 2.0, 1000) # 평균:0 표준편차:2 데이터: 1000개 # 정규분포 값
data_b = np.random.normal(-3, 1.5, 500) 
data_c = np.random.normal(1.2, 1.5, 1500) 

plt.boxplot([data_a,data_b,data_c])
plt.ylim(-10,10) # y축 범위 명시적 지정
plt.xlabel('Data Type')
plt.ylabel('Value')

plt.show()

 

'국비 교육 > 데이터' 카테고리의 다른 글

[데이터 분석] Numpy -1  (0) 2023.11.07
[데이터 분석] Seaborn  (0) 2023.11.06
[데이터 시각화] matplotlib - 1  (0) 2023.11.04
[데이터 수집] Auto Crawler  (0) 2023.11.04