[KT Aivle 3기 AI] 6일차. 시계열 데이터, 데이터 분석 방법론, 시각화, 단변량 분석
0. 개요
KT Aivle School 3기 AI 6일차
- 강사 : 한기영 강사님
- 내용
- 시계열 데이터
- 데이터 분석 방법론
- 시각화
- 단변량 분석 (숫자형, 범주형 변수)
위 내용들을 배웠음. 구체적인 내용은 추후 따로 포스트를 올릴 예정.
1. 시계열 데이터
- 행과 행에 시간의 순서(흐름)가 있고
- 행과 행의 시간 간격이 동일한 데이터 (엄격한 기준임)
- Time Series = Sequential Data 라고도 부름
1) 날짜 요소 추출
(1) 날짜 타입으로 변환
- 보통, 데이터에서 날짜는 data type이 object로 되어있음
- 이를
data['Date'] = pd.to_datetime(data['Date'])
와 같이 datetime으로 변경해준다.
(2) 날짜 요소 추출
- 날짜 타입의 변수로부터 날짜의 요소를 뽑아낼 수 있음
data['yaer'] = data['date'].dt.year
와 같이 뽑아내고 할당할 수 있음- 사진과 같이 다양한 method가 있음
2) 시간에 따른 흐름 추출하기 : Time Lag
- 시계열 데이터에 사용
- shift, rolling, diff 가 있다.
(1) .shift()
- 시계열 데이터에서 시간의 흐름 전후로 정보를 이동시킬 때 사용
temp['Amt_lag'] = temp['Amt'].shift(periods=n)
과 같이 사용- n행 shift 한다는 의미임. periods 생략 가능. 기본값은 1
(2) .rolling().mean()
- 시간의 흐름에 따라 일정 기간 동안 평균을 이동하면서 구하기
- .rolling(n):
- n 기본값은 1
- min_periods : 최소 데이터 수
- min_periods 설정이 없으면, n일까지는 이전 데이터가 없기 때문에 NaN이 뜨지만, 설정하게되면 설정한 값부터 값을 내줌
.rolling().mean()
은 이동평균값
1
2
3
temp['Amt_MA7_1'] = temp['Amt'].rolling(7).mean()
temp['Amt_MA7_2'] = temp['Amt'].rolling(7, min_periods = 1).mean()
temp.head(10)
Date | Amt | Amt_MA7_1 | Amt_MA7_2 | |
---|---|---|---|---|
0 | 2013-01-01 | 20.0 | NaN | 20.000000 |
1 | 2013-01-02 | 3938.0 | NaN | 1979.000000 |
2 | 2013-01-03 | 2885.0 | NaN | 2281.000000 |
3 | 2013-01-04 | 2907.0 | NaN | 2437.500000 |
4 | 2013-01-05 | 3831.0 | NaN | 2716.200000 |
5 | 2013-01-06 | 4066.0 | NaN | 2941.166667 |
6 | 2013-01-07 | 2700.0 | 2906.714286 | 2906.714286 |
7 | 2013-01-08 | 2533.0 | 3265.714286 | 3265.714286 |
8 | 2013-01-09 | 2462.0 | 3054.857143 | 3054.857143 |
9 | 2013-01-10 | 2110.0 | 2944.142857 | 2944.142857 |
(3) .diff()
- 특정 시점 데이터, 이전시점 데이터와의 차이 구하기
temp['Amt_D1'] = temp['Amt'].diff(n)
과 같이 사용- n행 전과 차이를 구한다는 의미
2. 데이터 분석 방법론 (CRISP-DM)
- 이 내용은 계속해서 강조하셨고, 앞으로의 작업에서 기반이 되는 프로세스이다.
- 따로 포스팅을 작성하겠다.
3. 시각화
- 수많은 데이터를 한 눈에 파악하는 두가지 방법
- 그래프(시각화)
- Histogram, scatter, Density Plot, Bar plot, Box plot, …
- 통계량(수치화)
- Min, Max, Sum, Mean, Std, 사분위수, 검정 통계량, P-value, …
- 그래프(시각화)
Focus
- 우리가 다루는 데이터에는 비즈니스가 담겨 있다.
- 데이터 시각화의 목적은
- 아름다운 그래프가 아니라,
- 통계적인 해석을 넘어,
- 비즈니스의 인사이트를 파악하는 것이다.
한계
- 그래프와 통계량에는 요약된 정보(원본)가 표현 된다.
- 요약을 하는 관점에 따라 해석의 결과가 달라지 수 있다.
- 어떤 식으로든 요약을 하면, 정보의 손실이 발생된다.
1) Maplotlib과 Seaborn
- 간단하게 plot 하는 방법을 배움
- 추후 시각화에 대해 따로 정리한 글을 올리겠다.
4. 단변량 분석 (숫자형, 범주형 변수)
- “데이터가 그렇게 분포하고 있는 데에는 다 이유가 있다.”
그래프 | 통계량 | |
---|---|---|
숫자형 | 히스토그램, KDE plot, box plot | min, max, mean, std, 사분위수 |
범주형 | bar plot | 범주별 빈도수, 비율 |
1) 숫자형 변수
숫자형 변수를 정리하는 두 가지 방법
- 숫자로 요약하기 : 정보의 대푯값 => 기초 통계량
- 평균(mean)
- 산술, 기하, 조화 평균
- 중앙값(median)
- 자료의 순서상 가운데 위치한 값
- 최빈값(mode)
- 자료 중에서 가장 빈번한 값
- 사분위수(Quantile)
- 데이터를 오름차순으로 정렬한 수를 분포 수로
- 전체를 4등분 하고, 각 경계에 해당되는 값 (25%, 50%, 75%)을 의미한다.
df.describe()
로 한번에 확인 가능
- 평균(mean)
- 구간을 나누고 빈도수(frequency) 계산 => 도수분포표(frequency table)
- Histogram
plt.hist()
혹은sns.histplot()
으로 시각화 가능- bins에 따라 전혀 다른 모양이 될 수 있음
- Density Plot (KDE Plot)
- 밀도함수 그래프
- 밀도함수 그래프의 아래 면적은 1
sns.kdeplot()
혹은sns.histplot(~~, kde=True)
를 통해 Histogram과 함께 시각화 할 수 있음
- Histogram
(1) 시각화
[1] Histogram
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
plt.subplot(2, 2, 1)
plt.hist(titanic['Fare'], bins=5, edgecolor='gray')
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.subplot(2, 2, 2)
plt.hist(titanic['Fare'], bins=20, edgecolor='gray')
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.subplot(2, 2, 3)
sns.histplot(x='Fare', data = titanic, bins=5)
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.subplot(2, 2, 4)
sns.histplot(x='Fare', data = titanic, bins=20)
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.tight_layout()
plt.show()
[2] 밀도함수 그래프 (KDE Plot)
1
2
3
4
5
6
7
plt.subplot(2, 1, 1)
sns.kdeplot(x='Fare', data = titanic)
plt.subplot(2, 1, 2)
sns.histplot(titanic['Age'], kde=True)
plt.show()
[3] Boxplot
plt.boxplot()
은 반드시 NaN을 제외해야 결과가 나옴sns.boxplot()
은 알아서 빼고 그려줌- 그림 의미
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
plt.subplot(2, 2, 1)
plt.boxplot(temp['Age'])
plt.grid()
plt.subplot(2, 2, 2)
plt.boxplot(temp['Age'], vert = False)
plt.grid()
plt.subplot(2, 2, 3)
sns.boxplot(x = titanic['Age'])
plt.grid()
plt.subplot(2, 2, 4)
sns.boxplot(y = titanic['Age'])
plt.grid()
plt.tight_layout()
plt.show()
2) 범주형 변수
- 범주별 개수를 세면 된다! => 범주별 개수, 범주별 비율
(1) 수치화 : 기초 통계량
- 범주별 빈도수와 비율을 확인
- 범주별 빈도수 :
series.value_counts()
- 범주별 비율 :
series.value_counts() / df.shape[0]
1
2
print(titanic['Embarked'].value_counts(), end='\n\n')
print(titanic['Embarked'].value_counts() / titanic.shape[0])
1
2
3
4
5
6
7
8
9
Southhampton 644
Cherbourg 168
Queenstown 77
Name: Embarked, dtype: int64
Southhampton 0.722783
Cherbourg 0.188552
Queenstown 0.086420
Name: Embarked, dtype: float64
(2) 시각화
1) bar chart
- seaborn의
sns.countplot()
plt.bar()
를 이용하려면 먼저 집계한 후 결과를 가지고 그래프를 그려야 함sns.countplot()
은 집계 + bar plot 한 번에 해결
1
2
3
4
5
6
7
8
9
10
plt.subplot(2, 1, 1)
sns.countplot(x = titanic['Pclass'])
plt.grid()
plt.subplot(2, 1, 2)
sns.countplot(y = titanic['Pclass'])
plt.grid()
plt.tight_layout()
plt.show()
This post is licensed under CC BY 4.0 by the author.