-
파이썬으로 시작하는 데이터 사이언스 - 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
컬럼 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()
막대그래프를 통해 표현하면 강남구에 약국 개수가 가장 많고, 그 다음 동대문구, 광진구 순으로 많다는 것을 알 수 있다.
'공부일기 > 부스트코스' 카테고리의 다른 글
웹 백엔드 - 1. SQL & JDBC 프로그래밍(1) (0) 2021.01.01 파이썬으로 시작하는 데이터 사이언스 - 4. 데이터 전처리 (0) 2020.11.24 파이썬으로 시작하는 데이터 사이언스 - 2. 공공데이터 로드 및 데이터 미리보기 (0) 2020.11.19 파이썬으로 시작하는 데이터 사이언스 - 1. Pandas (0) 2020.11.18 자바스크립트의 시작 - 3. Javascript 활용 (0) 2020.10.01