Hàm PHP thông báo đặc điểm dữ liệu ngày tháng sinh đầu vào với lượng dữ liệu lớn (v1.2)

Dù dữ liệu ngày tháng năm sinh nhìn chung có cấu trúc ổn định, rất ít sai sót thì việc kiểm tra trước để có cái nhìn tổng quan về nó không thừa. Vì dữ liệu này sẽ liên kết rất nhiều đến các thống kê liên quan.

Để chạy file này ngoài việc require đến database.php, bạn cần require đến:

<?php

/* 
 * PHP functions to notify general information before changing Vietnam date v1.2
 * MIT License
 * Nguyen Duc Anh - freehost.page
 */

require 'database.php'; // kết nối csdl
require 'function_vietnam_data.php'; // lấy dữ liệu nhanh
require 'function_vietnam_birthday.php'; // ngày sinh
set_time_limit(600); // 10 phut 

$data = table(-1); // lấy dữ liệu
$null = 0; // không có dữ liệu ngày tháng năm
$dmy = 0; // kiểu Việt Nam
$mdy = 0; // kiểu Nước Ngoài
$count = 0; // đếm lượng dữ liệu
$low = 1900; // năm thấp nhất chấp nhận được
$up = date("Y"); // lấy năm hiện tại dạng 4 số
$live = 0; // cho những người sống
$digit2 = 0; // năm 2 số
$digit4 = 0; // năm 4 số
$mothf = 0; // giả định tháng đứng trước ngày
$moths = 0; // giả định tháng đứng sau ngày
$year_arr = array(); $i=0; //tạo mảng

foreach ($data as $arr) {
    $date = $arr['old_date']; // tùy vào tên cột dữ liệu của bạn
    if ($date == NULL || $date == '') {$null++;}
    else {
        if (vn_dmy_style($date)) {$dmy++;}
        if (vn_mdy_style($date)) {$mdy++;}

        if (vn_limit_year($date, $low, $up)) {$live++;}
        if (vn_limit_year($date, 1, 99)) {$digit2++;}
        if (vn_limit_year($date, 1000, 9999)) {$digit4++;}

        if (vn_month_first($date) > 12) {$mothf++;}
        if (vn_month_second($date) > 12) {$moths++;}
    }
    
    if (vn_dmy_style($date)) {
        $exp = mb_split("/", $date); // tách dữ liệu ngày/tháng/năm thành 3 phần dựa trên dấu phân cách /
        $year = $exp[2];
        $year_arr[$i] = (int)$year; // chuyển nó thành dạng số và đưa vào mảng
        $i++;       
    }
    
    $count++;
}

$count_duplicate = array_count_values($year_arr); // gộp nó lại theo giá trị trùng lặp
arsort($count_duplicate); // sắp xếp mảng theo thứ tự giảm dần

$count_real_data = $count - $null; // số lượng có dữ liệu
$dmy_per = 100 *($dmy / $count_real_data);
$mdy_per = 100 *($mdy / $count_real_data);
$live_per = 100 * ($live / $count_real_data);
$digit2_per = 100 * ($digit2 / $count_real_data);
$digit4_per = 100 * ($digit4 / $count_real_data);
$mothf_per = 100 * ($mothf / $count_real_data);
$moths_per = 100 * ($moths / $count_real_data);

echo "BÁO CÁO DỮ LIỆU NGÀY THÁNG NĂM".b();
echo "Có dữ liệu: ".$count_real_data.b();
echo "Dữ liệu rỗng: ".$null.b().b();
echo "Lưu ý: tỷ lệ bên dưới không tính dữ liệu rỗng:".b();
echo "Kiểu ngày/.-tháng/.-năm / NẾU (tỷ lệ): ".round($dmy_per,3).'%'.s().$dmy.b();
echo "Kiểu tháng/.-ngày/.-năm / NẾU (tỷ lệ): ".round($mdy_per,3).'%'.b().b();
echo "Nếu giả định kiểu dữ liệu là tháng/ngày/năm, có bao nhiêu tháng lớn hơn 12: ".$mothf.b();
echo "Tỷ lệ tháng lớn hơn 12 với kiểu dữ liệu là tháng/ngày/năm là: ".round($mothf_per, 3).'%'.b().b();
echo "Nếu giả định kiểu dữ liệu là ngày/tháng/năm, có bao nhiêu tháng lớn hơn 12: ".$moths.b();
echo "Tỷ lệ tháng lớn hơn 12 với kiểu dữ liệu là ngày/tháng/năm là: ".round($moths_per, 3).'%'.b().b();
echo "Năm hợp lệ từ 1900 đến hiện tại: ".round($live_per,3).'%'.b();
echo "Năm 2 số cuối: ".round($digit2_per,5).'%'.b();
echo "Năm 4 số cuối: ".round($digit4_per,3).'%'.b().b();

