no image
[Google BigQuery] 연습을 시작하면서.. (Analytics Hub와 Tableau)
아직 현업에서 데이터 분석가로 뛰어본 적이 없는 나는 실무를 어떻게 경험할 수 있을까 고민하다가 GCP에서 제공하는 BigQuery 라는 데이터웨어하우스에서 예제 DB를 제공해준다는 소식을 접하게 됐다. 빅쿼리는 페타 바이트*급 데이터 웨어하우스다. NoOps라는 특징을 가지고 있고, 기존 RDBMS에서 사용하는 SQL언어를 그대로 사용해 접근성이 좋다. 기본적으로 유료 서비스지만 월 1TB만큼의 연산을 무료로 제공해주고 있다. (페타 바이트(PB) = 1,000 테라바이트(TB) = 10^15 바이트) Analytics Hub를 열심히 뒤져서 Thelook_eCommerce라는 데이터셋을 찾았다. 페이지에서는 데이터베이스가 어떤 관계로 구성되어있는지까지는 자세히 나와있지 않았지만, 온라인 의류 쇼핑몰에..
2023.02.06
no image
제품 시장 적합성(Product Market Fit, PMF)
고등학생 시절, ‘허니팁스’라는 온라인 거래 플랫폼을 제작하여 창업 동아리를 운영해보기도 하고, ‘머리 눌림 방지 헤드폰’ 아이디어를 공모하여 발명 대회에 출품하기도 하였다. 이러한 아이디어는 언제나 일상 생활 속에서 나에게 필요했던 것 으로 부터 시작되었다. 사람들은 제품을 출시하기 전에 ‘시장 조사’ 확실하게 수행하는 것이 중요하다고 한다. 해당 제품이 나에게만 필요한게 아닌 실제로 사람들이 필요로 하는 것인가, 필요로 하는 사람의 수는 얼마나 되는가 등을 조사해서 적절한 수익이 발생한다는 판단이 있어야 제품 생산 및 운영이 지속가능하기 때문이다. 여기에서의 ‘시장 조사’가 바로 **제품-시장 적합성(PMF)**이다. 제품-시장 적합성은 주로 린 스타트업에서 사용되는 개념으로, 제품 출시 이전 미리 ..
2023.01.28
no image
그로스해킹
(본 게시글은 양승화 저자의 ‘그로스해킹’ 도서를 참고하여 제작하였습니다.) 학부생 때 데이터 분석 프로젝트를 하면 대부분 공공 데이터를 활용하거나, GCP에서 제공하는 공개 데이터를 사용했다. 인턴을 하지 않으면 기업 데이터를 다뤄볼 기회가 없었고, SQL 테스트로 사내 데이터를 엿볼 기회가 생겨도 어떻게 활용할 지 감이 안왔다. 또한, 나는 데이터 분석가와 사이언티스트에 대한 구별이 확실하지 않았던터라 데이터를 정제하고 그래프로 현황을 파악한 다음 머신러닝을 통한 예측을 하는 것이 데이터를 활용하는 최적의 방안이라 생각했다. 하지만 대기업, 스타트업 등 많은 기업을 지원해보고 각 회사별로 데이터 분석가에게 요구하는 역량에 대해 자세히 분석하다 보니 데이터 분석가와 데이터 사이언티스트의 차이점을 이해하..
2023.01.10
no image
[파이썬] 이상값 처리
데이터 분석하거나 시각화 하다보면 이상적인 범위를 벗어나 데이터 분포에 영향을 미치는 데이터들이 존재하는데 이를 이상값이라고 한다. 국민 소득을 예로 들어 설명을 하면, A그룹의 연간 소득 분포가 [5천만, 6천만, 4,800만, 6,200만, 7천만, 15억8천만, 39만]이 있다고 하면 이 그룹의 연간 평균소득은 2억6,719만원이다. 이런 수치는 이 그룹의 연간소득을 적절히 설명하지못한다. 이 때 일반적인 분포에서 벗어난 데이터인 15억8천만, 39만원이 이상값이라고 할 수 있다. # 이상값 유형 이상값은 앞에 설명한 것 처럼 수치가 너무 크거나 작아 분포에 영향을 끼치는 것 외에도 다른 유형들이 있다. 구분 설명 점 이상값 일반적인 데이터들과 값의 차이가 큰 데이터 상황적 이상값 상황에 따라서 정..
2022.07.06
no image
[파이썬] 범주형 데이터의 실수화 (labeling, one-hot encoding)
데이터의 시각화 관점에서 보았을 때, 데이터는 크게 수치형 데이터와 범주형 데이터로 구분할 수 있다. 범주형 변수란? 어떤 범주에 속하는 순위가 없는 데이터들을 의미한다. '성별'의 경우 '남', '여'로 구분된 범주형 변수이고, '직업'의 경우 '회사원', '자영업자', '프리랜서', '학생' 등으로 구분되는 범주형 변수이다. 인간이 이해하기에 보다 직관적이고 인간을 대상으로 한 자료 수집의 큰 부분을 담당하고 있다. 하지만 컴퓨터가 이해하기에는 어려우며, 연속형 변수와 함께 사용하거나 실수화 하지않으면 시각화 하기 어렵다는 단점이 존재한다. 범주형 데이터의 실수화 위와 같은 이유로 범주형 데이터를 실수화하는 경우가 종종 있다. 이번 실습에서는 Labeling과 One-Hot Encoding, 이 두 ..
2022.07.06
no image
[파이썬] 워드 클라우드
사람들이 시각적 자극에 민감한 만큼 시각화는 중요한 작업 중 하나이다. 이번에는 시각화 방법 중 하나인 워드 클라우드 (Word Cloud)에 대해서 공부해보고자 한다. 워드 클라우드란? 워드 클라우드는 문자로 이루어진 데이터 속에서 형태소 분석을 통해 구분된 단어들의 출현 빈도에 따라서 크기가 다르게 나타나는 시각화 도구 중 하나이다. 예를 들어 뉴스 기사 제목만 모아둔 파일이 있다고 했을 때, 가장 많이 나타나는 단어들을 표현하는 방법을 두 가지로 비교해보자. 1. 빈도수 나타내기 수치를 나타내기 때문에 가장 직관적인 방법이기도 하고, 많이 사용되는 방법이기도 하다. 예를 들어서 '국가'라는 단어가 870번 등장하고, '정책'이 863번, '토지'가 770번 등장한다고 하면 국가 870 정책 863 ..
2022.06.29
파이썬 클래스
파이썬에도 여타 언어들 처럼 class를 만들어 객체를 생성하는 기능을 포함하고 있다. 현실세계에서 어떠한 객체는 하나의 정보로만 구성되는 경우는 매우 드물다. 예를 들어 자동차라는 하나의 객체 안에는 자동차의 모델명, 제작사, 타입 등의 여러가지 정보로 구성되기 때문에, primitive 타입의 자료형으로는 표현하는데 한계가 존재한다. 따라서 class의 기능을 이용해 자동차 같은 객체를 설명하고, 그런 변수를 생성하고 처리할 수 있도록 한다. 특히 파이썬과 JAVA는 같은 OOPL(Object-Oriented-Programming Language)로 객체를 우선시 하는 이러한 언어들에서 Class의 개념은 몹시 중요하다. 예시로 2개의 operator에 대해 사칙연산만 수행하는 계산기를 class형식..
2021.11.14
no image
데이터 시각화 그래프
데이터를 분석하는데 사용되는 기법은 목적에 따라 다양하게 분류된다. 그 중 현재 내가 사용하고 있는 EDA(Exploratory Data Analysis) : 탐색적 데이터 분석 기법에서는 시각화를 매우 중요한 부분으로 여기고 있다. 데이터를 시각화 할 때 seaborn, matplot과 같은 라이브러리의 도움을 받으면 훨씬 간단하게 표현할 수 있다. 우선은 간단한 몇가지 그래프만 살펴보고자 한다. 선 그래프 파이그래프 막대그래프 히스토그램 박스플롯 위 순서대로 살펴볼 것이다. 1. 선 그래프 선 그래프는 우리가 가장 흔하게 알고있는 꺾은 선 그래프를 말하는 것이 맞다. 선 그래프의 장점은 시간에 따른 변화나, 지속적인 변화가 있을 때 그것을 나타내기 용이하다. 예를 들면 각 지자체별 매해 예산의 변화를..
2021.06.29

 

