- 필요한 모듈 가져오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
- 인코딩
더보기

결과
# incoding 방식이 달라서 encoding으로 방식을 맞춰주고 실행하면 파일이 열린다
park = pd.read_csv("파일경로", encoding="ms949")
park.head()

파일을 읽어오는데 인코딩 방식이 달라서 읽히지가 않음. 인코딩 방식을 맞춰주고 실행
- 원하는 데이터 저장하기, 지도에 나타내기
더보기

결과

결과

결과

결과

결과

결과

결과

결과

결과

결과

결과

결과

결과

결과
# 폰트 적용하기
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
plt.rc("font", family="NanumBarunGothic")
# 원하는 컬럼만 남기고 나머지 삭제하기
# 전에 사용했던 방식은 원하는 컬럼을 새로운 배열로 만들고 적용한 방식
park.drop(columns=["공원보유시설(운동시설)", "공원보유시설(유희시설)", "공원보유시설(편익시설)", "공원보유시설(교양시설)",
"공원보유시설(교양시설)", "공원보유시설(기타시설)", "지정고시일","관리기관명", "Unnamed: 19"], inplace=True)
park.head()

# 데이터 지도에 나타내기
park.plot.scatter(x="경도", y="위도", figsize=(8, 10), grid=True)

결과를 보면 지도에 위도 경도가 이상한 부분이 있음.
# boxplot
# 데이터의 분포를 시각화 하는데 유용
# 주로 데이터의 중앙값(중위수, median), 사분위수(Q1[25%], Q2[50%], Q3[75%], Q4[100%]), 이상치 등을 표현하는데 활용
# 상자: Q1과 Q3 사이의 범위
# 상자 내부 선: Q2(중앙값)
# 수염: 데이터의 최소값과 최대값. 아래 수염(Q1 - 1.5*IQR), 위쪽 수염(Q3 + 1.5*IQR)
# IQR = Q3 - Q1, 데이터의 변동성을 평가하는데 사용
# 수염을 벗어나는 값들은 이상치로 간주됨
sns.boxplot(y=park["위도"])

sns.boxplot(y=park["경도"])

위도와 경도의 범위를 나타내어 확인 후 이상치로 판별되는 데이터를 확인한다.
# 위도와 경도의 이상치로 판별되는 데이터를 확인
park.loc[(park["위도"] < 32) | (park["경도"] > 132)]

# 위도와 경도의 이상치로 판별되는 데이터를 제외
park = park.loc[(park["위도"] >= 32) & (park["경도"] <= 132)]
park.head()

# "소재지도로명주소"가 입력되지 않고, "소재지지번주소"만 입력된 데이터를 확인
park.loc[park["소재지도로명주소"].isnull() & park["소재지지번주소"].notnull()]

# "소재지도로명주소"와 "소재지지번주소"가 모두 입력되지 않은 데이터를 확인
park.loc[park["소재지도로명주소"].isnull() & park["소재지지번주소"].isnull()]

"소재지도로명주소"와 "소재지지번주소"가 모두 입력되지 않은 데이터는 없기에 "소재지지번주소"로 통일시킴.
# "소재지도로명주소"가 입력되지 않은 데이터는 "소재지지번주소" 로 대신 채움
park["소재지도로명주소"].fillna(park["소재지지번주소"], inplace=True)
# 채워진지 확인
park.loc[park["소재지도로명주소"].isnull() & park["소재지지번주소"].notnull()]

확인결과 null값을 가지는 것은 없음
# park["소재지도로명주소"].str.split(" ")
# 예) [부산광역시, 강서구, 구랑동, 1199-7]
# park["소재지도로명주소"].str.split(" ", expand=True)
# : 데이터프레임으로 데이터가 분리되고 인덱싱과 슬라이싱이 가능하게 한다.
park["소재지도로명주소"].str.split(" ", expand=True)

# "소재지도로명주소"에서 "시도"만 추출하여 "시도" 파생변수를 생성
park["시도"] = park["소재지도로명주소"].str.split(' ', expand=True)[0]
park.head()

# 분류한 데이터 중 "시도" 컬럼 값들의 개수를 나타냄
park["시도"].value_counts()

값을 보면 강원도와 강원이 따로 나눠져 있음. 이 부분을 해결해 준다.
# "시도"에 "강원"을 "강원도"로 변경
park["시도"][park["시도"] == "강원"] = "강원도"
# 다시한번 확인
park["시도"].value_counts()

강원도로 바뀐 것을 볼 수 있다.
# 데이터 지도에 나타내기
plt.figure(figsize=(8, 10))
sns.scatterplot(data=park, x="경도", y="위도", hue="시도")

- 시도별 평균, 합계 막대그래프로 나타내기
더보기

결과

결과

결과

결과

결과

결과

결과

결과
# "시도"별 값의 개수를 나타냄
park_sido = pd.DataFrame(park["시도"].value_counts())
park_sido

# value_counts(normalize=True): 전체 합계에 대한 비율이 계산
park_sido_normalize = pd.DataFrame(park['시도'].value_counts(normalize=True))
park_sido_normalize

# value_counts(ascending=False): 내림차순으로 정렬
park_sido_ascending = pd.DataFrame(park['시도'].value_counts(ascending=False))
park_sido_ascending

# 시도별 합계 데이터(park_sido)와 비율 데이터(park_sido_normalize)를 병합
pd.concat([park_sido, park_sido_normalize], axis=1)

# 인덱스 설정
park_sido = park_sido.merge(park_sido_normalize, left_index=True, right_index=True).reset_index()
park_sido

# 컬럼 이름 변경
park_sido.columns = ['시도', '합계', '평균']
park_sido

# 막대그래프에 나타내기
plt.figure(figsize=(12, 8))
plt.xticks(rotation=45) # x축 값들을 45도 돌리기
sns.barplot(data=park_sido, x='시도', y='합계')

# x축, y축 바꾸기
plt.figure(figsize=(12, 8))
sns.barplot(data=park_sido, x="합계", y="시도")

'Python > 데이터분석' 카테고리의 다른 글
Python 떡볶이 프렌차이즈 입점전 (0) | 2024.06.03 |
---|---|
Python 서울시 따릉이 API 활용 (0) | 2024.06.03 |
Python seaborn, folium, 상권별 업종 밀집 통계 데이터 (0) | 2024.05.28 |
Python 가상 온라인 쇼핑몰 데이터 (0) | 2024.05.28 |
Python MatPlotlib (0) | 2024.05.27 |