데이터 사이언스 100번의 노크(구조화 데이터 처리편) – R Part 4 (Q61 to Q80)

데이터 사이언스
설명:

이 코드는 df_receipt 데이터 프레임에 대해 다음과 같은 처리를 수행한다.

filter 함수를 사용하여 customer_id가 "Z"로 시작하는 행을 필터링합니다.

group_by 함수를 사용하여 customer_id별로 데이터를 그룹화합니다.

summarise 함수를 사용하여 합계를 취하여 각 고객 ID의 금액 열을 요약한다.

.groups = "drop" 인수를 사용하여 2단계에서 생성한 그룹을 삭제한다.

sum_amount의 로그에 0.5를 더한 값을 10진수로 표현한 log_amount라는 새로운 열을 생성한다.

slice 함수를 사용하여 결과 데이터 프레임에서 처음 10개의 행을 선택합니다.

전체적으로 이 코드는 df_receipt 데이터 프레임에 각 고객이 사용한 총 금액의 대수를 가진 새로운 열을 생성하며, 이는 왜곡된 데이터를 정규화하는 데 자주 사용되는 변환입니다.
 
설명:

이 코드는 df_receipt라는 데이터 프레임을 처리한다. 다음 단계를 수행합니다.

customer_id가 "Z"로 시작하는 행을 필터링합니다. 이는 dplyr 패키지의 filter() 함수와 조건으로 grepl() 함수를 사용하여 수행합니다.

dplyr 패키지의 group_by() 함수를 사용하여 나머지 행을 customer_id로 그룹화합니다.

금액 열의 sum() 함수를 사용하여 각 고객의 구매 금액 합계를 계산합니다. 이는 dplyr 패키지의 summarise() 함수를 사용하여 수행합니다.

sum_amount 열의 자연대수에 0.5를 더한 log_amount라는 새로운 열을 추가합니다. 이는 dplyr 패키지의 mutate() 함수와 베이스 R의 log() 함수를 사용하여 수행한다.

마지막으로 dplyr 패키지의 slice() 함수를 사용하여 결과 데이터 프레임의 처음 10개의 행을 선택한다.
 
설명:

이 코드는 데이터 프레임 df_product를 받아 mutate() 함수를 사용하여 새로운 열 unit_profit을 생성하고, unit_profit 열은 df_product의 기존 열인 unit_price와 unit_cost의 차이로 계산됩니다. 합니다.

그리고 slice() 함수를 사용하여 새로운 unit_profit 열을 포함한 결과 데이터 프레임의 처음 10개의 행을 표시합니다.
 
설명:

이 코드는 df_product라는 데이터 프레임에 대해 몇 가지 계산을 수행하고 있다.

mutate는 unit_profit_rate라는 새로운 열을 생성하는 데 사용되고 있다. 이 열은 단가에서 단가를 빼고 그 결과를 단가로 나누어 계산됩니다.

그런 다음 summarise 함수를 사용하여 unit_profit_rate 열의 평균을 계산합니다. 그 결과는 total_mean이라는 새로운 열에 할당됩니다.

요약하면, 이 코드는 df_product에서 판매된 제품의 각 단위당 평균 수익률을 계산하고 있는 셈이다.

 

설명:

이 코드는 다음 단계를 수행한다.

데이터 프레임 "df_product"에서 "product_cd", "unit_price", "unit_cost" 열만 선택한다.

단가를 0.7로 나누고 그 결과를 가장 가까운 정수로 반올림하여 'new_price'라는 새로운 열을 생성한다. 이는 상품 가격을 일정 비율로 낮추기 위한 임의의 계산이다.

새 가격에서 단가를 빼고 그 결과를 새 가격으로 나누어 'new_profit_rate'라는 또 다른 새 열을 생성한다. 이것은 새로운 가격의 이익률을 계산하기 위한 것이다.

마지막으로 완성된 데이터 프레임에서 처음 10개의 행을 선택한다.
 
설명:

이 코드는 상품 데이터 프레임(df_product)에 대해 몇 가지 계산을 수행한다.

먼저 "product_cd", "unit_price", "unit_cost" 세 개의 컬럼을 선택합니다.

