[Dacon] 구내식당 식수 예측

데이콘 실무역량 강화교육을 통해 경험했던 첫 번째 프로젝트에 대한 코드입니다. 코랩을 사용하였고 간단한 EDA를 통해 데이터의 특성을 파악하고 그에 따른 모델을 만들어 식수인원을 예측해보았습니다.

from google.colab import drive
drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score, train_test_split, KFold
from sklearn.metrics import mean_squared_error, make_scorer
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from sklearn.metrics import mean_absolute_error

1.데이터 로드, 전처리

train = pd.read_csv('/content/drive/MyDrive/235743_구내식당 식사 인원 예측 AI 경진대회_data (1)/train.csv')
test = pd.read_csv('/content/drive/MyDrive/235743_구내식당 식사 인원 예측 AI 경진대회_data (1)/test.csv')
submission = pd.read_csv('/content/drive/MyDrive/235743_구내식당 식사 인원 예측 AI 경진대회_data (1)/sample_submission.csv')
train.head(1)
           일자 요일  본사정원수  본사휴가자수  본사출장자수  본사시간외근무명령서승인건수  현본사소속재택근무자수  \
0  2016-02-01  월   2601      50     150             238          0.0   

                                                조식메뉴  \
0  모닝롤/찐빵  우유/두유/주스 계란후라이  호두죽/쌀밥 (쌀:국내산) 된장찌개  쥐...   

                                                중식메뉴  \
0  쌀밥/잡곡밥 (쌀,현미흑미:국내산) 오징어찌개  쇠불고기 (쇠고기:호주산) 계란찜 ...   

                                                석식메뉴     중식계    석식계  
0  쌀밥/잡곡밥 (쌀,현미흑미:국내산) 육개장  자반고등어구이  두부조림  건파래무침 ...  1039.0  331.0  
test.head(1)
           일자 요일  본사정원수  본사휴가자수  본사출장자수  본사시간외근무명령서승인건수  현본사소속재택근무자수  \
0  2021-01-27  수   2983      88     182               5        358.0   

                                                조식메뉴  \
0  모닝롤/연유버터베이글 우유/주스 계란후라이/찐계란 단호박죽/흑미밥 우거지국 고기완자...   

                                                중식메뉴  \
0  쌀밥/흑미밥/찰현미밥 대구지리 매운돈갈비찜 오꼬노미계란말이 상추무침 포기김치 양상추...   

                                            석식메뉴  
0  흑미밥 얼큰순두부찌개 쇠고기우엉볶음 버섯햄볶음 (New)아삭이고추무절임 포기김치   
submission.head(1)
           일자  중식계  석식계
0  2021-01-27    0    0
# 석식이용인원 0인 날 삭제
train = train[train['석식계'] != 0]

#요일 숫자로 변경
train.loc[train['요일']=='월','요일'] =1
train.loc[train['요일']=='화','요일'] =2
train.loc[train['요일']=='수','요일'] =3
train.loc[train['요일']=='목','요일'] =4
train.loc[train['요일']=='금','요일'] =5

#월,일 컬럼 추가
def month(text:str):
  return int(text[5:7])

train['월'] = train['일자'].map(month)

def day(text:str):
  return int(text[-2:])

train['일'] = train['일자'].map(day)

train.head()

#현재원 컬럼 추가
train['현재원'] = train['본사정원수'] - train['본사휴가자수'] - train['본사출장자수'] -train['현본사소속재택근무자수']
/usr/local/lib/python3.7/dist-packages/pandas/core/indexing.py:1817: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self._setitem_single_column(loc, value, pi)
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:15: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  from ipykernel import kernelapp as app
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:20: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:25: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
#요일 숫자로 변경
test.loc[test['요일']=='월','요일'] =1
test.loc[test['요일']=='화','요일'] =2
test.loc[test['요일']=='수','요일'] =3
test.loc[test['요일']=='목','요일'] =4
test.loc[test['요일']=='금','요일'] =5

#월,일 컬럼 추가
def month(text:str):
  return int(text[5:7])

test['월'] = test['일자'].map(month)

def day(text:str):
  return int(text[-2:])

test['일'] = test['일자'].map(day)

test.head()

#현재원 컬럼 추가
test['현재원'] = test['본사정원수'] - test['본사휴가자수'] - test['본사출장자수'] -test['현본사소속재택근무자수']
test.head()
           일자 요일  본사정원수  본사휴가자수  본사출장자수  본사시간외근무명령서승인건수  현본사소속재택근무자수  \
