Patrick's 데이터 세상

Python 데이터 분석 - 통계분석 기초 본문

Data Analysis/EDA

Python 데이터 분석 - 통계분석 기초

patrick610 2020. 6. 24. 22:06
반응형
SMALL

환경 설정

source activate pyshpark
jupyter lab --notebook-dir=/Users/sunghwanpark/Desktop/shpark/Development/Python/GottAcademy/AcademyPractice/workspace/nb-workspace

 

 

◎ NumPy를 활용한 통계 기초 분석

import numpy as np
import scipy as sp # 과학 계산용 파이썬 모듈
import scipy.stats as stats
import pandas as pd
x = [1, 2, 10, 43, 22, 87, 52, 11, 8, 36]
print(len(x)) # 갯수
print(np.mean(x)) # 평균
print(np.var(x)) # 분산
print(np.std(x)) # 표준 편차
print(np.max(x)) # 최댓값
print(np.min(x)) # 최솟값
print(np.median(x)) # 중앙값
print(np.percentile(x, 25)) # 1사분위 수
print(np.percentile(x, 50)) # 2사분위 수
print(np.percentile(x, 75)) # 3사분위 수

결과

 

 

x = [3, 5, 8, 11, 13]
y = [1, 2, 3, 4, 5]

np.corrcoef(x, y)

결과



◎ Scipy를 활용한 통계 기초 분석

print(stats.describe(x))
print()

s = pd.Series(x)
print(s.describe())

결과

 

 


◎ scikit-learn를 활용한 통계 기초 분석

!pip install scikit-learn
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris() # 붓꽃 품종 분류 데이터 로딩
print(iris.keys())
iris['data'][:10]
iris['target'][-10:]
iris['DESCR']
iris['feature_names']

결과

 

 

iris_df = pd.DataFrame(iris.data, 
                       columns=iris.feature_names)
iris_df['species'] = iris.target
iris_df.head()

결과

 

 

correlation_matrix = iris_df.corr() # 상관계수 계산
correlation_matrix

결과

 

 

import matplotlib.pyplot as plt
import seaborn as sns
ax = sns.heatmap(correlation_matrix, annot=True)
ylim = ax.get_ylim() # y축 범위
ax.set_ylim(ylim[0] + 0.5, ylim[1] - 0.5)
plt.show()

결과

 

◎ Pearson, Spearman 상관계수

Pearson 및 Spearman 상관 계수는 -1에서 +1 범위의 값입니다. Pearson 상관 계수가 +1이 되도록 하기 위해 한 변수가 증가하면 다른 변수가 일정한 양만큼 증가합니다. 이 관계는 완전한 선을 형성합니다. 이 경우 Spearman 상관 계수도 +1입니다.

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = x ** 2
print(stats.pearsonr(x, y))
print(stats.spearmanr(x, y))

결과


부동소수점 계산

print(format(6.646897422032013e-64, '.150f'))

결과

 


◎ Pearson, Kendal 상관계수

Pearson Correlation Coefficient : 수축기 혈압과 이완기 혈압, 키와 몸무게와 같이 분석하고자 하는 두 변수가 모두 연속형 자료일 때 두 변수간 선형적인 상관관계의 크기를 모수적(Parametric)인 방법으로 나타내는 값

Spearman Correlation Coefficient : 상관관계를 분석하고자 하는 두 연속형 변수의 분포가 심각하게 정규 분포(Normal Distribution)를 벗어난다거나 또는 두 변수가 순위 척도(Ordinal Scale) 자료일 때 사용하는 값. 연속형 자료일 때는 각 측정값을 순위 척도 자료로 변환시켜 계산.
스피어만 상관 계수는 피어슨 상관 계수와는 달리 선형적인 상관 관계를 나타내지 않고 단순히 한 변수가 증가할 때 다른 변수가 증가하는지 감소하는지에 대한 관계만을 나타낸다. 켄달 상관계수와 함께 대표적인 비모수적(Non-Parametric) 상관 계수.

Kendal Correlation Coefficient : 스피어만 상관 계수와 비슷한 방식으로 순위 척도 자료 또는 순위 척도로 변환한 자료를 이용해 두 변수간 상관 계수의 크기를 나타내는 값.

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = x ** 2
print(sp.stats.pearsonr(x, y))
print(sp.stats.kendalltau(x, y))

결과

 

 

corr_values, pval = stats.pearsonr(iris_df.iloc[:, 0], iris_df.iloc[:, 4])
print(corr_values)
print(format(pval, '.150f'))

결과

 

 

