라이브러리 불러오기
import os
# 데이터 처리
import pandas as pd
import numpy as np
# 시각화
import matplotlib.pyplot as plt
import matplotlib.ticker as plticker
import seaborn as sns
# 분석
import statsmodels.api as sm
import scipy
# 그래프 글꼴 설정
plt.rc('axes', unicode_minus=False)
plt.rc('font', family='NanumBarunGothic')
파일 불러오기
file_path_data = os.getenv('주소')
data = pd.read_csv(file_path_data)
EDA(Exploratory Data Analysis, 탐색적 데이터 분석)
data.info() # 데이터 속성, 결측치,갯수 확인
data['id'] = data['id'].astype(int) # 데이터 type int로 바꿔주기
pd.to_datetime(data['date'], format = '%Y-%m-%d') # datetime으로 바꾸기
data.dexcribe() # 데이터의 기본분포 살펴보기
- line 그래프로 그려보기
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10, 8))
'''
그래프 해석
실선: 추정회귀선
하늘색 면적:신뢰구간
추정회귀선 : 데이터 포인트들의 분포를 고려하여 데이터에 가장 잘 맞는 선형 모델을 나타내는 선
신뢰구간 : 데이터 포인트가 존재할 가능성을 나타내는 구간,95% 신뢰구간을 사용,실제 회귀선이 존재할 것으로 예상되는 구간
'''
sns.lineplot(
data=data,
x='t_date',
y='count',
label='갯수',
)
plt.title('날짜별 count', fontsize=15)
plt.xlabel('date)')
plt.ylabel('')
plt.show()
- 결측치 처리하기
결측치를 처리하는 방법
1. 결측치가 있는 row를 통째로 없앤다.
2. 해당 column의 대표값인 평균값, 중간값, 최빈값 등을 넣어준다
3. 해당 데이터의 직전 row나 직후 row값을 넣어준다.
4. 해당 데이터의 직전 row와 직후 row의 중간값을 넣어준다.(선형 보간)
- 결측치를 알아내는 과정
# 차집합을 사용
# data.t_date : data의 날짜 데이터
# pd.date_range(start = , end= , periods = None, req=None, tz=None, normalize=False, name=None, closed=None, **kwargs)
# set().defference() -> 차집합
set(pd.date_range(min(data.t_date), max(data.t_date))).difference(set(data.t_date)
# isnull을 사용
data[data['t_date'].isnull()]
- drop을 사용해 결측치 제거하기
# data[data['t_date']<'2019-08-30']에 해당하는 index모두 지우기
data.drop(data[data['t_date']<'2019-08-30'].index, inplace =True)
- melt()함수
: 컬럼을 녹여서 행으로 만든다.
'''
.melt(id_vars= 기준 col , value_vars= 녹이는 col, var_name= melt전 열이름 , value_name= melt전 해당 열에 들어있던 값
'''
data = data.melt(
id_vars='id',
value_vars=['count'],
var_name='count',
value_name='count_value',
)\
.replace('1', 'one')\
.replace('2', 'two')\
.replace('3', 'three')
(https://koreadatascientist.tistory.com/12)
- datetime 데이터를 IOS데이터로 변경
dt.isocalendar().week는 Python의 datetime 또는 Timestamp 객체에서 사용되는 해당 날짜의 ISO 주차를 반환하는 메서드입니다.
* 국제 표준화 기구 (ISO)에서 정의한 날짜 표현 방식 중 하나로, 주 단위로 날짜를 그룹화하는 방법.
* 일반적인 연도와 다르게, ISO 주차는 연도와 주차 번호를 조합하여 특정 날짜를 나타냄.
* 비즈니스 및 통계 분야에서 날짜를 처리하고 분석할 때 유용합니다.
ISO 주차란?
ISO 주차 정보는 국제 표준화 기구 (ISO)에서 정의한 날짜 표현 방식 중 하나로, 날짜를 주 단위로 그룹화하여 나타내는 방법입니다. 이 방식은 일반적인 연도와 다르게 주차 번호와 연도를 함께 사용하여 날짜를 표현합니다.
ISO 주차 정보는 다음 세 가지 요소로 구성됩니다:
- ISO 연도 (ISO Year): ISO 주차는 일반적인 연도와는 다르게, 1월 4일이 포함된 주를 첫 번째 주로 정의합니다. 이로 인해 일부 연도의 첫 주는 이전 연도의 마지막 주와 겹치게 됩니다. 따라서 ISO 연도는 해당 연도의 시작을 1월 4일로 둔 것입니다.
- ISO 주차 번호 (ISO Week Number): ISO 주차 번호는 주 단위로 날짜를 그룹화할 때 주어지는 번호입니다. 주차 번호는 주의 시작이 월요일로 정의되며, 연도 내에서 1부터 52 또는 53까지의 값을 가집니다.
- 요일 (Weekday): ISO 주차에서 요일은 월요일부터 일요일까지 1부터 7의 숫자로 나타냅니다.
이런 방식으로 ISO 주차 정보를 사용하면 연도의 구성과 주차를 명확하게 표현할 수 있습니다. 이것은 비즈니스 및 통계 분야에서 주차별 데이터 분석을 수행하거나 시간을 관리하는 데 유용한 방법 중 하나입니다.
(chat GPT)
data['weeknum'] = data['t_date'].dt.isocalendar().week
data['year'] = data['t_date'].dt.isocalendar().year
- 데이터 시각화 하기
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(50, 8))
plt.xticks(rotation=45)
# 그래프의 x 축에 주차별 데이터를 표시할 때, 눈금을 일정한 주기로 설정
loc = plticker.MultipleLocator(base=7.0)
ax.xaxis.set_major_locator(loc)
'''
matplotlib.ticker: 눈금 관련 기능을 제공하는 모듈
plticker.MultipleLocator(base=7.0): 눈금을 지정한 간격으로 설정하는 객체를 생성
base=7.0: 눈금 간격을 7.0 단위로 설정
ax.xaxis.set_major_locator(loc): x 축의 주요 눈금 위치를 loc로 설정
눈금이 일정한 주기로 표시됨
'''
sns.lineplot(
data=data
x='yyyyww',
y='count_value',
)
plt.xticks(rotation=45)
plt.show()
상관관계 분석하기
- 상관관계 분석전 데이터 정리하기
print(f"데이터 : {data['target'].unique().min()}") # uaique를 왜 쓸까? 초단위 까지 확인 하기 위해서 인듯
# datetime으로 바꿔주기
start_date = pd.to_datetime('2019-09-08', format='%Y-%m-%d')#
- 데이터 merge하기
merge : 공통된 열을 기준으로 df를 합쳐준다.
df_raws = data.merge(
left, # 왼쪽 df
right, #오른쪽 df
on = , # 기준열(두 df의 기준열의 이름이 같을 때)
how =, # join 방식 {'left', 'right', 'inner', 'outer'} 기본값은 'inner'
left_on = , # 기준열 이름이 다를 때 왼쪽열 기준
right_on = , # 기준열 이름이 다를 때 오른쪽열 기준
)
df_merge = data.merge(
df_price,
how='left',
left_on='id',
right_on='id',
copy=False,
)
- 필요없는 데이터 지우기
df_data.drop(['t_date'], axis=1, inplace=True)
- 상관관계 분석
'TIL(Today I Learned)' 카테고리의 다른 글
likelihood와 머신러닝 (0) | 2023.09.12 |
---|---|
scikit-learn을 이용해 분류문제 해결하기 (0) | 2023.09.05 |
시계열 데이터 분석, 예측하기 (1) | 2023.08.31 |
머신러닝 모델설계하기 기초 | 내가 받을 팁 예측하기 (2) (0) | 2023.08.28 |
머신러닝 모델설계하기 기초(1) (0) | 2023.08.28 |