일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 오브젝트
- 클래스
- IoC
- jwt
- 소셜로그인
- 스레드
- 회고록
- class
- Dependency Injection
- 객체지향 프로그래밍
- 항해99장점
- social login
- DI
- 인스턴스화
- process
- 인스턴스
- jvm
- 소셜
- 부트캠프추천
- object
- 프로세스
- bean
- Instance
- 항해99솔직후기
- 객체
- 쓰레드
- 항해99단점
- inversion of control
- API
- Thread
- Today
- Total
로운's 기술노트
[6주차] 프로그래밍 기초 주차 (1/5) 본문
범주형 리서치 데이터..
단순히 데이터가 오브젝트 타입이라고만 생각했는데, 큰 오산이었다.
먼저 전처리부터..하
리서치의 중복값을 허용해서 설문받아 각각의 범주가 매우매우 길다.
* 이게 고작 2개의 범주... > "While Traveling, Workout session, leisure time, Night time, when cooking",
"Office hours, Study Hours, While Traveling, Workout session, leisure time")
해서 만만한 엑셀로 도전하려다 컬럼이 예상보다 많아 생각을 고쳐먹었다.
검색 끝에 One-Hot Encoding라는 게 있어서 그것을 도입하기로 했다. (이게 시작일 줄은 꿈에도 몰랐지..)
* 원핫인코딩(One-Hot Encoding)이란, 주로 연속성이 없는 범주형 데이터에서 사용되는, 카테고리 변수를 머신러닝에서 처리할 수 있는 binary벡터값으로 변환해주는 방법
# 예시)
data = {A : ['빨,노'], B : ['파'], C : ['파,노']}
>> 빨 파 노
A: [1, 0, 1]
B: [0, 1, 0]
C: [0, 1, 1]
# One-Hot Encoding은 원래 쉼표 구분하는 것은아니다.
# 하지만 원래라는게 어디있겠는가,
# 우리 프로젝트에 맞게 쉼표(,) 공백 구분 등 적당히 변형하여 사용하였다.
다음으로 변수간 관계를 확인하기 위해 상관관계를 시도하였으나 처참히 실패..
알아보니 연속성이 없는 범주형 데이터는 단순한 count 값으로 상관관계를 알아보는 것이 무의미하다고 한다.
해서 검색.. 또 검색을 했다.
그렇게 알아낸 것이 '카이제곱 검정'과 '연관 규칙 학습'이다.
학습이라니... 설마..
맞다. 러신머신의 일종이라고 한다.
안배웠지만 별 수 있나, 부딪혀봐야지..
일단 '카이제곱 검정'을 시도하였다.
* 카이제곱 검정 (Chi-square test)이란?
- 카이제곱 검정은 두 범주형 변수 간의 연관성을 확인하는 통계적 방법 중 하나
- 주어진 데이터의 관측값과 기대값 간의 차이를 통계적으로 검정하여 두 변수 간의 독립성을 판단
- 일반적으로는 교차 테이블을 사용하여 빈도를 요약하고, 그 빈도 분포가 예상되는 빈도 분포와 얼마나 다른지를 검정
- 결과 값
. p-value < 0.05 : 두 변수 간에 통계적으로 유의미한 관계가 있다는 증거가 충분하다는 것을 의미.
이 경우, 귀무 가설(두 변수가 독립적이라는 가설)을 기각하고, 대립 가설(두 변수가 독립적이지 않다는 가설)을 채택.
. p-value >= 0.05 : 두 변수 간에 통계적으로 유의미한 관계가 있다는 증거가 부족하다는 것을 의미.
이 경우, 우리는 귀무 가설을 기각할 수 없음. (두 변수가 독립적일 가능성이 높다)
>> from scipy.stats import chi2_contingency
>> data = df
>> contingency_table = pd.crosstab(data['Age'], data['Gender']) # 빈도 테이블 생성
>> chi2, p, dof, expected = chi2_contingency(contingency_table) # 카이제곱 검정 수행
>> print('p-value:', p) # p-value가 0.05 이상 시, 각 변수가 독립적
# 반대로 0.05미만 시, 귀무가설을 기각하고 대립가설 채택
# * 귀무가설: 두 변수가 독립적 / 대립가설 : 두 변수가 독립적x
카이제곱 검정: spotify_subscription_plan vs Gender
p-value: 0.1522314466334885 # '구독' 대 '성별'은 독립적(이외 컬럼은 0.05이상)
생각보다 인사이트가 너무 적다.
어쩔 수 없이 '연관 규칙 학습'을 시도해보았다.
* 연관 규칙 학습(Association Rule Learning)이란?
: 마케팅에서 주로 사용되는 머신러닝의 한 분야로, 주로 데이터베이스에서 항목 간의 연관 관계를 찾기 위해 사용됨. 연관 규칙 학습은 특정 패턴을 찾는 비지도 학습 기법 중 하나로, 주로 거래 데이터와 같은 대규모 데이터셋에서 유용한 정보를 추출하는 데 사용
- 항목 집합(Itemset): 함께 발생하는 항목들의 집합.
e.g 쇼핑몰에서 '우유'와 '빵'이 함께 구매되는 경우가 많다면 {우유, 빵}이 하나의 항목 집합
- 지원도(Support): 특정 항목 집합이 데이터베이스에서 발생하는 빈도. e.g 전체 거래 중에서 {우유, 빵}이 발생한 비율을 의미
- 신뢰도(Confidence): 하나의 항목 집합이 주어졌을 때 다른 항목 집합이 발생할 조건부 확률. e.g 우유를 구매했을 때 빵을 함께 구매할 확률
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
df_encoded = pd.get_dummies(df, columns=df.columns) # 데이터를 원-핫 인코딩 형태로 변환
frequent_itemsets = apriori(df_encoded, min_support=0.01, use_colnames=True) # 지지도가 0.01 이상인 항목 집합을 찾음
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5) # 신뢰도가 0.5 이상인 연관 규칙을 찾음
print(rules)
코랩의 ram이 부족하여 마운트가 강제해제된다...
이게 머신러닝이구나
해결 방법은 총 4가지가 있다.
1. 데이터 크기 감량
2. 임계값 조정(apriori 함수의 min_support 상향 조정)
3. Colab Pro
4. 다른 IDE 사용
당연히 가장 손쉬운 방법은 2번이다.
10배 상향시켜봤다.
/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.
and should_run_async(code)
antecedents \
0 (Age_20-35)
1 (Gender_Female)
2 (Gender_Male)
3 (spotify_usage_period_1 year to 2 years)
4 (spotify_usage_period_6 months to 1 year)
... ...
324898 (pod_lis_frequency_Never, music_time_slot_Night)
324899 (preffered_pod_duration_N, pod_variety_satisfa...
324900 (preffered_pod_duration_N, music_time_slot_Night)
324901 (music_time_slot_Night, preffered_pod_format_N)
324902 (pod_host_preference_N, music_time_slot_Night)
consequents antecedent support \
0 (Gender_Female) 0.811538
1 (Age_20-35) 0.751923
2 (Age_20-35) 0.219231
3 (Age_20-35) 0.271154
4 (Age_20-35) 0.228846
... ... ...
324898 (preferred_listening_content_Music, Age_20-35,... 0.194231
324899 (preferred_listening_content_Music, pod_lis_fr... 0.201923
324900 (preferred_listening_content_Music, pod_lis_fr... 0.186538
324901 (preferred_listening_content_Music, pod_lis_fr... 0.200000
324902 (preferred_listening_content_Music, pod_lis_fr... 0.203846
consequent support support confidence lift leverage \
0 0.751923 0.636538 0.784360 1.043139 0.026324
1 0.811538 0.636538 0.846547 1.043139 0.026324
2 0.811538 0.161538 0.736842 0.907957 -0.016376
3 0.811538 0.211538 0.780142 0.961312 -0.008513
4 0.811538 0.153846 0.672269 0.828388 -0.031871
... ... ... ... ... ...
324898 0.155769 0.101923 0.524752 3.368781 0.071668
324899 0.119231 0.101923 0.504762 4.233487 0.077848
324900 0.140385 0.101923 0.546392 3.892106 0.075736
324901 0.140385 0.101923 0.509615 3.630137 0.073846
324902 0.138462 0.101923 0.500000 3.611111 0.073698
conviction zhangs_metric
0 1.150423 0.219434
1 1.228141 0.166702
2 0.716154 -0.114917
3 0.857196 -0.052328
4 0.575049 -0.211755
... ... ...
324898 1.776402 0.872653
324899 1.778476 0.957036
324900 1.895061 0.913466
324901 1.752941 0.905660
324902 1.723077 0.908213
[324903 rows x 10 columns]
와..
솔직히 결과만 나오면 읽을 수는 있을 줄 알았다
쉽지 않구나 머신러닝..
그렇지만 연관은 인과나 상관관계와 다르기 때문에 해석이 끝이 아니라는게 중요하다..
후, 내일부터 파이썬 챌린지반 머신러닝 개념부터 빡시게 들어봐야겠다.
(그밖에 텍스트마이닝/ 워드 클라우드/ 군집 분석/ 네트워크 분석/ 토픽 모델링 등을 시도해보려 하였지만 처참하게 실패하였다.. 또르르)
'내배캠_데이터분석가_'24.04~08 > 회고' 카테고리의 다른 글
[Chapter 3] 데이터 분석 입문 (7주차_1/3) (0) | 2024.05.29 |
---|---|
[6주차] 프로그래밍 기초 주차 (2/5) (0) | 2024.05.21 |
[5주차] 프로그래밍 기초 주차 (4/4) (0) | 2024.05.17 |
[5주차] 프로그래밍 기초 주차 (3/4) (0) | 2024.05.16 |
[5주차] 프로그래밍 기초 주차 (2/4) (0) | 2024.05.14 |