<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Color_is_red</title>
    <link>https://aeda.tistory.com/</link>
    <description>안녕하세요! 실행력을 바탕으로 다양한 방법을 통해  
본질에 접근하는 Data Analyst, Data Scientist가 될 류범상입니다.  

contact : 92aeda@gmail.com  


Git : https://github.com/tkasod2</description>
    <language>ko</language>
    <pubDate>Sat, 4 Jul 2026 05:55:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>BS Ryu</managingEditor>
    <image>
      <title>Color_is_red</title>
      <url>https://tistory1.daumcdn.net/tistory/4805010/attach/497120eea687444ca3c16440578df3bf</url>
      <link>https://aeda.tistory.com</link>
    </image>
    <item>
      <title>self_study (SAS_0728_수정)</title>
      <link>https://aeda.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 참고자료&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/book/2678&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wikidocs.net/book/2678&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/pgmsaswlcm/home.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/pgmsaswlcm/home.htm&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경험. 결코 경험..ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 배경&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금융기관 Data EDA목적 파견. SAS Program만 설치되어있는 폐쇄망환경에서 업무 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 학습 및 분석 환경&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAS on demand &amp;amp; SAS 9.4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(블로그에는 on demand[;하기링크]를 에 대해서만 학습 과정 정리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://welcome.oda.sas.com/home&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://welcome.oda.sas.com/home&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1648453487529&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SAS OnDemand for Academics&quot; data-og-description=&quot;&quot; data-og-host=&quot;welcome.oda.sas.com&quot; data-og-source-url=&quot;https://welcome.oda.sas.com/home&quot; data-og-url=&quot;https://welcome.oda.sas.com/home&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://welcome.oda.sas.com/home&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://welcome.oda.sas.com/home&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SAS OnDemand for Academics&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;welcome.oda.sas.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Table, Library&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 sas의 Table을 파일명, Library는 폴더라고 볼 수 있다. 예를들어, folder라는 이름의 폴더에 data.sas7bdat 파일이 있다고하면 데이터를 불러올 때, folder.data로 가져온다. 여기서 &lt;span&gt;sas7bdat는 sas 데이터의 기본 포맷이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Library를 만드는 과정은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;libname&lt;/b&gt; &lt;/span&gt;이름 &quot;경로&quot;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;libname &lt;/b&gt;&lt;/span&gt;work_lib &quot;C:\Users\sas_work&quot;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0728&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 한국인으로서 필요한 Setting&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;options validvarname =any; /* 한글 변수 사용가능 */&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;options validvarname =extend; /* 한글 데이터명 사용 가능*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 경과일을 기준으로 데이터를 처리할때 (like timedelta form)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data temp_x;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set temp_x;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;time_delta = INTCK('DAY',date_a,date_b);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# Column 명 수정을 원할때 DATA문을 쓰지말자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc datasets library = [라이브러리명] ;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify [테이블명];&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rename&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[원래컬럼명a] = [바꿀컬럼명a]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[원래컬럼명b] = [바꿀컬럼명b]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;quit;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 숫자- 문자 formatting을 잘못했을때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내가 알기로는 원데이터 건드리는건 불가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우는 컬럼 순서도 중요하기때문에 다음과 같이 처리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sql로 처리해도되기야하겠지만서도 컬럼이 너무 많다면 쿼리가 너무 길어져서 merge를 활용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc datasets lib=[라이브러리명] noprint;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify [테이블명];&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rename [문제컬럼명] = [임시컬럼명];&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;quit;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data _1;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set a (keep= col_1--col_x);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inum=_n_;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data _2(drop= [임시컬럼명]);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set a (keep= [임시컬럼명]);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[원래컬럼명] = input([임시컬럼명],best12.);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inum = _n_;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data _3;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set a (keep= col_z -- col_xxxx);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inum= _n_;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data after_a(drop= inum);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;merge _1 _2 _3;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;by inum;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0613 추가내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# Append&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Macro로 비슷한 유형의 데이터를 처리할때는 Append가 차라리 낫다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, BASE_TABLE이 없는상태에서 시작해야된다. 안그러면 기존 Column의 수와 다른경우 Error가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data TEMP;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set LIB.DT;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc append data=TEMP base=BASE_TABLE; run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# Results 창 제어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 실행결과가 헷갈린다? 그러면 이건 기본적으로 세팅해두자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 새로운 결과창을 열어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ods html newfile=proc;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# Infile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Type 설정때문에 Infile을 더 많이 사용한다 나는..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data XX:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%let _EFIERR_ = 0;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;infile &quot;경로\파일명.txt&quot; DELIMITER = &quot;|&quot; MISSOVER DSD LRECL =32767 FIRSTOBS=2;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; INFORMAT CAT_COL_A %20.;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;INFORMAT NUM_COL_B BEST12.;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; FORMAT CAT_COL_A %20.;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;FORMAT NUM_COL_B BEST12.;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; INPUT&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;CAT_COL_A&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;NUM_COL_B;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IF _ERROR_ THEN CALL SYMPUX('_EFIERR_',1);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RUN;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# Merge&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAS Merge는 Merge Key에 대한 Sorting이 우선이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Merge를 하든 뭘하든, 결국 용량을 줄여서 연산속도를 높이는게 중요한데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 방법을 많이 활용하게된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc sort data=T1 out=SORTED_T1; by MERGEKEY_K; run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data T1_L; set SORTED_T1(keep= COL_A--MERGEKEY_K); run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data T1_R; set SORTED_T!(keep=MERGEKEY_K COL_L -- COL_Z); run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc sort data=T2 out=SORTED_T2; by MERGEKEY_K; run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data FINAL_MERGED_TABLE;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;merge T1_L(IN=L) SORTED_T2 T1_R;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;by MERGEKEY_K;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if L;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Data EDA 관련 함수 정리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Data 보기 &lt;i&gt;(python &lt;u&gt;pandas&lt;/u&gt;&amp;nbsp;&lt;u&gt;display&lt;/u&gt;와 동일한 기능이라고 보면 된다.)&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;proc&amp;nbsp;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;data&amp;nbsp;&lt;/span&gt;=&amp;nbsp;sashelp.fish; &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;run&lt;/span&gt;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Feature별 기초 통계량 &lt;i&gt;(python &lt;u&gt;pandas.DataFrame.describe()&lt;/u&gt; 와 유사한 기능이다.)&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biqoVy/btrxr5il0SI/fik9Ktgj69cJ4oxwGnItWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biqoVy/btrxr5il0SI/fik9Ktgj69cJ4oxwGnItWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biqoVy/btrxr5il0SI/fik9Ktgj69cJ4oxwGnItWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiqoVy%2Fbtrxr5il0SI%2Ffik9Ktgj69cJ4oxwGnItWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;343&quot; height=&quot;72&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번째 주석 라인을 풀면, 특정 변수에 대한 통계량만 보는것도 가능함&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;output보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; output&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3BRMS/btrxwXE8QoF/kPDfkgAMxML2vc9gCdKFa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3BRMS/btrxwXE8QoF/kPDfkgAMxML2vc9gCdKFa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3BRMS/btrxwXE8QoF/kPDfkgAMxML2vc9gCdKFa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3BRMS%2FbtrxwXE8QoF%2FkPDfkgAMxML2vc9gCdKFa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;547&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 파생변수 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;length1~length3(뭘 의미하는지는 안찾아봤다) 의 평균값을 avg_length라는 변수로 뽑으려고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test라는 data에 sashelp library에 있는 fish table을 할당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고, avg_length라는 새로운 feature에 length1-length3&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdetje/btrxwXymwMG/zIHV7jmpKkAnIL2vJDhks1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdetje/btrxwXymwMG/zIHV7jmpKkAnIL2vJDhks1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdetje/btrxwXymwMG/zIHV7jmpKkAnIL2vJDhks1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdetje%2FbtrxwXymwMG%2FzIHV7jmpKkAnIL2vJDhks1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;379&quot; height=&quot;133&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;output보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; output&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZ9JnP/btrxyjVxlb3/Yluy8f6MUFYG3QjP6Alxs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZ9JnP/btrxyjVxlb3/Yluy8f6MUFYG3QjP6Alxs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZ9JnP/btrxyjVxlb3/Yluy8f6MUFYG3QjP6Alxs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZ9JnP%2FbtrxyjVxlb3%2FYluy8f6MUFYG3QjP6Alxs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;491&quot; height=&quot;413&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 분포 차트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBMemF/btrxAajJLJP/TDAjPckJathHajwR8YCL80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBMemF/btrxAajJLJP/TDAjPckJathHajwR8YCL80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBMemF/btrxAajJLJP/TDAjPckJathHajwR8YCL80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBMemF%2FbtrxAajJLJP%2FTDAjPckJathHajwR8YCL80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;313&quot; height=&quot;100&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;distribution에 대한 percent graph와 weight에대한 horizontal graph다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번라인] vertical bar chart-&amp;gt; &lt;i&gt;type = percent&lt;/i&gt; 입력 시, density histogram을 보여준다.(default는 countplot)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번라인] horizontal bar chart -&amp;gt; Freq, cum density 등이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;output보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yks31/btrxGcgJELX/6vNIU6FcvECjdepvpwNRf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yks31/btrxGcgJELX/6vNIU6FcvECjdepvpwNRf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yks31/btrxGcgJELX/6vNIU6FcvECjdepvpwNRf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyks31%2FbtrxGcgJELX%2F6vNIU6FcvECjdepvpwNRf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmssSD/btrxHycMgan/zykeaQ5OZnqWzGu8WZ4bxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmssSD/btrxHycMgan/zykeaQ5OZnqWzGu8WZ4bxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmssSD/btrxHycMgan/zykeaQ5OZnqWzGu8WZ4bxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmssSD%2FbtrxHycMgan%2FzykeaQ5OZnqWzGu8WZ4bxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) chart 추가 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 수정 필요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6) data import&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/*excel file*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc&amp;nbsp;import&lt;br /&gt;datafile = &quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;DIR&lt;/span&gt;/&lt;span style=&quot;color: #006dd7;&quot;&gt;FILENAME&lt;/span&gt;.xlsx&quot;&lt;br /&gt;dbms=xlsx&lt;br /&gt;out=&lt;span style=&quot;color: #006dd7;&quot;&gt;LIBNAME&lt;/span&gt;.&lt;span style=&quot;color: #006dd7;&quot;&gt;DATAOUTNAME&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replace&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;;&lt;br /&gt;getnames&amp;nbsp;=&amp;nbsp;yes;&amp;nbsp;&lt;br /&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/*-----------------------------------------*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/*text file*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc import&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;datafile = &quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;DIR&lt;/span&gt;/&lt;span style=&quot;color: #006dd7;&quot;&gt;FILENAME&lt;/span&gt;.txt&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbms = &lt;span style=&quot;color: #ee2323;&quot;&gt;dlm&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;out=&lt;span style=&quot;color: #006dd7;&quot;&gt;LIBNAME&lt;/span&gt;.&lt;span style=&quot;color: #006dd7;&quot;&gt;DATAOUTNAME&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replace&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delimiter = '|' /* 구분자에 따라서 설정*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getnames=yes;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;guessingrows=max;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7) export&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc export data = &lt;span style=&quot;color: #006dd7;&quot;&gt;LIBNAME&lt;/span&gt;.&lt;span style=&quot;color: #006dd7;&quot;&gt;DATAOUTNAME&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;outfile = &quot;DIR/FILENAME.xlsx&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbms = xlsx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replace;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8) null control&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc&amp;nbsp;sql; &lt;br /&gt;create&amp;nbsp;table&amp;nbsp;xx&amp;nbsp;as &lt;br /&gt;select&amp;nbsp;count(AdolescentFPpct)&amp;nbsp;as&amp;nbsp;cnt &lt;br /&gt;,nmiss(AdolescentFPpct)&amp;nbsp;as&amp;nbsp;isna_count/*num&amp;nbsp;miss*/ &lt;br /&gt;, coalesce(AdolescentFPpct) as null_아닌것중에첫번째값 /*oracle 기준 NVL 과 동일*/&lt;br /&gt;,&amp;nbsp;case&amp;nbsp;when&amp;nbsp;AdolescentFPpct&amp;nbsp;is&amp;nbsp;not&amp;nbsp;null&amp;nbsp;then&amp;nbsp;AdolescentFPpct&amp;nbsp;else&amp;nbsp;0&amp;nbsp;end&amp;nbsp;as&amp;nbsp;fillna_or_replace &lt;br /&gt;from&amp;nbsp;sashelp.demographics &lt;br /&gt;&lt;br /&gt;; &lt;br /&gt;quit; &lt;br /&gt;&lt;br /&gt;proc&amp;nbsp;print&amp;nbsp;data=xx; &lt;br /&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9) duplicates 처리(drop_duplicates() )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/* DF.drop_duplicates('COL1')과 동일*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc sort data=DIR.DF out=DIR.DF_drop_duplicated dupout =DIR.DF_only_duplicated noduprecs;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;by COL1;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Data 처리 및 기타 programming/SAS</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/59</guid>
      <comments>https://aeda.tistory.com/59#entry59comment</comments>
      <pubDate>Mon, 28 Mar 2022 16:48:17 +0900</pubDate>
    </item>
    <item>
      <title>HTML에서 Link만 남기기(22.03.24 1차수정)</title>
      <link>https://aeda.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;3/24 의외의 상황이 발생하여 수정합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무를 하다보니, data를 넘겨받을 때 상당히 비합리적인 상황이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어, link를 일일이 확인해서 labeling을 진행해야하는데 html source를 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무상 필요없는 tag이기 때문에 날려야한다. 어떻게 했는지 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. HTML 내 link가 어떤식으로 들어갔는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;2. 접근 및 추출 코드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하단, 그림을 보면 알 수 있듯이 script tag(java script 코드 삽입을 위한 태그)를 위해서 진행하고, 이미지 파일은 기본적으로 &amp;lt;img src = &quot;URL&quot;&amp;gt; 저장하는것이 일반적이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D1pdO/btrwb4cI3PW/Ke16FBtEUGMEXwyRTS7a4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D1pdO/btrwb4cI3PW/Ke16FBtEUGMEXwyRTS7a4K/img.png&quot; data-alt=&quot;파리바게뜨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D1pdO/btrwb4cI3PW/Ke16FBtEUGMEXwyRTS7a4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD1pdO%2Fbtrwb4cI3PW%2FKe16FBtEUGMEXwyRTS7a4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;318&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파리바게뜨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nxdHi/btrwb3ERsUg/BWTCkxep0OlvkU08Uflzkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nxdHi/btrwb3ERsUg/BWTCkxep0OlvkU08Uflzkk/img.png&quot; data-alt=&quot;인터파크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nxdHi/btrwb3ERsUg/BWTCkxep0OlvkU08Uflzkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnxdHi%2Fbtrwb3ERsUg%2FBWTCkxep0OlvkU08Uflzkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;313&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인터파크&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;1. HTML 내 link가 어떤식으로 들어갔는가?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 접근 및 추출 코드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 처음으로 생각한 방법은 정규표현식을 통한 문자 추출이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 덜된 전처리긴 하지만 html을 줬다는 것은 Scraping을 진행했다는 것이고, 마무리가 안된 Scraping을 마저 이어가는것이 보다 흐름적으로 맞다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 우선적으로 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로, 내가 받은 파일 형식은 xlsx였다.&lt;/p&gt;
