본문 바로가기
데이터분석

[Data analysis] 애플 ios 건강 앱의 수면 데이터, 코랩(colab)으로 분석하기

by jungsunbeen 2024. 12. 9.

I. 건강앱에서 데이터 다운로드 받기

1. 아이폰 건강 앱에 들어가 프로필 사진을 누른다.

2. "모든 건강 데이터 내보내기" 을 누른다.

- 큰 데이터인 만큼 꽤 시간이 걸린다.

3. "내보내기.zip" 파일이 생긴다.

4. 압축 해제하면 "apple_health_export" 명의 파일로 압축 해제됨

II. 다운받은 데이터 코랩에 넣기

그 중 내보내기.xml 파일명을 colab에 넣을 예정이다.

(내 설정이 한국어로 되어있어서 한국어인듯 하나, 원래 명은 export.xml이라고 한다.)

코랩의 좌측 폴더 버튼에서 파일을 업로드한다.

- 내보내기.xml만 넣으면 됩니다!

III. 코랩으로 데이터 csv 로 변환하기

import xml.etree.ElementTree as ET
import pandas as pd

# XML 파일 로드
tree = ET.parse('/content/내보내기.xml')
root = tree.getroot()

# 수면 데이터 중 애플워치로 기록된 항목만 추출
data = []
for record in root.findall(".//Record[@type='HKCategoryTypeIdentifierSleepAnalysis']"):
    source_name = record.get('sourceName')
    device = record.get('device')
    
    # sourceName이나 device에 'Watch'가 포함된 경우 추출
    if source_name and 'Watch' in source_name:
        start_date = record.get('startDate')
        end_date = record.get('endDate')
        value = record.get('value')
        data.append({
            'Start Date': start_date,
            'End Date': end_date,
            'Value': value
        })

# 데이터프레임으로 변환
df = pd.DataFrame(data)

# 시간 형식 변환
df['Start Date'] = pd.to_datetime(df['Start Date'])
df['End Date'] = pd.to_datetime(df['End Date'])

# 9월과 10월 데이터 필터링
df = df[df['Start Date'].dt.month.isin([9, 10])]

# 필터링된 데이터를 CSV로 저장
df.to_csv('watch_sleep_data_filtered.csv', index=False)

print("데이터를 watch_sleep_data_filtered.csv 파일로 저장했습니다.")

이중 나는 날짜와 디바이스로 필터링 하였는데, 필요에 따라 삭제 및 변경하여 데이터를 필터링 하면 되겠습니다.

IV. csv 파일 colab으로 분석하기

import pandas as pd
import matplotlib.pyplot as plt

# 필터링된 CSV 파일 로드 (9월과 10월 데이터)
df_sept_oct = pd.read_csv('watch_sleep_data_filtered.csv')

# 시간 형식 변환
df_sept_oct['Start Date'] = pd.to_datetime(df_sept_oct['Start Date'])
df_sept_oct['End Date'] = pd.to_datetime(df_sept_oct['End Date'])

# 수면 지속 시간 계산
df_sept_oct['Duration'] = (df_sept_oct['End Date'] - df_sept_oct['Start Date']).dt.total_seconds() / 3600

# 수면 시간이 있는 날짜들만 필터링 (Duration이 0이 아닌 경우)
df_sept_oct = df_sept_oct[df_sept_oct['Duration'] > 0]

# 수면 시간 시각화 (데이터가 있는 날짜만)
plt.figure(figsize=(10, 6))
plt.plot(df_sept_oct['Start Date'], df_sept_oct['Duration'], marker='o', linestyle='-')
plt.xlabel('Date')
plt.ylabel('Sleep Duration (hours)')
plt.title('Sleep Duration Trend (September & October)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

이런 데이터 분석이 가능하다. 나는 여러가지를 했는데 아직 미완이라...

데이터 분석 과제 완료 후에 업로드 해보겠습니다.

 

github link

https://github.com/jungsunbeen/sleep_data_Analysis