ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 과정 15일차 - 2 (24.12.24)

junslee 2024. 12. 24. 16:11

18_na

  • pandas 에서 결측치 데이터에 대한 처리
    => pandasd에서 결측치로 인정한 경우에 대해서만
  • nan,"",None => 유의해서 처리를 해야한다

 

  • 1. 빵구난 데이터가 있다면 EDA에서도 처리할 때 이슈
    - ML 모델을 반듯이 처리를 해야함

    처리방법1) 빵구난 데이터를 지우자 : dropna
    - 경우에 따라서 데이터가 많이 줄어들 수 있다

    처리방법2) 빵구난 데이터를 채우자 : 정답은 없다
    - 분석자가 주관적으로 해야함
    - 1개 대표값 : 평균, 중앙값, 최빈값  etc
    - 유사한 데이터를 보고 추정
    - 있는 값들을 대상으로 모델을 만들어서 예측
    (정답은 없음)

  • 참고)
    특정한 줄(가로,세로)을 지울 떄 : drop
    nan이 있는 데이터를 지울 때 : dropna

 

from numpy import nan as NA
import pandas as pd
data = pd.DataFrame(
    data=[
        [1,6.5,3],
        [1,NA,NA],
        [NA,NA,NA],
        [NA,6.5,3]
    ]
)
data


dropna

data.dropna()
# 가로줄에 대해서 모든 정보가 있는 경우만 살린다
# (모든 설문에 응답한 사람만)
# 장점 : 샘플이 모든 속성을 다 가지고 있다
# 단점 : 샘플의 수가 많이 줄어들 수 있다

data.dropna( axis=0)

data.dropna( axis=1)
# 세로줄 기준으로 모든 가로줄의 값이 있는 것만 살린다

  • dropna에서
    - axis : 가로줄/세로줄에서 데이터들이 다 있는지 체크
    (axis=0/1)
    - how="all" : 완전히 빵구난 데이터만 제거
    - thresh : 정상적인 데이터가 살아 있는 기준의 수
data.dropna(axis=0)

data.dropna(axis=0, how="all")

data.dropna(axis=0, thresh=1)
=> 가로줄 기준으로 모든 컬럼들에 대해서 정상적인 값이 1개 이상이면 살리자


fillna

  • 채우자 fillna --> nan으로 되어 있는 친구들을 채우자
data.fillna(99)

  • 1번 컬럼에 대해서 혹시 누락된 값이 있다면 0으로 채우고
    2번 컬럼에 대해서 혹시 누락된 값이 있다면 99로 채우고 싶다
data.fillna({0:0, 1:99})

  • 마무리
    나중에는 여러가지 방식으로 채우는 것들을 할 예정이다
    대표값, 유사한 값의 대표값, 기타 여러 방식들이 존재한다

99_cheatsheet

  • 참고

처음에 뭐를 배워야 뭔가를 하는데

파이썬, pandas,sql + 개인 eda

주제 + 데이터 가지고

 

kaggle, dacon 대회 열어둔 데이터 : 개인 포폴이므로 참고만 하자

=> 주제에 대한 힌트 

직접 날 데이터를 수집할 수 있도록 해야 함

(사이트,api) :국가


19_

  • 지금 기존의 DF의 모양을 변경하자
    => 내가 보고 싶은 항목들을 중심으로 다시 세팅
    기준 : 내가 보고자 하는 속성/컬럼/요소

    위의 방식의 가장 대표적 : 엑셀 -- 피봇테이블
    => 각각의 데이터/샘플 단위로 보는 것이 아니라
    내가 원하는 속성/컬럼 기준대로 다시 보자
    => EDA 핵심적인 부분중에 하나
import numpy as np
import pandas as pd
# 11.sale 데이터
!gdown 162ojCdYDDnxcadWUN57e7eM0_3E5ac9y
Downloading...
From: https://drive.google.com/uc?id=162ojCdYDDnxcadWUN57e7eM0_3E5ac9y
To: /content/11_sales-funnel.xlsx
100% 5.68k/5.68k [00:00<00:00, 18.8MB/s]
path = '/content/11_sales-funnel.xlsx'
data = pd.read_excel(path, sheet_name="Sheet1")
data.head()


  • 데이터에 대한 설명 
    - Account : 고객의 계좌 번호
    - Name : 고객의 성함
    - Rep : 영업 담당자( 실무 영업사원 )
    - Manager : 영업 담당자의 팀장
    - Product : 판매한 물건
    - Quantity : 판매한 물건의 수량
    - Price : 판매한 물건의 가격
    - Status : 현재 주문에 대한 상태

  • 목적 : 매출 관련된 데이터를 중심으로 인사 평가를 해보자
    => 본인이 인사팀장의 관점으로 바라보 된다
  • pivot_table 을 활용을 해서 새롭게 판을 짜려고 한다
    1. 가로에 무엇을 --> 대상
    2. 세로에 무엇을 --> 어떤 속성
    3. 1/2로 만들어진 새로운 공간을 어떻게 채울지
    => 여러 개의 원본 데이터들 어떻게 집계처리를 해서 대표화한다

  • Q)  팀장들에 대해서 팀에 속한 매출액을 보고 싶다
    --> 평가의 기준이 오로지 매출이다
    --> 값들에 대해서 특별하게 지정하지 않으면 : 평균
