데이터 분석가가 반드시 알아야할 모든 것

데이터 탐색과 시각화

채영sw 2024. 3. 13. 18:00

10-1. 탐색적 데이터 분석

탐색적 데이터 분석(EDA)  : 가공하지 않은 데이터를 그대로 탐색/분석하는 기법

 

- EDA를 하는 주요 목적

  • 데이터의 형태와 척도가 분석에 알맞게 되어 있는지 확인
  • 데이터의 평균, 분산, 분포, 패턴 등을 확인해 데이터의 특성 파악
  • 데이터의 결측값, 이상치 파악 및 보완
  • 변수 간의 관계성 파악
  • 분석 목적과 방향성 점검 및 보정

- 엑셀을 활용한 EDA

각 데이터 샘플을 1,000개씩 뽑아 엑셀에서 눈으로 쭉 살피는 것으로도 여러 정보를 얻을 수 있음.

범주형 데이터의 비율이나 연속형 데이터의 범위 등 파악 가능

피벗 테이블을 활용해 필요한 데이터를 추출해 확인 가능

-> 친화적인 프로그램을 이용해 본격적인 데이터 분석에 앞서 데이터에 대한 이해도를 높이는 작업

 

- 탐색적 데이터 분석 실습

 

info( ) 매서드 : 각 칼럼의 데이터 타입 및 결측치 개수 알 수 있음.

describe( ) 매서드 : 각 칼럼의 평균, 표준편차, 최대/최소 등을 알 수 있음.

 

skew( ) 매서드: 각 칼럼의 왜도 확인 가능.

왜도 : 데이터 분포의 좌우 비대칭도를 표현하는 척도

  • 데이터 분포가 좌우 대칭일수록 왜도값(의 절댓값)은 감소하고, 한쪽으로 몰려 있을수록 왜도값(의 절댓값)은 증가
  • 분포가 왼쪽으로 치우쳐 오른쪽으로 긴 꼬리를 가지면 양수, 반대의 경우 음수
  • 주로 다음과 같은 수식으로 왜도값 구함.

 

kurtosis( ) 매서드 : 각 컬럼의 첨도  확인

첨도 : 데이터 분포가 정규분포에 비해 얼마나 뾰족하고 완만한지의 정도를 나타내는 척도로 중심에 얼마나 쏠려 있는가를 나타냄.

  • 3을 기준으로 값이 클수록 뾰족한 양의 첨도(급첨)이며 값이 작을수록 음의 첨도(완첨)이지만 -3을 적용해 음수(완첨)/양수(급첨)로 구분하기도 함.

 

seaborn 패키지의 distplot 함수를 사용해 컬럼의 분포 시각화 가능

sns.displot(df[’lead_time’])

 

 

violinplot( ) 함수 : 호텔 구분에 따른 lead_time 컬럼 분포를 시각화해줌(회색)

srtipplot( ) 함수 : 호텔별로 lead_time 컬럼의 각 관측치의 위치를 표현해줌(파란색)


10-2. 공분산과 상관성 분석

데이터를 탐색할 때 타깃변수 Y와 입력변수 X의 관계, 입력변수 X들 간의 관계를 살펴봐야 함.

공분산과 상관계수  : 변수 간의 상관관계를 파악하는 대표적인 개념

 

공분산 : 두 변수 간의 분산의 관계, 즉 서로 공유하는 분산

  • 각 샘플별로 두 변수에 대한 분산을 구해(해당 값 - 평균값) 서로 곱한 값을 모든 샘플에 대해 더하고 다시 샘플 수로 나눠 구할 수 있음.
  • 해당 값이 0이면 두 변수는 상관관계가 없는 것이며 해당 값이 양수이면 양의 상관관계, 음수이면 음의 상관관계를 가짐.

상관계수 : 각 변수의 척도 기준이 다르다면 공분산의 크기가 상관성의 정도를 정확하게 나타내지 못함.

-> 피어슨 상관계수를 주로 사용

 

피어슨 상관계수 : 두 변수의 공분산을 두 변수 각각의 전체 분산으로 나눠 구함. 따라서 그 값은 -1과 1 사이의 값을 가짐(양 끝 값 포함)

-> 일반적으로 상관계수의 절댓값이 0.4 이상이면 어느 정도 상관관계가 있다고 해석

