Ruser

Instacart Market 분석 본문

데이터 분석

Instacart Market 분석

swub 2019. 7. 10. 13:45
Instacart Market Basket Analysis

1. 자료구성

  • 총 206,209명의 고객의 3,421,083건에 대한 주문 정보
  • 마지막 주문을 기준으로 그전의 주문은 prior로 구분, 마지막 주문은 train 또는 test로 구분
  • 주문정보: 날짜(dow), 시간(order_hour_ofday), 상품(product), 재품의 재구매 여부(reorder), 소분류(aisles), 대분류(departments), 카트에 추가한 상품 순서(add_to_card_order)
  • 상품종류: 49,688개
  • 소분류: 134개
  • 대분류: 21개

2. 데이터 분석 목적

인스타카트(Instacart)라는 온라인 기반 농작물 배송 서비스 앱에서 고객들의 개인적인 취향과 니즈를 파악하여 맞춤형 카테고리를 제공하고 고객들이 자신이 원하는 상품들을 쉽게 선택하고 구매할 수 있게끔 고객들의 구매이력을 이용하여 예측률이 높은 모델을 만드려 한다.

3. 데이터 설명

orders

  • orders
    • order_id: 주문번호
    • user_id: 유저 고유 ID
    • eval_set: prior, train, test로 구분됨
    • order_number: user_id별 누적주문 횟수
    • order_dow: 주문한 요일
    • order_hour_of_day: 주문한 시간
    • days_since_prior_order: 현재 주문 이전 주문과의 텀

order_products_train

  • order_products —- 분석에 사용되어지는 데이터
    • order_id: 주문번호
    • product_id: 상품 고유 ID
    • add_to_cart_order: 카트에 추가한 상품 순서
    • reordered: 재주문한 상품

products

  • products
    • product_id: 상품 고유 ID
    • product_name: 상품명
    • aisle_id: 상품 소분류 고유 ID
    • department_id: 상품 대분류 고유 ID
## Warning in instance$preRenderHook(instance): It seems your data is too
## big for client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html

order_products_prior

  • order_products_prior
    • order_id: 주문번호
    • product_id: 상품 고유 ID
    • add_to_cart_order: 카트에 추가한 상품 순서
    • reordered: 재주문한 상품

aisles

  • aisles
    • aisle_id: 상품 소분류 고유 ID
    • aisle: 상품 소분류

departments

  • departments
    • department_id: 상품 대분류 고유 ID
    • department: 상품 대분류

4. 탐색적 자료 분석(EDA)

4-1. 어느 요일에 가장 주문이 많은가??

  • 0과 1에서 주문량이 가장 많다. 0~6이 어느 요일을 나타내는 지는 정확하게 나와있지는 않지만 0과 1이 주말이라서 주문량이 많다고 추측할 수 있다.

4-2. 어느 시간대에 가장 주문이 많은가??

  • 8시부터 16시 정도 사이에 주문량이 일정하게 많다. 이는 근무 시간대에 주문을 하는 고객이 많다고 할 수 있다.

4-3. 어느정도의 텀을 두고 재주문이 많이 일어나는가??

  • 1주일 정도의 텀을 두고 재주문이 많이 일어난다.

4-4. 고객별 이용횟수가 어느정도 되는가??

  • 4번 이용한 고객이 가장 많고 그 이상 이용한 고객은 급격히 떨어진다.

4-5. 1회 주문시 몇가지 종류의 물품을 주문하는가??

  • 1가지만 구매하는 고객이 가장 많고 4~5가지의 종류를 주문하는 고객이 많이 분포한다.

4-6. 가장 많이 팔리는 상품은 무엇인가??

  • TOP10 중 가장 많이 팔리는 상품은 바나나이고 그 다음으로도 유기농 바나나가 많이 팔린다.

table

product_id count product_name
24852 18726 Banana
13176 15480 Bag of Organic Bananas
21137 10894 Organic Strawberries
21903 9784 Organic Baby Spinach
47626 8135 Large Lemon
47766 7409 Organic Avocado
47209 7293 Organic Hass Avocado
16797 6494 Strawberries
26209 6033 Limes
27966 5546 Organic Raspberries

