장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
학습 목표: 탐색적 데이터 분석, 상관성 분석, 데이터 시각화
> 데이터 형태와 분포, 이상치와 결측치 등을 확인
데이터 분석에서 ML 모델의 성능보다 데이터를 올바르게 파악하고 효과적으로 가공하는 것이 더 중요하다.
그 과정에서 EDA 와 데이터 시각화는 구별해야 한다.
10.1 탐색적 데이터 분석: EDA
기술 통계와 데이터 시각화를 통한 데이터 특성 파악
10.1.1 엑셀을 활용한 EDA
10.1.2 탐색적 데이터 분석 실습
# 필요한 패키지 설치
# 데이터 불러오기
# 각 컬럼의 속성 및 결측치 확인
df.info()
# 각 컬럼의 통계치 확인
df. describe()
//describe는 수치형 데이터에만 적용
# 각 컬럼의 왜도 확인
df.skew()
//skew도 numeric 데이터에만 적용
# numeric 타입의 컬럼만 선택
# 각 numeric 컬럼의 왜도 계산
10.2 공분산과 상관성 분석
변수들의 특성을 파악한 뒤에 변수 간 관계를 살펴본다.
- x y 관계 - 입력 변수와 target의 관계
- x 끼리의 관계
Multicollinearity 다중공선성: 회귀분석에서 독립변수들 간에 강한 상관관계가 나타나는 것
Multicollinearity를 방지하고자 함이 목적이다.
이를 위해 Covariance(공분산)과 Correaltion coefficient(상관계수)을 이용한다.
- 각 변수의 변동이 얼마나 닮았는지를 표현하는 두 개의 다른 계산식
10.2.1 Covariance 공분산
두 분산의 관계를 뜻한다: 두 변수의 공통적인 분산의 정도
- 분산: 한 변수의 각각의 데이터가 퍼진 정도
10.2.2 Correlation coefficient 상관계수
공분산은 두 변수의 상관관계를 표현함에 한계가 있다. 각 변수 간의 다른 척도 기준이 수치화에 그대로 반영되어 공분산 값이 지니는 크기가 상관성의 정도를 나타내지 못한다. 이를 보완하기 위해 상관계수를 이용한다.
- 공분산 값을 normalize하여 상관성을 비교하기도 한다.
- normalize: 변수 각각의 표준편차 값으로 나누는 것
Pearson corr
X1과 X2가 함께 변하는 정도(공분산)을 X1과 X2가 변하는 전체 정도로 나눈다.
- 함께 변하는 정도는 전체가 변하는 총량을 초과할 수 없기 때문에 [-1, 1]로 나타난다.
- 상관계수는 예상치의 정확도가 높아진다는 개념이다.
분산의 관계성이 같다면, 기울기가 크든 작든 상관계수는 같다. 산점도의 기울기와 상관계수는 관련이 없다.
10.2.3 공분산과 상관성 분석 실습
# 산점도 행렬 시각화
sns.pairplot(df, diag_kind = 'kde') // 동일한 변수의 산점도를 분포로 표현
plt.show()
# 동일 변수는 산점도(상관계수 1)이 일직선으로 나오기 때문에 분포도로 변환해 정보량을 늘린다.
# 피어슨 상관계수 확인
df.corr(method = 'pearson')
# 중복 제거 히트맵 시각화
// 상관성의 높고 낮음 파악 - 가독성 높이기
# 매트릭스의 우측 상단을 모두 True로, 하단을 False로 변환
np.triu(np.ones_like(df.corr()))
# True/False mask 배열로 변환
mask = np. triu(np.ones_like(df.corr(), dtype = np.bool))
# 히트맵 그래프 생성
fig, ax = plt.subplots(figsize=(15,10))
sns.heatmap(df.corr(), mask = mask,
vmin = -1, vmax = 1,
annot = True,
cmap = "~", cbar = Ture)
ax.set_title("~", pad = 15)
10.3 시간 시각화
시점 요소가 있는 데이터는 시계열(Time series) 형태로 시간의 흐름을 표현할 수 있다.
- '연속형' 시간 간격의 밀도가 높을 때 '연속형' 선 그래프를 이용한다.
- 추세선: Moving averages ; 데이터를 연속적인 그룹으로 묶어 평균을 구한다.
- '분절형' 시간 간격 밀도가 낮거나 값의 상대적인 차이를 표시하는 '분절형'
10.3.1 시간 시각화 실습
# 30일 이동평균 생성
df_line['Month'] = df_line['Sales'].rolling(window = 30).mean()
10.4 비교 시각화
Heatmap chart: 그룹별 요소가 많아질 때 사용한다.
- row: 그룹, column: 요소
- 그리는 방법이 까다롭기 때문에 데이터 구조와 확인하고자 하는 목적을 정확히 파악해야 한다.
- 예시: 직급별 연간 독서량(권), 직업군 별 건강(혈당, 맥박, 체지방량) 등
Radar chart(방사형 차트)
Parallel coordinates(평행 좌표 그래프)
10.4.1 비교 시각화 실습
# 히트맵 시각화 v1
fig = plt.figure(figsize(8,8))
fig.set_facecolor('white')
plt.pcolor(df1.values)
# x,y축 칼럼과 label 설정
plt.xticks(range(len(df1.columns)), df1.columns)
plt.yticks(range(len(df1.index)), df1.index)
plt.xlabel('~', fontsize = 10)
plt.ylabel( )
plt.colorbar() // 색이 해당하는 수치
plt.show()
10.5 분포 시각화
데이터를 처음 받았을 때 각 변수가 어떤 요소로, 어느 비율로 구성되어 있는 지 파악하는 중요한 방법이다.
- quantitative
- histogram - bin(가로)과 density(세로)로 구성
- 구간이 너무 많으면 보기 어렵고 구간이 너무 적으면 정보 손실이 크기 때문에 20개 정도로 시작한다.
- qualitative
- pie chart > donut chart
- treemap
구성 요소가 복잡할 때, 구성 요소의 비율에 따라 작은 사각형을 쪼개 포함하도록 표현해 위계구조를 표현한다. - waffle chart
위계구조를 표현하지는 못한다.
10.5.1 분포 시각화 실습
# 두 개 이상 히스토그램 시각화
# 각각의 데이터셋 생성
# 10 단위로 히스토그램 시각화
plt.hist(df1_1, color = ' ', alpha = 0.2, bins = 10, label = ' ', density = True)
plt.hist(df1_2, color = ' ', alpha = 0.2, bins = 10, label = ' ', density = True)
// alpha 로 투명도를 조절해 겹치는 부분을 표현한다.
plt.legend() // 범례
plt.show()
# 도넛차트 시각화
// 파이차트에 차트 형태 옵션을 추가해 도넛 형태로 조정한다.
# 파이차트 시각화
fig = plt.figure(figsize=(,)) # 캔버스 생성
fig.set_facecolor('') # 캔버스 배경색 설정
ax = fig.add_subplot() # 프레임 생성
# 파이차트 출력
# 도넛차트 시각화를 위한 옵션 설정
wedgeprops = { 'width' : 0.7, 'edgecolor': 'w', 'linewidth': 5} // width가 핵심이다
plt.pie(,)
plt.show()
10.6 관계 시각화
Scatter plot : 두 개의 연속형 변수 간의 관계를 나타낼 수 있다.
- 극단치를 제거하고 그려야 시각화 효율이 높다.
- 겹치는 데이터의 정보 확인을 위해 alpha 값 조정이 필요하다.
Bubble chart : 두 개 이상 변수의 상관관계를 확인할 수 있다.
- 그러나 세 가지 요소보다 늘어나면 한 번에 제공되는 정보가 너무 많아 차트 해석이 어려워진다.
버블 차트를 해석할 때 원의 지름이 아닌 '원의 면적'을 통해 크기를 판단하도록 주의한다.
10.6.1 관계 시각화 실습
# 기본 산점도 시각화
plt.scatter(df[' '], df[' '], s=50, alpha = 0.4)
// alpha 값 조정으로 겹치는 부분을 효과적으로 확인
plt.show()
# 산점도에 회귀선 추가와 label 추가
ax = sns.Implot(x=' ', y = ' ', data = df)
? Implot(x = ' ', y = ' ') 이랑 plt.xlabel, plt.ylabel 의 차이가 뭐징?
10.7 공간 시각화
실제 지도 위에 데이터를 표현할 수 있다. 거시적에서 미시적으로 진행되는 분석 방향과 같이 스토리라인을 잡고 시각화 적용하는 것이 좋다.
- Dot map
- Bubble map
- Choropleth map
- Connection map
10.7.1 공간 시각화 실습
# 서울 지도에 스타벅스 지점수 도드맵 시각화
m = folium.Map(location = [97.541, 126.986], zoom_start = 12, width ="%100", height = "%100")
location = list(zip(df.latitude, df.longitude))
for i in range(len(locations)):
folium.CircleMarker(location = locations[i], radius = 1).add_to(m) // CircleMarker로 버블 표현
m
# 버블맵 시각화
# 지점 수 집계 후 중심점 산출 // 버블맵은 특정 지점에 지정된 수치의 값을 표현하기 때문에 기준점이 필요하다.
# 구의 중심 지점 만들기
df_m = df.groupby('구의이름').agg({'latitude':'mean',
'longitude':'mean',
'name':'count'}).reset_index()
df_m.heat()
10.8 박스 플롯
양적 척도 데이터의 분포 및 편향성, 평균과 중앙값 등 다양한 수치를 보기 쉽게 정리한다.
- 데이터 분포도를 함께 떠올리는 습관이 필요하다.
10.8.1 박스 플롯 실습
# 가로세로 box plot
plt.figure(figsize = ())
sns.boxplot(x = ' ', data = df) // y로 바꾸면 가로 box plot이 된다
plt.show()
# 추가 옵션
# 평균 표시
sns.boxplot(x="State", y="Profit",
showmeans= True,
boxprops = {'facecolor': 'None'}, data = df)
// 데이터 포인트 개별 표시
sns.stripplot(x='State', y='Profit',
data = df, jitter = True, marker='o',
alpha = 0.5, color = 'black')
plt.show()
'Data Science' 카테고리의 다른 글
[Excel] VBA로 데이터 자동화하기 (1) | 2025.03.04 |
---|---|
파이썬 가상환경설정 (0) | 2025.01.07 |
[파이썬으로 시작하는 데이터 사이언스] 파일 경로 설정 (3) | 2024.08.06 |
데이터 분석에 필요한 파이썬 (1) | 2024.07.31 |
[프로젝트로 배우는 데이터사이언스] 분류모델 기초 1.1 사이킷런과 머신러닝 (3) | 2024.07.22 |