KT AIVLE School 미니프로젝트 6-1, 1일차(데이터분석)
6차 미니프로젝트를 진행 했을때 기억에 인상 깊게 남아서 회고를 할 생각으로 이 글을 작성한다
프로젝트 목적은 여러개의 .csv 형식의 데이터가 주어지면 특정 상점의 특정 물건의 판매량을 예측해 미리 재고를 채워 넣을 수 있게
물건 발주를 도와줄 수 있는 딥러닝 모델을 만드는 것이 목표이다.
실제로 있을법한 비지니스 상황에 대해 분석을 하는 것에 흥미를 느꼇다
먼저 데이터는 유가, 주문 수, 판매량 수, 상점 목록이 주어졌다.
# csv 데이터를 먼저 가져온다
oil_price = pd.read_csv(path + 'train/oil_price_train.csv')
orders = pd.read_csv(path + 'train/orders_train.csv')
sales = pd.read_csv(path + 'train/sales_train.csv')
products = pd.read_csv(path + 'train/products.csv')
stores = pd.read_csv(path + 'train/stores.csv')
# 열의 날짜 값을 datetime 형식으로 바꿔준다
sales['Date'] = pd.to_datetime(sales['Date'] )
oil_price['Date'] = pd.to_datetime(oil_price['Date'] )
orders['Date'] = pd.to_datetime(orders['Date'] )
목표로하는 매장은 44번 매장 따라서 44번 매장에 대해서만 데이터를 가져온다
또 3번, 13번, 42번 상품에 대해서만 분석을 요구하기에 .isin 함수를 사용하여 데이터를 한번더 처리해서 변수에 저장한다
# 대상 매장, 상품 추출
target_product_sales = sales.loc[(sales['Store_ID'] == 44) & (sales['Product_ID'].isin([3, 12, 42]))].reset_index(drop=True)
이후 데이터를 그려봤다
plt.figure(figsize=(20, 10)) # 그래프 크기 설정
for product_id in [3, 12, 42]:
product_data = target_product_sales[target_product_sales['Product_ID'] == product_id]
plt.plot(product_data['Date'], product_data['Qty'], label=f'Product ID {product_id}')
# 그래프에 레이블과 제목을 추가합니다.
plt.xlabel('Date')
plt.ylabel('Sales')
plt.title('Sales Trend for Store 44, Product IDs 3, 12, 42')
# 범례를 추가합니다.
plt.legend()
# x축 레이블이 겹치지 않도록 조정합니다.
plt.xticks(rotation=45)
# 그래프를 표시합니다.
plt.grid(True) # 그리드 표시
plt.tight_layout() # 그래프 간격 조정
plt.show()
보면 알 수 있듯이 3, 12번 상품만 판매량에 유의미 한 변동성이 보이고 42번 상품은 그런 변동성을 보지 못했다
에이블스쿨은 팀프로젝트인데 나는 3번 상품을 담당으로 분석하기로 했어서 데이터를 머지 후
우선 3번 상품과 유가를 비교해 보았다
plt.figure(figsize=(20, 10)) # 그래프 크기 설정
# 상품 가격
for product_id in [3]: #, 12, 42]:
product_data = scaled_df[scaled_df['Product_ID'] == product_id]
plt.plot(product_data['Date'], product_data['Qty'], label=f'Product ID {product_id}')
# 오일 가격
plt.plot(scaled_df['Date'], scaled_df['WTI_Price'], label=f'Oil price')
# 그래프에 레이블과 제목을 추가합니다.
plt.xlabel('Date')
plt.ylabel('Sales')
plt.title('Sales of product against the price of oil')
# 범례를 추가합니다.
plt.legend()
# x축 레이블이 겹치지 않도록 조정합니다.
plt.xticks(rotation=45)
# 그래프를 표시합니다.
plt.grid(True) # 그리드 표시
plt.tight_layout() # 그래프 간격 조정
plt.show()
3번 상품과 유가를 그래프로 시각화 해봤을떄 유의미한 상관 관계가 보이지는 않는다.
따라서 데이터 분석에서 유가는 배제하고 분석을 하기로 했다
방문 고객수와 상품 판매량을 비교해 시각화 해보았다
방문 고객수와 판매량이 비슷하게 따라 가는 것을 확인할 수 있다
다음으로 요일별 판매량을 비교해보려고 그래프를 그려보았다
# 요일을 올바른 순서로 정렬하기 위한 딕셔너리 생성
weekday_order = {
'Monday': 0,
'Tuesday': 1,
'Wednesday': 2,
'Thursday': 3,
'Friday': 4,
'Saturday': 5,
'Sunday': 6
}
# 요일 순서를 위한 새로운 컬럼 추가
weekly_avg['Weekday_Order'] = weekly_avg['Weekday'].map(weekday_order)
# 요일 순서에 따라 정렬
weekly_avg = weekly_avg.sort_values(by=['Weekday_Order'])
plt.figure(figsize=(20, 10)) # 그래프 크기 설정
# 판매량 비율
for product_id in [3]: #, 12, 42]:
product_data = weekly_avg[weekly_avg['Product_ID'] == product_id]
plt.plot(product_data['Weekday'], product_data['Qty'], label=f'Product ID {product_id}')
# 그래프에 레이블과 제목을 추가합니다.
plt.xlabel('Weekday')
plt.ylabel('Qty')
plt.title('Comparison of changes by day of the week')
# 범례를 추가합니다.
plt.legend()
# x축 레이블이 겹치지 않도록 조정합니다.
plt.xticks(rotation=45)
# 그래프를 표시합니다.
plt.grid(True) # 그리드 표시
plt.tight_layout() # 그래프 간격 조정
plt.show()
주말에 많은 판매량을 가지는 것을 알 수 있다 주말에 많은 사람이 매장을 방문하기 때문에
방문량에 비례해서 판매량이 오르는 3번 상품 같은 경우에 당연한 결과라고도 볼 수 있다
제공받은 코드로 시계열 데이터도 한번 분석 해보았다
계절성을 띄는 것을 확인 할 수 있었다
결론적으로
음료의 판매량은 방문객 수와 비슷하게 형성되는 것을 확인 할 수 있다 따라서 주말에 높은 판매량을 가지는 것을 확인 할 수 있다
시계열 데이터를 분해 해봤을때 음료의 판매량은 계절성을 가지고 있고 음료의 판매량은 시간에 따라 증가함을 알 수 있다