목록으로
📊 AI와 비즈니스 - 엑셀

ChatGPT로 엑셀 차트 만들기 - AI 데이터 시각화 완벽 가이드

숫자만 봐서는 모르겠다고요? AI가 데이터를 한눈에 보이는 멋진 차트로 만드는 법을 알려드립니다.

데이터 중복 정리하기

데이터 정리하다 보면 중복이 정말 골치 아프죠. 같은 고객이 여러 번 등록되어 있거나, 비슷한 회사명이 다르게 입력되어 있거나... 하나하나 눈으로 찾아서 지우기엔 양이 너무 많아요.

게다가 완전히 똑같은 중복만 있는 게 아니에요. 공백이 다르거나, 대소문자만 다르거나, 띄어쓰기가 조금 다른 "유사 중복"도 많습니다. 이런 건 엑셀의 기본 중복 제거 기능으로는 찾을 수가 없어요.

AI를 활용하면 이런 복잡한 중복도 쉽게 찾고 정리할 수 있습니다. 완전 중복부터 유사 중복, 논리적 중복까지 모두 감지할 수 있어요. 심지어 유사도 분석까지 해서 "80% 이상 비슷하면 중복"이라는 기준도 적용할 수 있습니다.

이번 글에서는 AI로 데이터 중복을 찾고 정리하는 다양한 방법을 알아봅니다. 단순한 중복 제거부터 고급 퍼지 매칭까지, 실무에서 바로 쓸 수 있는 기법들을 살펴볼게요.

1. 중복 유형 파악하기

AI 프롬프트

"다음 상황별로 중복을 찾는 방법을 알려주세요:
1. 완전히 동일한 행
2. 특정 열만 중복된 경우
3. 유사하지만 약간 다른 데이터 (예: 공백, 대소문자)
4. 논리적 중복 (같은 사람의 다른 이메일)"

AI 답변

1. 완전 중복: 모든 열 값이 동일
   → 중복 항목 제거 기능 사용

2. 부분 중복: 주요 키 값만 확인
   → COUNTIFS로 특정 열 기준 카운트

3. 유사 중복: 공백/대소문자 차이
   → TRIM, UPPER 함수로 정규화 후 비교

4. 논리적 중복: 비즈니스 규칙 기반
   → 복합 조건으로 판별

2. 기본 중복 제거

엑셀 기본 기능으로 중복 제거

AI 프롬프트:

"A1:E100 범위에서 이메일(C열) 기준으로
중복을 제거하는 VBA 코드를 만들어주세요.
첫 번째 항목은 유지하고 나머지는 삭제하세요."

AI 생성 VBA:

Sub 이메일중복제거()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim deleteCount As Long

    Set ws = ThisWorkbook.Sheets("고객데이터")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' 작업 전 확인
    If MsgBox("중복된 이메일을 가진 행을 삭제하시겠습니까?" & vbCrLf & _
              "(첫 번째 항목은 유지됩니다)", _
              vbYesNo + vbQuestion, "중복 제거 확인") = vbNo Then
        Exit Sub
    End If

    ' 화면 업데이트 중지 (속도 향상)
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' 중복 제거 실행
    ws.Range("A1:E" & lastRow).RemoveDuplicates _
        Columns:=3, _  ' C열(이메일) 기준
        Header:=xlYes

    ' 삭제된 행 수 계산
    deleteCount = lastRow - ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' 화면 업데이트 재개
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

    MsgBox deleteCount & "개의 중복 항목이 제거되었습니다.", vbInformation
End Sub

3. 중복 표시하기 (삭제하지 않고)

조건부 서식으로 중복 강조

AI 프롬프트:

"중복된 값을 삭제하지 않고 빨간색으로 표시해주세요.
전화번호(D열) 기준으로 2개 이상 나타나는 값을 찾아주세요."

AI 생성 VBA:

Sub 중복표시_조건부서식()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim rng As Range

    Set ws = ThisWorkbook.Sheets("고객데이터")
    lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
    Set rng = ws.Range("D2:D" & lastRow)

    ' 기존 조건부 서식 삭제
    rng.FormatConditions.Delete

    ' 중복 값 강조 조건 추가
    With rng.FormatConditions.Add( _
        Type:=xlExpression, _
        Formula1:="=COUNTIF($D$2:$D$" & lastRow & ",$D2)>1")

        .Interior.Color = RGB(255, 199, 206)  ' 연한 빨강
        .Font.Color = RGB(156, 0, 6)          ' 진한 빨강
        .Font.Bold = True
    End With

    MsgBox "중복된 전화번호가 강조 표시되었습니다.", vbInformation
End Sub

중복 개수 표시

AI 프롬프트:

"각 행 옆에 해당 이메일이 몇 번 나타나는지 표시해주세요."

AI 생성 수식:

// F열에 중복 횟수 표시
=COUNTIF($C$2:$C$1000, C2)

// 중복 여부만 표시
=IF(COUNTIF($C$2:$C$1000, C2)>1, "중복", "")

// 몇 번째 중복인지 표시
=IF(COUNTIF($C$2:$C$1000, C2)>1,
   COUNTIF($C$2:C2, C2) & "번째",
   "유일")

4. 고급 중복 처리

여러 열 조합으로 중복 확인

AI 프롬프트:

"이름(A열)과 생년월일(B열)이 동시에 같은 경우만
중복으로 판단하고 표시해주세요."

AI 생성 수식:

// 헬퍼 열(E열) 생성: 이름+생년월일 결합
=A2&"|"&TEXT(B2,"YYYY-MM-DD")

// F열에 중복 여부 표시
=IF(COUNTIF($E$2:$E$1000, E2)>1, "중복", "")

AI 생성 VBA (헬퍼 열 없이):

Sub 복합키중복확인()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long, j As Long
    Dim dict As Object
    Dim key As String
    Dim dupCount As Long

    Set ws = ThisWorkbook.Sheets("직원데이터")
    Set dict = CreateObject("Scripting.Dictionary")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Application.ScreenUpdating = False

    ' 첫 번째 패스: 중복 찾기
    For i = 2 To lastRow
        key = ws.Cells(i, 1).Value & "|" & _
              Format(ws.Cells(i, 2).Value, "YYYY-MM-DD")

        If dict.Exists(key) Then
            dict(key) = dict(key) + 1
        Else
            dict.Add key, 1
        End If
    Next i

    ' 두 번째 패스: 중복 표시
    For i = 2 To lastRow
        key = ws.Cells(i, 1).Value & "|" & _
              Format(ws.Cells(i, 2).Value, "YYYY-MM-DD")

        If dict(key) > 1 Then
            ws.Cells(i, 6).Value = "중복 (" & dict(key) & "건)"
            ws.Rows(i).Interior.Color = RGB(255, 235, 156)
            dupCount = dupCount + 1
        Else
            ws.Cells(i, 6).Value = ""
            ws.Rows(i).Interior.ColorIndex = xlNone
        End If
    Next i

    Application.ScreenUpdating = True

    MsgBox dupCount & "개의 중복 항목이 발견되었습니다.", vbInformation
End Sub

5. 유사 중복 찾기

공백/대소문자 무시

AI 프롬프트:

"회사명에 공백과 대소문자 차이만 있는 중복을 찾아주세요.
예: 'Samsung', 'SAMSUNG', ' Samsung '은 모두 같은 것으로 처리"

AI 생성 VBA:

Sub 유사중복찾기()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim normalizedDict As Object
    Dim originalValue As String
    Dim normalizedValue As String

    Set ws = ThisWorkbook.Sheets("회사목록")
    Set normalizedDict = CreateObject("Scripting.Dictionary")
    normalizedDict.CompareMode = vbTextCompare ' 대소문자 무시
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' E열에 헤더 추가
    ws.Cells(1, 5).Value = "정규화된 값"
    ws.Cells(1, 6).Value = "중복 상태"

    For i = 2 To lastRow
        originalValue = ws.Cells(i, 1).Value

        ' 정규화: 공백 제거 + 대문자 변환
        normalizedValue = UCase(Trim(Replace(originalValue, " ", "")))
        ws.Cells(i, 5).Value = normalizedValue

        ' 중복 확인
        If normalizedDict.Exists(normalizedValue) Then
            ws.Cells(i, 6).Value = "중복 (원본: " & _
                normalizedDict(normalizedValue) & ")"
            ws.Rows(i).Interior.Color = RGB(255, 199, 206)
        Else
            normalizedDict.Add normalizedValue, originalValue
            ws.Cells(i, 6).Value = "최초"
        End If
    Next i

    MsgBox "유사 중복 검사가 완료되었습니다.", vbInformation
End Sub

퍼지 매칭 (유사도 기반)

AI 프롬프트:

"레벤슈타인 거리를 사용해서
80% 이상 유사한 회사명을 찾아주세요."

AI 생성 VBA:

' 레벤슈타인 거리 함수
Function LevenshteinDistance(str1 As String, str2 As String) As Integer
    Dim i As Integer, j As Integer
    Dim cost As Integer
    Dim d() As Integer
    Dim min1 As Integer, min2 As Integer, min3 As Integer

    ReDim d(Len(str1), Len(str2))

    For i = 0 To Len(str1)
        d(i, 0) = i
    Next

    For j = 0 To Len(str2)
        d(0, j) = j
    Next

    For i = 1 To Len(str1)
        For j = 1 To Len(str2)
            If Mid(str1, i, 1) = Mid(str2, j, 1) Then
                cost = 0
            Else
                cost = 1
            End If

            min1 = d(i - 1, j) + 1
            min2 = d(i, j - 1) + 1
            min3 = d(i - 1, j - 1) + cost

            d(i, j) = WorksheetFunction.Min(min1, min2, min3)
        Next
    Next

    LevenshteinDistance = d(Len(str1), Len(str2))
End Function

' 유사도 계산 (0~100%)
Function SimilarityPercent(str1 As String, str2 As String) As Double
    Dim maxLen As Integer
    Dim distance As Integer

    maxLen = WorksheetFunction.Max(Len(str1), Len(str2))
    If maxLen = 0 Then
        SimilarityPercent = 100
        Exit Function
    End If

    distance = LevenshteinDistance(str1, str2)
    SimilarityPercent = (1 - distance / maxLen) * 100
End Function

Sub 유사회사명찾기()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long, j As Long
    Dim similarity As Double
    Dim threshold As Double

    Set ws = ThisWorkbook.Sheets("회사목록")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    threshold = 80 ' 유사도 임계값 80%

    ' 결과 시트 생성
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("유사항목").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0

    Dim resultWs As Worksheet
    Set resultWs = Sheets.Add(After:=ws)
    resultWs.Name = "유사항목"
    resultWs.Cells(1, 1).Value = "항목1"
    resultWs.Cells(1, 2).Value = "항목2"
    resultWs.Cells(1, 3).Value = "유사도(%)"

    Dim resultRow As Long
    resultRow = 2

    Application.ScreenUpdating = False

    ' 모든 쌍 비교
    For i = 2 To lastRow - 1
        For j = i + 1 To lastRow
            similarity = SimilarityPercent( _
                ws.Cells(i, 1).Value, _
                ws.Cells(j, 1).Value)

            If similarity >= threshold Then
                resultWs.Cells(resultRow, 1).Value = ws.Cells(i, 1).Value
                resultWs.Cells(resultRow, 2).Value = ws.Cells(j, 1).Value
                resultWs.Cells(resultRow, 3).Value = Round(similarity, 2)
                resultRow = resultRow + 1
            End If
        Next j

        ' 진행 상황 표시
        If i Mod 10 = 0 Then
            Application.StatusBar = "처리 중... " & _
                Format(i / lastRow, "0%")
        End If
    Next i

    Application.StatusBar = False
    Application.ScreenUpdating = True

    MsgBox (resultRow - 2) & "개의 유사 항목이 발견되었습니다.", vbInformation
End Sub

6. 중복 병합하기