rho, pval = stats.spearmanr(iris_df.iloc[:, 0], iris_df.iloc[:, 4])
print(rho)
print(format(pval, '.150f'))

결과

 

 

◎ Bernoulli 분포

베르누이 시행은 임의의 결과가 '성공', '실패'의 두 가지 중 하나인 실험.

N = 10 # 시행횟수
mu_0 = 0.5 # 평균
np.random.seed(0)
x = stats.bernoulli(mu_0).rvs(N) # 난수 발생
n = np.count_nonzero(x) # 0이 아닌 데이터 갯수
print(n)

결과

7

 

◎ Bernoulli 이항 검정

p_value = sp.stats.binom_test(n, N)
print(format(p_value, '.53f'))

결과

 


◎ 카이제곱 검정

카테고리 분포의 모수에 대해 검정을 표본의 합을 이용할 수 없다.
해당 통계량은 스칼라가 아닌 벡터 값을 지니기 때문이다.
이 때는 카이제곱검정(Chi-squared test)이라는 방법을 사용한다.

obs = np.array([[5, 15], [10, 20]])
obs

결과

 

 

chi2, p_value, dof, expected = stats.chi2_contingency(obs)
print(chi2, p_value)

결과

 

 

obs = np.array([[4, 16, 20], [23, 18, 19]])
obs

결과

 

 

chi2, p_value, dof, expected = sp.stats.chi2_contingency(obs)
print(chi2, p_value, dof)

결과

 

 

◎ 정규성 검정

회귀 분석 등에서는 확률분포가 가우시안 정규분포를 따르는지 아닌지를 확인하는 것이 중요하다. 이러한 검정을 정규성검정(normality test)이라고 한다. 정규성분포는 중요한 만큼 다양한 검정 방법들이 개발되어 있으며 사이파이 패키지 이외에 통계분석에 많이 사용되는 스탯츠 모델즈(StatsModels) 패키지도 다양한 정규성 검정 명령어를 제공한다.

 

N = 25
mu_0 = 72
np.random.seed(0)
x = stats.norm(mu_0).rvs(N) # 평균 0인 정규분포에서 10개의 난수 발생
print(x)
print(np.mean(x))
# sns.distplot(x, kde=False, fit=stats.norm)
# plt.show()

결과

 

 

◎ 단일표본 t-검정

단일 표본 t검정(One-sample t-test)은 정규분포의 표본에 대해 기댓값을 조사하는 검정방법이다. 검정 통계량으로 스튜던트 t분포를 가진 t통계량을 사용한다.

더보기

𝑥¯𝜇0𝑠𝑁(9.5.2)(9.5.2)x¯−μ0sN

𝑥¯𝜇0𝑠𝑁(9.5.2)(9.5.2)x¯−μ0sN

이 식에서 𝑥¯ 표본 평균,𝑠s는 표본표준편차다.

사이파이의 stats 서브 패키지의 ttest_1samp 명령을 사용한다. ttest_1samp 명령의 경우에는 디폴트 모수가 없으므로 기댓값을 나타내는 popmean 인수를 직접 지정해야 한다.

scipy.stats.ttest_1samp(a, popmean)

  • a: 표본 데이터 배열
  • popmean: 귀무가설의 기댓값

 

stats.ttest_1samp(x, popmean=72) # x가 평균 0인 모집단에서 추출된 표본인지 검정

결과

 

 

N_1 = 10 # 표본갯수
mu_1 = 0 # 평균
sigma_1 = 1 # 표준편차
N_2 = 10
mu_2 = 0.5
sigma_2 = 1
np.random.seed(0)
x1 = sp.stats.norm(mu_1, sigma_1).rvs(N_1)
x2 = sp.stats.norm(mu_2, sigma_2).rvs(N_2)

print(np.mean(x1), np.mean(x2))

sns.distplot(x1, kde=False, fit=sp.stats.norm)
sns.distplot(x2, kde=False, fit=sp.stats.norm)
plt.show()

결과

 

 

sp.stats.ttest_ind(x1, x2, equal_var=False)

결과

 

 

N = 5
mu_1 = 0
mu_2 = 0.4
np.random.seed(1)
x1 = sp.stats.norm(mu_1).rvs(N)
x2 = x1 + sp.stats.norm(mu_2, 0.1).rvs(N)
x1, x2, (x2 - x1)

결과

 

sp.stats.ttest_rel(x1, x2)

결과

 

 

 

 

 

학습 참고 블로그 : https://datascienceschool.net/view-notebook/14bde0cc05514b2cae2088805ef9ed52/

 

Data Science School

Data Science School is an open space!

datascienceschool.net

 

반응형
LIST
Comments