&lt;pre id=&quot;code_1647477844850&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np
from datetime import datetime
from bs4 import BeautifulSoup
from collections import defaultdict

in_path = 'C:/Users/AA/Downloads/'# file 경로
filename = '파일명.xlsx' # file명
sh_name = '시트명' # sheet명

df = pd.read_excel(in_path+filename,sheet_name=sh_name)

i_num = 0
ddic = defaultdict(str)

for x in df['컬럼명']:
    soup = BeautifulSoup(x,'html.parser')
    urls = soup.find_all('img') # image Tag를 전부 찾는다.
    url_lst=[]
    try : 
        for url in urls:
            if url['src'] not in null_lst: # src뒤에 있는 링크를 추출하려면 다음과 같이 진행해야한다.
                url_lst.append(url['src'])
    except KeyError:
    	pass
    ddic[i_num] = url_lst
    i_num+=1
        
df['urls']=ddic.values()

def segment_url(lst,i):
    try:
        out = lst[i]
        return out
    except IndexError:
        out = ''
    return out

for i in range(max(df['urls'].map(len))):
    df[f'url{i+1}'] = df['urls'].map(lambda x:segment_url(x,i))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 cell 별로 가지고 있는 max개의 url list를 펼쳐서 링크 확인을 하기 위해서 최대 url 보유갯수를 기준으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼을 생성해서 오른쪽으로 쭉 붙이기로했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;절차는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;A. beautifulsoup을 통한 html parsing&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;B. find_all 함수를 통한 index별 link 모아서 list화(default dict 사용)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C. 기존 Data Frame의 컬럼으로 삽입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;수정내용 : Key Error 발생으로 Try Except문을 추가했다. img tag가 없는 경우도 발생하기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;추가로, collections의 defaultdict의 가장 큰 장점은, 해당 key가 있는지 없는지에 대한 조건문(if~else)을 쓸 필요 없다는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어려운 코드는 하나도 없지만 약간의 설명을 하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;segment_url 함수 생성의 이유는, 예를들어 url5라는 컬럼이 만들어지는데, 2번 index에는 url이 2개밖에 없게되면 Index Error가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Try, Except문을 통해서 Error 발생을 막고 각 Row별로 cell값을 채워주기 위해서 가장 하단과 같이 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 따른 최종 아웃풋은 하단과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgLjSv/btrwezDIDYz/D9qkrdIUUrKQhDkEU9lKV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgLjSv/btrwezDIDYz/D9qkrdIUUrKQhDkEU9lKV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgLjSv/btrwezDIDYz/D9qkrdIUUrKQhDkEU9lKV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgLjSv%2FbtrwezDIDYz%2FD9qkrdIUUrKQhDkEU9lKV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1816&quot; height=&quot;582&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Data 처리 및 기타 programming/Python</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/45</guid>
      <comments>https://aeda.tistory.com/45#entry45comment</comments>
      <pubDate>Thu, 17 Mar 2022 09:57:47 +0900</pubDate>
    </item>
    <item>
      <title>Data Handling (Pandas and SQL) (1/2)</title>
      <link>https://aeda.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;DATA 원본 출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.kaggle.com/mkechinov/ecommerce-events-history-in-electronics-store/version/1&quot;&gt;https://www.kaggle.com/mkechinov/ecommerce-events-history-in-electronics-store/version/1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642926176553&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;eCommerce events history in electronics store&quot; data-og-description=&quot;This dataset contains 900K detailed users' events from eCommerce website&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/mkechinov/ecommerce-events-history-in-electronics-store/version/1&quot; data-og-url=&quot;https://kaggle.com/mkechinov/ecommerce-events-history-in-electronics-store&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mAneI/hyNbYMIDgA/G5mk81KIEUbHK7XNC8vowK/img.jpg?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/mkechinov/ecommerce-events-history-in-electronics-store/version/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/mkechinov/ecommerce-events-history-in-electronics-store/version/1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mAneI/hyNbYMIDgA/G5mk81KIEUbHK7XNC8vowK/img.jpg?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;eCommerce events history in electronics store&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This dataset contains 900K detailed users' events from eCommerce website&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kaggle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 방법을 기반으로 Skill up 목적으로 진행하는지라 Data Volumn은 0.01정도만 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DATA는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bH4Ggn/btrroXYzdZ1/3KBm207yatXyLRVkmJSph0/user_log.db?attach=1&amp;amp;knm=tfile.db&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;user_log.db&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;3.07MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;진행 환경&lt;/b&gt; : Colab Pro (Pro아니어도 하등 상관없다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) import&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Data load&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3-1) Python Pandas로 Data 처리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3-2) SQL Data로 Data 처리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 시각화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) Cohort&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 셋팅&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;000(추가). sqlite3 upgrade&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : windows 함수 안먹는 문제 해결하다보니 찾았습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6aa94f;&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/59427642/upgrading-sqlite-in-colab/59429952#59429952&quot;&gt;https://stackoverflow.com/questions/59427642/upgrading-sqlite-in-colab/59429952#59429952&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;figure id=&quot;og_1643000864664&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Upgrading SQLite in Colab&quot; data-og-description=&quot;I have been doing some data analysis through a local jupyter notebook, using sqlite, pandas and plotly. I want to move that notebook on the colab website to allow others to use it but it is reporting&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/59427642/upgrading-sqlite-in-colab/59429952#59429952&quot; data-og-url=&quot;https://stackoverflow.com/questions/59427642/upgrading-sqlite-in-colab&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gUANv/hyNb47TK1h/fkkIM29RaPK5Fd2zV6KzHK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/59427642/upgrading-sqlite-in-colab/59429952#59429952&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/59427642/upgrading-sqlite-in-colab/59429952#59429952&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gUANv/hyNb47TK1h/fkkIM29RaPK5Fd2zV6KzHK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Upgrading SQLite in Colab&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I have been doing some data analysis through a local jupyter notebook, using sqlite, pandas and plotly. I want to move that notebook on the colab website to allow others to use it but it is reporting&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1643000900401&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;!gdown --id 1BSHIKQ7rFw5BpTq5nw1UZfjPK_7Mpnbi