0  2021-01-27  3   2983      88     182               5        358.0   
1  2021-01-28  4   2983     104     212             409        348.0   
2  2021-01-29  5   2983     270     249               0        294.0   
3  2021-02-01  1   2924     108     154             538        322.0   
4  2021-02-02  2   2924      62     186             455        314.0   

                                                조식메뉴  \
0  모닝롤/연유버터베이글 우유/주스 계란후라이/찐계란 단호박죽/흑미밥 우거지국 고기완자...   
1  모닝롤/대만샌드위치 우유/주스 계란후라이/찐계란 누룽지탕/흑미밥 황태국 시래기지짐 ...   
2  모닝롤/핫케익 우유/주스 계란후라이/찐계란 오곡죽/흑미밥 매생이굴국 고구마순볶음 양...   
3  모닝롤/촉촉한치즈케익 우유/주스 계란후라이/찐계란 누룽지탕/흑미밥 두부김칫국 새우완...   
4  모닝롤/토마토샌드 우유/주스 계란후라이/찐계란 채소죽/흑미밥 호박맑은국 오이생채 양...   

                                                중식메뉴  \
0  쌀밥/흑미밥/찰현미밥 대구지리 매운돈갈비찜 오꼬노미계란말이 상추무침 포기김치 양상추...   
1  쌀밥/보리밥/찰현미밥 우렁된장찌개 오리주물럭 청양부추전 수제삼색무쌈 겉절이김치 양상...   
2  쌀밥/흑미밥/찰현미밥 팽이장국 수제돈까스*소스 가자미조림 동초나물무침 포기김치 양상...   
3  쌀밥/흑미밥/찰현미밥 배추들깨국 오리대패불고기 시금치프리타타 부추고추장무침 포기김치...   
4  쌀밥/팥밥/찰현미밥 부대찌개 닭살데리야끼조림 버섯탕수 세발나물무침 알타리김치/사과푸...   

                                            석식메뉴  월   일     현재원  
0  흑미밥 얼큰순두부찌개 쇠고기우엉볶음 버섯햄볶음 (New)아삭이고추무절임 포기김치   1  27  2355.0  
1            충무김밥 우동국물 오징어무침 꽃맛살샐러드 얼갈이쌈장무침 석박지   1  28  2319.0  
2            흑미밥 물만둣국 카레찜닭 숯불양념꼬지어묵 꼬시래기무침 포기김치   1  29  2170.0  
3           흑미밥 동태탕 돈육꽈리고추장조림 당면채소무침 모자반무침 포기김치   2   1  2340.0  
4       흑미밥 바지락살국 쇠고기청경채볶음 두부구이*볶은김치 머위된장무침 백김치   2   2  2362.0  

2.랜덤포레스트 모델

1) 중식계 예측 모델

features= [
 '월',
 '일',
 '현재원',
 '본사휴가자수',
 '본사출장자수',
 '본사시간외근무명령서승인건수',
 '현본사소속재택근무자수',
 '중식계']
features = features[:-1]

X = train[features]
y = train['중식계']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=121)

lunch_model = XGBRegressor()

lunch_model.fit(X_train,y_train)

