데이터 사이언스 100번의 노크(구조화 데이터 처리편) – Python Part 3 (Q41 to Q60)

데이터 사이언스

데이터 사이언스 100번의 노크(구조화 데이터 처리편) – Python Part 3 (Q41 to Q60)의 해설입니다.

 

해설:

이 코드는 한 기업의 일일 매출액을 계산하고, 매출액을 하루씩 뒤로 미뤄 새로운 데이터 프레임을 만들고, 전날 매출액을 나타내는 새로운 열을 생성합니다. 그리고 하루의 매출 금액과 전날의 매출 금액의 차이를 계산하여 'diff_amount'라는 새로운 컬럼을 생성합니다.

아래에서 한 줄씩 설명하겠습니다.

df_sales_amount_by_date = df_receipt[['sales_ymd', 'amount']].groupby('sales_ymd').sum().reset_index(): 이 코드는 'df_receipt' 데이터 프레임에서 ' sales_ymd'와 'amount' 열을 선택하여 'sales_ymd' 열을 기준으로 데이터를 그룹화하고 있습니다. 그리고 각 'sales_ymd' 그룹의 'amount' 컬럼의 합계를 계산하고, 인덱스를 재설정하여 'sales_ymd'와 'amount' 컬럼을 가진 새로운 데이터 프레임 'df_sales_amount_by_date'를 생성한다.

df_sales_amount_by_date = pd.concat([df_sales_amount_by_date, df_sales_amount_by_date.shift()], axis=1): 이 코드는 'df_sales_amount_by_date' 데이터프레임을 'df_sales_amount_by_date' 데이터프레임의 date' dataframe을 열의 축을 따라(즉, 수평으로) 이동한 버전과 연결한다. 그 결과 4개의 컬럼을 가진 새로운 데이터 프레임이 만들어진다. sales_ymd', 'amount', 'lag_ymd', 'lag_amount' 4개의 열을 가진 새로운 데이터 프레임이 된다.

df_sales_amount_by_date.columns = ['sales_ymd','amount','lag_ymd','lag_amount']: 이 코드는 'df_sales_amount_by_date' 데이터프레임의 컬럼 이름을 더 의미 있는 이름으로 변경한다.

df_sales_amount_by_date['diff_amount'] = df_sales_amount_by_date['amount'] - df_sales_amount_by_date['lag_amount']: 'df_sales_amount_by_date' dataframe의 amount_by_date' dataframe에 'amount' 컬럼에서 'lag_amount' 컬럼을 빼서 새로운 컬럼 'diff_amount'를 생성한다.

df_sales_amount_by_date.head(10). 이 코드는 'df_sales_amount_by_date' dataframe의 처음 10줄을 표시한다.

 

해설:

이 코드는 매출 데이터에 대해 지연 분석을 실행하고 있습니다.

먼저 이 코드는 매출 데이터를 날짜별로 그룹화하여 각 날짜의 매출 금액을 합산하여 각 날짜의 매출 금액의 합을 구합니다. 이는 df_sales_amount_by_date에 저장됩니다.

그런 다음 1~3까지 3회 반복하는 for 루프를 실행합니다.

for 루프의 각 반복에서 df_sales_amount_by_date의 DataFrame을 i행씩 어긋나게 연결하여 df_tmp라는 새로운 DataFrame을 생성한다. 그 결과 각 행이 특정 날짜의 매출 데이터와 한 날짜 이전 날짜의 매출 데이터를 포함하는 DataFrame이 된다.

i가 1이면 결과 DataFrame은 df_lag에 저장된다. 그렇지 않은 경우, DataFrame은 df_lag에 추가된다.

df_lag의 열은 현재 날짜와 지연된 날짜의 매출을 나타내기 위해 sales_ymd, amount, lag_ymd, lag_amount로 이름이 변경된다.

마지막으로 NaN 값이 포함된 행(첫 번째 i행에서 발생)을 삭제하고 매출 금액을 정수로 변환한 후 sales_ymd와 lag_ymd를 기준으로 DataFrame을 정렬하여 처음 10개의 행을 표시한다.

이렇게 하면 각 날짜의 매출 금액 합계와 1일 전, 2일 전, 3일 전의 매출 금액 합계가 표시되어 사용자는 매출 데이터에 대한 지연 분석을 할 수 있다.
 
해설:
제공된 코드는 다음과 같은 처리를 수행한다.

df_receipt의 DataFrame을 사용하여 sales_ymd와 amount 열을 선택하고, sales_ymd로 그룹화하고, amount 열에 sum() 함수를 적용하여 각 날짜의 총매출액을 계산한다. 완성된 DataFrame은 df_sales_amount_by_date에 저장된다.