-> 0.7 이상이면 강한 상관관계가 있다고 해석

상관계수 값에 따른 상관관계 분포

이때 산점도의 기울기 값상관계수와 관계 X

-> 상관계수가 높다는 것은 변수 X1이 움직일 때 변수 X2가 많이 움직이는 것이 아니라, 변수 X1이 변수 X2에 대해 예상할 수 있는 정확도(설명력)가 높다는 뜻

 

상관분석은 두 변수의 선형적 관계만을 측정 -> 두 변수의 분포가 각각 위로볼록, 아래로볼록한 2차함수의 형태를 띌 경우 상관관계가 매우 낮게 나옴 -> 따라서 상관분석을 하면서 산점도 그래프도 별도로 그려 보는 것이 좋음!!

 

피어슨 상관관계는 등간, 비율척도의 데이터에서만 사용 가능

 

- 기타 척도에 대한 상관분석 방법

  • Pearson correlation coefficient : 간격/비율 - 간격/비율
  • Spearman’s rank correlation coefficient : 서열 - 서열
  • Point-biserial correlation coefficient : 간격/비율 - 명목(2분 변수)
  • Phi coefficient : 명목(2분 변수) - 명목(2분 변수)
  • Cramer’s coefficient : 명목 - 명목 (2 X 2 이상)
  • 등간척도 : IQ, 온도 등 동일한 간격으로 서열을 매긴 척도
  • 비율척도 : 무게, 길이 등 절대영점이 존재하며 ‘10m는 5m의 두배이다’ 같은 절대적 크기 비교가 가능한 척도
  • 명목척도 : 범주화하여 나타내는 척도. 숫자나 기호를 부여해 사용하기도 함
  • 서열척도 : 생활 수준 등 서열을 매길 수 있으나 그 간격은 동일하지 않은 척도

 

- 공분산과 상관성 분석 실습

우선 데이터를 불러와 13개의 컬럼이 있는 것을 확인한다.
산점도 행렬을 시각화해서 모든 변수 간의 관계가 각각 어떤지 확인한다.
다음으로는 cov( ) 함수를 사용해 공분산을 구한다. 모든 변수들 간의 공분산을 표로 정리해 나타낼 수 있다.
상관분석은 corr( ) 함수로 확인할 수 있다. method 매개변수(디폴트값 pearson)로 상관계수 산출 방법을 지정할 수 있다.

 

cov( ) 함수 / corr( ) 함수 : 자동으로 문자형 변수를 제외함.

 

다음으로 히트맵으로 상관계수를 시각화

sns.heatmap(df.corr(), cmap = ‘viridis’)

히트맵에 수치가 표시되지 않아 불편 -> 이때 clustermap( ) 함수 사용 : 각 상관계수 값을 표시해 줄 뿐만 아니라 상관성이 강한 변수끼리 묶어서 표현해줌!

sns.clustermap(df.corr(), annot = True, cmap = 'RdYlBu', vmin = -1, vmax = 1)

불필요한 부분은 가려진 히트맵을 출력

np.triu(np.ones_like(df.corr( ))) : 행렬의 우측 상단을 1, 좌측 하단을 0으로 변환해주는데 dtypebool로 전달하면 1과 0 대신 각각 True와 False로 변환해줌.

-> 마지막으로 mask 매개변수로 True인 부분(우측 상단)을 가려 히트맵 출력

마지막으로 mask 매개변수로 True인 부분(우측 상단)을 가려 히트맵 출력


10-3. 시간 시각화

시간 시각화 : 선그래프 형태인 연속형과 막대그래프 형태인 분절형이 있음.

 

시간 간격의 밀도가 높을 때(초 단위 데이터처럼) 주로 선그래프를 사용.

하지만 데이터의 양이 너무 많거나 변동이 심하면 패턴을 파악하기 난해하므로 이때는 추세선을 삽입하기도 함.

추세선 : 들쭉날쭉한 데이터 흐름을 안정된 선으로 표현할 수 있으며 추세선을 그리는 가장 일반적인 방법으로는 이동평균 방법이 있음.

 

이동평균 방법 : 만약 2 → 5 → 3 → 7 → 4 의 값을 가지는 데이터가 있다면 이를