lunch_count_predict = lunch_model.predict(X_test[features])
[12:40:40] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.
lunch_count_predict
array([ 945.72906,  539.6704 , 1186.4695 , 1000.1311 ,  866.5936 ,
       1179.529  , 1090.462  , 1015.5139 ,  824.95374,  749.7693 ,
        912.766  ,  820.5057 ,  864.0983 ,  618.9503 , 1022.23706,
        903.33545,  862.64636, 1002.95233,  869.6132 ,  886.7356 ,
        702.4766 ,  898.84064,  867.4587 ,  908.203  ,  838.39294,
        820.34595,  654.7836 ,  951.83514,  940.3116 ,  912.1308 ,
        967.53107,  829.6354 , 1175.6791 ,  930.3572 ,  857.8167 ,
        871.6047 ,  941.6267 ,  631.5817 ,  991.15234,  958.33734,
        572.5593 , 1095.0574 ,  998.5118 ,  895.9858 ,  860.61365,
       1123.1451 ,  749.8649 ,  993.2236 , 1186.4003 ,  783.4473 ,
       1045.7416 , 1198.7057 , 1062.2472 , 1032.5531 ,  922.61176,
       1231.4353 , 1197.9161 ,  579.7688 ,  795.3104 ,  663.2518 ,
        966.3141 ,  943.6151 ,  875.8223 ,  961.96967, 1149.7561 ,
        731.13   ,  746.8876 , 1053.3972 ,  600.7532 ,  539.03345,
        880.67645,  842.24347,  898.4181 ,  759.09186,  874.743  ,
       1170.4321 ,  877.7689 ,  871.3899 , 1132.841  , 1150.67   ,
       1085.3727 ,  904.3873 ,  847.164  ,  949.7919 , 1046.3679 ,
        927.10596,  859.9272 ,  775.84216, 1165.0404 ,  605.0369 ,
        397.76468,  948.38763,  793.17267, 1108.1409 ,  670.02026,
        836.3036 ,  851.8093 ,  726.95166,  957.61395,  772.92035,
        933.2524 , 1201.1577 ,  938.01526,  750.73236,  641.255  ,
        884.43225,  862.0689 , 1021.932  ,  741.13165,  702.452  ,
        870.5559 ,  719.277  ,  866.1785 ,  933.4715 , 1165.7429 ,
        927.05255, 1080.068  ,  745.60345,  826.38367, 1045.7416 ,
        926.73016,  899.98755, 1149.8062 , 1100.2124 , 1088.5576 ,
        847.4715 ,  891.8503 ,  541.43536,  786.1559 , 1231.6101 ,
       1126.5914 ,  677.0973 ,  747.98315,  781.1359 ,  907.05035,
       1135.4366 ,  953.1696 ,  968.1085 ,  797.1345 ,  829.36163,
        948.31726,  806.768  ,  958.382  ,  892.5848 , 1157.5659 ,
        680.4911 ,  928.4836 ,  903.1377 ,  911.29047, 1037.3842 ,
       1121.2179 ,  951.7742 ,  521.12683,  867.3005 ,  811.7522 ,
       1127.2616 ,  695.6873 ,  744.62915,  693.4935 ,  985.8001 ,
        620.4086 , 1050.0452 ,  971.53986,  830.3142 ,  834.98944,
       1052.7211 , 1103.9701 ,  654.7836 ,  548.16016,  637.187  ,
        914.1126 ,  595.23083,  828.99005,  947.46606,  976.89294,
       1208.3907 ,  799.8632 ,  710.0127 ,  833.639  ,  813.0613 ,
        751.99176,  960.1474 , 1121.0444 ,  612.2651 ,  873.08484,
        951.23047, 1021.57623,  918.07623,  841.03125,  941.181  ,
        877.2818 ,  936.2629 ,  907.5369 ,  904.9996 ,  723.80414,
       1092.5776 ,  783.09357,  684.5076 , 1238.9667 ,  877.38605,
        639.3852 ,  968.8393 ,  820.5667 ,  909.1334 , 1266.623  ,
        941.17206,  768.3477 ,  971.9485 ,  647.83093,  740.97424,
        604.58167,  908.203  ,  569.7109 , 1204.2941 ,  734.0915 ,
        602.7272 ,  813.4198 , 1176.5483 ,  974.48   ,  784.04193,
        666.133  , 1118.6285 ,  979.6803 ,  989.7375 ,  577.63275,
        926.74585, 1169.1998 ,  879.5887 , 1166.3804 ,  935.2413 ,
        605.6789 ,  692.4347 ,  854.79974,  731.7876 ,  802.7087 ,
       1068.8733 , 1028.7754 , 1135.6577 ,  867.25586,  996.7889 ,
       1248.1224 ,  928.75183,  887.4299 ,  949.27423,  853.7457 ,
        757.33093, 1144.966  ,  607.1081 ,  790.24036, 1020.96344,
        887.75024, 1118.3428 ,  602.80756, 1195.208  ,  786.3926 ,
        554.8449 ,  894.1206 ,  907.6923 ,  659.589  ,  883.43445,
        808.6752 ,  738.56683, 1002.5877 ,  907.376  ,  817.523  ,
        820.7947 , 1078.0437 ,  718.6383 ,  589.1289 , 1058.8018 ,
       1031.9985 ,  775.413  ,  867.3005 , 1083.4542 ,  886.41797,
        859.06256, 1184.3181 , 1134.058  ,  695.4951 ,  924.43933,
        749.54834,  990.0405 ,  983.5169 ,  686.65796, 1217.0554 ,
       1190.5892 ,  930.9009 ,  893.369  ,  718.7207 ,  792.41833,
        528.152  ,  798.1784 ,  931.7515 , 1065.5066 , 1224.7103 ,
        664.31433,  872.8551 ,  993.2236 ,  554.53296, 1125.5431 ,
        938.55597, 1211.1798 ,  874.6232 ,  561.23956,  617.21765,
        772.92035, 1171.1814 ,  855.8379 ,  886.93115, 1035.8958 ,
        511.5861 ,  648.32635, 1079.765  ,  548.4623 ,  691.4108 ,
        625.8013 ,  943.7871 ,  929.40137,  843.5466 ,  907.48883,
        585.81683,  791.13385,  943.80414, 1174.2709 ,  886.4823 ,
        651.3803 , 1118.5608 ,  618.7849 , 1188.1068 ,  972.6595 ,
       1044.0734 ,  689.3907 ,  658.0526 , 1152.7595 ,  842.5968 ,
       1037.5266 ,  944.82477,  897.6893 , 1197.9519 , 1071.4222 ,
        863.40106,  897.5146 ,  986.6445 ,  594.67926,  977.44147,
       1125.7396 , 1169.0137 ,  641.5496 , 1105.3958 ], dtype=float32)
