본문 바로가기
마케팅 정보방/비밀 공부방

데이터 과학을 위한 통계 Part 1

by 그로스마케터 제시 2022. 3. 16.
반응형

데이터 분석을 위해서는 통계 지식이 필수라 하여, 요즘 통계학에 관심이 많아졌다.
그러던 중, 통계 지식을 파이썬에 응용하는 방법도 알려주는 좋은 책을 발견하여 이 책으로 공부하기로 했다!
아직 1강만 봤지만 기초 지식도 잘 설명되어 있을 뿐만 아니라, 코드도 알려줘서 넘 좋다:)
앞으로 완독까지 화이팅!!

Part 1. 탐색적 데이터 분석 (EDA)

정형화: 가공 안한 데이터를 활용 가능한 데이터로. 테이블 형태가 기본. 
 
수치형 데이터 (숫자로 표현) : 연속형 (풍속, 지속시간 등), 이산형 (횟수 같은 정수값)
범주형 데이터 (가능 범주 안의 값) : 이진형 (모아니면도), 순서형 (값들 사이에 순서가 있음) 
 
테이블에서의 
각 열: feature 
각 행: record
*응답변수/ 종속변수 예측 모델에서 예측 변수 사용한다 = 목표(target) 예측에 feature을 사용한다. 
 
시계열 데이터: 동일한 변수 안에서 연속적인 측정값을 가진다. 
공간 데이터: 객체 표현 (객체와 공간 좌표가 데이터의 중심) + 필드 정보 (공간 나타내는 작은 단위들과 적당한 측정 기준값에 중점)
그래프 데이터: 물리적 관계, 사회적 관계, 추상적인 관계 등에 쓰임 -> 네트워크 최적화, 추천 시스템
 

<위치 추정>

 = 데이터의 특징 요약
데이터를 살펴보는 기초 단계: 각 피처의 대푯값 구하기 -> 대부분의 값이 어디쯤 위치하는지 (중심경향성) 나타냄
 
robust 하다 = 극단값들에 민감하지 않다 (저항성이 있다)
이상 검출(anomaly detection): outlier이 주 관심 대상
 
데이터로부터 계산된 값들 = 추정값(estimate), 측정지표(metric)
평균(mean), 절사평균(trimmed mean), 가중평균(weighted mean), 중간값(median), 가중 중간값(weighted median)
 
-Python code

state = pd.read_csv('state.csv')
state['population'].mean     #평균 구하기
trim_mean(state['population'], 0.1)  #10% 잘라낸 절사평균 구하기
state['popultation'].median()  #중간값 구하기

np.average(state['MurderRate'], weights = state['population']) #가중평균 구하기
wquantiles.median(state['MurderRate'], weights = state['population']) #가중중간값 구하기

 

<변이 추정>

변이(variability): 데이터 값이 얼마나 밀집했냐 등을 산포도(dispersion)로 나타냄
 
편차(deviation), 분산(variance), 표준편차(standard deviation), 평균절대편차(mean absolute deviation),
중간값의 중위절대편차(mean absolute deviation from median=MAD) -> robust 함
순서통계량(order statistics): 최소~ 최대 정렬된 데이터 값에 따른 계량형
백분위수(percentile), 사분위범위(IQR): 75번째 백분위수와 25번째 백분위수 사이의 차이
 
분산, 표준편차, 표준절대편차 모두 특잇값에 민감. (MAD는 로버스트)
크기: 중위 절대편차 < 평균 절대편차 < 표준편차
 
순서통계량은 특잇값에 민감하여, 백분위수 사이의 차이로 추정
데이터 집합 클 경우, 백분위 수의 근삿값 사용
 
-python code

state['population'].std()  #표준편차
state['population'].quantile(0.75) - state['population'].quantile(0.25)  #IQR
robust.scale.mad(state['population'])  #MAD

 

<데이터 분포 탐색>

1. percentile & boxplot

전체 분포 알아보는 데에도 백분위 수 유용하며, 꼬리부분 묘사에 제격 (ex. 상위 1%)

state['MurderRate'].quantile([0.05,0.25,0.5,0.75,0.95])  #백분위수

#box plot으로 주별 인구 계산하기
ax = (state['population']/1_000_000).plot.box()
ax.set_ylabel('poluration-millions')

 

2. frequency table & histogram

도수분포표: 변수의 범위를 동일한 크기의 구간으로 나누고, 각 구간마다 몇 개의 변수값이 존재하는지 보여줌
히스토그램: 빈 구간 존재 가능하며, 사용자가 구간의 수/크기 결정 가능
커널밀도추정: 분포를 연속된 선으로 보여주는 부드러운 히스토그램 (밀도그램의 y축은 개수가 아닌 비율) 