Google BigQuery 설명
빅쿼리에서 제공하는 데이터 연결 서비스

 

아직 현업에서 데이터 분석가로 뛰어본 적이 없는 나는 실무를 어떻게 경험할 수 있을까 고민하다가 GCP에서 제공하는 BigQuery 라는 데이터웨어하우스에서 예제 DB를 제공해준다는 소식을 접하게 됐다.

 

빅쿼리는 페타 바이트*급 데이터 웨어하우스다.
NoOps라는 특징을 가지고 있고, 기존 RDBMS에서 사용하는 SQL언어를 그대로 사용해 접근성이 좋다.
기본적으로 유료 서비스지만 월 1TB만큼의 연산을 무료로 제공해주고 있다.
(페타 바이트(PB) = 1,000 테라바이트(TB) = 10^15 바이트)

 

 

Analytics Hub를 열심히 뒤져서 Thelook_eCommerce라는 데이터셋을 찾았다.

페이지에서는 데이터베이스가 어떤 관계로 구성되어있는지까지는 자세히 나와있지 않았지만, 온라인 의류 쇼핑몰에서 발생할 수 있는 데이터를 예제로 작성해놓은 것이라고 했다.

 

최근 그로스해킹을 공부하면서 이를 실습할 기회가 있었으면 좋겠다고 생각했기 때문에 냉큼 주워서 어떻게 생긴 데이터셋인지 열어보았다.

데이터셋을 프로젝트에 연결하고 열어보니 사진과 같이 총 7개의 테이블로 구성되어있었다.

  • distribution_centers : 데이터 적재에 기여한 온라인 쇼핑몰 지점에 관한 테이블
  • events : 유저가 발생시킨 이벤트에 대한 테이블
  • inventory_items : 적재되어있는 물품에 대한 테이블
  • order_items : 유저가 주문한 아이템에 대한 테이블
  • orders : 유저의 주문 내역이 담긴 테이블
  • products : 취급하는 물품에 대한 테이블
  • users : 유저의 정보가 담긴 테이블

실제 온라인 쇼핑몰에서 사용할 법한 내용으로 구성했다길래 내가 모르는 복잡한 관계를 가지고 있지 않을까 생각했는데, 테이블 간의 관계는 따로 설정되어있지 않았고, type만 지정되어있고 nullable 한 특징 말고는 설정되어있는게 없었다.

 

event 테이블의 스키마와 구성 미리보기

 

log 기록을 통해서 AU(Active User)을 구하는 것에 대해 궁금했기에, event 테이블을 열어서 MAU를 직접 구해보기로 했다.

 

테이블에 대해 상세히 보니 테이블은 총 13개의 필드로 구성되어있었고, 이벤트에 대한 id, 발생시킨 유저의 id, 발생 날짜, 종류, 트래픽 소스, 발생 위치 등의 내용이 들어있었다.

 

MAU를 구하려면 월별 접속한 유저를 중복하지 않고 합산하는 query를 작성해야한다.

select ym, count(user_id) as MAU
from 
(
  select format_datetime('%Y-%m', created_at) as ym, user_id
  from `thelook_ecommerce.events`
  group by ym, user_id
)
group by ym
order by ym;

(아직 미숙한 SQL 실력, 아직까지 query별 속도 차이를 잘 모른다.)

연월, 유저별로 group by해 조회한 결과에서 연월을 기준으로 user_id를 count한 값으로 구했다.

query 실행 결과

다행히 결과물이 잘 나왔다.

대충 살펴보니 월별로 꾸준히 증가하는 형태였다.

 

이를 좀 더 직관적으로 보고싶어서 태블로와 연동해서 시각화해보기로 했다.

 

태블로에서 서버와 연결하기 기능에서 Google BigQuery가 있어서 바로 연동 가능했다.

예제 데이터셋이기 때문에 변화가 없어서 어떻게 불러오든 상관은 없지만, 연산 용량 제한이 있어서 추출 방법으로 불러왔다.

 

사용자 지정 SQL 불러오기를 통해 작성한 query를 삽입해서 MAU를 바로 땡겨왔고, ym이 string 타입으로 되어있어 아래 함수를 통해 date타입으로 변환시켜줬다.

DATEPARSE('yyyy-MM', str([ym]))

 

변경시킨 후, 월별 MAU 그래프를 생성하고 바로 퀵 테이블 계산을 이용해 전월대비MAU상승률을 그래프로 나타냈다.

결과는,,

 

괜찮게 나온거같다.

 

 

19년 1월부터 데이터가 적재되기 시작했고 이후로 감소하는 경우는 거의 없고 꾸준히 성장하고 있는 형태로 보인다.

작은 단위에서 시작하다보니 초반에 급격한 상승이 관찰된 것으로 보인다.

 

다음에는 데이터들을 활용해서 리텐션이나 다른 지수들을 구해보는 것이 목표다.

고등학생 시절, ‘허니팁스’라는 온라인 거래 플랫폼을 제작하여 창업 동아리를 운영해보기도 하고, ‘머리 눌림 방지 헤드폰’ 아이디어를 공모하여 발명 대회에 출품하기도 하였다. 이러한 아이디어는 언제나 일상 생활 속에서 나에게 필요했던 것 으로 부터 시작되었다.

 

사람들은 제품을 출시하기 전에 ‘시장 조사’ 확실하게 수행하는 것이 중요하다고 한다. 해당 제품이 나에게만 필요한게 아닌 실제로 사람들이 필요로 하는 것인가, 필요로 하는 사람의 수는 얼마나 되는가 등을 조사해서 적절한 수익이 발생한다는 판단이 있어야 제품 생산 및 운영이 지속가능하기 때문이다.

 

여기에서의 ‘시장 조사’가 바로 **제품-시장 적합성(PMF)**이다.

 

제품-시장 적합성은 주로 린 스타트업에서 사용되는 개념으로, 제품 출시 이전 미리 조사해둔다면 아래와 같은 상황을 방지할 수 있게 해준다.

