오늘은 통계학에 관해서 배우고 파이썬을 이용하여 프로그래밍을 하였다.

확률표본추출,,,,
모수 추정의 오차 : 표본통계량을 이용하여 모수를 추리하는 과정을 모수 추정이라한다.

표본오차 : 모집단을 완벽하게 대표할 수 있는 표본을 선택하지 못해서 나타남
편향과 우연에 의해 발생

편향 : 표본 통계랑이 일관성있게 한쪾 방향에 치우치는 것

변동 : 동일한 규모의 표본을 여러 번 추출한다고 했을 때, 각 표본에서 산출된 표본 통계랑들이 동일하지 않고 우연히 각기 다른 값을 갖는다. 이를 표본 변동이라 부른다.

우연에 의한 표본오차는 표본의 크기를 증가시킴으로써 감소 가능,
편향에 의한 오차는 단순 무작위 표본추출방법으로 해결 가능

표본분포 : 조금씩 차이나는거,,,? 표본 통계량과 모수가 어느 정도 차이가 나는지,,

확률분포 : 각각의 변수값에 대한 발생 확률을 나타내는것

함수의 형태로 볼 수 있다 => 확률분포함수

확률밀도함수 : 주어진 변량이 정해진 구간 안에 존재할 확률

중신극한정리 : ?

N (평균, 표준편차^2)

가설 : 연구 문제에 대한 최선의 예측 또는 잠정적인 해답으로 정의한다

대립가설
귀무가설
양측검정
단측검정

가설의 설정 : 대립 가설을 결정한다.
검정방법의 결정 : 가설 검정에 활용할 통계적 분포를 결정한다
유의 수준의 결정 : 유의수준이란 가설검정에서 용냡될 수 있는 오류의 정도를 의미한다.
검정통계량과 유의확률 계산
가설 채택여부 결정

파이썬을 이용한 데이터 분석

통계 처리와 scipy

import numpy as np
import scipy as sp

##소수점 이하 자릿수 
%precision 3

1변량 데이터 관리

fish_data = np.array([2,3,3,4,4,4,4,5,5,6])   # 물고기의 몸길이라는 1종류의 데이터 1변량 데이터
fish_data

합계와 샘플 사이즈

합계

sp.sum(fish_data)

넘파이로 합계구하기

np.sum(fish_data)

fish_data.sum()

sum(fish_data)

샘플사이즈 구하기

len(fish_data)

평균값

N = len(fish_data)
sum_value = sp.sum(fish_data)
mu = sum_value / N         # 데이터 총합 / 데이터 총 개수 = 평균
mu

sp.mean(fish_data)

fish_data

표본분산

sigma_2_sample = sp.sum((fish_data - mu) ** 2) / N    # 그림으로 설명하기 
sigma_2_sample

fish_data

fish_data - mu                     # mu = 4 

(fish_data - mu) ** 2

sp.sum((fish_data - mu) ** 2)    # 제곱의 총합 

sp.sum((fish_data - mu) ** 2) /10     # 제곱의 총합을 샘플 사이즈로 나누기 

sp.var(fish_data, ddof = 0)               # sp.var를 사용하면 분산을 쉽게 구할수 있다.
                                        # 분산은 데이터가 흩어진 정도를 나타냄 

불편분산

불편분산

sigma_2 = sp.sum((fish_data - mu) ** 2) / (N - 1)    #불편분산을 구할 시 n-1로 나누어 준다 
sigma_2

sp.var(fish_data, ddof = 1)    # ddof = 1 인 경우 불편분산추정량을 이용한 경우임 

sigma = sp.sqrt(sigma_2)        # 표준편차 : 분산 데이터 측정 단위 제곱으로 표시 , 
                                 # 표준편차는 원데이터와 같은 측정단위로 분석하여 루트 씌어줌 
sigma

sp.std(fish_data, ddof = 1)  # 불편분산에 루트값을 취해서 표준편차 구할시 ddof = 1 꼭 넣어주기 !!

fish_data

fish_data - mu   # 표준화 하는 방법 _ 노트 참조 하기     표준화 : x -평균 / 표준편차 

fish_data - mu/sigma

sp.mean(standard)   #표준정규분포 평균 0 

sp.std(standard, ddof = 1)  #표준정규분포 표준편차 1

fish_data

sp.amax(fish_data)   #최대값

sp.amin(fish_data)   #최소값

sp.median(fish_data)    #중앙값   (4+4)/2

fish_data_2 = np.array([2,3,3,4,4,4,4,5,5,100])

sp.mean(fish_data_2)

sp.median(fish_data_2) #(4+4)/2

from scipy import stats