barplot

4-7. 어떤 상품이 재구매율이 높은가??

  • 우유가 재구매율이 90% 이상으로 매우 높으며 전체적으로 음료류가 재구매율이 높은 것으로 나온다.
product_id proportion_reordered n product_name
1729 0.9347826 92 2% Lactose Free Milk
20940 0.9130435 368 Organic Low Fat Milk
12193 0.8983051 59 100% Florida Orange Juice
21038 0.8888889 81 Organic Spelt Tortillas
31764 0.8888889 45 Original Sparkling Seltzer Water Cans
24852 0.8841717 18726 Banana
117 0.8833333 120 Petit Suisse Fruit
39180 0.8819876 483 Organic Lowfat 1% Milk
12384 0.8810409 269 Organic Lactose Free 1% Lowfat Milk
24024 0.8785249 461 1% Lowfat Milk

4-8. 주문수가 많은 상품은 재주문가능성이 높은가??

  • 주문수가 높을수록 재주문할 가능성이 높지만 최대한계가 있는것으로 보인다.
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

5. treemap을 이용한 Visualizing

5-1. 대분류별 소분류

  • instacart에 판매되는 상품은 21개의 대분류와 134개의 소분류로 이루어져있다.
  • 같은색상의 상자안에 있는 소분류들은 같은 색상의 대분류에 속해있다.

5-2. 각각의 대분류/소분류 내에 상품의 종류

  • 각각의 대분류/소분류 상자의 크기가 상품의 종류를 보여준다. (크기가 클수록 종류가 많다)

5-3. 대분류/소분류 별 판매량

  • 상자의 크기가 판매량을 나타낸다.
  • 과일, 야채 종류등이 가장 많이 팔리고 그 다음으로 유상품이 많이 팔린다.

6. 연관규칙분석(Association Rule Analysis)

  • 연관규칙분석이란 비지도학습으로 고객의 대규모 거래데이터로부터 동시 구매 상품을 찾아 상품 간의 연관성을 도출하고 고객이 특정 상품 구매 시 이와 연관성 높은 상품을 추천
  • 필요데이터: 주문번호, 고객ID, 구매상품코드
  • 연관규칙의 척도: 지지도(support), 신뢰도(confidence), 향상도(lift), IS측도, 교차지지도
  • X 와 Y를 서로 공통원소가 없는 항목들의 집합이라고 할 경우
  • 지지도(Support):
    • s(X,Y) = X와 Y를 모두 포함하는 거래 수 / 전체 거래 수 = n(X U Y) / N
    • 지지도는 빈도가 높거나 구성비가 높은 규칙을 찾거나, 가지치기(prunning)의 기준으로 사용한다.
  • 신뢰도(Confidence):
    • c(X,Y) = X와 Y를 모두 포함하는 거래 수 / X가 포함된 거래 수 = n(X U Y) / n(X)
    • 신뢰도가 높을 수록 유용한 규칙일 가능성이 높다가 할 수 있다.
  • 향상도(Lift):
    • lift(X,Y) = 연관규칙의 신뢰도 / 지지도 = c(X,Y) / s(Y)
    • 향상도가 1보다 크면 양의 상관관계가 있고 1보다 작으면 음의 상관관계가 있으며 X와 Y가 독립일 경우 Lift = 1이 나온다.
  • IS측도(Interest-Support 측도):
    • IS(A,B) = \(sqrt(Lift(A,B)Xs(A,B)) = \frac{s(A,B)}{s(A),s(B)}\)
    • 향상도와 지지도 모두 높을수록 IS측도가 커지므로 둘 중 하나라도 작으면 IS측도가 작아지게 된다. 따라서 둘다 높은 rule만 선별할 수 있다.
  • 지지도, 신뢰도, 향상도가 모두 높은 rule이 매출에 영향을 주는 좋은 rule이 된다.
  • 지지도가 낮으면서 신뢰도, 향상도가 높다면 실효성이 떨어지므로 좋은 rule이 되지 않는다.