💡 제작자는 아주 좋은 아이디어가 떠올라 열심히 기획을 하고 제품을 생산하고 발전시켜나갔다. 하지만 실제 시장에서는 판매실적이 좋지 않았다.

제작자의 기준에서는 완벽한 아이디어였기에 제품이 잘 팔리지 않는 것에 대한 원인을 분석하지 못해 난처해하였다.

사실 알고보니 제작자의 제품이 필요한 상황이 실제 생활에서 빈번하게 일어나지 않는 일이었다는데 문제가 있었던 것이다.

본인에게 필요한 아이템이라 생각하여 제품을 생산하였으나 사실은 본인에게만 필요한 문제였을 수도 있고, 너무 소수만을 위한 문제였을 수도 있다. 또 일회적인 문제일수도 있기 때문에 제품-시장 적합성에 대한 고려는 상시로 이루어져야 한다.

 

제품-시장 적합성을 판단하는 대표적인 지표로 리텐션(Retention), 전환율(Conversion Rate), 순수 추천 지수(NPS, Net Promoter Score) 3가지를 든다. 리텐션은 해당 제품을 이용하는 고객이 얼마나 꾸준히 남아있는가를 측정하고, 전환율은 제품 사용자의 단계별 전환 비율을 나타낸다(ex. 앱 다운 → 회원가입 → 서비스 구매). 순수 추천 지수는 해당 제품을 얼마나 추천하는지 측정하는 지표이다.


리텐션(Retention)

리텐션은 한글로 유지율, 잔존율이라고 하며, 말 그대로 제품에 대한 고객 유지율을 의미한다.

시장에서 필요로 하는 제품에 대한 리텐션은 초기에 감소하다가 일정 수준이 되면 유지되는 형태로 나타나는 것이 일반적이다.

지속적으로 감소하는 것은 마케팅 효과 등으로 흥미를 지닌 고객들이 초기에 많이 유입되었다가 실제로 제품이 필요하지 않아 이탈하는 비율이 높다고 해석할 수 있다.

하지만 제품의 특성에 따라 일회용인 제품일 경우 리텐션은 꾸준히 감소하여도 이득이 되기도 하는 등 제품의 특성에 따라 다르기도 해 절대적인 기준이 존재하는 것은 아니다.

이는 제품-시장 적합성을 판단하는 기준이 되기도 하고, AARRR에서 등장하기도 하는 개념이기에, 이후 AARRR을 설명할 때 자세하게 설명하기로 한다.

 

전환율(Conversion Rate)

제품에 흥미를 보이기 부터 구매할 때 까지의 과정에 대한 사용자 비율을 나타내면 위와 같은 역 피라미드 형태로 나타나는데, 이를 구매 전환 퍼널이라고 한다.

 

이 역시도 리텐션과 마찬가지로 제품의 특성에 따라 다른 형태를 띄기도 하고, 제품 자체의 성능 보다 UI, UX 등의 영향을 받기도 하지만 일반적으로는 위와 같은 형태를 지닌다.

 

설명한 바와 같이 전환율의 결정 요인들은 많기 때문에, 절대적인 기준을 가지고 목표로 두기보다, 전환율을 지속적으로 관찰하면서 변화를 파악하는 것이 중요하다.

 

순수 추천 지수 (Net Promoter Score, NPS)

웹이나 앱에서 제품을 사용하다보면, 서비스에 만족하고 계신가요? 후기를 남겨주세요! 와 같은 멘트와 함께 별점 팝업이 뜨는 것을 자주 목격할 수 있다.

 

NPS는 위와 같은 간단한 방법을 통해 측정할 수 있는데, 0~10점 까지의 리커트 척도(Likert Scale)로 답변을 받아 9~10점을 준 고객을 적극적 추천 그룹으로 분류하고, 나머지를 비추천 그룹으로 분류해

$$ (적극적 추천 그룹 - 비추천 그룹) \over 전체 응답자 $$

위 공식을 활용해 점수를 측정한다.

 

NPS의 범위는 위 공식에 의해 [-1, 1]을 가지며, 일반적으로 양수가 나오면 양호하다고 판단한다. 적극적 추천 그룹은 서비스에 매우 만족하여 별도의 보상 없이도 제품을 홍보하는 등, 바이럴 마케팅(Viral Marketing)에 활용할 수 있고, 지속적인 앱 사용이 예상되어 이들을 확보하는 것이 중요하다.


여기까지 대표적인 제품-시장 적합성 평가 지표에 대해 알아보았다.

위 지표들이 절대적인 기준인 것은 아니나, 제품을 출시하는 과정에서는 고려해서 손해 볼 것 없기도 하고 실제로 많은 기업에서 이를 마케팅에 활용하고 있다.

그렇다고 해서 지나치게 해당 지표에 집착하여 필요한 다른 지표들을 무시하는 일은 없도록 주의해야할 것이다.

'데이터 분석 > 그로스 해킹' 카테고리의 다른 글

그로스해킹  (0) 2023.01.10

(본 게시글은 양승화 저자의 ‘그로스해킹’ 도서를 참고하여 제작하였습니다.)

학부생 때 데이터 분석 프로젝트를 하면 대부분 공공 데이터를 활용하거나, GCP에서 제공하는 공개 데이터를 사용했다. 인턴을 하지 않으면 기업 데이터를 다뤄볼 기회가 없었고, SQL 테스트로 사내 데이터를 엿볼 기회가 생겨도 어떻게 활용할 지 감이 안왔다.

 

또한, 나는 데이터 분석가와 사이언티스트에 대한 구별이 확실하지 않았던터라 데이터를 정제하고 그래프로 현황을 파악한 다음 머신러닝을 통한 예측을 하는 것이 데이터를 활용하는 최적의 방안이라 생각했다.

 

하지만 대기업, 스타트업 등 많은 기업을 지원해보고 각 회사별로 데이터 분석가에게 요구하는 역량에 대해 자세히 분석하다 보니 데이터 분석가와 데이터 사이언티스트의 차이점을 이해하게 되었고 데이터 분석가가 사이언티스트와 구분될 수 있는 기술인 ‘그로스 해킹’에 대해 알게 되었다.

 

아래 내용은 그로스 해킹에 대해 공부한 내용을 기록한 것이다.


그로스 해킹

그로스해킹이란?

그로스 해킹을 간단하게 말하면 말 그대로 기업의 성장을 관리하는 기법이라고 이해할 수 있다.

과거와 달리 소비자들 개인의 기준이 뚜렷해지고, 요구사항이 많아짐에 따라 일회적인 성공으로 경영을 지속하기는 힘들어졌다. 제품을 출시하고, 불편사항을 개선하고, 새로운 기능을 추가하고.. 이런 일련의 과정을 유지해나가면서 목표한 수익을 거두는 것이 성공에 가까워졌다. 그로스해킹은 이런 과정들을 데이터를 통해 살펴보고 성장 방향을 제시하는데 목적을 두고 있다.

💡 그로스해킹이 마케팅의 일부분이라거나, 그로스해커 집단에 의해 진행되는 업무라는 시각이 존재하기도 하는데, 그로스해킹은 그로스해커라는 한 사람에 의해 실현되는게 아니라 PM, 마케터, 데이터분석가 등 다양한 사람들과 부서 간의 협업을 통해 이루어진다.

