프로그래밍 언어/Python

연관 키워드 경쟁 강도 분석하기 - 데이터 정제하기

· 코딩마이데이

비주얼 스튜디오 코드에서 새로운 파일을 만들고, 파일명을 'step_2_2.py'로 지정합니다. 다음 코드를 입력하고, 대화형 창에서 실행하면, 'output' 폴더에 'step_2_2.csv' 파일을 생성됩니다.

 

ch08/step_2_2.py

from pathlib import Path
import pandas as pd
from step_1_1 import OUT_DIR # 이전에 작성한 모듈을 불러옵니다.
from step_2_1 import OUT_2_1

OUT_2_2 = OUT_DIR / f"{Path(__file__).stem}.csv"

def data_cleaning(): # 08
    df_raw = pd.read_csv(OUT_2_1, dtype="string") # 09
    f_pc_cnt = df_raw["검색수PC"].str.contains("<") # "<" 문자열 포함 여부 # 10
    f_mo_cnt = df_raw["검색수M"].str.contains("<") # 11
    df_sliced = df_raw.loc[(~f_pc_cnt) & (~f_mo_cnt)] # NOT(~)과 AND(&) 조건 # 12

    df_sliced = df_sliced.astype({"검색수M": int, "클릭률M": float}) # 14
    f_mo_cnt_cond = df_sliced["검색수M"] >= 10_000 # 검색수 조건 # 15
    f_mo_rate_cond = df_sliced["클릭률M"] >= 1.0 # 클릭률 조건
    df_cond = df_sliced.loc[(f_mo_cnt_cond) & (f_mo_rate_cond)] # AND(&) 조건 # 17
    df_sorted = df_cond.sort_values(["검색수M"], ascending=[False]) # 정렬 # 18
    df_sorted.to_csv(OUT_2_2, index=False) # CSV로 저장

if __name__ == "__main__":
    data_cleaning() # 데이터 정제

 

08 데이터 정제하는 함수 data_cleaning()를 정의합니다.

09 pandas 패키지의 함수 read_csv()를 사용하여 OUT_2_1 경로의 CSV 파일을 불러와 데이터프레임을 생성합니다. 효율적인 데이터 처리를 위해 매개변수 dtype에 'string'을 전달하여 모든 데이터를 문자열로 변환합니다.

10~11 수 str.contains()를 사용하여 '검색수PC' 열과 '검색수M' 열에서 '<' 문자열 포함 여부를 확인합니다. '<'이 포함되면 True, 그렇지 않으면 False를 반환합니다.

12 데이터프레임의 ioc 연산자를 사용하여 '<' 문자열이 포함되지 않는 행을 추출합니다. 이때 ~ 연산자는 True와 False를 반대로 바꾸고, & 연산자는 두 조건이 모두 True인 경우에만 True, 그 외에는 False를 반환합ㄴ니다.

14 함수 astype()를 사용하여 검색수M 열과 클릭률M 열의 데이터 타입을 문자열에서 각각 정수와 부동소수점수로 변환합니다.

15 검색수M 열 겂이 10,000 이상이면 True, 그렇지 않으면 False를 반환합니다.

17 데이터프레임의 loc 연산자를 사용하여 검색수 조건과 클릭률 조건을 만족하는 데이터를 추출합니다.

18 함수 sort_values()를 사용하여 검색수M 열을 기준으로 내림차순 정렬입니다.

 

'step_1_3.json'을 비주얼 스튜디오 코드에서 열고, 'step_2_1.csv' 파일과 비교합니다. '<' 문자 열이 삭제되고, 데이터 건수도 줄어든 것을 알 수 있습니다.

 

키워드,검색수PC,검색수M,클릭수PC,클릭수M,클릭률PC,클릭률M,광고수,경쟁강도
나이키,226000,777200,10,높음,141.4,2997.0,0.07,0.42
나이키운동화,22900,249300,10,높음,162.2,4423.8,0.78,2.02
자라키즈,16400,165000,6,중간,45.3,1021.5,0.31,0.7