221011 TIL 코로나 데이터/아파트 분양가 데이터 다뤄보기

지구데이터·2022년 10월 11일
0
post-thumbnail

0303 서울 코로나 데이터

from glob import glob

특정 문자가 포함된 파일 불러오기

파일 찾아오기- 내부에서 정규 표현식 쓸 수 있음

장점: 띄어쓰기 등 직접 타이핑보다 실수를 줄일 수 있음

file_paths = glob("data/apt*.csv")
file_paths
glob("seoul*.csv")

pd.crosstab

연도, 퇴원현황 두 개의 변수에 대한 빈도 비율 구하기

pd.crosstab(df.연도, df.퇴원현황, normalize=True)*100

텍스트 앞뒤 공백 제거하기 : strip()

df["거주구"] = df["거주구"].str.strip()

빈도수 표현 그라데이션 : background_gradient()

gu_ym.style.background_gradient(#컬러옵션 cmap="")
plt.colormaps()

gu_month.T 로 행과 열을 바꾼 뒤에 보기: 전치행렬 ]
gu_ym.T.style.background_gradient(cmap="twilight")

그냥 인덱싱 vs loc

df[df["거주구"]=="강남구"][["확진일","접촉력"]]
df.loc[df["거주구"]=="강남구", ["확진일","접촉력"]]

loc vs iloc

loc: 인덱스의 데이터값을 기준으로 데이터를 출력
iloc: 인덱스의 위치로 데이터를 출력
"골목 떡볶이" , "로데오거리 18-1"

count() vs value_counts()

count: NA가 아닌 데이터의 개수 세기
value_counts : 컬럼의 각 값에 대한 모든 발생 횟수를 반환 (빈도 수가 높은 순으로 정렬)
sort_index() : 인덱스 순으로 정렬

contains() : 포함하는 문자열 찾기

"접촉력대문자" 컬럼으로 PC방 데이터를 찾고 접촉력 컬럼에 대해서만 빈도수 구하기
df["접촉력
대문자"].str.contains("PC").value_counts()

df.loc[df["접촉력"].str.contains("해외유입"), "해외유입"] = "해외"
df.loc[~df["접촉력"].str.contains("해외유입"), "해외유입"] = "국내"

해당 위치에, 값 할당하기

isin 을 사용해 리스트로 여러 값을 찾아오기

"거주구"가 "강남구", "서초구", "송파구" 인 데이터만 찾기
loc를 통해 해당 조건의 "접촉력" 컬럼만 가져오기
df[df["거주구"].isin(["강남구","서초구","송파구"])].loc[:,"접촉력"]

해외유입 여부에 따라 막대그래프를 그립니다 : stacked 옵션 = 누적 막대그래프

stacked=True 로 두 가지를 함께 그립니다
gu_oversea.iloc[:,:2].plot(kind="bar",stacked=True,figsize=(12,3))

pivot vs pivot_table : 연산 가능 여부 (pivot_table이 연산 가능 aggfunc)

pd.pivot_table(data=df, 
               index="거주구", 
               columns="해외유입",
               values="환자", aggfunc="count") # 인덱싱 안해도 values옵션 쓸 수 있음, # count 빈도수
weekday_list = list("월화수목금토일")
gu_weekday = pd.pivot_table(data=df,
                            index="거주구",
                            columns="요일명",
                            # values="환자",
                            aggfunc="count")["환자"]
gu_weekday = gu_weekday[weekday_list]
gu_weekday.head()
  • pivot은 unstack과 비슷한 개념

crosstab보다 groupby를 알면 더 다양한 연산을 할 수 있다!

groupby

"거주구", "해외유입" 으로 그룹화 하여 "환자" 컬럼으로 빈도수 구하기
df.groupby(by=["거주구","해외유입"])["환자"].count()
환자라는 유일값을 기준으로 count값을 세자!

"거주구", "해외유입" 으로 그룹화 하여 "환자" 컬럼으로 빈도수 구하고
마지막 인덱스를 컬럼으로 만들기
df.groupby(by=["거주구","해외유입"])["환자"].count().unstack(level=-1) # 기본값
["연도", "월"] 로 그룹화 하고 "해외유입" 의 describe 값 보기
df.groupby(by = ["연도","월"])["해외유입"].describe()

cheat sheet

df.filter()
방대한 양의 데이터에서 특정 변수만 가져올 때 사용

iat, it (없어질 메소드)

df.any() df.all()

정규표현식
'\': 문자 그대로 인식을 해달라
'length$' : 로 끝나는 단어
'^Sepal' : 로 시작하는 단어

cumsum() : 누적합
rank()
cut qcut
merge
isin
query
drop

타이타닉 데이터 과제

deck : 선실 고유 번호 가장 앞자리 알파벳
embarked : 탑승 항구
sibsp : 형제자매+배우자 인원수
pclass : 좌석등급 (숫자)
parch : 부모+자식 인원수
class : 좌석등급 (영문)
who : 성별

embarked_lower열에서 south가 들어가는 데이터의 수
df["embark_lower"].str.contains("south").sum()

df.loc[조건, 컬럼] : loc 사용법
df[df["pclass"]==1]["fare"].median() # 인덱싱으로 추출
df.loc[df["pclass"] == 1, "fare"].median # loc로 추출

쉽게 큰 값 순으로 추출
df["age"].sort_values(ascending=False).head(5)
df["age"].nlargest(10)

07 아파트 분양가

분석하기 좋은 데이터? tidy data

melt : tidy data (깔끔한 데이터) 만들기

파일 불러오기

from glob import glob : 먼저 요런 식으로 불러와서

file_paths = glob("data/apt*.csv")
file_paths

이렇게 할당해주면, 경로 하나하나 쓸 때보다 실수할 일이 적어짐

df_last = pd.read_csv(file_paths[1], encoding="cp949")
df_last

isna isnull : 같은 기능! 이름이 두개

isnull 을 통해 결측치를 구합니다.
df_last.isnull().sum()
isna 를 통해 결측치를 구합니다.
df_last.isna().mean()*100
sns.heatmap(df_last.isnull(), cmap="gray")

숫자로 바꾸기

df_last["분양가격"] = pd.to_numeric(df_last["분양가격"], errors='coerce')
강제로 에러를 숫자로 바꿔달라
errors='raise' : 에러를 반환
errors='coerce'에러가 아니라, 강제로 바꿔라
errors='ignore'인풋 값으로 반환

가끔 빨간색 에러 -> 미래에는 ~이러이러하게 바뀔거니 미리 조심해라. 그치만 지금은 잘 돌아간다.

규모구분을 전용면적으로 변경하기 : replace(,)와 정규표현식

df_last["전용면적"] = df_last["규모구분"].str.replace("전용면적|제곱미터이하","",regex=True)
df_last["전용면적"] = df_last["전용면적"].str.replace("제곱미터초과","~")
df_last["전용면적"] = df_last["전용면적"].str.replace(" ","")
df_last["전용면적"]

df.drop() : labels+axis/index/columns 삭제

df.hist()

sns.pairplot(df,* hue=)

🍑 숫자를 제외한 나머지 문자를 제거하는 정규표현식

df_last["분양가격"].str.replace("[^0-9]", "", regex=True)
^ (캐럿) : 반대를 의미

profile
멋쟁이가 될꺼야~

0개의 댓글