관리 메뉴

ilovechoonsik

[STARTERS 4기 TIL] 데이터 시각화 #2 (230213) 본문

STARTERS 4기 🚉/TIL 👶🏻

[STARTERS 4기 TIL] 데이터 시각화 #2 (230213)

춘시기좋아 2023. 2. 13. 14:23

📖 오늘 내가 배운 것

 

데이터 시각화

1. 데이터 시각화란?

 

데이터 분석 결과를 쉽게 이해할 수 있도록 시각적으로 표현하고 전달되는 과정

텍스트 기반의 데이터는 사람의 눈으로 파악하는 데 한계 있다.

 

장점

- 데이터 한눈에 파악

- 데이터 변화, 데이터 사이의 관계 쉽게 확인 가능

- 수치로만 파악하기 힘든 패턴이나 새로운 정보를 발견할 수 있다.

 

2. 스타일 설정 및 강조하기

2.1  그래프 수직/수평 선 그리기

(1) 수평선 그리기

  • plt.axhline(y좌표, x축시작위치, x축끝위치)
    수평선의 길이가 1이라고 했을 때 x축시작위치, x축끝위치를 지정한다.
    따로 지정하지 않으면 x축 전범위에 걸쳐 그려진디ㅏ.
  • plt.hlines(y, x축시작좌표, x축끝좌표)
plt.plot([1,2,3,4], 'ko')

plt.axhline(2,0,1, color='b', alpha=0.5, ls=':')

plt.hlines(3, 0.0, 3.0, color='darkorange', ls='-.')

plt.show()

 

(2) 수직선 그리기

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

 

(3) [예제] 요일별 판매 테이블 수

s = tips['day'].value_counts()
s

plt.figure(figsize=(15,3))
plt.barh(s.index, s.values)
plt.xticks(range(0,91,1), rotation=90)
plt.grid(axis='x')
plt.axvline(s['Fri'], color='k')
plt.axvline(s['Thur'], color='k')
plt.axvline(s['Sun'], color='k')
plt.axvline(s['Sat'], color='k')
plt.show()

 

2.2 그래프에 설명적기

(1) 텍스트 추가하기

  • 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, 3, '(x:2, y:3)', ha='left', va='bottom', fontsize=12, rotation=45
        , 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()

 

(2) 화살표와 텍스트 추가하기

plt.annotate('텍스트',xy=(화살표x,화살표y), xytext=(텍스트x,텍스트y), arrowprops=화살표속성(딕셔너리))
  • 화살표 속성
    width The width of the arrow in points
    headwidth The width of the base of the arrow head in points
    headlength The length of the arrow head in points
    shrink Fraction of total length to shrink from both ends

 

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.5,2.5)
             , arrowprops={'width':3, 'headwidth':10, 'headlength':10, 'shrink':0.1, 'fc':'r'}
             , fontsize=12, color='r')
plt.show()

 

2.3 2중 y축 표시하기

  • 축을 분리하기 위해 객체지향으로 그린다.
  • fig, ax = plt.subplots()

(1) 그리는 법

  • x축을 공유하는 새로운 axes객체를 만든다.
    axes객체.twinx()

 

(2) 그래프 세팅

사용 파라미터
축 레이블 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()

 

(3) 예시

fig, ax1 = plt.subplots()
# 첫 번째 객체 생성 ax1
ax1.bar(age, height, color='skyblue', width=0.5, ec='lightgray', label='height')

# ax1의 x축을 공유하는 새로운 ax2 객체 생성
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)')

ax1.set_ylim(150,180)
ax2.set_ylim(60,90)

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()

 

3. seaborn

seaborn은 matplotlib을 기반으로 만들어진 시각화 라이브러리! matplotlib에서 사용하는 모든 기능들을 사용할 수 있고

시각화 목적을 위해 만들어진 만큼 사용하기 편하고 예쁘다! 

 

matplotlib과 차이?

더보기
  • 요일별 팁 평균 계산에 대한

- matplotlib으로 시각화

# 데이터 가공
day_tip_mean = tips.groupby('day')['tip'].mean()
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축컬럼)
  • x축데이터로 그룹핑한 y축데이터의 평균값을 계산하여 그래프를 그려준다.
  • 신뢰구간(CI:Confidence Interval)을 함께 표시
