홍동이의 성장일기

[👩‍💻TIL 5일차 ] 유데미 스타터스 취업 부트캠프 4기 본문

교육/유데미 스타터스 4기

[👩‍💻TIL 5일차 ] 유데미 스타터스 취업 부트캠프 4기

홍동2 2023. 2. 10. 16:02

 

목차

 

[64차시] 제목, 축 레이블, 그리드

[65차시] 축의 범위와 눈금 지정

[66차시] 여러개의 그래프와 범례

[67차시] pyplot으로 서브플롯 그리기

[68차시] 위치, 크기 지정하여 플롯 그리기

[69차시] axes를 행, 열로 쪼개어 서브플롯 그리기

[70차시] 전체 행 열과 그래프 순선에 따라 서브플롯 그리기

[71차시] 데이터의 크기를 비교하는 막대그래프

[72차시] 데이터의 관계를 표현하는 산점도

[73차시] 색으로 값의 크기를 표현하는 히트맵

[74차시] 데이터의 도수분포를 표현하는 히스토그램

[75차시] 데이터의 통계값을 표현하는 박스플롯

[76차시] 데이터의 범위와 분포를 표현하는 바이올린플롯

[77차시] 데이터의 비율을 표현하는 파이차트

[78차시] 공통 스타일 지정하기

[79차시] 그래프 강조하기

 


[64차시] 제목, 축 레이블, 그리드

제목
  • plt.title('제목')
  • loc : 제목 위치('left','center','right')
  • pad : 타이틀과 그래프와의 간격
  • color : 폰트색상
  • fontsize : 폰트사이즈
  • fontweight : 폰트굵기('normal','bold','heavy','light','ultrabold','ultralight')
  • fontfamily : 폰트

 

x, y축 레이블
  • plt.xlabel('레이블')
  • plt.ylabel('레이블')
  • loc : 위치('left','center','right' / 'bottom', 'center','top')
  • labelpad : 레이블과 그래프와의 간격
  • color : 폰트색상
  • fontsize : 폰트사이즈
  • fontfamily : 폰트

 

그리드
  • plt.grid(True)
  • axis : 그리드 방향
  • ls, lw, color, alpha(투명도) 등의 속성을 지정할 수 있음
  1. 기본그리드: plt.grid()
  2. 그리드 스타일링: color, alpha, ls

 

x = df['월']
y = df['몸무게']
plt.plot(x,y,'ro-', mec='b', mfc='b', lw=3, ms=7)
plt.title('월별 몸무게 변화', loc='center', pad=10, color='r', fontsize=20, fontweight='bold'
          , fontfamily='Nanum Pen Script')

plt.xlabel('월',loc='right',labelpad=10, color='b',fontsize=12)
plt.ylabel('몸무게(kg)', loc='top',labelpad=10, color='b', fontsize=12)

plt.grid(color='skyblue', alpha=0.5, ls=':')
plt.show()


[65차시] 축의 범위와 눈금 지정

축의 범위 지정하기
  • plt.xlim(min,max)
  • plt.ylim(min,max)

 

틱 설정
  • x축, y축 눈금을 틱(tick)이라고 한다.
  • 틱의 갯수, 레이블, 스타일을 변경할 수 있다.

  1. 틱 지정
    - plt.xticks(틱리스트)
    - plt.yticks(틱리스트)

  2. 틱 레이블 지정
    - plt.xticks(눈금리스트, label  = 레이블리스트)
    - plt.yticks(눈금리스트, label  = 레이블리스트)
    - 눈금의 개수와 동일한 개수의 레이블을 지정한다.

  3. 틱 스타일 지정
    - plt.tick_params( )
    - direction : 틱 위치 (in, out, inout)
    - length : 틱의 길이
    - width : 틱의 두께
    - color : 틱 색상
    - labelcolor : 틱 레이블 색상
    - colors : 틱과 틱 레이블 색상
    - pad : 틱과 레이블 사이의 거리
    - labelsize : 틱 레이블 사이즈
    - axis : 축 지정
xticks_lable = ['','1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월','']
yticks_lable = ['0kg','10kg','20kg','30kg','40kg','50kg','60kg','70kg','80kg','90kg','100kg']

x = df['월']
y = df['몸무게']
plt.plot(x,y,'bo-', mfc='r',mec='r')

# title
plt.title('월별 몸무게 변화', size=15, color='b', fontweight='bold')

# 축 레이블
plt.xlabel('월')
plt.ylabel('몸무게(kg)')

