주변 지인이 논문에 사용할 상관분석을 부탁해서 해드렸다. 분석하고자 하는 내용은 다음과 같다.
- 유착치의 위치에 따른 유병률
- 유착치와 치아 결손간의 상관관계
1. Import Libarary & Load DataSet
작업환경은 colab이고 필요한 파일은 구글 드라이브에 업로드하여 사용하였다. 한글 인코딩 값은 cp949를 사용하였으며, 데이터셋은 개인정보 문제로 따로 소개하지 않겠다.
# data handling
import pandas as pd
# p-value
import scipy.stats as stats
url ="/content/dent.csv"
df = pd.read_csv(url, encoding="cp949")
df = df.fillna(0)
2. Data Pre-Processing
2-1) 치아 결손 관련 전처리
원시 데이터에는 치아의 위치만 표기되어 있어서 위치를 개수로 바꾸어주는 작업을 하였다.
for i in range(4,9):
df[df.columns[i]] = df.iloc[:,i].apply(lambda x: 0 if x==0 else x.count('/')+1)
2-2) 유병률 관련 전처리
병의 유무만 판단하기 위해서 병의 개수가 1 이상이면 전부 1로 취급하였다.
df['그 외 치아 형태 이상 or 수이상'] = df['그 외 치아 형태 이상 or 수이상'].apply(lambda x: 1 if x!=0 else 0)
df['동반하는 합병증'] = df['동반하는 합병증'].apply(lambda x: 1 if x!=0 else 0)
2-3) 합계 변수 생성
결손과 유착치의 총 개수에 대한 파생변수를 만들어주었다.
df['유착치_total'] = df[['상악 치아 전체', '하악 제1유구치','하악제2유구치']].sum(axis=1)
df['결손_total'] = df[['계승치 결손', '다른 영구치 결손', '그 외 치아 형태 이상 or 수이상']].sum(axis=1)
3. 분석
3-1) 유착치의 위치에 따른 유병률
- 상관분석
disease_corr = df[['상악 치아 전체', '하악 제1유구치', '하악제2유구치', '유착치_total', '동반하는 합병증']].corr()
disease_corr = disease_corr.loc[['동반하는 합병증'], ['상악 치아 전체', '하악 제1유구치', '하악제2유구치', '유착치_total']]
disease_vis = pd.DataFrame(disease_corr.unstack()[disease_corr.unstack() != 1].sort_values(ascending=False), columns=['corr'])
disease_vis.style.background_gradient(cmap='viridis')
- 유병률
def makeProb(col):
tmp = disease_df[col >= 1]
return tmp['동반하는 합병증'].sum()/len(tmp)
disease_df = df[['상악 치아 전체', '하악 제1유구치', '하악제2유구치', '유착치_total', '동반하는 합병증']]
for col in disease_df:
if col=='동반하는 합병증':
continue
print("{} : {}%".format(col, round(makeProb(df[col])*100, 2)))
상악 치아 전체 : 33.33%
하악 제1유구치 : 18.18%
하악제2유구치 : 44.44%
유착치_total : 29.79%
- 해석
- 상악 치아에 유착치가 있을 경우, 동반하는 합병증이 발생할 확률은 약 33%입니다.
- 하악 제 1유구치에 유착치가 있을 경우, 동반하는 합병증이 발생할 확률은 약 18%입니다.
- 하악 제 2유구치에 유착치가 있을 경우, 동반하는 합병증이 발생할 확률은 약 44%입니다.
- 유착치가 하나라도 존재하는 모든 case에서, 동반하는 합병증이 발생할 확률은 약 30%입니다.
3-2) 치아 결손과의 상관관계 분석
- 상관계수 계산
break_corr = df[['상악 치아 전체', '하악 제1유구치', '하악제2유구치', '유착치_total', '계승치 결손', '다른 영구치 결손', '결손_total']].corr()
break_corr = break_corr.loc[['계승치 결손', '다른 영구치 결손', '결손_total'], ['상악 치아 전체', '하악 제1유구치', '하악제2유구치', '유착치_total']]
break_vis = pd.DataFrame(break_corr.unstack()[break_corr.unstack() != 1].sort_values(ascending=False), columns=['corr'])
- p-value 계산
p_list = []
for row in break_corr.index.tolist():
tmp = []
for col in break_corr.columns.tolist():
tmp.append(stats.pearsonr(df.loc[:,row], df.loc[:,col])[1])
p_list.append(tmp)
tmp_df = pd.DataFrame(p_list, index=['계승치 결손', '다른 영구치 결손', '결손_total'], columns=['상악 치아 전체', '하악 제1유구치', '하악제2유구치', '유착치_total'])
tmp_df = pd.DataFrame(tmp_df.unstack(), columns=['p_value'])
tmp_df
# join 및 출력
break_vis = break_vis.join(tmp_df)
break_vis
- 해석
- 하악 제1,2 유구치에는 치아 결손과의 상관관계가 존재하지 않습니다.
- 상악 치아의 유구치 개수는 다른 영구치의 결손 수, 총 결손 수와 양의 상관관계가 존재하며, 계승치의 결손 수와는 약한 양의 상관관계가 존재합니다.
- 이 때의 p-value는 최대 약 0.008로 유의수준 1% 내에서 유의한 결과입니다.
4. 분석 방법에 대한 기술
4-1) 용어 정의
해당 분석에서 사용한 용어에 대한 정의이다.
- 유착치 : 상악 치아 전체, 하악 제1 유구치, 하악 제2 유구치
- 치아 결손 : 계승치 결손, 다른 영구치 결손
- 병의 유무 : 동반하는 합병증의 유무
- 결손_total : ‘계승치 결손’ + ‘다른 영구치 결손’ + ‘그 외 형태이상 or 수 이상’
- 유착치_total : ‘상악 치아 전체’ + ‘하악 제1 유구치’ + ‘하악 제2 유구치’
4-2) 데이터 전처리
상악 치아 전체 , 하악 제 1 유구치, **하악 제 2 유구치 ** , **계승치 결손 **, 다른 영구치 결손에 해당하는 관측치는 count 값으로 변환하여 분석을 진행하였다. 유병률에서 병은 통반하는 합병증의 유무로 변환하였으며, 1과 0의 값을 가짐.
4-3) 유병률
유병률은 특정 조건을 만족하는 표본에서 통반하는 합병증이 존재하는 case의 비율을 계산
4-4) 상관분석
상관분석은 pearson 상관계수를 사용하였으며, 사용한 기준은 다음과 같다.
0.0 ~ 0.2 | 상관관계 거의 없음 |
---|---|
0.2 ~ 0.4 | 낮은 상관관계 |
0.4 ~ 0.6 | 상관관계가 있음 |
0.6 ~ 0.8 | 강한 상관관계 |
0.8 ~ 1.0 | 매우 강한 상관관계 |
댓글남기기