(2, 5, 3의 평균) → (5, 3, 7의 평균) → (3, 7, 4의 평균)으로 나타내는 것

 

분절형 시간 시각화 : 막대그래프, 누적 막대그래프 (혹은 점 그래프) 등으로 이루어짐.

-> 시간의 밀도가 낮을 때 주로 사용되며 값들의 상대적 차이를 나타낼 때 유용

누적 막대그래프 : 시점별로 여러개의 세부 항목이 존재할 때 사용 가능

-> 각 항목의 전체 합 또한 한번에 나타낼 수도 있고 전체에 대한 각 항목의 비율을 서로 비교할 수도 있어 유용

 

 

- 시간 시각화 실습

order data 칼럼을 날짜 형식으로 변환하고 연도 칼럼을 새로 생성. 이후 2018년도의 데이터만 추출하고 groupby( ) 함수를 사용해 일별 매출액을 구함.

 

우선 rolling( ) 함수를 사용하여 30일 이동평균 칼럼을 만들고 이후 시각화를 진행. 매출액 편차가 크지만 이동평균선을 통해 5월부터 매출이 감소, 8월에 다시 증가하는 것을 확인할 수 있음.
groupby( ) 함수를 통해 연도와 연도별 매출액 합계 데이터를 추출하고 막대 그래프로 시각화. (rot 매개변수에서 글자의 각도를 입력하면 글자가 기울어져 나와 글자가 서로 겹치는 것을 막을 수 있음.)
누적 막대 그래프를 위해 데이터 가공. pivot( ) 함수를 사용해 데이터프레임의 행과 열을 재구성하여 새로운 데이터프레임 제작.
마지막으로 누적 막대 그래프 시각화


10-4. 비교 시각화

그룹과 비교 요소가 많을 때 그룹별 차이를 효과적으로 나타내기 위해서 ‘히트맵 차트’ 이용.

  • 차트에서 각 행은 그룹에 해당하고 각 열은 요소에 해당하기 때문에 그룹을 기준으로 각 요소의 차이를 볼 수도, 요소를 기준으로 각 그룹의 차이를 볼 수도 있음.
  • 차트의 행/열/색상을 각각 다른 변수로 설정하여 세 변수간의 관계를 살필 수도 있고 차트의 열을 시간 흐름으로 설정하여 시간에 따른 변화를 파악할 수도 있음.

 

- 하나의 변수(그룹) X N개의 각 변수에 해당하는 값들

 

- 하나의 변수(그룹) X 하나의 변수(그룹/수준) X 하나의 변수(수준)

- 방사형 차트를 통해서도 비교 시각화를 할 수 있음

 

- 평행 좌표 그래프를 통해서도 비교 시각화 가능. 변수별로 값들을 특정 범위로 변환한다면 더욱 효과적으로 시각화 가능

 

 

- 비교 시각화 실습

시각화를 위해 5개의 팀과 5개의 칼럼을 선택 -> 각 칼럼에 대한 각 팀의 평균으로 데이터를 전처리.
팀별로 각 컬럼값에 대해 시각화

 

 

각 팀별로 나이대별 G값의 평균 데이터를 만들고 pivot( ) 함수를 사용해 팀과 나이로 행/열을 재배치

 

각 팀의 나이대별 G값을 히트맵으로 시각화. 흰색 부분은 NULL값을 의미.
방사형 차트를 사용하기 위해서는 먼저 인덱스를 초기화해주어야 함.
방사형 차트를 시각화 ->  angles 리스트에 각 칼럼의 등분선 각도를 저장하고 첫번째 원소를 마지막에 다시 추가해 시작점과 끝점을 연결 ->  이후에는 반복문을 사용하여 각 팀에 대해 시각화.

 

하나의 차트에 5개의 팀을 모두 표현할 수도 있음.

 

마지막으로 평행 좌표 그래프를 시각화

 


10-5. 분포 시각화

분포 시각화 : 데이터가 연속형 등의 양적 척도인지, 명목형 등의 질적 척도인지에 따라 구분하여 그림.

 

양적 척도의 경우 막대/선그래프, 혹은 히스토그램으로 나타낼 수 있음.

히스토그램 : 구간을 쪼게 동일한 면적의 막대그래프를 이어 그린 그래프. 처음에는 많은 구간으로 나누고 시각적인 정보의 손실이 커지기 전까지 구간의 개수를 줄여나가면서 그림.

 