df_sales_amount_by_date의 복사본으로 df_lag라는 새로운 DataFrame이 생성된다.

루프가 3회(1~4회) 실행되고, 각 반복에서 shift() 메서드가 사용되어 df_sales_amount_by_date DataFrame을 i주기(일) 만큼 시차를 둔다. 얻어진 DataFrame은 pd.concat()을 사용하여 df_lag와 수평으로 연결하여 df_lag에 저장한다.

df_lag DataFrame에 추가될 새로운 컬럼의 이름을 저장하기 위해 columns 변수가 생성된다.

df_lag의 컬럼 이름은 columns 리스트를 이용하여 업데이트되고, 결과 DataFrame은 df_lag에 저장된다.

Dropna() 메서드를 호출하여 결측값이 있는 행을 삭제하고, astype() 메서드를 사용하여 DataFrame을 정수형으로 변환한다. 마지막으로 sort_values() 메서드를 사용하여 DataFrame을 sales_ymd의 오름차순으로 정렬하고, head() 메서드를 사용하여 결과 DataFrame의 첫 10개의 행을 반환하고 있다.

요약하면, 이 코드에서는 판매 실적의 추세를 파악하기 위해 각 날짜의 판매 금액과 지난 3일간의 판매 금액을 포함하는 DataFrame df_lag를 생성하고 있습니다. 완성된 DataFrame은 각 날짜의 판매 금액과 지난 3일간의 판매 금액을 판매일 순서대로 정렬한 것입니다.
 
해설:

이 코드는 다음을 수행합니다.

두 개의 데이터 프레임 df_receipt와 df_customer를 공통 열 customer_id로 내부 결합하여 병합하고 결과를 새로운 데이터 프레임 df_tmp에 저장합니다.

df_tmp 데이터 프레임에 새로운 열 era를 생성합니다. era는 각 고객의 나이를 10으로 나누고 10 미만은 반올림하여 계산합니다.

era와 gender_cd 값의 고유한 조합마다 df_tmp 데이터 프레임의 amount 열의 합계를 계산하고 그 결과를 pd.pivot_table() 함수를 사용하여 새로운 데이터 프레임 df_sales_summary로 저장합니다. 결과 데이터 프레임은 era 값을 인덱스로, gender_cd 값을 열로 가지고 있다.

df_sales_summary 데이터 프레임의 열 이름을 좀 더 이해하기 쉬운 이름으로 변경한다. 첫 번째 열은 era이고, 그 뒤에 male, female, unknown이 이어지며 각 gender_cd 값의 금액 열의 합계를 나타낸다.
 
 
해설:

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

df_receipt와 df_customer 두 개의 데이터 프레임을 내부 결합을 사용하여 공통 열 'customer_id'에서 결합합니다. 결과 데이터 프레임은 df_tmp라는 새로운 변수에 저장된다.

'age' 열을 10으로 나누어 층수를 구하고 10을 곱하여 10년을 구하여 df_tmp에 새로운 'era' 열을 생성한다. 이 열은 각 고객의 연령대를 수십 년 단위로 나타낸다.

pd.pivot_table() 함수를 사용하여 df_sales_summary라는 피벗 테이블을 생성한다. 이 피벗 테이블은 df_tmp 데이터 프레임을 기반으로 하며, 'era' 열로 인덱싱된 행, 'gender_cd' 열로 그룹화된 열, sum 집계 함수를 사용하여 'amount' 열에서 계산된 값을 가지고 있습니다. 결과 표는 각 연령대의 각 성별에 대한 판매 금액의 합계를 보여준다.

df_sales_summary의 컬럼 이름을 좀 더 알기 쉽게 변경하여 'male', 'female', 'unknown'이 각 연령대의 각 성별의 총 매출액을 나타낸다.

 

해설:

이 코드는 pandas의 DataFrame df_sales_summary를 인덱스를 era로 설정하고, 새로운 칼럼 gender_cd에 여성, 남성, 알 수 없음을 쌓고 인덱스를 재설정하여 변환하고 있다. 그리고 gender_cd의 값을 01(여성), 00(남성), 99(알 수 없음)로 대체하고 있습니다. 마지막으로 level_1을 gender_cd로, 0을 amount로 컬럼 이름을 변경합니다.

다음은 단계별 설명입니다.

df_sales_summary.set_index('era'): df_sales_summary의 인덱스를 era라는 컬럼으로 설정한다. 이를 통해 era를 기준으로 데이터를 쉽게 그룹화하거나 피벗할 수 있습니다.

.stack(): female, male, unknown의 각 컬럼을 하나의 컬럼으로 스택하고, 스택된 컬럼에 새로운 인덱스 레벨을 추가한다.