6-1. R 패키지 “arules” 사용

  • 연관규칙분석을 하기 위한 R 패키지 “arules”
  • “arules”패키지에서는 연관규칙을 효율적으로 도출할 수 있도록 Apriori algorithm을 사용한다.
  • Apriori algorithm: 상품이 많아 집합이 늘어날 경우 rule이 상당히 많이 증가함으로 최소 지지도와 최소 신뢰도를 설정함으로 항목집합의 개수를 줄여 주는 역할.
# install.packages("arules")
library(arules)
## Loading required package: Matrix
## 
## Attaching package: 'arules'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
# install.packages("arulesViz")
library(arulesViz)
## Loading required package: grid

6-2. 데이터 확보 및 탐색

  • train 데이터셋의 주문번호, 고객ID, 구매상품코드을 이용하여 sparse formay 형식으로 저장된 item Matrix의 거래(transactions) 데이터셋으로 만들어준다.
  • 131209개의 행(거래 수)과 39123개의 열(상품 수)로 구성되어 있다.
  • 전체 131209*39123개의 cell중에 0.000269%정도가 값을 가지고 있다 이는 전체 상품의 수는 많지만 한번의 거래에 다양한 상품을 구매하지 않아서 밀도가 낮게 나온다고 볼 수 있다.
  • most frequent items를 보면 가장 많이 팔리는 제품 top 5개의 빈도를 보여주고 있으며 상품 고유 ID가 24852인 상품이 18726개로 가장 많이 팔렸다.
  • element(itemset/transaction)은 거래 한번(row 별로)에 상품의 개수를 세어 거래당 상품 수 의 빈도를 보여주고 있으며 한번의 거래에 6가지 상품을 동시 주문한 경우가 8708로 가장 많다.
sp_for <- as(split(order_products$product_id, order_products$order_id), "transactions")
summary(sp_for)
## transactions as itemMatrix in sparse format with
##  131209 rows (elements/itemsets/transactions) and
##  39123 columns (items) and a density of 0.0002697329 
## 
## most frequent items:
##   24852   13176   21137   21903   47626 (Other) 
##   18726   15480   10894    9784    8135 1321598 
## 
## element (itemset/transaction) length distribution:
## sizes
##    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15 
## 6845 7368 8033 8218 8895 8708 8541 7983 7217 6553 6034 5383 4843 4394 3831 
##   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30 
## 3522 3108 2719 2473 2102 1857 1681 1462 1292 1079  986  860  679  634  553 
##   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45 
##  446  403  346  315  280  210  193  178  142   99   90   88   75   79   64 
##   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60 
##   48   49   32   26   31   24   23   18   15   12   10    6    5    4    8 
##   61   62   63   64   65   66   67   68   70   72   74   75   76   77   80 
##    3    3    5    4    3    2    1    2    4    2    2    1    2    1    2 
## 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    5.00    9.00   10.55   14.00   80.00 
## 
## includes extended item information - examples:
##   labels
## 1      1
## 2      2
## 3      3
## 
## includes extended transaction information - examples:
##   transactionID
## 1             1
## 2            36
## 3            38

6-3. 연관규칙분석

  • minimum support:0.05, minimum confidence: 0.2, minimum length: 2 로 두고 pruning을 하여 연관규칙을 찾은 결과 55개의 rule을 발견하였다.
sp_for_rule <- apriori(data=sp_for,
                       parameter = list(support = 0.005,
                                        confidence = 0.2,
                                        minlen = 2))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.2    0.1    1 none FALSE            TRUE       5   0.005      2
##  maxlen target   ext
##      10  rules FALSE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 656 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[39123 item(s), 131209 transaction(s)] done [0.76s].
## sorting and recoding items ... [256 item(s)] done [0.01s].
## creating transaction tree ... done [0.06s].
## checking subsets of size 1 2 3 done [0.01s].
## writing ... [55 rule(s)] done [0.00s].
## creating S4 object  ... done [0.02s].
summary(sp_for_rule)
## set of 55 rules
## 
## rule length distribution (lhs + rhs):sizes
##  2  3 
## 52  3 
## 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.000   2.000   2.000   2.055   2.000   3.000 
## 
## summary of quality measures:
##     support           confidence          lift           count     
##  Min.   :0.005015   Min.   :0.2007   Min.   :1.432   Min.   : 658  
##  1st Qu.:0.006090   1st Qu.:0.2200   1st Qu.:1.891   1st Qu.: 799  
##  Median :0.007240   Median :0.2427   Median :2.160   Median : 950  
##  Mean   :0.008706   Mean   :0.2624   Mean   :2.523   Mean   :1142  
##  3rd Qu.:0.009523   3rd Qu.:0.2995   3rd Qu.:2.794   3rd Qu.:1250  
##  Max.   :0.023428   Max.   :0.4613   Max.   :6.252   Max.   :3074  
## 
## mining info:
##    data ntransactions support confidence
##  sp_for        131209   0.005        0.2

