Python_기초실습 1 (feat. temperature data)

김수경·2024년 2월 14일

기초분석실습

목록 보기
1/3

기온 데이터를 통한 기초 분석

👩🏻‍💻 학습한 것

parse_dates : 컬럼을 날짜형식으로 파싱
data.isnull().values.any() : 데이터 결측지 있는지 확인
data.dropna(inplace = true) : 결측치 행 삭제
unstack() : 다중인덱스 중 하나를 열로 변환
✅ 이동평균 : 데이터의 장기적인 추세를 파악
rolling(window=) : 이동평균 계산시 얼마나 말아주느냐
resample : 동일 간격별로 데이터를 뽑음(WAU, MAU에도 많이 사용)
✅ 추세선 : 선형회귀 모델을 활용한 추세선 그리기
✅ 히트맵 - cmap : colormap / annot : annotion / fmt : format
✅ IQR 이상치 전처리

Q1 = data['column'].quantile(0.25)
Q3 = data['column'].quantile(0.75)
IQR = Q3 - Q1
upper_limit = Q3 + 1.5 IQR
lower_limit = Q1 - 1.5 IQR

1. 데이터 로드 및 전처리

# 필요한 라이브러리 임포트
import pandas as pd  # 데이터를 다루는데 사용되는 라이브러리
import matplotlib.pyplot as plt  # 시각화를 위한 라이브러리
import seaborn as sns  # Matplotlib을 기반으로 한 시각화 라이브러리

# 데이터 로드
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-min-temperatures.csv'  # 데이터가 저장된 URL
data = pd.read_csv(url, parse_dates=['Date'], index_col='Date')  # CSV 파일을 Pandas DataFrame으로 읽어들임
# parse_dates 옵션은 'Date' 열을 날짜로 파싱하도록 지정함
# index_col 옵션은 'Date' 열을 인덱스로 사용하도록 지정함

# 데이터 확인
print(data.head())  # 데이터의 처음 몇 개 행을 출력하여 내용을 확인함

# 결측치 확인 및 처리
if data.isnull().values.any():  # 데이터에 결측치(NaN)가 있는지 확인
    data.dropna(inplace=True)  # 결측치가 있으면 해당 행을 삭제함

# 데이터 타입 확인
print(data.dtypes)  # 데이터프레임의 각 열의 데이터 타입을 출력함

parse_dates : 컬럼을 날짜형식으로 파싱
data.isnull().values.any() : 데이터 결측지 있는지 확인
data.dropna(inplace = true) : 결측치 행 삭제

2. 기초 통계 분석

# 연도와 월 컬럼 추가
data['Year'] = data.index.year  # 인덱스에서 연도를 추출하여 'Year' 열로 추가
data['Month'] = data.index.month  # 인덱스에서 월을 추출하여 'Month' 열로 추가

# 연도별 평균 기온 계산
yearly_avg_temp = data.groupby('Year')['Temp'].mean()  # 'Year'로 그룹화하여 각 연도별 평균 기온을 계산

# 월별 평균 기온 계산
monthly_avg_temp = data.groupby(['Year', 'Month'])['Temp'].mean().unstack()
# 'Year'와 'Month'로 그룹화하여 각 연도별, 월별 평균 기온을 계산하고,
# unstack() 함수를 사용하여 다중 인덱스에서 월을 열로 변환하여 표 형태로 만듦

# 연도별 평균 기온 통계 정보 출력
print(yearly_avg_temp.describe())
# 연도별 평균 기온에 대한 통계 정보(평균, 표준편차, 최솟값, 1사분위수, 중위값, 3사분위수, 최댓값)를 출력

unstack() : 다중인덱스 중 하나를 열로 변환

3. 이동평균 분석

# 12개월 이동 평균 계산
data['Moving_Avg'] = data['Temp'].rolling(window=365).mean()
# 'Temp' 열을 기준으로 12개월 이동 평균을 계산하여 'Moving_Avg' 열에 저장
# rolling(window=365) 메서드는 이동 평균을 계산하는데 사용되며, 창(window) 크기를 365로 지정하여 12개월 이동 평균을 계산

# 이동 평균 시각화
plt.figure(figsize=(12, 6))  # 시각화 영역의 크기를 설정
plt.plot(data['Moving_Avg'], color='orange', label='12-Month Moving Average')  # 이동 평균 데이터를 주황색으로 선 그래프로 플롯
plt.title('12-Month Moving Average of Temperature')  # 그래프 제목 설정
plt.xlabel('Date')  # x축 레이블 설정
plt.ylabel('Temperature')  # y축 레이블 설정
plt.legend()  # 범례 표시
plt.show()  # 그래프 출력