기업에 따라 차이가 있지만, 그로스해킹 업무를 수행하는 부서 내부에서 PM, 엔지니어, 마케터, 디자이너, 데이터분석가로 구성되어 업무를 진행한다. 데이터 분석가가 현황에 대한 지표를 시각화해서 넘겨주면 각 부서는 KPI와 OMTM 등을 고려해 앞으로 취해야할 액션을 도출한다. 마케팅 부서에서는 결과를 바탕으로 마케팅 전략을 수립할 것이고, 엔지니어 부서에서는 데이터 적재 방식을 변경한다거나, 버그 수정에 힘을 쓸 것이다. 이렇게 모두의 노력이 뒷받침이 되어야 그로스해킹이라는 업무가 수행될 수 있는 것이다.

 

그로스 해킹 어떻게 하는건데..

그로스 해킹에서 가장 중점적으로 보는 것은 사용자 행동 패턴에 대한 지표들이다. 제품 또는 서비스에 대해 소비자들이 얼마나 지속적으로 이용하는가, 다음 서비스로 넘어가는 비율은 어떻게 되는가 등 다양한 지표를 살피고, 이를 단계적인 프레임워크를 통해 관리하며 KPI, OMTM 등의 목표를 설정하여 나아간다.

 

지표?

데이터를 통해 살펴 볼 수 있는 모든 것이 지표가 될 수 있다. 게임 광고에서 자주 등장하는 누적 설치량, 온라인 쇼핑몰에서 보이는 누적 가입자 수 등.. 지표 자체는 아주 다양하고, 각 지표가 보여줄 수 있는 인사이트 또한 가지각색이지만 단순 지표가 보여주는 함정에 빠져 잘못된 선택을 하는 경우들이 많다. 그래서 그로스해킹에서는 AARRR이라 불리는 프레임워크를 구성하고 각 단계를 설명하는 지표들을 선정하여 이들을 관리한다. (다른 방법을 통해 관리하기도 하지만, 현재까지 공부한 내용으론 AARRR이 가장 활성화 되어있다고 한다.)

 

이 모든 것을 설명하기에는 스크롤의 압박이 너무 심해지므로, 관련된 용어를 잠깐 설명하고 다음 내용은 다음 장으로 넘어가도록 한다.

 

<그로스해킹 관련 용어>

PMF(Product-Market Fit) 용어 그대로 제품의 시장 적합성을 의미한다. 실제 제품이 시중에서 원하고 있는 제품인지 판단하여, 기업 입장에서 성장관리를 할 가치가 있는지 판단하는 기준이 된다.
리텐션(Retention) 한글로는 유지율. 해당 서비스를 이용하는 고객이 유지되는 비율을 의미한다.
전환율(Conversion) 앱 접속 → 회원가입 → 상품 구매 등 다음 단계로 이어지는 과정에서 유지되는 고객의 비율을 의미한다.
NPS(Net Promoter Score) 순수 추천 지수, 해당 서비스를 이용하는 고객이 이를 타인에게 소개해주고 싶어하는 정도를 점수화 시킨 것이다.

 

AARRR  사용자의 서비스 이용 흐름에 따라 고객유치(Acquisition), 활성화(Activation), 리텐션(Retention), 수익화(Revenue), 추천(Referral)의 카테고리로 구성된 지표 관리 프레임워크.
오가닉 (Organic) 유료 마케팅을 통해 유입된 고객이 아닌, 타인의 추천이나 자사 SNS를 통해 유입된 고객
CAC(Customer Acquisition Cost) 고객 유치 비용, 한명의 사용자를 데려오기 위해 드는 평균 비용. 전체 마케팅 비용을 가입자수로 나누는 방법이 가장 대표적이며 마케팅 도구별로 구분하여 계산하기도 한다.
어트리뷰션 (Attribution) 모바일 사용자가 해당 앱을 설치하는데 까지 기여한 채널을 식별하는데 활용하는 도구.
퍼널(Funnel) 사용자가 서비스에 진입한 후 핵심기능을 사용할 때 까지의 과정을 도표로 나타낸 것.
코호트(Cohort) 공통적인 특성에 따라 세부 그룹으로 나뉜 사용자 집단.
DAU(Daily Active User) 일 평균 서비스 이용자 수.
MAU(Monthly Active User) 월 평균 서비스 이용자 수.
ARPU(Average Revenue Per User) 인당 평균 매출, 사용자 한명이 발생시키는 매출의 평균. 전체 고객을 대상으로 사용자 당 평균 매출로, ARPDAU, ARPMAU 등으로 고쳐 판단하기도 한다.
ARPPU(Average Revenue Per Paying User) 해당 서비스 내에서 유료 결제를 진행한 사용자들을 한정으로 한 사용자당 평균 매출.
LTV(LifeTime Value) 고객 생애 가치, 사용자 한명이 서비스를 이용하기 시작한 시점부터 이탈할 때 까지 누적해서 발생시킨 수익.
LTR(LifeTime Revenue) 사용자 한명이 서비스를 이용하기 시작한 시점부터 이탈할 때 까지 누적해서 발생시킨 매출. LTV와 유사한 개념이나, 수익이 아닌 매출을 의미.
바이럴 계수(Viral Coefficient) 추천 엔진이 얼마나 효율적으로 작동하는지 평가하는 지표.

 

데이터 분석하거나 시각화 하다보면 이상적인 범위를 벗어나 데이터 분포에 영향을 미치는 데이터들이 존재하는데 이를 이상값이라고 한다.

 

국민 소득을 예로 들어 설명을 하면,

 A그룹의 연간 소득 분포가 [5천만, 6천만, 4,800만, 6,200만, 7천만, 15억8천만, 39만]이 있다고 하면 이 그룹의 연간 평균소득은 2억6,719만원이다. 이런 수치는 이 그룹의 연간소득을 적절히 설명하지못한다.

이 때 일반적인 분포에서 벗어난 데이터인 15억8천만, 39만원이 이상값이라고 할 수 있다.

 

 

# 이상값 유형

이상값은 앞에 설명한 것 처럼 수치가 너무 크거나 작아 분포에 영향을 끼치는 것 외에도 다른 유형들이 있다.

구분 설명
점 이상값 일반적인 데이터들과 값의 차이가 큰 데이터
상황적 이상값 상황에 따라서 정상일수도, 비정상일수도 있는 데이터
집단적 이상값 개별 데이터일 때는 이상이 없지만, 이러한 데이터들의 집단에서는 비정상적인 패턴을이 보이는 데이터들의 집합

이러한 이상값들은 단위의 정규화가 되지 않았거나, 고의적으로 이상값을 삽입한 경우, 측정/실험 오류, 자연 변형 등에 의해 발생한다.

 

 

# 이상 데이터 탐색

