2.2 EDA 심화
키워드 : EDA, 데이터 시각화, 트리맵, 레이더 차트, 폴라차트, 버블차트, 머신러닝, 딥러닝, AI, 파이썬, 데이터 분석, 데이터 전처리, 데이터 수집,
데이터 모델링
탐색적 데이터 분석(EDA)은 데이터를 이해하는데 사용되는 기법입니다. 기본적인 그래프의 경우 데이터의 기본적인 특성을 파악하고 상관 관계를 이해하는 데 도움이 됩니다. 그러나 우리는 간단한 데이터만 다루는 것이 아닌 복잡한 데이터를 다루는 경우가 더 많습니다. 아래에서 다룰 4개의 시각화 기법은 복잡한 데이터셋을 다양한 각도에서 탐색하고 이해하는 데 도움이 되며, EDA의 심화 과정에서 중요한 역할을 합니다.
01. 트리맵(Treemap)
1.1 트리맵이란?
트리맵(TreeMap)은 정보를 계층 구조로 시각화하는 데이터 시각화 기술입니다. 주로 계층적 데이터를 사각형으로 분할하여 표현하며, 각 사각형의 크기와 색상을 활용하여 데이터의 상대적인 크기와 비율을 시각적으로 파악할 수 있게 해줍니다.
1.2 트리맵 활용
트리맵은 계층적인 데이터를 시각화하여 표현하고 싶을 때 사용되는 시각화 기법입니다. 대표적으로 사용되는 예시는 아래와 같습니다.
인구 통계 및 사회 현상: 인구 조사나 사회 현상 데이터를 시각화할 때 사용되기도 합니다. 예를 들어 국가의 인구 구성을 나타낼 때, 각 지역을 계층적으로 표현하고 인구 수에 따라 사각형 크기를 조절하여 어떤 지역이 얼마나 많은 인구를 가지고 있는지 시각적으로 확인할 수 있습니다.
지리 정보 및 지역 데이터: 지리 정보를 시각화할 때 트리맵을 사용합니다. 지도를 계층적으로 분할하여 각 영역의 크기를 나타내고, 인구 밀도나 지역별 특정 통계 정보를 사각형의 크기와 색상으로 표시하여 지역 간 차이나 관계를 시각화할 수 있습니다.
1.3 트리맵 예시 코드
import plotly.express as px
import numpy as np
df = px.data.gapminder().query("year == 2007")
fig = px.treemap(df, path=[px.Constant("world"), 'continent', 'country'], values='pop', color='lifeExp', hover_data=['iso_alpha'], color_continuous_scale='RdBu', color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']))
fig.update_layout(margin = dict(t=50, l=25, r=25, b=25))
fig.show()


a. import plotly.express as px: Plotly Express를 px라는 별칭으로 가져옵니다. Plotly Express는 데이터 시각화를 쉽게 만들 수 있는 고수준 인터페이스를 제공합니다.
b. df = px.data.gapminder().query("year == 2007"): Plotly Express에서 제공하는 Gapminder 데이터셋을 불러와서 year 컬럼이 2007인 데이터만 선택하여 데이터프레임 df에 저장합니다.
c. fig = px.treemap(df, path=[px.Constant("world"), 'continent', 'country'], values='pop', ...: df 데이터프레임을 기반으로 트리맵을 생성합니다.
· path=[px.Constant("world"), 'continent', 'country']: 트리맵의 경로를 지정합니다. 루트 노드는 "world"로 고정하며, 그 하위 계층으로 'continent'와 'country'를 사용합니다.
· values='pop': 각 트리맵 영역의 크기를 지정하는 데이터 컬럼으로 'pop' (인구) 컬럼을 사용합니다.
· color='lifeExp': 영역의 색상을 지정하는 데이터 컬럼으로 'lifeExp' (기대 수명) 컬럼을 사용합니다.
· hover_data=['iso_alpha']: 마우스 오버 시 나타나는 추가 정보로 'iso_alpha' (국가 코드) 컬럼을 사용합니다.
· color_continuous_scale='RdBu': 컬러 스케일을 'Red-Blue'로 설정합니다.
· color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']): 컬러 스케일의 중간값을 계산하여 설정합니다. 이 값은 기대 수명을 인구로 가중치를 두고 계산한 평균값으로 설정됩니다.
d. fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)): 그래프의 레이아웃을 업데이트합니다. 여기서는 그래프의 여백을 설정합니다.
02. 레이더 차트(Radar Chart)
2.1 레이더 차트란?
레이더 차트(Radar Chart), 또는 스파이더 차트(Spider Chart)는 다차원 데이터를 시각화하는데 사용되는 그래프입니다. 이 차트는 여러 변수의 값을 원형으로 나열하고, 각 변수의 값을 꼭지점을 잇는 선으로 연결하여 다차원 데이터 간의 비교 및 분석을 가능하게 합니다. 주로 여러 변수를 평가항목으로 두고 그에 대한 중요도를 방사형으로 표현합니다. 변수의 크기와 형태에 의해 그려지는 다각형의 모양이 달라짐에 따라 변수의 상대적인 중요도를 시각적으로 확인할 수 있습니다.
2.2 레이더 차트 활용
레이더 차트는 가질 수 있는 범위가 같은 3개 이상의 변수들의 성능을 표시할 때 많이 활용됩니다. 그러나 변수들이 너무 많을 경우에는 차트가 복잡해 보이는 단점이 있기 때문에 보통 변수가 10개 내외일 때 많이 쓰입니다. 레이더 차트를 활용하는 대표적인 예시는 다음과 같습니다.
개인 능력 및 성과 평가: 개인의 다양한 능력이나 성과를 비교 분석할 때 레이더 차트를 활용할 수 있습니다. 예를 들어 직무 기술, 리더십, 커뮤니케이션 등의 능력을 다차원으로 시각화하여 직원의 역량을 평가하거나 개발할 수 있습니다.
스포츠 선수 분석: 스포츠 선수의 다양한 기술적 특성을 분석할 때 레이더 차트를 활용할 수 있습니다. 각 선수의 능력을 변수로 나타내어 경기력을 비교하고 선수 간의 차이를 시각화하여 강점과 약점을 파악할 수 있습니다.
2.3 레이더 차트 예시 코드
아래 코드는 FIFA 21 게임의 남성 선수들의 능력치 데이터를 사용하여, 주어진 선수들의 다양한 능력치를 비교하기 위한 레이더 차트를 생성하는 코드입니다. 레이더 차트는 각 선수의 특정 속성(파라미터)에 대한 수치를 시각적으로 표현하는데 사용됩니다.
예시 코드에 사용된 파일은 포스팅 하단 참고자료 링크에서 확인할 수 있습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings warnings.filterwarnings('ignore')
df=pd.read_csv("fifa21_male2.csv")
cols=['Name', 'Age', 'OVA', 'Nationality', 'Club','BP','PAC','SHO', 'PAS', 'DRI','PHY','DEF']
df=df[cols]
df.head()
.png)
def radar_chart(players=['V. van Dijk', 'M. Salah'], title="Virgil van Dijk Vs Mo Salah"):
labels = np.array(['PAC', 'SHO', 'PAS', 'DRI', 'PHY', 'DEF'])
angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False)
fig = plt.figure(figsize=(6, 6))
plt.suptitle(title)
ax = fig.add_subplot(111, polar=True)
for player in players:
stats = np.array(df[df.Name == player][labels])[0]
ax.plot(angles, stats, 'o-', linewidth=2, label=player)
ax.fill(angles, stats, alpha=0.25)
ax.set_thetagrids(np.degrees(angles), labels)
ax.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
radar_chart()
.png)
a. labels: 레이더 차트에서 사용할 속성 레이블을 정의합니다.
b. angles: 레이더 차트의 각도를 정의하고 루프를 닫아줍니다.
c. fig: 레이더 차트를 그릴 Figure 객체를 생성합니다.
d. ax: 서브플롯으로 레이더 차트를 생성할 AxesSubplot 객체를 생성합니다.
e. 루프를 통해 각 선수별로 속성 값을 추출하여 레이더 차트를 생성하고, 각도와 속성 레이블을 설정합니다.
f. 그리드와 범례를 추가하고, 그래프 레이아웃을 조절한 후, **plt.show()**를 통해 레이더 차트를 출력합니다.
함수를 호출하면 기본적으로 "Virgil van Dijk Vs Mo Salah" 제목과 선수들의 속성 값을 비교하는 레이더 차트가 생성됩니다. radar_chart() 함수의 인자를 조정하여 원하는 선수와 제목으로 레이더 차트를 생성할 수 있습니다.
03. 폴라 차트(Polar Chart)
3.1 폴라 차트란?
폴라 차트(Polar Chart)는 데이터의 다차원적인 특성을 시각화하는 데 사용되는 그래프 형식입니다. 원형으로 나열된 축을 기준으로 데이터 값을 극좌표계로 표현하여 다양한 변수 간의 상대적 크기나 패턴을 비교하고 분석하는 데에 유용합니다.
3.2 폴라 차트 활용
레이더 차트가 방사형 차트라면, 폴라 차트는 극좌표 차트라고도 불립니다. 폴라 차트는 레이더 차트에 비해 주기성과 원형 데이터 구조에 더 적합하며, 각도와 반지름을 통해 데이터 간의 관계와 패턴을 시각화할 수 있습니다. 아래는 폴라차트가 쓰이는 대표적인 예시입니다.
기상 및 환경 데이터 분석: 날씨 데이터나 환경 모니터링 데이터에서 다양한 변수(온도, 습도, 풍속 등)의 변화를 폴라 차트로 시각화하여 기후 패턴이나 환경 변화를 분석할 수 있습니다.
투자 분석: 다양한 자산의 수익률, 위험 등을 다차원으로 표현하여 투자 포트폴리오의 분석과 평가에 활용될 수 있습니다.
3.3 폴라 차트 예시 코드
아래 코드는 Plotly Express를 사용하여 풍향과 풍속 데이터를 이용해 극좌표계의 폴라 차트를 생성하고 시각화합니다. 각 꺾은선은 풍향을 나타내며, 선의 길이나 영역 색상은 풍속을 나타냅니다.
import plotly.express as px
df = px.data.wind()
fig = px.line_polar(df, r="frequency", theta="direction", color="strength", line_close=True)
fig.update_traces(fill='toself')
fig.show()
.png)
.png)
a. df = px.data.wind(): Plotly Express에서 제공하는 wind 데이터셋을 불러와서 데이터프레임 df에 저장합니다. 이 데이터셋에는 풍향, 풍속 및 풍력의 세 가지 열(column)이 있습니다.
b. fig = px.line_polar(df, r="frequency", theta="direction", color="strength", line_close=True): df 데이터프레임을 기반으로 레이더 차트를 생성합니다.
· r="frequency": 꺾은선 그래프의 반지름 (극좌표계의 r 축)에 사용할 데이터 열을 지정합니다. 여기서는 "frequency" 열을 사용하여 풍속 또는 풍력을 나타냅니다.
· theta="direction": 꺾은선 그래프의 각도 (극좌표계의 θ 축)에 사용할 데이터 열을 지정합니다. 여기서는 "direction" 열을 사용하여 풍향을 나타냅니다.
· color="strength": 선 그래프의 색상을 지정하는 데이터 열을 선택합니다. 이 경우, "strength" 열을 사용합니다.
· line_close=True: 선 그래프의 시작점과 끝점을 연결하여 경로를 닫을 것인지 여부를 설정합니다.
c. fig.update_traces(fill='toself'): 꺾은선 그래프의 영역을 그리기 위해 영역을 자체적으로 채우도록 설정합니다. 이 설정은 그래프 영역 내부를 색상으로 채웁니다.
앞서 살펴본 폴라차트와 약간 다른 형태의 폴라차트도 존재합니다. 아래의 Wind Rose 폴라 차트는 주로 기상 데이터에서 바람의 방향과 속도를 시각화하는 데 특화된 형태의 폴라 차트입니다. 각도와 반지름을 이용하여 바람의 방향과 세기를 동시에 시각화하며, 각각의 방향에 대한 빈도수를 막대로 표현합니다.
import plotly.express as px
df = px.data.wind()
fig = px.bar_polar(df, r="frequency", theta="direction", color="strength", template="plotly_dark", color_discrete_sequence= px.colors.sequential.Plasma_r)
fig.show()
.png)
04. 버블 차트(Bubble Chart)
4.1 버블 차트란?
버블 차트(Bubble Chart)는 세 개의 변수를 시각화하는데 사용되는 그래프 형식 중 하나로, 데이터 포인트를 원 형태의 버블로 나타내며, 두 변수의 위치와 크기, 색상을 이용하여 정보를 표현합니다. 버블 차트는 주로 데이터 포인트 간의 관계와 패턴을 시각화하며, 다양한 변수 간의 상대적 크기 및 관계를 파악하는데 유용합니다.
4.2 버블 차트 활용
버블 차트는 다변량 데이터 비교, 트렌드 및 패턴 분석과 같이 데이터의 관계와 패턴을 시각적으로 파악하고 이해하는 데 유용한 기법입니다. 아래는 버블 차트를 사용하는 데 대표적인 예시입니다.
경제 및 금융 분석: 버블 차트를 이용하여 국가 간의 GDP와 인구 수의 관계, 기업의 매출과 이익의 상관관계 등을 시각화하여 경제 및 금융 데이터를 분석할 수 있습니다.
과학 연구: 과학적 실험 결과나 연구 데이터를 버블 차트로 표현하여 다양한 변수 간의 상호작용을 분석하거나 패턴을 발견할 수 있습니다.
마케팅 및 소비 행태 분석: 제품의 판매량, 가격, 소비자 만족도 등을 버블 차트로 나타내어 제품의 특성을 비교 분석하거나 시장 동향을 파악할 수 있습니다.
4.3 버블 차트 예시 코드
아래 코드는 Gapminder 데이터셋의 2007년 데이터를 기반으로, 국가의 1인당 GDP와 기대 수명을 산점도 그래프로 나타내며, 각 데이터 포인트는 인구와 대륙 별로 크기와 색상으로 구분되어 시각화됩니다.
import plotly.express as px
df = px.data.gapminder()
fig = px.scatter(df.query("year==2007"), x="gdpPercap", y="lifeExp", size="pop", color="continent", hover_name="country", log_x=True, size_max=60)
fig.show()
.png)

