로보테크AI

융합_로보테크 AI 자율주행 로봇 개발자 과정-26/01/15

steezer 2026. 1. 15. 17:32

점심 전까지 주제 정하기 + 데이터 찾아오기

어제 쇼핑몰 데이터 분석으로 하기로 했으나 지도 시각화를 활용해보기 위해 데이터 추가 조사

 

1. Online Retail II: https://archive.ics.uci.edu/dataset/502/online+retail+ii

주제

온라인 쇼핑몰 데이터 고객 구매 패턴 분석

 

데이터

sheet1 : 2009.12.01~2010.12.09

sheet2 : 2010.12.01~2011.12.09

※분석 시 시트 병합 선택

 

도메인

실제 영국 온라인 리테일 B2C 거래 데이터

※B2C: 기업이 최종소비자에게 직접 상품이나 서비스 판매하는 거래 구조

 

컬럼 구조

Invoice(str, 거래(송장)번호), StockCode(str, 상품 코드),

Description(str, 상품명), Quantity(int, 구매 수량),

InvoiceDate(datetime, 거래 시점),, UnitPrice(float, 단가),

CustomerID(float, 고객 ID), Country(str, 국가)

 

특징

  1. 취소 반품 데이터 구조적 포함
  2. 결측치 의도적 존재
  3. 파생변수 ex) TotalPice = 구매 수량 * 단가
  4. 시계열 분석 구조: IncoiceDate 기준(시간대, 요일, 월별 매출, 시즌성 분석 가능)
  5. 상관분석 기능: 수치형(구매수량, 단가, TP)->상관 히트맵

 

2. 소상공인시장진흥공단_상가(상권)정보(지도 데이터 활용): https://www.data.go.kr/data/15083033/fileData.do#tab-layer-file

 

주제

지도 기반 상권 밀집도 및 업종 분포 분석석

 

데이터

1. 상권업종분류 : 표준산업분류 기반 업종분류

2. 업종분류 체계: 대분류(10개), 중분류(75개), 소분류(247개)

 

위경도 결측치, 이상치 (업종명 결측, 가끔 해외로 잡히는 경우)

 

컬럼 구조

상가업소번호, 상호명, 지점명,

상권업종(대,중,소)분류코드, 상권업종(대,중,소)분류명,

표준산업분류코드, 표준산업분류코드명,

시도(코드, 명), 시군구(코드, 명), +.......

경도, 위도 => 지도 데이터 시각화에 활용

 

 

특징

지역: 강원, 경기, 경남, 경북, 광주, 대구, 대전,

부산, 서울, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북으로 csv 구분



테이블 구조 시각화

(컬럼명, 데이터 타입, 결측치 개수) 조합으로

데이터 구조(공간 데이터 구조 + 좌표 컬럼) 설명

검색 기능

상호명, 업종명, 지역명 + 지도 연계

복사본 생성

원본 + 복사본으로 전처리 영향 지도에서 시각적 비교

파생변수 + 시각화

업종_대분류 통합, 프렌차이즈 여부

데이터셋 선택해서 지도 출력

데이터 수정

업종명이나 좌표 수정

요약 통계

지역별 상점 수, 업종별 비율, 평균 밀집도 =>지도로

데이터 타입

위경도=>float, 행정구역=>category, 업종별 정렬

 

 

3. 기후·에너지·환경부, 국립환경연구소_대기오염수준 확인자료

https://www.data.go.kr/en/data/15070898/fileData.do

주제

지도 기반 미세먼지 데이터 분석

 

데이터

시간단위 측정값 포함

전국 도시/도로/배경 측정소망 자료

1048575행

 

컬럼 구조

시도, 도시, 군구, 측정소명, 측정소코드, 측정일시,

아황산가스, 미세먼지, 오존, 이산화질소, 일산화탄소, 초미세먼

 

구현

지역별 미세먼지 농도 분포

고농도 지역 시각적 확인

시간, 조건별 공간 변화 비교

전처리 전후 데이터 품질 비교


선정된 주제: 지역별 교통사고 수