직관적으로 보이는 값들은 이상값으로 처리할 수 있지만, 데이터 수가 많거나 일반적인 그래프로 발견할 수 없는 데이터들은 통계적인 기법을 이용해서 이상값을 탐색해낸다.

 

  • Z-검정 : 정규분포의 Z-score를 이용해서 표준정규분포를 벗어나는 유의수준의 값들을 이상값으로 검출하는 방법
  • 카이스퀘어 검정 : 자유도가 1인 카이스퀘어 분포를 따르는 통계량의 임계치보다 큰 경우 하나 이상의 이상값이 존재한다고 판단한다. 데이터가 정규분포를 만족시하거나, 데이터의 수가 적을 때 이용한다
  • 사분위수 범위 : 전체 데이터 분포를 25%, 50%, 75%, 100%로 구분한 사분위 범위에서 제3분위수(75%)에서 제1분위수(25%)의 값을 뺀 IQR의 MAX와 MIN 값의 밖에 있는 값들을 이상값으로 판단
  • 회귀 진단 : 해당 데이터 집단에 회귀 모델을 적용했을 때 예상 값의 범위 밖에 있는 데이터들을 이상값으로 판단
  • 거리 탐색 기법: 관측치 사이의 거리를 이용해서 평균적인 데이터 간의 거리보다 벗어난 데이터를 이상값으로 판단, 대표적으로 k-NN 알고리즘을 들 수 있다
  • 밀도 기반 탐색 기법: 상대적인 밀도를 고려하여 이상값을 탐지, LOF, DBSCAN, k-Means 알고리즘등이 있다

 

#데이터 이상값 처리

이상값은 분석의 대상이 되지 않는 경우가 많아 삭제하는 방법을 자주 사용한다.

삭제 이외에는 극단치의 기준을 적용하여 조정하거나 삭제하는 방법 또는 다른 값으로 대치하는 방법을 사용하기도 한다.

(극단치 기준 : 평균&표준편차, 사분위수 극단값 등)

 

 

#실습

 

  • Z-검정을 이용한 이상값 탐색 및 처리
import random
data = list(np.random.randint(1, 100, size=3000))

[1~100]의 범위를 값으로 가지는 3000개 데이터를 생성하고, 이를 정규화해서 살펴보고 다시 이상값을 추가한 후 확인해볼 것이다.

생성한 실제 데이터의 분포 히스토그램

구분 raw 데이터 값의 분포 이상값 추가 데이터 분포
정규분포
scipy를 이용해 정규분포 확인
표준정규분포
    <이상값 추가 코드>
ol_data = data.copy()
ol_no = 10

for i in range(ol_no):
  rand_no = random.randint(0, len(data))
  ol_data.insert(rand_no, ol_data[rand_no]*2)

<정규분포 출력 코드>

# raw 데이터 정규분포
pdf = stats.norm.pdf(np.sort(data), data_mean, data_std)
plt.figure()
plt.plot(np.sort(data), pdf)

# 이상값 추가 데이터는 데이터 추가 이후 같은 방법으로 시행

<표준정규분포 출력 코드>

# 데이터 별로 z-score을 환산한 후 적용
std_list = []

for i in data:
  z = (i - data_mean) / data_std
  std_list.append(z)

ol_data_mean = np.mean(std_list)
ol_data_std = np.std(std_list)

ol_pdf = stats.norm.pdf(np.sort(std_list), ol_data_mean, ol_data_std)

plt.figure()
plt.plot(np.sort(std_list), ol_pdf)

# 이상값 추가 이후 동일

<이상값 제거>

# |z-score|이 2가 넘는 것들을 삭제, z-score > 2의 유의수준 : 98%
for i in ol_std_list:
  if i > 2:
    ol_std_list.remove(i)
  if i < -2:
    ol_std_list.remove(i)

이상값 처리 결과

 

  • 사분위값 검정(Box plot)
data2 = pd.DataFrame(np.random.randn(100, 3), columns=['A', 'B', 'C'])
data2.head()

±3 이내의 값을 100개씩 가지는 3개의 column을 가진 dataframe을 가지고 boxplot을 그려 이상값의 존재를 파악하려한다.

 

<사분위>

 

<Box plot>

sns.boxplot(data2)

boxplot을 확인해보니 B에서 IQR의 MIN 보다 작은 이상값들이 존재함을 확인할 수 있다.

 

 

<이상값 탐색>

def get_ol(df, col, weight=1.5):
  Q_25 = np.percentile(df[col].values, 25)
  Q_75 = np.percentile(df[col].values, 75)

  IQR = Q_75 - Q_25
  IQR_weight  = IQR*weight

  low = Q_25 - IQR_weight
  high = Q_75 + IQR_weight

  ol_idx = df[col][(df[col] < low) | (df[col] > high)].index
  return ol_idx

이상값들이 어떤게 있는지 위 함수를 사용해 도출한 결과,

[19, 91, 99]번째 index의 값이 이상값임을 알 수 있음.

(random을 통해서 산출한 데이터이므로 시행마다 결과가 다를 수 있음)

 

<이상값 drop>

data2.drop(ol_idx, axis=0, inplace=True)

sns.boxplot(data=data2)

 

이상값이 사라진 boxplot

 

이렇게 이상값을 제거할 수 있다.

 

 

 

 

 

 

※위 과정은 행정안전부, 한국지능정보사회진흥원, CSLEE 컨소시엄, KPC에서 진행하는 데이터 분석 청년인재 양성 전문과정에서 제공하는 교재의 일부분을 활용해 작성했음을 밝힙니다.

데이터의 시각화 관점에서 보았을 때, 데이터는 크게 수치형 데이터와 범주형 데이터로 구분할 수 있다. 

 

범주형 변수란?

어떤 범주에 속하는 순위가 없는 데이터들을 의미한다. '성별'의 경우 '남', '여'로 구분된 범주형 변수이고, '직업'의 경우 '회사원', '자영업자', '프리랜서', '학생' 등으로 구분되는 범주형 변수이다. 

인간이 이해하기에 보다 직관적이고 인간을 대상으로 한 자료 수집의 큰 부분을 담당하고 있다.

 

하지만 컴퓨터가 이해하기에는 어려우며, 연속형 변수와 함께 사용하거나 실수화 하지않으면 시각화 하기 어렵다는 단점이 존재한다.

 

범주형 데이터의 실수화

위와 같은 이유로 범주형 데이터를 실수화하는 경우가 종종 있다.

이번 실습에서는 Labeling과 One-Hot Encoding, 이 두 가지 방법으로 진행해볼 것이다.

 

#Labeling

라벨링은 리커트(Likert)척도처럼 항목별로 정수를 부여하는 것이다.

['거주지'] 항목이 있을 때 value로 ['서울', '부산', '대구', '대전', '울산']이 있다면 이것을 [0, 1, 2, 3, 4]로 바꿔 label을 부여해주는 것을 Labeling이라고 한다.

 

아주 감사하게도 싸이킷런에서는 labeling 모듈을 제공해준다. 이를 이용해서 타이타닉 데이터의 범주형 데이터를 변환해보는 실습을 진행해볼 것이다.

 

우선 데이터를 불러와서 확인해보면..

class, deck 등이 category변수이고 sex, embarked, who, embark_town, alive 등이 object변수로 범주형 변수의 후보가 된다.

그중에 embark_town 컬럼을 가지고 Labeling을 진행해볼 것이다.

 

