사례
- 바다오염의 주범은 바다쓰레기
- 바다쓰레기 줄이기 위해 빨대 사용금지가 얼마나 효과있을까
- 실제 데이터 살펴보면 전세계 바다 쓰레기의 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
- 구글링을 적절히 활용
- 잊지 말아야 할 것
- 목표 설정: 무엇을 위해 데이터 전처리와 시각화를 하는가
- 예상 산출물 정의: 데이터 처리 및 시각화 후에 예상 결과물은 무엇인가
- 'As-is' vs 'To-be' 생각: 현재 문제와 상황 인지하고 어떤식으로 개선할지 방향 설정
- Plotly 시각화 라이브러리 찾아보기
- Tableau, Google Data Studio, Amazon QuickSight 데이터 시각화 툴
- Tableau: 데스크톱 및 클라우드 기능 제공 / 확장성이 좋음
- Google Data Studio: 구글 클라우드 기반 / 구글 서비스와 연동하여 확장 가능
- Amazon QucikSight: AWS 클라우드 기반 / AWS 생태계 내에서 확장 가능
'EDA & 데이터 분석 > 데이터분석' 카테고리의 다른 글
엔진 센서 데이터 기반 결함 예측 및 품질관리 분석(1) (0) | 2025.02.24 |
---|---|
데이터 전처리 & 시각화 3주차(데이터프레임 다루기) (1) | 2025.01.02 |
데이터 전처리 & 시각화 2주차 (0) | 2024.12.31 |
데이터 전처리 & 시각화 1주차 (1) | 2024.12.31 |
데이터 리터러시 (4) | 2024.12.30 |