데이터분석 6기/본캠프

2025-05-09 실전프로젝트 1일차 - EDA

seyeon1130 2025. 5. 9. 20:59

주제선정

우리조는 교육 데이터를 주제로 실전 프로젝트를 진행하기로 했다.

 

온라인 강의 플랫폼에 저장된 데이터를 활용해서 해당 서비스의 현황을 확인할 수 있는 대시보드를 생성합니다.

  • 강의 참여자들의 수강 기록을 바탕으로 해당 플랫폼과 각 강의별 참여도를 확인할 수 있는 대시보드 생성
  • 온라인 강의 및 서비스 활성화 정도를 확인할 수 있는 지표 생성
  • 생성된 대시보드를 바탕으로 현황 분석 및 개선 방안 제안

 

 

인적사항 별 EDA

 

#나이 컬럼 생성
df['age'] = df['start_time_DI'].dt.year - df['YoB']

sns.histplot(df['age'], bins=30, kde=True)
plt.show()

 

컬럼이 태어난 날짜밖에 없어서 시작 시간을 기준으로 나이를 다시 계산해주고 히스토그램으로 분포를 확인했다.

 

 

20대에서 40대가 가장 많지만 최소 나이는 0세, 최고 나이는 84세까지있어서 너무 어린 나이는 이상치처리를 해야할 것 같다.

 

 

성별

 

sns.countplot(x='gender',data = df)

for p in plt.gca().patches:
    plt.gca().annotate(f'{p.get_height()}', 
                       (p.get_x() + p.get_width() / 2., p.get_height()), 
                       ha='center', va='baseline', fontsize=12)

plt.show()

남자가 훨씬 많은 것으로 보인다.

 

# 분석할 열들
activity_columns = ['nevents', 'ndays_act', 'nplay_video', 'nchapters', 'nforum_posts']

# 성별 기준으로 평균 계산
gender_mean = df.groupby('gender')[activity_columns].mean().reset_index()

# 그래프 시각화
plt.figure(figsize=(15, 8))
gender_mean.set_index('gender').T.plot(kind='bar', figsize=(15, 8), rot=0)
plt.title('Average Activity Counts by Gender')
plt.xlabel('Activity Type')
plt.ylabel('Average Count')
plt.legend(title='Gender')
plt.tight_layout()
plt.show()

근데 학습 참여율을 보면 여성이 더 많은편

 

학력

 

plt.figure(figsize=(12,5))
sns.countplot(x='LoE_DI',data = df)

for p in plt.gca().patches:
    plt.gca().annotate(f'{p.get_height()}', 
                       (p.get_x() + p.get_width() / 2., p.get_height()), 
                       ha='center', va='baseline', fontsize=12)

plt.show()

대졸>고졸>석사 순으로 많다

gender_mean = df.groupby('LoE_DI')[activity_columns].mean().reset_index()

# 그래프 시각화
plt.figure(figsize=(15, 8))
gender_mean.set_index('LoE_DI').T.plot(kind='bar', figsize=(15, 8), rot=0)
plt.title('Average Activity Counts by Gender')
plt.xlabel('Activity Type')
plt.ylabel('Average Count')
plt.legend(title='Gender')
plt.tight_layout()
plt.show()

그래도 석사 박사가 학습률은 제일 높다!

 

결측치 처리

nplay_video 457530

roles 641138

incomplete_flag 540977

 

이 세 컬럼은 결측치가 전체의 50% 이상이므로 삭제하기로 했다.

 

 

ndays_act는 null 이면서 grade는 0.1이상인 것 ->24건
ndays_act 는 not null 이면서 2이상, last_event_DI는 null 인 것  ->9102건 

위 이상치는 제거, 
나머지 ndays_act 결측치는 0으로 대체
나머지 last_event_DI 결측치는 ndays_act가 1인 것으로 확인됨.(즉 start_time_DI가 last_event_DI랑 같다는 뜻이므로 start_time_DI로 대체) 

nevents ,nchapters도 0값이 없으므로 0으로 대체

last_event_DI,ndays_act 가 모두 null인데 nchapters는 null이 아니고 'certified'는 1임
즉 하루만에 모든 챕터를 다 학습하고 수료까지 했다는 것.

결측치를 학습 안한 사람으로 보려면 정확한 기준이 필요해보임.