sns.barplot(data=tips, x='day', y='tip', ci=None)
plt.title('요일별 팁 평균', size=15)
plt.show()

-> 그래프가 예쁘게 그려진다는 점도 좋지만, 그래프에 따라 그리는 사람이 무엇을 원하는지 파라미터로 줄 수 있도록 만들어졌기 때문에 간결하게 그래프를 그릴 수 있다는 점이 큰 장점이라고 생각

-> 사용하기 위해서 전처리 해야 함

-> 둘 다 중요하니 목적에 맞게 사용

 

3.1  barplot

(1) 그리는 법

  • sns.barplot(data=데이터프레임명, x=x축컬럼, y=y축컬럼)
  • x축데이터로 그룹핑한 y축데이터의 평균값을 계산하여 그래프를 그려준다.
  • 신뢰구간(CI:Confidence Interval)을 함께 표시

(2) 파라미터

사용 파라미터
신뢰구간 표시 ci
통계함수 적용 estimator
 y를 그룹핑할 컬럼 hue
palette = 구분:색상 딕셔너리

 

(3) 예시

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()

 

3.2  scatter

(1) 그리는 법

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

# 어떠한 수치에 대해 표현할 때 color 파라미터 이용해서 색을 구분하는 것을 권장한다. -> color_bar

# 근데? 카테고리/구분을 색상별로 나눌 때는 color_bar 사용할 수 없고, 범례 사용도 힘들기 때문에 scatter plot을 여러 번 그리는 게 더 효율적이라고 함

 

(2) 파라미터

사용 파라미터
y를 그룹핑할 컬럼
hue
크기 size
신뢰구간 표시 ci

 

(3) 예시

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

 

3.3  lineplot

(1) 그리는 법

  • sns.lineplot(data=데이터프레임, x=x축컬럼, y=y축컬럼, estimator=통계함수)
    # estimator를 생략하면 평균으로 통계를 적용함
  • 전체 데이터로 차트를 그리면 신뢰구간 표시 (사용 안 할 시 ci=None)

 

(2) 파라미터

사용 파라미터
신뢰구간 표시 ci
통계함수
estimator
생략하면 평균으로 통계를 적용함

 

(3) 예시

월별 승객수 변화 확인하기

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

 

3.4 데이터의 분포를 나타내는 여러 가지 그래프

📌 countplot

(1) 사용법

  • sns.countplot(data=데이터프레임, x=컬럼)
  • 데이터의 갯수를 카운트하여 시각화
  • -> 전달한 컬럼을 그룹핑하여 몇 개가 있는지 통계를 내어 줌 

(2) 예시 (타이타닉 데이터 사용)

# 연령별 승선인원 카운트하여 시각화
plt.figure(figsize=(15,4))
sns.countplot(data=titanic, x='age')
plt.xticks(rotation=90)
plt.grid(axis='y')
plt.show()

 

# 1. 남자/여자/어린이 승선인원 시각화
# 2. 남자/여자/어린이 별 생존여부 

sns.countplot(data=titanic, x='who', hue='alive')

 

 

📌 rugplot

(1) 사용법

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

(2) 예시 (타이타닉 데이터)

 

# 1. 연령대 별 생존 여부

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

 

 

📌 displot

(1) 사용법

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

(2) 예시 (iris)

 

# 1. 연령대 별 생존 여부

sns.displot(data=iris,
		x='petal_length',
		bins=20,
            rug=True, # rugplot도 함께 표현
            hue='species', # species 별 비교 (범례 자동)
		kde=True # 곡선도 표현
            )

 

 

📌 boxplot, violinplot, stripplot, swarmplot

(1) 사용법

  • sns.boxplot(data=데이터프레임) # 최대값, 분위수 등을 확인하기 용이
  • sns.violinplot(data=데이터프레임) # 값이 어느 위치에 분포되어 있는지 확인하기 쉬움
  • sns.stripplot(data=데이터프레임) # 점으로 분포를 표현, 확인하기 쉽지 않음
  • sns.swarmplot(data=데이터프레임) # stripplot을 개선

 

