공부일기/부스트코스

파이썬으로 시작하는 데이터 사이언스 - 3. 데이터 요약 및 추출

Youngbin Kim 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()

실행결과

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