a. df = px.data.gapminder(): Plotly Express 내장 데이터셋인 Gapminder 데이터셋을 가져와서 df 데이터프레임에 저장합니다. 이 데이터셋에는 연도별 국가별 경제 및 인구 관련 정보가 포함되어 있습니다.
b. fig = px.scatter(...): px.scatter 함수를 사용하여 산점도 그래프를 생성합니다. 이 함수의 매개변수들을 사용하여 그래프의 형태와 데이터 표현 방식을 설정합니다.
-
df.query("year==2007"): 2007년 데이터만 추출합니다.
-
x="gdpPercap": x축에는 국가별 1인당 GDP를 표시합니다.
-
y="lifeExp": y축에는 국가별 기대 수명을 표시합니다.
-
size="pop": 데이터 포인트의 크기는 인구를 나타냅니다.
-
color="continent": 데이터 포인트의 색상은 대륙별로 구분됩니다.
-
hover_name="country": 마우스를 데이터 포인트 위에 올리면 국가 이름이 툴팁으로 표시됩니다.
-
log_x=True: x축을 로그 스케일로 표현합니다.
-
size_max=60: 데이터 포인트의 최대 크기를 설정합니다.
05. 참고자료
[plotly]Treemap Charts in Python
https://plotly.com/python/treemaps/
[Plotly Tutorial 파이썬 시각화의 끝판왕 마스터하기] Radar chart
[Kaggle] FIFA 21 Player Comparison using Radar Chart
https://www.kaggle.com/code/abhijithchandradas/fifa-21-player-comparison-using-radar-chart/notebook