본문 바로가기

TIL/Machine learning

24.05.23 데이터 시각화

Today's study

  • 데이터 시각화 (그래프 그리기)

데이터 시각화 

  • 데이터가 가지고 있는 정보를 시각적으로 표현
  • 데이터 분석의 초기과정에서 유용한 탐색적 데이터분석(exploratory data analysis, EDA) 도구로 사용 
  • 필요한 이유
    • 데이터의 기본적인 상태확인: 통계량, 결측치, 이상치 등 확인
    • 분석을 위한 기준(가정)을 세우는데 도움이 됨
    • 최종 결과를 효과적으로 표현, 전달
  • Pandas를 사용하여 다중 산점도(scatter plots)를 생성하는 방법

  • fig와 ax는 각각 figure와 axes 객체를 의미
  • plt.subplots() 함수를 사용하여 5x5 인치 크기의 그래프를 생성
  • ax.scatter()는 산점도를 그리는 함수
  • datasaurus[datasaurus["dataset"] == "dino"]["x"]
    : 데이터프레임 datasaurus에서 "dataset" 열의 값이 "dino"인 행들의 "x" 값을 선택
  • alpha=0.3
    : 점의 투명도를 설정. 여기서 0.3은 30%의 불투명도를 의미하며, 값이 낮을수록 더 투명해짐
  • Pandas를 이용하여 여러개의 그래프 그리기

  • figure 개수, 위치, 크기 설정하기
    - fig, axes = plt.subplots(3, 4, figsize=(8, 6), sharex=True, sharey=True)
    - fig와 axes는 각각 figure와 여러 개의 subplot을 의미
    - plt.subplots(3, 4)는 3행 4열의 subplot 배열을 생성
    - sharex=True, sharey=True는 모든 subplot이 동일한 x축과 y축 스케일을 공유하도록 설정
  • 그릴 data를 전체 data에서 뽑아오기
    - for dataset, ax in zip(datasaurus["dataset"].unique(), axes.flat):
    - datasaurus["dataset"].unique()는 datasaurus 데이터프레임에서 고유한 데이터셋 이름을 반환
    - axes.flat은 subplot 배열을 1차원으로 펼칩
    - zip 함수는 각 데이터셋과 subplot을 짝지음
  • x, y축을 설정함 
    - ax.scatter(datasaurus[datasaurus["dataset"] == dataset]["x"],
                     datasaurus[datasaurus["dataset"] == dataset]["y"],
                     alpha=0.5):
    - 각 subplot에 대해 dataset 이름과 일치하는 데이터의 x와 y 값을 산점도로 그림
  • 각 그래프의 이름을 정해줌
    - ax.set_title(dataset): 각 subplot의 제목을 데이터셋 이름으로 설정
  • ax.spines[["top", "right"]].set_visible(False): 각 subplot의 위쪽과 오른쪽 테두리를 보이지 않게 설정
  • 제목 넣기
    - fig.suptitle("Datasaurus 각 테이블별 산점도"): 전체 figure의 제목을 "Datasaurus 각 테이블별 산점도"로 설정
  • 축 detail하게 label하기 
    - fig.supxlabel(R"$x$"), fig.supylabel(R"$y$"): 전체 figure의 x축과 y축 라벨을 각각 설정. 여기서 $x$, $y$는 수학 표현식을 나타내기 위해 LaTeX 포맷을 사용

선 그래프(plot)

  • 선(line)과 마커(markers)에 차이를 줄 수 있음
  • 선그래프 그려보기

  •  그리고자하는 그래프 식을 입력
  • fig, ax = plt.subplots() 를 입력하여 그래프를 그릴 공간 그려주기
  • 각각의 선 그래프에 대한 설명 넣어주기 
    - ax.plot( ) *3개 = 3개 그래프
    -  ax.plot(t, y_blue, marker="o", ls="-", c="tab:blue", label ="파란 공")
       --> t와 y_blue에 대해 선 그래프를 그림
       --> marker="o": 원 형태의 마커를 사용
       --> ls="-": 실선 스타일을 사용
       --> c="tab:blue": 파란색으로 그래프를 그림
       --> label="파란 공": 그래프에 대한 범례를 설정
  • x, y축 및 제목 설정하기 
    -  ax.set_xlabel("시간 (second)"): x축의 라벨을 "시간(second)"로 설정
    - ax.set_ylabel("위치 (cm)"): y축 라벨 설정
    - ax.set_title("공의 위치"): 제목 설정
  • 하트 방정식 만들어보기

  • ax.plot 후 헌번에 x, y를 설명해 줄 수도 있음
  • ax.set( ) 도 마찬가지