중복된 행의 데이터 통합

AI 프롬프트:

"같은 고객의 여러 주문을 하나로 병합하고,
주문 금액은 합산, 주문 날짜는 최신 것으로 업데이트하세요."

AI 생성 VBA:

Sub 중복고객병합()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim dict As Object
    Dim i As Long
    Dim customerID As String

    Set ws = ThisWorkbook.Sheets("주문데이터")
    Set dict = CreateObject("Scripting.Dictionary")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Application.ScreenUpdating = False

    ' Dictionary에 고객별 데이터 수집
    For i = 2 To lastRow
        customerID = ws.Cells(i, 1).Value ' A열: 고객ID

        If dict.Exists(customerID) Then
            ' 기존 고객: 금액 합산, 날짜 업데이트
            Dim existingData As Variant
            existingData = dict(customerID)

            existingData(0) = existingData(0) + ws.Cells(i, 3).Value ' 금액 합산

            ' 더 최신 날짜로 업데이트
            If ws.Cells(i, 4).Value > existingData(1) Then
                existingData(1) = ws.Cells(i, 4).Value
            End If

            dict(customerID) = existingData
        Else
            ' 신규 고객
            Dim newData(1) As Variant
            newData(0) = ws.Cells(i, 3).Value ' 금액
            newData(1) = ws.Cells(i, 4).Value ' 날짜
            dict.Add customerID, newData
        End If
    Next i

    ' 결과 시트에 쓰기
    Dim resultWs As Worksheet
    On Error Resume Next
    Set resultWs = Sheets("병합결과")
    If resultWs Is Nothing Then
        Set resultWs = Sheets.Add(After:=ws)
        resultWs.Name = "병합결과"
    Else
        resultWs.Cells.Clear
    End If
    On Error GoTo 0

    ' 헤더 작성
    resultWs.Cells(1, 1).Value = "고객ID"
    resultWs.Cells(1, 2).Value = "고객명"
    resultWs.Cells(1, 3).Value = "총 주문금액"
    resultWs.Cells(1, 4).Value = "최종 주문일"

    ' 데이터 작성
    Dim rowNum As Long
    rowNum = 2

    Dim key As Variant
    For Each key In dict.Keys
        resultWs.Cells(rowNum, 1).Value = key

        ' 원본에서 고객명 찾기
        Dim customerName As String
        customerName = Application.WorksheetFunction.Index( _
            ws.Columns(2), _
            Application.WorksheetFunction.Match(key, ws.Columns(1), 0))
        resultWs.Cells(rowNum, 2).Value = customerName

        resultWs.Cells(rowNum, 3).Value = dict(key)(0)
        resultWs.Cells(rowNum, 4).Value = dict(key)(1)

        rowNum = rowNum + 1
    Next key

    ' 서식 적용
    With resultWs.Range("C2:C" & rowNum - 1)
        .NumberFormat = "#,##0"
    End With

    With resultWs.Range("D2:D" & rowNum - 1)
        .NumberFormat = "yyyy-mm-dd"
    End With

    Application.ScreenUpdating = True

    MsgBox "중복 고객이 병합되었습니다." & vbCrLf & _
           "원본: " & lastRow - 1 & "건 → 병합 후: " & _
           dict.Count & "건", vbInformation
End Sub

7. 중복 검사 리포트

AI 프롬프트:

"데이터 품질 보고서를 생성해주세요:
- 총 레코드 수
- 완전 중복 수
- 부분 중복 수
- 중복률(%)
- 열별 중복 통계"

AI 생성 VBA:

