ASAC-SK플래닛 T아카데미 데이터 엔지니어

25.11.27 36일차 [pandas 인덱싱, 슬라이싱, loc, iloc, 데이터 삭제, 파생변수, 병합, 집계 | 이커머스 활용 데이터 분석 ]

Datadesigner 2025. 11. 27. 17:07

오늘은 pandas의 남은 내용들을 실습하면서

 

동시에 실제로 작용하는 방법또한 체크하기 위해서 이커머스 활용 데이터 분석 실습을

 

같은 수업내용에서 함께 진행하며 병행적으로 수업하였다.

 

아마 내일쯤이면 정리될 것 같다.

 


인덱싱 내용

 

 

인덱싱은 컬럼값을 가져오는 기능으로 작용한다,

왼쪽의 인덱스처럼 보이는 값을 인덱싱한다면 출력되지 않는다.

이를 가져오는 방법은 슬라이싱이다.

 

슬라이싱

기본 슬라이싱 -> 행 중심

 

 
  • 차원 유지
  • df[ 시작 인덱스 : 끝 인덱스 : step ]
    • 인덱스 사용
    • 행 중심 -> 가로 단위

슬라이싱은 기존 문법과 똑같이 작동한다.

 

인덱스 값 세팅방법

1. 인덱스 값 설정 후 변경 내용

loc

 

 
  • location 위치 정보를 이용하여 특정, 추출
    • 컬럼값, 인덱스 값 사용
    • (컬럼값, 인덱스 값)

loc 하나로  인덱싱, 슬라이싱 모두 사용할 수 있다.

 

인덱스와 컬럼값을 사용하면 좌표처럼 사용할 수 있다

 

차원유지할 값을 바꾸면 이렇게 위치를 수정할 수도 있다.

차원을 유지하며 슬라이싱과 인덱스 조합

컬럼값 추가도 가능하다

컬럼에 슬라이싱을 사용해서 customer_name ~ age 까지 출력한 모습이다.

불리언 인덱싱 적용 케이스  = 조건식을 추가하여 추출한다.

특정 컬럼 제거 후 추출 코드

 

iloc

 

 
  • 인덱스, 컬럼상에 존재하는 암묵적 순서 (인덱스값으로 0, 1, 2, 3, . . .)를 이용하여 추출
  • index location

 

전체를 복사하고, 특정 컬럼값만 추출하는 방식으로 사용한 결과이다.

 

결론

  • loc | iloc [ 행 (인덱스)표현 , 열(컬럼)표현]
 

 

불리언 인덱싱 (numpy에서 계승)

groupby같은 기능을 사용할 수 있게 된다.

탈퇴한 고객들만 모은 이후, 고른 대상을 뒤집을때 사용할 수 있다. 그 기호는 ! 과 ~ 이다.

 

불리언 인덱싱의 다른 사용예시들

undelete_user.info() # 결측치 현 확인 -> end_date