이는 "unit_cost"를 0.7로 나눈 후(즉, 30% 비용 절감), round() 함수를 사용하여 가장 가까운 정수로 반올림하여 계산합니다.

다음으로 'new_profit_rate'라는 새로운 열을 생성한다. 이는 'new_price'에서 'unit_cost'를 빼고 그 결과를 'new_price'로 나누어 계산한다.

마지막으로 완성된 데이터 프레임의 처음 10개의 행을 선택하여 표시합니다.

이 코드는 기본적으로 생산 비용을 30% 절감했을 때 각 제품의 새로운 가격과 수익률을 계산한다.
 
설명:

이 코드는 두 개의 새로운 변수 new_price와 new_profit_rate를 추가하여 df_product 데이터 프레임을 조작한다.

mutate(new_price = ceiling(unit_cost / 0.7))은 ceiling(unit_cost / 0.7)이라는 식의 결과를 포함하는 새로운 열 new_price를 생성하고, ceiling() 함수는 unit_cost / 0.7이라는 식의 결과를 가장 가까운 정수로 반올림합니다. 가장 가까운 정수로 반올림합니다. 그 결과 단가보다 30% 더 높은 새로운 가격이 됩니다.

mutate(new_profit_rate = (new_price - unit_cost) / new_price)는 새로운 열 new_profit_rate를 생성하고 (new_price - unit_cost) / new_price라는 식의 결과를 저장합니다. 이 식은 새로운 가격에서 이익이 차지하는 비율인 신수익률을 계산한다. 이는 신가격과 단가의 차이를 신가격으로 나눈 값으로 계산된다.

slice(1:10) 함수는 완성된 데이터 프레임의 처음 10개의 행을 표시하는 데 사용된다.
 
설명:

이 코드에서는 cbind 함수를 사용하여 df_product 데이터 프레임의 3개 열, 즉 product_cd, unit_price, tax_price를 새로운 데이터 프레임으로 결합한다. 그런 다음 head 함수를 사용하여 이 새로운 데이터 프레임의 첫 10개의 행을 표시한다.

새 데이터 프레임의 첫 번째 열은 product_cd로 표시되며, df_product의 product_cd 열의 값을 포함하고, 두 번째 열은 df_product$unit_price로 표시되며, df_product의 unit_price 열의 값이 저장되어 있습니다. 저장되어 있습니다.

세 번째 열은 tax_price라는 레이블로, unit_price 열의 각 값에 1.1을 곱한 결과에 trunc 함수를 적용하여 만들어졌다. 이는 10%의 세금이 포함된 제품 가격을 계산하는 것이다.

cbind 함수가 이미 df_product에서 unit_price 열을 추출했기 때문에 두 번째 열 이름에 df_product$를 사용할 필요가 없다는 점에 유의해야 한다.
 
해설: 
# 코드 예시 2

본 코드는 다음과 같은 처리를 한다.

df_receipt 데이터 프레임의 각 고객이 사용한 금액의 합계를 계산하여 df_tmp_1에 저장한다.

df_receipt 데이터 프레임과 df_product 데이터 프레임을 product_cd로 결합하여 category_major_cd가 '07'인 행만 필터링한다.

필터링된 데이터 프레임의 각 고객별 금액 열의 합계를 계산하여 df_tmp_2에 저장한다.

df_tmp_1과 df_tmp_2 데이터 프레임을 customer_id로 결합한다.

각 고객의 메이저 코드 "07"의 판매율을 계산하여 sales_rate라는 새로운 컬럼에 저장한다.

결과 데이터 프레임을 슬라이스하여 처음 10개의 행을 표시한다.

inner_join 함수는 공통 변수로 데이터 프레임을 결합하는 데 사용되며, mutate 함수는 기존 열을 기반으로 계산된 새로운 열을 데이터 프레임에 추가하고, slice 함수는 데이터 프레임에서 행의 하위 집합을 추출하는 데 사용된다.

 

설명:

이 코드는 카테고리 07의 상품에 대해 해당 상품을 가장 많이 구매한 상위 10명의 고객에 대한 판매율을 계산합니다. 각 행이 무엇을 하는지 그 내역을 설명합니다.