# 틱
plt.xticks(range(0,14,1), labels=xticks_lable)
plt.yticks(range(0,110,10), labels=yticks_lable)

plt.tick_params(axis='x',direction='inout',length=10,width=2,colors='g',labelsize=12 )
plt.tick_params(axis='y',direction='inout',length=10,width=2,colors='b',labelsize=12 )

# 그리드
plt.grid(ls=':')
plt.show()


[66차시] 여러개의 그래프와 범례

여러 개의 그래프 각각 그리기
  • plt.show()로 그래프를 구분한다.

 

데이터가 다른 두 그래프 그리기
  • plt.show()를 마지막에 한번만 사용한다.

 

범례 표시하기
  • 여러 개의 플롯을 동시에 그리는 경우 각 그래프가 무엇을 표시하는지 보여주기 위해 범례를 추가한다.
    1) 그래프에 레이블을 지정한다. (label=그래프명)
    2) 범례를 표시한다. → plt.legend()
  • 범례의 위치는 그래프에 따라 최적의 위치에 자동으로 표시된다.

  1. 범례 위치 지정
    - plt.legend(loc=위치번호)
    - plt.legend(loc=위치이름)

  2. 범례 x, y 위치 지정
    loc=(x, y): 왼쪽 아래 꼭지점 기준

  3. 범례 속성 지정
    • 열 개수 : plt.legend(ncol=열개수)
    • 폰트 사이즈 : plt.legend(fontsize=폰트사이즈)
    • 테두리 : plt.legend(frameon=True/False)
    • 음영 : plt.legend(shadow=True/False)
    • 바탕색 : plt.legend(facecolor=색상)
    • 테두리색 : plt.legend(edgecolor=색상)

[67차시] pyplot으로 서브플롯 그리기

앤스콤 4분할 그래프

영국의 프랭크 앤스콤(Frank Anscombe)이 데이터를 시각화하지 않고 수치만 확인할 때 발생할 수 있는 함정을 보여주기 위해 만든 그래프

 

데이터의 통계수치 확인
  • 데이터프레임.describe()
  • 4개의 데이터는 갯수, 평균, 표준편차가 모두 같다.
  • 이러한 수치만 보고 4개의 데이터 그룹의 데이터가 모두 같을 것이라고 착각할 수 있다.

 

서브플롯 그리기
  1. 전체 그래프의 크기를 정한다. (정하지 않으면 디폴트 크기로 지정된다.)
    plt.figure(figsize=(x사이즈, y사이즈))
  2. 그래프를 그려 넣을 격자를 지정한다.
    plt.subplot(전체행개수,전체열개수,그래프순서)
  3. 격자에 그래프를 하나씩 추가한다.

전체 그래프의 속성 지정
  • figure 객체를 변수에 받는다.
  • figure객체의 suptitle(제목)메소드로 전체 그래프의 제목을 표시한다.
  • figure객체의 tight_layout()메소드로 그래프의 간격, 너비를 최적화한다.

 

fig = plt.figure(figsize=(9,6), facecolor='ivory')

plt.subplot(221)
plt.plot(df1['x'],df1['y'],'o')
plt.title('ax1')

plt.subplot(222)
plt.plot(df2['x'],df2['y'],'+')
plt.title('ax2')

plt.subplot(223)
plt.plot(df3['x'],df3['y'],'*')
plt.title('ax3')

plt.subplot(224)
plt.plot(df4['x'],df4['y'],'d')
plt.title('ax4')

fig.suptitle('Amscombe', size=20)
fig.tight_layout()


[68차시] 위치, 크기 지정하여 플롯 그리기

위치, 크기 지정하여 그래프 그리기
  1. figure, axes
    • figure : 그림이 그려지는 캔버스
    • axes : 하나의 그래프

  2. 위치, 크기 지정하여 그래프 그리기
    1) figure 객체를 생성한다.
    fig = plt.figure(figsize=(가로길이,세로길이))

    2) figure객체의 add_axes 메소드로 위치와 크기를 지정하여 axes 객체를 생성한다.
    ax1 = fig.add_axes([left, bottom, width, height])
    left, bottom : 상대적인 시작 위치 (figsize의 크기를 1이라고 했을 때 상대적 위치)
    width, height : 상대적인 크기(figsize의 크기를 1이라고 했을 때 상대적 크기)

    3) axes에 그래프를 그린다.
    ax1.plot(x, y)

    4) axes에 제목을 추가한다.
    ax1.set_title(제목)

 

  2-1. 위치와 크기를 자유롭게 지정하여 axes 객체 만들기

  • add_axes를 사용하면, 서브플롯의 크기와 위치를 자유롭게 지정할 수 있다.
  • 그래프를 겹쳐그리거나, 크기가 각각 다른 그래프를 그릴 수 있다.

 