(2) 예시 (iris)

# 품종 별 petal_length를 비교!

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()

 

 

4. 기온 데이터 분석 실습

기상자료개방포털에서 데이터를 수집하여 전처리하고, 시각화

-> 분석 프로세스 익히기 좋은 내용들이 많아 페이지로 따로 정리!

 

 

5. 데이터 분석가로서 중요한 것?

팀원 중 한 분이 "데이터 분석가로서 가장 중요한 것이 무엇일까" 라는 이야기 하셨다! -> 너무 중요한 부분이라 생각 정리

 

짧게 공부해 본 주관적인 생각으로는

1. 소속된 조직의 비즈니스, 사업 아이템을 이해하는 것

2. 이해한 내용을 바탕으로 문제를 파악하고 해결하기 위한 목적/가설을 정의하는 능력

가 아닐까 싶다..!

 

 데이터 분석가가 되기 위해 공부하고 있는, 다들 공부하는 Python, SQL, Tableau 등의 도구를 잘 다루는 것도 굉장히 중요하지만! 결국 데이터 분석가의 목표는 현황을 파악하고 문제를 해결하기 위한 인사이트를 도출하는 것이라 생각한다.

 분석의 결과가 단순히 "우리는 지금 이런 상황입니다!"로 귀결되어 "그래서 뭐 어떻게 해야 하는데?"로 답이 돌아온다면 데이터 분석가의 존재가 크게 의미가 없을 거 같다

 

 하여 데이터 분석가의 목표, 소속된 조직에 도움이 될만한 인사이트는 분석의 결과로써 최종적으로 방향성 제시, 문제 해결 등의 유의미한 액션을 취할 수 있는 형태로 창출되어야 할 것이고,

 그러한 유의미한 결과를 창출하기 위한 근간에는 소속된 곳의 비즈니스, 데이터에  한 이해가 바탕이 되어야 할 거 같다고 생각했다. -> 조직이 돈을 버는 방법과 활용되는 다양한 데이터

 조직의 비지니스, 데이터를 이해하지 못하면 문제를 파악하는 것조차 불가능할 것이라고 생각하기 때문이다.

 

적절한 예시인지 모르겠는데

망해가는 식당을 살려야 합니다! 어디에 의뢰하실 건가요?

셀 수 없이 많은 요식업 데이터 + 데이터 분석가 100명 VS 백종원 선생님

에서 백종원 선생님을 선택하는 이유로 볼 수 있을 거 같다!

백종원 선생님 데이터 분석가
비지니스와 해당 데이터 이해를 바탕으로 솔루션 정의, 제공 목적/가설 정의
솔루션 실행을 위한 아이템 Python, SQL, Tableau
솔루션에 의해 살아나는 식당 유의미한 인사이트

백종원 선생님께서 요식업

비즈니스 및 데이터(경험을 통해 축적)에 대한 이해도를 바탕으로 툭 던져주시는 한마디 = 사실상 1개의 유의미한 인사이트!

필요한 아이템은 필요하면 찾아보고 가져다 쓰면 된다

 

이에 나는 아직 데이터 분석 분야를 공부한 지 얼마 되지 않아 언제 생각이 바뀔지 모르겠지만! 아직까지는 

1. 소속된 조직의 비즈니스, 사업 아이템을 이해하는 것

2. 이해한 내용을 바탕으로 문제를 파악하고 해결하기 위한 목적/가설을 정의하는 능력

이 가장 중요하다고 생각한다

 

 


 

🎖️ 오늘 잘한 점

 

TIL 작성에 큰 힘을 빼지 않은 점!🔥

 

 


 

💪🏻 앞으로 개선해야 할 점 (추가로 배워야 할 점)

 

📌 데이터를 처리하는 데 있어 기초 문법을 활용하여 전처리 또는 시각화하는 스킬이 부족

데이터가 주어졌을 때 목적/가설 정의는 기본이고 기술적인 부분에서 많이 버벅거린다.

다양한 데이터를 최대한 많이 분석하며 이러한 역량을 쌓을 수 있도록 하자!

 

 

 

 

 

Comments