inner_join(df_receipt, df_product[c("product_cd", "category_major_cd")], by="product_cd"): df_receipt와 df_product의 데이터 프레임을 product_cd 열을 기준으로 결합합니다. cd 열을 기준으로 df_product의 product_cd와 category_major_cd 열만 유지한다. 그 결과, df_receipt에서 구매한 각 상품에 대한 카테고리 정보를 가진 새로운 데이터 프레임이 생성된다.

filter(category_major_cd == "07"): 1단계의 결합 데이터 프레임을 필터링하여 category_major_cd 컬럼이 "07"과 같은 행만 유지하도록 한다.

group_by(customer_id) %>% summarise(sum_07 = sum(amount), .groups = "drop"): 2단계에서 필터링된 데이터 프레임을 customer_id로 그룹화하여 각 그룹의 amount 컬럼의 합계를 계산한다. 그 결과, 각 고객이 카테고리 07의 제품에 지출한 금액의 합계를 가진 새로운 데이터 프레임을 얻을 수 있다.

inner_join(df_receipt, by="customer_id"): customer_id 열을 기준으로 3단계의 데이터 프레임과 원래의 df_receipt 데이터 프레임을 결합한다. 그 결과, 각 고객이 모든 상품에 대해 사용한 금액의 합계를 가진 새로운 데이터 프레임이 생성됩니다.

group_by(customer_id) %>% summarise(sum_all=sum(amount), sum_07=max(sum_07), .groups = "drop"): 이는 4단계에서 결합된 데이터 프레임을 customer_id로 그룹화 하고, 각 그룹의 amount 열의 합계와 각 그룹의 sum_07 열의 최대값을 계산하는 것입니다. 그 결과 각 고객이 전체 상품에 지출한 금액의 합계와 각 고객이 카테고리 07의 상품에 지출한 금액의 최대값을 가진 새로운 데이터 프레임이 만들어집니다.

mutate(sales_rate = sum_07 / sum_all): 카테고리 07 상품에 대한 최대 구매 금액(sum_07)을 전체 상품에 대한 총 금액(sum_all)으로 나누어 각 고객의 판매율을 계산하는 것입니다.

%>% slice(1:10) : 판매율 컬럼을 기준으로 데이터 프레임의 상위 10개 행만 유지합니다. 그 결과 카테고리 07 제품 판매율이 가장 높은 상위 10명의 고객과 전체 제품에 지출한 총 금액, 카테고리 07 제품에 지출한 최대 금액이 표시되는 새로운 데이터 프레임이 생성됩니다.
 
설명:

이 코드는 다음과 같은 작업을 수행합니다.

'df_receipt' 데이터 프레임에서 'customer_id'와 'sales_ymd' 컬럼을 선택합니다.

모든 컬럼을 유지한 채 중복된 행을 삭제한다('distinct').

완성된 데이터 프레임과 'df_customer' 데이터 프레임을 'customer_id'로 결합한다.

'elapsed_days' 컬럼을 새로 추가한다. 이는 'sales_ymd' 컬럼과 'application_date' 컬럼 사이의 일수 차이를 나타내며, 정수로 변환된다.

'customer_id', 'sales_ymd', 'application_date', 'elapsed_days' 컬럼만 선택한다.

결과 데이터 프레임의 처음 10줄을 반환한다.

코드의 내부 동작은 다음과 같은 단계로 나눌 수 있다.

# df_receipt에서 customer_id와 sales_ymd 컬럼 선택 df1 <- df_receipt[c("customer_id", "sales_ymd")] # 모든 컬럼을 유지한 채 중복된 행 삭제 df2 <- distinct(df1, . keep_all = TRUE) # 고객 ID로 df_customer와 결합 df3 <- inner_join(df2, df_customer[c("customer_id", "application_date")], by = "customer_id") # 경과일수 새 열 추가 df4 <- inner_join(df2, . 추가 df4 <- mutate(df3, elapsed_days = as. integer(strptime(as.character(sales_ymd), "%Y%m%d") - strptime(application_date, "%Y%m%d")))) # 열을 선택하고 처음 10행 반환 df5 <- select(df4, customer_id, sales_ymd, application_date, elapsed_days) slice(df5, 1:10)

