코드스테이츠 AI 부트캠프 2기의 첫번째 달이 끝났다. 원래는 매주 배운 것을 복습하고 블로그를 작성하려고 마음은 먹었었지만.. 마음만 먹었던 것으로.. 오늘은 section review 시간이다.
한 달 동안 뭘 배웠는지 아이패드로 스윽스윽 복습을 해봤다. 이렇게 적어보니 정말 많은 개념을 배웠다. 이래서 부트캠프라고 하는구나..
Sprint 1 : Data preprocessing and EDA
Setion1에서는 가장 먼저 판다스를 이용한 전처리 및 EDA를 배웠다. 가장 기본적이면서 가장 많이 사용하는 것들이다.
<pandas>
read_csv/df.shape/df.describe()/df.columns/df.index/df.isna()..
csv파일을 불러오고, 데이터가 어떤 형태인지 알아보고 가장 기본적 통계내용을 확인하고, 결측치를 확인하는 등 데이터를 받으면 가장 먼저 해야하는 것들은 모두 판다스 라이브러리를 통해 할 수 있다.
이번에 프로젝트를 하면서도 많이 느꼈다. 무엇보다 많이 하는 것이라는 걸..
eda를 할 때 원하는 형태로 데이터프레임을 재구성해야할 때도 많이 있는데 그 때 정말 많이 사용한 것이pivot_table, groupby().agg(), filtering(df[df['x']=='y'] 이런 식으로) , sort_values(by='', asceding=False), melt등이었다. 프로젝트 할 때 너무 많이 해서 이제는 기계적으로 할 수 있을 듯.
반복해서 수행해야 할 작업이 있을 때는 def를 이용해서 함수를 만들고 apply를 통해 한꺼번에 적용시켜줄 수 있다. 아직은 잘 사용할 줄 모르지만 apply(lambda x: func(x))이런 방법도 있다고 한다. lambda 함수를 좀 더 공부해야 할 듯.
<feature engineering>
기존 데이터에서 원하는 feature가 없을 때 내가 기존의 feature를 조합해서 새로운 것을 만들 수 있다. 예를 들어 기존 데이터의 총합, 평균, category 등을 만들수도 있고. 온도와 풍속 데이터가 있다면 체감온도와 같은 새로운 feature를 만들 수도 있다. 이번 프로젝트를 할 때도 5가지의 feature를 새로 추가하였고 유용했다.
<visualization>
프로젝트를 하면서 가장 많이 한 것이 시각화였다. 내가 분석하고자 하는 데이터를 시각화하여 인사이트를 얻을 수도 있고 그 인사이트를 강조할 수도 있다. 특히 데이터 분석을 발표해야 할 때 청중들에게 데이터 분석 결과를 직관적으로 전달할 수도 있기 때문에 매우 중요하다.
하지만 시각화 너무 어렵다.. 다양한 종류의 그래프가 있지만 이번에 프로젝트에서는 거의 막대 그래프 밖에 사용하지 못했다.
시각화의 종류에는 scatterplot / boxplot / violinplot / barplot / lineplot / heatmap 등등 많이 있는데,
어떤 종류의 그래프를 사용해야 할까?
결정하기 위해서는 시각화의 목적과 데이터의 형태 등을 잘 고려해야 한다.
그래프를 결정한 이후에는 aesthetic을 잘 써야 효과적으로 정보를 전달할 수 있다. 특히 색을 잘 써야하는데 이번 프로젝트를 할 때 10개 이상의 값이 있는데 모든 값에 각각 색을 부여해줬더니 너무 정신이 없었다. 아래 그림에서 x 표를 친 게 내가 한 방식이고 오른쪽처럼 하는 게 좋은 시각화라는 것.. (이 블로그,, 이거 어떻게 하는지 코드도 써줬으면 좋았을텐데 ㅠㅠ)
시각화에서는 matplotlib과 seaborn을 많이 사용한다. seaborn이 좀 더 간편하지만 커스터마이징을 하려면 matplotlib을 잘 사용해야 한다. 너무 많은 함수와 파라미터가 있어서 시각화를 하다보면 항상 괴로움이 빠진다.. 시각화도 연습을 많이 해야겠다.
Sprint 2 : Statistics
두번째 주는 통계학에 대해 배웠다. 대학원에서 공부할 때는 항상 질적 방법론을 이용한 연구를 했고, 양적 방법론으로 쓰여진 논문을 읽을 때는 그냥 p-value가 중요하다, 별이 떴는지 안 떴는지를 봐라 정도만 알면 됐다. 결국 저자가 뭐가 중요한지 글에서 다 설명해주니까. 하아, 그 때 왜 그랬을까? 학교에서 교수님들이 가르쳐줄 때 열심히 배울걸.. 수업 들을걸..
당연히 겨우 일주일 공부한 것으로 통계학을 다 이해할 수 없다. 이번에 배운 것들은 아주 아주 기초적인 것이고 이것들을 기반으로 계속 더 공부해 나가야지. 두번째 주에는 주로 통계 검정 방법에 대해 배웠다.
<t-test>
- 1개 혹은 2개 sample의 평균을 비교할 때 사용한다.
- 연속형 변수이며 독립성, 등분산성, 정규성을 만족시키는 변수여야 한다.
예를 들어 '서울시 평균 아파트 값은 10억이다.'라는 가설 혹은 '서울시 평균 아파트 값이 경기도 평균 아파트 값보다 비싸다.' 등의 가설을 검정할 때 쓰이는 것이다. scipy libaray에서 stats.ttest_1samp(샘플 1개) 혹은 ttest_ind(샘플 2개)를 사용한다.
검정할 때는 귀무가설과 대립가설을 설정해야하는데 One sample일 경우 귀무가설은 모평균은 표본평균과 같다 / 대립가설은 모평균과 표본평균은 다르다 라고 설정한다.
위의 예를 통해 본다면,
H0(귀무가설) : 서울시 평균 아파트 값은 10억이다.
H1(대립가설) : 서울시 평균 아파트 값은 10억이 아니다.
t검정을 한 결과 p-value가 먼저 설정한 alpha(신뢰도가 95%라면 0.05)보다 작으면 귀무가설을 기각하고 대립가설을 채택한다.
two sample일 경우
H0(귀무가설) : 서울시 평균 아파트 값과 경기도의 평균 아파트 값은 같다.
H1(대립가설) : 서울시 평균 아파트 값과 경기도의 평균 아파트 값은 다르다 (혹은 비싸다, 저렴하다 등)
이 때도 마찬가지로 p-value가 alpha 값보다 작으면 귀무가설을 기각하고 대립가설을 채택한다.
크기 비교의 경우는 one tailed or one side test라고 하는데 ttest_ind의 파라미터 중 alternative에서 설정해줄 수 있다. 이것도 모르고 얼마나 헤맸던지 흑흑...
<chi-square test>
범주형 변수의 분산을 검정할 때 사용한다. categorical -> 셀 수 있어야 한다.
chi square 검증도 one sample test, two sample test가 있다. one sample은 한 변수 내 값의 분산이 같은지 아닌지 검정하고 two sample일 때는 두 변수의 연관성을 검정한다. scipy의 stats.chisquare / chi2_contingency를 이용한다.
예를 들어 서울시 내 모든 구의 인구수를 비교한다고 생각해보자.
H0: 모든 구의 인구수는 같을 것이다. 즉, 서울시의 인구는 고르게 분산되어 있을 것이다.
H1 : 모든 구의 인구수는 다를 것이다.
검정 결과에 나온 p-value를 보고 대립가설 채택여부를 결정한다.
인구수에 영향을 미치는 변수를 예를 들어 초중고의 수라고 치면 인구수를 카테고리로 변환해서 검정할 수 있다.
H0: 인구 수와 초중고의 수의 독립적이다.(independent)
H1 : 인구 수와 초중고의 수는 연관이 있다.(dependent)
검정 결과에 나온 p-value를 보고 대립가설 채택여부를 결정한다.
<ANOVA>
3개 이상의 sample의 분산을 검정한다(라고 이해했다). ttest의 경우 2개까만 되는데 아노바는 3개 이상의 그룹의 분산을 검정할 수 있으니까 3개 그룹의 서로 같은 애들인지, 다른 애들인지, 차이가 있는지 없는지, 유의미한지 등등을 검정할 수 있다. f 통계량을 이용한다. scipy.stats.f_oneway를 이용하면 된다. 사실 대충은 알겠는지 좀 어렵다. 더 공부해야지.
<CI and p-value>
모든 통계 검정에서 생각해야 하는 개념이다. CI는 신뢰구간인데 보통 90%, 95%, 99%를 사용한다. 신뢰구간이 크다면 가설이 맞을 확률은 높아지지만 너무 크면 의미가 없을 수 있다. 초등학생의 키의 평균이 1cm에서 180cm 사이에 있다고 가설을 세운다면 가설이 맞을 확률은 높아지지만 사실 아무것도 설명할 수 없는 것과 마찬가지다. 적절해야하는데 보통은 95%를 사용한다. p-value는 귀무가설이 우연히 맞을 확률인데 우연히 맞을 확률이 작을수록 대립 가설이 맞을 확률이 커진다(라고 이해했다). p-value는 1과 0 사이의 값을 가지는데 신뢰구간 95%에서 alpha값은 0.05로 p-value가 0.05보다 작으면 귀무가설을 기각하고 대립가설을 채택한다. (뭔가 깊이 들어가서 이해하려면 좀 이해가 안 되는 느낌이 들지만 결국 중요한 것은 p-value가 alpha값보다 작으면 대립가설을 채택한다는 거...)
인터넷이 보면 종속변수/독립변수의 종류와 개수에 따라 통계검정방법을 선택하는 알고리즘? 표? 그림?이 있다. sprint2에 있는 과제를 할 때 잘 썼다. 여기에 보면 있다.(m.blog.naver.com/PostView.nhn?blogId=y4769&logNo=220034694579&proxyReferer=https:%2F%2Fwww.google.com%2F)
Sprint3 : Linear Algebra
통계도 힘들었지만 선형대수는 더 어려웠다. 과제를 하는 게 어렵진 않았는데 개념을 이해하는 게 좀 힘들었다. 선형대수를 설명하는 블로그와 유튜브 영상을 보면 공간에서 벡터와 벡터의 이동, 변환 등을 설명하는데 머리 속에서 그 개념이 쉽게 그려지지 않았다. 흑흑. 통계학과 마찬가지지만 선형대수도 일주일만에 마스터할 수 있는 게 아니니 계속 공부하자.
<vector / matrix>
vector는 데이터를 나타내는 유용한 방식이라고 이해했다. 벡터가 여러개 모이면 매트릭스.....행렬... 벡터의 길이는 norm 벡터의 크기를 나타낸다. 벡터 길이가 1이면 단위 벡터라고 하고 모든 벡터는 단위벡터로 나타낼 수 있다. -> 근데 이게 왜 중요한지?? 아직 이해가 잘 안 된다. - 내적(dot product) : 벡터a와 벡터b의 내적은 두 벡터의 곱을 합한 것. 내적이 0이면 직교 관계. 직교 관계의 벡터는 서로 상관이 없다. 공분산이 0이다.
- 행렬식(determinant) / 역행렬(inverse matrix) : 역행렬은 행렬에 곱했을 때 단위 행렬(identity matrix)이 되는 행렬. 모든 행렬이 역행렬을 갖는 것은 아니다. 행렬식이 0인 경우에는 역행렬이 없다. 이 경우는 행렬 내의 벡터가 선형종속 관계이다. 선형 종속 관계의 벡터는 같은 선 안에 존재하는 것이기 때문에 이들이 span할 수 있는 공간은 1, 따라서 rank도 1이다.
- basis/span/rank : 선형 독립인 벡터 - 기저 벡터(basis) / 기저 벡터는 그 수만큼의 공간을 span할 수 있다. / 그리고 그 공간은 기저 벡터 수만큼의 차원을 가진다. 이 때 공간이 가지는 차원을 rank라고 한다.(고 이해했다.)
<공분산, 상관계수>
- 분산은 한 변수 내의 관측치들이 떨어져 있는 정도. 표준 편차는 그것들을 scaling한 값.
- 공분산은 두 변수가 어떻게 분포되어있는지? -> 두 변수의 상관성을 볼 수 있음.
공분산 >0 : 양의 상관관계 공분산 =0 상관관계 없음 공분산<0이면 음의 상관관계
- 상관계수는 공분산을 scaling한 값. -1과 1 사이의 값을 가지며 값이 음수이면 두 변수은 음의 상관관계, 값이 양수이면 두 변수는 양의 상관관계를 가진다. 상관계수의 절대값이 1에 가까울수록 두 변수는 관계는 선형에 가까워진다. -> 매우 상관이 있다.
<고유벡터, 고유값, 주성분분석>
- 어떤 행렬 A에 곱했을 때 위치가 변하지 않는 벡터가 고유벡터이고 그 값이 고유값..이라고 이해했다. 그러니까 그 행렬 A에 고유벡터를 곱하면 선 안에서의 변화는 있지만 완전 다른 선형으로 변하지 않는다... 길이만 변하고 위치가 변하지 않는다고 이해했다.
(이거 이해하려고 새벽까지 머리를 싸매고 고민하다가 잠들었는데 그 날 악몽을 꿨다. 여고추리반과 합쳐져서,,,, 폭탄을 제거해야하는데 고유벡터값을 계산해야했다...ㅋㅋㅋ 이게 뭐야 너무 스트레스 받아)
- 여튼 고유벡터와 고유값을 배운 이유는 주성분분석을 위해서였다. Feature가 너무 많으면 다차원 상에서 그 feature들의 상관관계를 파악해야 하는데 이건 너무 힘든일이다. 그래서 다차원을 2차원으로 축소하는 차원축소가 필요하다. 이 때 사용되는 게 주성분 분석이다. 다차원 feature를 2차원의 선형관계로 축소하는 것이다. 주성분 분석을 하는 과정에서 고유벡터과 고유값이 사용된다. 하지만 그 구체적인 과정을 모두 이해하진 못했다.
- 주성분 분석은 pc1, pc2, pc3.. 이런 식으로 나오는데 몇 개의 주성분을 사용할지는 scree plot을 통해 결정할 수 있다. 몇 개의 주성분을 사용했을 때 어느 정도의 분산을 설명할 수 있는지?를 그래프로 나타낸 것인데 누적설명력이 70-80%면 무난하다고 한다.
<K-Means Clustering>
어떤 데이터가 주어졌는데 라벨이 붙어 있지 않아! 그룹을 나누고 싶어!라고 할 때 사용하는 방법이라고 생각했다. 예를 들어 penguine 데이터가 주어졌는데 부리의 길이 날개의 길이 등만 있고 어떤 종인지 없다면? 주어진 데이터를 이용해 펭귄의 종류를 나누는 방법이다. 이런 것을 비지도학습(unsupervised learning)라고 한다. 비지도학습에는 뭐 다양한 방법이 있는데 계층적 방법도 있고 비계층적 방법도 있다. k-means clustering은 비계층적 방법이다.
- 일단 몇 개의 집단으로 나눌지 결정한다. K를 결정하는 방법으로 elbow method이 있다. 해당 데이터를 몇 개의 그룹으로 나눌 때 그룹 내 오차제곱합이 적어지는지 그래프로 그린 것이다. 그룹의 수가 어느 수준 이상이 되면 오차제곱합의 크기가 별로 달라지지 않는데 그 그래프의 모양이 구부린 팔 같다. 그리고 팔꿈치 쪽, 즉 오차제곱합이 가장 적어지고 그 이후로는 비슷해지는 부분을 최적의 k로 본다는 말이다.
- 그리고 k개의 중심점을 중심으로 주변 데이터와의 거리를 계산해서 그룹을 할당한다.
- 유의미한 변화가 없을 때까지 2-3번 정도 반복하면 결과가 나온다.
일단 scatter plot을 그려보면 몇 개의 그룹으로 나뉘겠구나 감이 온다. 그리고 팔꿈치를 찾아서 k를 할당하고 sklearn.cluster 라이브러리에서 KMeans을 가져와서 하면 된다.
section1의 리뷰를 했다. 이렇게 하는 게 맞는지는 모르겠다. 엄청나게 길어졌다. 이번 달에는 좀 더 자주 블로그를 써야할 것 같다. 그래서 마지막에는 정말 모르는 것만 정리할 수 있도록..
통계학과 선형대수의 개념을 이해하는데 어려움이 많았지만 그것들을 파이썬으로 구현하는 과제는 어렵지 않게 했다. 하지만 응용력을 높이기 위해서는 이번달에 배운 개념을 더 공부하고 이해해야겠지? 프로젝트를 하면서 느낀건데, 뭘 어떻게 써야할지 모르겠다. 다른 동기분들이 베이지안 추론을 사용한 거 보고 정말 존경심이 들었다.
section2도 화이팅
'코드스테이츠 AI 부트캠프' 카테고리의 다른 글
OOP 정리 (0) | 2021.07.12 |
---|---|
keras_segmentation 튜토리얼 따라하기 (0) | 2021.07.06 |