!mv _sqlite3.cpython-37m-x86_64-linux-gnu.so /usr/lib/python3.7/lib-dynload/
# restart runtime&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;runtime 다시 돌리고 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;001. import&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642926407429&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np
import sqlite3
from google.colab import drive
drive.mount('/content/drive')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;002. Data 불러오기 (편의상, SQL로 불러온 데이터를 DataFrame으로 디스플레이하게 설정해놨다.)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642926456469&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dbpath = &quot;/content/drive/MyDrive/sql/user_log.db&quot;
conn = sqlite3.connect(dbpath)
def SQL(query):
  cur = conn.cursor()
  cur.execute(query)
  df = pd.read_sql_query(query, conn)
  # return cur.fetchall()
  return df
################## 이 밑에 구문에다가 SQL쿼리를 쓸거다. 이따가 또 보면 됨.
query =\
'''

select * from user_data

;'''
df=SQL(query)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;003-01. Pandas&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642926868018&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;del df['index'] # index 안받게 받아와도 되는데, 혹시몰라서 불러오고 삭제한다.

# str으로 dtype 바꿔주고, to_datetime을 먹여줘야한다. int가 숨어있는듯
df['event_time'] = pd.to_datetime(df['event_time'].astype('str')) 


df['date_time'] = df['event_time'].dt.strftime('%Y-%m-%d')
df['date_month'] = df['event_time'].dt.strftime('%Y-%m')

# 20년 9월 데이터는 완전하지 않기때문에 지워준다.
df = df[~(df['date_month'] == '2020-09')].reset_index(drop=True)

# DAU, MAU
DAU = df.groupby('date_time')['user_id'].nunique().reset_index().rename(columns={'user_id':'dau'})
MAU = df.groupby('date_month')['user_id'].nunique().reset_index().rename(columns={'user_id':'mau'})

DAU['month'] = pd.to_datetime(DAU['date_time']).dt.strftime('%Y-%m')
# Stickiness
Stickiness = DAU.merge(MAU,how='left',left_on='month', right_on = 'date_month')
Stickiness['stickiness'] = Stickiness['dau']/Stickiness['mau']
Stickiness = \
Stickiness.merge(Stickiness.groupby('month')['dau'].mean().reset_index().rename(columns = {'dau' :'avg_dau'}), how='left', on = 'month')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ztBZi/btrro52UD34/X4cyGLTVsCnbf2xnHeNHUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ztBZi/btrro52UD34/X4cyGLTVsCnbf2xnHeNHUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ztBZi/btrro52UD34/X4cyGLTVsCnbf2xnHeNHUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FztBZi%2Fbtrro52UD34%2FX4cyGLTVsCnbf2xnHeNHUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;349&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;003-02. SQLite3&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;중요!) 아쉽게도, Partition by를 쓸 수 없어서 join을 통해서 데이터를 만들어야한다.&lt;/b&gt;&lt;/span&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;다른 제품(postgresql, oracle,...)의 경우에는 with 절 이후에,&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;select distinct &lt;span style=&quot;color: #f3c000;&quot;&gt;month, day&lt;/span&gt;,&lt;/span&gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;count(distinct user_id) over(partition by month) as mau,&lt;/span&gt; &lt;span style=&quot;color: #409d00;&quot;&gt;count(distinct user_id) over(partition by day) as dau, ~~&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대략 이런식으로 가면 된다.&lt;/span&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ 위 내용의 문제는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) over절과 count(distinct ~)절은 함께 작동할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 결국, subquery 2개 만들어서 해결하는것이 유일한 답이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;c.f 효율&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 1.0*dau -&amp;gt; int를 float 형식으로 바꿀때 cast(dau as float) 뭐 이렇게 가져가도 되겠다만, 편한 팁이다.&lt;/p&gt;
&lt;pre id=&quot;code_1642926957619&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dbpath = &quot;/content/drive/MyDrive/sql/user_log.db&quot;
conn = sqlite3.connect(dbpath)
def SQL(query):
  cur = conn.cursor()
  cur.execute(query)
  df = pd.read_sql_query(query, conn)
  # return cur.fetchall()
  return df
################################# 여기 경계로 cell 따로 구성하십셔
query =\
'''
with t as (
select a.*,strftime('%Y-%m-%d',a.event_time) as day, strftime('%Y-%m',a.event_time) as month
-- ,date(a.event_time)
-- ,strftime('%Y-%m-%d - %H:%M:%S - %f',a.event_time)
-- ,stftime()
from user_data as a
where 1=1
and month &amp;gt; '2020-09'
-- and category_code is null
order by event_time
)
select daily.month,day,dau,mau, 1.0*dau/mau as stickiness from (select month,day,count(distinct user_id) as dau from t group by day) daily
left join (select month,count(distinct user_id) as mau from t group by month) monthly
on daily.month = monthly.month
;'''
SQL(query)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IV4es/btrroYiWkBG/2LJFztJkeCWFXLtqcKJSd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IV4es/btrroYiWkBG/2LJFztJkeCWFXLtqcKJSd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IV4es/btrroYiWkBG/2LJFztJkeCWFXLtqcKJSd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIV4es%2FbtrroYiWkBG%2F2LJFztJkeCWFXLtqcKJSd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;312&quot; height=&quot;343&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아무래도 Query가 지저분해보이는데, SQL문으로도 다시 정리해보면 아래와 같다. (여기서 day랑 month는 함수아니고 feature라는점 인지하자.)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642927046971&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with t as (
select a.*,strftime('%Y-%m-%d',a.event_time) as day, strftime('%Y-%m',a.event_time) as month
from user_data as a
where 1=1
and month &amp;gt; '2020-09'
order by event_time
)
select daily.month,day,dau,mau, 1.0*dau/mau as stickiness from (select month,day,count(distinct user_id) as dau from t group by day) daily
left join (select month,count(distinct user_id) as mau from t group by month) monthly
on daily.month = monthly.month&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;004. 시각화 (DAU만 올린다. )&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642927247578&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