이 코드에서는 dplyr 패키지를 사용하여 데이터 조작을 수행하는데, distinct 함수는 모든 열을 기준으로 중복된 행을 삭제하고, inner_join 함수는 공통된 열을 기준으로 두 데이터 프레임을 결합하고, mutate 함수는 데이터 프레임에 새로운 열을 생성하고, select 함수는 데이터 프레임에 새로운 열을 생성하고, select 함수는 데이터 프레임에서 특정 열을 선택한다. 마지막으로 slice 함수는 데이터 프레임에서 행의 하위 집합을 반환한다.
 
설명:

이 코드는 다음과 같은 작업을 수행합니다.

df_receipt[c("customer_id", "sales_ymd")] df_receipt 데이터 프레임에서 customer_id와 sales_ymd 열만 선택합니다.

distinct(. , .keep_all = TRUE)는 모든 열을 유지한 채 중복된 행을 삭제한다. 이렇게 하면 customer_id와 sales_ymd의 고유한 조합에 대해 하나의 행만 존재하도록 보장합니다.

inner_join(df_customer[c("customer_id", "application_date")], by = "customer_id") 이전 단계의 결과와 df_customer 데이터 프레임을 customer_id 컬럼으로 결합하고 df_ customer에서 customer_id와 application_date 열만 선택한다.