# 1)figure 객체를 생성한다.
fig = plt.figure(figsize=(8,6))

# 2) figure객체의 add_axes 메소드로 위치와 크기를 지정하여 axes 객체를 생성한다.
ax1 = fig.add_axes([0,0.5,0.4,0.4])
ax2 = fig.add_axes([0.5,0.5,0.4,0.4])
ax3 = fig.add_axes([0,0,0.4,0.4])
ax4 = fig.add_axes([0.5,0,0.4,0.4])

# 3) axes에 그래프를 그린다.
ax1.plot(df1['x'],df1['y'],'o')
ax2.plot(df2['x'],df2['y'],'r^')
ax3.plot(df3['x'],df3['y'],'k*')
ax4.plot(df4['x'],df4['y'],'m+')

# 4) axes에 제목 추가.
ax1.set_title('ax1')
ax2.set_title('ax2')
ax3.set_title('ax3')
ax4.set_title('ax4')


[69차시] axes를 행, 열로 쪼개어 서브플롯 그리기

  • plt.subplots() 함수를 호출하면 figure, axes 객체를 생성하여 튜플 형태로 반환한다.
    fig, ax = plt.subplots()
  1. axes 객체를 행,열로 쪼개어 생성하기
    fig, ax = plt.subplots(nrows=행개수, ncols=열개수,figsize=(가로사이즈,세로사이즈))
  2. axes[행번호][열번호] 형태로 접근하여 그래프 그리기
  3. 서브플롯간 축을 공유할 수 있다.
    sharex=True, sharey=True

 

# 1) axes 객체를 행,열로 쪼개어 생성하기
# 서브플롯간 축을 공유할 수 있다.
fig,ax = plt.subplots(nrows=2, ncols=2, figsize=(8,6), sharex=True, sharey=True)

# 2) axes[행번호][열번호] 형태로 접근하여 그래프 그리기
ax[0][0].plot(df1['x'],df1['y'],'o')
ax[0][1].plot(df2['x'],df2['y'],'^')
ax[1][0].plot(df3['x'],df3['y'],'*')
ax[1][1].plot(df4['x'],df4['y'],'d')

# 3) 각 그래프에 제목 추가
ax[0][0].set_title('ax1')
ax[0][1].set_title('ax2')
ax[1][0].set_title('ax3')
ax[1][1].set_title('ax4')

# 4) 각 그래프에 그리드 추가
ax[0][0].grid(ls=':')
ax[0][1].grid(ls=':', color='pink')
ax[1][0].grid(ls=':', color='skyblue')
ax[1][1].grid(ls=':', color='green', alpha=0.5)

# 5) 그래프 전체 제목
fig.suptitle('Anscombe', size=20)

# 6) 그래프 간격, 크기 최적화
fig.tight_layout()

[70차시] 전체 행 열과 그래프 순선에 따라 서브플롯 그리기

1) figure 객체를 생성한다.
fig=plt.figure()

2) 서브플롯을 그릴 axes 객체를 생성한다.
ax = fig.add_subplot(전체행개수,전체열개수,순서)

 

 

3) axes 객체에 그래프를 그린다.
ax.plot(x,y)

 

4) 축 공유하기 : 어떤 axes의 축을 공유할 것인지 지정한다.
sharex=axes객체, sharey=axes객체

 

# 1) figure 객체를 생성한다.
fig = plt.figure(figsize=(9,6), facecolor='ivory')

# 2) 서브플롯을 그릴 axes 객체를 생성한다.
# 축 공유하기 : 어떤 axes의 축을 공유할 것인지 지정한다.
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2, sharex=ax1, sharey=ax1)
ax3 = fig.add_subplot(2,2,3, sharex=ax1, sharey=ax1)
ax4 = fig.add_subplot(2,2,4)

# 3) axes 객체에 그래프를 그린다.
ax1.plot(df1['x'],df1['y'],'o', label='ax1')
ax2.plot(df2['x'],df2['y'],'^', label='ax2')
ax3.plot(df3['x'],df3['y'],'*', label='ax3')
ax4.plot(df4['x'],df4['y'],'+', label='ax4')

# 4) 틱 변경하기
ax4.set_xticks(range(1,20,1))
ax4.set_yticks(range(1,15,1))

