EDA Level Test 06

JERRY·2025년 4월 17일

EDA

목록 보기
21/27
post-thumbnail

EDA Level Test 06 ⭐️⭐️

WeekData AnalysisDifficultyThis Notebook
1서울시 인구 데이터⭐️
2화장품 성분 데이터⭐️⭐️⭐️
3올림픽 데이터⭐️⭐️
4국가별 인터넷 사용률 데이터⭐️⭐️
5전국 박물관/미술관 정보 표준 데이터⭐️⭐️⭐️
6서울시 흡연율 통계 데이터⭐️⭐️👈
7웹크롤링⭐️
8서울시 지하철 호선별 역별 유/무임 승하차 인원 정보 데이터⭐️⭐️
9서울시 교통사고 현황 (사고유형별) 통계 데이터⭐️⭐️
10서울시 교통사고 현황 (사고유형별) 통계 + 서울시 차량통행속도 (구별/월별) 통계 + 서울시 인구밀도 (구별) 통계⭐️⭐️⭐️

문제 소개 및 데이터 준비 단계

문제 소개

  • 총 3단계 데이터 분석 상황 제시
    • 1단계: DataFrame 전처리 01 - 기초
    • 2단계: DataFrame 전처리 02 - 심화
    • 3단계: 원하는 정보 얻기
      • 총점 100점

Data 원본 출처

Target Data(txt): 서울시 흡연율 통계

  • Source: 서울 열린데이터 광장
  • Reference: PinkWink
  • DownLoad: 상기 Source(서울 열린데이터 광장)에서 2009년 - 2018년 설정하여 Download
    • 문제 출제 이후 Data 변경될 가능성이 있으므로 문제 풀이시 하기 File Path의 Data 사용
  • File Path: './datas/report.txt'

참고사항

  • 서울 열린데이터 광장에서 해당 데이터는 다양한 Format(xls, txt, hwp)으로 제공합니다.
  • 데이터는 탭으로 구분하여 TXT로 제공합니다
  • 문제에 hint가 있을 경우, 해당 hint를 이용하지 않으셔도 무방합니다.


문제 시작! 🏃🏻

1단계: DataFrame 전처리 01 - 기초

문제 1-1) 기초 전처리 01 (5점)

  • 위의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.

    • 조건1: '구분' Column(열)명을 '구분1'로, '구분.1' Column(열)명을 '구분2'로 변경하세요.

    • 조건2: 조건1에 따라 Column(열)명을 변경한 후 '구분1'의 '서울시'를 '시'로, '**구'(예: 양천구, 영등포구)는 '구'로 변경하세요.

    • 조건3: Index, Column 순서 또는 Data 순서(정렬)는 변경하지 마세요.

    • 조건4: 'df_target' 변수에 결과 DataFrame을 할당하세요.

  • 완료 후 결과 DataFrame 변수(df_target)를 check_01_01 함수에 입력하여 채점하세요.

문제 1-2) 기초 전처리 02 (10점)

  • 1-1의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.

    • 조건1: '여자' Column(열)명의 Data 중 float Type으로 변경할 수 있는 경우 float(numpy.float64)으로 Type을 변경하고, 불가능한 경우 해당 Data의 값을 Null값(None)으로 변경하세요.

    • 조건2: Index, Column 순서 또는 Data 순서(정렬)는 변경하지 마세요.

    • 조건3: 'df_target' 변수에 결과 DataFrame을 할당하세요.

    • hint1: python 예외처리(try-except)를 활용해보세요.

    • hint2: 현재 df_target의 '여자' Column(열) data들의 Type은 str입니다.

  • 완료 후 결과 DataFrame 변수(df_target)를 check_01_02 함수에 입력하여 채점하세요.

문제 1-3) 기초 전처리 03 (5점)

  • 1-2의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.

    • df_target의 '구분' Column(열) Data 중 '교육수준별Ⅱ(65세 이상)'의 Data들은 Null값이 너무 많아 분석 대상에서 제외하려고 합니다.

    • 조건1: '구분' Column(열)이 '교육수준별Ⅱ(65세 이상)'인 Row(행)을 삭제하세요.

    • 조건2: Index, Column 순서 또는 Data 순서(정렬)는 변경하지 마세요.

    • 조건3: 'df_target' 변수에 결과 DataFrame을 할당하세요.

  • 완료 후 결과 DataFrame 변수(df_target)를 check_01_02 함수에 입력하여 채점하세요.