mutate(elapsed_months = trunc(time_length( interval( strptime(application_date, "%Y%m%d"), strptime(as.character(sales_ymd), "%Y%m%d") ), " month")) application_date와 sales_ymd 사이의 개월 수를 계산하는 새로운 열 elapsed_months를 생성한다. strptime을 사용하여 날짜를 적절한 형식으로 변환하고, interval 함수를 사용하여 차이를 계산하고, time_length를 사용하여 개월 수를 계산하고, trunc 함수를 사용하여 가장 가까운 정수로 반올림합니다.

select(customer_id, sales_ymd, application_date, elapsed_months) customer_id, sales_ymd, application_date, elapsed_months 열만 선택한다.

slice(1:10)은 결과 데이터 프레임의 처음 10개의 행만 선택한다.

전체적으로 이 코드는 각 고객의 구매 내역을 기반으로 신청일과 판매일 사이의 개월 수를 계산한다.
 
설명:

이 코드는 다음과 같은 처리를 수행한다.

df_receipt 데이터 프레임에서 customer_id와 sales_ymd 두 개의 열을 추출한다.

위 두 열의 중복된 행을 삭제하고 customer_id와 sales_ymd의 각 고유 쌍의 첫 번째 출현분만 유지한다.

얻은 데이터 프레임을 df_customer 데이터 프레임과 customer_id 컬럼으로 결합한다.

interval 함수로 구간을 만들고 time_length 함수로 연수를 추출하여 각 고객의 application_date와 sales_ymd 사이의 경과 연수를 계산하고, trunc 함수를 사용하여 결과를 정수 값으로 자른다.

customer_id, sales_ymd, application_date, elapsed_years 열을 선택한다.

마지막으로 slice 함수를 사용하여 결과 데이터 프레임의 처음 10개의 행을 선택합니다.

요약하면, 이 코드는 고객의 application_date와 sales_ymd 날짜 사이의 경과 년수를 계산하는 것이다.
 
설명:

이 코드는 고객 및 구매 내역과 관련된 몇 가지 데이터를 처리하고 있습니다. 아래 코드를 한 줄씩 살펴보겠습니다.

df_receipt[c("customer_id", "sales_ymd")]: "df_receipt" 데이터 프레임에서 "customer_id"와 "sales_ymd" 열을 선택합니다.

distinct(. , .keep_all = TRUE): 모든 컬럼을 유지한 채 중복된 행을 삭제한다.

inner_join(df_customer[c("customer_id", "application_date")], by="customer_id"): "df_customer" 데이터 프레임에 "customer_id" 열을 사용하여 참여한다.

mutate(elapsed_epoch = as.numeric(strptime(as.character(sales_ymd), "%Y%m%d")) - as.numeric(strptime(application_date, "%Y%m%d")): "sales _ymd" 열과 "application_date" 열 사이의 초를 계산하는 "elapsed_epoch" 열을 새로 생성한다.

select(customer_id, sales_ymd, application_date, elapsed_epoch): 결합된 데이터 프레임에서 "customer_id", "sales_ymd", "application_date", "elapsed_epoch" 열을 선택합니다. epoch" 컬럼을 선택합니다.

slice(1:10): 결과 데이터 프레임에서 처음 10개의 행을 선택한다.

 

설명:

이 코드는 df_receipt 데이터 프레임의 각 판매일에 대해 주초(월요일)부터의 경과 일수를 계산합니다. 아래는 코드의 내용입니다.

df_receipt["sales_ymd"]: df_receipt 데이터 프레임에서 sales_ymd 컬럼을 선택한다.

%>%: 이전 작업의 결과를 다음 작업으로 전달하는 파이프 연산자이다.

mutate(monday = as.Date(floor_date( strptime(as.character(sales_ymd), "%Y%m%d") - 1 , unit = "week")) + 1): 각 판매일의 주 월요일을 나타내는 monday라는 새로운 컬럼을 생성한다. 라는 새로운 컬럼을 생성합니다. 이는 sales_ymd 컬럼을 날짜 객체로 변환하고, 이전 주에서 하루를 빼고(일요일이 주 끝), 하루를 더하여 주 시작(월요일)을 표시하는 방식으로 이루어진다.

%>%: 또 다른 파이프 연산자.

mutate(elapsed_days = as.integer( as.Date( strptime(as.character(sales_ymd), "%Y%m%d")) - Monday)): elapsed_days라는 새로운 컬럼을 생성하고, 각 판매일의 주 시작(월요일) 시작(월요일)부터 경과한 일수를 나타냅니다. 이는 sales_ymd 컬럼을 날짜 객체로 변환하고, (monday 컬럼에서) 해당 주의 월요일을 뺀 후 그 결과를 정수로 변환하는 방식으로 이루어진다.

%>%: 또 다른 파이프 연산자.

select(sales_ymd, elapsed_days, monday): sales_ymd, elapsed_days, monday 열을 선택한다.

%>%: 또 다른 파이프 연산자.

slice(1:10). 결과 데이터 프레임에서 처음 10개의 행을 선택합니다.

 

설명:

이 코드는 dplyr 패키지의 sample_frac() 함수를 사용하여 df_customer 데이터 프레임에서 1%의 행을 무작위로 선택하고 head() 함수를 사용하여 결과 데이터 프레임의 처음 10개의 행을 반환합니다.

sample_frac() 함수는 데이터 프레임에서 일부 행을 무작위로 샘플링하는 데 사용됩니다. 이 경우 tbl 인수는 샘플링할 데이터 프레임을 지정하고, size 인수는 샘플링할 행의 비율(0.01, 즉 1%)을 지정한다. 결과 데이터 프레임은 head() 함수에 전달되어 처음 10개의 행을 반환한다.
 
 
설명:

이 코드는 dplyr 패키지를 사용하여 각 성별 그룹에서 고객의 10%를 무작위로 샘플링하고 각 샘플의 고객 수를 계산합니다.

set.seed(71)는 샘플링의 재현성을 보장하기 위해 난수 생성기의 종을 설정한다.

df_customer %>%는 df_customer 데이터 프레임을 입력으로 받아 파이프 연산자 %>%를 사용하여 다음 처리로 전달한다.

group_by(gender_cd) 성별 코드 열로 데이터를 그룹화합니다.

sample_frac(0.1)은 각 성별 그룹에서 고객의 10%를 샘플링하며, sample_frac() 함수는 그룹화된 데이터 프레임에서 행의 일부를 무작위로 샘플링하는 데 사용됩니다. 인수 0.1은 샘플링할 비율을 지정한다.

summarise(customer_num = n(), .groups = "drop")은 각 성별 그룹의 고객 수를 계산한다. n() 함수는 각 그룹의 행 수를 계산하고 결과 열의 이름을 customer_num으로 변경한다. .groups 인수를 "drop"으로 설정하면 출력에서 그룹화 정보가 삭제된다.

최종 출력은 gender_cd와 customer_num 두 개의 열이 있는 데이터 프레임으로, gender_cd 열은 성별 코드를 지정하고 customer_num 열은 각 성별 그룹에서 샘플링된 고객 수를 지정한다.
 
설명:

이 코드는 df_receipt라는 데이터 프레임을 처리하며 다음과 같은 작업을 수행한다.

group_by 함수를 사용하여 customer_id로 데이터 프레임을 그룹화한다.

summarise 함수를 사용하여 각 고객의 금액 합계를 계산하여 sum_amount라는 새로운 컬럼에 저장한다.

sum_amount 열의 대수를 취하여 log_sum_amount라는 새로운 열에 저장한다.

각 값에서 log_sum_amount의 평균값을 빼고 그 결과를 log_sum_amount의 표준편차로 나누어 log_sum_amount의 z-score를 계산한다.

log_sum_amount의 z-score가 3보다 큰 고객(즉, log_sum_amount가 평균값에서 표준편차로 3 이상 떨어져 있는 고객)을 필터링한다.

slice 함수를 사용하여 결과 데이터 프레임의 처음 10 줄을 선택한다.

요약하면, 이 코드는 Z점수를 계산하고 Z점수가 특정 임계치를 초과하는 고객을 필터링하여 총 지출액이 평균보다 훨씬 높거나 낮은 고객을 식별한다.

 

설명:

본 코드는 다음과 같은 처리를 한다.

df_receipt 데이터 프레임을 customer_id로 그룹화한다.

customer_id가 "Z"로 시작하는 모든 행을 필터링한다.

각 customer_id의 금액을 합산한다.

사분위수 범위(IQR) 방법을 사용하여 sum_amount 값의 상위와 하위 1.5%를 필터링한다.

완성된 데이터 프레임의 첫 10개의 행을 선택한다.

IQR 방법은 사분위수를 기준으로 데이터 세트에서 이상값을 감지하고 제거하는 방법이다. 이 경우, 상한과 하한은 다음과 같이 계산된다.

상계: quantile(sum_amount)[4] + 1.5 * (quantile(sum_amount)[4] - quantile(sum_amount)[2])

하한 : quantile(sum_amount)[2] - 1.5 * (quantile(sum_amount)[4] - quantile(sum_amount)[2])

이 범위를 벗어나는 sum_amount 값은 필터링된다. 결과 데이터 프레임에는 필터 조건을 만족하는 처음 10개의 고객_id와 sum_amount가 포함된다.
 
설명:

이 코드는 sapply() 함수를 사용하여 df_product 데이터 프레임의 각 열의 결손값 수를 계산한다.

sapply()는 df_product 데이터 프레임의 각 열에 함수를 적용한다. 여기서 사용되는 함수는 function(x) sum(is.na(x))로 입력 열 x의 결손값(NA) 수를 계산한다. is.na()는 입력 벡터와 같은 길이의 논리 벡터를 반환하고, 결손값(NA)이 있으면 TRUE, 없으면 FALSE를 반환하고, sum()은 논리 벡터의 TRUE 값을 합산하여 열에서 누락된 값의 개수를 제공한다.

이 코드의 출력은 df_product의 열 이름을 이름으로, 해당 결손값의 개수를 값으로 하는 명명된 벡터이다.
 
설명:

첫 번째 코드에서는 na.omit() 함수를 사용하여 원래 데이터 프레임 df_product에서 결손값(NA)이 있는 모든 행을 제거한 새로운 데이터 프레임 df_product_1을 생성하고 있다.

두 번째 코드에서는 paste() 함수를 사용하여 NA를 제거하기 전과 제거한 후의 df_product의 행 수를 나타내는 메시지를 표시하고 있습니다. 구체적으로 nrow(df_product)는 df_product의 행 수를 반환하고, 첫 번째 paste() 호출은 이 숫자와 '삭제 전:' 문자열을 연결하고 있습니다. 마찬가지로 nrow(df_product_1)는 새로운 데이터 프레임 df_product_1의 행 수를 반환하고, 두 번째 paste() 호출은 이 숫자와 "After deletion:"이라는 문자열을 연결한다.

이 코드는 데이터 프레임의 관측치 수에 대한 NA 삭제 효과를 빠르게 확인할 수 있는 방법을 제공한다.
 
 

Comment