main_02_ksg
Signal Processing + Statistics 중심의 Octave 학습 예제
ex-recv/02/02_ksg/main_02_ksg.m
전체 코드
전체 코드를 복사해서 Octave에서 바로 실행할 수 있습니다.
################################################################################
% 데이터의 통계치(평균, 분산, 표준편차, rms)를 사용자정의함수와 내장함수 간 결과 비교
% 2025-03-26 / 김상곤
################################################################################
clc;clear;close all
pkg load signal
# 입력 변수 준비1 : csv파일 읽기 & 원하는 종류의 1년치 데이터 선정
filename = 'google_data_2024.csv';
data = read_custom_csv(filename); % 파일 불러오기
data_class = {'Close','High','Low','Open','Volume'}; % 데이터 분류
i_class = 1;
selected_data = data.(data_class{i_class}); % 데이터 분류 선택 (N, 1)
numeric_data = str2double(selected_data); % 문자열 > 숫자로 변환
filtered_data = numeric_data(~isnan(numeric_data)); % 숫자가 아닌 값 필터링 (N, 1)
# 입력 변수 준비2 : 30일 단위 분할 데이터 세트 만들기
i_start = 30; % 데이터 시작일
duration = 30; % 데이터 기간 선정 : 30일
data_sets = partitioning_data(filtered_data,i_start,duration); # (30, 220)
################################################################################
# 연산 실행1 : 1년치 데이터의 통계치 비교 (사용자정의함수 <-> 내장함수)
[m,v,s,r] = statistic_value(filtered_data); % User-defined Function
M = mean(filtered_data); % Built-in Function
V = std(filtered_data).^2;
S = std(filtered_data);
R = rms(filtered_data);
# 연산 실행2 : 30일 단위 데이터 세트 통계치
[m30,v30,s30,r30] = statistic_value(data_sets); # in (30, 220) out (1, 220) * 4
################################################################################
# 플로팅 변수 준비1 : 1년치 데이터 통계치 (사용자정의함수 <-> 내장함수)
value_UDF = [m,v,s,r]; % User-defined Function 사용
value_BIF = [M,V,S,R]; % Built-in Function 사용
value = [value_UDF; value_BIF].';
xtick_labels_1 = {'mean','variance','standard deviation','rms'};
legend_labels_1 = {'User-defined','Built-in'};
xlabel_1 = {'Statistic type'};
ylabel_1 = {'Statistics magnitude'};
title_1 = {'사용자정의함수 vs. 내장함수'};
# 플로팅 변수 준비2 : 30일 단위 데이터 세트 통계치
value_sets = [m30;v30;s30;r30];
legend_labels_2 = {'mean','variance','standard deviation','rms'};
xlabel_2 = {'Data sets index'};
ylabel_2 = {'Statistics magnitude'};
title_2 = {'직전 30일 데이터 통계치 분석'};
################################################################################
# 플로팅1 : 1년치 데이터 통계치 계산 결과 비교 (사용자정의함수 <-> 내장함수)
figure(1)
bar(1:size(value,1),value);
set(gca,'xticklabel',xtick_labels_1)
xlabel(xlabel_1)
ylabel(ylabel_1)
legend(legend_labels_1)
grid on
title(title_1)
# 플로팅2 : 30일 단위 데이터 세트 통계치
figure(2)
plot(1:size(value_sets,2),value_sets,'-o')
xlabel(xlabel_2)
ylabel(ylabel_2)
legend(legend_labels_2)
grid on
title(title_2)
################################################################################ 코드 해설
목적
Signal Processing + Statistics 중심의 Octave 학습 예제
입력
- 스크립트 상단에서 정의한 파라미터/입력 데이터를 사용합니다.
출력
- 그래프/figure 출력
실행 흐름
- 데이터의 통계치(평균, 분산, 표준편차, rms)를 사용자정의함수와 내장함수 간 결과 비교
- 입력 변수 준비1 : csv파일 읽기 & 원하는 종류의 1년치 데이터 선정
- 입력 변수 준비2 : 30일 단위 분할 데이터 세트 만들기
- 연산 실행1 : 1년치 데이터의 통계치 비교 (사용자정의함수 <-> 내장함수)
- 연산 실행2 : 30일 단위 데이터 세트 통계치
- 플로팅 변수 준비1 : 1년치 데이터 통계치 (사용자정의함수 <-> 내장함수)
- 플로팅 변수 준비2 : 30일 단위 데이터 세트 통계치
- 플로팅1 : 1년치 데이터 통계치 계산 결과 비교 (사용자정의함수 <-> 내장함수)
- 플로팅2 : 30일 단위 데이터 세트 통계치
핵심 함수/주제
figurelegendsizestatistic_valuestdtitlexlabelylabel
실습 과제
- 샘플링 주파수나 입력 주파수를 바꿔 스펙트럼 변화를 비교해보세요.
- 같은 연산을 내장 함수와 사용자 함수 두 방식으로 계산해 오차를 비교해보세요.
- 축 범위와 라벨을 바꿔 그래프 해석성이 어떻게 달라지는지 확인해보세요.
학습 팁
- 그래프 비교 시 축 범위(XLim/YLim)와 단위를 먼저 고정하면 해석 오류를 줄일 수 있습니다.
- 입력 파일 경로가 현재 작업 디렉터리 기준인지 먼저 확인하세요.
같은 카테고리의 다른 코드
- 수치미분
ex-recv/01/01-CJW-20250321/수치미분.m - main_cjw
ex-recv/01/01-CJW-20250321/main_cjw.m - main-my_diff
ex-recv/01/01-JKH-20250319/main-my_diff.m - hw_1_kim-gpt
ex-recv/01/01-KSG-20250318/hw_1_kim-gpt.m - hw_1_kim
ex-recv/01/01-KSG-20250318/hw_1_kim.m - [Octave] HW#1
ex-recv/01/01-LSH-20250319/[Octave] HW#1.m - Octave_Moon_250319
ex-recv/01/01-MJY-20250319/Octave_Moon_250319.m - Octave01_Park,jm_250319
ex-recv/01/01-PJM-20250319/Octave01_Park,jm_250319.m - [Octave]250318_RYU_poly,dff
ex-recv/01/01-RJW-20250321/[Octave]250318_RYU_poly,dff.m - 과제1_신찬영연구원
ex-recv/01/01-SCY-20250319/과제1_신찬영연구원.m