fish_data_3 = np.array([1,2,3,4,5,6,7,8,9])
stats.scoreatpercentile(fish_data_3, 25)   # 사분위수 구하기 stats.scoreatpercentile  25% 

stats.scoreatpercentile(fish_data_3, 75)  # 사분위수 구하기 stats.scoreatpercentile  75%

stats.scoreatpercentile(fish_data_3, 50)

파이썬을 이용한 기술통계 : 다변량 데이터

import pandas as pd
import scipy as sp

%precision 3

fish_multi = pd.read_csv("3-2-1-fish_multi.csv")   # 물고기 종류별로 정리한 길이의 데이터 불러오기 
print(fish_multi)

group = fish_multi.groupby("species")     # groupby 함수 이용하여 그룹화 하고 평균 구하기 
print(group.mean())

print(group.std(ddof = 1))      # 표준편차 구하기 (ddof =1 불편분산 사용 )

group.describe()

shoes = pd.read_csv("3-2-2-shoes.csv")   # 구두 판매 데이터 불러오기  
print(shoes)

cross = pd.pivot_table(
    data = shoes,        #데이터 지정    
    values = "sales",    #데이터를 모을 열 지정                   
    aggfunc = "sum",     # 데이터를 모을 함수 지정
    index = "store",     # 인덱스 지정 지정
    columns = "color"    #컬럼 지정 
)
print(cross)

공분산

공분산은 2개의 연속형 변수의 관계성을 확인하는 통계량임

공분산이 0보다 클때 : 변수 한쪽이 큰 값을 갖게 되면 다른 한쪽도 커짐
공분산이 0보다 작을때 : 변수 한쪽이 큰 값을 갖게 되면 다른 한쪽은 작아짐
공분산이 0일때 : 변수 사이에 관계성이 없음
cov_data = pd.read_csv("3-2-3-cov.csv")    # Covariance 데이터 불러오기 
print(cov_data)

데이터 x,y로 분리하기

x = cov_data["x"]
y = cov_data["y"]

표본크기

N = len(cov_data)

평균값 계산하기

mu_x = sp.mean(x)
mu_y = sp.mean(y)

mu_x

mu_y

공분산 계산하기

cov_sample = sum((x - mu_x) * (y - mu_y)) / N
cov_sample

분모를 n-1로 설정하여 계산하기

cov = sum((x - mu_x) * (y - mu_y)) / (N - 1)
cov

scipy의.cov함수를 사용하면 공분산 쉽게 구할 수 있음

sp.cov(x, y, ddof = 1)

분산- 공분상 행렬함수 sp.cov(x, y, ddof = 0)

1행 1열 :x의 분산 2행 2열 : y의 분산, 1행2열, 2행 1열은 공분산 나옴

공분산이 0보다 크기 때문에 양의 상관관계가 있다고 볼 수 있음

분모를 n-1로 정의 할때

sp.cov(x, y, ddof = 1)

벡터와 행렬

import numpy as np

x = np.array([1,2,3,4,5])
y = np.array([-1,-2,-3,-4,-5])

x = np.array([1,2,3,4,5])
y = np.array([-1,-2,-3,-4,-5]) 
np.matmul(x.transpose(),y)     # x 전치행렬

np.matmul(x,y.transpose()) 

x*y    # 일반 곱셈 

np.multiply(x,y)  # 일반 곱셈 

전치행렬

A = np.matrix ([[1,2,3],[4,5,6]])
A

A.transpose()  

A.T

행렬의 덧셈, 뺄셈

a = np.array([[1,0],[0,1]])
              
b = np.array([[1,2],[3,4]])
    

a+b

a-b

행렬의 곱

a = np.array([[1,0],[0,1]])
              
b = np.array([[1,2],[3,4]])
    

a

b

a*b    #일반 곱셈

np.multiply(a,b)  #일반 곱셈

np.matmul(a,b)  #행렬 곱셈

np.dot(a,b)   #행렬 곱셈

a@b

대각행렬

np.eye(3)

np.eye(3).astype(int)

np.diag([1,2,3])

역행렬

정방행렬에 대해 역행력이 존재한다.

역행력을 AA-1 = A-1A = I 를 만족한다.
a = np.array([[1,2,3],[1,3,3],[1,2,4]])
a

inv = np.linalg.inv(a)  # 역행렬

inv

np.dot(a,inv)

배열만들기

fu = np.full((2,4),3)
fu

b = np.arange(24).reshape(4,3,2)   # 3x2 행렬 4개 

b

b[0, : , :] # 인덱스 0번째 

b[1, 1 , :]

b[1, 1 , 0]  # 67p 오류 

