ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter.02-3~02-4 기초적인 통계 계산하기, 그래프 그리기
    Do it! 판다스 입문 2022. 6. 12. 14:57

    지금까지는 데이터를 추출하는 방법에 대해 알아보았습니다. 이번에는 추출한 데이터를 가지고 몇 가지 기초적인 통계 계산을 해보겠습니다. 다음은 갭마인더 데이터 집합에서 0~9번째 데이터를 추출하여 출력한 것입니다.

    print(df.head(n=10))

        country         continent    year    lifeExp            pop    gdpPercap
    0  Afghanistan          Asia   1952    28.801     8425333   779.445314
    1  Afghanistan          Asia   1957    30.332     9240934   820.853030
    2  Afghanistan          Asia   1965    31.997   10267083   853.100710
    3  Afghanistan          Asia   1967    34.020   11537966   836.197138
    4  Afghanistan          Asia   1972    36.088   13079460   739.981106
    5  Afghanistan          Asia   1977    38.438   14880372   786.113360
    6  Afghanistan          Asia   1982    39.854   12881816   978.011439
    7  Afghanistan          Asia   1987    40.822   13867957   852.395945
    8  Afghanistan          Asia   1992    41.674   16317921   649.341395
    9  Afghanistan          Asia   1997    41.763   22227415   635.341351

     

     

     

    그룹화한 데이터의 평균 구하기

    1. lifeExp 열을 연도별로 그룹화하여 평균 계산하기

    예를 들어 연도별 lifeExp 열의 평균을 계산하려면 어떻게 해야 할까요? 데이터를 year 열로 그룹화하고 lifeExp 열의 평균을 구하면 됩니다. 다음은 데이터프레임의 groupby 메서드에 year 열을 전달하여 연도별로 그룹화한 다음 lifeExp 열을 지정하여 mean 메서드로 평균을 구한 것입니다.

    print(df.groupby('year')['lifeExp'].mean( ))

    year
    1952      49.057620
    1957      51.507401
    1962      53.609249
    1967      55.678290
    1972      57.647386
    1977      59.570157
    1982      61.533197
    1987      63.212613
    1992      64.160338
    1997      65.014676
    2002      65.694923
    2007      67.007423
    Name: lifeExp, dtype: float64

     

    2. 과정 1에서 작성한 코드가 조금 복잡해서 어리둥절할 수도 있을 것입니다. 어떤 일이 벌어진 것일까요? 과정 1에서 작성한 코드를 작은 단위로 나누어 살펴보겠습니다. 먼저 데이터프레임을 연도별로 그룹화한 결과를 살펴보겠습니다. groupby 메서드에 year 열 이름을 전달하면 연도별로 그룹화한 country, continent, ..., gdpPercap 열을 모은 데이터프레임을 얻을 수 있습니다.

    grouped_year_df = df.groupby('year')
    print(type(grouped_year_df))

    <class 'pandas.core.groupby.DataFrameGroupBy'>

     

    3. grouped_year_df를 출력하면 과정 2에서 얻은 데이터프레임이 저장된 메모리의 위치를 알 수 있습니다. 이 결과를 통해 연도별로 그룹화한 데이터는 데이터프레임 형태로 현재 메모리의 0x10d9340f0이라는 위치에 저장되어 있음을 알 수 있습니다.

    print(grouped_year_df)

    <pandas.core.groupby.DataFrameGroupBy object at 0x10d9340f0>

     

    4. 이어서 lifeExp 열을 추출한 결과를 살펴보겠습니다. 그룹화한 데이터프레임에서 lifeExp 열을 추출하면 그룹화한 시리즈를 얻을 수 있습니다. 즉, 연도별로 그룹화한 lifeExp 열을 얻을 수 있습니다.

    grouped_year_df_lifeExp = grouped_year_df['lifeExp']
    print(type(grouped_year_df_lifeExp))

    <class 'pandas.core.groupby.SeriesGroupBy'>

     

    5. 마지막으로 평균을 구하는 mean 메서드를 사용한 결과를 보겠습니다. 과정 4에서 연도별로 그룹화한 lifeExp에 mean 메서드를 사용했기 때문에 각 연도별 lifeExp 열의 평균값을 얻을 수 있습니다.

    mean_lifeExp_by_year = grouped_year_df_lifeExp.mean( )
    print(mean_lifeExp_by_year)

    year
    1952      49.057620
    1957      51.507401
    1962      53.609249
    1967      55.678290
    1972      57.647386
    1977      59.570157
    1982      61.533197
    1987      63.212613
    1992      64.160338
    1997      65.014676
    2002      65.694923
    2007      67.007423
    Name: lifeExp, dtype: float64

     

    6. lifeExp, gdpPercap 열의 평균값을 연도, 지역별로 그룹화하여 한 번에 계산하기

    다음은 과정 1~4를 응용한 코드입니다. year, continent 열로 그룹화한 그룹 데이터프레임에서 lifeExp, gdpPercap 열만 추출하여 평균값을 구한 것입니다.

    multi_group_var = df.groupby(['year', 'continent'])[['lifeExp', 'gdpPercap']].mean( )
    print(multi_group_var)


    year   continent
    1952  Africa          39.135500    1252.572466
              Americas    53.279840    4079.062552
              Asia            46.314394    5195.484004
              Europe       64.408500    5661.057435
              Oceania     69.255000   10298.085650
    1957  Africa          41.266346    1385.236062
              Americas    55.960280     4616.043733
              Asia            49.318544     5787.732940
    ...
    2007  Africa          54.806038     3089.032605
              Americas    73.608120    11003.031625
              Asia            70.728485    12473.026870
              Europe       77.648600    25054.481636
              Oceania     80.719500    29810.188275

    print(type(multi_group_var))

    <class 'pandas.core.frame.DataFrame'>

     

    7. 그룹화한 데이터 개수 세기

    이번에는 그룹화한 데이터의 개수가 몇 개인지 알아보겠습니다. 이를 통계에서는 '빈도수'라고 부릅니다. 데이터의 빈도수는 nunique 메서드를 사용하면 쉽게 구할 수 있습니다. 다음은 continent를 기준으로 데이터프레임을 만들고 country 열만 추출하여 데이터의 빈도수를 계산한 것입니다.

    print(df.groupby('continent')['country'].nunique( ))

    continent 
    Africa           52
    Americas     25
    Asia             33
    Europe        30
    Oceania        2
    Name: country, dtype: int64

     

     

     

     

     

    그래프 그리기

    그래프와 같은 데이터의 시각화는 데이터 분석 과정에서 가장 중요한 요소입니다. 데이터를 시각화하면 데이터를 이해하거나 추이를 파악하는 등의 작업을 할 때 많은 도움이 됩니다. 여기에서는 간단한 그래프를 그려보고 데이터 시각화가 무엇인지 알아보겠습니다. 자세한 내용은 04장에서 더 자세히 설명하겠습니다.

     

     

    1. 먼저 그래프와 연관된 라이브러리를 불러옵니다.

    %matplotlib inline
    import matplotlib.pyplot as plt

     

    2. 그런 다음 year 열을 기준으로 그룹화한 데이터프레임에서 lifeExp 열만 추출하여 평균 값을 구합니다.

    global_yearly_life_expectancy = df.groupby('year')['lifeExp'].mean( )
    print(global_yearly_life_expectancy)

    year
    1952      49.057620
    1957      51.507401
    1962      53.609249
    1967      55.678290
    1972      57.647386
    1977      59.570157
    1982      61.533197
    1987      63.212613
    1992      64.160338
    1997      65.014676
    2002      65.694923
    2007      67.007423
    Name: lifeExp, dtype: float64

     

    3. 과정 2에서 구한 값에 plot 메서드를 사용하면 다음과 같은 그래프가 그려집니다.

    global_yearly_life_expectancy.plot( )

    시간에 따른 평균 생명 예측치를 보여주는 판다스 기본 그래프

     

     

    마무리하며

    이 장에서는 데이터 집합을 불러오는 방법과 데이터를 추출하는 방법 등을 알아보았습니다. 판다스가 무엇인지 감이 좀 잡혔나요? 다음 장에서는 판다스의 기본 자료형인 데이터프레임과 시리즈를 좀 더 자세히 알아보겠습니다.

     

     

     

     

     

    출처 : "판다스 입문"

Designed by Tistory.