from sklearn.preprocessing import LabelEncoder
  • 우선 Labeling에 필요한 모듈을 import해주고, embark_town이 어떻게 생겼는지 확인해보면

값으로 [Southampton, Cherbourg, Queenstown]을 가지고 있다는 것을 알 수 있다.

encoding = LabelEncoder()
encoding.fit(df['embark_town'])
  • 그 다음 LabelEncoder 객체를 생성해주고, embark_town을 fit하게되면, 값에 따라 label이 부여된다.

확인해보니 {'Southampton' : 2, 'Cherbourg' : 0, 'Queenstown' : 1}로 labeling이 진행된 것을 확인할 수 있다.

 

 

 

#One-Hot Encoding

One-Hot Encoding(원핫 인코딩)은 범주형 데이터에 대해 이진분류하는 방법이다. 해당 값에 해당하는지에 대한 정보를 0, 1로 나타낸다.

이번에는 타이타닉 데이터의 class 컬럼을 가지고 실습을 진행해볼 것이다.

one_encoding = OneHotEncoder(sparse=False)
one_encoding.fit(df[['class']])

위와 마찬가지로 OneHotEncoder 객체를 생성해준 후 class 컬럼을 fit시킨다. 

sparse 옵션은 True(default)로 할 경우 결과를 2차원 좌표값으로 반환해주고, False로 하게되면 2차원 numpy array로 반환한다. 우리는 DataFrame으로 처리할 것이기 때문에 numpy array형식으로 반환해주기로 했다.

 

결과를 확인해보면..

array 형식으로 잘 반환된 것을 볼 수 있다.

 

One-Hot encoding의 결과값은 2차원 형식이므로 labeling과 달리 array를 dataframe으로 변환해준 다음 concat하는 과정을 거쳐 원본데이터와 결합시킬 수 있다.

df_class = pd.DataFrame(one_encoding.transform(df[['class']]), columns = one_encoding.get_feature_names())
df_class.head()

 

위와 같이 dataframe을 생성한 후 원본 데이터와 concat메소드를 이용해 합병해주면 분석에 이용할 수 있는 결과 데이터가 나오게 된다.

df_con = pd.concat([df,df_class], axis=1)
df_con

 

 

해당 코드의 일부는 행정안전부, NIA, CSLEE, kpc에서 주관하는 공공 데이터 분석 청년 인재 양성 사업의 교재를 참고하였음을 밝힙니다.

'데이터 분석 > 파이썬' 카테고리의 다른 글

[파이썬] 이상값 처리  (0) 2022.07.06
[파이썬] 워드 클라우드  (0) 2022.06.29
파이썬 클래스  (0) 2021.11.14
데이터 시각화 그래프  (0) 2021.06.29
numpy 라이브러리  (0) 2021.03.23

사람들이 시각적 자극에 민감한 만큼 시각화는 중요한 작업 중 하나이다.

 

이번에는 시각화 방법 중 하나인 워드 클라우드 (Word Cloud)에 대해서 공부해보고자 한다.

 

워드 클라우드란?

워드 클라우드는 문자로 이루어진 데이터 속에서 형태소 분석을 통해 구분된 단어들의 출현 빈도에 따라서 크기가 다르게 나타나는 시각화 도구 중 하나이다.

 

예를 들어 뉴스 기사 제목만 모아둔 파일이 있다고 했을 때, 가장 많이 나타나는 단어들을 표현하는 방법을 두 가지로 비교해보자.

 

1. 빈도수 나타내기

수치를 나타내기 때문에 가장 직관적인 방법이기도 하고, 많이 사용되는 방법이기도 하다.

예를 들어서 '국가'라는 단어가 870번 등장하고, '정책'이 863번, '토지'가 770번 등장한다고 하면

국가 870
정책 863
토지 770

이렇게 나타낼 수 있다. 

 

이런 방법은 순서대로 정렬이 되어있으면 순서대로 읽으면 순위를 알 수 있지만, 한 눈에 확 들어오지는 않는다.

 

2. 워드클라우드

워드클라우드는 데이터 전처리 과정에서 빈도수를 분석하여 시각적인 자극을 강화한 방법으로 다음과 같이 나타난다.

'포함이' 라는 단어보다 '겨우'나 '새로운'이 더 눈에 잘 들어오고, '녀석이나겠다면'이라는 문장(?)보다는 '것이다'가 더 잘 보인다. 빈도수에 기반해서 크기가 자동적으로 조정되어 나타난 것이다. 

 

빈도수에 대한 정확한 수치가 필요하진 않을 때, 조금 더 시각적인 자극이 필요할 때 이런 방법을 자주 사용하고, 데이터에 대한 정확한 통찰보다 개략적인 정보만 필요할 때 자주 사용한다. 

 

특히 웹에서 시각적 효과가 중요해진 요즘엔 웹에 등장시켜 시선을 끌기도 한다.

 

 

워드클라우드 만들기

1. 준비물

 워드클라우드를 만들기 위해서는 다음과 같은 준비물이 필요하다.

  • wordcloud 패키지: 말 그대로 wordcloud 제작을 지원하는 다양한 모듈이 담겨있는 패키지
  • KoNLpy 패키지 : 영어로만 워드클라우드를 만들 때는 꼭 필요하진 않지만, 한국어 처리를 위해서는 필요한 패키지이다. 주요 기능은 형태소 분석으로 [명사, 동사, 형용사] 등을 구분해주는 패키지이다.

 

2. 코딩

 

#필요 패키지
from wordcloud import WordCloud
from collections import Counter
from konlpy.tag import Okt

필요한 패키지들은 위와 같다. 

워드클라우드 객체 생성을 위한 wordcloud 패키지와, 단어수를 count해주는 collections 모듈의 Counter 클래스, 형태소 분석을 담당하는 KoNLpy를 import해준다.

 

with open('./output_3.csv', 'r', encoding='UTF-8') as f:
    text = f.read()

그 다음은 워드클라우드화할 문장들이 포함되어 있는 파일을 읽어온다.

나는 과거에 대학교 커뮤니티의 게시글 제목들을 크롤링한 데이터를 사용하기로 했다.

 

 

okt = Okt()
nouns = okt.nouns(text)
data = [i for i in nouns if len(i) > 1]
c = Counter(data)

이후 형태소 분석 객체를 생성하고 (Okt, Open Korean Text : 트위터에서 개발한 오픈소스 한글 처리기) 형태소 중에서 명사만 꺼낸다.

 

명사를 꺼낼 때 '야'와 같은 한글자 명사는 제외하고 하기로 하고, 빈도수를 count해준다.

 

import matplotlib.font_manager as fm

sys_font=fm.findSystemFonts()
print(f"sys_font number: {len(sys_font)}")
print(sys_font)

 

그 다음 중요한 작업 중 하나가, 한글로 작성된 텍스트를 워드클라우드 시킬 때는 폰트를 따로 적용시켜주어야 하는데 작업중인 파일과 폰트의 위치를 일치시키거나 정확한 폰트 파일의 위치를 적용시켜줘야하므로 위 과정을 통해 한글을 지원하는 폰트가 있는지 파악해야한다.

 

