Artificial Intelligence/캐글-데이콘

[데이콘] 쇼핑몰 지점별 매출액 예측 경진대회

inee0727 2022. 7. 12. 19:33

라이브러리 호출

import numpy as np
import pandas as pd 
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.preprocessing import MinMaxScaler

1. 데이터 살펴보기_(1)데이터 준비

from google.colab import drive
drive.mount('/content/drive')

train_set = pd.read_csv( '/content/drive/MyDrive/shopping data/train.csv') 

print(train_set) #[6255 rows x 12 columns]

print("=================================================================================================")

test_set = pd.read_csv('/content/drive/MyDrive/shopping data/test.csv')
print(test_set) #[180 rows x 11 columns]

# sample_submission 불러오기
sample_submission = pd.read_csv('/content/drive/MyDrive/shopping data/sample_submission.csv')
먼저 pandas 라이브러리의 read_csv() 함수를 이용해 분석에 사용할 데이터를 불러온다.

read_csv() 함수는 ('파일이 있는 위치/파일명.확장자명') 의 형식을 받아 데이터를 불러온다.

그리고 잘 불러와졌는지 확인했다.

1. 데이터 살펴보기_(2)데이터 확인

print(train_set.info()) 
print("=================================================================================================")
train_set.head()
데이터가 어떻게 생겼는지 살펴보았다.
pandas의 head(), info() 메소드를 활용하여 데이터에 이상치나 결측지가 있는지 살펴보았다.

1. id, store, date 등 총 13개의 칼럼이 있는것을 알 수 있었다.

2. Non-Null Count 부분을 보니 Promotion 부분에 결측치가 있다는 것을 알 수 있었다.

3. data, isholiday 부분은 숫자가 아니기 때문에 분석 전에 데이터 전처리가 필요하다.


2.데이터 전처리_(1)train_set, test_set 결측치 처리

#train 데이터 빈 부분 0으로 채우기
train_set = train_set.fillna(0)
print(train_set)
print("=================================================================================================")
test_set = test_set.fillna(0)
print(test_set)

 

결측치란 관측되지 않아 아무것도 없는 공간으로 되어 있는 데이터인데, 이 부분은 숫자 0으로 채워주었다.

NA 값들이 0.00으로 채워진 것을 확인할 수 있다.

2.데이트 전처리_(2)train / test_set Date 전처리

# Date 칼럼에서 "월"에 해당하는 정보만 추출하여 숫자 형태로 반환하는 함수 작성
def get_month(date):
    month = date[3:5]
    month = int(month)
    return month

# 이 함수를 Date 칼럼에 적용한 Month 칼럼 만들기
train_set['Month'] = train_set['Date'].apply(get_month)
test_set['Month'] = test_set['Date'].apply(get_month)

# 결과 확인
print(train_set)
print("=================================================================================================")
print(test_set)

Date 칼럼은 날짜 정보를 담고 있다.
날짜는 겉으로 보기엔 숫자로 이루어져 있는 것 같지만 '00/00/0000' 형태의 문자로 이루어져 있다. 

따라서 '일/월/년도' 형식의 문자를 숫자로 변환해주어야 하며 '월' 정보만 사용했다. '월'에 대한 정보만을 담고 있는 Month 칼럼이 잘 생성된 것을 확인할 수 있다.

 

2.데이트 전처리_(3)train/test_set IsHoliday 제거

# IsHoliday 칼럼의 값을 숫자 형태로 반환하는 함수를 작성합니다.
def holiday_to_number(isholiday):
    if isholiday == True:
        number = 1
    else:
        number = 0
    return number

# 이 함수를 IsHoliday 칼럼에 적용한 NumberHoliday 칼럼을 만들어줍니다.
train_set['NumberHoliday'] = train_set['IsHoliday'].apply(holiday_to_number)
test_set['NumberHoliday'] = test_set['IsHoliday'].apply(holiday_to_number)

# 결과를 확인합니다.
print(train_set)
print("=================================================================================================")
print(test_set)
Date 칼럼은 휴일 정보를 담고 있다. 값은 휴일인 경우 True , 휴일이 아닌 경우 False 값을 갖는다. 파이썬에서는 True 는 1로, False는 0으로 해석하기 때문에 굳이 전처리를 해주지 않아도 분석을 진행하는 데에는 문제가 없지만 나는 전처리를 해주었다.

2.데이터 전처리_(4)칼럼제거

# 분석할 의미 없는 칼럼을 제거
train_set = train_set.drop(columns=['id'])
test_set = test_set.drop(columns=['id'])

# 전처리 하기 전의 칼럼들 제거
train_set= train_set.drop(columns=['Date','IsHoliday'])
test_set = test_set.drop(columns=['Date','IsHoliday'])
분석에 사용할 데이터들만 추리기 위해 id / Date / IsHoliday 칼럼을 제거해주었다.

3.학습에 사용할 정보와 예측하고자하는 정보 분리

x = train_set.drop(['Weekly_Sales'], axis = 1) #train 데이터 중 x 변수에는 Weekly 열을 제외한 나머지 컬럼을 저장한다.
y = train_set['Weekly_Sales'] #Weekly_Sales 컬럼만 y 변수에 저장한다.

print(x.shape) #(6255, 11)
print(y.shape) #(6255,)

x_train,x_test,y_train, y_test = train_test_split(x,y, train_size=0.7, shuffle=True, random_state=72)
학습에 사용할 정보는 Weekly_Sales 열을 제외한 나머지 컬럼들로, 이 컬럼들을 x 변수에 저장했다. 예측하고자 하는 정보인 Weekly_Sales 컬럼은 y 변수에 저장했다.

4. 모델 훈련_XgBoost

from xgboost import XGBRegressor
model = XGBRegressor(objective='reg:squarederror',
                    n_jobs = -1,
                    n_estimators = 90,
                    learning_rate = 0.2,
                    max_depth = 8,
                    min_child_weight = 1,
                    subsample = 0.8,
                    colsample_bytree = 0.7,
                    reg_alpha = 1,  # 규제 L1
                    reg_lambda = 0  # 규제 L2
                    )
model.fit(x_train, y_train)
xgboost 모델로 학습시켰다.

5. 평가, 예측

results = model.score(x_test, y_test)
print("result : ", round(results, 4))

predict = model.predict(x_test)

def RMSE(y_test, predict):
    return np.sqrt(mean_squared_error(y_test, predict))

rmse = RMSE(y_test, predict)
print("RMSE :", rmse)
result : 0.9588
RMSE : 115589.92841917255

6.submission 파일 생성

sample_submission ['Weekly_Sales'] = rmse
sample_submission .to_csv('/content/drive/MyDrive/shopping data/sample_submission.csv',index = False)