#주별 인구 도수분포표
binnedP = pd.cut(state['population'], 10) 
binnedP.value_counts()  #빈도 테이블 구하기

#히스토그램
ax = (state['population']/1_000_000).plot.hist(figsize=(4,4))

#커널밀도추정
ax = state['MurderRate'].plot.hist(density=True, xlim=[0.12], bins=range(1,12))
state['MurderRate'].plot.density(ax=ax)  #플롯이 동일한 그래프에 추가되도록 함

*통계학 용어
분포의 일차 모먼트: 위치
분포의 이차 모먼트: 변이
분포의 삼차 모먼트: 왜도 (얼마나 비스듬히 쏠려있나)
분포의 사차 모먼트: 첨도 (데이터가 극단값을 갖는 경향성)

 

<이진 데이터와범주 데이터 탐색>

*최빈값(mode): 데이터에 가장 자주 등장하는 범주/값
*기댓값(expected value): 범주에 해당하는 수치가 있을 때, 범주의 출현 확률에 따른 평균. 가중치가 해당 확률이 되는 가중평균. 결과값x발생 확률의 값. 미래의 기댓값과 각 확률 가중치 만큼을 모두 더한 값 (ex. 5년간의 수익에 대한 기댓값) 
*범주 : 전혀 다른 집합(남여), 정도를 나타내는 요인 변수의 수준(낮음,중간,높음), 구간별로 나뉜 수치 데이터 같은 것들
 
이진변수 -> 1같이 중요한 범주의 비율 알아보면 됨

막대 도표 x축은 각 요인변수의 서로 다른 범주를 나타냄 막대 떨어져있음
히스토그램 x축은 수치적으로 나타낼 수 있는 하나의 변수 값 막대 붙어있음

 
*수치형 -> 번주형: 데이터 복잡도를 줄여주고, feature들 사이의 관계 파악에 용이. 
 

<상관 관계>

*상관계수(correlation coefficient) : 수치적 변수들 간에 어떤 관계가 있는지 나타내기 위해 사용되는 측정량 (-1~+1)
*상관행렬(correlation metrix): 행과 열이 변수들을 의미하는 표. 각 셀은 그 행과 열에 해당하는 변수들 간의 상관관계를 나타냄. (seaborn.heatmap 패키지 사용) 
*산점도(scatter plot): x축과 y축이 서로 다른 두 개의 변수를 나타내는 도표. 두 변수 사이의 관계를 시각화함
 
상관계수 -> 두 변수 사이의 상관관계를 항상 같은 척도에 놓고 추정함. 선형적인 상관관계를 갖지 않으면 유용하지 않음. 특이값에 민감함. 
ex. 세율&세수입: 세율이 일정 수준 이상 높아지면, 과세 회피 때문에 세수입은 낮아지게 됨. 
 
 
<두개 이상의 변수 탐색>
*일변량 분석(univariate analysis): 평균, 분산 같이 익숙한 추정값들은 한번에 하나의 변수를 다룸
*상관분석은 두 변수 비교(이변량 분석: bivariate analysis)에 중요
* 셋 이상 변수 -> 다변량 분석 (multivariate analysis) 
 
*분할표(contingency table): 두 가지 이상의 범주형 변수의 빈도수를 기록한 표 
*육각형 구간(hexagonal binning): 두 변수를 육각형 모양의 구간으로 나눔
*등고도표(contour plot): 두 변수의 밀도를 등고선으로 나타냄 (kdeplot)
*바이올린 도표(violin plot): 밀도 추정을 함께 보여줌
 
1. 육각형 구간 & 등고선 (수치형 변수와 수치형 변수)

#이상치 제거 .loc
kc_tax0 = kc_tax.loc[(kc_tax.value1<70000)&(kc_tax.value2>100),:]

#육각형 그림 그리기 hexbin
ax = kc_tax0.plot.hexbin(x='value1',y='value2',gridsize=30,sharex=False,figsize=(4,4))

2. 범주형 변수와 범주형 변수
분할표: 범주별 빈도수를 기록한 표 (각 열의 빈도수나 전체 백분율 볼 수 있음)
 
3. 범주형 변수와 수치형 변수
->상자그림. 

*by = 데이터 집합을 그룹별로 분할하여 각 그룹의 상자그림 생성

->바이올린도표
상자그림을 보완한 형태로, y축을 밀도추정 결과와 동시에 시각화. 상자그림에도 볼 수 없던 데이터의 분포를 볼 수 있고, 특잇값이 명확하다. 
 
<조건화>
-> 두 변수 비교용 도표(산점도, 육각형, 상자그림) 을 더 여러 변수로 비교하는 용도로 확장 가능
 
 

반응형

댓글