A = np.arange(6).reshape([2,3])

B = np.arange(12).reshape([3,4])

A

B

np.matmul(A,B)

np.dot(A,B)

A@B

A = np.arange(2*2*4).reshape([2,2,4])

B = np.arange(2*2*4).reshape([2,4,2])

A

B

np.matmul(A,B)     # 3차원 이상의 행렬곱을 수행할 경우 dot , matmul 결과다름

np.dot(A,B)

A

A = np.arange(6).reshape([2,3])     # dot은 행렬과 상수의 곱셈 허용

np.dot(A,2)

np.matmul(A,2)    #matmul 은 행렬과 상수의 곱 허용하지 않음 

matplotlib・seaborn을 이용한 데이터 시각화

파이썬을 이용한 데이터 시각화

import numpy as np
import pandas as pd

%precision 3

from matplotlib import pyplot as plt

%matplotlib inline

pyplot을 이용한 꺽은선 그래프

x = np.array([0,1,2,3,4,5,6,7,8,9])
y = np.array([2,3,4,3,5,4,6,7,4,8])

plt.plot(x, y, color = 'black')
plt.title("lineplot matplotlib")
plt.xlabel("x")
plt.ylabel("y")

seaborn + pyplot 꺽은선 그래프

import seaborn as sns
sns.set()

plt.plot(x, y, color = 'black')
plt.title("lineplot seaborn")
plt.xlabel("x")
plt.ylabel("y")

seaborn을 이용한 히스토그램

fish_data = np.array([2,3,3,4,4,4,4,5,5,6])
fish_data

sns.distplot(fish_data, bins = 5,   #distplot 히스토그램 
             color = 'black', kde = False)

sns.distplot(fish_data, bins = 5, 
             color = 'black', kde = True)   #kde = 커널 밀도 함수 

커널밀도추정에 따른 히스토그램 평활화

sns.distplot(fish_data, bins = 1, 
             color = 'black', kde = False)

sns.distplot(fish_data, color = 'red')

2변량 데이터에 대한 히스토그램

fish_multi = pd.read_csv("3-3-2-fish_multi_2.csv")
print(fish_multi)

print(fish_multi.groupby("species").describe())

length_a = fish_multi.query('species == "A"')["length"]  #query 함수로 데이터 필터링 loc, iloc대신 사용 
length_b = fish_multi.query('species == "B"')["length"]

length_a

length_b

sns.distplot(length_a, bins = 5, 
             color = 'red', kde = False)
sns.distplot(length_b, bins = 5, 
             color = 'gray', kde = False)

다변량 데이터를 시각화하는 코드작성

상자그림

sns.boxplot(x = "species", y  = "length", 
            data = fish_multi, color = 'gray')

fish_multi.groupby("species").describe()

sns.violinplot(x = "species", y  = "length",     #바이올린플롯
               data = fish_multi, color = 'gray')

sns.barplot(x = "species", y  = "length",            #막대그래프 
            data = fish_multi, color = 'gray')

cov_data = pd.read_csv("3-2-3-cov.csv")
print(cov_data)

sns.jointplot(x = "x", y = "y",  #jointplot 히스토그램, 산점도 
              data = cov_data, color = 'black')

seaborn에 내장되어 있는 붓꽃데이터 사용하기

iris = sns.load_dataset("iris")
iris.head(n = 3)

iris.groupby("species").mean()

페어플롯

sns.pairplot(iris, hue="species", palette='gray')

파이차트 그려보기

column명 넣기

activities = [ 'eat','sleep','work','play']

값 넣기

slices = [3,7,8,6]

색깔

colors =['r','y','g','b']

파이차트 그리기

plt.pie(slices, labels = activities, colors = colors,
              startangle = 90 ,shadow = True,
              explode = (0,0,0.1,0), radius = 1.5,
              autopct = '%1.2f%%') # 부채꼴에 표시될 숫자의 형식 소수점 한자리 


plt.show()

모집단에서 표본 추출 시뮬레이션

수치계산에 사용하는 라이브러리

import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats

그래프를 그리기 위한 라이브러리

from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

# 표시 자리수 지정
%precision 3
# 그래프를 주피터 노트북에 그리기 위한 설정 
%matplotlib inline

fish_5 = np.array([2,3,4,5,6]) # 5마리 물고리 예시 
fish_5

random choice 함수 사용하여 랜덤으로 뽑기 size =1 이라고 하면 샘플사이즈 1이 됨

replace = False 하면 같은 물고기를 2번이상 선택하지 않음 즉 복원추출하님

np.random.choice(fish_5, size = 1, replace = False)

3마리 샘플링

