ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬으로 시작하는 데이터 사이언스 - 3. 데이터 요약 및 추출
    공부일기/부스트코스 2020. 11. 20. 21:49

    데이터는 앞에서 진행했던 데이터 그대로 진행한다.

     

    11. 기초 통계값 보기

    • 기초 통계 수치

    mean()

    df[["위도", "경도"]].mean()

    실행결과

    "위도"와 "경도" 각각의 평균 값을 알 수 있다.

     

    median()

    df["위도"].medain()

    중간 값인 37.23465231770329 가 출력된다.

     

    max()

    df["위도"].max()

    "위도"에서 최댓값인 38.499658570559795 를 출력.

     

    min()

    df["위도"].min()

    "위도"에서 최솟값인 33.2192896688307 를 출력.

     

    count()

    df["위도"].count()

    91335 를 출력. NaN이 아닌 값의 개수를 출력한다.

     

     

    • 기초통계값 요약하기

    describe()

    describe를 사용해 데이터를 요약가능하다. 기본적으로 수치형 데이터를 요약해서 보여주는데, 기초 통계값 + 1사분위수, 2사분수 등등을 series 형태로 보여준다.

     

    df["위도"].describe()

    실행결과

     

     

    df[["위도","경도"]].describe().T

    실행결과

    .T

    describe()까지만 하게 되면 "위도"와 "경도"를 컬럼으로 하는 데이터프레임 형식을 보여준다.

    2개 이상의 컬럼을 보고 싶을 땐, list형태의 자료구조를 활용해 []안에 넣어주어야 한다. 그리고 위도와 경도를 가로축에 놓을 순 없을까 찾아보니 .T 만 붙여주면 x축과 y축을 바꿔서 나타낸다고해서 적용해봤다.

     

     

    • 중복제거한 값 보기

    unique(), nunique()

    unique()를 사용해 중복을 제거한 값을 보고 nunique()를 통해 개수를 알 수 있다. nunique() == len(.unique())

    df["상권업종대분류명"].unique()

    실행하게 되면 array(['의료'], dtype=object) 가 출력되는데, '의료' 한 가지의 값만 가졌다는 것을 의미한다.

     

    df["상권업종대분류명"].nunique()

    "의료" 한 가지의 값만 가졌으므로 1이 출력된다.

     

    df["상권업종중분류명"].unique()

    >>> array(['병원', '약국/한약방', '수의업', '유사의료업', '의료관련서비스업'], dtype=object)

     

    df["상권업종중분류명"].nunique()

    >>> 5

     

    nunique()의 경우 unique()값을 담은 list의 길이를 나타낸다. 따라서 len(df["상권업종중분류명"].unique()] 도 똑같은 기능을 한다.

     

     

    • 그룹화된 요약값 보기

    value_counts()

    value_counts()를 사용하면 카테고리 형태의 데이터 갯수를 세어볼 수 있다.

     

    city = df["시도명"].value_counts()
    city

    실행결과

    "시도명" 컬럼의 값을 카테고리 별로 묶어 개수를 나타낸다. 내림차순으로 보여주고 있다.

     

    value_counts(normalize=True)

    city_normalize = df["시도명"].value_counts(normalize=True)
    city_normalize

    실행결과

    ()안에 normalize=True 를 설정하게 되면 각 카테고리들이 가지는 비율을 확인할 수 있다. 경기도는 약 23% 서울은 약 20% ...  세종시는 0.3%

     

     

    위에서 지정해준 city 변수를 통해 막대그래프, 파이그래프 등으로 표현할 수 있다. 

    막대그래프는 지난 글에 설명을 적어뒀고, 파이그래프를 실행한 결과는 아래와 같다.

    city_normalize.plot.pie(figsize=(7,7))

    실행결과

    파이그래프를 보면 확인할 수 있듯이 각 지자체들의 차이가 눈에 띄게 보이진 않는다. 카테고리가 많을수록, 각 카테고리가 가지는 개수의 차이가 적을수록 파이그래프를 통해 차이를 확인하기는 더 어려울 것 같다. 이런 이유로 파이그래프는 잘 사용하지 않는다고 한다. 

     

    sns.countplot()

    sns.countplot(data=df, y="시도명")

    실행결과

    seaborn 라이브러리의 countplot을 통해 데이터를 막대그래프로 표현할 수도 있다. 판다스의 막대그래프와 비교했을 때, 각 y축들의 색이 달라 좀 더 시각적으로 보기 좋고, ()안에 데이터를 지정하고, x축 y축을 지정할 수 있어 필터링 작업을 하지 않아 편하지만, 데이터의 크기가 커지면 속도가 느려진다는 단점이 있다.

     

     

    12. 데이터 색인하기

    # "상권업종중분류명"이 "약국/한약방"인 데이터만 가져와 df_medical 이라는 변수에 담기
    df_medical = df[df["상권업종중분류명"] == "약국/한약방"].copy()
    df_medical.head(1)

     

    먼저 df["상권업종중분류명"] == 약국/한약방을 하게 되면 "상권업종중분류명"에서 약국/한약방에 대한 boolean 값을 보여준다. boolean 값이 아닌 데이터프레임의 형식으로 보는 것을 원하기 때문에 df[] 를 한 번 더 씌워서 데이터프레임의 형식으로 나타낸다.

     

     

    copy()

    copy()를 하지 않고 변수에 담을 경우 변수를 활용해 데이터를 수정할 때, 원래 데이터가 바뀌게 된다. 그래서 copy()를 사용하도록 한다.

     

     

    .loc()

    m = df["상권업종대분류명"] == "의료"
    m
    df.loc[m, "상권업종중분류명"].value_counts()
    # df.loc[df["상권업종대분류명"] == "의료", "상권업종중분류명"].value_counts()

    실행결과

    "상권업종대분류명"에서 의료에 해당하는 값을 m에 대입한다. df.loc[m, "상권업종중분류명"] 으로 "상권업종대분류명"이 의료인 값들에서 "상권업종중분류명"은 어떤 값들을 가졌는지 확인할 수 있고, .value_counts()를 통해 카테고리 별로 묶어 개수를 나타낸다.

    주석처리한 부분은 변수에 대입하지 않고 한 줄에 표현하는 방식인데 변수처리를 잘해서 직관적으로 파악할 수 있게 하는게 더 직관적으로 파악하기 좋은 것 같다.

     

     

     

    df_medi = df[df["상권업종중분류명"]=="유사의료업"]
    df_medi["상호명"].value_counts().head(10)

    실행결과

    "상권업종중분류명"에서 유사의료업에 해당하는 값들을 데이터프레임 형식으로 df_medi 라는 변수에 담았다. 그 후 "상호명"을 카테고리별로 분류해 개수를 나타낸 결과. 풀어서 말하자면 "상권업종중분류명"이 유사의료업인 값들의 "상호명"을 같은 것끼리 모아서 상위 10개로 나타낸 것이다...ㅎ

     

     

    • 여러 조건으로 색인하기
    df_drugInSeoul = df[(df["상권업종소분류명"]=="약국") & (df["시도명"]=="서울특별시")]
    print(df_drugInSeoul.shape)
    df_drugInSeoul

    실행결과/ 29개의 컬럼을 다 담을 수 없어 옆으로 짤렸다.

     

    컬럼 A의 값이 B인 것들과 컬럼 C의 값이 D인 것들만 표현하고 싶다면? 

     

    df[A]==B & df[C]==D 로 표현할 경우 오류가 난다.

    (df[A]==B) & (df[C]==D) 로 표현할 경우 boolean 타입의 값을 보여준다.

    데이터프레임의 형식으로 보기 위해 df[]를 씌워주어 df[(df[A]==B) & (df[C]==D)]로 실행하면

    컬럼 A의 값이 B인 것들과 컬럼 C의 값이 D인 것들만 표현할 수 있다.

     

    위의 실행결과는 데이터 하나만 보여주고 있지만, 데이터를 갖고 실행하게 되면 "상권업종소분류명"은 모두 약국, "시도명"은 서울특별시인 데이터들만 나타낸다.

     

    • 구별로 보기

    서울시에 있는 약국을 모두 확인했다. 그럼 서울시 각 구별로 약국의 개수를 확인하고 싶다면?

    df_drugInSeoul["시군구명"].value_counts()

    실행결과

    df_drugInSeoul 에 대입한 데이터프레임에서 "시군구명"으로 데이터를 필터링하고 .value_counts()를 통해 개수로 표현할 수 있다. ()안에 normalize를 True로 설정했다면? 서울 각 구별 약국 개수의 비율을 구할 수 있다.

     

    df_drugInSeoul["시군구명"].value_counts(normalize=True).plot.barh()

    실행결과

    막대그래프를 통해 표현하면 강남구에 약국 개수가 가장 많고, 그 다음 동대문구, 광진구 순으로 많다는 것을 알 수 있다.

Designed by Tistory.