2단계: DataFrame 전처리 02 - 심화

문제 2-1) 심화 전처리 01 (10점)

  • 1단계의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.

    • df_target '여자' Column(열)의 Data에 Null값을 채우고자 합니다.

    • Null값을 채우는 방법으로는 여러가지가 있는데, 이 Test에서는 '전체'와 '남자', '여자' Column(열)의 Data를 이용하여 '여자비율'을 구하고, '여자비율'의 변화를 확인하여 Null값을 채워보려고 합니다.

    • df_target.전체 = df_target.여자 x/100 + df_target.남자 (1 - x/100) 에서의 x% 값이 '여자비율'입니다.

      • 예시
    • 조건1: '여자' Column(열)의 Data가 Null값(None)이 아닌 경우 위의 수식에 따른 '여자비율'을 구하여 '여자비율' Column에 입력하세요(위 예시를 참고).

      • '여자비율' Column(열)의 Data는 소숫점 일곱 번째 자리에서 반올림하여 소숫점 여섯 번째까지 입력해주세요.

      • '여자비율' Column(열) Data의 Type은 float(numpy.float64)이어야 합니다.

    • 조건2: '여자' Column(열)의 Data가 Null값(None)인 경우 '여자비율' Column에 Null값(None)을 입력하세요(위 예시를 참고).

    • 조건3: Index, Column 순서 또는 Data 순서(정렬)는 변경하지 마세요.

    • 조건4: 'df_target' 변수에 결과 DataFrame을 할당하세요.

    • hint1: 방정식을 풀기 위한 Python Library로 Sympy 등이 있습니다. 해당 문제는 sympy를 이용해서 풀수도 있고, 비교적 쉬운 1차 방정식이므로 수식을 직접 전개해서 풀어도 상관 없습니다.

  • 완료 후 결과 dataframe 변수(df_target)를 check_02_01 함수에 입력하여 채점하세요.

