2024.02.10
샘플 프로젝트 1 마트 수요/매출 예측
A마트는 주52시간제 운영으로 인하여 인력난을 겪고 있다. 주 당 판매량을 예측할 수 없기 때문에 근무 스케줄과 인력 운영을
효율적으로 하기 힘든 상황이다. 대기업 마트가 아니기 때문에 방문자 수, 주차 대수 등 세세한 데이터를 수집할 수 없는 상황이다. 효율적인 인력 운영을 위하여 공공 데이터와 쉽게 구할 수 있는 데이터를 활용하여 주간 마트 판매량 예측을 통해 인력운영을 효율화 하고자 한다.
-문제 정의
:인력운영 비효율로 인한 운영 비용 상승
#현재 주52시간제 운영과 대기업 마트가 아닌 관계로 인력 운영의 비효율은 운영 비용에 부정적인 영향을 끼친다
#따라서 현재 문제 즉, 인력 운영 비효율을 줄여야하고 운영 비용을 절감시켜야 한다.
-기대 효과
: 인력 운영 효율화 증가로 인한 운영 비용 절감
#인력 운영을 효율화 시켜서 운영 비용을 줄여야한다.
-해결방안
:주간 판매량을 예측하여 인력 운영 스케줄 조정
#주간 판매량 데이터를 모아서 예측을 하고 예측을 기반한 데이터로 인력 운영 스케줄을 조정해야한다.
-성과측정
:주간 판매량 예측량에 따른 스케줄 조정 후 운영 비용 모니터링
#주간 판매량을 예측해서 스케줄을 조정 하게 되면 운영 비용이 절감된다. 따라서 인력난을 어느정도 해결할 수 있다.
#정확한 주간 판매량을 예측할 수 없기 때문에 이후에도 운영 비용에 대해서는 모니터링을 해야한다.
-운영
:1주가 종료되면 차주 판매량을 예측하기 위한 공공데이터 및 내부 데이터 수집
:데이터를 통해 Model에 Input후 주간 판매량 추출
:주간 판매량에 따라 인력 운영 계획 수립
from google.colab import drive
drive.mount('/content/drive')
#구글 colab에서 구글 드라이브 데이터에 접근하기
import os #os 모듈을 호출
os.chdir('/content/drive/MyDrive/샘플 프로젝트/1') #os.chdir(CHange DIRectory) : 디렉토리 변경
os.getcwd() # os.getcwd(GET Current Directory) : 현재 디렉토리 확인하기
import pandas as pd #pandas 모듈을 pd라고 임포트한다
df = pd.readcsv('S_PJT01_DATA.csv') # df라는 변수는 S~DATA.csv파일을 pandas로 읽은 값이다.
df.head() # head = limit 5와 같은 것 , 상위 5개의 행을 출력
2.1 판매 추이 분석 - Data 전처리
print ('df',df.shape) # shape는 데이터 df의 (행,열) 크기를 출력
#이걸로 현재 df에는 (6435row , 8col)로 구성되어 있음
df.info() # info는 데이터 df의 정보를 출력합니다.
print(df.insull().sum()) # 데이터프레임의 null값의 개수를 확인하기
#null값이 있다는건 data에 빈 값이 존재한다는 것이기 때문에 Null이 없는지 확인해야한다.
df.describe() # outlier확인하기 데이터 프레임의 전반적인 데이터를 보여준다.
df['Temperature'] = (df['Temperature']-32) / 1.8 # 화씨 온도를 섭씨로 변환 , 화씨 = 9/5(1.8) * 섭씨+ 32
df.head()
df['Temperature'].describe() #섭씨로 변경된 온도의 전반적인 데이터프레임을 표시(outlier 표시)
#outlier는 정상적인 범주를 벗어난 Data를 확인하기 위해 사용한다.
import datetime #datetime 모듈을 임포트
df['Date'] = pd.to_datetime(df['Date']) # 현재 Date의 datatype이 object로 되어있어서 datetime으로 바꿔준다
df.info() #Date의 데이터타입이 datetime으로 바꼇는지 확인
2.2 판매 추이 분석
len(df['Store'].unique()) # df의 Store 칼럼이 총 몇개인지 확인하기 -> 45개의 Store
#len : 길이,크기를 나타내는 함수 , unique = distinct 처럼 중복을 제거해준다 이때 배열로 들어가게 된다.
#위에 값을 len을 빼고 df['Store].unique만 출력하게 되면 arrary([1~45])가 리턴된다.
df['Store'].nunique() # Store의 개수를 표현
#nunique는 데이터에 고유값들 수를 출력해주는 함수이다
df = df.sort_values(by=['Date']) # 날짜를 기준으로 오름차순으로 정리해준다
#테이블.sort_values(by = 기준칼럼 ,(ascending = True or False) )
#주간 매출량을 분석할 것이기 때문에 날짜를 기준으로 오름차순을 하는 것 같다
df.head() #제대로 정렬이 됬는지 확인하기
df['Date'].min() , df['Date'].max()
#데이터가 어느날부터 어느날까지 있는 확인한다.
df1 = df[df['Store']==1].sort_values(by=['Date']) # 1번 Store 데이터 정리 (df1)
#df1은 df[ ] 중에서 df['Store']값이 1일때만 Date를 기준으로 오름차순 정렬을 한다.
df1.head(10) #항상 확인해준다.
import seaborn as sns # seaborn 라이브러리를 sns라고 임포트한다
#seaborn은 파이썬 데이터 시각화 라이브러리 중 하나이다.
import matplotlib.pyplot as plt #matplotlib 라이브러리를 plt라고 임포트한다
%matplotlib inline # notebook을 실행한 브라우저에서 바로 그림을 볼 수 있게 해주는 것 입니다.
plt.style.use(['dark_background']) #matplotlib.style.use()를 사용해서 다양한 스타일을 지정할 수 있습니다.
plt.plot(df1['Date'], df1['Weekly_Sales'], label='Store1'); # x축을 Date y축을 주간 판매량으로한 Store1 그래프
plt.gcf().set_size_inches(25,6) # inches(너비,높이)
df2 = df[df['Store']==2].sort_values(by['Date']) # Store 값이 2이면 df2에 데이터를 넣는다.
plt.plot(df2['Date'], df2['Weekly_Sales'], label ='Store2'); # x축을 Date y축을 주간 판매량으로한 Store2 그래프
plt.gcf().set_size_inches(25,6)
df3 = df[df['Store']==3].sort_values(by=['Date']) # Store 값이 3이면 df3에 데이터를 넣는다.
plt.plot(df3['Date'], df3['Weekly_Sales'], label = 'Store3'); # x축을 Date y축을 주간 판매량으로한 Store3 그래프
plt.gcf().set_size_inches(25,6)
plt.legend() # 그래프에 범례를 넣을 때 사용한다.
df_concat = pd.DataFrame({'Date' : list(df1['Date']) ,
'Store1_sales': list(df1['Weekly_Sales']),
'Store2_sales': list(df2['Weekly_Sales']),
'Store3_sales': list(df3['Weekly_Sales'])}) #df1,df2,df3의 리스트를 concat으로 이어서 표시
df_concat
#store 1과 store2는 어느정도 판매량이 비슷한데 store3은 1,2에 비해 판매량 수준이 명백하게 다름
#온도와 주간 판매량 관계 확인
fig, ax1 = plt.subplots()
#fig, ax = plt.subplots() : 하나의 ax 만을 가지는 하나의 figure 생성
ax1.plot(df1['Date'], df1['Weekly_Sales'], color='green', label='WeeklySales')
#x축을 Date 왼쪽y축을 Weekly_Sales 변수로 두고 그래프를 그린다.
ax2 = ax1.twinx()
#이중축 그리기
ax2.plot(df1['Date'], df1['Temperature'], color='deeppink', label='Temp')
#x축을 Date 우측y축을 Temperature 변수로 두고 그래프를 그린다.
plt.gcf().set_size_inches(25, 6)
fig.legend()
plt.show()
#연료 가격과 주간 판매량 관계 확인
fig, ax1 = plt.subplots()
ax1.plot(df1['Date'], df1['Weekly_Sales'], color='green', label= 'WeeklySales')
ax2 = ax1.twinx()
ax2.plot(df1['Date'], df1['Fuel_Price'], color='deeppink', label='Fuel')
#x축을 Date 우측y축을 Fuel_Price 변수로 두고 그래프를 그린다.
plt.gcf().set_size_inches(25, 6)
fig.legend()
plt.show()
#CPI와 주간 판매량 관계 확인
fig, ax1 = plt.subplots()
ax1.plot(df1['Date'], df1['Weekly_Sales'], color='green', label='WS')
ax2 = ax1.twinx()
ax2.plot(df1['Date'], df1['CPI'], color='deeppink', label='CPI')
#x축을 Date 우측y축을 CPI변수로 두고 그래프를 그린다.
plt.gcf().set_size_inches(25, 6)
fig.legend()
plt.show()
#실업률과 주간 판매량
fig, ax1 = plt.subplots()
ax1.plot(df1['Date'], df1['Weekly_Sales'], color='green', label='WS')
ax2 = ax1.twinx()
ax2.plot(df1['Date'], df1['Unemployment'], color='deeppink',label='Unemploy')
x축을 Date 우측y축을 Unemployment변수로 두고 그래프를 그린다.
plt.gcf().set_size_inches(25, 6)
fig.legend()
plt.show()
3.2 상관관계 분석
df_corr = df1.drop(['Store', 'Holiday_Flag', 'Date'], axis=1)
df_corr.corr()