6-4. 연관규칙 조회

  • support 순으로 상위 10개의 연관규칙
##      lhs        rhs     support    confidence lift     count
## [1]  {21137} => {13176} 0.02342827 0.2821737  2.391714 3074 
## [2]  {47209} => {13176} 0.01844386 0.3318250  2.812560 2420 
## [3]  {21903} => {13176} 0.01704151 0.2285364  1.937082 2236 
## [4]  {47766} => {24852} 0.01688909 0.2990957  2.095698 2216 
## [5]  {47626} => {24852} 0.01644704 0.2652735  1.858714 2158 
## [6]  {21903} => {24852} 0.01524286 0.2044154  1.432294 2000 
## [7]  {16797} => {24852} 0.01484654 0.2999692  2.101819 1948 
## [8]  {27966} => {13176} 0.01356614 0.3209520  2.720400 1780 
## [9]  {27966} => {21137} 0.01272779 0.3011179  3.626710 1670 
## [10] {26209} => {47626} 0.01215618 0.2643792  4.264159 1595
  • confidence 순으로 상위 10개의 연관규칙
##      lhs              rhs     support     confidence lift     count
## [1]  {21137,47209} => {13176} 0.005411214 0.4613385  3.910321  710 
## [2]  {28204}       => {24852} 0.009221928 0.3715075  2.603072 1210 
## [3]  {8174}        => {13176} 0.005525536 0.3661616  3.103598  725 
## [4]  {45066}       => {24852} 0.009381978 0.3466629  2.428991 1231 
## [5]  {19057}       => {13176} 0.007415650 0.3365617  2.852709  973 
## [6]  {47209}       => {13176} 0.018443857 0.3318250  2.812560 2420 
## [7]  {27966}       => {13176} 0.013566143 0.3209520  2.720400 1780 
## [8]  {8424}        => {24852} 0.007049821 0.3154843  2.210530  925 
## [9]  {9076}        => {24852} 0.005456943 0.3082221  2.159645  716 
## [10] {49683}       => {24852} 0.005662721 0.3079155  2.157496  743
  • lift 순으로 상위 10개의 연관규칙
##      lhs              rhs     support     confidence lift     count
## [1]  {24964}       => {22935} 0.006478214 0.2044252  6.252314  850 
## [2]  {31717}       => {26209} 0.007674778 0.2855927  6.211228 1007 
## [3]  {26209}       => {47626} 0.012156178 0.2643792  4.264159 1595 
## [4]  {13176,21137} => {47209} 0.005411214 0.2309694  4.155391  710 
## [5]  {43352}       => {16797} 0.005014900 0.2006709  4.054486  658 
## [6]  {5876}        => {47209} 0.005952336 0.2228245  4.008856  781 
## [7]  {21137,47209} => {13176} 0.005411214 0.4613385  3.910321  710 
## [8]  {27966}       => {21137} 0.012727785 0.3011179  3.626710 1670 
## [9]  {13176,47209} => {21137} 0.005411214 0.2933884  3.533615  710 
## [10] {8174}        => {13176} 0.005525536 0.3661616  3.103598  725

6-5. 연관규칙의 시각화

1. Scatter plot for association rules

  • support와 confidence의 scatter plot 색의 진하기는 lift의 값에 따라 달라진다.

2. Grouped matrix for assocation rules

  • support순으로 상위 20개의 룰에 대한 Grouped matrix

