원티드 챌린지 데이터 분석(1) - 데이터 테이블 / 빅쿼리 / 쿼리 전처리 / wordcloud

jongeun·2023년 3월 6일
0

분석가 공고를 직접 전처리해보고, 전처리한 다음에 데이터 가지고 시각화까지하고 분석가로써 갖춰야할 것을 알게 될 것

강의 커리큘럼

  1. EDA로 분석가 공고 파헤치기
  2. 프로덕트 분석가의 업무 사이클
  3. a/b testing
  4. 분석가 지원 준비

Google BigQuery

1. 장단점

  • 장점
    • 설치가 필요없는 클라우딩 플랫폼
    • 2단계 인증으로 데이터 보호 기능
    • 타 구글 플랫폼과 연동 용이
    • 속도
    • 저렴한 가격
  • 단점
    • 수시로 데이터를 업데이트 해야하는 경우 부적합(OLTP)

2. 절차

  1. 빅쿼리에 csv 파일 가져오기(오류로, 헤드부분 삭제하고 가져왔음)

    1. 데이터 추가
    2. 데이터 세트 만들기
    3. 스키마 입력
  2. 데이터 전처리

SELECT 
  position_id # 포지션 id
  , position # 포지션명
  , SPLIT(SPLIT(jd, '주요업무')[safe_offset(1)], '자격요건')[safe_offset(0)] AS responsibilities # jd 안에서 주요업무라는 구분자를 기준으로 분할한 뒤, 그 결과 중에서 인덱스 1에 해당하는 문자열을 선택함(뒤에 것) 그리고 선택된 문자열을 다시 자격요건이라는 구분자를 기준으로 분할 한 뒤, 그 결과중에서 인덱스 0에 해당하는 문자열을 선택함 => 주요업무
  , SPLIT(SPLIT(SPLIT(jd, '주요업무')[safe_offset(1)], '자격요건')[safe_offset(1)], '우대사항')[safe_offset(0)] AS requirements # 주요업무 기준으로 잘라 밑에 것 중 자격요건 기준으로 또 자르고 그 밑에 것 중 우대사항 기준으로 잘라서 그 위에 것인 자격요건을 선택
  , SPLIT(SPLIT(SPLIT(SPLIT(jd, '주요업무')[safe_offset(1)], '자격요건')[safe_offset(1)], '우대사항')[safe_offset(1)], '혜택 및 복지')[safe_offset(0)] AS preference # 주요업무 기준으로 자르고 밑에꺼, 자격요건 기준으로 자르고 밑에꺼, 우대사항 기준으로 자르고 밑에꺼 혜택 및 복지 기준으로 자르고 위에꺼 해서 우대사항 추출
  , annual_from # 연차 시작
  , annual_to # 연차 끝
  , GENERATE_ARRAY(annual_from, annual_to, 1) AS target_annual
FROM `enduring-rush-379810.wanted_data.wanted_position` 
# annual_from에서 annual_to까지 1씩 증가하는 값을 갖는 배열을 생성함

#position_id | position | responsibilities | requirements | preference | annual_from | annual_to | target_annual
  1. 데이터 탐색 > colab으로 이동하여 코드 입력
  • 워드 클라우드 형성을 위한 패키지 설치

    !pip install krwordrank # word cloud 형성을 위한 패키지 설치
  • pandas import 등 여러 라이브러리 import

    import pandas as pd
    import matplotlib.pyplot as plt
    from krwordrank.word import KRWordRank
    import numpy as np
    df = results.copy() # results 복사 dataframe
    df['responsibilities'] = df['responsibilities'].replace(np.nan, '없음') # df['responsibilities']에서 NaN 값이 있는 경우에 이를 '없음'으로 변경하여 df['responsibilities']에 다시 할당합니다. 이렇게 함으로써, 'responsibilities' 열에서 결측값을 제거
    df['requirements'] = df['requirements'].replace(np.nan, '없음')
    df['preference'] = df['preference'].replace(np.nan, '없음')
    df.head(5) # 가장 상단의 다섯줄만 보여줘.
    • df_newbie = df_newbie[~df_newbie['target_annual'].astype(str).str.contains('5|6|7|8|9')] # 5년차부터 사실상 제외 => 'target_annual' 열(column)의 값을 문자열(str)로 변환한 후, 문자열에 '5', '6', '7', '8', '9' 중 하나라도 포함되어 있는 행(row)을 제거하는 코드로 신입에 관해 추출 가능
  • responsibilities 값을 리스트로 변화시켜주어 한 뭉탱이로 만들어줌

    texts = df["responsibilities"].values.tolist() # 주요 업무의 값들을 리스트로 변화시켜주어서 한 뭉탱이로 만들어준다 => 이유는 워드 클라우드를 생성하는 데 필요한 텍스트 데이터를 리스트 형태로 입력해야 하기 때문
    print(texts)
  • 자주 반복되는 단어 30개 추출

    wordrank_extractor = KRWordRank( # KR-WordRank 알고리즘을 구현한 파이썬 라이브러리
    min_count = 3,    #단어 최소 출현 빈도수 (이 값 이하로 출현한 단어는 무시, 여기에서는 3번 이상 출현한 단어만으로 대상)
    max_length = 15,  # 단어의 character 길이의 최대 값(이 값 이상으로 긴 단어는 무시, 여기서는 15자 이하의 단어만을 대상으로함)
    verbose = True # 처리과정 중 로그를 출력할지 여부를 결정하는 매개변수
    )
    beta = 0.85  # PageRank의 decaying factor beta, 이 값을 이용하여 각 노드(키워드) 간의 관계를 계산
    max_iter = 10 # WordRank 알고리즘의 최대 반복 횟수
    keywords, rank, graph = wordrank_extractor.extract(texts, beta, max_iter) # 텍스트 데이터인 texts를 kr-wordrank 알고리즘에 적용하여, 해당 텍스트에서 추출된 키워드와 각 키워드의 중요도를 계산함, 함수 실행 시 키워드, 랭크, 그래프를 output으로 뱉어줍니다.(keywords : 추출된 키워드 리스트
    rank : 각 키워드의 중요도를 나타내는 랭킹 정보
    graph : 추출된 키워드 간의 관계를 나타내는 그래프 정보)
    stopwords = {'대한','분이면', '있습니다.','분석','데이터', '위한', 'and', '통해', '통한','있는','the','to','in','for','of'}  #걸렀으면 하는 stopwords
    passwords = {word:score for word, score in sorted(   
    keywords.items(), key=lambda x:-x[1])[:100] if not (word in stopwords)}  #stopwords가 ,제외된 keywords 탑 300개 # 람다의 경우, keyword 딕셔너리의 내용을 중요도에 따라 내림차순으로 정렬, 정렬된 결과 중 상위 100개의 단어를 선택하고, 이 중에 stopword에 해당하지 않는 단어만 password 딕셔너리에 저장
    for word, r in sorted(passwords.items(), key=lambda x:x[1], reverse=True)[:30] :  #자주 반복되는 단어 top 30개 추출해서 프린트까지, password 딕셔너리 내용을 중요도에 따라 내림차순으로 정렬한 뒤, 상위 30개의 단어와 그 중요도를 선택함
    print((word,r))

    ('서비스', 15.202630480085666)
    ('비즈니스', 12.546394528844358)
    ('기반', 12.48102392481802)
    ('다양한', 11.27943657997832)
    ('인사이트', 10.696588096345518)
    ('도출', 10.411450488218929)
    ('지표', 10.296794302156378)
    ('개선', 9.735041759623096)
    ...

  • 한글폰트 지원이 되지 않아서 한글 폰트 설정을 위한 아래 코드 입력

