본문 바로가기
Python/Pandas, Matplotlib, Seaborn

[Visualization]_데이터 변환-그래프로 확인하기

by ssolLEE 2023. 8. 30.
반응형
  • 데이터 분석에 앞서, 우리는 여러 경로로 수집한 데이터를 변환하는 과정이 필요합니다. 
  • 우리가 수집한 데이터는 말 그래도 raw data이기 때문에 잘 정리되어 있는 상태가 아닙니다. 전처리 과정이 필요하고, 전처리 후에는 해석을 위해 적절한 형태로 변환하여야 합니다. 
  • 우리는 적절하게 데이터를 변환하여 수집한 자료를 누구나 보기 쉽게 해석할 수 있도록 할 수 있습니다. 

 

  • 데이터 변환의 목적은 다음과 같이 제시할 수 있습니다.
    • 데이터의 분포를 대칭적으로 만든다.(정규분포의 모양)
    • 산포를 비슷하게 한다.
    • 변수 간의 관계를 단순화한다.
  • 데이터 변환 유형은 다음과 같습니다. 
    • 제곱근 변환
    • 제곱 변환
    • 로그 변환
    • 지수 변환
  • 그래프로 확인해볼까요?
  • ChatGPT의 도움으로 우선 정규분포 모양의 그래프를 그립니다. 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# 랜덤한 정규분포 데이터 생성
mean = 0  # 평균
std_dev = 1  # 표준 편차
num_samples = 1000  # 샘플 개수
data = np.random.normal(mean, std_dev, num_samples)

# 데이터를 데이터프레임으로 변환
df = pd.DataFrame(data, columns=['values'])

# 히스토그램 그리기
plt.hist(df['values'], bins=20, density=True, alpha=0.3, color='blue', edgecolor='black')
# density=True로 설정하여 정규화된 히스토그램을 그립니다.
plt.title('Histogram of Normal Distribution')
plt.xlabel('Values')
plt.ylabel('Density')
plt.grid(True)
plt.show()

  • 제곱 변환, 지수 변환 - 봉우리를 왼쪽으로 치우치게 합니다. 오른쪽 꼬리가 길어집니다. 
  • 제곱근 변환, 로그 변환 - 봉우리를 오른쪽으로 치우치게 합니다.  왼쪽 꼬리가 길어집니다. 
  • 제곱 변환, 제곱근 변환보다는 지수 변환, 로그 변환의 치우침의 정도가 더 큽니다.  
  • 분포의 왼쪽 꼬리가 길다면 제곱 변환이나 지수 변환을 하여 대칭형이 될 수 있도록 합니다. 
  • 분포의 오른쪽 꼬리가 길다면 로그 변환이나 제곱근 변환을 하여 대칭형이 될 수 있도록 합니다. 

 

  • 한번에 그래프로 확인하겠습니다. 
fig, ax = plt.subplots(nrows = 2, ncols = 2, figsize = (15, 10))

ax[0, 0].hist(df['squared'], bins=20, edgecolor='black')

ax[0, 1].hist(df['sqrt'], bins=20, edgecolor='black')
ax[1, 0].hist(df['log'], bins=20, edgecolor='black')

ax[1, 1].hist(df['exp'], bins=20, edgecolor='black')

ax[0, 0].legend()

ax[0, 0].set_title('Histogram of Squared Values')
ax[0, 1].set_title('Histogram of sqrt Values')
ax[1, 0].set_title('Histogram of log Values')
ax[1, 1].set_title('Histogram of exp Values')

ax[0, 0].set_xlabel('Squared Values')
ax[0, 1].set_xlabel('sqrt Values')
ax[1, 0].set_xlabel('log Values')
ax[1, 1].set_xlabel('exp Values')

ax[0, 0].set_ylabel('Frequency')
ax[0, 1].set_ylabel('Frequency')
ax[1, 0].set_ylabel('Frequency')
ax[1, 1].set_ylabel('Frequency')

plt.show()