이동평균 : 데이터의 장기적인 추세를 파악
window : 이동평균 계산시 얼마나 말아주느냐

  • window=12 : 이전 12개(월데이터에 적절)

4. 이동평균 추세선

import numpy as np  # 수치 연산을 위한 라이브러리
from sklearn.linear_model import LinearRegression  # 선형 회귀 모델 라이브러리 임포트

# 연도별 이동 평균 기온 준비
yearly_moving_avg = data['Moving_Avg'].resample('Y').mean()
# 'Moving_Avg' 열의 연도별 이동 평균을 계산하기 위해 연도(Year)별로 리샘플링하고, 각 연도별 평균값을 계산함
# .resample : 계열 index를 연도 단위의 동일 간격별로 데이터를 뽑으라는 뜻

# 선형 회귀 모델을 사용하여 추세선 계산
model = LinearRegression().fit(np.arange(len(yearly_moving_avg)).reshape(-1, 1), yearly_moving_avg.values)
# 선형 회귀 모델을 초기화하고, 연도별 이동 평균 기온 데이터에 대해 학습함
# np.arange(len(yearly_moving_avg)).reshape(-1, 1)은 데이터를 피팅하기 위한 형태로 변환함

# 추세선을 위한 예측 값 계산
trend = model.predict(np.arange(len(yearly_moving_avg)).reshape(-1, 1))
# 학습된 모델을 사용하여 각 연도별 추세 값을 예측함

# 이동 평균과 함께 추세선 그리기
plt.figure(figsize=(12, 6))  # 그래프 영역의 크기를 설정함
plt.plot(yearly_moving_avg.index, yearly_moving_avg.values, label='12-Month Moving Average')  # 12개월 이동 평균을 플롯함
plt.plot(yearly_moving_avg.index, trend, label='Trend', color='red')  # 추세선을 빨간색으로 플롯함
plt.title('12-Month Moving Average with Trend Line')  # 그래프 제목 설정
plt.xlabel('Year')  # x축 레이블 설정
plt.ylabel('Temperature')  # y축 레이블 설정
plt.legend()  # 범례 표시
plt.show()  # 그래프 출력

resample : 동일 간격별로 데이터를 뽑음(WAU, MAU에도 많이 사용)
✅ 추세선 : 선형회귀 모델을 활용한 추세선 그리기

5. Box Plot과 이상치 탐색

# 월별 기온 분포 상자 그림
sns.boxplot(x='Month', y='Temp', data=data)
# 월별로 기온 데이터를 상자 그림으로 표시
# x='Month'는 x축에 월을, y='Temp'는 y축에 기온을 나타냄
# data=data는 사용할 데이터프레임을 지정함

plt.title('Box Plot of Temperatures by Month')
# 그래프 제목 설정
plt.show()
# 그래프 출력

6. IQR 이상치 처리

#IQR로 이상치 제거하기(혼자 실습))
Q1 = data['Temp'].quantile(0.25)
Q3 = data['Temp'].quantile(0.75)
IQR = Q3 - Q1 

upper_limit = Q3 + 1.5 * IQR
lower_limit = Q1 - 1.5 * IQR 

data_no_outliers = data[(data['Temp'] <= upper_limit) & (data['Temp'] >= lower_limit)]

sns.boxplot(data = data_no_outliers, x = 'Month', y = 'Temp')

IQR 수식 외우기

Q1 = data['column'].quantile(0.25)
Q3 = data['column'].quantile(0.75)
IQR = Q3 - Q1
upper_limit = Q3 + 1.5 IQR
lower_limit = Q1 - 1.5
IQR

7. 히트맵 시각화

plt.figure(figsize=(12, 9))
# 그래프의 크기를 설정함

sns.heatmap(monthly_avg_temp, cmap='coolwarm', annot=True, fmt=".1f")
# seaborn의 heatmap 함수를 사용하여 월별 평균 기온 데이터를 열 지도(heat map)로 시각화함
# monthly_avg_temp는 월별 평균 기온 데이터를 포함하는 DataFrame이며, 각 셀에는 기온 값이 표시됨
# cmap='coolwarm'은 컬러맵을 설정하는데, coolwarm은 차가운 색과 따뜻한 색의 대비를 나타냄
# annot=True는 각 셀에 값의 주석을 추가하라는 의미이며, fmt=".1f"는 주석의 형식을 소수점 첫째 자리까지 표시하라는 의미임

plt.title('Heatmap of Monthly Average Temperatures')
# 그래프의 제목을 설정함

plt.xlabel('Month')
# x축 레이블을 설정함

plt.ylabel('Year')
# y축 레이블을 설정함

plt.show()
# 그래프를 출력함

cmap : colormap
annot : annotion
fmt : format

profile
잘 하고 있는겨?

0개의 댓글