Scatter 그래프 그리기 (color/ marker size)

  • Matplotlib 라이브러리를 이용하여 마커 크기로 차이를 둔 scatter 그래프 그리기
    (data by Kaggle)

 

  • marker size factor 설정하기
    - marker_size_factor = (plt.rcParams["lines.markersize"] ** 2 / iris[feature_additional].mean()):
    -->  matplotlib의 기본 마커 크기 설정값을 가져옴
    --> 마커 크기는 일반적으로 마커의 면적(즉, 크기)이므로, 크기를 제곱하여 면적으로 변환
    --> iris 데이터셋의 feature_additional 열의 평균값을 구하여 마커의 크기를 상대적으로 조정하기 위한 기준값 구하기
  • 데이터의 feature_x 열과 feature_y 열의 값들을 사용하여 산점도를 그리기
    - ax.scatter(iris[feature_x], iris[feature_y], s = marker_size_factor * iris[feature_additional], alpha=0.7):
    --> s = marker_size_factor * iris[feature_additional]는 feature_additional 열의 값을 기반으로 마커 크기를 조절
  • x, y축 및 제목 그리기 
    • Color로 차이를 둔 scatter 그래프 그리기

  •  그래프를 그릴 공간 만들기
  • x, y축 좌표데이터 그리기
  • cmap="virdis"는 색상 맵(color map)으로 "viridis"를 사용하여 데이터를 색상으로 표현 

막대 그래프 그리기 (bar, barh)

  • bc = ax.bar(film_title, admissions):
    - 막대 그래프 그리는 함수
  • ax.yaxis.set_tick_params(length=0):
    - y축 눈금의 길이를 0으로 설정하여 눈금 선을 숨김
  • ax.yaxis.set_major_formatter(admission_formatter):
    - y축 눈금의 표시 형식을 admission_formatter 함수로 설정
  • plt.setp(ax.get_xticklabels(), ha="right", rotation=45):
    - x축 라벨(영화 제목)을 오른쪽 정렬하고 45도 회전시킴
  • ax.spines[["top", "right", "left"]].set_visible(False):
    - 상단, 오른쪽, 왼쪽 테두리를 숨김

색상선택

 

  • x = np.linspace(0, 5, 100): 0에서 5까지 100개의 균일한 값을 가진 배열 x를 생성
  • X, Y = np.meshgrid(x, y): x와 y를 사용하여 2차원 그리드 배열 X와 Y를 생성
  • Z = np.sin(X) ** 5 + np.cos(X) * np.cos(Y): X와 Y 값을 사용하여 Z 배열을 생성. 이 배열은 함수 np.sin(X) ** 5 + np.cos(X) * np.cos(Y)의 값을 가짐
  • fig = plt.figure(): 새로운 Figure 객체 fig를 생성
  • subfigs = fig.subfigures(2, 2): 2x2 배열의 SubFigure 객체를 생성하여 subfigs에 저장
  • for cmap, subfig in zip(["viridis", "turbo", "jet", "hsv"], subfigs.flat): 색상 맵(cmap) 리스트와 SubFigure 객체 리스트를 동시에 순회
  • ax = subfig.subplots(): 각 SubFigure 내에 서브플롯을 생성하여 ax에 저장
  • image = ax.imshow(Z, extent=[x[0], x[-1], y[0], y[-1]], origin="lower", cmap=cmap): Z 배열을 이미지로 표시합니다. 이미지는 x와 y의 범위를 사용하고, 좌하단에서 시작하며, cmap 색상 맵을 사용
  • subfig.colorbar(image, ax=ax): 각 서브플롯에 색상 막대를 추가
  • ax.set(xlabel="x", ylabel="y", title=cmap): x축 라벨을 "x", y축 라벨을 "y", 제목을 해당 색상 맵 이름으로 설정

Heatmap 그리기

  • Seaborn 라이브러리를 사용
  • sns.heatmap(iris[iris.columns[:-1]].corr(), annot=True, cmap='cubehelix_r'):
    - sns.heatmap 함수는 히트맵을 그리는 함수
    - iris[iris.columns[:-1]].corr()는 Iris 데이터셋에서 마지막 열을 제외한 모든 열의 상관 행렬을 계산
    - iris.columns[:-1]는 마지막 열을 제외한 모든 열을 선택
    - .corr()는 상관 행렬을 계산
    - annot=True는 각 셀에 상관 계수를 표시
    - cmap='cubehelix_r'는 히트맵의 색상 맵을 'cubehelix'의 반전된 버전으로 설정