mean_absolute_error(y_test, lunch_count_predict)
80.4657417887603
plt.plot(lunch_count_predict)
plt.show()

#lunch_model.estimators_

2) 석식계 예측 모델

features
['월', '일', '현재원', '본사휴가자수', '본사출장자수', '본사시간외근무명령서승인건수', '현본사소속재택근무자수']
features.append('중식계')
features
['월', '일', '현재원', '본사휴가자수', '본사출장자수', '본사시간외근무명령서승인건수', '현본사소속재택근무자수', '중식계']
test['중식계'] = lunch_count_predict
test.head()
           일자 요일  본사정원수  본사휴가자수  본사출장자수  본사시간외근무명령서승인건수  현본사소속재택근무자수  \
0  2021-01-27  3   2983      88     182               5        358.0   
1  2021-01-28  4   2983     104     212             409        348.0   
2  2021-01-29  5   2983     270     249               0        294.0   
3  2021-02-01  1   2924     108     154             538        322.0   
4  2021-02-02  2   2924      62     186             455        314.0   

                                                조식메뉴  \
0  모닝롤/연유버터베이글 우유/주스 계란후라이/찐계란 단호박죽/흑미밥 우거지국 고기완자...   
1  모닝롤/대만샌드위치 우유/주스 계란후라이/찐계란 누룽지탕/흑미밥 황태국 시래기지짐 ...   
2  모닝롤/핫케익 우유/주스 계란후라이/찐계란 오곡죽/흑미밥 매생이굴국 고구마순볶음 양...   
3  모닝롤/촉촉한치즈케익 우유/주스 계란후라이/찐계란 누룽지탕/흑미밥 두부김칫국 새우완...   
4  모닝롤/토마토샌드 우유/주스 계란후라이/찐계란 채소죽/흑미밥 호박맑은국 오이생채 양...   

                                                중식메뉴  \
0  쌀밥/흑미밥/찰현미밥 대구지리 매운돈갈비찜 오꼬노미계란말이 상추무침 포기김치 양상추...   
1  쌀밥/보리밥/찰현미밥 우렁된장찌개 오리주물럭 청양부추전 수제삼색무쌈 겉절이김치 양상...   
2  쌀밥/흑미밥/찰현미밥 팽이장국 수제돈까스*소스 가자미조림 동초나물무침 포기김치 양상...   
3  쌀밥/흑미밥/찰현미밥 배추들깨국 오리대패불고기 시금치프리타타 부추고추장무침 포기김치...   
4  쌀밥/팥밥/찰현미밥 부대찌개 닭살데리야끼조림 버섯탕수 세발나물무침 알타리김치/사과푸...   

                                            석식메뉴  월   일     현재원          중식계  
0  흑미밥 얼큰순두부찌개 쇠고기우엉볶음 버섯햄볶음 (New)아삭이고추무절임 포기김치   1  27  2355.0   982.415771  
1            충무김밥 우동국물 오징어무침 꽃맛살샐러드 얼갈이쌈장무침 석박지   1  28  2319.0   993.918274  
2            흑미밥 물만둣국 카레찜닭 숯불양념꼬지어묵 꼬시래기무침 포기김치   1  29  2170.0   582.148621  
3           흑미밥 동태탕 돈육꽈리고추장조림 당면채소무침 모자반무침 포기김치   2   1  2340.0  1194.138306  
4       흑미밥 바지락살국 쇠고기청경채볶음 두부구이*볶은김치 머위된장무침 백김치   2   2  2362.0  1070.221436  
X = train[features]
y = train['석식계']

dinner_model = XGBRegressor()


dinner_model.fit(X,y)

dinner_count_predict = dinner_model.predict(test[features])

plt.plot(dinner_count_predict)
plt.show()
[12:28:28] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.

submission['중식계'] = lunch_count_predict
submission['석식계'] = dinner_count_predict
submission.to_csv('submission.csv',index=False)