sns.set_theme(style=&quot;whitegrid&quot;, palette=&quot;pastel&quot;)
plt.xticks(rotation=45)
plt.yticks(rotation=30)

g = sns.lineplot(x='date_time',y='dau',data=DAU)
g.figure.set_size_inches(30,8)
# g.xaxis.set_major_locator(ticker.MultipleLocator(0))

g.set_title(&quot;dau(20.10~21.02)&quot;, pad = 15, size = 16)
g.set_xlabel(&quot;date&quot;,labelpad = 20, size = 13)
g.set_ylabel(&quot;dau&quot;,labelpad = 20, size = 13)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1748&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x06By/btrrxXPOp2I/KVSbMSftDFUxlEIqmmbQV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x06By/btrrxXPOp2I/KVSbMSftDFUxlEIqmmbQV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x06By/btrrxXPOp2I/KVSbMSftDFUxlEIqmmbQV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx06By%2FbtrrxXPOp2I%2FKVSbMSftDFUxlEIqmmbQV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1748&quot; height=&quot;570&quot; data-origin-width=&quot;1748&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sqlite의 가장 좋은 점은 datetime formating을 sql과 python 동일하게 가져간다는점이다. Data Handling이 더 복잡해지려면, 아무래도 join하고 이래저래 할건데 그럴려면 Data가 워낙 복잡해져야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Handling은 Cohort 차트까지만 그리고 간단하게 마무리할 콘텐츠인데, 분석력과는 아무런 관계 없음을 알린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;분석관련 게시물은 작성을 어느정도 해놨는데 분량을 어느정도씩 자를지 고민중이다. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Data 처리 및 기타 programming/SQL</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/44</guid>
      <comments>https://aeda.tistory.com/44#entry44comment</comments>
      <pubDate>Sun, 23 Jan 2022 17:53:18 +0900</pubDate>
    </item>
    <item>
      <title>22.01.05 뜬금없이 Python으로 Stopwatch 만들기</title>
      <link>https://aeda.tistory.com/42</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/pl7Vs/btrpUMQv6C2/E4Yz5Vrc6tGh4M5wqI0C81/stop.exe?attach=1&amp;amp;knm=tfile.exe&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;stop.exe&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;9.25MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운동 휴식시간 컨트롤용 스톱워치가 필요해서 만들어보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 확인해보니 딜레이가 발생하긴한다...ㅠㅠ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCy6ie/btrpVwT4Unt/Vwwxiz61CB47pdkjLRH35K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCy6ie/btrpVwT4Unt/Vwwxiz61CB47pdkjLRH35K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCy6ie/btrpVwT4Unt/Vwwxiz61CB47pdkjLRH35K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCy6ie%2FbtrpVwT4Unt%2FVwwxiz61CB47pdkjLRH35K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;228&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도, 만들었는데 포스팅은 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굉장히 허접하긴하지만, 스타트, 스탑, 초기화 버튼 있을건 다 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공정은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;## 01 &lt;/b&gt;&lt;b&gt;.py 파일 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내장 모듈인 tkinter 를 활용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, 간단한 코드 작성을 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1641384234298&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tkinter as tk
def startTimer():
    if (running):
        global timer
        timer += 1
        timeText.configure(text= f'{timer/100:.2f} s')
    window.after(10, startTimer)

def start():
    global running
    running = True

def stop():
    global running
    running = False

def initial():
    global running
    running = False
    global timer
    timer = 0
    timeText.configure(text= f'{timer/100:.2f} s')

running = False
# initialing = True
window = tk.Tk()
window.geometry('400x200')
timer = 0

timeText = tk.Label(window, text = '0', font=(&quot;Helvetica&quot;, 80))
timeText.pack()

startButton = tk.Button(window, text = 'Start', bg='yellow', command=start)
startButton.pack(fill=tk.BOTH)

stopButton = tk.Button(window, text = 'Stop', bg='red', command=stop)
stopButton.pack(fill=tk.BOTH)

initialButton = tk.Button(window, text = 'Initial', bg='green', command=initial)
initialButton.pack(fill=tk.BOTH)

startTimer()

window.mainloop()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;## 02 exe 파일로 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;colab위주로 사용하다보니 몇가지 공정이 추가로 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) pyinstaller 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd창에서,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;gt; pip install pyinstaller&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2)&lt;/b&gt; &lt;b&gt;importlib_metadata 업그레이드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd 창에서,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;gt; pip install -U --user importlib_metadata&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) pyinstaller 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우는 atom ide terminal을 사용했으나, cmd에서 접근해도 무방하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;.py 파일이 있는 경로&lt;/b&gt;&amp;gt; pyinstaller&amp;nbsp;-w&amp;nbsp;-F&amp;nbsp;&amp;nbsp;stop.py&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) dist 폴더에서 .exe file 추출&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하루종일 공부만 하다가, 간단한 성과가 있으니 즐거웠다. 끝-&lt;/p&gt;</description>
      <category>잡생각</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/42</guid>
      <comments>https://aeda.tistory.com/42#entry42comment</comments>
      <pubDate>Wed, 5 Jan 2022 21:16:19 +0900</pubDate>
    </item>
    <item>
      <title>Data Analysis - AARRR(Full Ver)</title>
      <link>https://aeda.tistory.com/38</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/betNqI/btrn21DlDzg/m8Kxn1Y1ew2WKCLKdUdb20/DA%281%29_AARRR.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;DA(1)_AARRR.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.29MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;AARRR&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지표란?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그를 특정 기준에 따라 요약한 수치&lt;/li&gt;
&lt;li&gt;상황과, 목표 및 의사결정의 척도가 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;지표 관리 방향/방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;효율적 지표 관리 (about AARRR)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;User Lifecycle을 기반으로 stage를 구분&lt;/li&gt;
&lt;li&gt;funnel형태로 이뤄져 나가야함&lt;/li&gt;
&lt;li&gt;지표로부터 태스크를 관리해야함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;- Task-based
    - 팀별 담당하는 Task를 기반으로 수치를 관리
    - 중요도의 판단이 어려움
    - Task의 누락이 발생가능성이 있음
    - 제품/서비스 관점의 최적화는 아님