<class 'pandas.core.frame.DataFrame'>
Index: 2842 entries, 0 to 2952
Data columns (total 18 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   customer_id        2842 non-null   object 
 1   name               2842 non-null   object 
 2   class              2842 non-null   object 
 3   gender             2842 non-null   object 
 4   start_date         2842 non-null   object 
 5   end_date           0 non-null      object 
 6   campaign_id        2842 non-null   object 
 7   is_deleted         2842 non-null   int64  
 8   class_name         2842 non-null   object 
 9   price              2842 non-null   int64  
 10  campaign_name      2842 non-null   object 
 11  mean               2842 non-null   float64
 12  median             2842 non-null   float64
 13  max                2842 non-null   int64  
 14  min                2842 non-null   int64  
 15  routine_flg        2842 non-null   int64  
 16  calc_date          2842 non-null   object 
 17  membership_period  2842 non-null   int64  
dtypes: float64(2), int64(6), object(10)
memory usage: 421.9+ KB

----------------------------------------------------------------
# 특정 컬럼을 구성하는 모든 데이터(중복제거)를 나열하시오 -> 데이터 건건은 고유함
cus.gender.unique() # 범주형 데이터 -> 집계후 분석 흐름을 반드시 보임

array(['F', 'M'], dtype=object)
----------------------------------------------------------------
df.gender == 'M', df.age >= 40

(2012-12-01     True
 2012-12-02    False
 2012-12-03    False
 2012-12-04     True
 2012-12-05     True
               ...  
 2026-08-05    False
 2026-08-06    False
 2026-08-07    False
 2026-08-08    False
 2026-08-09     True
 Freq: D, Name: gender, Length: 5000, dtype: bool,
 2012-12-01    False
 2012-12-02    False
 2012-12-03     True
 2012-12-04     True
 2012-12-05     True
               ...  
 2026-08-05     True
 2026-08-06    False
 2026-08-07     True
 2026-08-08     True
 2026-08-09    False
 Freq: D, Name: age, Length: 5000, dtype: bool)
 ----------------------------------------------------------------
 # 남성 회원들중에서(고) 40세 이상인 고객들만 추출하시오 -> 조건 2개
# df에서 진행
#target = df[ ( df.gender == 'M' ) & ( df.age >= 40 ) ]
target = df.loc[ ( df.gender == 'M' ) & ( df.age >= 40 ) ]
target.shape

(1709, 8)

 

데이터 삭제

 

 
  • DataFrame에서 특정 데이터 제거
    • del
      • 완전 삭제
    • drop 계열
      • 떨군다 -> 제거하여 사본 제공(=추출), 원본 유지
      • 원본 변경을 원한다면
        • inplace 옵션을 True 설정하면 적용됨
          • inplace=True -> 원본조작 내제
            • 리턴 x
        • 기본값 False임

drop으로 컬럼을 제거한다면 원본에 영향을 주지 않고 출력값을 수정할 수 있다

 

만약 원본에 제거를 반영하고 싶으면 inplace 옵션을 주어서 삭제할 수 있다.

또는 del을 사용해도 된다.

 
 

파생 변수 (컬럼 추가)

  • 기존 데이터를 이용 하여 새로운 컬럼 추가
  • apply(), .str, ...

현재 is_z라는 컬럼이 없는 모습이다,.'

 

birth값에서 년도 정보를 추출한다,

이 때 파이썬의 map() 기능을 가진 apply 함수를 사용해서 새로운 변수의 값을 정해준다.

람다함수를 사용하고 조건식을 주어서 삼항연산자로 구성한다.

결과는 출력된다.

본 파생변수로 인해서 전체 인원수 중 z세대인 사람이 약 10퍼센트도 안된다는 인사이트를 도출할 수 있다.

고급기능

 

병합(단순, 조인)

 

 
  • 단순 합치기
    • index증가(axis=0), 컬럼증가(axis=1)으로 합치기
    • 방향에 따라 결측치가 발생될수 있다
    • n개의 df를 합칠때 주로 사용(주유소 가격 참고)
    • 모든 대상 df의 컬럼이 일치할때 유용

더미 데이터 생성

concat

concat은 n개의 병합이 가능한 것이 특징이다.

 

merge

 

 
  • 2개의 df 대상 (양자간 병합 처리)
    • SQL의 join과 동일함
  • 규칙 -> 공통된 컬럼이 존재하면 타겟이 됨

merge의 다양한 작용방식, 하지만 일단은 모두 같은 값을 제공한다.

merge의 left, right, outer 조인의 특성

전체적으로 pandas는 sql 데이터베이스 수업과 비슷한 것 같다.

merge 할때 느낌이 빡 왔다.

 

그 다음으로는 이커머스 데이터 활용, 데이터 분석을 각 수업때 배운것들을 하나하나 실습하면서 진행했다.

 


이커머스 데이터 활용 데이터분석

연구 목표

  • 개요
    • 실전 데이터를 이용하여 데이터 준비과정 체크
  • 주제
    • 고객, 상품, 주문정보에 대한 분석
    • 정량적 분석
  • 목표
    • pandas 연습
 

데이터 수집(제공)

  • level 1 : 사내 데이터 제공 (가정)
    • 내역 (포맷 : csv)
      • 고객의 마스터 데이터 1개
      • 아이템(상품) 마스터 데이터 1개
      • 주문정보 2개
      • 주문 상세정보 2개
 

 

(*)데이터 준비

csv파일을 가져오는 과정이다, 총 7개의 데이터를 제공받았다.

모듈 가져오고, raw 데이터를 df로 구성한다.

그리고 잘 만들어졌는지 일단 확인.

이 때 각 파일은 dfs의 인덱스 문법으로 확인할 수 있다.

head , tail 함수는 각 데이터의 상위값, 하위값을 보여준다, 값 입력 안햇을 시 기본 5개

 

이로 인해 도출해낸 인사이트

 

  • 고객 마스터 데이터
    • 한국 + 일본 믹스 데이터
    • 2019 1월~ 7월 가입자 고객 데이터
    • 5000명
    • 성별, 나이, 가입일, 생년월일, 이메일, 고객관리번호, 거주지, 이름

describe()로 파일의 통계를 얻을 수 있다. 하지만 수치형 데이터만 가능하기 때문에 데이터를 파악해야 한다.

데이터의 타입을 파악하는 기능 dtype , info()

 

데이터 병합 -> 데이터 마트 준비

 

 

트렌젝션, 트렌젝션 디테일 병합(concat)

먼저 파일을 확인하면 transaction , transaction_detail 파일은 1,2 로 나누어져있는걸 볼 수 있다.

이는 해석하면 테이터를 5000단위로 끊어서 두 파일로 나눠진것이기때문에 이 두 파일을 먼저 병합해준다,

concat을 이용해서 파일을 병합하고 확인한다,.

근데 이 파일들이 합쳐지는 부분을 확인하니 인덱스가 바로 5001로 안 넘어가고 다시 0부터 시작한다.

그래서 ignore_index=True 옵션을 추가해줘서 인덱스는 무시하라고 말해줘야 한다.

수정 후 인덱스가 정상적으로 반영된 모습이다.
마찬가지로 transaction_detail 파일도 병합해준다.

트랜젝션 + 트랜젝션 디테일 병합(merge)

 

 

 
  • transection_data_mart

이제 트랜젝션, 그리고 트랜젝션 디테일 파일을 병합해줄거다, 두 파일이기 때문에 merge로 병합한다,.

두 파일을 비교해보면 같은 컬럼은 transaction_id 컬럼이다, 그래서 키를 저 컬럼으로 지정해주고 merge해준다,

밑에 보면 컬럼이 추가되고 데이터가 합쳐진 모습을 확인할 수 있다. sql에서 view의 느낌이다.

같은 방식으로 item 파일도 병합해준다.

마지막으로 고객데이터까지 합친 모습이다. 이제 컬럼이 총 16개가 된다.

 

파생변수

파생변수 cal_price를 이용해서 데이터가 잘 합쳐졌는지 확인할 것이다.

파생변수 만드는 문법을 사용해서 만들어준다.

그리고 price 의 총합과 cal_price의 총합을 비교했는데 안맞는다, 뭐지?

 

이는 주문수와 주문 상세정보의 개수 차이로 인한 오류이다.

그래서 주문 번호의 고유값을 카운팅했는데 4로 중복이 있다.

예를 들어 상품을 한 주문에 4개 샀으면 가격은 한번 주문으로 끝인데

주문 상세정보에서는 4개가 4번 돌아서 price가 더 높아진 것이다.

이는 어떤 데이터를 중점으로 두냐에 따라서 merge하는 left와 right가 바뀌고 추출하는 데이터가 달라지기 때문이다.

그래서 주문 상세정보 기준으로 하면 price가 맞고 주문 기준 총액으로 하면 cal_price가 맞는것이다,

 

  • 검증 결과 트렌젝션 디테일에 맞춰져서 데이터가 구성되었다 -> 제품에 중심을 맞출 경우 문제 없음
  • 데이터별로 살펴보면 price는 개수 * 단가와 다를 수 있다
  • cal_price를 사용하면 데이터는 정확하게 됨. => 파생변수 사용

데이터 결측치 확인 코드


데이터 분석

 

월별 데이터 집계 처리

 

 


 
  • 실습
  pay_month 파생변수 생성 - 월별 집계 가능함
  payment_date 에서 추출 -> 201901, 201902 , , . 201912
  pay_month를 기준으로 집계하여 각 데이터의 카운트 출력

 

1. pay_minth 파생변수 생성

파생변수 생성 코드

 

1-1. 파생변수 생성 다른 방법

 

문자열 데이터이고, 로직이 간단하면 str로 써도 된다.

 

1-2 파생변수 생성 다른 방법

문자열의 포맷이 시간형식이기 때문에 시간형으로 포맷팅해준다. 이 또한 sql에서 했었다

 

info() 내용에서 시간 부분컬럼 타입이 바뀐 모습이다.

시간정보로 pay_month 파생변수를 만들어 준 모습이다, 이 때 pay_month는 문자열 형식으로 온다,

 

2. pay_month로 그룹화 진행

 

group by 뿐 아니라 values_counts() 로도 그룹화를 진행할 수 있다.

 

오늘의 수업은 여기까지


오늘 수업 내용 복습도 해야되고 리뷰시간에 실습할 것도 있고 이번주까지 해야하는 과제도 있고 하

 

바쁘다바빠현대사회