본문 바로가기
Data/[SeSAC 성동1기 전Z전능 데이터 분석가]

[성동1기 전Z전능 데이터 분석가] Day 37

by MIN_JOON 2023. 12. 5.
  • 통계 분석
    • 기술 통계 분석: 데이터를 요약해 설명하는 통계분석 기법
    • 추론 통계 분석: 단순히 숫자를 요약하는 것을 넘어 어떤 값이 발생할 확률을 계산
  • 통계적 가설 검정: 유의확률을 이용해 가설을 검정하는 방법(일반적으로 유의확률 5%를 판단 기준으로 삼는다.)
    • 유의확률(P-Value): 실제로는 집단 간 차이가 없는데 우연히 차이가 있는 데이터가 추출될 확률
    • 유의확률이 5%보다 클 경우
      →집단 간 차이가 통계적으로 유의하지 않다.
      →실제로 차이가 없더라도, 우연에 의해 이런 정도의 차이가 관찰될 가능성이 크다.
    • 유의활률이 5%보다 작을 경우
      →집단 간 차이가 통계적으로 유의하다.
      →실제로 차이가 없는데 우연에 의해 이런 정도의 차이가 관찰될 가능성이 적다.(우연이라고 보기 힘들다.)
  • T-검정(T-Test)
    • 두 집단의 평균에 통계적으로 유의한 차이가 있는지 알아볼 때 사용하는 통계 분석 기법
  • 상관분석
    • 두 연속 변수가 서로 관련이 있는지 검정하는 통계 분석 기법
    • 상관계수: 상관분석을 통해 도출한 값, 0~1 사이의 값을 지니며 1에 가까울 수록 관련성이 크다.
      →양수는 정비례, 음수는 반비례

  • 파이썬 프로젝트 2일차
  • 강남구, 종로구의 따릉이 대여소 지도 시각화
#강남구, 종로구 추출
df=place_list.query('address_district =="강남구"| address_district=="종로구"')

#지도 시각화
import folium
m = folium.Map(location=[37.5536067,126.9674308],  
               zoom_start=12)

from folium import Circle
for _, row in df.iterrows():
    Circle(location = [row['address_lat'],row['address_long']],
           radius=20,
           popup=row['place_name'],
         ).add_to(m)

  • 기존 진행 부분에서 이상치를 발견하고 수정
#파생변수 생성
usage_detail['distance_per_count']=usage_detail['use_distance']/usage_detail['use_count']
usage_detail['time_per_count']=usage_detail['use_time_min']/usage_detail['use_count']

#박스플롯으로 이상치 확인
sns.boxplot(data=usage_detail,y='distance_per_count')
#주중,주말 평균 이동거리
pct25=usage_new['distance_per_count'].quantile(.25)
pct75=usage_new['distance_per_count'].quantile(.75)

#상한,하한
iqr=pct75-pct25
pct25-1.5*iqr #하한
pct75+1.5*iqr #상한

#6462m 이상이면 NaN 부여(하한은 음의 값이라 제외)
usage_new['distance_per_count']=np.where(usage_new['distance_per_count']>6462,np.nan,usage_new['distance_per_count'])
usage_new['distance_per_count'].isna().sum() #결측치 빈도 확인 (NaN:203445개 생성)

#결측치를 제거하고 분석
mean_distance=usage_new.dropna(subset=['distance_per_count'])\
                    .groupby('weekday',as_index=False)\
                    .agg(mean_distance=('distance_per_count','mean'))

#주중,주말 평균 이용시간
pct25=usage_new['time_per_count'].quantile(.25)
pct75=usage_new['time_per_count'].quantile(.75)

#상한,하한
iqr=pct75-pct25
pct25-1.5*iqr #하한
pct75+1.5*iqr #상한

#62분 이상 사용이면 NaN 부여(하한은 음의 값이라 제외)
usage_new['time_per_count']=np.where(usage_new['time_per_count']>62,np.nan,usage_new['time_per_count'])
usage_new['time_per_count'].isna().sum() #결측치 빈도 확인(NaN:165467개)

#결측치를 제거하고 분석
mean_time=usage_new.dropna(subset=['time_per_count'])\
            .groupby('weekday',as_index=False)\
            .agg(mean_time=('time_per_count','mean'))

#그래프 시각화
fig, ax=plt.subplots(nrows=2);
sns.barplot(data=mean_distance,x='weekday',y='mean_distance',ax=ax[0]);
sns.barplot(data=mean_time,x='weekday',y='mean_time',ax=ax[1]);