통계 함수 만들기
중심 경향성 : 평균, 중앙값, 분위수(4분위, 100분위=퍼센트), 최빈값,
산포도 : 분산(variance), 표준편차(standard deviation), 범위(range)
상관 관계 : 공분산(Covariance), 상관계수(Correlation)
def mean(x):
"""
리스트 x의 모든 아이템들의 평균을 계산해서 리턴
x = [x1, x2, ..., xn]
mean = (x1 + x2 + ... + xn) / n
:param x: 원소 n개인 (1차원) 리스트
:return: 평균
"""
return sum(x) / len(x)
def median(x):
"""
리스트 x를 정렬했을 때 중앙에 있는 값을 찾아서 리턴
n이 홀수이면, 중앙값을 찾아서 리턴
n이 짝수이면, 중앙에 있는 두 개 값의 평균을 리턴
:param x: 원소 n개인 (1차원) 리스트
:return: 중앙값
"""
n = len(x) # 리스트의 아이템 개수
sorted_x = sorted(x) # 데이터 크기 순으로 정렬(오름차순)
mid_point = n // 2 # 리스트의 가운데 위치(인덱스)
if n % 2: # n이 홀수인 경우
median_value = sorted_x[mid_point]
else: # n이 짝수인 경우
median_value = (sorted_x[mid_point - 1] +
sorted_x[mid_point]) / 2
return median_value
def quantile(x, p):
"""
리스트 x의 p분위에 속하는 값을 찾아서 리턴
:param x: 원소 n개인 (1차원) 리스트
:param p: 0 ~ 1.0 사이의 값
:return: 해당 분위수의 값
"""
n = len(x) # 리스트의 아이템 개수
p_index = int(n * p) # 해당 퍼센트의 인덱스 - 소수점 버리기
sorted_x = sorted(x) # 오름차순 정렬된 리스트
return sorted_x[p_index]
if __name__ == '__main__':
data = [2, 2, 3, 3, 4, 4, 4, 6, 6, 6, 100]
mean_data = mean(data)
print(mean_data)
median_data = median(data)
print(median_data)
quantile_1 = quantile(data, 0.25) # 1사분위 값
print(quantile_1)
from collections import Counter
def mode(x):
"""
리스트에서 가장 자주 나타나는 값을 return.
최빈값이 여러개인 경우, 최빈값들의 리스트를 리턴.
:param x: 원소가 n개인 (1차원) 리스트
:return: 최빈값들의 리스트를 return
"""
counts = Counter(x) # Counter 객체(인스턴스) 생성
print(counts)
print(counts.keys(), counts.values())
# Counter.keys(): 데이터(아이템), Counter.values(): 빈도수
print(counts.items()) # (값, 빈도수) 튜플들의 리스트
max_count = max(counts.values()) # 빈도수의 최대값
freq = [] # 최빈값들을 저장할 리스트
for val, cnt in counts.items(): # Counter 객체에 대해서 반복
if cnt == max_count: # 빈도수가 최대 빈도수와 같으면
freq.append(val) # 리스트에 저장
return freq
>> list comprehension
return [val for val, cnt in counts.items()
if cnt == max_count]
def data_range(x):
"""
:param x: 원소 n개인 (1차원) 리스트
:return: 리스트의 최댓값 - 리스트의 최솟값
"""
return max(x) - min(x)
def variance(x):
"""
:param x: 원소가 n개인 (1차원) 리스트
:return: 분산
"""
# 편차 제곱합 / (n-1)
avg = mean(x)
var_sum = 0
for i in x:
var_sum += (i - avg) ** 2
return var_sum / (len(x) - 1)
def standard_deviation(x):
"""
sqrt(variance)
:param x: 원소가 n개인 (1차원) 리스트
:return: 표준편차
"""
# from math import sqrt
return sqrt(variance(x))
print(data_range(data))
print(variance(data))
print(standard_deviation(data))
def covariance(x, y):
"""
공분산(covariance)
Cov = sum((xi - x_bar)(yi - y_bar)) / (n - 1)
:param x: 원소 n개인 (1차원) 리스트
:param y: 원소 n개인 (1차원) 리스트
:return: 공분산
"""
avg_x = mean(x)
avg_y = mean(y)
cov_sum = 0
n = len(x)
for i, j in zip(x, y):
cov_sum += (i-avg_x)*(j-avg_y)
return cov_sum/(n-1)
def correlation(x, y):
"""
상관 계수(correlation)
Corr = Cov(x, y) / (SD(x) * SD(y))
:param x: 원소 n개인 (1차원) 리스트
:param y: 원소 n개인 (1차원) 리스트
:return: 상관 계수
"""
return covariance(x, y)/ (standard_deviation(x)*standard_deviation(y))
a = [1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6]
b = [2, 3, 3, 3, 5, 5, 6, 4, 5, 6, 6, 9, 8]
covariance = 3.0
correlation = 0.8872934799862829