np.random.choice(fish_5, size = 3, replace = False)

np.random.choice(fish_5, size = 3, replace = False)

np.random.seed(1)
np.random.choice(fish_5, size = 3, replace = False)

np.random.seed(1)   #난수 seed 사용하여 추출 
np.random.choice(fish_5, size = 3, replace = False)

np.random.seed(1)   #난수 seed의 인수가 같으면 랜덤값을 출력해도 같은 값이 나옴 
np.random.choice(fish_5, size = 3, replace = False)

np.random.seed(3)   #난수 seed 사용하여 추출 
np.random.choice(fish_5, size = 3, replace = False)

np.random.seed(3)   #난수 seed 사용하여 추출 
np.random.choice(fish_5, size = 3, replace = False)

모집단에서 표본을 추출하여 평균을 구함 이것을 표본평균이라고 함.

np.random.seed(1)
sp.mean(
    np.random.choice(fish_5, size = 3, replace = False)
)

fish_100000 = pd.read_csv(
    "3-4-1-fish_length_100000.csv")["length"]
fish_100000

len(fish_100000)  #호수에 있는 물고기의 수는 100,000

10마리 뽑아서 샘플링 하기

sampling_result = np.random.choice(
    fish_100000, size = 10, replace = False)
sampling_result

표본평균구하기

sp.mean(sampling_result)

모집단의 평균 구하기

sp.mean(fish_100000)

모표준편차 구하기

sp.std(fish_100000, ddof = 0)

모분산구하기

sp.var(fish_100000, ddof = 0)

모집단의 히스토그램 그려보기 몸길이 평균 4센티를 중심으로 좌우대칭인 도수분포표이다

sns.distplot(fish_100000, kde = False, color = 'black')

모집단분포와 정규분포간 확률밀도 함수 비교

1에서 7범위에 평균4, 분산 0.64인 정규분포의 확률밀도 그려보기

x = np.arange(start = 1, stop = 7.1, step = 0.1)
x

stats.norm.pdf(x = x, loc = 4, scale = 0.8) #stats.norm.pdf 사용 loc= 평균값, scale = 표준편차 

plt.plot(x,                                             # 위 값을 가지고 확률밀도 그려보기 
          stats.norm.pdf(x = x, loc = 4, scale = 0.8), 
          color = 'black')

x = np.arange(start = 0, stop = 100, step = 0.1)
x

plt.plot(x,                                             # 위 값을 가지고 확률밀도 그려보기 
          stats.norm.pdf(x = x, loc = 4, scale = 0.8), 
          color = 'black')

## pdf() missing 1 required positional argument: 'x'



plt.plot(x,                                             # 위 값을 가지고 확률밀도 그려보기 
         stats.norm.pdf(x = x, loc = 4, scale = 0.8), 
         color = 'black')

sns.distplot(fish_100000, kde = False,           #정규분포의 확률밀도와 모집단의 히스토그램 겹쳐보기 
             norm_hist = True, color = 'black')   #  norm_hist = True 면적이 1이 되는 히스토그램 
plt.plot(x, 
         stats.norm.pdf(x = x, loc = 4, scale = 0.8), 
         color = 'black')

앞으로 난수 생성시 모집단에서 표본을 추출하지 않고 정규분포를 따르는 난수 생성함수를 사용함

stats.norm.rvs 난수 생성 함수

sampling_norm = stats.norm.rvs(
    loc = 4, scale = 0.8, size = 10)
sampling_norm

sp.mean(sampling_norm)

fish_100000은 몸길이 4센티 전후의 물고기 수가 많은 특징이 히스토그램에 나타남

랜덤 샘플링 하면 역시 4센티 전후의 몸길이를 가진 물고기가 걸리기 쉬움

이와 같이 4센티 전후 몸길이를 가진 물고기가 걸리기 쉽다는 것은

4센티 전후의 확률밀도가 높은 정규분포의 확률분포라고 표현할 수 있다.

x = np.random.normal(size =100)   # 표준정규분포를 따르는 랜덤 데이터 100개 발생하고 히스토그램그리기 
sns.displot(x)

x = np.random.normal(size =200)
sns.displot(x)

x = np.random.normal(size =1000)
sns.displot(x)

plt.hist(x,bins=10, color="green")

x = np.random.normal(size =100)
plt.boxplot(x)
plt.show

x = np.random.normal(size =1000)
plt.boxplot(x)
plt.show

N(3,5**2) 을 따르는 랜덤 데이터 20개 추출 = data

  1. data의 값을 출력하고
  2. 평균과 표준편차 구하고
  3. 히스토그램 그리기
profile
smilegate megaport infra

0개의 댓글