기술 스택/Python

[부스트코스] 코칭스터디 1주차 - 데이터 분석 기초

없음 출신 2022. 11. 7. 23:59

목차

    1주차 회고

    1주차는 기초적인 내용을 다뤄서 복습 위주로 강의를 수강, 실습을 진행했다.

    주피터 노트북 확장 프로그램인 Nbextension과 cheet sheat '10 minutes to pandas'가 특히 도움이 되었다.

    부족한 부분을 알고 짚고 넘어갈 수 있었다.

    나는 'Selection' 파트에 취약했기에, 레이블로 선택하는 loc() 함수와 위치로 선택하는 iloc() 함수의 사용법을 다시 정리, 실습해보았다.

    팀미션에서는 조건문과 반복문을 조합해 만드는 문제, 다른 우수 팀의 데이터 분석 접근 과정도 새로웠다.

    What I Learn

    1. 데이터 분석 환경 구성

    - 아나콘다 소개 및 주피터 노트북 사용법

    2. 데이터 분석 준비하기

    - Pandas cheat sheet (10 mintest to Pandas)

    - 파일 경로 설정 방법

    Team Mission

    Q1. 조건문과 반복문을 사용하여 single choice의 응답내역을 출력

    여러분은 파이썬을 통해 설문조사 문항의 응답내역을 분석하게 되었습니다. 문항별 응답내용에는 하나의 응답만 할 수 있는 single choice 문제와 여러 응답을 선택할 수 있는 multiple choice 문제가 있습니다. 2개를 구분하기 위해 single choice 문항 번호에 "_"를 표기하지 않기로 했습니다.

    문항별 응답내역이 'question'에 담겨 있을 때, 조건문과 반복문을 사용하여 아래와 같은 결과가 출력되도록 코드를 작성해보세요.

    • 목적 : 설문조사 문항의 응답내역 분석
    • 문항별 응답내용에는 single choice(하나의 응답만 가능, ex.Q1)과 multi choice(다수 응답 가능, ex.Q2_1) 두 가지가 있음
    • 문항별 응답내역이 question에 담겨있다.
    • single choice의 응답내역을 출력하고자 한다.
    # 응답내역이 담겨있는 'question'
    question=['Q2', 'Q3', 'Q4', 'Q5', 'Q6_1', 'Q6_2', 'Q6_3', 'Q6_4', 'Q6_5', 'Q6_6',
           'Q6_7', 'Q6_8', 'Q6_9', 'Q6_10', 'Q6_11', 'Q6_12', 'Q7_1', 'Q7_2',
           'Q7_3', 'Q7_4', 'Q7_5', 'Q7_6', 'Q7_7', 'Q8', 'Q9', 'Q10_1', 'Q10_2']
    print(question)
    
    """
    ['Q2', 'Q3', 'Q4', 'Q5', 'Q6_1', 'Q6_2', 'Q6_3', 'Q6_4', 'Q6_5', 'Q6_6', 'Q6_7', 'Q6_8', 'Q6_9', 'Q6_10', 'Q6_11', 'Q6_12', 'Q7_1', 'Q7_2', 'Q7_3', 'Q7_4', 'Q7_5', 'Q7_6', 'Q7_7', 'Q8', 'Q9', 'Q10_1', 'Q10_2']
    """
    # single choice의 응답내역은
    single = []
    for i in question:
        if '_' not in i: # '_'가 없다.
            single.append(i) # append() : List에 원소 추가
            
    print(single)
    
    """
    ['Q2', 'Q3', 'Q4', 'Q5', 'Q8', 'Q9']
    """

    Q2. 2011년부터 연도별, 국가별 평균 기대수명 (groupby 나 pivot_table을 활용)

    다음의 데이터는 연도, 국가별 기대수명을 나타내고 있는 데이터 입니다. 2011년 부터의 연도별, 국가별 평균 기대수명을 구해주세요. (2011년도 포함되게 구합니다.)

    [필수 조건] groupby 나 pivot_table을 활용합니다. groupby 로 구할 때 unstack()이라는 기능을 사용하여 아래와 같이 컬럼에 인덱스 값을 올려서 표기할 수 있습니다. 만약 행에는 '연도'가, 열에 '국가'가 들어있고 수치 데이터의 결과값이 아래와 같다면, 출력형태는 조금 달라도 괜찮습니다. 데이터는 다음의 방법으로 읽어옵니다.

    import pandas as pd
    import numpy as np
    
    # URL로 csv데이터 불러오기
    df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/healthexp.csv')
    df

    출력 결과

    # 방법1) pd.groupby
    # pd.unstack은 muti-index 중 하나는 index로, 다른 하나는 column으로 변형시키는 메소드이다.
    df_2011 = df[df['Year'] >= 2011]
    df_2011.groupby(['Year', 'Country']).mean(['Life_Expenctancy']).drop('Spending_USD', axis=1).unstack()

    # 방법2) pd.pivot_table
    pd.pivot_table(df[df['Year'] > 2011], index = 'Year', columns = 'Country', values = 'Life_Expectancy', aggfunc = np.mean)

    Q3. 배운 내용 정리 (Markdown)

    Jupyter notebook 은 문서와 코드를 함께 작성할 수 있다는 점이 장점입니다. Jupyter notebook 에서 지원하는 Markdown 문법을 사용하여, 이번 주에 배운 내용을 정리해 보세요!

     

    Q4. 공공데이터포털 데이터 다뤄보기

    앞으로 우리는 공공데이터포털에서 데이터를 다운로드 받아 과정을 진행할 예정입니다.

    본격적인 학습 이전에! 데이터를 다루는 방법이 익숙해지도록 한번 더 연습해보고, 어떤 문제를 풀 수 있을지도 함께 고민해보아요!

    공공데이터포털에서 원하는 데이터를 다운로드 받아 경로를 설정하고, 주피터 노트북과 판다스를 통해 불러와 보세요! 어떤 데이터를 사용해야할지 고민된다면 다음 링크의 데이터를 다운로드 받아도 좋습니다. [참고 예시] 공공데이터포털 - 서울특별시 강남구_생활폐기물배출량

    이 때, 인코딩 오류가 발생한다면 encoding="cp949" 옵션을 사용해 주세요! cp949는 한글 윈도우에서 사용하는 인코딩 방식이랍니다.

    trash = pd.read_csv('서울특별시 강남구_생활폐기물배출량_20221019.csv', encoding='cp949')
    trash
    # 전년도(2019) 기준으로 생활폐기물배출량의 증감은 어떠한가
    trash['전년도 대비 배출량 증감']=trash['2020년(생활폐기물)-톤']-trash['2019년(생활폐기물)-톤']
    
    # 가장 적은 달의 배출량
    trash[['2019년(생활폐기물)-톤','2020년(생활폐기물)-톤']].min()

    우수사례

    (자스민코치 02팀)

    이렇게도 접근해서 분석할 수 있겠구나 싶었던..!

    # 전국 생활폐기물 배출량 데이터 불러오기
    # 전국 데이터
    nation=pd.read_csv("data/폐기물종류별_일평균_발생량.csv", encoding="cp949")
    nation
    
    # 강남구 연도별 총 배출량 -> 일평균 배출량
    gn_2019=round(trash['2019년(생활폐기물)-톤'].sum()/365, 2)
    gn_2020=round(trash['2020년(생활폐기물)-톤'].sum()/365, 2)
    
    # 전국 생활폐기물 데이터 처리
    trash=nation.loc[[3]]
    trash=trash[['통계표명:','Unnamed: 8', 'Unnamed: 9']]
    trash.columns=['구분','2019', '2020']
    trash['단위']='톤/일'
    trash=trash.reset_index(drop=True)
    
    trash

    # 강남구 데이터 추가
    gn_data={'구분':'강남구 생활폐기물 발생량', '2019': gn_2019, '2020': gn_2020, '단위': '톤/일'}
    trash.loc[1]=gn_data
    
    # 전국 대비 강남구의 배출량의 비율
    rate_2019=round(gn_2019/57961, 4)*100
    rate_2020=round(gn_2020/61597, 4)*100
    gn_rate={'구분': '강남구 발생량 차지비율', '2019': rate_2019, '2020': rate_2020, '단위': '%'}
    trash.loc[2]=gn_rate
    
    trash