데이터: http://kosis.kr/statHtml/statHtml.do?orgId=110&tblId=DT_11001N_2013_A049&tmprScrId=20260115111619817_80845ddba0034c19

데이터 : 전국별 교통사고 현황

-발생건수(건)/사망자수(명)/부상자수(명)/인구수(명)/사고유형별(건)/자동차종류별(건)

-차대사람/차대차/차량단독/승용차/승합차/화물/특수/이륜차 등등

컬럼 

-지역/년도별(최근 3~5년)

특징 : 

-각 지역별로 구분

-사고유형별/자동차종류별 검색

-파생변수로 치사율, 부상비율, 사고밀도 등

-float:위경도 / category:행정구역,사고유형 / int 연도,월

 

담당: 데이터 전처리

 

 

Data.ipynb
0.08MB
Data_dirty.ipynb
0.03MB

 


데이터 수정-다시 시작

import pandas as pd
import numpy as np

INPUT_PATH = "교통사고건수.csv"
OUTPUT_PATH = "교통사고건수_clear.csv"

df_raw = pd.read_csv(INPUT_PATH, encoding="cp949")
df = df_raw.copy()  # 원본 보존

df.replace('-', np.nan, inplace=True)

for col in df.columns:

    # object 타입 컬럼
    if df[col].dtype == "object":

        # 공백 제거
        df[col] = df[col].astype(str).str.strip()

        # 숫자 변환 시도
        converted = pd.to_numeric(df[col], errors="coerce")

        original_non_null = df[col].replace("nan", np.nan).notna().sum()
        converted_non_null = converted.notna().sum()

        # 대부분 숫자면 numeric 확정
        if original_non_null > 0 and converted_non_null / original_non_null > 0.9:
            df[col] = converted
        else:
            # 문자열 컬럼은 빈칸만 NaN
            df[col] = df[col].replace({"": np.nan, "nan": np.nan})

    # 이미 숫자형 컬럼
    else:
        df[col] = pd.to_numeric(df[col], errors="coerce")

df.to_csv(
    OUTPUT_PATH,
    index=False,
    encoding="utf-8-sig"  # 엑셀 호환용
)

print("전처리 완료:", OUTPUT_PATH)
import pandas as pd
import numpy as np

# 1. 데이터 로드
INPUT_PATH = "교통사고건수_clear.csv"
OUTPUT_PATH = "교통사고건수_dirty.csv"

df_raw = pd.read_csv(INPUT_PATH)
df = df_raw.copy()  # 원본 보존

# 2. 숫자형 컬럼만 선택
numeric_cols = df.select_dtypes(include=["int64", "float64"]).columns

# 3. 전체 셀 수 기준 비율 계산
total_cells = df[numeric_cols].size
nan_count = int(total_cells * 0.10)
outlier_count = int(total_cells * 0.10)

rng = np.random.default_rng(42)  # 재현성 확보

# 4. 결측치(NaN) 주입 (10%)
nan_indices = rng.choice(total_cells, size=nan_count, replace=False)

rows = nan_indices // len(numeric_cols)
cols = nan_indices % len(numeric_cols)

for r, c in zip(rows, cols):
    df.loc[df.index[r], numeric_cols[c]] = np.nan

# 5. 이상치(outlier) 주입 (10%)
#    방식: 기존 값 × 10~30 배
outlier_indices = rng.choice(total_cells, size=outlier_count, replace=False)

rows = outlier_indices // len(numeric_cols)
cols = outlier_indices % len(numeric_cols)

for r, c in zip(rows, cols):
    col = numeric_cols[c]
    val = df.loc[df.index[r], col]

    if pd.notna(val) and val != 0:
        multiplier = rng.uniform(10, 30)
        df.loc[df.index[r], col] = val * multiplier

df.to_csv(
    OUTPUT_PATH,
    index=False,
    encoding="utf-8-sig"
)

print("결측치 + 이상치 주입 완료")
print("저장 파일:", OUTPUT_PATH)

 

할일

tkinter로 모듈만들기