주어진 데이터를 이용해 6가지 영역으로 나누어 분석 후 점수를 매긴 뒤, 여섯 영역의 점수 총합이 100점이 되도록 구성하여 한 달 동안 어떤 생활을 했는지 확인할 수 있습니다.
아래 주소에서 readme 파일에 첨부된 사진까지 확인 가능합니다.
https://github.com/smblue37/pls-lifelog
conda create -n pjLifelog python=3.8
conda activate pjLifelog
pip install -r requirements.txt
conda activate pjLifelog
python manage.py runserver
확인하고 싶은 id를 입력하면 점수를 확인할 수 있습니다. (단, id는 숫자로 입력합니다.)
주어진 엑셀 파일 중 분석할 데이터가 많았던 id는 232, 341, 486, 534, 581, 585, 805, 807, 811, 813, 1008, 1033, 1042, 1057, 30040, 30046 등이 있습니다. 이 중에서 확인하셔도 좋을 것 같습니다.
아나콘다를 이용하여 장고로 개발하였습니다.
가장 상위 폴더는 startData, chartData, lifelogProject, hs_g93_m08 폴더와, manage.py, user_profile.csv로 이루어져 있습니다.
lifelogProject 폴더는 기본적인 장고 세팅, urls.py 등으로 이루어져 있습니다.
중간 보고서의 구성도와 마찬가지로 startData 앱과 chartData 앱으로 구성되어 있습니다.
주어진 데이터는 가장 상위 폴더에 user_profile.csv, 그리고 hs_g93_m08 폴더에 이용자들의 엑셀 파일들을 넣어뒀습니다.
startData는 시작 페이지를 보여주는 index.html, 점수를 볼 수 있는 버튼이 있는 wait.html, user_id가 존재하는지 확인하는 views.py 등으로 구성되어 있습니다.
chartData는 생활 점수 총합을 보여주는 chart.html, 각 영역마다 자세한 분석 내용을 보여주는 details.html(1~6), 각 영역마다 데이터를 분석하고 점수를 매기는 views.py로 구성되어 있습니다.
-
사용한 라이브러리는 requirement.txt에 있습니다. pandas, numpy, matplotlib, plotly 라이브러리를 주로 사용했습니다.
-
프로그램을 실행하면 startData 앱의 index.html이 실행됩니다.
여기서 user_id를 입력 받고, 해당 아이디가 존재하는지 확인합니다.
만약 아이디가 존재한다면 wait.html로 넘어갑니다.
wait.html의 버튼을 누르면 chartData 앱으로 넘어갑니다.
chartData 앱에서는 wait.html로부터 요청 받아 views.py의 checkData()가 실행됩니다.
checkData()는 activeData(), exerciseData(), regularData(), sleepData(), mealData(), sooniData() 함수로 해당 user_id의 데이터를 분석하고, getScore() 함수로 이를 점수 매겨 chart.html로 보여줍니다.
chart.html에서는 각 영역의 점수가 보이고, 합계 점수를 볼 수 있습니다.
이 때 각 영역마다 분석하기 버튼이 있고, 이를 누르면 해당 영역의 자세한 분석 페이지로 넘어갑니다. (details.html) -
활동 영역은 2시간 간격으로 시간대를 나누어 각 시간대마다 활동에 해당하는 가중치를 더하였습니다.
이때 Z가 부동이면 0, 미동이면 0.33, 활동 또는 외출이면 0.66, 매우 활동이면 1에 해당하는 가중치를 주었습니다. 이를 이용해 31일 간의 활동량을 담은 list와 5주 간의 활동량을 담은 list로 만들었고, 이를 일간 그래프, 주간 그래프로 시각화하였습니다. -
운동 영역은 한 달 간 운동 횟수를 센 뒤, 주간 운동 횟수를 막대 그래프로 나타내었습니다.
State가 실외운동하기 또는 실내운동하기이면 운동으로 판단하였고, 날짜를 확인하여 5주 간의 운동 횟수를 담은 list를 만들어 막대 그래프로 시각화하였습니다. 이 때 전체 이용자의 평균 운동 횟수를 계산한 뒤 이를 본인의 운동 횟수와 비교하여 전체 평균보다 얼마나 적은지 또는 많은지 나타냅니다.
운동을 쉰 날에 따라서 분석 페이지의 글이 달라지도록 하였습니다. -
규칙성 영역은 사용자의 활동 중 용변과 약 복용을 분석했습니다.
용변은 날짜 별로 용변 횟수를 기록하여 선 그래프로 나타냈습니다.
또한 새벽, 아침, 점심, 저녁으로 시간대를 구분해 시간대별 용변 횟수를 기록하여 사용자가 어느 시간대에 용변을 자주 보는지 확인할 수 있도록 했습니다.
약 복용은 시간대를 밤, 아침, 점심, 저녁 네 구간으로 설정하여 그 시간대에 복용한 약들은 같은 약들이라고 판단했습니다.
약 복용 기록을 시각화하기 위해 날짜별 복용 횟수를 시간대별로 설정해 시간대별 누적 막대그래프로 나타냈습니다.
그리고 시간대별 일 평균 약 복용 횟수를 구하여 이 횟수를 소수점 첫째 자리에서 반올림한 값을 원래 그 시간대에 약을 복용해야할 횟수로 판단하여 날짜별로 그 횟수보다 적으면 약을 복용하지 않았다고 판단하여 약을 복용하지 않은 횟수를 기록했습니다. -
수면 영역은 일별 취침시각을 곡선 그래프로 나타냈고, 늦게 잔 날의 수를 보여줍니다.
Act가 취침이면 수면으로 판단하였고, 날짜를 확인하여 31일 간의 수면 시간을 담은 list로 만들었습니다.
아예 취침 시각이 기록되지 않은 날은 기록 상의 오류라 생각하여 제외한 뒤 그래프로 시각화했습니다.
그리고 밤 12시부터 오전 10시 사이에 수면을 취한 날을 세어 횟수에 따라 분석 페이지의 글이 달라지도록 하였습니다. -
식사 영역은 아침, 점심, 저녁 식사 시간을 각각 기록한 뒤, 이를 곡선 그래프로 시각화했습니다.
State가 조식, 중식 또는 석식이면 식사로 판단하였고 크기가 31인 list에 날짜에 맞추어 해당 날에 식사를 했는지, 올바른 식사시간이었는지, 식사 시간이 언젠지를 숫자로 나타내었습니다. (해당 날에 식사를 했으면 1, 안 했으면 0이고 일찍 식사했으면 -1, 늦게 식사했으면 1)
즉, 이중 list로 나타내었습니다. list[행][열]에서 행에는 날짜가 들어가고, 열에 0, 3, 6이 들어가면 식사 시간을, 열에 1, 4, 7이 들어가면 식사 여부를, 마지막으로 열에 2, 5, 8이 들어가면 올바른 식사시간인지를 나타내었습니다.
이 때 아예 식사 기록이 없으면 그 날은 제외하였습니다.
그리고 일반적인 식사 시간을 설정하여 (아침 식사 오전 6시 ~ 오전 9시, 점심 식사 오전 11시 ~ 오후 1시, 저녁 식사 오후 5시 ~ 오후 8시) 이보다 빠르거나 늦게 식사를 한 횟수를 세어 분석 페이지에서 보여줍니다. -
순이 영역은 매일 순이와의 대화 횟수를 기록하여 곡선 그래프로 나타냈고, 순이와 아예 대화가 없던 날은 횟수를 세어 보여줍니다.
Message_1, Message_2, Message_3에 값이 존재하면 순이와의 대화한 것으로 판단하였고, 31일 간의 순이 대화 횟수를 담은 list로 만들었습니다. 그리고 이용자들의 전체 평균 순이 이용 횟수를 계산한 뒤, 자신의 이용 횟수와 비교하여 분석 페이지에서 보여줍니다. -
총 점수는 점수 총합이 100점이 되도록 각 영역별 점수를 가중평균해서 구합니다. 각 영역 점수는 다음과 같이 구합니다.
활동 점수의 경우 주 5일 이상 활동/외출하면 만점이며, 활동 정도에 따라 가중치를 곱해서 점수화합니다.
운동 점수의 경우도 주 5일 이상 실내 또는 실외 운동하면 만점이며, 운동 횟수에 따라 비례에서 점수를 부여합니다.
규칙성 점수의 경우, 용변 횟수를 표준편차를 가지고 순위를 매겨 점수화합니다.
수면 점수의 경우, 수면 주기를 가지고 표준편차를 이용하여 점수화합니다.
식사 점수의 경우, 일 2회 이상 식사했는지/ 정해진 시간에 식사했는지를 가지고 점수화합니다.
순이 점수의 경우, 순이와 대화한 횟수를 가지고 점수를 부여하며, 10회 이상 대화시 만점이고 횟수에 따라 점수가 비례합니다.