pd.pivot_table( data,
               index=["Manager"],
                values=["Price"])
# 값을 채우는 방식에는 특별한 언급을 안 하면 : 평균

pd.pivot_table( data,
               index=["Manager"],
                values=["Price"],
                aggfunc=["mean"])


  • Q) 영업 팀장별로 , 총 매출액의 합을 보자
pd.pivot_table( data,
               index=["Manager"],
                values=["Price"],
                aggfunc=["sum"])


  • Q) 영업 팀장별로 속한 "영원사원"을 기준으로 각 영업사원들의 총 매출액을 보자
pd.pivot_table( data,
               index=["Manager","Rep"],
                values=["Price"],
                aggfunc=["sum"])

pd.pivot_table( data,
               index=["Rep","Manager"],
                values=["Price"],
                aggfunc=["sum"])

 


  • Q) 단순 총 매출액만 보고 판단하는것이 아닌가 해서
    => 꾸준한 영업활동을 하면서 올린 매출인지, 운이 좋아서 크게 1건을 한 것인지 좀 보자
pd.pivot_table( data,
               index=["Manager","Rep"],
                values=["Price"],
                aggfunc=["sum", "count"])


  • Q) 상품기획/평가
    => 매출 실적에 대해서 보기는 하는데 구체적으로 회사의 어느 상품군을 잘 팔고 잘 못파는지
pd.pivot_table( data,
               index=["Manager","Rep"],
                values=["Price"], # 일반적인 수치형 컬럼
                columns =["Product"],  # 카테고리형 컬럼
                aggfunc=["sum"])

  • 잘개 여러 항목으로 보면 디테일하게 볼 수는 있다
    빈칸이 생길 확률이 높아진다 (NaN 나타날 확률이 높다)
pd.pivot_table( data,
               index=["Manager","Rep"],
                values=["Price"], 
                columns =["Product"],  
                aggfunc=["sum"],
                fill_value=0)


  • 참고) 내가 보고자 하는 속성을 좀 늘려보자
    (기존 속성 : price)
    + 판매 수량 Quantity 
    + 상품별로 쪼개서
pd.pivot_table( data,
               index=["Manager","Rep"],
                values=["Price","Quantity"], 
                columns =["Product"],  
                aggfunc=["sum"],
                fill_value=0,margins=True)

  • 총계 처리에 대한 보이기
pd.pivot_table( data,
               index=["Manager","Rep"],
                values=["Price","Quantity"], 
                columns =["Product"], 
                aggfunc=["sum"],
                fill_value=0,
                margins=True)

  • 집계 처리를 하는 방식이 price => mean, sum (평균매출액, 누적매출액)
    quantity는 sum(누적매출량) => Dict
pd.pivot_table( data,
               index=["Manager","Rep"],
                values=["Price","Quantity"], 
                columns =["Product"],  
                aggfunc={
                    "Price":["mean","sum"],
                    "Quantity":["sum"]
                },
                fill_value=0)


  • pivot_table의 목적
    => 수집된 데이터를 내가 보고자 하는 "항목/속성/기준"으로 바라보자
    : 새롭게 2차원의 판을 짬
    가로 : index
    세로 : values +항목별로 쪼개서 : columns
    => aggfunc : 새롭게 짠 판에 값을 어찌 채울지
    => 수집한 데이터에 숨겨진 속성/내용/의미들을 탐색

  • cf) pandas에 DF 재형성할 떄 : pivot_table, groupby
    => groupby를 주로 사용 
    pivot_table:엑셀 사용자를 위한 툴
    groupby : sql 사용자를 위한 툴

  • pandas 에서 기본적인 기능에 대해서는 꼭 리뷰/ 정리
  • 개인 프로젝트 데이터를 구체적으로 찾아보세요 + 수집 방법
    => pandas + sql