foreach($count_duplicate as $x => $x_value) {
    echo "Năm: ".$x." Có số lần lặp lại là ".$x_value; // xuất ra màn hình
    echo "<br>";
}

Ví dụ khi tôi thử chạy với một tệp dữ liệu của mình:

BÁO CÁO DỮ LIỆU NGÀY THÁNG NĂM
Có dữ liệu: 243858
Dữ liệu rỗng: 106

Lưu ý: tỷ lệ bên dưới không tính dữ liệu rỗng:
Kiểu ngày/.-tháng/.-năm / NẾU (tỷ lệ): 99.989% | 243832
Kiểu tháng/.-ngày/.-năm / NẾU (tỷ lệ): 39.864%

Nếu giả định kiểu dữ liệu là tháng/ngày/năm, có bao nhiêu tháng lớn hơn 12: 146647
Tỷ lệ tháng lớn hơn 12 với kiểu dữ liệu là tháng/ngày/năm là: 60.136%

Nếu giả định kiểu dữ liệu là ngày/tháng/năm, có bao nhiêu tháng lớn hơn 12: 25
Tỷ lệ tháng lớn hơn 12 với kiểu dữ liệu là ngày/tháng/năm là: 0.01%

Năm hợp lệ từ 1900 đến hiện tại: 99.987%
Năm 2 số cuối: 0%
Năm 4 số cuối: 100%

Năm: 2011 Có số lần lặp lại là 52201
Năm: 2009 Có số lần lặp lại là 51650
Năm: 2008 Có số lần lặp lại là 50059
Năm: 2007 Có số lần lặp lại là 47324
Năm: 2010 Có số lần lặp lại là 40733
Năm: 2006 Có số lần lặp lại là 1337
Năm: 2005 Có số lần lặp lại là 310
Năm: 2017 Có số lần lặp lại là 73
Năm: 2004 Có số lần lặp lại là 73
Năm: 2016 Có số lần lặp lại là 22
Năm: 2001 Có số lần lặp lại là 13
Năm: 2003 Có số lần lặp lại là 11
Năm: 2018 Có số lần lặp lại là 4
Năm: 2015 Có số lần lặp lại là 3
Năm: 2013 Có số lần lặp lại là 3
Năm: 2000 Có số lần lặp lại là 3
Năm: 2012 Có số lần lặp lại là 2
Năm: 2002 Có số lần lặp lại là 2
Năm: 1900 Có số lần lặp lại là 1
Năm: 2088 Có số lần lặp lại là 1
Năm: 2099 Có số lần lặp lại là 1
Năm: 1997 Có số lần lặp lại là 1
Năm: 2208 Có số lần lặp lại là 1
Năm: 2100 Có số lần lặp lại là 1
Năm: 2014 Có số lần lặp lại là 1
Năm: 2209 Có số lần lặp lại là 1
Năm: 2207 Có số lần lặp lại là 1

Mục tiêu của nó là cố gắng cho chúng ta thấy kiểu dữ liệu ngày/tháng/năm có phải là kiểu dữ liệu phổ biến trong tệp hay không. Đây cũng là kiểu dữ liệu chuẩn được dùng ở VN, và là kiểu mà chúng ta mong muốn.

Nó cũng cố thử lật ngược vấn đề là nếu giả định kiểu là tháng/ngày/năm thì dữ liệu phản ánh có chính xác vậy không.

Thông báo cũng kèm thống kê về cách biểu diễn dữ liệu năm sinh là dạng 4 số (ví dụ 1987) hay hai số (ví dụ 87).

Cuối cùng nó đưa ta các thống kê về các năm trong dữ liệu mẫu, nó sẽ cho bạn thấy các ngoại lệ đáng chú ý, dữ liệu đang tập trung ở nhóm năm nào. Biết được mức độ phân tán của dữ liệu có thể rất quan trọng trong việc đưa ra các kết luận chính xác hơn.