wc = WordCloud(font_path = 'Fonts\\NanumBarunGothicLight.ttf', 
               background_color = 'white',
               prefer_horizontal = 1,
               width = 1000, 
               height= 600, 
               max_words=100)
gen = wc.generate_from_frequencies(c)
wc.to_image()

마지막으로 워드클라우드 객체를 생성하고 옵션을 지정해준 다음에, 빈도수를 기반으로 generate해준 후, to_image()해주면..

 

 

이렇게 워드 클라우드가 나타난다. 

역시 대학교 커뮤니티답게 '교수', '시험'이 보이기도 하고 의외로 '생각'이나 '정도' 같은 단어들도 많이 보이는 것 같다.

 

워드클라우드 mask 씌우기

패키지에 의해 생성되는 기본 모양은 위와 같이 사각형의 틀 속에 글자가 배치되는 것이다.

option의 파라미터 값을 조정하면 글자의 배치나 배경 색상, 최대 폰트 크기, 최대 단어 수 등을 조정할 수 있고 frame의 모양도 설정할 수 있다.

 

네모 반듯한 것도 이쁘지만 워드클라우드를 게시하는 페이지의 특성에 따라서 다른 모양을 취해주는 것이 시각적인 효과를 더 이끌어 낼 수 있다.

 

from PIL import Image
import numpy as np

이미지를 masking 하려면 이미지 데이터를 array로 변환시키는 작업이 필요한데, 이 작업을 해주는 두 라이브러리를 호출한다.

 

이번 실습에서는 강아지 이모티콘 사진을 마스킹해서 모양을 취해보도록 하였다.

 

background = Image.open('그림1.jpg')
back_array = np.array(background)

pillow를 통해서 이미지를 픽셀화한 후, numpy를 가지고 array화 하였다.

위 과정을 거치면, 강아지 모양 사진이 RGB 색상표를 기준으로 0~255사이 범위를 가진 float타입 숫자의 array로 바뀐다.

 

wc = WordCloud(font_path = 'Fonts\\NanumBarunGothicLight.ttf', 
               background_color = 'white',
               prefer_horizontal = 1,
               width = 1000, 
               height= 600, 
               mask = back_array)

gen = wc.generate_from_frequencies(c)

wc.to_image()

처리된 이미지 파일을 워드클라우드 option의 파라미터로 주면..

 

이렇게 귀여운 강아지 모양의 워드클라우드를 볼 수 있다.

 

파이썬에도 여타 언어들 처럼 class를 만들어 객체를 생성하는 기능을 포함하고 있다.

 

현실세계에서 어떠한 객체는 하나의 정보로만 구성되는 경우는 매우 드물다. 예를 들어 자동차라는 하나의 객체 안에는 자동차의 모델명, 제작사, 타입 등의 여러가지 정보로 구성되기 때문에, primitive 타입의 자료형으로는 표현하는데 한계가 존재한다.

 

따라서 class의 기능을 이용해 자동차 같은 객체를 설명하고, 그런 변수를 생성하고 처리할 수 있도록 한다.

 

특히 파이썬과 JAVA는 같은 OOPL(Object-Oriented-Programming Language)로 객체를 우선시 하는 이러한 언어들에서 Class의 개념은 몹시 중요하다.

 

예시로 2개의 operator에 대해 사칙연산만 수행하는 계산기를 class형식으로 만들어 보았다.

class Calculator:
#constructor
    def __init__(self,operator1, operator2):
        self.operator1 = operator1
        self.operator2 = operator2
#method
    def add(self):
        return self.operator1+self.operator2
    def multiple(self):
        return self.operator1*self.operator2
    def subtraction(self):
        return self.operator1-self.operator2
    def division(self):
        return self.operator1/self.operator2

class 안에서 함수와 같은 기능을 수행하는 것들을 method라고 부른다. 

 

Calculator class안에는 사칙연산을 계산하는 4개의 method가 존재한다.

 

method는 다음과 같이 작동한다

c1 = Calculator(4,2)
print(c1.add())
print(c1.multiple())
print(c1.subtraction())
print(c1.division())
6
8
2
2.0

여기서 다른 언어들과 차이를 보이는게 몇가지 있는데, 첫번째로 constructor이다.

 

다른 언어에서 constructor는 보통 class 명으로 선언되는데 파이썬에서는 __init__이라는 이름을 사용해서 선언된다. 

파이썬에서는 언더스코어(__)이 포함된 method는 파이썬 내부에 저장된 특별한 함수나 변수명을 나타내거나, 예약어로 지정돼 함수명으로 사용할 수 없을 때 사용한다.

(대표적으로 __init__, __add__, __sub__, __str__ 등이 있다)

 

또 다른 것으로는 파이썬은 인터프리터형 언어로, 자료형이 동적으로 할당된다는 것이다. 

 

위의 각 method 실행 결과 중, division만 소숫점형태로 나타난 것을 확인할 수 있는데, C나 JAVA와 같은 언어에서 이와 같이 출력하기 위해서는 return 타입을 미리 지정해줘야하고 method 인자 또한 타입을 지정해줘야 가능하다.

 

또, 다른 언어에서는 class가 가지는 특징을 변수로 나타내는데 (C : 멤버변수, JAVA: 필드), 파이썬에서는 그런 것을 선언해주지 않아도 method 내부에서

self.변수명 = initiating

와 같이 초기화 할 수 있다.

이는 constructor가 아닌 다른 method 내부에서도 초기화가 가능하다.

 

self는 다른 언어의 this와 유사한 기능을 수행한다. 객체 스스로를 호출하는 기능을 수행하는데 객체에 대한 연산을 수행할 때는 인자로 self를 거의 항상 가진다.

(객체의 속성을 연산하는 것이 아닌 아예 다른 수행을 하는 경우 self를 사용하지 않는 경우도 있다.)

 

상속

상속은 똑같다.

오버라이딩하거나 상속받은 함수를 그대로 사용할 수 있다.

class ExtandCalcualtor(Calculator):
    def __init__(self,operator1,operator2):
        Calculator.__init__(self,operator1,operator2)
    def power(self):
        result = 1
        for i in range(self.operator2):
            result *= self.operator1
        return result
    def division(self):
        result = [0, 0]
        result[0] = int(self.operator1/self.operator2)
        result[1] = int(self.operator1%self.operator2)
        return result

이는 확장된 계산기 class로 n제곱승과 나눗셈의 몫과 나머지를 출력하도록 method를 정의해줬다.

c2 = ExtandCalcualtor(4,2)
print(c2.power())
print(c2.division())
print(c2.add())
16
[2, 0]
6

조금 다른 기능으로는 파이썬은 다중 상속을 지원하고(JAVA는 미지원), mro라는 method를 지원하는데, 이는 해당 class가 어떤 상속관계에 놓여져있는지 나타낸다.

ExtandCalcualtor.mro()

#결과
[<class '__main__.ExtandCalcualtor'>, <class '__main__.Calculator'>, <class 'object'>]

 

데이터를 분석하는데 사용되는 기법은 목적에 따라 다양하게 분류된다.

 

그 중 현재 내가 사용하고 있는 EDA(Exploratory Data Analysis) : 탐색적 데이터 분석 기법에서는 시각화를 매우 중요한 부분으로 여기고 있다.

 