#한글폰트 지원이 되지 않기 때문에 별도로 이걸 깔아줘야한다.
import matplotlib as mpl
import matplotlib.pyplot as plt
 
%config InlineBackend.figure_format = 'retina' # 그래프 이미지의 해상도를 설정합니다.
 
!apt -qq -y install fonts-nanum # 구글 Colab에서 Nanum 폰트를 설치합니다.
 
import matplotlib.font_manager as fm # 폰트 매니저를 불러옵니다.
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf' # NanumBarunGothic 폰트의 경로를 지정합니다.
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic')  # 그래프에 사용되는 폰트를 NanumBarunGothic으로 설정합니다.
  • 시각화 그래프 출력
from wordcloud import WordCloud # 파이썬에서 wordcloud 라이브러리를 사용
from wordcloud import ImageColorGenerator

wc = WordCloud(font_path = fontpath, width= 1000, height = 1000, scale = 3.0, max_font_size=250) # WordCloud 객체를 생성합니다. 이때 font_path는 사용할 폰트의 경로, width와 height는 이미지의 크기, scale은 해상도에 대한 스케일링 비율, max_font_size는 최대 폰트 크기를 나타냅니다.
gen = wc.generate_from_frequencies(passwords) # generate_from_frequencies 메소드를 이용하여 워드 클라우드 이미지를 생성합니다. 이때 passwords는 워드 클라우드를 생성하기 위한 텍스트 데이터가 들어있는 딕셔너리 
plt.figure() # 생성된 워드 클라우드 이미지를 matplotlib를 이용하여 시각화, 새로운 플롯(그림)을 생성합니다.
plt.imshow(gen) # gen 변수에 저장된 WordCloud 객체를 이미지로 변환하여 출력합니다. 

데이터분석 필수요건 신입

  • 얼마나 지표를 잘 세우는지?가 중요
  • funnel, metric, aarrr, cohort, retention

데이터분석 우대사항 신입

  • 통계지식

오늘 한 것 => EDA , 아래 것은 찾아본 것

  • EDA
    • 탐색적 데이터 분석
    • 쌓여있는 데이터를 기반으로 가설을 세워 데이터를 분석하는 방법
    • 데이터의 구조와 특징을 파악하며 여기서 얻은 정보를 바탕으로 통계 모형을 만드는 단계
    • 빅데이터 분석에 사용
    • 새로운 가설의 생성
    • 시각화 된 데이터로부터 패턴 발견, 유연한 절차와 방법
  • CDA
    • 목적을 가지고 데이터를 확보하여 분석하는 방법
    • 가설검증, 보통 설문조사, 논문에 대한 내용을 입증하는데 많이 사용
    • 기존 가설의 유효성 검증

해보면 좋을 것

  • 오늘 분석한 걸 가지고 흐름에 따라 eda 리포트를 한번 만들어봅시다
  • eda를 하다보니 생각나는 가설이 있다면 리스트업 해봐요
  • 사전과제 제출은 이번주 수요일까지 업로드 해주세요.
profile
기록으로 성장하는 개발자 되기

0개의 댓글