문제 2-2) 심화 전처리 02 (10점)

  • 2-1의 DataFrame(df_target)을 이용하여 아래의 조건에 맞는 정보를 구하여 DataFrame(df_result)으로 나타내세요.

    • df_target의 '여자' Column Data의 Null값(None)을 채우기 위한 근거로 아래와 같은 정보를 구하려고 합니다.

    • 2-1에서 구한 df_target '여자비율' Column Data의 연간 변동 정도를 '구분2' Column(열) Data 중 '여자비율'이 Null값(None)이 있는 '구분2' Data 별로 다양한 방법(회귀계수(coefficient), MinMax, 평균, 표준편차)을 이용하여 확인해보려 합니다.

    • 회귀계수란?

      • 선형 모형에서 x와 y의 관계를 수식으로 y = w * x + b 로 나타낼 수 있습니다.
      • 이 식에서 w(기울기)와 b(절편)를 회귀계수(cofficient)라고 합니다.
      • 독립변수 x가 1 증가할 때마다 종속변수 y는 w만큼 증가합니다.
      • 아래의 조건2에서 우리가 구하고자 하는 것은 회귀계수 중 기울기(w)이며, 편의상 w를 '회귀계수'라 표현하겠습니다.
    • 아래 예시는 아래의 조건에 맞추어 '전체' Column(열) Data의 연간 변동을 '구분2' Column(열) 별로 확인해 본 것 입니다.

      • 예시1

    • 조건1: 결과 DataFrame의 Column(열)명은 ['구', '회귀계수', 'MinMax', '평균', '표준편차'] 로 만들어주세요.

    • 조건2: '여자' 또는 '여자비율' Column(열) Data가 Null값(None)이 아닌 Row(행)의 '구분2' Column(열) Data를 구하고, 오름차순으로 정렬하세요.

      • 예시2: df_target의 일부입니다. 아래 그림에 대한 조건2의 결과는 [노원구, 동작구, 서초구] 입니다.

    • 조건3: 조건2에 해당하는 Data 각각 '기간' Column(열) Data의 변화에 따른 '여자비율' Column(열)의 변동을 나타내는 '회귀계수'를 구하세요. 이 결과를 결과 DataFrame의 '회귀계수' Column(열)에 입력하세요.

      • 단순회귀분석(1차, 직선)의 회귀계수 중 기울기를 의미합니다. 위의 '회귀계수란?'을 참고해주세요.
      • 위 그림의 예시2에 따르면 [노원구, 동작구, 서초구] 각각에 대한 기간별 '회귀계수'를 구하면 됩니다.
      • '기간' Column(열)의 Data가 x가 됩니다.
      • '여자비율' Column(열) Data 가 y가 됩니다.
      • 소숫점 일곱번째 자리에서 반올림하여 여섯번째 자리까지만 나타내세요.
      • 당연히 Null값(None)이 있는 Row(행)은 계산시 제외됩니다.
    • 조건4: 조건2에 해당하는 Data 각각 '여자비율' Column(열) Data의 최대값과 최소값의 차이(MinMax)를 구하세요. 이 결과를 결과 DataFrame의 'MinMax' Column(열)에 입력하세요.

      • 위 그림의 예시2에 따르면 [노원구, 동작구, 서초구] 각각에 대한 최대값과 최소값의 차이를 구하면 됩니다.
      • 소숫점 일곱번째 자리에서 반올림하여 여섯번째 자리까지만 나타내세요.
      • 절대값(양수)으로 표현하세요.
      • 당연히 Null값(None)이 있는 Row(행)은 계산시 제외됩니다.
    • 조건5: 조건2에 해당하는 Data 각각 '여자비율' Column(열)의 평균을 구하세요. 이 결과를 결과 DataFrame의 '평균' Column(열)에 입력하세요.

      • 위 그림의 예시2에 따르면 [노원구, 동작구, 서초구] 각각에 대한 평균을 구하면 됩니다.
      • 소숫점 일곱번째 자리에서 반올림하여 여섯번째 자리까지만 나타내세요.
      • 절대값(양수)으로 표현하세요.
      • 당연히 Null값(None)이 있는 Row(행)은 계산시 제외됩니다.
    • 조건5: 조건2에 해당하는 Data 각각 '여자비율' Column(열)의 평균을 구하세요. 이 결과를 결과 DataFrame의 '표준편차' Column(열)에 입력하세요.

      • 위 그림의 예시2에 따르면 [노원구, 동작구, 서초구] 각각에 대한 표준편차을 구하면 됩니다.
      • 소숫점 일곱번째 자리에서 반올림하여 여섯번째 자리까지만 나타내세요.
      • 절대값(양수)으로 표현하세요.
      • 당연히 Null값(None)이 있는 Row(행)은 계산시 제외됩니다.
    • 조건6: 조건2의 Data를 순서대로 조건3~5의 값을 구하고 DataFrame을 만든다면, 결과 DataFrame의 '구' Column(열)을 기준으로 오름차순으로 정렬되어 있을 것 입니다. 만약 정렬되어있지 않다면, '구'를 기준으로 정렬하고 Index를 초기화하세요.

    • 조건7: 'df_result' 변수에 결과 DataFrame을 할당하세요.

    • hint1: 조건3 관련하여 이전에 배웠던 np.polyfit 함수를 응용해보세요.

    • hint2: 조건3 관련하여 정답 중 '강동구'의 '회귀계수'는 0.052052 입니다.

    • hint3: 예시1의 그림과 Index/Column이 동일합니다. 안의 숫자만 다릅니다.

  • 완료 후 결과 dataframe 변수(df_result)를 check_02_02 함수에 입력하여 채점하세요.

문제 2-3) 심화 전처리 03 (10점)

  • 2-2의 DataFrame(df_result)을 이용하여 아래의 조건에 맞는 정보를 구하여 2-1의 DataFrame(df_target)에 입력하세요.

    • df_target의 '여자' Column Data의 Null값(None)을 채우기 위해 우선 위에서 구한 df_result값을 이용하려고 합니다.

    • 2-2의 df_result를 보면,

      • '회귀계수'의 경우 대부분 양수지만 아주 작은 값을 가지고 있습니다. 강동구의 경우 1년이 지날때 '여자비율'은 약 0.05% 정도 상승한다는 의미입니다.
      • 'MinMax'의 경우 최대 '여자비율'과 최소 '여자비율'의 차가 가장 큰 부분도 1.2%p 미만 수준입니다.
      • '표준편차'의 경우 대부분 평균의 0.5% 미만 수준으로 평균에 대부분의 '여자비율' Data들이 몰려있다고 보여집니다.
    • 따라서 '기간'(연도) 별로 '여자비율'은 평균에서 큰 차이가 없다고 판단되어 df_target의 '여자비율' Null값(None)에 df_result '구'('구분2') Data의 '평균' Data를 입력하려고 합니다.

      • 예시(df_result에서 '회귀계수'를 제외한 값은 실제와 값이 다름)

    • 조건1: df_result의 '구'별 '평균' Data로 df_target의 '구분2'별 '여자비율' Data 중 Null값(None)을 대체하세요(위 예시 참고).

      • 소숫점 일곱번째 자리에서 반올림하여 여섯번째 자리까지만 나타내세요.
    • 조건2: 결과 DataFrame(df_target)의 Index, Column 순서 또는 Data 순서(정렬)는 변경하지 마세요.

    • 조건3: 'df_target' 변수에 결과 DataFrame을 할당하세요.

  • 완료 후 결과 dataframe 변수(df_target)를 check_02_03 함수에 입력하여 채점하세요.