Sub 중복검사리포트()
    Dim ws As Worksheet
    Dim reportWs As Worksheet
    Dim lastRow As Long, lastCol As Long
    Dim i As Long, col As Long
    Dim totalRows As Long
    Dim fullDupCount As Long

    Set ws = ThisWorkbook.Sheets("원본데이터")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    totalRows = lastRow - 1

    ' 보고서 시트 생성
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("중복검사리포트").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0

    Set reportWs = Sheets.Add(After:=Sheets(Sheets.Count))
    reportWs.Name = "중복검사리포트"

    ' 보고서 작성
    With reportWs
        .Cells(1, 1).Value = "데이터 품질 검사 보고서"
        .Cells(1, 1).Font.Size = 14
        .Cells(1, 1).Font.Bold = True

        .Cells(3, 1).Value = "검사일시:"
        .Cells(3, 2).Value = Now

        .Cells(5, 1).Value = "총 레코드 수:"
        .Cells(5, 2).Value = totalRows

        ' 완전 중복 확인
        Dim tempRange As Range
        Set tempRange = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))

        Dim originalCount As Long
        originalCount = tempRange.Rows.Count - 1

        tempRange.Copy
        tempRange.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5), Header:=xlYes

        Dim uniqueCount As Long
        uniqueCount = tempRange.Rows.Count - 1
        fullDupCount = originalCount - uniqueCount

        .Cells(6, 1).Value = "완전 중복:"
        .Cells(6, 2).Value = fullDupCount

        .Cells(7, 1).Value = "중복률:"
        .Cells(7, 2).Value = Format(fullDupCount / totalRows, "0.0%")

        Application.Undo ' 중복 제거 취소

        ' 열별 중복 통계
        .Cells(9, 1).Value = "열별 중복 통계"
        .Cells(9, 1).Font.Bold = True

        .Cells(10, 1).Value = "열 이름"
        .Cells(10, 2).Value = "고유값 수"
        .Cells(10, 3).Value = "중복값 수"
        .Cells(10, 4).Value = "중복률"

        Dim rowNum As Long
        rowNum = 11

        For col = 1 To lastCol
            Dim uniqueValues As Long
            Dim colName As String

            colName = ws.Cells(1, col).Value
            uniqueValues = ws.Range(ws.Cells(2, col), ws.Cells(lastRow, col)).Rows.Count - _
                           ws.Range(ws.Cells(2, col), ws.Cells(lastRow, col)).RemoveDuplicates( _
                           Columns:=1, Header:=xlNo).Rows.Count

            Application.Undo

            uniqueValues = Application.WorksheetFunction.SumProduct( _
                1 / Application.WorksheetFunction.CountIf( _
                ws.Range(ws.Cells(2, col), ws.Cells(lastRow, col)), _
                ws.Range(ws.Cells(2, col), ws.Cells(lastRow, col))))

            .Cells(rowNum, 1).Value = colName
            .Cells(rowNum, 2).Value = uniqueValues
            .Cells(rowNum, 3).Value = totalRows - uniqueValues
            .Cells(rowNum, 4).Value = Format((totalRows - uniqueValues) / totalRows, "0.0%")

            rowNum = rowNum + 1
        Next col

        ' 서식 적용
        .Columns("A:D").AutoFit
        .Range("A10:D10").Font.Bold = True
        .Range("A10:D" & rowNum - 1).Borders.LineStyle = xlContinuous
    End With

    MsgBox "중복 검사 리포트가 생성되었습니다.", vbInformation
End Sub

8. 실전 활용: 고객 데이터 정제

통합 시나리오:

Sub 고객데이터정제_통합()
    ' 1단계: 백업 생성
    Call 데이터백업

    ' 2단계: 유사 중복 찾기
    Call 유사중복찾기

    ' 3단계: 중복 병합
    Call 중복고객병합

    ' 4단계: 리포트 생성
    Call 중복검사리포트

    MsgBox "고객 데이터 정제가 완료되었습니다.", vbInformation
End Sub

Sub 데이터백업()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("고객데이터")

    ws.Copy After:=ws
    ActiveSheet.Name = "백업_" & Format(Now, "yyyymmdd_hhmmss")
End Sub

마무리

AI로 데이터 중복 정리:

  • ✅ 다양한 유형의 중복 감지
  • ✅ 유사도 기반 퍼지 매칭
  • ✅ 중복 병합 및 통합
  • ✅ 데이터 품질 리포트

다음 글에서는 IF문과 VLOOKUP을 자동으로 작성하는 방법을 알아봅니다.