# 5) 범례 표시하기
ax1.legend(loc=2)
ax2.legend(loc=2)
ax3.legend(loc=2)
ax4.legend(loc=2)

# 6) figure 제목 추가하기
fig.suptitle('Anscombe', size=20)

# 8) 그래프 크기,간격 최적화하기
fig.tight_layout()

plt.show()

 

이미지로 그래프 저장하기
  • fig.savefig(파일명, dpi=해상도)
  • 해상도 default : 100

[71차시] 데이터의 크기를 비교하는 막대그래프

막대그래프
  • 세로 막대그래프: plt.bar(x축데이터,y축데이터)
  • 가로 막대그래프: plt.barh(x축데이터,y축데이터)

 

막대 폭 지정
  • 세로 막대그래프: width = 0~1 사이의 실수 (default: 0.8)
  • 가로 막대그래프: height = 0~1 사이의 실수 (default: 0.8)

 

막대 색상 지정
  •  color = ' '
  • 막대마다 다른 색 지정: 색을 리스트로 만든 후 넣기
plt.bar(df1['요일'],df1['매출액'], width=0.4, color='r')
plt.bar(df1['요일'],df1['매출액'], width=0.4, color=['r','orange','y','g','b','navy','violet'])

 

막대 테두리
  • edgecolor = 테두리 색상
  • linewidth = 테두리 두께

 

막대 패턴 지정하기
  • hatch 파라미터에 기호 전달 : '/', '', '|', '-', '+', 'x', 'o', 'O', '.', '*'
  • 패턴기호의 개수로 밀도를 조정한다.
  • 막대마다 다른 패턴 지정
    • 막대그래프를 객체로 받는다.
    • 막대마다 다른 패턴을 지정한다.
    • set_hatch(기호)
bars = plt.bar(df1['요일'],df1['매출액'], width=0.4, color=['r','orange','y','g','b','navy','violet'], edgecolor='gray',linewidth=2)

bars[0].set_hatch('.')
bars[1].set_hatch('/')
bars[2].set_hatch('+')
bars[3].set_hatch('-')
bars[4].set_hatch('*')
bars[5].set_hatch('|')
bars[6].set_hatch('o')

 

막대 위치지정 

align = center/edge

  • 디폴트: center
  • edge로 지정하면 막대의 왼쪽 끝과 틱을 맞춘다.
  • 막대의 오른쪽 끝과 틱을 맞추려면 width를 음수로 지정한다.

 

두 개의 막대그래프 비교하기
#세로 막대그래프
plt.bar(df1['요일'],df1['매출액'], width=-0.4, align='edge')
plt.bar(df2['요일'],df2['매출액'], width=0.4, align='edge')
plt.title('두 매장의 요일별 매출액 평균', size=15)
plt.grid(axis='y', ls=':')

#가로 막대그래프
plt.barh(df1['요일'],df1['매출액'], height=-0.4, align='edge')
plt.barh(df2['요일'],df2['매출액'], height=0.4, align='edge')
plt.title('두 매장의 요일별 매출액 평균', size=15)
plt.grid(axis='x', ls=':')

 

몰랐던 기능인데 그래프 간의 값의 차이를 비교할 때 유용하게 사용할 수 있을 것 같다


[72차시] 데이터의 관계를 표현하는 산점도

➡️ 산점도로 x축, y축 데이터의 관계를 파악하고, 점의 색과 크기로 정보를 표현할 수 있다.

 

스캐터플롯
  • 점의 크기, 색깔로 정보를 표현할 수 있다. (버블차트)
    • 점의 크기: s = 크기공통지정/크기목록
      • plt.scatter()의 파라미터 s로 점 크기를 지정한다.
      • 점 크기는 공통된 크기로 지정할 수도 있고, 점마다 다른 크기로 지정할 수도 있다.
    • 점의 색상: c = 색상공통지정/색상목록
      • plt.scatter()의 파라미터 c로 점 색상을 지정한다.
      • 점 색상은 공통된 색상으로 지정할 수도 있고, 점마다 다른 색상으로 지정할 수도 있다.
    • 컬러맵으로 색상 지정

 

산점도 예제
## 지불금액과 팁의 관계
plt.scatter(tips['total_bill'], tips['tip'])

## 점의 크기로 테이블 인원 표시
plt.scatter(tips['total_bill'], tips['tip'], s=tips['size']*50, alpha=0.5)

