pbj0812의 코딩 일기

[통계학] 산술평균, 기하평균, 조화평균 python, sql 로 구현하기 본문

Science/통계학

[통계학] 산술평균, 기하평균, 조화평균 python, sql 로 구현하기

pbj0812 2023. 2. 27. 01:03

0. 목표

 - 산술평균, 기하평균, 조화평균 python, sql 로 구현하기

1. python 으로 구현하기

 1) 산술평균 : 3.0

  - 흔히 아는 평균, 상가평균

x = [1, 2, 3, 4, 5]

mean_x = sum(x) / len(x)

print(mean_x)

 2) 기하평균 : 2.605171084697352

  - 성장율, 이율의 평균을 구할 때 상용, 상승평균

x = [1, 2, 3, 4, 5]

result = 1
for i in x:
    result = result * i

mean_x2 = result ** (1/len(x))

print(mean_x2)

 3) 조화평균 : 2.18978102189781

  - 속도나 전기저항의 평균값 계산에 이용

  - 산술평균 >= 기하평균 >= 조화평균

x = [1, 2, 3, 4, 5]

result = 0
for i in x:
    result += 1/i

mean_x3 = len(x) / result

print(mean_x3)

2. MySQL 로 구현

 0) 데이터 생성

CREATE TABLE sql_study.avg_test
(
	id int,
	x int
);

INSERT INTO sql_study.avg_test(id, x) VALUES(1, 1);
INSERT INTO sql_study.avg_test(id, x) VALUES(2, 2);
INSERT INTO sql_study.avg_test(id, x) VALUES(3, 3);
INSERT INTO sql_study.avg_test(id, x) VALUES(4, 4);
INSERT INTO sql_study.avg_test(id, x) VALUES(5, 5);

 1) 산술평균 : 3.0000 

WITH mean AS (
	SELECT
		SUM(x) / COUNT(x) AS mean_x
        
	FROM sql_study.avg_test
)

SELECT * FROM mean;

 2) 기하평균 : 2.605171084697352

WITH RECURSIVE mean AS (
	SELECT 
		id,
        x 
	FROM sql_study.avg_test
    WHERE 1 = 1
		AND id = 1
        
	UNION ALL
    
    SELECT 
		t.id,
        m.x * t.x AS x
	FROM mean AS m
    
    INNER JOIN sql_study.avg_test AS t 
	ON t.id = m.id + 1	
),

final AS (
	SELECT 
		POW(x, 1/(SELECT MAX(id) FROM mean)) AS mean_x3
    
    FROM mean
    
    WHERE 1 = 1
		AND id = (SELECT MAX(id) FROM mean)
)

SELECT * FROM final;

 3) 조화평균 : 2.1898

WITH mean AS (
	SELECT 
		COUNT(x) / SUM(1/x) AS mean_x2
       
    FROM sql_study.avg_test
)

SELECT * FROM mean;

2. 참고

 - 통계학 도감(쿠리하라 신이치, 마루야마 아츠시 지음)

Comments