EDA & 데이터 분석/데이터분석

데이터 전처리 & 시각화 4주차(시각화)

edcrfv458 2025. 1. 3. 13:37

사례

  • 바다오염의 주범은 바다쓰레기
  • 바다쓰레기 줄이기 위해 빨대 사용금지가 얼마나 효과있을까
  • 실제 데이터 살펴보면 전세계 바다 쓰레기의 0.03%가 플라스틱 빨대로 인한 것이며, 가장 많이 문제가 되고 있는 것은 46%를 차지하고 있는 어망
  • 실제 바다 쓰레기의 약 50%가 어업활동으로 인해 발생했다는 사실을 바탕으로 어떤 의사결정이 가능할까
  • 효율/효과 측면에서 우리는 어업활동에서 발생하는 바다쓰레기를 줄이는 방안을 모색해야 한다고 분석 결과 전달 가능
  • 어쩌면, 종이빨대를 만드는 예산을 어업활동에서 쓰레기가 발생하지 않도록 개선시키는 것에 활용하는 것도 제안 가능
  • 즉, 어디에 집중을 하고 어떤 전략을 수립해야할지 방향을 제시하는 역할을 데이터를 통해 전달하는 것이 데이터 분석의 역할이며, 분석된 결과에 따라 다양한 의사결정이 이루어질 수 있다는 사실

 

데이터 시각화 목적

  • 데이터 시각화는 의사결정을 잘할 수 있게 도와준다
    • 그것의 효과와 영향이 크다는 것을 인식시키고 설득시킬때 매우 중요한 요소, 전체 바다쓰레기의 0.03%와 46%의 비중과 투입되는 예산대비 얻게될 기대효과에 대해 시각화된 자료와 함께 분석결과를 전달할수 있다면, 큰설득력을 갖추게 될 것이다.

 

matplotlib

  • 시각화를 위한 라이브러리
  • 다양한 종류의 그래프를 생성

 

예제

import matplotlib.pyplot as plt

x = [1,2,3,4,5]
y = [2,4,6,8,10]

plt.plot(x,y)
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title('Example')
plt.show()

 

그래프 그리기 위한 도구 ➡️ plot()

import pandas as pd

df = pd.DataFrame({
	'A': [1,2,3,4,5],
    'B': [5,4,3,2,1]
})

df.plot(x='A', y='B')
plt.show()

 

스타일 설정

  • 색깔
  • 선의 스타일
  • 마커 표현
df.plot(x='A', y='B', color='green', linestyle='--', marker='o')

 

범례 추가

df.plot(x='A', y='B', color='red', linestyle='--', marker='o', label='Data Series')

 

또 다른 방법(똑같은 결과)

ax = df.plot(x='A', y='B', color='red', linestyle='--', marker='o')
ax.legend(['Data Series'])
plt.show()

 

축, 제목 입력하기

ax = df.plot(x='A', y='B', color='red', linestyle='--', marker='o')
ax.legend(['Data Series'])
ax.set_xlabel('X-axis')		# x축 명
ax.set_ylabel('Y-axis')		# y축 명
ax.set_title('Title')		# 표의 제목
plt.show()

 

텍스트 추가하기

ax = df.plot(x='A', y='B', color='red', linestyle='--', marker='o')
ax.legend(['Data Series'])
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_title('Title')
ax.text(3, 3, "Some Text", fontsize)	# 텍스트가 들어갈 위치(3, 3), 들어갈 내용(Some Text), 텍스트 크기
plt.show()

 

표의 크기 변경

fig, ax = plt.subplots(figsize=(8,6))
ax = df.plot(x='A', y='B', color='red', linestyle='--', marker='o', ax)
ax.legend(['Data Series'])
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_title('Title')
ax.text(3, 3, "Some Text", fontsize)	# 텍스트가 들어갈 위치(3, 3), 들어갈 내용(Some Text), 텍스트 크기
plt.show()

그래프 그리기

 

차트

  • 시간의 흐름에 따른 변화율을 확인 가능
import seaborn as sns

# seaborn 라이브러리에 있는 데이터 호출
data = sns.load_dataset('flights')

# 같은 year 끼리 그룹을 지어 passengers의 합계를 구하고 인덱스를 새로 매김
data_grouped = data[['year', 'passengers']].groupby('year').sum().reset_index()

plt.plot(data_grouped['year'], data_grouped['passengers'])
plt.xlabel('year')
plt.ylabel('passengers')
plt.show()

 

바 vs 히스토그램

바 그래프(막대 그래프)

  • 범주형 변수를 나타냄
  • 값의 크기를 비교하는데 효과적
df = pd.DataFrame({
	'도시': ['서울', '부산', '대구', '인천'],
    '인구': [990, 250, 250, 290]
})

plt.bar(df['도시'], df['인구'])
plt.xlabel('도시')
plt.ylabel('인구')
plt.title('도시별 인구 수')
plt.show()

 

히스토그램

  • 연속적인 데이터의 분포를 보여줌
  • 데이터의 빈도를 시각화해 특정 정보를 얻는데 유용
import numpy as np

data = np.random.randn(1000)

plt.hist(data, bins=30)		# bins는 데이터 분포의 범위를 결정
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram')
plt.show()

 

파이차트

  • 전체 데이터에서 각 비율을 보여줌
  • 카테고리별 비율 비교
  • AutoPCT 메소드를 이용해 각 부분에 비율을 확인할 수 있음
sizes = [30, 20, 25, 15, 10]
labels = ['A', 'B', 'C', 'D', 'E']

plt.pie(sizes, labels=labels)
plt.title('Pie Chart')
plt.show()

 

