판매 건수를 통한 서버 최적화

2024. 10. 12. 18:00데이터분석

프로젝트 개요

웹사이트의 시간대 및 요일별 판매 건수를 분석하여 서버 과부하를 예방할 수 있는 근거 데이터를 제공하는 것을 목표로 함

특정 시간대와 요일에 판매 건수가 증가하는 패턴을 파악함으로써, 서버 리소스를 효율적으로 관리하고 방지할 수 있도록 지원함.

기술 스택

  • 프로그래밍 언어: Python
  • 라이브러리: pandas, numpy, seaborn, matplotlib, scikit-learn
  • 분석 기법: 데이터 전처리, 피벗 테이블 생성, 선형 회귀, R² 점수 계산

프로젝트 상세 설명

데이터 수집 및 전처리

  • 데이터 불러오기: pd.read_excel을 사용해 시간대 및 요일별 웹사이트 트래픽 데이터를 불러옴.
  • 필요한 컬럼 선택:
    트래픽 패턴 분석에 중요한 변수인 날짜(CRI_YM), 요일, 시간대, 성별, 연령대, 트래픽 건수(건수합계)를 선택
  • 데이터 정제:
    결측치를 제거하고, 시간대와 연령대의 앞 한 글자만 남김.
    CRI_YM에서 연도를 추출하여 연도별 변화를 쉽게 비교할 수 있도록 데이터 형식을 변환
더보기

코드

import pandas as pd
import numpy as np

pd_DataSet = pd.read_excel("C:\\Users\\KOPO\\OneDrive - 한국폴리텍대학\\폴리텍\\프로젝트\\samsung\\SAMSUNGCARD_ONLINE_DATA.xlsx", sheet_name="DATA")
print(pd_DataSet.columns)
New_DF = pd_DataSet[['CRI_YM', 'TAG', '평일휴일', '요일', '시간대', '성별', '연령대', '건수합계']].dropna()
# 시간대 열에서 앞의 한 글자만 남기기
New_DF['시간대'] = New_DF['시간대'].str[0]
New_DF['연령대'] = New_DF['연령대'].str[0]
New_DF['연도'] = New_DF['CRI_YM']//100 +3

# 기존 데이터 피벗 테이블 생성
pivot_DF = New_DF.pivot_table(index=['요일', '시간대'], columns='연도', values='건수합계', aggfunc='sum').fillna(0)

# 결과 출력 확인
print(pivot_DF.head())

결과

 

데이터 피벗 및 모델 학습

  • 피벗 테이블 생성:
    요일과 시간대를 기준으로 연도별 트래픽 데이터를 피벗 테이블로 구성하여 연도별 트래픽 변화를 파악
  • 선형 회귀 모델: LinearRegression을 사용해 2025년 트래픽을 예측.
    각 요일과 시간대별로 2022년~2024년의 데이터를 기반으로 회귀 모델을 학습시키고,
    2025년의 구매건수를 예측하여 데이터에 추가.
  • 모델 평가: R² 점수를 통해 모델의 설명력을 확인하고, 평균 R² 점수로 전체 모델의 신뢰도를 평가.
  • 엑셀 저장: 2022~2024년 데이터와 2025년의 예측된 값을 엑셀로 저장
더보기

코드

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

pivot_prediction = pivot_DF.copy()
pivot_prediction[2025]=np.nan
r2_list = []

for i in pivot_prediction.index:
    data = pivot_prediction.loc[i,pivot_DF.columns].dropna()

    X=data.index.values.reshape(-1,1)   # 2차원 배열로 변환
    Y=data.values

    model = LinearRegression()
    model.fit(X, Y)

    # 2025년 예측
    predicted_count = model.predict(np.array([[2025]]))
    pivot_prediction.loc[i, 2025] = predicted_count[0]

# R^2 점수 계산 (2022-2024년 데이터에 대한 모델의 설명력)
    y_pred = model.predict(X)
    r2 = r2_score(Y, y_pred)
    r2_list.append(r2)

# R^2 Score 평균 출력
average_r2 = np.mean(r2_list)
print("Average R^2 Score:", average_r2)

print(pivot_prediction.head())

# 엑셀 파일로 저장
pivot_prediction.to_excel('C:\\Users\\KOPO\\OneDrive - 한국폴리텍대학\\폴리텍\\프로젝트\\samsung\\2025_prediction.xlsx', index=True)

결과

결과 분석 및 시각화

  • 시각화:
    Seaborn의 FacetGrid를 이용하여 요일별로 각 시간대의 트래픽 추이를 시각화.
    이를 통해 각 시간대 및 요일별 트래픽 변화 패턴을 시각적으로 확인함.
더보기

코드

import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = "Malgun Gothic"

# pivot_DF를 길게 변환하여 pivot_long 생성
pivot_long = pivot_prediction.reset_index().melt(id_vars=["요일", "시간대"], var_name="연도", value_name="건수합계")

# FacetGrid를 사용하여 요일을 별도의 서브플롯으로 분리하고, 시간대를 hue로 설정
g = sns.FacetGrid(pivot_long, col="요일", hue="시간대", height=4, aspect=1.2, col_wrap=3)
g.map(sns.lineplot, "연도", "건수합계", marker="o")
g.add_legend(title="시간대")
g.set_axis_labels("연도", "건수 합계")
g.set_titles("{col_name}요일")

# x축을 정수 연도 값으로만 설정
for ax in g.axes.flat:
    ax.set_xticks([2022, 2023, 2024, 2025])  # 연도 단위로 눈금 설정

plt.subplots_adjust(top=0.9)
g.fig.suptitle("요일별 시간대 및 연도에 따른 건수 합계 변화")
plt.show()

결과

 

결과 및 고찰

  • 서버 과부하 방지:
    2025년 요일 및 시간대별 트래픽을 예측하여, 트래픽 급증이 예상되는 시간대에 서버 과부하를 예방할 수 있는 근거데이터를 제시할 수 있음
  • 모델 신뢰도 검증: R² 점수를 통해 모델의 설명력을 확인하여, 평균 R² 점수를 바탕으로 예측 결과의 신뢰도를 평가

이번 분석에서는 시간대 및 요일별 판매 건수를 중심으로 패턴을 파악하고 서버 과부하를 방지하기 위한 기초데이터를 확보하고자 했습니다.

하지만 트래픽 패턴을 보다 정확하게 분석하기 위해서는 판매 건수 외에도 클릭 수, 장바구니 추가 횟수, 페이지 방문 수 등 다양한 지표가 포함되어야 합니다.

이후에는 여러 데이터들을 결합해 보다 정교하게 분석하여 예측의 신뢰도를 높이고자 합니다.

2025_prediction.ipynb
0.23MB
2025_prediction.xlsx
0.01MB

'데이터분석' 카테고리의 다른 글

판매율 기반 군집  (0) 2024.10.11
다음달 판매 예측  (0) 2024.10.02
Boston 범죄데이터 분석  (0) 2024.09.30
제품 판매 데이터 분석  (0) 2024.07.22