- AARRR에 대한 유의점
    - 단계별 모니터링이 중요한것이 아님
    - Activation &amp;amp; Retention을 우선적으로 고려하고 나머지 지표를 관리해야함
    - 단계별 문제 정의와 지표를 선별하고 측정해야함
    - 개선이 필요한 목표지표를 선정하고 실험을통해 단계적 개선해야함&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Acquisition : 사용자를 찾아오게 하는 고찰&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 구분
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 채널로 고객유입이 되었는가?(인스타광고, 구글 검색, ...)&lt;/li&gt;
&lt;li&gt;Organic vs Unknown
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자발적인 고객과, 소스를 알 수 없는 고객&lt;/li&gt;
&lt;li&gt;자주 혼동하는 포인트&lt;/li&gt;
&lt;li&gt;실사례에서는, Indentified와 Unknown의 관계로 생각하는 경우도 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용자의 유입채널을 정확히 파악하고,&lt;/li&gt;
&lt;li&gt;어떻게하면 성과를 정확히 판단할 수 있을지에 대한 고민이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CAC(Customer Acquisition Cost)* n &amp;lt; LTV(lifetime Value)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BM이 과연 지속가능한지에 대한 판단이 필요함&lt;/li&gt;
&lt;li&gt;또한, CAC와 LTV중 어떤 지표가 상대적으로 컨트롤하기 용이한가&lt;/li&gt;
&lt;li&gt;CAC : 유저 획득 비용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세분화가 필요함&lt;/li&gt;
&lt;li&gt;ex) 어떠한 매체로, 어떤 캠페인으로, 어느 시기에 진행할지 고민이 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;In WEB&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UTM parameter(Urchin Tracking Module)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현 Google Analytics&lt;/li&gt;
&lt;li&gt;어느 경로로 들어왔는지 바로 확인 가능하도록 하는 파라미터&lt;/li&gt;
&lt;li&gt;utm을 붙여서 광고집행하면 이러한 조회가 가능함.(URL뒤에 붙음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;In Mobile App&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;App이 실행되는 순간, User의 유입과정을 유추&lt;/li&gt;
&lt;li&gt;Web가 차이가 나는 이유?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;app store 설치과정에서 URL에 붙어있는 Parameter는 유실됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Attribution
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중간을 이어주는 서비스로 구현 (AppsFlyer, adjust, branch, kochava 등)&lt;/li&gt;
&lt;li&gt;Attribution window &amp;lt;=&amp;gt; look back window (~기간, 기준)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex. 광고를 클릭하고, 설치하고 실행하는데까지 걸린 시간&lt;/li&gt;
&lt;li&gt;Click Through vs View Through
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Click을 하지 않고 view만 있는데, 이를 Attribution window로 설정해야할지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Attribution Model
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떠한 touchpoint를 기준으로 윈도우로 삼을것인가!&lt;/li&gt;
&lt;li&gt;last click, time decay, linear, Position-based, First click 등 다양한 기준으로 설정할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;case study
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클릭 vs 뷰
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;채널 특징에 따라 중요도의 차이가 존재함(동영상 vs 어그로성 팝업)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ROAS가 높을수록 좋은가?&lt;br /&gt;1) 광고 플랫폼에서의 ROAS를 Return이 아닌 Sales를 고려
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  - 예를들어 채널1과 2가 500만원의 광고비로, 매출을 5000만원을 얻었지만 순이익의 차이가 있어도 플랫폼에서는 이를 명확하게 인지하지 못함&lt;/code&gt;&lt;/pre&gt;
2) 또한, 광고비에따른 매출의 증감 패턴이 Linear하지 않음&lt;br /&gt;3) 여러 매체에서 광고 집행시에는 중복집계 가능성이 있음&lt;br /&gt;4) 매출이 광고의 효과인지?&lt;br /&gt;5) 이 외에도 여러 포인트들의 가능성이 존재함Attribution에서 발생할 수 있는 Issue&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;딥링크
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디퍼드 딥링크 - ex. 카톡으로 보낸 링크로 설치시, 앱 설치가 안되어있어서 설치화면으로 이동됨&lt;/li&gt;
&lt;li&gt;UX측면에서 유리함&lt;/li&gt;
&lt;li&gt;Attribution 성과 측정에 유리함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Organic Acquisition인지 판단의 방향 혼재
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SEO(Search Engine Optimization), ASO(Appstore Optimization)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색어 및 핵심 키워드의 선별
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;APP &amp;gt; &quot;SensorTower &amp;gt; Appstore 최적화&quot; 를 통한 Optimizing&lt;/li&gt;
&lt;li&gt;WEB &amp;gt;&lt;br /&gt;&quot;Blackkiwi&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메타데이터 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;대부분 Last click의 attribution 세팅을 가지고있음. Attribution Model을 어떤걸로 설정?&lt;/li&gt;
&lt;li&gt;Raw Data레벨로 확인하고 분석해야할 필요가 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요약데이터가 아니라 RawData까지 접근해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단순히 툴만을 사용하는 것이 아니라, 의사결정까지의 맥락을 이해해야함. (ROAS 예시 참조)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Acquisition Summary&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;핵심 채널을 잘 관리해야함&lt;/li&gt;
&lt;li&gt;채널(ex. 페이스북, 인스타그램, ...)의 최적화와 확장이 필요함&lt;/li&gt;
&lt;li&gt;정확한 트래킹&lt;/li&gt;
&lt;li&gt;어트리뷰션툴에 대한 다양한 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Activation : 사용자가 서비스/제품의 핵심가치를 경험했는가&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 경험의 Funnel에서 각 단계별 전환율(ex.이탈율)을 측정/분석&lt;br /&gt;(Download에서 Onboarding의 끝까지)&lt;/li&gt;
&lt;li&gt;Funnel 분석의 요소&lt;br /&gt;1) 핵심가치에 대한 Stage의 정의2) Stage별 전환율을 어떤 기준으로 측정하는지3) Cohort별로 보는지&lt;/li&gt;
&lt;li&gt;&lt;code&gt;  - Funnel마다의 전환율을 확인하기 위해서, User/Browser/Mobile/세션/event 등을 기준으로 Cohort를 만들어서 분석
      - ex. Mobile vs PC 고객을 따로 분석
      - Event(action)와 시점을 기준으로 cohort를 만드는 경우가 많음&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;  - 결제패턴 예시
      - 하나의 제품만을 여러번 보고 결제가 1회 이뤄진 경우
      - 여러 제품을 보고 그 중 일부 결제가 이루어진 경우
      - Conversion Rate를 과연 뭘로해야할까?
          - User기준?
          - View기준?
          - Product기준?
          - **답이 없는 문제임!!**&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;  - 사용자의 입장과 회사의 입장을 일치시키는 작업 필요(UX기반)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Funnel 분석의 의의
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stage별 Conversion의 확인&lt;/li&gt;
&lt;li&gt;Conversion과 유관한 선행지표를 발굴할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이탈 원인 분석
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인터뷰&lt;/b&gt;, 설문, 데이터분석&lt;/li&gt;
&lt;li&gt;Raw Data를 기반으로 Conversion User와 그렇지 않은 User의 분석을 통해 역순으로 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Funnel Summary
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Conversion을 통해 Global Optimization이 중요&lt;/li&gt;
&lt;li&gt;Stage를 명확하게 정의해야함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;불필요한 Stage를 통해 지표를 발굴했을때 과연 의의가 있을까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Home Try On : Funnel을 역순으로 진행한 Service들이 존재
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex&amp;gt; Warby Parker : 안경을 배송하고, 마음에 들면 결제처리 아니면 반송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cohort별 차이가 발생하는 원인을 파악해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Funnel 개선
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개인화 : ML, DL이나 Rule 기반 추천 시스템&lt;/li&gt;
&lt;li&gt;UI/UX : UI의 Redesign을 통해 개선될 수 있는지 검증(ex. AB Test)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 유도&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음 Funnel로 이동할 수 있도록 유도 하는것
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) 타겟팅을 기반으로한 푸시, 이메일, 인앱 메시지 등등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Retention : Activation 과정에서 A HA Moment를 꾸준히 경험하도록 하는것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 재방문을 기반으로 측정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접속을 기준으로 꼭 해야하는지에 대해서는 고민해볼필요 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;개선효과
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비용대비 효과가 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Retention 측정 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Classic Retention(= Day-N Re~)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Day N에 서비스를 사용했는지에 대한 여부만 지표로함&lt;/li&gt;
&lt;li&gt;N 일이 지나고 재방문을 했는가에 대한 Retention&lt;/li&gt;
&lt;li&gt;(+) 계산과 설명이 쉬움
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;짧은 주기로 반복적 사용이 중요한 서비스에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(-) Noise에 취약
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Noise를 줄이기 위해서, N의 값을 여러개로 두고, DayN Retention의 평균값을 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Range Retention
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 기간에 재방문한 user의 비율&lt;/li&gt;
&lt;li&gt;(+) 설명하기 쉬움. Day-to-Day Noise에 자유로움
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가계부 어플리케이션처럼 특정 간격으로 주기적 사용을 하는 부분에 활용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(-) Range가 길어질수록 over-estimate됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rolling Retention(이탈에 초점을 맞춤)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;남은 user를 기준으로 계산&lt;br /&gt;'''&lt;/li&gt;
&lt;li&gt;N day뒤 서비스 사용 기록 있는 사람의 수 / 0일에 처음 서비스를 사용한 사람의 수&lt;br /&gt;'''&lt;/li&gt;
&lt;li&gt;(+) 계산이 쉬움(첫사용, 마지막 사용 날만 있으면 됨)&lt;/li&gt;
&lt;li&gt;(-) 이상치,Noise에 굉장히 취약
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스 사용이 많지 않을 때 활용&lt;br /&gt;(ex. 여행어플)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;약식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Engagement=(DAU/MAU)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;얼마나 Engage되었는지의 지표로 사용&lt;/li&gt;
&lt;li&gt;하지만, DAU/MAU측정이 서비스별로 차이가있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Retention Chart&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://baremetrics-wordpress.imgix.net/20200420140137/behavioral-cohort-table.png&quot; alt=&quot;image&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;21분까지..
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cohort별로 retention이 어떻게 변해가는지 확인하는 차트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex. 일별(cohort)로 기간이 지날수록 어떤 retention을 보이는지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단순 표 뿐만아니라 차트로 표현하는것도 좋은 방법&lt;/li&gt;
&lt;li&gt;Activation * Retention * Revenue로 엮어서 생각&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Retention의 기준
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접속(log-in)이 유일한 기준인지?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클릭이나 여러 대체 지수를 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Retention 개선
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시점을 기준으로 접근
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기 user retention 제어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Activation 프로세스 점검&lt;/li&gt;
&lt;li&gt;새로운 UX 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유지
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고객과의 정기적 커뮤니케이션 플랜&lt;/li&gt;
&lt;li&gt;휴면 고객 복귀 이벤트 등의 액션&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유의점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지표에 매몰되지 말아야함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;푸시/이메일/SMS자주 보내기 -&amp;gt; 일시적 Retention의 향상은 있겠지만 피로관리의 사이드이펙트가 존재&lt;/li&gt;
&lt;li&gt;유저 커뮤니케이션 채널의 일원화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Key Feature 기준 모니터링
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접속이라는 단순한 기준이 아닌 핵심기능 사용 이력, 결제, 방문횟수 등 &lt;b&gt;핵심기준&lt;/b&gt;을 기준으로 모니터링&lt;/li&gt;
&lt;li&gt;당장의 User의 복귀를 바랄것이 아니라, 장기적 관점에서 들어올 이유를 만드는 방법도 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;축적된 가치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;축적 데이터가 많은 경우 당연히 리텐션이 높음&lt;/li&gt;
&lt;li&gt;파이가 작은입장이면 축적 가치를 이동할 수 있도록&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;습관
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저가 app을 습관적으로 들어올 수 있도록 고민&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;etc
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장기적 Retention의 중요성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하지만 현 status를 측정하고, 새로운 실험과 효과확인이 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기간에 따라 유동적으로 변해감
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시기에 따라 코호트 분석을 해야함&lt;/li&gt;
&lt;li&gt;외부요인(ex. 경쟁사 출현 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;카테고리별 권장되는 retention의 수준이 다름
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여행, 쇼핑, 가계부 등등 카테고리별로 차이가 있음&lt;/li&gt;
&lt;li&gt;피로관리가 중요함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AARRR에서 Activation과 함께 가장 우선적으로 개선해야하는 지수&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Revenue : BM의 정의와 제대로 작동하는지에 대한 지표. 매출&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전사적인 관점에서 업무를 해나가야할 필요가 있음&lt;/li&gt;
&lt;li&gt;Revenue 관련 지표
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ARPU (Average Revenue Per User) : Revenue/User
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전반적 상황을 보는데 유용함&lt;/li&gt;
&lt;li&gt;하지만, User와 Revenue의 구분이 어려움&lt;/li&gt;
&lt;li&gt;일반적으로 Monthly기준으로 정의
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex. MAU, ARPDAU,...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ARPPU (Average Revenue Per Paying User) : Revenue/Paying User&lt;/li&gt;
&lt;li&gt;ASP (Average Selling Price) : Revenue/ 판매횟수&lt;/li&gt;
&lt;li&gt;Lifetime Value(유저생애가치) : User의 진입~ 이탈까지 전체활동기간동안 누적 발생되는 기대수익
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$CLV =$ $ (M-c)\over(1-r+i)$ $ - AC$
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;M: 1인당 평균 매출// c: 1인당 평균 비용 // r : 고객 유지 비율 // i: 할인율 // AC : 고객 획득비용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lifetime Value = ARPU / Churn
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Churn : 고객 이탈비율&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만, 현실에서 이러한 계산을하는 경우는 거의 없음&lt;/li&gt;
&lt;li&gt;대안?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LTR (Lifetime Revenue)의 활용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비용의 계산이 어려우니 매출에 계산만을 지수로 활용&lt;/li&gt;
&lt;li&gt;고객의 수는 이탈하는 여부를 판정하지않고 쭉 같은 숫자를 유지&lt;/li&gt;
&lt;li&gt;CAC, LTR, ROAS를 비교하면서 생각&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Revenue의 형태
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아이템별 매출의 합계&lt;/li&gt;
&lt;li&gt;스토어별 매출의 합계&lt;/li&gt;
&lt;li&gt;회원별 매출의 합계&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;li&gt;in 구독 서비스,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MRR(Monthly Recurring Revenue)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Base MRR(전월 MRR) + New MRR - Churn MRR + upgrade/downgrade MRR&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;핵심사용자와 고래
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고래 : 많은 금액을 발생시켜주는 고객&lt;/li&gt;
&lt;li&gt;서비스의 영향력이 크기때문에, Operating 측면과 Revenue측면에서 가장 우선적으로 고려해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RFM 분석
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기준을 정해서 점수로 평가&lt;/li&gt;
&lt;li&gt;Recency : 얼마나 최근에 결제했는지&lt;/li&gt;
&lt;li&gt;Frequency : 얼마나 자주 결제했는지&lt;/li&gt;
&lt;li&gt;Monetary : 얼마나 많은 금액을 결제했는지&lt;/li&gt;
&lt;li&gt;점수의 Total 점수로 Group을 나눠서 User를 Segement
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;User별로 다른 프로모션을 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Referral : Organic 유입의 한 종류. 입소문을 통한 user 확대&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 지표
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Viral Coefficeint
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;User * Invitation rate(초대에 참여한 사람의비율) * Invitation sent per user(초대 시 몇명씩 초대?) * conversion rate(사용 전환율) / User&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;고려사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주기에 대한 고려&lt;/li&gt;
&lt;li&gt;Saturate 수준 고려
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초대받을 수 있는 사람이 한정적이므로 타겟층에 대한 고려가 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;초대받은사람이 핵심가치를 경험했는지, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Viral Coefficient의 기준점은 1&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://upviral.com/wp-content/uploads/2015/08/viral-coefficient-1.png&quot; alt=&quot;Image&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;1을 초과하면 그때부터 엄청난 가속이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Referral 고려사항&lt;br /&gt;1) 제품의 퀄리티
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Viral loop는 좋은 제품이 선행조건&lt;br /&gt;2) Viral channel이 잘 작동하는가 Growth의 필수조건인지에 대해서는 고려해볼 필요가 있음&lt;br /&gt;3) Viral할 수 있도록 맥락의 설계&lt;/li&gt;
&lt;li&gt;추천을 할 이유를 만들어줘야함&lt;br /&gt;4) 초대하는사람과 초대 받는사람의 경험을 나눠서 각각 최적화해야함&lt;br /&gt;5) NUX : New User Experience&lt;/li&gt;
&lt;li&gt;가입과 온보딩 프로세스의 최적화
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특히, 단 한 번 겪는 경험이므로 가장 잘 설계해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Data Analysis/Data</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/38</guid>
      <comments>https://aeda.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 17 Dec 2021 12:08:08 +0900</pubDate>
    </item>
    <item>
      <title>빅분기 시험용 족보(?)</title>
      <link>https://aeda.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내일(12/04) 빅데이터 분석기사 실기 보러 가면서 계속 보려고 작성합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 : (12/24 작성중)합격예정이네요. 2유형은 40점이니 시험에서는 써먹을만 한듯합니다. 외우기 귀찮을때 이정도만 해갑시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Data 전처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명목형 -&amp;gt; Encoding&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치형 -&amp;gt; Scaling&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능하다면 pipeline처리하는걸 선호하지만, 이 시험에서는 사족인것같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Validation data확보 (필수라고 생각합니다 하기 내용 참조)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 모델링 및 Hyper Params setting (추천 모델은 무조건 XG boost)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험에서 필요한정도는 n_estimators랑 max_depth 정도만 건들면 될것같다. 솔직히 depth 3만되면 웬만해서는 고성능 나올게 뻔하니까 분류기만 많이 만들도록해도 될것같다. learning rate써놨던건 사실 lr scheduler 쓸려고 했던건데 굳이 외워야되나라는 생각이 들어가지고 안했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 모델 피팅 및 성능체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의사항 및 개인적인 견해&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0) 작업형은 문제 꼭 끝까지 읽어야한다. &lt;b&gt;문제 예시코드에 주어진 변수명이 있으면 꼭 따라가야한다. &lt;/b&gt;많은분들이 피흘린 포인트로 알고있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 1분이라는 런닝 타임 제한 : One-hot encoding이 아닌 Label Encoding을 써야할것같다. (이론적으로 나는 One-hot이 맞다고 생각한다. &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;예를들어, Label처리하여 1부터 10의 카테고리로 변했는데, 수치의 고저에 따른 선형적 경향성이 발생할 수도 있기 때문이다. 그런데 이건 시험이다. 시간제한이 있으니 Label로 가자&lt;/span&gt;&lt;/b&gt;) categories가 엄청나게 많다고 가정했을때 PCA를 안해주면 모델 학습시간이 아웃될 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 모듈 버전 확인이 필수다. 해당 코드는 3회차를 기준으로 작성해두었다. 예시 사이트 안들어가보고 시험장을 가면 정말로 후회할것이다. 우리가 평소에 무시하던 Warning 이 0점의 원인이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3)&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 뇌피셜이지만, 이 시험에서 무조건적으로 y_test Data는 따로 안줄거다.&lt;/b&gt; &lt;/span&gt;모델이 이상해도 운좋으면 N%이상의 정확도가 나와버릴 수도 있기 때문이다. train data로 Split해서 validation data로 꼭 성능체크하면서 학습시켜야한다. 성능이 안나오면 Crossvalidation 이나 Gridsearch CV등으로 HPO해야되나 생각하겠지만, 성능 안나올수가없을거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) classification으로만 두 번 나온걸로 알고있는데, 다음번 시험에서는 regression이나 Clustering 문제 나올가능성도 충분하다고 생각한다. 대비 버전은 하나씩 가장 최소한의 코드로만 구성해놓기를 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638536246445&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sklearn