.reset_index(): DataFrame의 인덱스를 기본 정수 인덱스로 재설정한다.

.replace({'female':'01','male':'00','unknown':'99'}): gender_cd 컬럼의 값을 해당 코드로 대체한다.

.rename(columns={'level_1':'gender_cd', 0: 'amount'}): level_1 컬럼을 gender_cd로, 0을 amount로 이름을 바꾼다, 스택된 컬럼의 원래 컬럼 이름을 포함하고 있다.
 
해설:

이 코드에서는 기존 df_customer DataFrame의 customer_id 컬럼과 birth_day 컬럼(날짜 정보) 두 컬럼을 연결하여 새로운 DataFrame을 생성하고 있습니다.

birth_day 열에 pd.to_datetime() 함수를 적용하여 datetime 형식으로 변환하고, dt.strftime('%Y%m%d') 메서드를 적용하여 datetime을 '%Y%m%d'(즉, 년, 월, 일) 형식의 문자열로 포맷하고 있습니다.

이렇게 하면 새로운 DataFrame에 고객의 생년월일을 문자열로 표현한 새로운 열이 생성됩니다. 마지막으로 head() 메서드를 사용하여 새 DataFrame의 첫 10개의 행을 표시합니다.
 
해설:

이 코드 스니펫은 pd.concat() 메소드를 사용하여 pandas DataFrame df_customer의 두 컬럼('customer_id'와 'application_date')을 새로운 DataFrame으로 연결한다.

pd.to_datetime() 메서드는 'application_date' 컬럼을 datetime 객체로 변환하는 데 사용된다. 이 메서드는 다양한 형식의 날짜 문자열을 pandas의 표준 datetime 객체로 변환하는 편리한 방법이다.

결과 DataFrame은 'customer_id'와 'application_date' 두 개의 컬럼을 가지며, 날짜는 datetime 형식으로 표시된다.

 

해설:

이 코드는 pd.concat 함수를 사용하여 두 개의 pandas 데이터 프레임을 결합한다.

df_receipt[['receipt_no', 'receipt_sub_no']]: df_receipt 데이터 프레임에서 receive_no와 receive_sub_no 컬럼을 선택하고 있습니다.

pd.to_datetime(df_receipt['sales_ymd'].astype('str')): df_receipt dataframe의 sales_ymd 컬럼을 datetime 형식으로 변환한다.

pd.concat의 axis=1이라는 인수는 데이터프레임을 수평으로 열 방향으로 연결한다는 것을 나타낸다. 완성된 dataframe은 receive_no, receive_sub_no, sales_ymd(datetime 형식)의 열을 가지며, 처음 10개의 행이 .head(10) 메소드를 사용하여 표시된다.
 
해설:

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

df_receipt DataFrame에서 receipt_no와 receipt_sub_no 두 개의 컬럼을 선택합니다.

pandas 라이브러리의 to_datetime() 함수를 사용하여 sales_epoch 컬럼을 datetime 형식으로 변환하고, unit 파라미터에는 입력이 초 단위임을 나타내는 's'를 설정한다.

완성된 datetime 컬럼은 pandas 라이브러리의 rename() 함수를 사용하여 'sales_ymd'로 이름을 바꾼다.

마지막으로 pandas 라이브러리의 concat() 함수를 사용하여 두 개의 DataFrame을 열의 축(axis=1)을 따라 연결한다.

완성된 DataFrame은 receive_no, receive_sub_no, sales_ymd의 세 개의 컬럼을 가지며, sales_ymd는 datetime 형식의 판매 날짜 및 시간으로, head(10) 함수는 결과 DataFrame의 첫 번째 10개의 행을 표시 하는 데 사용됩니다.

 

해설:

이 코드는 df_receipt의 receive_no와 receive_sub_no 열과 to_datetime 메서드로 datetime 객체로 변환한 sales_epoch 열의 연도를 연결하여 새로운 DataFrame을 생성하고, 단위 매개변수를 s로 설정하여 설정하여 sales_epoch의 값이 유닉스 타임스탬프(즉, 1970년 1월 1일부터의 초 단위)임을 나타냅니다.

아래 코드를 한 줄씩 분해해 보겠습니다.

pd.concat: 두 개의 DataFrame을 열의 축을 따라 연결한다.

df_receipt[['receipt_no', 'receipt_sub_no']]: df_receipt DataFrame에서 receipt_no와 receipt_sub_no 컬럼을 선택합니다.