문제 2-4) 심화 전처리 04 (10점)

  • 2-3의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.

    • 이제까지 위에서 구했던 '전체', '남자', '여자비율' Column(열) Data를 활용하여 df_target의 '여자' Column Data의 Null값(None)을 채우려고 합니다.

    • # df_target.전체 = df_target.여자비율/100 x + (1 - df_target.여자비율/100) df_target.남자 에서의 x% 값이 '여자' 입니다.

    • 조건1: '여자' Column(열)의 Data가 Null값(None)인 경우 위의 수식에 따라 '여자'를 구하여 '여자' Column에 입력하세요.

      • '여자' Column(열)의 Data는 소숫점 두 번째 자리에서 반올림하여 소숫점 첫 번째까지 입력해주세요.
      • '여자' Column(열) Data의 Type은 float(numpy.float64)이어야 합니다.
    • 조건2: 조건1을 수행한 후 '여자비율' Column(열)을 삭제하세요.

    • 조건3: Index, Column 순서 또는 Data 순서(정렬)는 변경하지 마세요.

    • 조건4: 'df_target' 변수에 결과 DataFrame을 할당하세요.

    • hint1: 2-1과 같이 방정식을 풀기 위한 Python Library로 Sympy 등이 있습니다. 해당 문제는 sympy를 이용해서 풀수도 있고, 비교적 쉬운 1차 방정식이므로 수식을 직접 전개해서 풀어도 상관 없습니다.

  • 완료 후 결과 dataframe 변수(df_target)를 check_02_04 함수에 입력하여 채점하세요.


3단계: 원하는 정보 얻기

문제 3-1) 원하는 정보 얻기 01 (10점)

  • 2단계의 DataFrame(df_target)을 이용하여 아래의 조건에 맞는 정보를 구하세요.

    • df_target '구분2' Column(열)의 '전체', '남자', '여자' 흡연율이 해마다 단조적(monotonic)으로 증가 또는 감소하는지 확인하고자 합니다.

    • 단조 증가 / 단조 감소

      • 어떤 수열이나 함수가 있을 때, 해당 수열이나 함수가 정의된 구간에서 감소하지 않는 경우를 단조증가, 증가하지 않는 경우를 단조감소 한다고 표현한다.
      • 다시말해, 중간에 감소 한번 없이 지속해서 증가하는 경우 단조 증가, 중간에 증가 없이 지속해서 감소하는 경우 단조 감소한다고 한다.
    • 조건1: 결과 DataFrame의 Column(열)명은 ['구분1', '구분2', '전체', '남자','여자'] 입니다.

    • 조건2: '구분2' 별로 '전체', '남자', '여자' Column(열) Data가 '기간'에 따라 단조적으로 변화하는지 아닌지 확인하세요.

      • 단조적으로 변화한다는 것은 단조 증가 변화와 단조 감소 변화를 모두 포괄하는 - 단조적으로 변화한다면 True, 그렇지 않다면 False를 입력하세요.
    • 조건3: ['구분1', '구분2']를 기준으로 오름차순으로 순서를 변경(sort)하고 Index를 Reset하세요.

      • 예시(임의의 boolean값을 넣었습니다.)

    • 조건4: 'df_result' 변수에 결과 DataFrame을 할당하세요.

  • 완료 후 결과 dataframe 변수(df_result)를 check_03_01 함수에 입력하여 채점하세요.

