[ํต๊ณ์ ๋ชจ๋ธ๋ง] ์๊ณ์ด ๋ถ์ - ์ ์์ฑ(stationary)๊ณผ ์ฐจ๋ถ
2022.03.18 - [๋ฐ์ดํฐ ๋ถ์/04. Data Analysis] - [ํต๊ณ์ ๋ชจ๋ธ๋ง] ์๊ณ์ด ๋ถ์ [ํต๊ณ์ ๋ชจ๋ธ๋ง] ์๊ณ์ด ๋ถ์ ํญ์ ์๊ณ์ด ๋ถ์์ ์ด๋ ต๊ณ ๋ณต์กํ๋ค๋ ์๊ฐ์ ์ฝ๋๋ฅผ ํ๋ํ๋ ์ดํดํ๋ฉด์ ์์ฑํ๊ธฐ ํ๋ค์
xod22.tistory.com
์ ๋ฒ ๊ธ์์๋ ์ ์์ฑ๊ณผ ์ฐจ๋ถ์ ๋ํด์ ๊ณต๋ถ๋ฅผ ํด๋ดค์ต๋๋ค.
์ค๋์ ์ด์ด์ ์๊ณ์ด ๋ถ์์ ํ ๋ ๊ฒฐ์ธก๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ trend(์ถ์ธ)๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋ณด๊ธฐ์ํ ๋ฐฉ๋ฒ์ธ Smoothing์ ๋ํด ๊ณต๋ถํด๋ณด๋ ค๊ณ ํฉ๋๋น!
๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌ
: ๋๋ก ์๊ณ์ด ๋ฐ์ดํฐ์ ๊ฒฐ์ธก๊ฐ์ด ํฌํจ๋์ด ์๋ค. ํด๋น ๊ตฌ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ธก์ ๋์ง ์์๊ฑฐ๋ ์ฌ์ฉ๊ฐ๋ฅํ์ง ์๋ค.
๋ฐ์ดํฐ๊ฐ ์คํ ์ด์ ๋๋ฆฌํ์ง ์๋ค๋ฉด ๊ณ์ด ๋ฐ์ดํฐ์ "ํ๊ท "์ ์ฌ์ฉํด์ ๊ฒฐ์ธก๊ฐ์ ์ฑ์ ๋ฃ์ผ๋ฉด ์๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ ์ด์ ๊ฐ์ผ๋ก ์์ ๊ฐ์ ์ฑ์๋ฃ๋ foward-fill์ ์ฌ์ฉํด์ ์ง์ ๋ถํ๊ธด ํ์ง๋ง ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ํ์ง๋ง, ๊ณ์ด ์์ฑ์ ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค!
1. forward/backward fill
2. Interpolation(๋ณด๊ฐ๋ฒ)
3. ์ต๊ทผ์ ์ด์ ํ๊ท (Mean of nearest neighbors)
~1. forward/backward fill~
df=pd.read_csv('a10.csv', parse_dates=['date'], index_col='date')
#forward fill : ffill()
#backward fill : bfill()
df_ffill=df.ffill()
df_bfill=df.bfill()
~2. Interpolation(๋ณด๊ฐ๋ฒ)~
- Linear
from scipy.interpolate import interp1d
df=pd.read_csv('a10.csv', parse_dates=['date'], index_col='date')
import numpy as np
df['rownum']=np.arange(df.shape[0])
df_nona=df.dropna(subset=['value'])
#kind๋ฅผ ์ง์ ํด์ฃผ์ง ์์์ ๋ ๋ํดํธ๊ฐ์ 'linear'
f=interp1d(df_nona['rownum'], df_nona['value'])
df['linear_fill']=f(df['rownum'])
- Cubic : ๋ ์ฌ์ธํ fitting ๊ฐ๋ฅ!
from scipy.interpolate import interp1d
df=pd.read_csv('a10.csv', parse_dates=['date'], index_col='date')
df['rownum']=np.arange(df.shape[0])
df_nona=df.dropna(subset=['value'])
f2=interp1d(df_nona['rownum'], df_nona['value'], kind='cubic')
df['cubic_fill']=f2(df['rownum'])
~3. Mean of nearest neighbors~
def knn_mean(ts, n):
out=np.copy(ts)
for i, val in enumerate(ts):
if np.isnan(val):
n_by_2=np.ceil(n/2)
lower=np.max([0, int(i-n_by_2)])
upper=np.min([len(ts)+1, int(i+n_by_2)])
ts_near=np.concatenate([ts[lower:i], ts[i:upper]])
out[i]=np.nanmean(ts_near)
return out
Smoothing
: ์๊ฐ ๋จ๊ณ ๊ฐ์ ๋ฏธ์ธํ ๋ณ๋์ ์ ๊ฑฐํจ,
์ถ์ธ๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋ณผ ์ ์์=> ์๋ฌ๋ค์ ํจ๊ณผ๋ฅผ ๋ฎ์ถ๊ณ ์ฝ๊ฒ ์ค๋ช ํ ์ ์๋ค.
- Moving average(์ด๋ํ๊ท ๋ฒ) : tn-1, t, tn+1์ ํ๊ท ๊ฐ
- Loess smoothing : ๊ฐ๊ฐ์ ๊ฐ๋ณด๋ค ์ถ์ธ๋ฅผ ๋ณด๋ ๋ฐฉ๋ฒ
1. ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
from statsmodels.nonparametric.smoothers_lowess import lowess
df_orig=pd.read_csv('elecequip.csv', parse_dates=['date'], index_col='date')
2. moving average
df_ma=df_orig.value.rolling(3, center=True, closed='both').mean()
3. Loess Smoothing(5% and 15%)
df_loess_5=pd.DataFrame(lowess(df_orig.value, np.arange(len(df_orig.value)), frac=0.05)[:, 1], index=df_orig.index, columns=['value'])
df_loess_15=pd.DataFrame(lowess(df_orig.value, np.arange(len(df_orig.value)), frac=0.15)[:, 1], index=df_orig.index, columns=['value'])
3. plot
~original plot~
df_orig.plot()
plt.show()
~5%, 15% smoothing plot~
df_loess_5.plot()
df_loess_15.plot()
plt.show()
~moving average plot~
df_ma.plot()
plt.show()
'๐ ๋ฐ์ดํฐ ๋ถ์ > 04. Data Analysis' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[A/B ํ ์คํธ] A/B ํ ์คํธ๋? (0) | 2022.03.21 |
---|---|
[ํต๊ณ์ ๋ชจ๋ธ๋ง] ์๊ณ์ด ๋ถ์ - ์์ธก (0) | 2022.03.21 |
[ํต๊ณ์ ๋ชจ๋ธ๋ง] ์๊ณ์ด ๋ถ์ - ์ ์์ฑ(stationary)๊ณผ ์ฐจ๋ถ (0) | 2022.03.19 |
[ํต๊ณ์ ๋ชจ๋ธ๋ง] ์๊ณ์ด ๋ถ์์ ๋ถํด (0) | 2022.03.18 |
[ํต๊ณ์ ๋ชจ๋ธ๋ง] ์ ํํ๊ท, ๋ก์ง์คํฑํ๊ท (0) | 2022.03.18 |