박스플롯

  • 데이터의 분포와 이상치를 시각화
  • 중앙값, 사분위수, 최솟값, 최댓값 등의 정보 제공하면서 데이터의 통계적 특성 파악 용이
    • 박스가 25에서 75 구간을 의미하며 노란색 선은 중앙값을 의미, 아래/위 실선은 최소/최대값 의미, 동그라미로 범위 밖에 있는 것은 아웃라이어(이상치)
    • 특정 카테고리가 가지는 값의 범위 보고 싶거나 이상치 확인하고 싶은 경우 활용
    • 통계적으로 중요한 데이터들의 수치적인 값들을 시각적으로 표현하는데 강점이 있다

# seabron 라이브러리에 있는 iris 데이터 호출
iris = sns.load_dataset("iris")

# species 컬럼에서 unique한 값을 이용 
species = iris['species'].unique()

# 각 꽃잎에 해당하는 데이터들의 길이를 리스트형태로 가져옴 => 2차원 배열
sepal_length_list = [iris[iris['species'] == s]['sepal_length'].tolist() for s in species]

plt.boxplot(sepal_lengths_list, labels=species)
plt.xlabel('Species')
plt.ylabel('Species Length')
plt.title('Box Plot')
plt.show()

 

seaborn 라이브러를 이용해 박스플롯을 그릴 수도 있음

sns.boxplot(x='species', y='sepal_length', data=iris)
plt.show()

 

스캐터 차트(산점도)

  • 두 변수 간의 관계를 점으로 표시해서 보여주는 그래프
  • 상관 분석을 하거나 여러 변수들 간의 관계성을 파악할 때 인사이트를 얻는데 활용
  • 여러 개의 점들이 선형의 형태를 띄우고 있다면 어느정도 관계가 있다고 볼 수 있음
# 각 변수들 간 Scatter

plt.scatter(iris['petal_length'], iris['petal_width'])
plt.xlabel('Petal Length')
plt.ylabel('Petal Width')
plt.show()

plt.scatter(iris['sepal_length'], iris['sepal_width'])
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
plt.show()
  • 눈대중으로 본것이기 때문에 자세히 알 수 가 없음 ➡️ corr 메소드(수치화)
    • 각가의 상관성을 수치화해서 각 변수마다 상관계수를 가지고 얼마나 상관성이 있는지 파악
  • string 값이 존재하면 에러
    • 방법1: 전처리를 통해 원하는 형태로 만듦
    • 방법2: numeric_only 값을 True로 설정해 숫자 형태의 데이터만 활용
iris.corr(numeric_only=True)

 

그래프 요약

그래프 유형 자료 유형 특징
Line Plot 연속형 데이터 데이터의 변화 및 추이를 시각화
Bar Plot 범주형 데이터 카테코리 별 값의 크기를 시각적으로 비교
Histogram 연속형 데이터 데이터 분포, 빈도, 패턴 등을 이해
Pie Chart 범주형 데이터의 비율 범주별 상대적 비율을 부채꼴 모양으로 시각화
Box Plot 연속형 데이터의 분포 중앙값, 사분위수, 최소값, 최대값, 이상치 확인
Scatter Plot 두 변수 간 관계 변수 간의 관계, 군집, 이상치 등 확인

 

[산출물이 나오도록 접근하는 방법은 다르기 때문에 데이터 분석과 전처리, 시각화에 정답은 없다]


상관관계 요약

  • 상관관계에는 여러가지 방법이 있음
  • 피어슨 상관계수
    • 두 변수 간의 선형적인 관계 측정하기 위한 방법중 하나로, 주로 연속형 변수들 간의 상관관계를 평가하는데 사용
  • 특징
    • 범위: -1에서 1사이의 값을 가짐
    • 양의 상관관계: 1에 가까울수록 강한 양의 선형관계 나타냄
      • - A가 증가하면 B도 증가한다는 의미
    • 음의 상관관계: -1에 가까울수록 강한 음의 선형관계 나타냄
      • - A가 증가하면 B가 감소한다는 의미
    • 무상관 관계: 0에 가까울수록 선형관계가 약한 관계를 가짐
  • 하지만 상관관계가 있다고 해서 인과관계를 의미하는 것이 아니다
    • 예를 들어 A가 증가할 때 B가 증가한다는 양의 상관관계를 보일때 꼭 A 때문에 B가 올랐다고 말할 수 없다
    • 그리고 이것을 표현해 주는게 상관분석은 아니다
    • A와 B에 대한 인과성은 별도의 의미를 가진다
    • 따라서 상관분석만 가지고 판단할수는 없다

 

 

데이터 분석가가 되기 위해

  • 반복 학습하는 것이 중요
    • 10 minutes to pandas
  • 구글링을 적절히 활용
  • 잊지 말아야 할 것
    1. 목표 설정: 무엇을 위해 데이터 전처리와 시각화를 하는가
    2. 예상 산출물 정의: 데이터 처리 및 시각화 후에 예상 결과물은 무엇인가
    3. 'As-is' vs 'To-be' 생각: 현재 문제와 상황 인지하고 어떤식으로 개선할지 방향 설정
  • Plotly 시각화 라이브러리 찾아보기
  • Tableau, Google Data Studio, Amazon QuickSight 데이터 시각화 툴
    • Tableau: 데스크톱 및 클라우드 기능 제공 / 확장성이 좋음
    • Google Data Studio: 구글 클라우드 기반 / 구글 서비스와 연동하여 확장 가능
    • Amazon QucikSight: AWS 클라우드 기반 / AWS 생태계 내에서 확장 가능