## 점의 색으로 성별 표시
# 성별에 따른 color 컬럼 추가
def set_color(x):
    if x=='Male':
        return 'blue'
    elif x=='Female':
        return 'red'
    
tips['color'] = tips['sex'].apply(set_color)    

# 최종그래프
plt.scatter(tips['total_bill'], tips['tip'], s=tips['size']*50, alpha=0.5, c=tips['color'])

 

지불금액이 비싼 식당은 지불금액에 팁이 포함된것일까?

지불금액이 많아질수록 팁의 전체 건수가 적어지는 이유가 궁금하다. 


[73차시] 색으로 값의 크기를 표현하는 히트맵

히트맵
 

Choosing Colormaps in Matplotlib — Matplotlib 3.3.1 documentation

Note Click here to download the full example code Choosing Colormaps in Matplotlib Matplotlib has a number of built-in colormaps accessible via matplotlib.cm.get_cmap. There are also external libraries like [palettable] and [colorcet] that have many extra

matplotlib.org

 

히트맵 예제
  • 타이타닉호의 연령대_객실등급별 승선자수
## 데이터 준비
import seaborn as sns
titanic = sns.load_dataset('titanic')

## 데이터 전처리
# 결측치 처리
# 결측치 확인
titanic.isnull().sum()

# 컬럼 삭제
titanic = titanic.drop(columns=['deck'])
# 결측치 삭제
titanic = titanic.dropna()
titanic.isnull().sum()

# 연령대 컬럼 생성
titanic['agerange'] = (titanic['age']/10).astype('int')*10

# 피벗테이블: 연령대-객실등급별 승선자 수 
titanic_pivot = titanic.pivot_table(index='class', columns='agerange', values='survived', aggfunc='count')


## 히트맵
# matplotlib
range(0,len(titanic_pivot.columns),1)
np.arange(0.5,len(titanic_pivot.columns),1)

plt.pcolor(titanic_pivot)
plt.colorbar()

plt.xticks(np.arange(0.5,len(titanic_pivot.columns),1), labels=titanic_pivot.columns)
plt.yticks(np.arange(0.5,len(titanic_pivot.index),1), labels=titanic_pivot.index)
plt.show()


# seaborn
sns.heatmap(titanic_pivot, cmap='Blues', annot=True, fmt='d')

 

seaborn

matplotlib에 비해 훨씬 간편하게 히트맵을 만들 수 있다.

  • heatmap(data=2차원데이터)
    cmap=컬러맵 : 컬러맵 지정
    annot=True : 수치 표시
    fmt='d' : 정수로 표시

 

 

3등급 객실의 20대 승선자 수가 가장 많은 것을 확인할 수 있다.


[74차시] 데이터의 도수분포를 표현하는 히스토그램

히스토그램
  • 자료의 도수분포를 나타내는 그래프
    수치를 나타내는 자료를 일정 구간(계급)으로 나누어 각 구간별 값의 개수(도수)를 나타낸다.
  • x축은 계급(값의 구간), y축은 도수(구간별 값의 개수)를 나타냄

  • plt.hist(data)
    default : 10개의 구간으로 나누어 도수분포를 보여준다.

  • bins = 구간의 개수
  • 누적 히스토그램: cumulative = True
  • 범위 지정: range = (min, max)
  • 밀도 표시: density = True
    도수를 총 개수로 나눈 수치를 y축에 표시
  • 가로 히스토그램: orientation = 'horizontal'
  • 막대 스타일
    선만 표시: histtype = 'step'
    - rwidth=막대폭(0~1) 
    - color=막대색 
    - alpha=투명도
    - edgecolor(ec)=선색 
    - linewidth(lw)=선두께 
    - linestyle(ls)=선스타일
    - hatch=패턴

 

히스토그램 예제
plt.hist(scores, rwidth=0.9, color='b', alpha=0.5, ec='k', lw=2, ls=':',hatch='/')
plt.xticks(range(0,101,10))
plt.grid(axis='y', ls=':')
plt.xlabel('점수')
plt.ylabel('인원')
plt.title('점수대별 인원 분포', size=20)
plt.show()

 

위 히스토그램을 통해 70점대 학생이 가장 많은 것을 알 수 있다. 


[75차시] 데이터의 통계값을 표현하는 박스플롯

➡️ 박스플롯을 이용하여 데이터의 통계와 이상치를 표현할 수 있다.

 