3. Network Graph for assocation rules

  • 55개의 rule의 Network Graph
  • 원의 크기: 상품 -> 상품의 연관 규칙의 support를 나타낸다.
  • 원의 색깔: lift를 나타낸다.
  • 상품 고유 ID가 24852인 상품과 13176인 상품이 다른 상품들과 관계가 많아 보인다.

7. XGBoost를 사용한 예측 모델 생성

  • 고객의 구매이력을 사용하여 XGBoost 모델을 만들고 고객이 주문할 상품들을 예측한다.

7-1. products 데이터 재구성

  • 상품 소분류, 대분류 고유 ID를 상품 소분류명,대분류명으로 대체하였다.
  • order_products와 orders를 order_id로 매치시켜 order_products에 user_id값을 새로 추가한다.

7-2. 새로운 데이터 테이블(orders_p) 생성

  • orders_p: orders와 order_products_prior를 order_id로 매치시켜 orders에 order_products_prior의 나머지 변수 값들을 추가한다.

7-3. 예측 변수 생성

  • 제공된 데이터를 사용하여 다음과 같은 예측 변수들을 생성한다.
    • Product predictors: 상품의 특성을 설명하는 상품 예측 변수
    • User predictors: 사용자의 특성을 설명하는 사용자 예측 변수
    • User & product predictors: 특정 상품에 대한 사용자의 특성을 설명하는 사용자 및 상품 예측 변수

1. Product Predictors (prd table)

  • 상품의 특성을 설명할 수 있는 새로운 예측 변수들을 만들어 prd table에 저장한다.
  • 예측에 사용되어지는 변수
    • prod_orders: 각 상품당 총 주문 수
    • prod_reorder_probability: 각 상품이 처음 주문이 되어지고 두번째에 다시 재주문 되어진 비율
    • prod_reorder_times: 각 상품을 구입한 고객의 평균 구매 횟수
    • prod_reorder_ratio: 각 상품의 전체 판매량 대비 재주문 되어진 비율
    • prod_firstInCart_ratio: 각 상품의 전체 판매량 대비 첫번째로 주문 되어진 비율
  • 위의 변수들을 만들기 위해 필요한 변수
    • prod_reorders: 각 상품당 총 재주문 수
    • prod_first_orders: 각 상품을 최소 한번 이상 구매한 고객 수
    • prod_second_orders: 각 상품을 최소 두번 이상 구매한 고객 수
    • prod_first_in_cart = 각 상품을 가장 먼저 카트에 넣은 고객 수

2. User Predictors (users table)

  • 사용자의 특성을 설명할 수 있는 새로운 예측 변수들을 만들어 users table에 저장한다.
  • 예측에 사용되어 지는 변수
    • user_orders: 각 고객의 총 주문 수
    • user_period: 각 고객의 첫 주문과 마지막 주문사이의 기간
    • user_mean_days_since_prior: 각 고객의 연속된 두 주문사이의 기간의 평균
    • user_total_products: 각 고객이 주문한 전체 상품 수
    • user_reorder_ratio: 각 고객이 주문한 전체 상품 중 재구매한 상품의 비율
    • user_distinct_products: 각 고객이 주문한 상품 항목 수
    • user_average_basket: 각 고객의 주문 당 평균 항목 수
  • 기존의 변수
    • order_id
    • eval_set
    • time_since_last_order = days_since_prior_order

3. User x Product Predictors (data table)

  • 특정 상품에 대한 사용자의 특성을 설명할 수 있는 새로운 예측 변수들을 만들어 data table에 저장한다.
  • 예측에 사용되어 지는 변수
    • up_orders: 각 고객의 특정 상품 주문 횟수
    • up_first_order: 각 고객이 특정 상품을 첫번째로 주문한 주문회차
    • up_last_order: 각 고객이 특정 상품을 마지막으로 주문한 주문회차
    • up_average_cart_position: 각 고객이 특정 상품을 카트에 담는 평균 순서
    • up_order_rate: 각 고객의 전체 주문횟수 중 특정 상품을 포함하는 비율
    • up_orders_since_last_order: 각 고객이 특정 상품을 마지막으로 주문하고 난 후 주문횟수
    • up_order_rate_since_first_order: 각 고객이 특정 상품을 사고 난 후 특정 상품을 포함 하는 주문의 비율

