본문 바로가기
개발일지/matplotlib

python matplotlib 사용한 통계기초1 상관계수, 누적도표

by 다니엘의 개발 이야기 2022. 8. 26.
320x100

사실 해당 주제를 어디에 넣어야 할지 잘 모르겠더라.

여러가지 짬뽕되어있어서.

 

근데, 결과적으론 시각적으로 보이는게 되니깐 matplotlib 섹션에 누적하려고 한다.

 

import numpy as np
# precision은 소수점 자리를 말하는 거고
# suppress는 과학적 표기법을 의미한다.
np.set_printoptions(precision = 2, suppress = True)
# usecols = 1번 컬럼만 사용하겠다.
pop =np.loadtxt('SP500_pop.csv', delimiter = ',', usecols = 1)
pop

'''
array([ 4.69929763e-01,  1.14371386e-01, -4.10536897e-01,  4.61146607e-01,
        5.44394762e-01,  1.74318967e-01,  6.63205538e-01,  4.85810987e-01,
        3.07009306e-01,  7.02185527e-01,  2.25970807e-01, -1.22015334e-01,
        1.40202374e-01,  1.09321663e-01,  4.16430212e-01,  1.24475791e-01,
'''
# 실제로 csv파일에 내장되어있던 값들도 이런 값들이였다.
# 하지만 # np.set_printoptions(precision = 2, suppress = True)
# 를 거치고나서는 0.22 이런식으로 간결하게 값이 바뀌었다.
# 이걸 해주는 이유는 근본적으로 SP500_pop.csv의 1번컬럼 내용이 스탠다드 푸어스 500 상위 기업의 수익률을
# 표기해주는 것인데, 이것이 0.55 보다는 55% 라고 좀 더 가시적으로 와닿을 수 있도록 설정해주는 것이다.
pop = pop * 100
pop.size

# 500


## sample 2017 return for 50 companies

sample = np.loadtxt('sample.csv', delimiter = ',', usecols = 1)
sample

'''
array([ 0.42,  0.16,  0.48,  0.58, -0.03,  0.14,  0.17,  0.37,  0.34,
        0.07,  0.1 , -0.01,  0.49,  0.11,  0.95, -0.12,  0.05, -0.07,
        0.29,  0.71,  0.42,  0.38, -0.12,  0.24,  0.19,  0.25, -0.  ,
        0.89, -0.1 ,  0.2 ,  0.09,  0.38,  0.1 ,  0.19, -0.13,  0.15,
        0.24,  0.23, -0.09,  1.32,  0.12,  0.7 ,  0.36, -0.01,  0.5 ,
        0.26,  0.12, -0.09, -0.02,  0.7 ])
'''
sample = sample * 100

sample.size

# 50
for i in sample:
    print(i in pop)
    
'''
True
True
True
True
True
True
True
True
True
True
True
True
True
True
...

'''
# 벡터화

np.isin(sample, pop)

'''
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True])
'''


## Visualizing Frequency Distributions with plt.hist()

import numpy as np
import matplotlib.pyplot as plt
np.set_printoptions(precision = 2, suppress = True)
pop

'''

array([ 46.99,  11.44, -41.05,  46.11,  54.44,  17.43,  66.32,  48.58,
        30.7 ,  70.22,  22.6 , -12.2 ,  14.02,  10.93,  41.64,  12.45,
        16.85,  -6.8 ,  26.12, -22.11,  -8.77,  -3.83,   8.59,  21.79,
        -2.46,  48.57, 131.13, -17.15,  41.27,  24.31,  -2.26,  58.41,
        11.01,  -9.35,  49.12,  41.26,  18.94,  52.76,  35.  ,  55.96,
       143.44,  59.57,  56.51,  20.15,  29.42, -33.48,  14.09,  30.65,
'''
plt.figure(figsize = (14,10))
plt.hist(pop, bins = 75)
plt.title('Absolute Frequencies - Population', fontsize  =20)
plt.xlabel('Stock Returns 2017 (in %)', fontsize = 15)
plt.ylabel('Absolute Frequency', fontsize = 15)
plt.xticks(np.arange(-100, 401, 25))
plt.show()



## Relative and Cumulative Frequencies with plt.hist()

import numpy as np
import matplotlib.pyplot as plt
np.set_printoptions(precision = 4, suppress = True)
(np.ones(len(pop))/ len(pop))

'''
array([0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
       0.002, 0.002, 0.002, 0.002, 0.002])
'''
# 상대도수 그래프

plt.figure(figsize = (14,10))
plt.hist(pop, bins = 75, weights = np.ones(len(pop)) / len(pop))
plt.title('Relative Frequencies - Population', fontsize = 20)
plt.xlabel('Stock Returns 2017 (in %)', fontsize = 15)
plt.ylabel('Relative Frequency', fontsize = 15)
plt.show()

# y축의 값이 위의 상대도수 그래프와 비교해서 다르다.
plt.figure(figsize = (14,10))
plt.hist(pop, bins = 50, density = True)
plt.title('Relative Frequencies - Population', fontsize = 20)
plt.xlabel('Stock Returns 2017 (in %)', fontsize = 15)
plt.ylabel('Relative Frequency', fontsize = 15)
plt.show()

# 누적도수 그래프

plt.figure(figsize = (14,10))

# cumulative라는 뜻 자체가 '누적하는'이라는 뜻이다.
# density는 '밀도'
plt.hist(pop, bins = 50, density = False, cumulative = True)
plt.title('Cumulative Absolute Frequencies - Population', fontsize = 20)
plt.xlabel('Stock Returns 2017 (in %)', fontsize = 15)
plt.ylabel('Cumulative Absolute Frequency', fontsize = 15)
plt.show()

# 누적 상대도수 분포도
# 상대도수라서 최고 누적값이 1이 된다.

plt.figure(figsize = (14,10))
plt.hist(pop, bins = 50, density = True, cumulative = True)
plt.title('Cumulative Relative Frequencies - Population', fontsize = 20)
plt.xlabel('Stock Returns 2017 (in %)', fontsize = 15)
plt.ylabel('Cumulative Relative Frequency', fontsize = 15)
plt.show()

300x250