문제 3-2) 원하는 정보 얻기 02 (10점)

  • 2단계의 DataFrame(df_target)을 이용하여 아래의 조건에 맞는 정보를 구하세요.

    • df_target '구분2' Column(열)의 '전체', '남자', '여자' 흡연율이 해를 거듭할수록 증가 또는 감소하는지 회귀계수를 통해서 확인하고자 합니다.

    • 회귀계수에 대해서는 앞의 2-2 문제를 참고해주세요.

    • 조건1: 결과 DataFrame의 Column(열)명은 ['구분1', '구분2', '전체', '남자','여자'] 입니다.

    • 조건2: '구분2' 별로 '전체', '남자', '여자' Column(열) Data에 대해 '기간'에 따른 회귀계수를 구하세요.

    • 조건3: ['구분1', '구분2']를 기준으로 오름차순으로 순서를 변경(sort)하고 Index를 Reset하세요.

      • 예시(임의의 float값을 넣었습니다.)

    • 조건4: 'df_result' 변수에 결과 DataFrame을 할당하세요.

  • 완료 후 결과 dataframe 변수(df_result)를 check_03_02 함수에 입력하여 채점하세요.

문제 3-3) 원하는 정보 얻기 03 (10점)

  • 3-2의 DataFrame(df_result)을 이용하여 아래의 조건에 맞는 정보를 구하세요.

    • 3-2의 df_result '구분1' Column(열) Data마다 어떤 '구분2' Column(열)의 Data가 '전체' 흡연율 감소율이 높은지/낮은지 알아보고자 합니다.

    • 조건1: 결과 DataFrame의 Column(열)명은 ['구분1', '최대', '최소'] 입니다.

    • 조건2: 회귀계수가 음수(=흡연율이 감소중)인 '구분1' Column(열) Data 중 어떤 '구분2' Column(열) Data가 '전체' 흡연율 감소율이 가장 높은지/낮은지 찾아서 결과 DataFrame에 입력하세요.

      • '구분1' 중 '시'는 '구분2' Data 가 1개(서울시)이므로 제외합니다.
      • 만약, '구분1' Column(열) Data 중 감소중인 '구분2' Column(열) Data가 1개라면, 해당 '구분2' Data를 '최대'에 넣고, '최소' Column(열)에는 None값을 입력하세요.
      • 만약, '구분1' Column(열) Data 중 증가중인 '구분2' Column(열) Data가 없다면, 해당 '구분1' Data는 건너뛰세요.(결과 DataFrame에 입력하지 마세요)
    • 조건3: ['구분1']을 기준으로 오름차순으로 순서를 변경(sort)하고 Index를 Reset하세요.

      • 예시(임의의 값을 넣었습니다.)

    • 조건4: 'df_maxmin' 변수에 결과 DataFrame을 할당하세요.

  • 완료 후 결과 dataframe 변수(df_maxmin)를 check_03_04 함수에 입력하여 채점하세요.

문제 3-4) 원하는 정보 얻기 04 (10점)

  • 3-2의 DataFrame(df_result)을 이용하여 아래의 조건에 맞는 정보를 구하세요.

    • 3-2의 df_result '구분1' Column(열) Data마다 어떤 '구분2' Column(열)의 Data가 '여자' 흡연율 증가율이 높은지/낮은지 알아보고자 합니다.

    • 조건1: 결과 DataFrame의 Column(열)명은 ['구분1', '최대', '최소'] 입니다.

    • 조건2: 회귀계수가 양수(=흡연율이 증가중)인 '구분1' Column(열) Data 중 어떤 '구분2' Column(열) Data가 '여자' 흡연율 감소율이 가장 높은지/낮은지 찾아서 결과 DataFrame에 입력하세요.

      • '구분1' 중 '시'는 '구분2' Data 가 1개(서울시)이므로 제외합니다.
      • 만약, '구분1' Column(열) Data 중 증가중인 '구분2' Column(열) Data가 1개라면, 해당 '구분2' Data를 '최대'에 넣고, '최소' Column(열)에는 None값을 입력하세요.
      • 만약, '구분1' Column(열) Data 중 증가중인 '구분2' Column(열) Data가 없다면, 해당 '구분1' Data는 건너뛰세요.(결과 DataFrame에 입력하지 마세요)
    • 조건3: ['구분1']을 기준으로 오름차순으로 순서를 변경(sort)하고 Index를 Reset하세요.

      • 예시(임의의 값을 넣었습니다.)

    • 조건4: 'df_maxmin' 변수에 결과 DataFrame을 할당하세요.

  • 완료 후 결과 dataframe 변수(df_maxmin)를 check_03_04 함수에 입력하여 채점하세요.

0개의 댓글