질적 척도 중 변수의 구성이 단순한 경우에는 파이차트 혹은 도넛차트를 사용.

-> 이들은 구성 요소들의 분포 정도를 면적(혹은 각도)으로 표시. 비율을 수치로 같이 입력해 주는 것이 좋음.

 

질적 척도에서 구성 요소가 복잡한 경우에는 트리맵 차트 혹은 와플 차트를 이용.

  • 트리맵 차트 : 하나의 큰 사각형 속에 비율에 따라 구성 요소들이 작은 사각형으로 쪼게져 들어가는데, 구성 요소 안에서도 분류를 나누어 더 작은 사각형으로 위계구조를 나타낼 수 있음.(의류 매장에서 바지 품목 안에서 반바지와 긴바지로 한번더 나눌 수 있음).
  • 와플 차트 : 일정한 조각들로 분포를 표현하는데 위계구조를 표현하지는 못함.

 

 

- 분포 시각화 실습

시각화에 필요한 패키지들을 설치/임포트하고 데이터를 불러옴.

 

bin(구간)이 10개인 히스토그램을 시각화. x축: height_cm, y축: 샘플 개수

 

여성과 남성 그래프를 구분해서 따로 그림. alpha 매개변수로 투명도를 조절해 겹치는 부분을 효과적으로 표현할 수 있음.
파이차트와 도넛차트를 그리기 위해 데이터를 전처리. 국가별로 키 175 이상인 사람의 수를 추출
파이 차트로 키 175 이상인 사람 비율을 나라별로 시각화. 매개변수로 표현할 값, 그룹 기준(country), 시작 각도, 방향(시계 반대방향), 퍼센트 자릿수 등을 설정

 

 

도넛차트 : 파이차트와 동일하게 그리지만 차트 형태 옵션을 추가해 도넛 형태로 만들어줌.

 

트리맵 시각화를 위해 나라에 따른 성별별로 키 175 이상인 사람 수를 집계한 데이터를 만듦
트리맵을 출력. path 매개변수를 통해 위계구조 순서를 지정하여 먼저 성별에 따라 사각형을 나누고 그 안에서 다시 국가에 따라 사각형을 나눈 것을 볼 수 있음.
마지막으로는 와플 차트를 시각화. 작은 정사각형으로 각 국가의 비중이 표시된다.

 


 

10-6. 관계 시각화

산점도를 이용해 두 (연속형) 변수 간의 관계를 나타낼 때, 극단치가 있다면 이를 제거하고 그래프를 그리는 것이 좋음.

-> 아래와 같이 그래프에 큰 차이가 날 수 있기 때문.

 

산점도에서 데이터가 너무 많아 점끼리 겹쳐 정보를 확인하기 힘들 때 점들에 투명도를 주어 밀도를 함께 확인할 수 있음. 구간별로 빈도에 따라 농도나 색상을 달리하는 기법도 사용.

 

산점도에서는 두 변수 간 관계만 표현할 수 있지만 ‘버블 차트’에서는 세 변수(4개까지 가능하긴 함) 간 상관관계를 표현할 수 있음.

-> 버블의 크기(지름이 아닌 면적으로 반영)로 한 가지 요소를 추가로 표현하기 때문에 샘플이 너무 많을 때는 효과가 떨어짐.

-> 색상, 농도 등을 구분할 수도 있지만 그래프가 너무 복잡해지기 때문에 색상으로 그룹을 구분하는 정도로 충분함.

 

- 관계 시각화 실습

 

 

R&D 비용과 수익을 각각 x, y축으로 하여 산점도를 출력. ->  s 매개변수로 점 크기를 조절하고 alpha 매개변수로 투명도를 조절해 점이 겹치는 부분까지 효과적으로 파악할 수 있도록 함.
회귀선을 함께 표시해 데이터를 효과적으로 이해할 수도 있음
버블 차트 시각화. x축은 R&D 비용, y축은 이익, 버블의 크기는 마케팅 비용, 버블의 색은 관리 비용을 나타냄 (푸를수록 많고, 붉을수록 적은 비용)

 


 

10-7. 공간 시각화

