안녕하세요, 얼마만에 뵙는지 모르겠네요. 막학기 기념(?) 나름의 재정비시간을 즐기고 있습니다. 그래도 언제까지나 쉴 수는 없는 노릇이겠죠. 이제 본격적인 "취준생"이 된 만큼, 포맷을 조금 바꾸고 천천히 걸어나가고자 합니다.
(원래 1월 2째주에 업로드했어야 했는데.. 마무리 하지 못했던 관계로 이제야 올립니다...ㅠㅠ)
1. https://boxnwhis.kr/2015/01/29/a_b_testing.html : A/B 테스팅이란
A/B테스팅: 무작위 비교연구Randomized-Controlled Trial 방법을 인터넷 마케팅에 적용한 것. 무작위로 나눈 두 집단에 대해 A방법 / B방법(하나는 기존 방법, 다른 하나는 비교해보고자 하는 방법)을 시도해 비교 결과를 봄으로써 상관관계로부터 인과관계(일 가능성이 높은 것)를 찾아냄("Correlation does not imply casuation"). 포인트는 하나의 변수'만' 바꾸어 비교하는 것.
- 추가 글: https://boxnwhis.kr/2015/01/29/a_b_testing_online_games.html, 온라인 게임에서의 A/B 테스팅
- https://datarian.io/blog/slide-webinar-nov: 데이터리안 (2022)11월 세미나- '데이터 실험문화의 핵심: A/B테스트' 슬라이드
- 현실적인 문제(대상의 크기와 비용문제), 신기/초두 효과Novelty/Primary Effect, Peeking Problem 등을 고려해야 함
2. (개인)프로젝트 진척상황 공유
- 하나의 파일로 피처 뽑아내고 개략적인 모델 생성, 결과 확인 -> 과적합...
- 전체(100개) 파일로 '뽑아낸 피처들'만' 사용해 모델 생성, 결과 확인' 단계 진행 중 코랩 램이 터져버리는 사태 발생...
- get_dummies 후의 dataframe을 csv로 저장하니 기존에 '중복 컬럼명'으로 인식되던 것이 'teamId.9' 같은 형태가 됨(=중복으로 인식되지 않게 됨) -> .뒤에 숫자가 오는 컬럼들을 따로 구분해야 함
- 정규표현식으로 쉽게 인덱싱 될 지 모르겠음. 시도해 보아야 함.
3. 공부했던 알고리즘들 개념위주 정리
http://www.yes24.com/Product/Goods/96402750 교재의 CH1~CH4 내용을 담고 있습니다.
알고리즘: 문제를 해결하는 논리와 절차. 입력 크기(배열 내 항목 개수)에 대한 기본 연산(입력 크기에 대해 수행하는 것들)의 함수로 효율성을 평가한다. 1이나 logn을 성능이 좋은 알고리즘이라 보고, 뒤로는 n, nlogn, n^2, 2^n순이다.
시간복잡도: 입력 크기에 대한 연산 수행 횟수를 구하는 것. 크게 네 가지 (1)모든 경우 분석(T(n)) (2)최악 경우 분석(W(n)) (3)평균 경우 분석(A(n)) (4)최선 경우 분석(B(n))로 나뉨. 예시로 교환 정렬, 삽입 정렬, 순차 검색이 있다.
- 교환 정렬: 정렬되지 않은 배열을 순차적으로 위치시키는 알고리즘. 아래의 경우 기본 연산은 x[i]와 x[j]의 비교이나 모든 배열의 값들을 비교하기 때문에 모든 경우 분석에 해당. 이 때 시간복잡도는 j-루프 횟수들을 합한 n(n-1)/2
def exchange_sort(x): #교환정렬 알고리즘 예시
for i in range(len(x)-1):
for j in range(i+1, len(x)):
if x[j] < x[i]:
x[i], x[j] = x[j], x[i]
return x
x = [5, 2, 1, 8, 4]
print(exchange_sort(x)) #[1, 2, 4, 5, 8]
- 삽입 정렬: 자료 배열의 모든 요소를 이미 정리된 배열과 비교해 자기 위치를 찾아 정렬하는 알고리즘. 아래의 경우 기본 연산은 X[j]와 key의 비교로 최선 경우, 최악 경우, 평균 경우 분석 모두 가능. 각각의 시간복잡도는 n-1, n(n-1)/2, n^2+n+4/4.
def insert_sort(X): #삽입정렬 알고리즘 예시
for i in range(1, len(X)):
j = i-1
key = X[i]
while X[j] > key and j>=0:
X[j+1] = X[j]
j = j-1
X[j+1] = key
return X
X = [5, 2, 1, 8, 4]
print(insert_sort(X)) #[1, 2, 4, 5, 8]
- 위 경우 (1) i=1일 때 j=0, key=X[1]=2. X[0]>2이고 j>=0이므로 X[1]=X[0], j는 -1이 됨. 이 때 X[-1]은 4이나 j가 0이상이 아니므로 while문을 빠져나오고, 기존의 key였던 2가 X[0]이 됨. X=[2, 5, 1, 8, 4] (2)i=2일 때 j=1, key=X[2]=1. X[1]>1이고 j>=0이므로 X[2]=X[1], j는 0이 됨. X[0]>1이고 j>=0이므로 X[1]=X[0], j가 -1이 되면서 while문을 빠져나오고 기존의 key였던 1이 X[0]이 됨. X=[1, 2, 5, 8, 4]. while문이 핵심('모든 요소'를 비교하는 데 쓰임)
- 순차 검색: 배열에서 특정 항목이 나올 때 까지 순서대로 찾는 알고리즘. 기본 연산은 배열과 특정 값의 비교(==)이고 입력 크기는 배열의 길이(=항목의 개수). 아래의 경우 최선 경우 시간 복잡도는 1(=찾는 값이 배열의 0번째에 있을 경우), 최악 경우 시간 복잡도는 len(arrays), 평균 경우 시간 복잡도는 (n+1)/2.
def linear_search(arrays, x): #순차검색 알고리즘 예시
for i in range(len(arrays)):
if arrays[i] == x:
return i
return -1 #원하는 항목을 찾지 못했을 때 출력
array = [5, 2, 1, 8, 4]
print(linear_search(array, 8)) #3
점근적 표기: 알고리즘의 입력 크기 증가에 따른 실행 시간을 보는 것. 크게 세 가지 (1)Big-O(실행 시간의 상한, 알고리즘의 최악 복잡도) (2)Big-Omega(실행 시간의 하한, 알고리즘의 최선 복잡도) (3)Big-Theta(알고리즘의 평균 복잡도) 표기법이 있다.
- 점근적 상한 / 하한: 알고리즘을 완료하는 데 가장 오래 / 작게 걸리는 시간.
- 점근적 밀한: 평균 복잡도 분석을 위해 사용됨. 알고리즘 실행 시간은 하한보다 길고 상한보다 짧다는 것.
- 수학식으로 풀어 설명한 부분이 있는데, 이 부분들은 잘 모르겠다... 추후 강의 등을 찾아봐야 할 것 같다.
- 알고리즘 복잡성 증가에 따라 알고리즘 완료에 필요한 계산/시간이 증가함 -> 복잡도 증가율을 가능한 한 낮게 유지해야 함. 아래 표는 '차수 증가에 따라 시간 복잡도를 발생시키는 알고리즘 목록'
명칭 | 기호 | | | 명칭 | 기호 |
Constant | O(1) | | | Quadratic | O(n^2) |
Logarithms | O(logn) | | | Polynomial | O(n^c) (c는 상수 & c>1) |
Linear | O(n) | | | Exponential | O(n^m) (m은 상수 & m>1) |
N-LogN | O(nlogn) | | | Factorial of N-power-N | O(n!) 또는 O(n^n) |
리스트: C와 Java의 배열(array)과 유사하며, stack과 queue 구현에 자주 사용되는 자료구조. 특징으로는 (1)구성 요소들의 중복 허용 (2)인덱스를 이용한 참조 가능 (3)항목들에 순서가 있으며 생성, 삭제, 수정 가능 (4) 각 항목의 자료형이 다를 수 있음.
lst = [1, 2, 3, 4, 5]
it = iter(lst) #반복자 반환
print(next(it), next(it)) #1 2
print(list(filter(lambda x:x<3, lst))) #[1, 2] #필터: 조건에 해당하는 값 반환
cop_lst = lst.copy() #리스트 사본 복사(깊은복사)
cop_lst.append(231)
print(cop_lst, lst) #[1, 2, 3, 4, 5, 231] [1, 2, 3, 4, 5]
연결 리스트: 노드가 데이터와 포인터로 연결된 방식으로 데이터 저장. 데이터가 담긴 노드와 노드들을 연결하는 링크로 구성됨. 세부적으로는 헤드, 노드, 값, 링크로 구성.
- 이미지 출처: https://www.onlybook.co.kr/entry/algorithm-interview
- 연결 리스트 클래스에서 구현 가능한 기본 연산들: 요소 삽입, 항목 출력, 요소 검색, 요소 삭제, 반전(reverse, 순서 뒤집기)
- 클래스로 정의한 뒤 메서드 호출, 자료 구조로 사용하는 것이 편리.
class Node:
def __init__(self, data=None, link=None):
self.data = data
self.link = link
def updateData(self, data): #데이터필드 갱신
self.data = data
def setLink(self, node): #링크필드 설정
self.link = node
def getData(self): #데이터필드 반환
return self.data
def getNextNode(self): #다음 노드주소 반환
return self.link
- 위 코드는 하나의 '노드'를 설정, 반환하는 코드. 노드들로 구성된 연결 리스트를 만들어 사용하는 것이 일반적.
- 일반 리스트와 달리 메모리 사용량이 적단 것이 장점이라는 데.. 어렵게 다가오긴 한다.
스택: Last In First Out에 따라 추가/삭제되는 객체들의 컨테이너. 데이터 추가/삭제가 데이터 윗부분에서만 일어나는 자료구조(데이터를 말 그대로 stack한다고 봄). `push()`와 `pop()` 메서드 제공. 리스트로 구현 시 append와 pop으로 사용 가능
큐: First In First Out에 따라 추가/삭제되는 객체들의 컨테이너. 데이터 추가/삭제가 데이터 앞부분에서만 일어나는 자료구조. `enqueue()`와 `dequeue()` 메서드 제공. 리스트로 구현 시 insert(0, x), pop으로 사용 가능.
- 환형 큐: 고정 크기의 큐를 양 끝이 연결된 것처럼 사용할 수 있게 하는 것.
class Queue: #큐 구현 클래스 예시
def __init__(self):
self.queue = list() #초기화
def enqueue(self, data):
if data not in self.queue:
self.queue.insert(0, data) #0번째 위치에 data삽입
return self.queue
def dequeue(self):
if len(self.queue) > 0:
self.queue.pop() #(리스트)뒤에 있는 요소 제거
return self.queue
myqueue = Queue()
print(myqueue.enqueue(10)) #[10]
print(myqueue.enqueue("Hi")) #['Hi', 10]
print(myqueue.dequeue()) #['Hi']
4-1. https://yozm.wishket.com/magazine/detail/1770/ : MVP 방법
Minimal Viable Product: '최소한의 기능'만 지원하는 제품. `idea -> prototype -> MVP -> product`. 제품이나 서비스의 핵심 가설을 먼저 테스트하는 것이 좋다.
- 린 스타트업 기반이라 그런지 디자인 씽킹, 프로토타이핑과 맞닿아 있는 부분이 많은 것 같다. 특히 글의 소제 중 하나인 '빠르게 시도하고, 빠르게 실패를 인정하라'는 부분이 더더욱.
4-2. https://yozm.wishket.com/magazine/detail/1829/ : 데이터의 상관관계와 인과관계
상관관계: 두 변수가 얼마나 상호의존적인가를 보는 것(하나가 증가하면 다른 하나가 증가/감소하는가?)
인과관계: 하나의 변수가 다른 변수의 원인으로 작용하는 것. 원인과 결과가 명확함(ex. 심한 일교차 -> 감기 유행)
- 역인과관계의 오류: Reverse Causality. 상관관계를 근거로 실제 인과와 반대의 관계를 주장할 때 발생.
- 상관관계가 항상 인과관계를 의미하지는 않지만, 인과관계는 항상 상관관계에 포함된다. 그렇기에 상관관계(들)소에서 명확한 인과관계를 찾아낼 수 있어야 한다.
5. (제이림)프로젝트 진척상황 공유
- 데이터 스키마 파일과 데이터 소스 파일 크게 두 가지를 받았음. 스키마 파일은 url ID에 따른 (가변적인)컬럼 명들이 서술되어 있고, 데이터 소스 파일은 말 그대로 하루치의 로그 데이터 존재. (데이터 소스 파일의)컬럼이 url ID에 따라 의미하는 바가 달라지므로 url ID 값을 기준으로 df를 나누어 보았음
- 그리고 (데이터 소스 파일)user ID의 value_counts()로 어느 유저가 어플 내에 로그를 많이 남겼는지 보고, 빈도가 가장 높은 세 유저가 사용했던 서비스 명들을 확인해 봄
- 멘토님의 설명에 따르면 스키마 파일, 소스 파일, 컬럼 정의 파일(맞나?) 총 세 개의 파일을 병합해야 한 눈에 무엇이 무엇인 지 알 수 있을거라 하셨지..만 세 번째 회의가 진행된 1월 17일까지 파일을 못받았던 결과.. ^-^ 별다른 분석 결과를 도출하지는 못했다. 멘토님의 공백 만큼 프로젝트 원들과 다른 사이드 프로젝트를 진행해 볼 예정이다.
- 1월 18일 낮 즈음 나머지 하나의 파일을 받았고, 조인시켜 한 눈에 볼 수 있도록 만든 뒤 값들을 다시 살펴보아야 할 듯.
- 근데 그 "나머지 하나의 파일"이 어떻게 되어있든 간에.. url ID에 따라 df를 나누어 보는 게 더 효율적이지 않나? 아니 궁금한 건 유저니까 유저ID에 따라 무엇을 본 유저가 >상품<에 관심이 있을 >확률<이 높은지를 보는 게 좋은가? 모르겠다...
- Market + ing. 시장에 브랜드와 제품을 알리는 것.
- BM(Brand Manager): 브랜드 담당 및 총괄, PM(Product Manager): 제품이나 라인 중심 담당, 서비스 기획자:서비스 개발 및 관리, AE(Account Executive): 기획 및 커뮤니케이션, AP(Account Planner): 프로젝트 전략 계획 수립 등
- 종합 대행사(전체 프로젝트), 디지털 대행사(디지털 영역에서의 프로젝트), 소셜 미디어 대행사(SNS 영역에서의 커뮤니케이션), PR 대행사(다양한 채널에서의 '홍보'), 미디어 렙사(광고 집행 관리), 퍼포먼스 대행사(광고 효율 관리)
- 사전 마케팅(cgv에 공연 실황 개봉, 팝업스토어), 공연 행사(커튼콜 댄스타임, 로비쇼), 브랜드 콜라보(시너지)
- 씨뮤의 킹키부츠 영상을 보며 대리만족 하던 사람으로써... 취업하면 꼭... n회차 뜁니다...
폼을 정리하자면 1."데이터 분석"쪽 지식(데이터리안, 개인 블로그 등) 2.(개인)프로젝트 3.알고리즘 공부 4."it"쪽 지식(요즘it, 일분톡 등) 5.(제이림)프로젝트 6."콘텐츠", "마케팅"쪽 지식(고구마팜, 캐릿, 어거스트, 등)이고 순서나 내용은 조금씩 추가/삭제/변경 될 수 있을 것 같습니다. 어쨌든 필요한 공부들을 총체적으로 묶어 게시할 예정이에요. 영어나 자소서, 면접 관련 내용도 생겨날 수 있을 것 같긴 합니다. 하튼 열심히 할게요..!
'STUDY' 카테고리의 다른 글
취준로그 ver0.3 (6) | 2023.02.01 |
---|---|
취준로그 ver0.2 (3) | 2023.01.26 |
파이썬 스터디 ver3. 17주차 (2) | 2022.11.23 |
파이썬 스터디 ver3. 16주차 (3) | 2022.11.16 |
파이썬 스터디 ver3. 15주차 (2) | 2022.10.29 |