import pandas as pd
import numpy as np
import sklearn.preprocessing
import sklearn.ensemble
import sklearn.neural_network
import sklearn.metrics

X_train = pd.read_csv('/content/gdrive/MyDrive/빅분기/[Dataset] 작업형 제2유형/X_train.csv', encoding='euc-kr')
X_test = pd.read_csv('/content/gdrive/MyDrive/빅분기/[Dataset] 작업형 제2유형/X_test.csv', encoding='euc-kr')
y_train = pd.read_csv('/content/gdrive/MyDrive/빅분기/[Dataset] 작업형 제2유형/y_train.csv', encoding='euc-kr')

X_train['gubun'] = 'train'
X_test['gubun'] = 'test'

X = pd.concat([X_train, X_test],ignore_index = True)
# X.isna().sum()
# X.info()
X.fillna(0, inplace = True)

cat_col = ['주구매상품','주구매지점']
useless_col = ['cust_id', 'gubun']
temp_col = [x for x in X.columns if x not in cat_col]
num_col = [x for x in temp_col if x not in useless_col]

OH_Encoder = sklearn.preprocessing.OneHotEncoder(sparse =False)
OH_DF = pd.DataFrame(OH_Encoder.fit_transform(X[cat_col]))
OH_DF.columns = OH_Encoder.get_feature_names(X[cat_col].columns)