박스플롯

  • 데이터로부터 얻어진 아래의 다섯 가지 요약 수치를 사용해서 그려진다.
    - 최소값
    - 제 1사분위수 (Q1) : 전체 데이터 중 하위 25%에 해당하는 값
    - 제 2사분위수 또는 중위수 (Q2)
    - 제 3사분위수 (Q3) : 전체 데이터 중 상위 25%에 해당하는 값
    - 최대값

  • 다른 값들과 동떨어진 값을 이상치로 표현한다.
    어떤 값이 (Q1 - 1.5 * IQR) 보다 작거나, 어떤 값이 (Q3 + 1.5 * IQR) 보다 크면 그 값을 이상치로 정한다.
    - IQR = Q3 - Q1

  • plt.boxplot(data)
  • 평균 표시하기
    - showmeans = True
    - meanline = True
  • 수평 박스플롯: vert = False
plt.boxplot(scores,showmeans=True, meanline=True, vert=False)

 

샘플 데이터
  • 샘플데이터의 통계값: 시리즈.describe()

  • 이상치 구하기
    - Q1: 시리즈.quantile(.25)
    - Q3: 시리즈.quantile(.75)
  • 이상치
    - Q1 - 1.5 * IQR 미만
    - Q3 + 1.5 * IQR 이상

 

여러 개의 데이터 비교하기

plt.boxplot(데이터리스트, labels=레이블리스트)

# 붓꽃 데이터
import seaborn as sns
iris = sns.load_dataset('iris')
iris.head()

# 여러 개의 데이터 비교하기
plt.boxplot([ iris['sepal_length'], iris['sepal_width'], iris['petal_length'], iris['petal_width']    ]
           , labels=['sepal_length', 'sepal_width','petal_length','petal_width']
           , showmeans=True)
plt.grid(axis='y')
plt.show()


[76차시] 데이터의 범위와 분포를 표현하는 바이올린플롯

➡️ 바이올린플롯으로 데이터의 범위와 분포를 표현할 수 있다.

 

바이올린플롯
  • plt.violinplot(데이터리스트)

  • showextrema=True/False : 최대값,최소값에 직선 표시(default:True)
  • showmeans=True/False : 평균값에 직선 표시(default:False)
  • showmedians=True/False : 중간값에 직선 표시(default:False)

  • 분위수 지정하기: quentiles = 0~1 사이의 실수리스트

  • 스타일 지정하기
    • 바이올린플롯 객체를 받아서 스타일을 지정한다.
    • 플롯['bodies'][인덱스].set_facecolor(컬러)
    • 플롯['cmins'].set_edgecolor(컬러)
    • 플롯['cmaxes'].set_edgecolor(컬러)
    • 플롯['cbars'].set_edgecolor(컬러)
    • 플롯['cmedians'].set_edgecolor(컬러)
    • 플롯['cquantiles'].set_edgecolor(컬러)
    • 플롯['cmeans'].set_edgecolor(컬러)
v1 = plt.violinplot(scores, showextrema=True, showmeans=True, showmedians=True, quantiles=[0.25, 0.75])
v1['bodies'][0].set_facecolor('r')
v1['cmins'].set_edgecolor('g')
v1['cmaxes'].set_edgecolor('g')
v1['cbars'].set_edgecolor('k')
v1['cmedians'].set_edgecolor('r')
v1['cquantiles'].set_edgecolor('w')
v1['cmeans'].set_edgecolor('y')

plt.show()

 

 

바이올린플롯 예제
# 붓꽃 데이터
import seaborn as sns
iris = sns.load_dataset('iris')

# 기본 그리기 / 평균값, 중간값 표시 / 분위수 표시
v2 = plt.violinplot([iris['sepal_length'], iris['sepal_width'], iris['petal_length'], iris['petal_width']]
              , showmeans=True, showmedians=True
              , quantiles=[[0.25,0.75],[0.25,0.75],[0.25,0.75],[0.25,0.75]])

# X틱
plt.xticks(range(1,5,1), labels=['sepal_length','sepal_width','petal_length','petal_width'])

# 스타일 지정
v2['bodies'][0].set_facecolor('r')
v2['bodies'][1].set_facecolor('g')
v2['bodies'][2].set_facecolor('b')
v2['bodies'][3].set_facecolor('c')

v2['cmins'].set_edgecolor('r')
v2['cmaxes'].set_edgecolor('r')
v2['cmeans'].set_edgecolor('r')

plt.grid(axis='y', ls=':', alpha=0.5)
plt.show()


[77차시] 데이터의 비율을 표현하는 파이차트