데이터를 시각화 할 때 seaborn, matplot과 같은 라이브러리의 도움을 받으면 훨씬 간단하게 표현할 수 있다.

 

우선은 간단한 몇가지 그래프만 살펴보고자 한다.

 

  1. 선 그래프
  2. 파이그래프
  3. 막대그래프
  4. 히스토그램
  5. 박스플롯

위 순서대로 살펴볼 것이다.

 

1. 선 그래프

선 그래프는 우리가 가장 흔하게 알고있는 꺾은 선 그래프를 말하는 것이 맞다. 

선 그래프의 장점은 시간에 따른 변화나, 지속적인 변화가 있을 때 그것을 나타내기 용이하다.

예를 들면 각 지자체별 매해 예산의 변화를 나타낼 때 선 그래프를 통해 나타내면 지자체 별 변화를 파악하기에도 용이하고 선들의 비교를 통해서 지자체간의 차이도 파악할 수 있다.

 

df = df.read_csv('broadcast.csv', index_col=0)
df.plot(kind='line')

plot이라는 매서드를 통해서 그래프를 그렸다. plot 매서드의 파라미터로는 다양한 값이 들어갈 수 있는데, 그 값들은 kind의 영향을 받는다.

 

우선 선 그래프의 경우 plot kind의 default 값이므로, kind='line' 구문을 지우고 실행하여도 위와 같은 결과를 얻을 수 있다.

 

좀 더 구체적인 인사이트를 얻기 위해서 슬라이싱을 활용하여 데이터를 나타낼 수도 있다.

df[['KBS', 'JTBC']].plot()

이와 같이 슬라이싱을 활용하여 그래프를 나타내면, 

위와 같은 모양의 그래프를 얻을 수 있다. 

물론 이전의 그래프 또한 자료가 얼마 없었기 때문에 큰 차이가 없어보이지만, 가령 방송국이 1000개가 있었다라고 가정한다면 필요없는 자료들을 제외하고 위와 같이 나타내면 훨씬 더 직관적인 시각을 가져다준다.

 

이런 식으로 데이터 분석할 때 사용했던 여러 기법들을 통해서도 시각화에 도움을 줄 수 있다.

 

2. 파이 그래프

파이 그래프는 말 그대로 파이처럼 생긴 그래프이다. 파이 그래프는 단독 데이터의 비율을 나타낼 때 강점을 보인다.

예를 들어 A회사의 직원의 구성을 알고싶다 할 때 파이그래프를 통해서 표현하면 인사이트를 높게 가져다준다.

df.loc[2016].plot(kind='pie')

파이 그래프의 경우 단일 대상에 대해서만 데이터를 표현할 수 있기 때문에, 미리 슬라이싱을 하여 데이터를 출력하였다.

2016년에 각 방송사의 시청비율을 나타내고 있는데 이는 각 구성별 차이를 파악하는데 선 그래프 보다 더 좋은 인사이트를 제공하고 있다.

 

3. 막대 그래프

막대 그래프는 선 그래프와 마찬가지로 일상에서도 많이 사용되는 그래프이다.

막대 그래프는 한 대상 내의 여러 분류 끼리의 비교가 필요할 때 주로 사용되는데, 분류 수가 적을 때 더 좋은 인사이트를 줄 수 있다. 단순 수량을 비교할 때 장점을 가진다고 할 수 있다.

 

df.plot(kind='bar')
df.plot(kind='barh')

막대 그래프는 위와 같이 세로, 가로 그래프를 제공할 수 있다.

 

그래프를 살펴보았을 때 연도별로 다양한 방송사가 있는데, 가장 큰 값과 가장 작은 값이 한 눈에 들어오고 있으나, 어떤 그래프가 무엇을 나타내고 있는지 바로바로 비교하기가 힘들다.

 

새로운 데이터를 불러와서 다시 한 번 살펴보면,

새로 제시된 그래프가 이전 그래프 보다 무엇을 비교하고자 하는지, 차이가 얼마정도 나는지 직관적으로 파악할 수 있다.

 

4. 히스토그램

히스토그램은 도수 분포표를 그래프로 나타낸 것인데, 데이터의 분포에 따라 때때로 정규분포의 그래프와 유사한 형태로 나타난다.

 

df.plot(kind='hist', y='Height', bins=15)

위 그래프는 남자 청소년들의 키 분포를 히스토그램으로 나타낸 것이다. 

원래 데이터프레임 속에는 weight, height 등의 다양한 변수가 존재하지만, 히스토그램으로 나타내기 위해서는 y축이 무엇을 의미하는지 지정해줘야한다.

또, bins는 구간을 나눈 횟수로 적절히 조절해야 좋은 인사이트를 가져다 준다.

위 사진은 bins를 각각 100 과 10 (bins의 default는 10이다)으로 해서 나타낸 것인데, 10보다는 15로 한것이 조금 더 명확해 보이고, 100으로 한 것은 조금 더 상세하게 알아볼 수 있게 해준다.

 

5. 박스플롯

박스플롯은 보통 통계나 수학에서 사용하는 그래프와는 조금 다른 형태를 가진다.

통계정보를 시각적으로 나타내는 박스플롯은 백분율을 사용해서 분포를 나타내는데, 이를 해석하기 위해서는 사분위수의 개념이 필요하다.

 

필요한 데이터를 불러와서 describe매서드를 사용하면, 위와 같은 통계 요약을 얻을 수 있는데 index에서 25% 50% 75% 를 볼 수 있다.

이는 각각 하위 25%, 50%, 75%를 나타내는 것인데 이렇게 사분할 한 것이 사분위수라고 하며,  25%이하를 Q1(제1사분위수), 25~50%를 중앙값(제2사분위수; Q2), 50~75%를 Q3(제3사분위수), 그 이상을 Q4(제4사분위수)라고 한다.

 

해당 자료를 박스플롯으로 나타내면,

df.plot(kind='box', y='math score')

이와 같이 출력된다. 히스토그램과 마찬가지로 y축을 지정해주어야한다.

 

박스(네모)로 구분된 부분은 25% < x < 75% 사이의 값의 분포를 나타내는 부분이며 여기에 많은 양의 데이터가 분포하고 있다.

 

위 아래로 이어진 선 끝에 가로 선으로 표시된 부분은 maximum과 minimum으로 whisker라고 불리기도 한다. 데이터 별로 위 아래로 이은 선의 길이가 다를 수 있는데, 이는 값으 분포 차이 때문에 발생하는 것이다.

 

데이터는 불확실성을 가지기 때문에 범주에 속하는 maximum과 minimum보다 크거나 작은 값도 데이터 상에 존재할 가능성이 있다. 그러한 점들을 outliers라고 부르며, 특잇값 또는 극단값 이라고도 한다.

 


데이터셋 출처 : 코드잇(codeit) https://www.codeit.kr/

'데이터 분석 > 파이썬' 카테고리의 다른 글

[파이썬] 워드 클라우드  (0) 2022.06.29
파이썬 클래스  (0) 2021.11.14
numpy 라이브러리  (0) 2021.03.23
pandas 데이터 정제 (2)  (0) 2020.06.27
판다스를 이용한 데이터 정제  (0) 2020.06.17