[DACON] 심리 성향 예측 AI 경진대회

[DACON] 심리 성향 예측 AI 경진대회

https://dacon.io/competitions/official/235647/overview/

데이콘에서 종료한 대회의 데이터와 코드를 참고해 알고리즘 제작을 실습해보려 한다. 처음으로 풀 문제는 올해 11월 종료한 심리성향 예측 AI 경진대회 이다.

Overview

테스트 참가자의 국가 선거 투표 여부를 예측한다.

  • 사용 가능 언어 : Python, R
  • 심사기준 : AUC
  • 외부 데이터 사용불가, pre-trained Model 사용불가

데이터 분석

학습해야할 데이터 파일의 구성은 아래와 같다.

  1. 하나의 행이 한 참가자의 정보를 담고 있다. 최종적으로 예측해야 하는 값은 해당 참가자의 voted : 지난해 국가 선거 투표여부 이다.
  2. a~t 까지의 20개의 질문에 대한 답 QnA와 답변에 걸린 시간 QnE 가 주어진다.
    • 답변은 1=Disagree, 2=Slightly disagree, 3=Neutral, 4=Slightly agree, 5=Agree 로 주어진다.
  3. 스스로의 성격에 대한 평가 질문 7개에 대한 답이 주어진다.
    • I see myself as (Extraverted / Critical / Dependable… )
  4. 실존하는 단어 13개에 대한 정의를 아는지 여부에 대한 답변이 1=Yes, 2=No로 주어진다 : wr_(01~13)
  5. 허구하는 단어 3개에 대한 정의를 아는지 여부에 대한 답변이 1=Yes, 2=No로 주어진다 : wt_(01~03)
  6. 기타 해당 참가자에 대한 정보(연령, 교육수준, 모국어, 형제자매 등)가 주어진다.

데이터 전처리

[ 구글 드라이브 마운트해서 파일 받아오기 ]

구글 드라이브에 샘플 csv파일을 올려두고, 데이터 처리를 위해 해당 파일들을 불러온다.

1
2
3
4
5
6
7
# 구글 드라이브에 올려둔 학습데이터 가져온다
from google.colab import drive
drive.mount('/drive', force_remount=True)

# 파일 받아온다
train_filename = '/drive/My Drive/DACON/MindType/train.csv'
test_filename = '/drive/My Drive/DACON/MindType/test_x.csv'
  • 개인 구글 드라이브 하위에 /DACON/MindType 폴더를 만들어두고 학습 데이터들을 올려두었다.
  • 드라이브를 마운트하고 파일을 받아온다.

[ csv 파일 읽어와 학습변수로 설정하기 ]

csv 파일 읽어오기

1
2
3
4
5
# csv파일 읽어들인다
import pandas as pd
train_raw = pd.read_csv(train_filename)

print(train_raw.columns)
1
2
3
4
5
6
7
8
9
10
Index(['index', 'QaA', 'QaE', 'QbA', 'QbE', 'QcA', 'QcE', 'QdA', 'QdE', 'QeA',
'QeE', 'QfA', 'QfE', 'QgA', 'QgE', 'QhA', 'QhE', 'QiA', 'QiE', 'QjA',
'QjE', 'QkA', 'QkE', 'QlA', 'QlE', 'QmA', 'QmE', 'QnA', 'QnE', 'QoA',
'QoE', 'QpA', 'QpE', 'QqA', 'QqE', 'QrA', 'QrE', 'QsA', 'QsE', 'QtA',
'QtE', 'age_group', 'education', 'engnat', 'familysize', 'gender',
'hand', 'married', 'race', 'religion', 'tp01', 'tp02', 'tp03', 'tp04',
'tp05', 'tp06', 'tp07', 'tp08', 'tp09', 'tp10', 'urban', 'voted',
'wf_01', 'wf_02', 'wf_03', 'wr_01', 'wr_02', 'wr_03', 'wr_04', 'wr_05',
'wr_06', 'wr_07', 'wr_08', 'wr_09', 'wr_10', 'wr_11', 'wr_12', 'wr_13'],
dtype='object')
  • 파이썬의 pandas 라이브러리를 활용해 csv 파일을 불러온다 : pandas.read_csv() 사용
  • csv파일 변수의 .columns 로 추출된 컬럼을 확인할 수 있다.

index column 설정하기

1
2
3
4
5
# csv파일 읽어들인다
import pandas as pd
train_raw = pd.read_csv(train_filename, index_col=0)

print(train_raw.columns)
1
2
3
4
5
6
7
8
9
10
Index(['QaA', 'QaE', 'QbA', 'QbE', 'QcA', 'QcE', 'QdA', 'QdE', 'QeA', 'QeE',
'QfA', 'QfE', 'QgA', 'QgE', 'QhA', 'QhE', 'QiA', 'QiE', 'QjA', 'QjE',
'QkA', 'QkE', 'QlA', 'QlE', 'QmA', 'QmE', 'QnA', 'QnE', 'QoA', 'QoE',
'QpA', 'QpE', 'QqA', 'QqE', 'QrA', 'QrE', 'QsA', 'QsE', 'QtA', 'QtE',
'age_group', 'education', 'engnat', 'familysize', 'gender', 'hand',
'married', 'race', 'religion', 'tp01', 'tp02', 'tp03', 'tp04', 'tp05',
'tp06', 'tp07', 'tp08', 'tp09', 'tp10', 'urban', 'voted', 'wf_01',
'wf_02', 'wf_03', 'wr_01', 'wr_02', 'wr_03', 'wr_04', 'wr_05', 'wr_06',
'wr_07', 'wr_08', 'wr_09', 'wr_10', 'wr_11', 'wr_12', 'wr_13'],
dtype='object')
  • 위와 같이 csv파일을 읽어올때 index column을 설정해주면 전처리할 열에서 제외할 수 있다.

“voted” 열을 train_y의 타겟으로 만들기

1
2
3
4
train_x = train_raw.drop('voted', axis = 1)
train_y = train_raw['voted']

train_x.shape
1
(45532, 76) # 45532명에 대한 76가지 데이터를 의미한다.
  • 학습 데이터에서 voted 열만 제외한 데이터를 train_x로 저장
  • 학습 데이터의 voted 열을 따로 뽑아 train_y로 저장

[ 문자열 변수 변환 ]

값이 문자열로 들어가있는 데이터에 대해 적절한 숫자값으로 변환해주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gender_list = ['Male', 'Female']
race_list = ['Asian', 'Arab', 'Black', 'Indigenous Australian', 'Native American', 'White', 'Other']
religion_list = ['Agnostic', 'Atheist', 'Buddhist', 'Christian_Catholic', 'Christian_Mormon', 'Christian_Protestant', 'Christian_Other', 'Hindu', 'Jewish', 'Muslim', 'Sikh', 'Other']

for idx, data in train_x.iterrows():
age_grp = data['age_group']
race = data['race']
religion = data['religion']
gender = data['gender']

train_x.loc[idx, 'age_group'] = age_grp.replace('s', '')
train_x.loc[idx, 'race'] = race_list.index(race) + 1
train_x.loc[idx, 'religion'] = religion_list.index(religion) + 1
train_x.loc[idx, 'gender'] = gender_list.index(gender) + 1

print(train_x['religion'])
1
2
3
4
5
6
7
8
9
10
11
12
13
index
0 12
1 8
2 12
3 8
4 1
..
45527 9
45528 2
45529 7
45530 2
45531 1
Name: religion, Length: 45532, dtype: object

댓글