NUM_Std = sklearn.preprocessing.StandardScaler()
NUM_DF = pd.DataFrame(NUM_Std.fit_transform(X[num_col]))
NUM_DF.columns = X[num_col].columns

#merge
X_NEW = pd.concat([X[useless_col],NUM_DF,OH_DF],axis=1)


X_NEW
X_train = X_NEW[X_NEW['gubun']=='train']
X_test = X_NEW[X_NEW['gubun']=='test']

del X_train['gubun']
del X_train['cust_id']

del X_test['gubun']
del X_test['cust_id']

del y_train['cust_id']


xx_train, xx_test, yy_train, yy_test = sklearn.model_selection.train_test_split(X_train,y_train, test_size=0.3)
model = sklearn.ensemble.GradientBoostingClassifier(n_estimators=1000, max_depth = 3, learning_rate=0.01)
model.fit(xx_train,yy_train.values.ravel())
print(&quot;train MSE : &quot;,sklearn.metrics.mean_squared_error(model.predict(xx_train), yy_train))
print(&quot;test MSE : &quot;,sklearn.metrics.mean_squared_error(model.predict(xx_test), yy_test))
pd.DataFrame(model.predict(X_test))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Data 처리 및 기타 programming/Python</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/37</guid>
      <comments>https://aeda.tistory.com/37#entry37comment</comments>
      <pubDate>Fri, 3 Dec 2021 21:57:54 +0900</pubDate>
    </item>
    <item>
      <title>Data Analysis -  AARRR(5) Referral</title>
      <link>https://aeda.tistory.com/36</link>
      <description>&lt;h2&gt;5. Referral : Organic 유입의 한 종류. 입소문을 통한 user 확대&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;주요 지표&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Viral Coefficeint&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User * Invitation rate(초대에 참여한 사람의비율) * Invitation sent per user(초대 시 몇명씩 초대?) * conversion rate(사용 전환율) / User&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;고려사항&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;주기에 대한 고려&lt;/li&gt;
&lt;li&gt;Saturate 수준 고려&lt;ul&gt;
&lt;li&gt;초대받을 수 있는 사람이 한정적이므로 타겟층에 대한 고려가 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;초대받은사람이 핵심가치를 경험했는지, ... &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Viral Coefficient의 기준점은 1&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://upviral.com/wp-content/uploads/2015/08/viral-coefficient-1.png&quot; alt=&quot;Image&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1을 초과하면 그때부터 엄청난 가속이 됨&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Referral 고려사항&lt;br&gt;  1) 제품의 퀄리티&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Viral loop는 좋은 제품이 선행조건&lt;br&gt;2) Viral channel이 잘 작동하는가 Growth의 필수조건인지에 대해서는 고려해볼 필요가 있음&lt;br&gt;3) Viral할 수 있도록 맥락의 설계&lt;/li&gt;
&lt;li&gt;추천을 할 이유를 만들어줘야함&lt;br&gt;4) 초대하는사람과 초대 받는사람의 경험을 나눠서 각각 최적화해야함&lt;br&gt;5) NUX : New User Experience&lt;/li&gt;
&lt;li&gt;가입과 온보딩 프로세스의 최적화&lt;ul&gt;
&lt;li&gt;특히, 단 한 번 겪는 경험이므로 가장 잘 설계해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Data Analysis/Data</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/36</guid>
      <comments>https://aeda.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 12 Nov 2021 16:30:45 +0900</pubDate>
    </item>
    <item>
      <title>Data Analysis -  AARRR(4) Revenue</title>
      <link>https://aeda.tistory.com/35</link>
      <description>&lt;h2&gt;4. Revenue : BM의 정의와 제대로 작동하는지에 대한 지표. 매출&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;전사적인 관점에서 업무를 해나가야할 필요가 있음&lt;/li&gt;
&lt;li&gt;Revenue 관련 지표&lt;ul&gt;
&lt;li&gt;ARPU (Average Revenue Per User) : Revenue/User&lt;ul&gt;
&lt;li&gt;전반적 상황을 보는데 유용함&lt;/li&gt;
&lt;li&gt;하지만, User와 Revenue의 구분이 어려움&lt;/li&gt;
&lt;li&gt;일반적으로 Monthly기준으로 정의&lt;ul&gt;
&lt;li&gt;ex. MAU, ARPDAU,...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ARPPU (Average Revenue Per Paying User) : Revenue/Paying User&lt;/li&gt;
&lt;li&gt;ASP (Average Selling Price) : Revenue/ 판매횟수&lt;/li&gt;
&lt;li&gt;Lifetime Value(유저생애가치) : User의 진입~ 이탈까지 전체활동기간동안 누적 발생되는 기대수익&lt;ul&gt;
&lt;li&gt;CLV = (M-c)/(1-r+i) - AC&lt;ul&gt;
&lt;li&gt;M: 1인당 평균 매출// c: 1인당 평균 비용 // r : 고객 유지 비율 // i: 할인율 // AC : 고객 획득비용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lifetime Value = ARPU / Churn&lt;ul&gt;
&lt;li&gt;Churn : 고객 이탈비율&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만, 현실에서 이러한 계산을하는 경우는 거의 없음&lt;/li&gt;
&lt;li&gt;대안?&lt;ul&gt;
&lt;li&gt;LTR (Lifetime Revenue)의 활용&lt;ul&gt;
&lt;li&gt;비용의 계산이 어려우니 매출에 계산만을 지수로 활용&lt;/li&gt;
&lt;li&gt;고객의 수는 이탈하는 여부를 판정하지않고 쭉 같은 숫자를 유지&lt;/li&gt;
&lt;li&gt;CAC, LTR, ROAS를 비교하면서 생각&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Revenue의 형태&lt;ul&gt;
&lt;li&gt;아이템별 매출의 합계&lt;/li&gt;
&lt;li&gt;스토어별 매출의 합계&lt;/li&gt;
&lt;li&gt;회원별 매출의 합계&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;li&gt;in 구독 서비스,&lt;ul&gt;
&lt;li&gt;MRR(Monthly Recurring Revenue)&lt;ul&gt;
&lt;li&gt;Base MRR(전월 MRR) + New MRR - Churn MRR + upgrade/downgrade MRR&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;핵심사용자와 고래&lt;ul&gt;
&lt;li&gt;고래 : 많은 금액을 발생시켜주는 고객&lt;/li&gt;
&lt;li&gt;서비스의 영향력이 크기때문에, Operating 측면과 Revenue측면에서 가장 우선적으로 고려해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RFM 분석&lt;ul&gt;
&lt;li&gt;기준을 정해서 점수로 평가&lt;/li&gt;
&lt;li&gt;Recency : 얼마나 최근에 결제했는지&lt;/li&gt;
&lt;li&gt;Frequency : 얼마나 자주 결제했는지&lt;/li&gt;
&lt;li&gt;Monetary : 얼마나 많은 금액을 결제했는지&lt;/li&gt;
&lt;li&gt;점수의 Total 점수로 Group을 나눠서 User를 Segement&lt;ul&gt;
&lt;li&gt;User별로 다른 프로모션을 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Data Analysis/Data</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/35</guid>
      <comments>https://aeda.tistory.com/35#entry35comment</comments>
      <pubDate>Fri, 12 Nov 2021 16:13:45 +0900</pubDate>
    </item>
    <item>
      <title>Data Analysis -  AARRR(3) Retention</title>
      <link>https://aeda.tistory.com/34</link>
      <description>&lt;h2&gt;3. Retention : Activation 과정에서 A HA Moment를 꾸준히 경험하도록 하는것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;일반적으로 재방문을 기반으로 측정&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;접속을 기준으로 꼭 해야하는지에 대해서는 고민해볼필요 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;개선효과&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;비용대비 효과가 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retention 측정 방법&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Classic Retention(= Day-N Re~)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Day N에 서비스를 사용했는지에 대한 여부만 지표로함&lt;/li&gt;