위도와 경도 데이터를 지도에 표시하여 나타낼 수 있음(구글의 지오맵의 경우 지명만으로도 가능).

-> 인구 밀도 등의 집계 데이터도 지도 위에 표시해 유용하게 사용할 수 있음.

-> 지도를 확대하거나 위치를 옮기는 등의 행동도 가능.

 

- 대표적인 공간시각화 기법

  • 도트맵 : 특정 위치에 작은 점을 찍는 기법이며 데이터의 개요를 파악하기에 용이하지만 정확한 값을 나타낼 수는 없다는 단점이 있음.
  • 버블맵 : 도트맵에서 원의 크기로 데이터 값을 표시하는 기법
  • 코로폴리스맵 : 색상의 음영으로 구역의 데이터 크기를 나타내는 기법. 음영 뿐만 아니라 여러 색을 혼합할 수도 있고 투명도, 명도, 채도 등으로 다양하게 표현할 수 있음.
  • 커넥션맵 : 링크맵이라고도 하며 지도에 찍힌 점들을 직선 혹은 곡선으로 연결하는 기법. 여러 점을 한 선으로 연결해 경로를 표시할 수도 있음.

- 공간 시각화 실습

필요한 패키지를 임포트하고 파일 업로드. geo 변수에는 서울 각 구의 경계를 표현해 줄 수 있는 파일 업로드.
기본적으로 지도를 시각화하는 방법. tiles 매개변수로 지도의 형태를 다양하게 바꿀 수 있음.

 

CircleMarker( ) 함수로 지도의 원하는 위치에 원형 공간을 표시할 수 있고, Marker( ) 함수로 원하는 위치에 포인트 그림을 삽입할 수 있음.
스타벅스 위치 데이터를 지도 위에 시각화. MarkerCluster( ) 함수는 구역별로 스타벅스 지점의 수를 표시해줌. 지도를 확대/축소하면 집계 구역이 합쳐지고 쪼게지게 됨.
도트맵으로 스타벅스 지점 각각을 지도에 표시
버블맵 시각화를 위해 데이터 가공. gu_name 칼럼을 기준으로 위도/경도의 평균을 구해 각 구의 중심 지점을 만들고 각 구에 포함되는 매점 수를 구함
이전에 불러왔던 json 파일을 통해 구별로 경계선을 생성. CircleMaker( ) 함수로 버블을 표현했는데 radius에 매장 수 합계 칼럼인 name을 전달해 매장 수에 따라 버블이 커지도록 설정.

 

코로폴리스맵을 시각화하기 위해 새로운 데이터를 불러옴
지역별로 실업률을 시각화. columns에서 연동할 칼럼을 선택하고 key_on에서 json과 실업률 데이터를 연결할 키값을 설정
직접 시작점과 도착점의 위도, 경도를 입력하고 반복문으로 모든 경로를 시각화해 커넥션맵을 시각화

 


 

10-8. 박스 플롯

박스 플롯 : 하나의 그림으로 양적 척도 데이터의 분포, 편향성, 평균, 중앙값 등을 모두 확인할 수 있는 구조를 지님

 

- 박스 플롯에서 나타내는 수치

  • 최솟값 : 제1사분위에서 1.5 IQR을 뺀 위치까지의 최솟값
  • 제1사분위 : 25%의 위치
  • 제2사분위 : 50%의 위치(중앙값)
  • 제3사분위 : 75%의 위치
  • 최댓값 : 제3사분위에서 1.5 IQR을 더한 위치까지의 최댓값
  • IQR : 3사분위 수에서 1사분위 수를 뺀, 사분위수 범위

박스 플롯의 데이터 분포와 정규분포 비교

-> 박스 플롯의 박스 부분은 정규분포의 평균을 중심으로 좌우 1표준편차 안에 측정된 관측치 양과 비슷하고 양쪽 수염의 끝까지는 정규분포에서 평균의 좌우 3표준편차 안에 측정된 관측치 양과 유사하다는 것을 알 수 있음.

 

 

- 박스 슬롯 실습

Profit 컬럼에 대한 박스 플롯을 가로, 세로 형태로 각각 시각화

 

 

스타트업별로 각각 수익을 박스 플롯으로 나타냄.

 

평균값의 위치, 실제 데이터 포인트들을 추가로 나타낼 수 있음.