pd.to_datetime(df_receipt['sales_epoch'], unit=s'): to_datetime 메서드에서 sales_epoch 컬럼의 값을 datetime 객체로 변환하고 unit 파라미터에 s를 설정한다.

dt.year: datetime 객체의 year 컴포넌트를 추출한다.

rename('sales_year'): 결과 컬럼 이름을 sales_year로 변경한다.

axis=1: 열 방향으로 연결하도록 지정한다.

.head(10): 결과 DataFrame의 처음 10개의 행을 반환한다.
 

 

 
해설:

이 코드는 df_receipt DataFrame에서 sales_epoch 컬럼을 가져와 1970년 1월 1일(유닉스 시간이라고도 함)부터의 초를 저장하고 pd.to_datetime()을 사용하여 초 단위의 정밀도를 가진 Pandas datetime 객체로 변환합니다. 완성된 datetime 객체는 sales_day라는 새로운 컬럼에 할당된다.

그런 다음 strftime() 메서드가 sales_day 컬럼에 적용되어 2자리 숫자와 앞의 0(%d로 표시됨)의 형태로 날짜의 일 성분을 추출한다. 얻어진 문자열은 pd.concat()을 사용하여 recipate_no 및 recipate_sub_no 열과 연결하여 세 개의 열을 가진 새로운 DataFrame을 생성한다.

마지막으로 결과 DataFrame에 대해 head() 메서드를 호출하여 처음 10개의 행을 표시한다. 이 코드에서는 df_receipt의 sales_epoch 열에서 월과 날짜를 추출하고 이를 영수증 번호와 결합하여 새로운 DataFrame을 생성하고 있다.

 

해설:

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

df_receipt에서 query 메서드로 customer_id가 'Z'로 시작하지 않는 행을 선택하여 df_sales_amount에 대입한다.

df_sales_amount에서 customer_id와 amount 열을 선택하고 groupby 메서드로 customer_id별로 금액의 합계를 계산한다. 그 결과를 df_sales_amount에 대입한다.

df_sales_amount에 람다 함수를 이용한 apply 메서드로 금액이 2000보다 크면 1, 그렇지 않으면 0을 포함하는 새로운 열 sales_flg를 추가한다.

완성된 DataFrame df_sales_amount의 처음 10개의 행을 표시한다.

즉, 결과 DataFrame df_sales_amount에는 customer_id, 각 고객의 총 지출액, 고객의 지출이 많은지(2000보다 큰지) 여부를 나타내는 바이너리 플래그 sales_flg가 포함되어 있다.
 
 
해설:

이 코드는 고객의 매출 정보 요약 테이블을 생성하고 있습니다. 아래는 각 행의 처리 내용입니다.

df_sales_amount = df_receipt.query('not customer_id.str.startswith("Z")', engine='python'): 이 행은 ID가 "Z"로 시작하는 고객을 제외하도록 영수증 데이터를 필터링하고 있습니다. 합니다. 여기서는 query 메서드를 사용하여 필터를 적용하고, engine='python'을 지정하여 경고 메시지를 피하고 있습니다. 필터링된 데이터는 df_sales_amount라는 새로운 dataframe에 할당됩니다.

df_sales_amount = df_sales_amount[['customer_id', 'amount']].groupby('customer_id').sum().reset_index(): 이 라인은 df_sales_amount 데이터 프레임을 customer_id로 그룹화하여 각 그룹의 amount 열의 합계를 계산하고, customer_id를 다시 열로 만들기 위해 인덱스를 재설정하고 있다. 그 결과 각 고객의 매출 금액의 합계를 나타내는 데이터 프레임을 얻을 수 있습니다.

df_sales_amount['sales_flg'] = np.where(df_sales_amount['amount'] > 2000, 1, 0): 이 행은 df_sales_amount 데이터 프레임에 sales_flg라는 새로운 열을 추가한다. 이 열의 값은 고객의 총 매출 금액(amount)이 2000보다 큰지 아닌지에 따라 설정된다. 여기서는 np.where 함수를 사용하여 조건을 적용하고 새 열에 1 또는 0을 할당하고 있습니다.

df_sales_amount.head(10): 이 행은 df_sales_amount 데이터 프레임의 처음 10개의 행을 표시한다. 그 결과 customer_id, 매출 총액, 고객의 sales_flg가 1(매출 금액이 2000보다 큰 경우) 또는 0(매출 금액이 2000 이하인 경우)인지를 나타내는 테이블이 표시된다.
 
해설:

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

"df_customer" DataFrame에서 "customer_id"와 "postal_cd" 컬럼을 복사하여 "df_tmp"라는 새로운 DataFrame에 대입합니다.

"postal_cd" 컬럼의 첫 3자리를 기준으로 "df_tmp"에 새로운 컬럼 "postal_flg"를 생성한다. 처음 3자리가 100에서 209 사이이면 "postal_flg"는 1로 설정되고, 그렇지 않으면 0으로 설정된다.

"customer_id" 컬럼의 "df_tmp"와 "df_receipt"를 내부 결합으로 결합한다.

결과 DataFrame을 "postal_flg" 컬럼으로 그룹화하고, "nunique()" 함수를 사용하여 각 그룹 내 고유한 고객 ID의 수를 계산한다.

'postal_flg' 열로 그룹화된 고유 고객 ID의 개수를 나타내는 결과 DataFrame을 반환한다.

요약하면, 이 코드는 구매 내역을 기반으로 특정 우편번호 지역에 거주하는 고객 수를 분석하는 데 사용됩니다.

 

해설:

이 코드는 고객의 우편번호가 특정 범위에 있는지 여부를 나타내는 postal_flg 열을 가진 새로운 데이터 프레임 df_tmp를 생성하는 데 사용된다. 다음은 코드에 대한 단계별 설명입니다.

df_tmp = df_customer[['customer_id', 'postal_cd']].copy() df_customer에서 customer_id와 postal_cd 열만 포함하는 새로운 데이터 프레임 df_tmp를 생성한다.

df_tmp['postal_flg'] = np.where(df_tmp['postal_cd'].str[0:3].astype(int).between(100, 209), 1, 0) df_tmp에 np.where 함수를 사용하여 postal_flg 열을 새로 생성한다. str[0:3] 코드에서 우편번호의 첫 3글자를 문자열로 가져와 astype(int)로 정수로 변환하고, between 함수는 그 정수가 100에서 209 범위에 있는지 확인합니다. 만약 그렇다면 1이 postal_flg에 대입되고, 그렇지 않다면 0이 대입됩니다.

pd.merge(df_tmp, df_receipt, how='inner', on='customer_id') df_tmp와 df_receipt를 customer_id 열로 병합하여 고객이 두 데이터 프레임에 모두 존재하는 행만 남긴다.

groupby('postal_flg').agg({'customer_id':'nunique'}) 병합한 데이터 프레임을 postal_flg로 그룹화하고, nunique 함수를 사용하여 각 그룹 내 고유한 customer_id 값의 개수를 계산합니다. 각 postal_flg에 대해 한 줄의 데이터 프레임을 반환하여 각 그룹의 고객 수를 표시합니다.
 
해설:

이 코드는 df_customer DataFrame의 address 열에서 도도부현 코드를 추출하여 'customer_id', 'address', 'prefecture_cd' 열을 가진 새로운 DataFrame df_customer_tmp를 생성하고 있습니다.

이 코드에서는 먼저 copy() 메서드를 사용하여 df_customer DataFrame의 'customer_id'와 'address' 열을 복사하여 df_customer_tmp 변수에 대입하고 있습니다.

df_customer_tmp = df_customer[['customer_id', 'address']].copy()
다음으로 str 접근자를 사용하여 'address' 열의 첫 3글자를 추출하고 map() 메서드를 사용하여 새로운 열 'prefecture_cd'에 대입하는 코드입니다.

df_customer_tmp['prefecture_cd'] = df_customer['address'].str[0:3].map({'사이타마현': '11', '지바현': '12', '도쿄도': '13', '14'})

map() 메서드는 각 도도부현 이름을 해당 도도부현 코드에 매핑한다. 결과 DataFrame df_customer_tmp는 'customer_id', 'address', 'prefecture_cd' 컬럼을 가진다.
 
 
해설:

이 코드는 기존 DataFrame df_customer에서 customer_id와 address 열을 선택하여 새로운 DataFrame df_customer_tmp를 생성합니다.

다음으로 정규식을 사용하여 address 열에서 도도부현 코드를 추출하고 있습니다. 구체적으로 str.extract() 메서드를 사용하여 패턴(^. *? [도도부현])에 일치하는 부분 문자열을 추출합니다. 이는 "문자열의 시작부터 '都' 또는 '道' 또는 '府' 또는 '県'이 처음 나타날 때까지의 임의의 문자와 일치하는 것"을 의미한다.

다음으로 추출된 도도부현 이름을 해당 도도부현 코드에 매핑하여 df_customer_tmp DataFrame에 prefecture_cd라는 새로운 열을 생성한다. 매핑은 도도부현 이름을 키로, 해당 도도부현 코드를 값으로 하는 사전을 이용한 map() 메서드를 통해 이루어진다.

결과적으로 df_customer_tmp는 customer_id, address, prefecture_cd의 세 개의 컬럼을 가지며, prefecture_cd는 도도부현 코드를 나타내는 2자리 문자열로 DataFrame의 첫 10개의 행을 표시하기 위해 head( 10) 메서드가 사용되었다.

 

 
이 코드는 각 고객의 매출 금액 사분위수를 계산하고, 매출 금액 사분위수에 따라 각 고객을 4개의 그룹 중 하나에 할당한다.

다음은 코드의 단계별 분석이다.

df_sales_amount = df_receipt[['customer_id', 'amount']].groupby('customer_id').sum().reset_index() df_receipt 데이터프레임의 customer_id로 그룹화 하여 금액 열을 합산하여 각 고객의 총 매출 금액을 계산한다. 결과 dataframe은 customer_id와 amount 두 개의 컬럼을 가진다.

pct25 = np.quantile(df_sales_amount['amount'], 0.25), pct50 = np.quantile(df_sales_amount['amount'], 0.5), pct75 = np.quantile(df_sales_amount['amount'], 0.5), pct75 = np.quantile(df_sales_amount['amount amount['amount'], 0.75) 매출액 분포의 25, 50, 75%를 계산한다.

def pct_group(x): ... 매출 금액 x를 받아 x가 속한 사분위를 나타내는 1부터 4까지의 정수를 반환하는 함수 pct_group을 정의한다.

df_sales_amount['pct_group'] = df_sales_amount['amount'].apply(pct_group) df_sales_amount 의 amount 열의 각 값에 pct_group 함수를 적용하고, 결과 사분위수를 pct_group이라는 새로운 열에 대입합니다. group이라는 새로운 열에 할당합니다.

df_sales_amount.head(10)는 customer_id, amount, pct_group의 세 개의 컬럼을 가진 결과 데이터 프레임의 처음 10개의 행을 표시합니다.
 
 
 
이 코드에서는 DataFrame 'df_temp'에 새로운 열 'pct_group'을 생성하여 각 고객의 매출 금액 합계와 그 매출 금액 합계를 기준으로 소속된 백분위수 그룹을 저장하고 있습니다.

첫 번째 행은 'df_receipt' DataFrame을 customer_id로 그룹화하여 각 고객의 매출 금액 합계를 계산하고, customer_id를 다시 열로 만들기 위해 인덱스를 재설정하고 있습니다.

다음 4행은 앞서 생성한 'df_temp' DataFrame과 동일한 'df_sales_amount' DataFrame에서 매출 금액의 25%, 50%, 75%, 최대값을 계산하고 있습니다.

다음 행에서는 정의된 백분위수 값으로 매출액을 4개의 빈으로 구분하여 'df_temp'에 새로운 열 'quantile'을 생성합니다.

마지막 행에서는 'df_temp'에 새로운 열 'pct_group'을 생성하여 'quantile'을 기준으로 데이터를 그룹화하고, 각 고객이 어느 백분위수 그룹에 속해 있는지에 따라 그룹 번호(1-4)를 부여하고 있습니다.

참고로 마지막 빈의 오른쪽 끝은 'pct_max+0.1'로 정의하여 매출 금액의 최대값이 마지막 백분위수 그룹에 포함되도록 하였습니다.
 
해설:

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

df_receipt 데이터 프레임을 customer_id로 그룹화하고, grouped 객체의 sum() 메서드를 사용하여 각 그룹의 금액 합계를 계산한다. 그 결과는 df_temp라는 새로운 데이터 프레임에 저장된다.

qcut() 함수를 사용하여 df_temp의 금액 값을 기준으로 4 개의 동일한 크기의 빈으로 분할하고 retbins=True 옵션은 빈의 끝을 bins 변수에 반환한다.

df_temp에 quantile이라는 새로운 열이 생성되어 각 금액 값이 어떤 빈에 들어갈지 알려준다.

ngroup() 메서드를 사용하여 df_temp['quantile']의 각 빈에 그룹 번호를 할당하고, ngroup()은 0 인덱스 값을 반환하므로 결과에 +1이 추가됩니다.

reset_index() 메서드가 df_temp에서 호출되어 인덱스가 새로운 범위 인덱스로 재설정된다.

마지막으로 df_temp의 처음 10행과 빈의 끝이 각각 display()와 print() 함수로 표시된다.

 

해설:

이 코드에서는 customer_id, birth_day, era 컬럼을 포함하는 새로운 DataFrame df_customer_era를 생성한다.

customer_id와 birth_day 컬럼은 원래의 df_customer DataFrame에서 가져온다.

age 열은 df_customer DataFrame의 age 열에서 계산되며, age의 각 값에 대해 코드는 값을 반올림할 10년(10의 배수)을 계산하고, age의 값이 60보다 크면 연대는 60으로 설정된다.

apply 메서드에서 age 열의 각 요소에 함수(여기서는 lambda 함수)를 적용하고 min 함수와 math.floor 함수로 10년을 계산한다. 결과 값은 df_customer_era의 era 열에 할당된다.

마지막으로 head 메서드가 호출되어 결과 DataFrame의 첫 10행이 표시된다.
 
해설 :

이 코드에서는 customer_id, birth_day, era 컬럼을 가진 새로운 DataFrame df_customer_era를 생성하며, customer_id와 birth_day 컬럼은 원래의 df_customer DataFrame에서 복사된 것입니다.

era 열은 pd.cut()을 사용하여 고객의 연령을 다른 연령대로 비닝하여 생성되며, bins 매개 변수는 각 빈의 끝을 지정하고, np.inf는 60세 이상의 고객에 대한 오픈 엔드 빈을 지정하는 데 사용됩니다. 매개 변수는 False로 설정되어 구간이 왼쪽부터 들어갈 수 있도록 지정합니다. 즉, 나이가 정확히 30세인 고객은 [30, 40] 빈에 배치되는 것이다.

DataFrame의 각 행에 대해 고객의 연령이 지정된 빈에 따라 해당 연령에 해당하는 빈에 채워진다. 결과 DataFrame에는 customer_id, birth_day, era의 각 컬럼이 포함되며, era 컬럼에는 각 고객의 연령대별 빈이 포함된다.

 

해설: 

이 코드는 DataFrame "df_customer_era"에 새로운 열 "era"를 생성하여 고객 연령의 10 년을 표시하며, decade의 값은 연령을 10 세 미만으로 반올림 한 후 10을 곱하여 얻습니다. 결과가 60보다 크면 60으로 반올림합니다.

그런 다음 코드는 성별 코드와 "시대"열의 값을 연결하여 새로운 "gender_era"열을 생성하고 "gender_cd"열에는 성별 코드 (예 : 남성은 "0", 여성은 "1")가 포함되며 "era"열의 값은 문자열로 캐스팅되고 너비 2에 맞게 0으로 패딩됩니다. 된다.

마지막으로 이 코드는 결과 DataFrame의 처음 10줄을 표시한다.
 
해설:

이 코드는 DataFrame 'df_customer'의 카테고리 변수 'gender_cd'의 더미 변수를 생성한다. 결과 DataFrame은 'gender_cd'의 각 카테고리(아마도 남성과 여성)의 열을 가지며, 각 행은 원래의 고객 레코드가 'gender_cd'에 해당 값을 가지고 있는 경우 해당 열에 1을, 다른 모든 열에 0을 가지게 된다.

이를 위해 pandas의 'get_dummies' 함수가 사용된다. 이 함수는 DataFrame과 더미 인코딩을 적용할 컬럼 목록을 받는다. 이 경우 'df_customer' DataFrame에 대해 호출되며, 'columns' 파라미터에 'gender_cd' 컬럼이 지정되어 있다.

결과 DataFrame은 'gender_cd'의 각 값에 대해 하나의 열을 가지며(아마도 원본 데이터에 사용된 인코딩에 따라 남성은 0, 여성은 1 또는 그 반대로), 각 행은 해당 행의 'gender_cd' 값에 해당하는 열에 1을 가지며, 다른 모든 열에는 0을 가지게 된다. 결과 DataFrame의 처음 10개의 행이 반환된다.
 
 
해설 : 

이 코드는 df_customer DataFrame의 카테고리 변수 gender_cd에 대한 더미 변수를 생성하는 코드입니다. pandas 라이브러리의 pd.get_dummies() 함수를 사용하여 gender_cd의 고유한 카테고리별로 바이너리 인덱스 변수를 생성 합니다.

drop_first=True 인수는 참조 카테고리인 첫 번째 카테고리('0')를 삭제하는 데 사용된다. 이는 더미 변수 간의 다중 공선성을 방지하기 위해 수행된다.

prefix='gen' 및 prefix_sep='#' 인수는 더미 변수의 열 이름에 접두사를 붙이는 데 사용된다. 이 경우 접두사는 'gen', 구분자는 '#'이다.

결과 DataFrame은 gender_cd 열의 고유한 값마다 하나의 열을 가지며, 그 값이 1이면 고객이 해당 카테고리에 속한다는 것을 나타내고, 0이면 속하지 않는다는 것을 나타낸다. 컬럼 이름은 gen#<gender_cd> 형식이며, <gender_cd>는 원래의 gender_cd 컬럼의 고유한 값임을 나타낸다.

 

해설:

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

df_receipt에서 customer_id가 "Z"로 시작하는 행을 필터링한다.

나머지 행을 customer_id로 그룹화하고 agg 메서드를 사용하여 각 그룹의 금액 열의 합계를 계산한다.

결과 DataFrame의 인덱스를 재설정하여 customer_id를 일반 컬럼으로 만든다.

scikit-learn의 preprocessing.scale 함수를 amount 열에 적용하여 각 고객의 총 매출의 z 점수를 계산한다.

DataFrame에 std_amount라는 새로운 열을 추가하고 4단계에서 계산한 z점수를 저장한다.

결과적으로 DataFrame df_sales_amount에는 각 고객에 대해 한 행이 포함되며, 고객 ID, 총 매출 금액, 매출의 z 점수인 std_amount 열이 포함된다.
 
 
해설:

이 코드는 'df_sales_amount' DataFrame의 'amount' 열에 대해 표준화(Z 점수 정규화라고도 함)를 수행한다.

이 코드에서는 먼저 pandas DataFrame의 'query' 메소드를 사용하여 ID가 'Z'로 시작하는 고객의 트랜잭션을 필터링하고 있다. 그런 다음 나머지 거래를 'customer_id'로 그룹화하고 'agg' 메소드를 사용하여 각 고객이 사용한 총 금액을 계산합니다. 마지막으로 결과 DataFrame의 인덱스를 재설정하고 있습니다.

다음으로 이 코드는 scikit-learn 라이브러리의 'preprocessing' 모듈에서 'StandardScaler' 클래스의 인스턴스를 생성하는데, 'StandardScaler' 클래스는 평균이 0, 표준편차가 1이 되도록 데이터를 스케일링하고 표준화에 사용된다. 그리고 'scaler' 인스턴스의 'fit' 메소드를 사용하여 'df_sales_amount' DataFrame의 'amount' 열의 평균과 표준편차를 계산한다.

마지막으로 'scaler' 인스턴스의 'transform' 메소드를 사용하여 'df_sales_amount' DataFrame의 'amount' 컬럼에 대해 실제 표준화를 수행하고, 결과값을 'std_amount'라는 새로운 컬럼에 저장한다. 합니다.

결과 DataFrame 'df_sales_amount'에는 'customer_id'와 각 고객이 사용한 총 'amount'와 표준화된 'std_amount' 컬럼이 포함된다.
 
 
이 코드는 pandas의 DataFrame df_receipt에 대해 데이터 전처리를 하는 코드입니다. 아래는 코드의 각 행이 무엇을 하는지 설명합니다.

query() 메서드와 regex engine python을 사용하여 고객 ID가 "Z"로 시작하는 행을 필터링합니다. 얻은 DataFrame을 df_sales_amount에 대입한다.

groupby() 메서드로 DataFrame df_sales_amount를 고객 ID별로 그룹화하고, agg() 메서드로 각 그룹의 금액 열의 합계를 계산한다. 완성된 DataFrame을 df_sales_amount에 대입한다.

reset_index() 메서드로 df_sales_amount의 인덱스를 재설정하고, customer_id 컬럼을 일반 컬럼으로 변경한다.

scikit-learn 전처리 모듈의 minmax_scale() 함수를 df_sales_amount의 amount 컬럼에 적용하여 0에서 1 사이로 값을 스케일링한다.

따라서 이 코드에서는 각 고객의 매출 금액의 합계를 계산하고, 특정 고객(ID가 'Z'로 시작하는 고객)의 행을 필터링하고, 각 고객의 매출 금액을 최소-최대 스케일링을 사용하여 0과 1 사이로 스케일링합니다.
 

 

해설:

이 코드는 소매점의 각 고객의 매출 금액 데이터에 대한 기능 스케일링을 수행한다. 다음은 각 행의 처리 내용이다.

DF_SALES_AMOUNT: df_receipt 데이터 프레임을 customer_id로 그룹화하고 각 그룹의 금액을 합산하여 얻은 customer_id와 각 고객이 사용한 총 금액을 포함하는 새로운 DataFrame을 생성한다.

scaler: scikit-learn의 preprocessing 모듈에서 MinMaxScaler 객체를 초기화하고, 데이터를 [0,1] 범위에서 스케일링한다.

scaler.fit(): df_sales_amount의 amount 열에 스케일러 객체를 맞추고 데이터의 최소값과 최대값을 계산한다.

df_sales_amount['scale_amount']: df_sales_amount DataFrame에 새로운 컬럼을 생성하여 스케일링된 금액 데이터를 저장한다.

scaler.transform(): scaler 객체가 학습한 최소값과 최대값을 사용하여 각 고객의 금액 데이터를 스케일링한다.

df_sales_amount.head(10): 업데이트된 df_sales_amount DataFrame의 처음 10개의 행을 표시하고 새로운 scale_amount 열의 스케일링된 금액 데이터를 포함한다.

전체적으로 이 코드는 각 고객의 금액 데이터 값을 동일한 범위로 만들기 위해 특징적인 스케일링을 수행하여 비교가 가능하고 분석에 도움이 될 수 있도록 한다.

 

 

Comment