&lt;li&gt;N 일이 지나고 재방문을 했는가에 대한 Retention&lt;/li&gt;
&lt;li&gt;(+) 계산과 설명이 쉬움&lt;ul&gt;
&lt;li&gt;짧은 주기로 반복적 사용이 중요한 서비스에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(-) Noise에 취약&lt;ul&gt;
&lt;li&gt;Noise를 줄이기 위해서, N의 값을 여러개로 두고, DayN Retention의 평균값을 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Range Retention&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;특정 기간에 재방문한 user의 비율&lt;/li&gt;
&lt;li&gt;(+) 설명하기 쉬움. Day-to-Day Noise에 자유로움&lt;ul&gt;
&lt;li&gt;가계부 어플리케이션처럼 특정 간격으로 주기적 사용을 하는 부분에 활용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(-) Range가 길어질수록 over-estimate됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rolling Retention(이탈에 초점을 맞춤)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;남은 user를 기준으로 계산&lt;br&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/p&gt;
&lt;p&gt;  N day뒤 서비스 사용 기록 있는 사람의 수 / 0일에 처음 서비스를 사용한 사람의 수&lt;br&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(+) 계산이 쉬움(첫사용, 마지막 사용 날만 있으면 됨)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(-) 이상치,Noise에 굉장히 취약&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;서비스 사용이 많지 않을 때 활용&lt;br&gt;(ex. 여행어플)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;약식&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Engagement=(DAU/MAU)&lt;ul&gt;
&lt;li&gt;얼마나 Engage되었는지의 지표로 사용&lt;/li&gt;
&lt;li&gt;하지만, DAU/MAU측정이 서비스별로 차이가있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retention Chart&lt;br&gt;  &lt;img src=&quot;https://baremetrics-wordpress.imgix.net/20200420140137/behavioral-cohort-table.png&quot; alt=&quot;image&quot;&gt;&lt;br&gt;  21분까지..&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cohort별로 retention이 어떻게 변해가는지 확인하는 차트&lt;ul&gt;
&lt;li&gt;ex. 일별(cohort)로 기간이 지날수록 어떤 retention을 보이는지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단순 표 뿐만아니라 차트로 표현하는것도 좋은 방법&lt;/li&gt;
&lt;li&gt;Activation * Retention * Revenue로 엮어서 생각&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retention의 기준&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;접속(log-in)이 유일한 기준인지?&lt;ul&gt;
&lt;li&gt;클릭이나 여러 대체 지수를 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retention 개선&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;시점을 기준으로 접근&lt;ul&gt;
&lt;li&gt;초기 user retention 제어&lt;ul&gt;
&lt;li&gt;Activation 프로세스 점검&lt;/li&gt;
&lt;li&gt;새로운 UX 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유지&lt;ul&gt;
&lt;li&gt;고객과의 정기적 커뮤니케이션 플랜&lt;/li&gt;
&lt;li&gt;휴면 고객 복귀 이벤트 등의 액션&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유의점&lt;ul&gt;
&lt;li&gt;지표에 매몰되지 말아야함&lt;ul&gt;
&lt;li&gt;푸시/이메일/SMS자주 보내기 -&amp;gt; 일시적 Retention의 향상은 있겠지만 피로관리의 사이드이펙트가 존재&lt;/li&gt;
&lt;li&gt;유저 커뮤니케이션 채널의 일원화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Key Feature 기준 모니터링&lt;ul&gt;
&lt;li&gt;접속이라는 단순한 기준이 아닌 핵심기능 사용 이력, 결제, 방문횟수 등 &lt;strong&gt;핵심기준&lt;/strong&gt;을 기준으로 모니터링&lt;/li&gt;
&lt;li&gt;당장의 User의 복귀를 바랄것이 아니라, 장기적 관점에서 들어올 이유를 만드는 방법도 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;축적된 가치&lt;ul&gt;
&lt;li&gt;축적 데이터가 많은 경우 당연히 리텐션이 높음&lt;/li&gt;
&lt;li&gt;파이가 작은입장이면 축적 가치를 이동할 수 있도록&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;습관&lt;ul&gt;
&lt;li&gt;유저가 app을 습관적으로 들어올 수 있도록 고민&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;etc&lt;ul&gt;
&lt;li&gt;장기적 Retention의 중요성&lt;ul&gt;
&lt;li&gt;하지만 현 status를 측정하고, 새로운 실험과 효과확인이 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기간에 따라 유동적으로 변해감&lt;ul&gt;
&lt;li&gt;시기에 따라 코호트 분석을 해야함&lt;/li&gt;
&lt;li&gt;외부요인(ex. 경쟁사 출현 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;카테고리별 권장되는 retention의 수준이 다름&lt;ul&gt;
&lt;li&gt;여행, 쇼핑, 가계부 등등 카테고리별로 차이가 있음&lt;/li&gt;
&lt;li&gt;피로관리가 중요함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AARRR에서 Activation과 함께 가장 우선적으로 개선해야하는 지수&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Data Analysis/Data</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/34</guid>
      <comments>https://aeda.tistory.com/34#entry34comment</comments>
      <pubDate>Fri, 12 Nov 2021 16:04:17 +0900</pubDate>
    </item>
    <item>
      <title>Data Analysis -  AARRR(2) Activation</title>
      <link>https://aeda.tistory.com/33</link>
      <description>&lt;h2&gt;2. Activation : 사용자가 서비스/제품의 핵심가치를 경험했는가&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;사용자 경험의 Funnel에서 각 단계별 전환율(ex.이탈율)을 측정/분석&lt;br&gt;(Download에서 Onboarding의 끝까지)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Funnel 분석의 요소&lt;br&gt;  1) 핵심가치에 대한 Stage의 정의&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  - 사용자의 입장과 회사의 입장을 일치시키는 작업 필요(UX기반)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;  2) Stage별 전환율을 어떤 기준으로 측정하는지&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  - 결제패턴 예시
      - 하나의 제품만을 여러번 보고 결제가 1회 이뤄진 경우
      - 여러 제품을 보고 그 중 일부 결제가 이루어진 경우
      - Conversion Rate를 과연 뭘로해야할까?
          - User기준?
          - View기준?
          - Product기준?
          - **답이 없는 문제임!!**&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;  3) Cohort별로 보는지&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  - Funnel마다의 전환율을 확인하기 위해서, User/Browser/Mobile/세션/event 등을 기준으로 Cohort를 만들어서 분석
      - ex. Mobile vs PC 고객을 따로 분석
      - Event(action)와 시점을 기준으로 cohort를 만드는 경우가 많음&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Funnel 분석의 의의&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stage별 Conversion의 확인&lt;/li&gt;
&lt;li&gt;Conversion과 유관한 선행지표를 발굴할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이탈 원인 분석&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인터뷰&lt;/strong&gt;, 설문, 데이터분석&lt;/li&gt;
&lt;li&gt;Raw Data를 기반으로 Conversion User와 그렇지 않은 User의 분석을 통해 역순으로 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Funnel Summary&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conversion을 통해 Global Optimization이 중요&lt;/li&gt;
&lt;li&gt;Stage를 명확하게 정의해야함&lt;ul&gt;
&lt;li&gt;불필요한 Stage를 통해 지표를 발굴했을때 과연 의의가 있을까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Home Try On : Funnel을 역순으로 진행한 Service들이 존재&lt;ul&gt;
&lt;li&gt;ex&amp;gt; Warby Parker : 안경을 배송하고, 마음에 들면 결제처리 아니면 반송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cohort별 차이가 발생하는 원인을 파악해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Funnel 개선&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개인화 : ML, DL이나 Rule 기반 추천 시스템&lt;/li&gt;
&lt;li&gt;UI/UX : UI의 Redesign을 통해 개선될 수 있는지 검증(ex. AB Test)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사용자 유도&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;다음 Funnel로 이동할 수 있도록 유도 하는것&lt;ul&gt;
&lt;li&gt;ex) 타겟팅을 기반으로한 푸시, 이메일, 인앱 메시지 등등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Data Analysis/Data</category>
      <author>BS Ryu</author>
      <guid isPermaLink="true">https://aeda.tistory.com/33</guid>
      <comments>https://aeda.tistory.com/33#entry33comment</comments>
      <pubDate>Thu, 4 Nov 2021 01:34:24 +0900</pubDate>
    </item>
  </channel>
</rss>