ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2주 1일차 TIL 정리
    웅진 STARTERS 부트캠프 2023. 2. 13. 18:41

    2주  1일차에는 기타 시각화 그래프의 종류를 마저 알아보고, 실제 데이터를 활용해 실습을 진행하였다.

     

    박스플롯 (상자수염그림)

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

    • 다른 값들과 동떨어진 값을 이상치로 표현한다.
      어떤 값이 (1/4 지점의 값 - 1.5 * 사분위수 범위) 보다 작거나,
      어떤 값이 (3/4 지점의 값 + 1.5 * 사분위수 범위) 보다 크면 그 값을 이상치로 정한다.
    • 사분위수 범위 = 3/4 지점의 값 - 1/4 지점의 값

     

    - 박스플롯에 필요한 값과 이상치 구하기

    • 1/4 지점의 값 : 시리즈.quantile(.25)
    • 3/4 지점의 값 : 시리즈.quantile(.75)
    • 이상치
      1/4 지점의 값 - 1.5 * 사분위수 범위
      3/4 지점의 값 + 1.5 * 사분위수 범위
    # 샘플데이터
    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])
    
    
    Q1 = scores.quantile(.25)
    print('1/4 지점의 값 : ',Q1)
    
    Q3 = scores.quantile(.75)
    print('3/4 지점의 값 : ',Q3)
    
    # 이상치
    print('이상치:',Q1 - 1.5*(Q3-Q1),'미만')
    
    # 3/4 지점의 값 + 1.5 * 사분위수 범위
    print('이상치:',Q3 + 1.5*(Q3-Q1),'이상')

    - 박스플롯: plt.boxplot(data)

    plt.boxplot(scores)
    plt.show()

    - 평균값, 중앙값 표시하기

    • showmeans=True
    • meanline=True
    plt.boxplot(scores, showmeans = True, meanline = True)
    
    plt.show()

    * meanline=True를 체크하지 않으면 중앙값이 세모(▲로 표시된다.)

    - 수평 박스플롯

    • vert=False
    plt.boxplot(scores, showmeans = True, meanline = True, vert = False)
    
    plt.show()

    - 여러 개의 데이터 비교하기

    # 샘플데이터
    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, meanline=True)
    plt.grid(axis='y')
    plt.show()

    * 동그라미로 표시된 부분이 이상치 데이터

    ※ 바이올린플롯

    • plt.violinplot(data)

    최댓값, 최소값, 평균값, 중간 표시

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

    - 분위수 지정하기

    • quantiles=0~1사이의 실수리스트
    # 샘플데이터
    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.violinplot(scores, showmeans=True, showmedians=True)
    plt.show()

    - 스타일 지정하기

    • 바이올린플롯 객체를 받아서 스타일을 지정한다.
    • 플롯['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, showmeans=True, showmedians=True,quantiles=[0.25,0.75])
    
    v1['bodies'][0].set_facecolor('r')
    v1['cmins'].set_edgecolor('r')
    v1['cmaxes'].set_edgecolor('r')
    v1['cbars'].set_edgecolor('k')
    v1['cmedians'].set_edgecolor('g')
    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]])
    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('m')
    
    v2['cmins'].set_edgecolor('r')
    v2['cmaxes'].set_edgecolor('r')
    v2['cmedians'].set_edgecolor('r')
    
    plt.grid(axis='y',ls=':',alpha=0.5)
    
    plt.show()

     

    파이차트

    - 기본 그리기

    • plt.pie(data)

    레이블 달기

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

    비율 표시하기

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

    - 돌출효과

    • explode=돌출정도리스트
    • 반지름의 길이를 1이라고 했을 때를 기준으로 하여 돌출 정도를 지정
    # 샘플데이터: 2019년 병역판정검사 - 혈액형 분포
    blood_type = ['A','B','O','AB']
    Personnel = [111901,87066,86804,36495]
    
    # 기본 그리기
    plt.pie(Personnel
            ,labels=blood_type        # blood_type으로 저장돼있는 것 레이블로 사용
            ,labeldistance=1.05       # 그래프로부터 레이블 얼마나 떨어져있는지
            ,autopct='%.1f%%'         # 퍼센트 소수점 몇자리까지 표시
            ,pctdistance=0.5          # 반지름에서 얼마나 떨어져서 비율 표시할 것인지
            ,explode=[0,0,0,0.07])
    plt.show()

    색상 바꾸기

    • colors = 색상리스트
      ['lightcoral', 'gold', 'greenyellow', 'skyblue']

    - 각도 바꾸기

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

    회전방향

    • counterclock=True/False (반시계/시계)
    • default = True
    # 기본 그리기
    plt.pie(Personnel
            ,labels=blood_type
            ,labeldistance=1.05
            ,autopct='%.1f%%'
            ,pctdistance=0.5
            ,colors=['lightcoral', 'gold', 'greenyellow', 'skyblue']     # 각각 색상 결정
            ,startangle=90                        # 시작각도 지정(3시 방향이 기본, 반시계방향)
            ,counterclock=False                   # 회전방향 (시계/반시계) 결정
    plt.legend(loc=(1,0.5))                       # 레이블 부착(loc: 위치 좌표)
    plt.show()

     

    - 범례

    • legend(레이블리스트)

    - 반지름 설정

    • radius=반지름(Default:1)

    - 부채꼴 스타일링

    • wedgeprops = {'ec':테두리컬러, 'lw':선두께, 'ls':선스타일, 'width':반지름에대한비율}

    - 폰트 설정

    • textprops = {'fontsize':폰트사이즈, 'color':폰트컬러, 'rotation':폰트회전각도}
    plt.figure(facecolor='ivory',edgecolor='gray',linewidth=2,figsize=(5,5))
    plt.pie(Personnel
            ,labels=blood_type
            ,labeldistance=1.1
            ,autopct='%.1f%%'
            ,pctdistance=0.5
            ,explode=[0.02,0.02,0.02,0.1]
            ,colors=['lightcoral', 'gold', 'greenyellow', 'skyblue']
            ,startangle=90
            ,counterclock=True
            ,wedgeprops={'ec':'k','lw':'1','ls':'-','width':0.8}  # 부채꼴 스타일링
            ,textprops={'fontsize':10,'color':'#333333'})         # 폰트설정
    plt.title('2019년 병역판정검사 - 혈액형 분포')                  # 타이틀 설정
    plt.show()

    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
    # 폰트 weight
    plt.rcParams['axes.titleweight']='bold'

    - 폰트

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

    - 눈금

    # top/bottom/left/right를 True/False로 지정해 눈금이 표시될 위치 선택
    plt.rcParams['xtick.top'] = True
    plt.rcParams['ytick.right'] = True
    
    # 눈금이 위, 아래, 중간 중 어디에 있는지
    plt.rcParams['xtick.direction'] = 'inout'
    plt.rcParams['ytick.direction'] = 'inout'
    
    # 큰 눈금 사이즈(xticks minor도 있음)
    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()

    그래프 영역 채우기

    - 가로방향으로 채우기

    • plt.fill_between(x슬라이싱, y슬라이싱)
    • 슬라이싱 범위가 같아야 한다.
    x = [1,2,3,4]  
    y = [1,4,3,6]
    plt.plot(x,y)
    plt.fill_between(x[1:3],y[1:3],color='skyblue',alpha=0.6,hatch='//')
    
    plt.show()

    세로방향으로 채우기

    • plt.fill_betweenx(y슬라이싱, x슬라이싱)
    • 슬라이싱 범위가 같아야 한다.
    x = [1,2,3,4]
    y = [1,4,3,6]
    plt.plot(x,y)
    
    plt.fill_betweenx(y[:2],x[:2],color='skyblue',alpha=0.3,hatch='//')
    
    plt.show()

    두 그래프 사이 영역을 채우기

    x = [1,2,3,4]
    y1 = [1,3,4,6]
    y2 = [2,4,7,9]
    
    plt.plot(x,y1)
    plt.plot(x,y2)
    
    plt.fill_between(x[1:3],y1[1:3],y2[1:3],color='darkorange',alpha=0.4,hatch='x')
    
    plt.show()

    - 다각형 채우기: 그리기라고 생각해도 무방할 듯

    • plt.fill([x축의 좌표들],[y축의 좌표들])
    x = [1,2,3,4]
    y = [1,4,3,6]
    plt.plot(x,y)
    plt.grid()
    
    plt.fill([2.0,1.75,2.5,2.25,2],[2,2.5,3,1.5,2],alpha=0.2)
    
    plt.show()

    ※ 수평선, 수직선 그리기

    - 수평선 그리기

    • plt.axhline(y좌표, x축시작위치, x축끝위치)
      수평선의 길이가 1이라고 했을 때 x축시작위치, x축끝위치를 지정한다.
      따로 지정하지 않으면 x축 전범위에 걸쳐 그려진디ㅏ.
    • plt.hlines(y, x축시작좌표, x축끝좌표)
    plt.plot([1,2,3,4], 'ko')
    
    plt.axhline(1,0.1,0.9, color='g')  # x좌표와 상관없이 0~1 사이
    
    plt.axhline(2,0,1,color='b',alpha=0.5,ls=':')
    
    plt.hlines(3,0.0,3,color='darkorange',ls='--')
    
    plt.show()

    수직선 그리기

    • axvline(x좌표, y축시작위치, y축끝위치)
      수직선의 길이가 1이라고 했을 때 y축시작위치, y축끝위치를 지정한다.
      따로 지정하지 않으면 y축 전범위에 걸쳐 그려진디ㅏ.
    • vlines(x, y축시작좌표, y축끝좌표)
    plt.plot([1,2,3,4], 'ko')
    
    plt.axvline(1,0,.5,ls='--',color='r')
    
    plt.vlines(2,1.0,3.0,ls=':',color='g')
    
    plt.show()

    ※ 그래프에 설명 적기

    - 텍스트 추가하기

    • plt.text(x좌표, y좌표, 텍스트)
    • rotation=회전각도
    • ha : horizontal alignment
    • va : vertical alignment
    • 텍스트 상자
      bbox = {'boxstyle':상자스타일, 'fc':facecolor,'ec':edgecolor,...}
      boxstyle : 'round'/'square'
    plt.plot([1,2,3,4], 'ko')
    
    plt.text(2.1,2.7,'x=2, y=3'
            ,ha='left'
            ,va='bottom'
            ,fontsize=11
            ,rotation=-3
            ,bbox={'boxstyle':'round','fc':'skyblue','ec':'b','alpha':0.3})
    
    plt.axhline(3,ls=':',alpha=0.5,lw=0.5)
    plt.axvline(2,ls=':',alpha=0.5,lw=0.5)
    
    plt.plot(2,3,'ro')
    
    plt.show()

    화살표와 텍스트 추가하기

    • plt.annotate('텍스트',xy=(화살표x,화살표y))
    • xytext=(텍스트x,텍스트y)
    • arrowprops=화살표속성(딕셔너리))

    • 화살표 속성
      width: 화살표의 너비
      headwidth: 화살표 머리 밑부분의 너비
      headlength: 화살표 머리의 길이
      shrink: 양쪽 끝에서 축소할 전체 길이의 비율
    plt.plot([1,2,3,4], 'ko')
    
    plt.axhline(2,color='orange',lw=0.5,alpha=0.5,ls='--')
    
    plt.axvline(1,color='orange',lw=0.5,alpha=0.5,ls='--')
    
    plt.plot(1,2,'ro')
    
    plt.annotate('(x:1,y:2)'
                 ,xy=(1,2)
                 ,xytext=(1.2,2.3)
                 ,arrowprops={'width':1,'headwidth':10
                             ,'headlength':10,'shrink':0.1
                             ,'facecolor':'g'}
                 ,fontsize=12
                 ,color='r')
    plt.show()

    2중 y축 표시하기

    두 가지 정보를 하나의 그래프에 그림

    • 축을 분리하기 위해 객체지향으로 그린다.
    • fig, ax = plt.subplots()
    # 샘플데이터
    age = [13,14,15,16,17]
    height = [160,165,170,173,177]
    weight = [80,85,83,78,73]
    
    # 축 분리 ( 객체지향으로 그림 )
    fig,ax = plt.subplots()
    
    ax.bar(age,height,color='skyblue',width=0.5,ec='lightgray',label='height')
    ax.plot(age,weight,color='darkred',marker='o',ls='-.',label='weight')
    plt.legend()
    
    plt.show()

    2중 y축 만들기

    • x축을 공유하는 새로운 axes객체를 만든다.
      axes객체.twinx()
    fig,ax1 = plt.subplots()
    ax1.bar(age,height,color='skyblue',width=0.5,ec='lightgray',label='height')
    
    ax2 = ax1.twinx()
    ax2.plot(age,weight,color='darkred',marker='o',ls='-.',label='weight')
    
    plt.show()

    - 축 레이블 표시

    •  axes객체.set_xlabel(x레이블)
    •  axes객체.set_ylabel(y레이블)

    - y축 레이블 지정

    • axes객체.set_ylim(y축눈금범위)

    - y축 눈금 지정

    • axes객체.set_yticks(y축눈금)
    • axes객체.tick_params(...)

    - 범례 표시

    • axes객체별로 legend메소드 호출

    - 그리드 표시

    • axes객체.grid()
    fig,ax1 = plt.subplots()
    ax1.bar(age,height,color='skyblue',width=0.5,ec='lightgray',label='height')
    
    ax2 = ax1.twinx()
    ax2.plot(age,weight,color='darkred',marker='o',ls='-.',label='weight')
    
    # 축 레이블 표시하기
    ax1.set_xlabel('나이')
    ax1.set_ylabel('키(cm)')
    ax2.set_ylabel('몸무게(kg)')
    
    # y축 범위 지정하기
    ax1.set_ylim(150,180)
    ax2.set_ylim(60,90)
    
    # y축 눈금 설정하기
    ax1.set_yticks(height)
    ax2.set_yticks(weight)
    ax1.tick_params(axis='y',colors='skyblue')
    ax2.tick_params(axis='y',colors='darkred')
    
    # 범례 표시
    ax1.legend()
    ax2.legend()
    
    # 그리드 표시
    ax1.grid(axis='y',ls='--',color='skyblue')
    ax2.grid(axis='y',ls=':',color='pink')
    
    plt.show()

     

    matplotlib으로 그린 그래프와 seaborn으로 그린 그래프 코드 비교

     

    - 요일별 팁 비교

     

    * matplotlib

    # 데이터 가공 (day로 그룹핑해 tip의 평균 구한 dataframe 만들기)
    day_tip_mean = tips.groupby('day')['tip'].mean()
    
    # 그래프 그리기
    plt.bar(day_tip_mean.index,day_tip_mean)
    plt.xlabel('day')
    plt.ylabel('tip')
    plt.title('요일별 팁 평균',size=15)
    plt.show()

    * seaborn

     → sns.barplot(data=데이터프레임명, x=x축컬럼, y=y축컬럼)

     → 신뢰구간(CI)를 항상 기본 표시

    # sns.barplot(data=데이터프레임명, x=x축컬럼, y=y축컬럼)
    
    sns.barplot(data=tips,x='day',y='tip',ci = None)
    plt.title('요일별 팁 평균',size=15)
    
    plt.show()

    (추가) seaborn -  요일별 팀 합계(흡연자 비흡연자 구분)

    sns.barplot(data=tips,x='day',y='tip',ci=None,estimator=sum,hue='smoker'
                ,palette={'Yes':'gray','No':'skyblue'})
    plt.title('요일별 팁 합계',size=15)
    plt.grid(axis='y',ls=':')
    plt.show()

    주문금액과 팁의 관계성

    * matplotlib

    # 요일에 따라 다른 색상 표시를 위해 요일별 서브셋 만들기
    tips_sun = tips[tips['day']=='Sun']
    tips_sat = tips[tips['day']=='Sat']
    tips_thur = tips[tips['day']=='Thur']
    tips_fri = tips[tips['day']=='Fri']
    
    # 시각화
    plt.scatter(tips_sun['total_bill'],tips_sun['tip'], label='Sun', s=tips_sun['size']*30,alpha=0.5)
    plt.scatter(tips_sat['total_bill'],tips_sat['tip'], label='Sat', s=tips_sat['size']*30,alpha=0.5)
    plt.scatter(tips_thur['total_bill'],tips_thur['tip'],label='Thur', s=tips_thur['size']*30,alpha=0.5)
    plt.scatter(tips_fri['total_bill'],tips_fri['tip'],label='Fri', s=tips_fri['size']*30,alpha=0.5)
    plt.legend()
    
    plt.xlabel('total_bill')
    plt.ylabel('tip')
    
    plt.show()

    * seaborn

    sns.scatterplot(data=tips,x='total_bill',y='tip',hue='day',size='size',alpha=0.5)
    plt.show()

    - 연도별 월별 승객수 변화

    * matplotlib

    # 연도별 월별 피봇테이블 생성
    flights_pivot = flights.pivot(index='year',columns='month',values='passengers')
    
    # 시각화
    for i in range(12):
        plt.plot(flights_pivot.iloc[i],label=flights_pivot.index[i])
    plt.legend()
    plt.show()

     

    * seaborn

    sns.lineplot(data=flights,x='month',y='passengers',ci=None,hue='year')
    plt.show()

     

    seaborn을 활용한 여러 가지 그래프

     

    - 샘플데이터 1

    titanic = sns.load_dataset('titanic')
    titanic.head()

    - 카운트플롯

    • 데이터의 갯수를 카운트하여 시각화
    • sns.countplot(data=데이터프레임, x=컬럼)

        * 연령별 승선인원 카운트해 시각화

    plt.figure(figsize=(15,4))
    sns.countplot(data=titanic,x='age')
    plt.xticks(rotation=90)
    plt.grid(axis='y')
    plt.show()

    - 러그플롯

    • sns.rugplot(data=데이터프레임, x=컬럼)

        * 연령대별 생존 및 사망자

    sns.rugplot(data=titanic,x='age',hue='alive')
    plt.show()

    - 샘플데이터 2

    iris = sns.load_dataset('iris')

     

    히스토그램

    • sns.displot(data=데이터프레임, x=컬럼)
    sns.displot(data=iris,x='petal_length',bins=20,rug=True,hue='species',kde=True)
    plt.show()

    (막대 없이 곡선만 나타내고 싶을 때)

    sns.displot(data=iris,x='petal_length',rug=True,hue='species',kind='kde')
    plt.show()

    상자수염그래프, 파이올린플롯, 스트립플롯, 스웜플롯

    • sns.boxplot(data=데이터프레임)
    • sns.violinplot(data=데이터프레임)
    • sns.stripplot(data=데이터프레임)
    • sns.swarmplot(data=데이터프레임)
    # 컬럼별 비교
    
    plt.figure(figsize=(12,8))
    
    # 박스플롯(왼쪽위)
    plt.subplot(221)
    sns.boxplot(data=iris)
    
    # 바이올린플롯(오른쪽 위)
    plt.subplot(222)
    sns.violinplot(data=iris)
    
    # 스트립플롯(왼쪽 아래)
    plt.subplot(223)
    sns.stripplot(data=iris)
    
    # 스웜플롯(오른쪽 아래)
    plt.subplot(224)
    sns.swarmplot(data=iris,s=2)
    
    plt.show()

    # 품종별 비교
    plt.figure(figsize=(12,8))
    
    # 박스플롯
    plt.subplot(221)
    sns.boxplot(data=iris,x='species',y='petal_length')
    
    # 바이올린플롯
    plt.subplot(222)
    sns.violinplot(data=iris,x='species',y='petal_length')
    
    # 스트립플롯
    plt.subplot(223)
    sns.stripplot(data=iris,x='species',y='petal_length')
    
    # 스웜플롯
    plt.subplot(224)
    sns.swarmplot(data=iris,x='species',y='petal_length',s=2)
    
    plt.show()

     

     그룹 토의 결과

    matplotlib과 seaborn의 차이에 대해 이야기를 나누었다. 토의를 통해 도출한 결론은 seaborn을 이용하기 위한 기반지식은 matplotlib을 통해 쌓을 수 있다는 것이다. seaborn에서는 손쉽게 시각화를 할 수 있는 만큼 자유도가 떨어지고, matplotlib에서는 하나하나 설정해야 하는 만큼 변형이 쉽고 자유도가 높다. 

    더불어, seaborn에서 그래프를 그릴 때 임의로 설정된 컬러나 팔레트가 아닌 직접 설정하여 색을 변경하는 방식을 토의하고 결론이 나지 않아 각자 구글링하며 찾아보았는데, list에 색상코드를 넣어 하나의 팔레트로 사용할 수 있다는 내용을 찾았다. 하지만, matplotlib으로 하는 것보다 상당히 까다로운 방식이었다.

    댓글

Designed by Tistory.