➡️ 파이차트를 이용하여 데이터의 상대적 비율을 표현할 수 있다.

 

파이차트
  • 전체에 대한 각 부분의 비율을 부채꼴 모양으로 나타낸 그래프이다.
  • 각 부채꼴의 중심각이 전체에서 해당 데이터가 차지하는 비율을 나타낸다.
  • 1차원 리스트/배열/시리즈를 이용하여 그린다.

  • plt.pie(data)

  • 레이블 달기
    • labels = label목록
    • labeldistance: 그래프로부터 레이블을 얼만큼 떨어뜨려서 표시할것인가
      (default:1.1)

  • 비율 표시하기
    • autopct = '%.f(소수점자리수)%%'
    • pctdistance:  중심에서의 거리
      → 반지름을 1이라고 했을 때 반지름으로부터 얼만큼 떨어져서 비율을 표시할 것인지 (default:0.6)

  • 돌출효과
    • explode=돌출정도리스트
    • 반지름의 길이를 1이라고 했을 때를 기준으로 하여 돌출 정도를 지정

  • 색상 바꾸기
    • colors = 색상리스트

  • 시작각도
    • startangle = 시작각도
    • 기본시작각도는 3시방향
    • 시작각도를 지정하면 3시방향으로부터 반시계방향으로 각도만큼 이동하여 시작

  • 회전방향: counterclock = True/False (반시계/시계)
  • 범례: legend(레이블리스트)
  • radius = 반지름(Default:1)
  • 부채꼴 스타일: wedgeprops = {'ec':테두리컬러, 'lw':선두께, 'ls':선스타일, 'width':반지름에 대한 비율}
  • 폰트: textprops = {'fontsize':폰트사이즈, 'color':폰트컬러, 'rotation':폰트회전각도}

 

파이차트 예제
plt.figure(figsize=(5,5), facecolor='ivory', edgecolor='gray', linewidth=2)
plt.pie(Personnel, labels=blood_type, labeldistance = 1.2, autopct ='%.1f%%', pctdistance=0.6
       , explode=[0.1,0,0,0]
       , colors =['lightcoral', 'gold', 'greenyellow', 'skyblue']
       , startangle=90
       , counterclock = False
       , radius=1
       , wedgeprops = {'ec':'k', 'lw':1,'ls':':' ,'width':0.7}
       , textprops = {'fontsize':12, 'color':'b', 'rotation':0})

plt.title('2019년 병역판정검사 - 혈액형 분포', size=15)
plt.show()

 

2019년 병역판정검사 결과 A, B, O, AB 순으로 혈액형이 많은 것을 알 수 있다.


[78차시] 공통 스타일 지정하기

➡️ Matplotlib의 rcParams를 사용해서 그래프의 공통 스타일을 변경 할 수 있다.

 

rcParams(runtime contiguration Parameters)
  • 그래프를 구성하는 공통 속성을 지정한다.
  • rcParams의 종류: plt.rcParams
# 그래프에 한글폰트 설정
plt.rcParams['font.family']='Malgun Gothic'

# 그래프에 마이너스 기호 깨지는 문제 해결
plt.rcParams['axes.unicode_minus'] = False

 

rcParams 사용하기
## figure
# figure 크기
plt.rcParams['figure.figsize']=(9,4)

## axes
# 그래프 테두리 두께
plt.rcParams['axes.linewidth'] = 2
# 그래프 테두리 색
plt.rcParams['axes.edgecolor'] = 'navy'
# 그래프 바탕 색
plt.rcParams['axes.facecolor'] = 'ghostwhite'
# 그리드 표시
plt.rcParams['axes.grid'] = True

# 그래프 제목
plt.rcParams['axes.titlecolor'] = 'navy'
plt.rcParams['axes.titlesize'] = 15
plt.rcParams['axes.titleweight']='bold'

# 레이블
plt.rcParams['axes.labelcolor'] = 'gray'
plt.rcParams['axes.labelsize'] = 12

## 그리드
plt.rcParams['grid.alpha'] = 0.3
plt.rcParams['grid.color'] = 'skyblue'
plt.rcParams['grid.linestyle'] ='--'

## 폰트
plt.rcParams['font.size']=12

## 눈금
plt.rcParams['xtick.top'] = True
plt.rcParams['ytick.right'] = True
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
plt.rcParams['xtick.major.size'] = 10
plt.rcParams['ytick.major.size'] = 10

## 선
plt.rcParams['lines.linewidth']=3
plt.rcParams['lines.linestyle']='--'
plt.rcParams['lines.marker'] ='o'