7-4. 훈련데이터와 테스트데이터 생성

  • XGBoost의 성능을 확인해보기 위해 train set과 test set을 구분지어 생성한다.
  • 나눈 train set과 test set에서 예측변수가 아닌 변수들을 제거한다.
  • train set

-test set

7-5. 모델 생성및 모델의 변수 중요도

  • train set의 변수(X값)들과 예측변수(Y값: reordered)
  • XGBoost는 숫자형 벡터들만 다루므로 모델을 구축할때에는 범주형 변수들을 더미 변수로 변환하여 사용한다.
  • XGBoost 에 사용되어지는 옵션들
    • objective: 선형 회귀 분석, 로지스틱 회귀 분석, 포아송 회귀 분석 등을 포함하여 원하는 학습자 유형을 지정
    • eval_metric: 검증 데이터에 대한 평가 메트릭을 지정, 기본 메트릭은 목표(회귀의 경우 RMS, 분류의 경우 오류, 등급의 평균 정밀도)에 따라 할당
    • eta: 기본값: 0.3 업데이트에 사용되는 단계 크기 축소를 지정(과부하를 방지)
    • max_depth: 기본값: 6 트리의 최대 깊이 지정
    • min_child_weight: 기본값: 1 하위 항목에 필요한 인스턴스 가중치의 최소 합계를 지정
    • gamma: 기본값: 0 트리의 리프 노드에서 추가 파티션을 만드는 데 필요한 최소 손실 감소를 지정(클수록 알고리즘은 더 보수적)
    • subsample: 기본값: 1 교육 인스턴스의 하위 샘플 비율을 지정(이 값을 0.5로 설정하면 XGBoost에서 랜덤하게 수집된 데이터 인스턴스의 절반을 트리 성장을 위해 수집하여 과부하를 방지할 수 있다)
    • colsample_bytree: 기본값: 1 각 트리를 구성할 때 열의 하위 샘플 비율을 지정
    • alpha: 기본값: 0
    • lambda: 기본값: 1
    • Nround: 모델에 사용되는 tree의 수
  • 변수 중요도

7-6. 모델 적용 및 평가

  • test set의 reoredered는 공개 되어있지 않기 때문에 train set에 모델을 적용하고 실제값과 비교하여 보겠습니다.
  • 예측결과 reordered의 값이 0.21 이상인 경우 reordered된 상품으로 적용
  • 고객의 실제 재주문 상품과 예측된 상품 비교
order_id real_products predict_products
1 11109 22035 43633 49302 5707 11109 14947 22035 24852 30881 43633 44359 44632 49302
36 19660 34497 43086 46620 46979 48679 19660 24964 38293 44359
38 21616 8012 33731
96 20574 24489 27966 39275 40706 20574 27966
98 329 790 1939 3880 4357 7461 8859 9373 9896 13176 15455 15995 17747 18117 18441 19731 20520 22935 24964 26317 27344 27509 27683 27966 30776 34065 34126 35042 35951 36695 37664 40396 40986 41387 43560 43654 44479 45007 45204 46313 46413 46720 47333 47601 48287 329 790 1939 3339 3880 4357 5451 7461 8518 8859 9373 9896 13176 15455 15995 17794 18117 19731 20520 21616 22935 22963 24964 27344 27509 27683 27966 28842 30776 33000 33686 34065 34126 35042 35951 36695 37664 38383 40396 40775 40986 42701 43560 43654 44479 45204 46313 46413 46720 47209 47333 47601 48287 48745
112 5876 21174 27104 3599 4799 5646 5785 5876 13176 18070 21174 21376 22935 24964 25199 25472 27104 34243 35121 40821 46880 47119 47766
170 5077 6236 13176 18394 37766 40354 5077 5223 6236 13176 18394 19953 25748 25804 28092 33090 34789 35124 37766
218 1194 5578 1194 5578 15763 19505
349 5115 11361 11520 27695 33000 859 5115 6258 10369 11361 11520 16349 19862 21982 27695 32864 33000 33198 34214 37665
393 6184 12078 13424 16797 19828 30591 32403 1689 6184 8048 12078 16797 19828 21288 30591 32403