목록데이터분석 (16)
오랑우탄의 반란
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Ybkja/btsJskNlZF0/Z0mQFrZ0bvLojVO26nJAEk/img.png)
과제 설명 PO의 요청 업무: 실험 결과를 분석할 수 있는 대시보드 작업을 진행해주세요![실험 상황 시나리오]이커머스 K사는 웹사이트의 랜딩 페이지 UI 실험을 진행했습니다.유저를 실험군과 대조군으로 나누어 랜딩 페이지 구 버전 A안과 새 버전 B안을 비교하여 약 1달 동안 실험이 진행 되었어요.실험 결과 데이터는 ab_data.csv 파일에 쌓였습니다.A/B 테스트의 성공 지표를 컬럼 converted(페이지 전환 유무)를 활용하여 두가지 랜딩 페이지 실험 결과를 검증하고 싶습니다. ✅ 실험 진행 기간: 약 1달간(2017/1/2 - 1/24)✅ 실험 대상: 총 약 29만명 랜딩 페이지 유입 유저 → 실험군(약 14만명), 대조군(약 14만명)✅ 실험 목표: 유저의 랜딩 페이지 전환율 상승✅ 성공 지..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/caP3Lk/btsI4YKR2xY/4SoDkkFgrKmWZpR8HBVI9K/img.png)
선형회귀, 로지스틱회귀 외의 대표적인 회귀/분류 모델을 추가적으로 살펴보겠습니다. 의사결정나무 Decision Tree의사결정 규칙을 트리 구조로 나누어 전체 데이터를 n개의 소집다능로 분류하거나 예측을 수행하는 분석법 장점- 쉽고 해석하기 용이- 다중분류, 회귀에 모두 적용 가능- 이상치에 견고하고 데이터 스케일링 불필요 (데이터의 상대적 순위를 고려하기 때문)단점- 과적합 오류: 나무 성장이 너무 많으면 과적합 오류- 불안정성: 훈련데이터에 민감하게 반응해 작은 노이즈에도 나무 구조가 크게 달라짐라이브러리sklearn.tree.DecisionTreeClassifiersklearn.tree.DecisionTreeRegressor namedetails루트노드 root nodeDT 시작점, 1차 분류조..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bqTTAj/btsI3S5boaP/7UuKh2AGFVgerKxRl3vUmK/img.png)
지금까지 배웠던 이론을 바탕으로 실제 데이터분석의 전 과정 실습을 해보겠습니다. 데이터분석 예측모델링 w. 타이타닉 데이터지난 모델링 실습에서 활용했던 타이타닉 데이터로 분석을 진행하겠습니다. Titanic - Machine Learning from Disaster | Kaggle www.kaggle.com 칼럼별 데이터를 체크해둡니다. ColumnDetailsDatatypePassengerId 승객 ID (PK)int64Survived (Y)사망 (0) 생존 (1) int64Pclass 티켓 등급 (1,2,3)int64 (범주형)Name 이름objectSex 성별 object (범주형)Age 나이float64 SibSp 형제와 배우자 수int64 Parch 부모와 자식 수int64 Ticket ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/yaghx/btsIS6DibMD/IiNUnL0JuFQhdTKucNkb80/img.png)
pandas 에서 자주 사용되는 value_counts() 함수에 대해 알아보겠습니다. ParametersSeries.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)Series.value_counts()normalize: 값의 상대적 빈도로 표시sort: count 정렬 여부ascending: 내름차순으로 count 정렬 bins: 연속형 자료를 이산 가격으로 bindropna: NaN 값 미포함 여부 우선 연습을 위한 데이터프레임을 생성해줍니다. data = pd.DataFrame({ 'Name':['Alice','Bob','Charlie','Rachel','James','Pedro','Em..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c8eCjT/btsISLlNDL7/NXubkgVJIwIhLOvCtNfppK/img.png)
기초통계 시리즈의 마지막으로 가설검정의 주의점에 대해 간단하게 짚고 넘어가겠습니다. 재현 가능성, p해킹, 선택적 보고동일 연구나 실험을 반복했을 때 결과가 일관되게 재현이 가능해야 하고, 이는 연구의 신뢰성을 높여줌.하지만 0.05 수준의 p값에 대해 가설검정의 잘못된 사용이 낮은 재현성으로 이어진다는 문제가 발생하고 있다고 함 0.05라는 것은 20번 중에 1번은 귀무가설이 옳을 수 있음에도 이것이 기각될 수 있다는 얘기인데, 이런 오류를 피하기 위해 데이터 모수를 늘리는 방향이 제안됨p해킹이란 p값을 인위적으로 낮추고자 데이터 분석을 반복하거나, 유의미한 결과를 얻기 위해 분석을 반복하는 것결과에 따라 가설을 변경하거나 데이터 개수를 늘려서 결과에 이를 맞추려고 하면 안됨유의미한 결과, 유의미하지..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/0aMcN/btsIUiJjvaN/L3XSKOiqedyl80fFyeZMV0/img.png)
이전 포스트에 이어 몇 가지 상관관계 종류를 살펴보겠습니다. 피어슨 상관계수두 연속형 변수 간의 선형 관계 측정절대값이 1에 가까울수록 높은 상관관계, 0은 선형 관계가 없음을 의미 import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy.stats import pearsonr# 예시 데이터 생성np.random.seed(0)study_hours = np.random.rand(100) * 10exam_scores = 3 * study_hours + np.random.randn(100) * 5# 데이터프레임 생성df = pd.DataFrame({'Study Hours': study_h..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/sa54i/btsIUmSmFOg/7gxFJ6vGnxOtLbd35TvbN1/img.png)
이전 포스트에 이어 기본적인 회귀 종류를 살펴보겠습니다. 단순선형회귀독립변수 x와 종속변수 y 사이의 관계를 직선 형태로 모델링한 방법데이터가 직선적 경향을 따를 때 사용, 간단하고 해석이 용이함 가지고 있지 않는 데이터에 대해 예측할 수 있음 Y = β0 + β1Xex) 광고비x와 매출y의 관계 분석 import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import mean_squared_error, r2_score# 예..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/76FBa/btsITWMWrhI/WESc5wpipD8Bwcu2GznX30/img.png)
이전 포스트에 이어 몇 가지 데이터의 유의성 검정을 살펴보겠습니다. A/B 테스트A/B 두 그룹에 대해 어느 것이 더 효과적인지 확인하려는 검정법독립표본 t검정을 수행해 두 개의 독립된 집단 간 평균 차이가 유의미한지 평가사용자를 그룹으로 나눠 다른 버전으로 테스트해보는 등 마케팅, UX 쪽에서 많이 사용됨 전환율, 클릭률, 구매수, 방문 기간, 방문한 페이지 수, 특정 페이지 방문 여부, 매출 등의 지표를 비교 import numpy as npimport scipy.stats as stats# 가정된 전환율 데이터group_a = np.random.binomial(1, 0.30, 100) # 30% 전환율group_b = np.random.binomial(1, 0.45, 100) # 45% 전환율..