## 패턴
plt.rcParams['hatch.linewidth']=3
plt.rcParams['hatch.color'] = 'w'

## 박스
# 박스
plt.rcParams['boxplot.boxprops.color'] = 'b'
plt.rcParams['boxplot.boxprops.linewidth'] = 2

# 최대값, 최소값
plt.rcParams['boxplot.capprops.color'] = 'r'
plt.rcParams['boxplot.capprops.linewidth'] = 2

# 평균
plt.rcParams['boxplot.showmeans'] = True

 

그래프
## 선그래프
df1 = pd.DataFrame({'요일':['월','화','수','목','금','토','일'], 
                   '매출액':[10000,9000,11000,8000,13000,15000,14000]})
                   
plt.plot(df1['요일'],df1['매출액'])
plt.title('요일별 매출액')
plt.xlabel('요일')
plt.ylabel('매출액(만원)')
plt.show()


## 막대그래프
plt.bar(df1['요일'],df1['매출액'], hatch='/')
plt.title('요일별 매출액')
plt.xlabel('요일')
plt.ylabel('매출액(만원)')
plt.show()


## 박스플롯
scores = pd.Series([0,10,15,15,15,16,19,20,21,25,25,26,26,29,30,35,36,37,39,40,41,41,44,45,45,45,45,47,
          50,50,50,50,51,51,51,53,54,55,55,56,60,61,62,62,63,64,65,65,65,65,66,66,66,66,66,
          67,68,68,69,70,70,70,70,70,70,70,70,71,71,71,71,71,72,72,72,72,73,74,74,74,75,75,
          76,76,76,77,77,77,77,78,78,78,78,78,79,79,79,79,80,80,80,80,80,80,81,81,81,82,82,
          85,85,85,88,88,89,90,90,90,93,93,95,95,95,97,100])
          
plt.boxplot(scores)
plt.title('성적 분포')
plt.ylabel('점수')
plt.show()

 

지정한 rcParmas가 잘 적용된 것을 확인할 수 있다.


[79차시] 그래프 강조하기

➡️ 그래프의 영역을 색으로 채워 그래프의 특정 부분을 강조할 수 있다.

 

그래프 영역 채우기
  • 가로방향으로 채우기
    • plt.fill_between(x슬라이싱, y슬라이싱)
    • 슬라이싱 범위가 같아야 한다.
  • 세로방향으로 채우기
    • plt.fill_betweenx(y슬라이싱, x슬라이싱)
    • 슬라이싱 범위가 같아야 한다.
  • 두 그래프 사이의 영역 채우기
    • plt.fill_between(x슬라이싱, y1슬라이싱, y2슬라이싱)
  • 다각형 채우기
    • plt.fill([x축의 좌표들], [y축의 좌표들])


✍️ 파트너간 상보적 학습 및 강의 내용 리뷰

 

오늘은 시각화를 위주로 학습을 해서 다들 어려운 부분은 없다고 하셨다. 대신 각자 TIL을 작성하는 방법을 공유했다. 내가 어제 작성한 방법인 분석결과에 대한 해석을 적는 것에 대해 이야기하니 모두 긍정적인 반응을 해주셨다😊 데이터 분석가로 일하시는 분들은 분석 결과에 대한 인사이트를 어떻게 찾으시는지 오늘 슬랙에 질문하면 분석을 할 때 많은 도움이 될 것 같다! (ex. 대형마트보다 재래시장의 달걀이 더 비싼 이유) 이에 대한 이유로 대형마트에서 대량으로 달걀을 저렴하게 사오기 때문에 소비자에게도 저렴한 가격에 유통이 되는거라는 것이라는 글을 보긴 했는데, 또 일부 품목은 재래시장이 더 저렴하기도 해서 정확한 원인을 알고 싶었다.

 

파이썬을 이용한 시각화를 하는 경우에는 A라는 기능이 있는지 몰라서 못쓰는 경우도 많은 것 같다. 오늘 강의 내용을 활용하면 파이썬으로 더 보기 좋고 이해하기 쉬운 그래프를 만들 수 있을 것 같다. 


* 유데미 큐레이션 바로가기 : https://bit.ly/3HRWeVL

* STARTERS 취업 부트캠프 공식 블로그 : https://blog.naver.com/udemy-wjtb

📌 본 후기는 유데미-웅진씽크빅 취업 부트캠프 4기 데이터분석/시각화 학습 일지 리뷰로 작성되었습니다.

728x90
Comments